1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host;
16
17 import java.net.URL;
18
19 import org.htmlunit.Page;
20 import org.htmlunit.WebWindow;
21 import org.htmlunit.corejs.javascript.Function;
22 import org.htmlunit.javascript.AbstractJavaScriptEngine;
23 import org.htmlunit.javascript.HtmlUnitContextFactory;
24 import org.htmlunit.javascript.PostponedAction;
25 import org.htmlunit.javascript.configuration.JsxClass;
26 import org.htmlunit.javascript.configuration.JsxConstructor;
27 import org.htmlunit.javascript.configuration.JsxFunction;
28 import org.htmlunit.javascript.configuration.JsxGetter;
29 import org.htmlunit.javascript.configuration.JsxSetter;
30 import org.htmlunit.javascript.host.event.Event;
31 import org.htmlunit.javascript.host.event.EventTarget;
32 import org.htmlunit.javascript.host.event.MessageEvent;
33
34
35
36
37
38
39
40
41
42 @JsxClass
43 public class MessagePort extends EventTarget {
44
45 private MessagePort port_;
46
47
48
49
50 public MessagePort() {
51 super();
52 }
53
54
55
56
57 @Override
58 @JsxConstructor
59 public void jsConstructor() {
60 super.jsConstructor();
61 }
62
63
64
65
66
67
68 public MessagePort(final MessagePort port) {
69 super();
70 port_ = port;
71 }
72
73
74
75
76
77
78 @JsxGetter
79 public Function getOnmessage() {
80 return getHandlerForJavaScript(Event.TYPE_MESSAGE);
81 }
82
83
84
85
86
87
88 @JsxSetter
89 public void setOnmessage(final Object onmessage) {
90 setHandlerForJavaScript(Event.TYPE_MESSAGE, onmessage);
91 }
92
93 private Function getHandlerForJavaScript(final String eventName) {
94 return getEventListenersContainer().getEventHandler(eventName);
95 }
96
97 private void setHandlerForJavaScript(final String eventName, final Object handler) {
98 getEventListenersContainer().setEventHandler(eventName, handler);
99 }
100
101
102
103
104
105
106
107
108 @JsxFunction
109 public void postMessage(final String message, final Object transfer) {
110 if (port_ != null) {
111 final Window w = getWindow();
112 final WebWindow webWindow = w.getWebWindow();
113 final Page page = webWindow.getEnclosedPage();
114
115 final MessageEvent event = new MessageEvent();
116 final URL currentURL = page.getUrl();
117 final String origin = currentURL.getProtocol() + "://" + currentURL.getHost() + ':' + currentURL.getPort();
118 event.initMessageEvent(Event.TYPE_MESSAGE, false, false, message, origin, "", w, transfer);
119 event.setParentScope(getParentScope());
120 event.setPrototype(getPrototype(event.getClass()));
121
122 final AbstractJavaScriptEngine<?> jsEngine = webWindow.getWebClient().getJavaScriptEngine();
123 final PostponedAction action = new PostponedAction(page, "MessagePort.postMessage") {
124 @Override
125 public void execute() {
126 final HtmlUnitContextFactory cf = jsEngine.getContextFactory();
127 cf.call(cx -> port_.dispatchEvent(event));
128 }
129 };
130 jsEngine.addPostponedAction(action);
131 }
132 }
133
134
135
136
137
138
139
140 @JsxFunction
141 public void start() {
142
143 }
144
145
146
147
148
149
150 @JsxFunction
151 public void close() {
152
153 }
154 }