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();
}