WebCore: Need to update JS bindings and IDL files to support multiple message ports in postMessage()
https://bugs.webkit.org/show_bug.cgi?id=28460
Reviewed by Sam Weinig.
Added new toJSSequence() API which validates that a JSValue meets the WebIDL criteria for a sequence.
Tests: fast/events/message-port-multi.html
fast/workers/worker-context-multi-port.html
fast/workers/worker-multi-port.html
* GNUmakefile.am:
* WebCore.gypi:
* WebCore.pro:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* WebCoreSources.bkl:
Added JSMessagePortCustom.h and JSMessageEventCustom.cpp.
* bindings/js/JSDOMBinding.cpp:
(WebCore::toJSSequence):
Added toJSSequence() API to do validation on sequence-like objects per WebIDL.
* bindings/js/JSDOMBinding.h:
* bindings/js/JSDOMWindowCustom.cpp:
(WebCore::JSDOMWindow::postMessage):
Added custom handler for postMessage() that handles being passed MessagePortArrays.
* bindings/js/JSDedicatedWorkerContextCustom.cpp:
(WebCore::JSDedicatedWorkerContext::postMessage):
Added custom handler for postMessage() that handles being passed MessagePortArrays.
* bindings/js/JSMessageEventCustom.cpp: Added.
(WebCore::JSMessageEvent::ports):
Added custom ports() getter that converts from MessagePortArray to JSArray.
(WebCore::JSMessageEvent::initMessageEvent):
Added support for passing a MessagePortArray.
* bindings/js/JSMessagePortCustom.cpp:
(WebCore::JSMessagePort::postMessage):
Added custom handler for postMessage() that handles being passed MessagePortArray.
(WebCore::fillMessagePortArray):
New helper routine that validates/converts from a JS sequence o a WebCore::MessagePortArray.
* bindings/js/JSMessagePortCustom.h: Added.
* bindings/js/JSWorkerCustom.cpp:
(WebCore::JSWorker::postMessage):
Added custom handler for postMessage() that handles being passed MessagePortArray.
* dom/MessageEvent.cpp:
* dom/MessageEvent.h:
(WebCore::MessageEvent::ports):
Changed ports() to return a MessagePortArray* since this value can be null.
* dom/MessageEvent.idl:
Updated IDL to match HTML5 spec (now accepts MessagePortArrays instead of a solitary MessagePort).
* dom/MessagePort.cpp:
* dom/MessagePort.h:
* dom/MessagePort.idl:
Updated IDL to match HTML5 spec (postMessage() now accepts MessagePortArrays instead of a solitary MessagePort).
* page/DOMWindow.h:
* page/DOMWindow.idl:
Updated IDL to match HTML5 spec (postMessage() now accepts MessagePortArrays instead of a solitary MessagePort).
* workers/DedicatedWorkerContext.cpp:
* workers/DedicatedWorkerContext.h:
* workers/DedicatedWorkerContext.idl:
Updated IDL to match HTML5 spec (postMessage() now accepts MessagePortArrays instead of a solitary MessagePort).
* workers/Worker.cpp:
* workers/Worker.h:
* workers/Worker.idl:
Updated IDL to match HTML5 spec (postMessage() now accepts MessagePortArrays instead of a solitary MessagePort).
LayoutTests: Need to update JS bindings and IDL files to support multiple message ports in postMessage()
https://bugs.webkit.org/show_bug.cgi?id=28460
Reviewed by Sam Weinig.
Updated layout tests to match new postMessage() and MessageEvent APIs.
Added new layout tests to test sending/receiving multiple ports.
* fast/dom/Window/window-postmessage-args-expected.txt:
* fast/dom/Window/window-postmessage-args.html:
Updated to match new postMessage API.
* fast/events/init-events-expected.txt:
* fast/events/message-channel-gc-4.html:
Updated to match new postMessage API.
* fast/events/message-port-clone.html:
Updated to match new postMessage API.
* fast/events/message-port-deleted-document.html:
Updated to match new postMessage API.
* fast/events/message-port-deleted-frame.html:
Updated to match new postMessage API.
* fast/events/message-port-inactive-document.html:
Updated to match new postMessage API.
* fast/events/message-port-multi-expected.txt: Added.
* fast/events/message-port-multi.html: Added.
Added tests for various cases of sending multiple ports.
* fast/events/message-port.html:
Updated to match new postMessage API.
* fast/events/resources/init-events.js:
Added tests for sending ports to initMessageEvent()
* fast/events/resources/message-port-iframe.html:
* fast/events/resources/message-port-multi.js: Added.
Added tests for various cases of sending multiple ports.
* fast/workers/resources/shared-worker-common.js:
(onconnect):
Updated to reflect new MessageEvent API.
* fast/workers/resources/shared-worker-script-error.js:
(onconnect):
Updated to reflect new MessageEvent API.
* fast/workers/resources/worker-cloneport.js:
(onmessage):
Updated to reflect new MessageEvent API.
* fast/workers/resources/worker-context-multi-port.js: Added.
(worker.onmessage):
Added tests for various cases of sending multiple ports.
* fast/workers/resources/worker-context-thread-multi-port.js: Added.
Added tests for various cases of sending multiple ports.
* fast/workers/resources/worker-messageport.js:
(onmessage):
Updated to reflect new MessageEvent API.
* fast/workers/resources/worker-multi-port.js: Added.
(worker.onmessage):
Added tests for various cases of sending multiple ports.
* fast/workers/resources/worker-thread-multi-port.js: Added.
(onmessage):
Worker-thread side of multiple port layout test.
(testPassed):
(testFailed):
* fast/workers/worker-cloneport.html:
* fast/workers/worker-context-multi-port-expected.txt: Added.
* fast/workers/worker-context-multi-port.html: Added.
Added tests for sending multiple ports from the worker thread.
* fast/workers/worker-messageport-expected.txt:
* fast/workers/worker-messageport-gc.html:
* fast/workers/worker-messageport.html:
* fast/workers/worker-multi-port-expected.txt: Added.
* fast/workers/worker-multi-port.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@48025 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/fast/workers/worker-messageport.html b/LayoutTests/fast/workers/worker-messageport.html
index c2a6ebb..8f47af2 100644
--- a/LayoutTests/fast/workers/worker-messageport.html
+++ b/LayoutTests/fast/workers/worker-messageport.html
@@ -20,7 +20,7 @@
worker.postMessage("noport");
worker.onmessage = function(evt) {
log(evt.data);
- worker.postMessage("port", channel.port1);
+ worker.postMessage("port", [channel.port1]);
worker.onmessage = function(evt) {
log(evt.data);
}
@@ -45,12 +45,14 @@
function awaitPortFromWorker(evt)
{
if (evt.data == "port") {
- if (!evt.messagePort) {
+ if (!evt.ports) {
log("FAIL: Did not get port from worker");
+ } else if (evt.ports.length != 1) {
+ log("FAIL: Got the wrong number of ports from worker: " + evt.ports.length);
} else {
log("PASS: Got port from worker");
- evt.messagePort.postMessage("ping");
- evt.messagePort.onmessage = function(evt) {
+ evt.ports[0].postMessage("ping");
+ evt.ports[0].onmessage = function(evt) {
if (evt.data == "pong") {
log("PASS: Received final response from worker");
} else {
@@ -58,7 +60,7 @@
}
startSpamTest();
}
- evt.messagePort.start();
+ evt.ports[0].start();
}
} else {
log(evt.data);
@@ -69,7 +71,7 @@
{
var channel = new MessageChannel();
worker.onmessage = function () { gotSpam(channel.port1); }
- worker.postMessage("spam", channel.port2);
+ worker.postMessage("spam", [channel.port2]);
}
function gotSpam(port)