Title: [98175] trunk
Revision
98175
Author
[email protected]
Date
2011-10-21 17:38:14 -0700 (Fri, 21 Oct 2011)

Log Message

Source/WebCore: https://bugs.webkit.org/show_bug.cgi?id=70580
[Chromium] Implement MessagePort transfer in chromium port of webkit.

Reviewed by David Levin.

* bindings/v8/SerializedScriptValue.cpp:
(WebCore::V8ObjectMap::Writer::writeTransferredMessagePort):
(WebCore::V8ObjectMap::Serializer::Serializer):
(WebCore::V8ObjectMap::Serializer::doSerialize):
(WebCore::V8ObjectMap::Reader::read):
(WebCore::V8ObjectMap::Deserializer::Deserializer):
(WebCore::V8ObjectMap::Deserializer::tryGetTransferredMessagePort):
(WebCore::SerializedScriptValue::SerializedScriptValue):
(WebCore::SerializedScriptValue::deserialize):

LayoutTests: https://bugs.webkit.org/show_bug.cgi?id=70580
[Chromium] Implement MessagePort transfer in chromium port of webkit.
Results for JSC include some FAILs - this will be addressed when JSC
implements message port transfers as well (https://bugs.webkit.org/show_bug.cgi?id=70658)

Reviewed by David Levin.

* fast/dom/Window/window-postmessage-args-expected.txt:
* fast/dom/Window/window-postmessage-args.html:
* fast/events/message-port-multi-expected.txt:
* fast/events/resources/message-port-multi.js:
(testTransfers.channel0.port2.onmessage):
(testTransfers):
(channel.port2.onmessage):
* platform/chromium-win/fast/events/message-port-multi-expected.txt:
* platform/chromium/fast/dom/Window/window-postmessage-args-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (98174 => 98175)


--- trunk/LayoutTests/ChangeLog	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/ChangeLog	2011-10-22 00:38:14 UTC (rev 98175)
@@ -1,3 +1,22 @@
+2011-10-21  Dmitry Lomov  <[email protected]>
+
+        https://bugs.webkit.org/show_bug.cgi?id=70580
+        [Chromium] Implement MessagePort transfer in chromium port of webkit.
+        Results for JSC include some FAILs - this will be addressed when JSC 
+        implements message port transfers as well (https://bugs.webkit.org/show_bug.cgi?id=70658)
+
+        Reviewed by David Levin.
+
+        * fast/dom/Window/window-postmessage-args-expected.txt:
+        * fast/dom/Window/window-postmessage-args.html:
+        * fast/events/message-port-multi-expected.txt:
+        * fast/events/resources/message-port-multi.js:
+        (testTransfers.channel0.port2.onmessage):
+        (testTransfers):
+        (channel.port2.onmessage):
+        * platform/chromium-win/fast/events/message-port-multi-expected.txt:
+        * platform/chromium/fast/dom/Window/window-postmessage-args-expected.txt:
+
 2011-10-21  Vineet Chaudhary  <[email protected]>
 
         Setting form.enctype reflected attribute behaves strangely.

Modified: trunk/LayoutTests/fast/dom/Window/window-postmessage-args-expected.txt (98174 => 98175)


--- trunk/LayoutTests/fast/dom/Window/window-postmessage-args-expected.txt	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/fast/dom/Window/window-postmessage-args-expected.txt	2011-10-22 00:38:14 UTC (rev 98175)
@@ -16,6 +16,9 @@
 PASS: Posting message ('7', [object MessagePort],[object MessagePort]) did not throw an exception
 PASS: Posting message ('2147483648', null) did not throw an exception
 PASS: Posting message ('2147483648', null) did not throw an exception
+FAIL: Posting message ('[object MessagePort]', [object MessagePort],[object MessagePort]) did not throw an exception
+PASS: Posting message ('[object MessagePort]', [object MessagePort],[object MessagePort]) did not throw an exception
+PASS: Posting message ('[object MessagePort],[object MessagePort]', [object MessagePort],[object MessagePort]) did not throw an exception
 PASS: Posting message ('done', *) did not throw an exception
 Received message '4' with 0 ports.
 Received message '4' with 0 ports.
@@ -27,5 +30,8 @@
 Received message '7' with 2 ports.
 Received message '2147483648' with 0 ports.
 Received message '2147483648' with 0 ports.
+Received message '[object Object]' with 2 ports.
+Received message '[object Object]' with 2 ports.
+Received message '[object Object],[object Object]' with 2 ports.
 Received message 'done' with 0 ports.
 

Modified: trunk/LayoutTests/fast/dom/Window/window-postmessage-args.html (98174 => 98175)


--- trunk/LayoutTests/fast/dom/Window/window-postmessage-args.html	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/fast/dom/Window/window-postmessage-args.html	2011-10-22 00:38:14 UTC (rev 98175)
@@ -52,7 +52,14 @@
 tryPostMessageFunction(window.postMessage, '7', [channel1.port1, channel1.port2], '*');
 var channel2 = new MessageChannel;
 tryPostMessageFunction(window.webkitPostMessage, '7', [channel2.port1, channel2.port2], '*');
+var channel3 = new MessageChannel;
 tryPostMessage(2147483648, null, '*');
+tryPostMessageFunction(window.postMessage, channel3.port1, [channel3.port1, channel3.port2], '*', true);
+var channel4 = new MessageChannel;
+tryPostMessageFunction(window.webkitPostMessage, channel4.port1, [channel4.port1, channel4.port2], '*');
+var channel5 = new MessageChannel;
+tryPostMessageFunction(window.webkitPostMessage, [channel5.port1, channel5.port2], [channel5.port1, channel5.port2], '*');
+
 tryPostMessageFunction(window.postMessage, 'done', '*');
 </script>
 </body>

Modified: trunk/LayoutTests/fast/events/message-port-multi-expected.txt (98174 => 98175)


--- trunk/LayoutTests/fast/events/message-port-multi-expected.txt	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/fast/events/message-port-multi-expected.txt	2011-10-22 00:38:14 UTC (rev 98175)
@@ -14,6 +14,11 @@
 PASS event.ports is non-null and zero length when empty array sent
 PASS event.ports contains two ports when two ports sent
 PASS event.ports contains two ports when two ports re-sent after error
+FAIL Sending host object should throw
+FAIL send-port: port transfer failed
+FAIL send-port-twice: failed to transfer one port twice
+FAIL send-two-ports: failed to transfer two ports
+FAIL Unexpected message [object Object]
 
 TEST COMPLETE
 

Modified: trunk/LayoutTests/fast/events/resources/message-port-multi.js (98174 => 98175)


--- trunk/LayoutTests/fast/events/resources/message-port-multi.js	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/fast/events/resources/message-port-multi.js	2011-10-22 00:38:14 UTC (rev 98175)
@@ -33,6 +33,53 @@
 
 channel.port1.postMessage("done");
 
+function testTransfers() {
+    var channel0 = new MessageChannel();
+
+    var c1 = new MessageChannel();
+    channel0.port1.webkitPostMessage({id:"send-port", port:c1.port1}, [c1.port1]);
+    var c2 = new MessageChannel();
+    channel0.port1.webkitPostMessage({id:"send-port-twice", port0:c2.port1, port1:c2.port1}, [c2.port1]);
+    var c3 = new MessageChannel();
+    channel0.port1.webkitPostMessage({id:"send-two-ports", port0:c3.port1, port1:c3.port2}, [c3.port1, c3.port2]);
+    var c4 = new MessageChannel();
+    try {
+        channel0.port1.webkitPostMessage({id:"host-object", hostObject:c3, port:c4.port1}, [c4.port1]);
+        testFailed("Sending host object should throw");
+    } catch(e) {
+        testPassed("Sending host object has thrown " + e);
+    }
+    c4.port1.postMessage("Should succeed");
+    channel0.port1.webkitPostMessage({id:"done"});
+
+    channel0.port2._onmessage_ = function(event) {
+        if (event.data.id == "send-port") {
+            if (event.ports && event.ports.length > 0 && event.ports[0] === event.data.port)
+                testPassed("send-port: transferred one port");
+            else 
+                testFailed("send-port: port transfer failed");
+        } else if (event.data.id == "send-port-twice") {
+            if (event.ports && event.ports.length == 1 && 
+                  event.ports[0] === event.data.port0 && event.ports[0] === event.data.port1) 
+                testPassed("send-port-twice: transferred one port twice");
+            else
+                testFailed("send-port-twice: failed to transfer one port twice");
+        } else if (event.data.id == "send-two-ports") {
+            if (event.ports && event.ports.length == 2 && 
+                  event.ports[0] === event.data.port0 && event.ports[1] === event.data.port1) 
+                testPassed("send-two-ports: transferred two ports");
+            else
+                testFailed("send-two-ports: failed to transfer two ports");
+        } else if (event.data.id == "done") {
+            debug('<br><span class="pass">TEST COMPLETE</span>');
+            if (window.layoutTestController)
+            layoutTestController.notifyDone();
+        } else {
+            testFailed("Unexpected message " + event.data);
+        }
+    }
+}
+
 channel.port2._onmessage_ = function(event) {
     if (event.data == "noport") {
         if (event.ports && !event.ports.length)
@@ -60,9 +107,7 @@
         else
             testFailed("event.ports contained " + event.ports.length + " when two ports re-sent after error");
     } else if (event.data == "done") {
-        debug('<br><span class="pass">TEST COMPLETE</span>');
-        if (window.layoutTestController)
-            layoutTestController.notifyDone();
+        testTransfers();
     } else
         testFailed("Received unexpected message: " + event.data);
 }

Modified: trunk/LayoutTests/platform/chromium/fast/dom/Window/window-postmessage-args-expected.txt (98174 => 98175)


--- trunk/LayoutTests/platform/chromium/fast/dom/Window/window-postmessage-args-expected.txt	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/platform/chromium/fast/dom/Window/window-postmessage-args-expected.txt	2011-10-22 00:38:14 UTC (rev 98175)
@@ -16,6 +16,9 @@
 PASS: Posting message ('7', [object MessagePort],[object MessagePort]) did not throw an exception
 PASS: Posting message ('2147483648', null) did not throw an exception
 PASS: Posting message ('2147483648', null) did not throw an exception
+PASS: Posting message ('[object MessagePort]', [object MessagePort],[object MessagePort]): threw exception Error: DATA_CLONE_ERR: DOM Exception 25
+PASS: Posting message ('[object MessagePort]', [object MessagePort],[object MessagePort]) did not throw an exception
+PASS: Posting message ('[object MessagePort],[object MessagePort]', [object MessagePort],[object MessagePort]) did not throw an exception
 PASS: Posting message ('done', *) did not throw an exception
 Received message '4' with 0 ports.
 Received message '4' with 0 ports.
@@ -27,5 +30,7 @@
 Received message '7' with 2 ports.
 Received message '2147483648' with 0 ports.
 Received message '2147483648' with 0 ports.
+Received message '[object MessagePort]' with 2 ports.
+Received message '[object MessagePort],[object MessagePort]' with 2 ports.
 Received message 'done' with 0 ports.
 

Modified: trunk/LayoutTests/platform/chromium-win/fast/events/message-port-multi-expected.txt (98174 => 98175)


--- trunk/LayoutTests/platform/chromium-win/fast/events/message-port-multi-expected.txt	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/LayoutTests/platform/chromium-win/fast/events/message-port-multi-expected.txt	2011-10-22 00:38:14 UTC (rev 98175)
@@ -9,10 +9,15 @@
 PASS channel.port1.postMessage("notAPort", [channel3.port1, {}, channel3.port2]) threw exception TypeError: MessagePortArray argument must contain only MessagePorts.
 PASS channel.port1.postMessage("notAnArray", channel3.port1) threw exception TypeError: MessagePortArray argument has no length attribute.
 PASS channel.port1.postMessage("notASequence", [{length: 3}]) threw exception TypeError: MessagePortArray argument must contain only MessagePorts.
+PASS channel.port1.postMessage("largeSequence", largePortArray) threw exception Error: DATA_CLONE_ERR: DOM Exception 25.
 PASS event.ports is non-null and zero length when no port sent
 PASS event.ports is non-null and zero length when empty array sent
 PASS event.ports contains two ports when two ports sent
 PASS event.ports contains two ports when two ports re-sent after error
+PASS Sending host object has thrown Error: DATA_CLONE_ERR: DOM Exception 25
+PASS send-port: transferred one port
+PASS send-port-twice: transferred one port twice
+PASS send-two-ports: transferred two ports
 
 TEST COMPLETE
 

Modified: trunk/Source/WebCore/ChangeLog (98174 => 98175)


--- trunk/Source/WebCore/ChangeLog	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/Source/WebCore/ChangeLog	2011-10-22 00:38:14 UTC (rev 98175)
@@ -1,3 +1,20 @@
+2011-10-21  Dmitry Lomov  <[email protected]>
+
+        https://bugs.webkit.org/show_bug.cgi?id=70580
+        [Chromium] Implement MessagePort transfer in chromium port of webkit.
+
+        Reviewed by David Levin.
+
+        * bindings/v8/SerializedScriptValue.cpp:
+        (WebCore::V8ObjectMap::Writer::writeTransferredMessagePort):
+        (WebCore::V8ObjectMap::Serializer::Serializer):
+        (WebCore::V8ObjectMap::Serializer::doSerialize):
+        (WebCore::V8ObjectMap::Reader::read):
+        (WebCore::V8ObjectMap::Deserializer::Deserializer):
+        (WebCore::V8ObjectMap::Deserializer::tryGetTransferredMessagePort):
+        (WebCore::SerializedScriptValue::SerializedScriptValue):
+        (WebCore::SerializedScriptValue::deserialize):
+
 2011-10-21  Ojan Vafai  <[email protected]>
 
         r97693 caused 42 failures on the chromium mac bots

Modified: trunk/Source/WebCore/bindings/v8/SerializedScriptValue.cpp (98174 => 98175)


--- trunk/Source/WebCore/bindings/v8/SerializedScriptValue.cpp	2011-10-22 00:16:17 UTC (rev 98174)
+++ trunk/Source/WebCore/bindings/v8/SerializedScriptValue.cpp	2011-10-22 00:38:14 UTC (rev 98175)
@@ -64,6 +64,7 @@
 #include "V8Int16Array.h"
 #include "V8Int32Array.h"
 #include "V8Int8Array.h"
+#include "V8MessagePort.h"
 #include "V8Proxy.h"
 #include "V8Uint16Array.h"
 #include "V8Uint32Array.h"
@@ -182,6 +183,7 @@
     Int32Tag = 'I', // value:ZigZag-encoded int32 -> Integer
     Uint32Tag = 'U', // value:uint32_t -> Integer
     DateTag = 'D', // value:double -> Date (ref)
+    MessagePortTag = 'M', // index:int -> MessagePort. Fills the result with transferred MessagePort.
     NumberTag = 'N', // value:double -> Number
     BlobTag = 'b', // url:WebCoreString, type:WebCoreString, size:uint64_t -> Blob (ref)
     FileTag = 'f', // file:RawFile -> File (ref)
@@ -429,6 +431,12 @@
         doWriteUint32(static_cast<uint32_t>(flags));
     }
 
+    void writeTransferredMessagePort(uint32_t index)
+    {
+        append(MessagePortTag);
+        doWriteUint32(index);
+    }
+
     void writeArray(uint32_t length)
     {
         append(ArrayTag);
@@ -576,7 +584,7 @@
         JSFailure
     };
 
-    Serializer(Writer& writer, v8::TryCatch& tryCatch)
+    Serializer(Writer& writer, MessagePortArray* messagePorts, v8::TryCatch& tryCatch)
         : m_writer(writer)
         , m_tryCatch(tryCatch)
         , m_depth(0)
@@ -585,6 +593,10 @@
         , m_nextObjectReference(0)
     {
         ASSERT(!tryCatch.HasCaught());
+        if (messagePorts) {
+            for (size_t i = 0; i < messagePorts->size(); i++)
+                m_transferredMessagePorts.set(V8MessagePort::wrap(messagePorts->at(i).get()), i);
+        }
     }
 
     Status serialize(v8::Handle<v8::Value> value)
@@ -1011,6 +1023,7 @@
     Status m_status;
     typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool;
     ObjectPool m_objectPool;
+    ObjectPool m_transferredMessagePorts;
     uint32_t m_nextObjectReference;
 };
 
@@ -1048,6 +1061,13 @@
         return writeAndGreyArrayBufferView(value.As<v8::Object>(), next);
     else if (value->IsString())
         writeString(value);
+    else if (V8MessagePort::HasInstance(value)) {
+        uint32_t messagePortIndex;
+        if (m_transferredMessagePorts.tryGet(value.As<v8::Object>(), &messagePortIndex))
+                m_writer.writeTransferredMessagePort(messagePortIndex);
+            else
+                return handleError(DataCloneError, next);
+        }
     else {
         v8::Handle<v8::Object> jsObject = value.As<v8::Object>();
         if (jsObject.IsEmpty())
@@ -1096,6 +1116,7 @@
     virtual uint32_t objectReferenceCount() = 0;
     virtual void pushObjectReference(const v8::Handle<v8::Value>&) = 0;
     virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<v8::Value>*) = 0;
+    virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Value>*) = 0;
     virtual bool newArray(uint32_t length) = 0;
     virtual bool newObject() = 0;
     virtual bool completeArray(uint32_t length, v8::Handle<v8::Value>*) = 0;
@@ -1212,6 +1233,7 @@
                 return false;
             creator.pushObjectReference(*value);
             break;
+
         case ArrayTag: {
             uint32_t length;
             if (!doReadUint32(&length))
@@ -1277,6 +1299,16 @@
                 return false;
             return true;
         }
+        case MessagePortTag: {
+            if (m_version <= 0)
+                return false;
+            uint32_t index;
+            if (!doReadUint32(&index))
+                return false;
+            if (!creator.tryGetTransferredMessagePort(index, value))
+                return false;
+            break;
+        }
         case ObjectReferenceTag: {
             if (m_version <= 0)
                 return false;
@@ -1652,8 +1684,9 @@
 
 class Deserializer : public CompositeCreator {
 public:
-    explicit Deserializer(Reader& reader)
+    explicit Deserializer(Reader& reader, MessagePortArray* messagePorts)
         : m_reader(reader)
+        , m_transferredMessagePorts(messagePorts)
         , m_version(0)
     {
     }
@@ -1759,6 +1792,16 @@
         m_objectPool.append(object);
     }
 
+    virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Value>* object)
+    {
+        if (!m_transferredMessagePorts)
+            return false;
+        if (index >= m_transferredMessagePorts->size())
+            return false;
+        *object = V8MessagePort::wrap(m_transferredMessagePorts->at(index).get());
+        return true;
+    }
+
     virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<v8::Value>* object)
     {
         if (reference >= m_objectPool.size())
@@ -1837,6 +1880,7 @@
     Vector<v8::Local<v8::Value> > m_stack;
     Vector<v8::Handle<v8::Value> > m_objectPool;
     Vector<uint32_t> m_openCompositeReferenceStack;
+    MessagePortArray* m_transferredMessagePorts;
     uint32_t m_version;
 };
 
@@ -1920,14 +1964,14 @@
 {
 }
 
-SerializedScriptValue::SerializedScriptValue(v8::Handle<v8::Value> value, MessagePortArray*, bool& didThrow)
+SerializedScriptValue::SerializedScriptValue(v8::Handle<v8::Value> value, MessagePortArray* messagePorts, bool& didThrow)
 {
     didThrow = false;
     Writer writer;
     Serializer::Status status;
     {
         v8::TryCatch tryCatch;
-        Serializer serializer(writer, tryCatch);
+        Serializer serializer(writer, messagePorts, tryCatch);
         status = serializer.serialize(value);
         if (status == Serializer::JSException) {
             // If there was a JS exception thrown, re-throw it.
@@ -1965,13 +2009,13 @@
     m_data = wireData.crossThreadString();
 }
 
-v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray*)
+v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messagePorts)
 {
     if (!m_data.impl())
         return v8::Null();
     COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes);
     Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()), 2 * m_data.length());
-    Deserializer deserializer(reader);
+    Deserializer deserializer(reader, messagePorts);
     return deserializer.deserialize();
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to