Title: [113799] trunk
Revision
113799
Author
commit-qu...@webkit.org
Date
2012-04-10 18:15:30 -0700 (Tue, 10 Apr 2012)

Log Message

Add transfer map argument to Intent constructor
http://dvcs.w3.org/hg/web-intents/raw-file/tip/spec/Overview.html
This adds the ability to pass transferables (i.e. MessagePorts)
through web intents, and puts the calling convention in line
with the Web Messaging spec:
http://dev.w3.org/html5/postmsg/

Implementation in chromium API follows the port-passing method
of PlatformMessagePortChannel.

https://bugs.webkit.org/show_bug.cgi?id=80200

Patch by Greg Billock <gbill...@google.com> on 2012-04-10
Reviewed by Adam Barth.

* Modules/intents/Intent.cpp:
(WebCore::Intent::create):
* Modules/intents/Intent.idl:
* WebCore.gypi:
* bindings/v8/custom/V8IntentCustom.cpp: Added.
(WebCore):
(WebCore::V8Intent::constructorCallback):

Modified Paths

Added Paths

Diff

Added: trunk/LayoutTests/webintents/web-intents-invoke-port-expected.txt (0 => 113799)


--- trunk/LayoutTests/webintents/web-intents-invoke-port-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webintents/web-intents-invoke-port-expected.txt	2012-04-11 01:15:30 UTC (rev 113799)
@@ -0,0 +1,7 @@
+Received Web Intent: action="" type=mime/type1
+Have 1 ports
+PASS successfullyParsed is true
+
+TEST COMPLETE
+* sent intent
+

Added: trunk/LayoutTests/webintents/web-intents-invoke-port.html (0 => 113799)


--- trunk/LayoutTests/webintents/web-intents-invoke-port.html	                        (rev 0)
+++ trunk/LayoutTests/webintents/web-intents-invoke-port.html	2012-04-11 01:15:30 UTC (rev 113799)
@@ -0,0 +1,34 @@
+<html>
+  <head>
+    <script src=""
+    <script src=""
+    <script>
+      var channel = new MessageChannel();
+      channel.port2._onMessage_ = function(e) {
+        debug("* got message");
+      };
+
+      function buttonClicked() {
+        try {
+          var intent1 = new WebKitIntent("action1", "mime/type1", channel.port1, "not a port");
+          testFailed("Should have thrown TypeError");
+        } catch (e) {
+          if (!(e instanceof TypeError)) testFailed("Should throw type error on non-port arg");
+        }
+        try {
+          var intent1 = new WebKitIntent("action1", "mime/type1", channel.port1, ["not a port"]);
+          testFailed("Should have thrown TypeError");
+        } catch (e) {
+          if (!(e instanceof TypeError)) testFailed("Should throw type error on non-port arg");
+        }
+
+        navigator.webkitStartActivity(new WebKitIntent("action1", "mime/type1", channel.port1, [channel.port1]));
+        debug("* sent intent");
+      }
+    </script>
+  </head>
+<body _onload_="simulateButtonPress()">
+<input type="button" id="button" value="Start Web Intent" _onmouseup_="buttonClicked()">
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (113798 => 113799)


--- trunk/Source/WebCore/ChangeLog	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/ChangeLog	2012-04-11 01:15:30 UTC (rev 113799)
@@ -1,3 +1,27 @@
+2012-04-10  Greg Billock  <gbill...@google.com>
+
+        Add transfer map argument to Intent constructor
+        http://dvcs.w3.org/hg/web-intents/raw-file/tip/spec/Overview.html
+        This adds the ability to pass transferables (i.e. MessagePorts)
+        through web intents, and puts the calling convention in line
+        with the Web Messaging spec:
+        http://dev.w3.org/html5/postmsg/
+
+        Implementation in chromium API follows the port-passing method
+        of PlatformMessagePortChannel.
+
+        https://bugs.webkit.org/show_bug.cgi?id=80200
+
+        Reviewed by Adam Barth.
+
+        * Modules/intents/Intent.cpp:
+        (WebCore::Intent::create):
+        * Modules/intents/Intent.idl:
+        * WebCore.gypi:
+        * bindings/v8/custom/V8IntentCustom.cpp: Added.
+        (WebCore):
+        (WebCore::V8Intent::constructorCallback):
+
 2012-04-10  Patrick Gansterer  <par...@webkit.org>
 
         Cleanup wtf/Platform.h and config.h files

Modified: trunk/Source/WebCore/Modules/intents/Intent.cpp (113798 => 113799)


--- trunk/Source/WebCore/Modules/intents/Intent.cpp	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/Modules/intents/Intent.cpp	2012-04-11 01:15:30 UTC (rev 113799)
@@ -32,6 +32,7 @@
 #if ENABLE(WEB_INTENTS)
 
 #include "ExceptionCode.h"
+#include "MessagePort.h"
 #include "SerializedScriptValue.h"
 
 namespace WebCore {
@@ -50,16 +51,43 @@
     return adoptRef(new Intent(action, type, data));
 }
 
+PassRefPtr<Intent> Intent::create(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, const MessagePortArray& ports, ExceptionCode& ec)
+{
+    if (action.isEmpty()) {
+        ec = SYNTAX_ERR;
+        return 0;
+    }
+    if (type.isEmpty()) {
+        ec = SYNTAX_ERR;
+        return 0;
+    }
+
+    OwnPtr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(&ports, ec);
+
+    return adoptRef(new Intent(action, type, data, channels.release()));
+}
+
 Intent::Intent(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data)
     : m_action(action)
     , m_type(type)
 {
     if (data)
-        m_data = SerializedScriptValue::createFromWire(data->toWireString());
+        m_data = data;
     else
         m_data = SerializedScriptValue::nullValue();
 }
 
+Intent::Intent(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, PassOwnPtr<MessagePortChannelArray> ports)
+    : m_action(action)
+    , m_type(type)
+    , m_ports(ports)
+{
+    if (data)
+        m_data = data;
+    else
+        m_data = SerializedScriptValue::nullValue();
+}
+
 const String& Intent::action() const
 {
     return m_action;
@@ -75,6 +103,11 @@
     return m_data.get();
 }
 
+MessagePortChannelArray* Intent::messagePorts() const
+{
+    return m_ports.get();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_INTENTS)

Modified: trunk/Source/WebCore/Modules/intents/Intent.h (113798 => 113799)


--- trunk/Source/WebCore/Modules/intents/Intent.h	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/Modules/intents/Intent.h	2012-04-11 01:15:30 UTC (rev 113799)
@@ -31,6 +31,8 @@
 
 #if ENABLE(WEB_INTENTS)
 
+#include "MessagePort.h"
+#include "MessagePortChannel.h"
 #include <wtf/Forward.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -46,6 +48,7 @@
 class Intent : public RefCounted<Intent> {
 public:
     static PassRefPtr<Intent> create(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, ExceptionCode&);
+    static PassRefPtr<Intent> create(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, const MessagePortArray& ports, ExceptionCode&);
 
     const String& action() const;
     const String& type() const;
@@ -54,12 +57,16 @@
     int identifier() const;
     void setIdentifier(int);
 
+    MessagePortChannelArray* messagePorts() const;
+
 private:
     Intent(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data);
+    Intent(const String& action, const String& type, PassRefPtr<SerializedScriptValue> data, PassOwnPtr<MessagePortChannelArray> ports);
 
     String m_action;
     String m_type;
     RefPtr<SerializedScriptValue> m_data;
+    OwnPtr<MessagePortChannelArray> m_ports;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/intents/Intent.idl (113798 => 113799)


--- trunk/Source/WebCore/Modules/intents/Intent.idl	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/Modules/intents/Intent.idl	2012-04-11 01:15:30 UTC (rev 113799)
@@ -26,7 +26,7 @@
 module window {
   interface [
       Conditional=WEB_INTENTS,
-      Constructor(in DOMString action, in DOMString type, in [Optional=DefaultIsNullString] SerializedScriptValue data),
+      Constructor(in DOMString action, in DOMString type, in [Optional=DefaultIsNullString, TransferList=transferList] SerializedScriptValue data, in [Optional=DefaultIsUndefined] Array transferList),
       ConstructorRaisesException
   ] Intent {
         readonly attribute DOMString action;

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (113798 => 113799)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-04-11 01:15:30 UTC (rev 113799)
@@ -1601,7 +1601,7 @@
                     die "IDL error: TransferList refers to a nonexistent argument";
                 }
 
-                AddToImplIncludes("ArrayBuffer.h");
+                AddToImplIncludes("wtf/ArrayBuffer.h");
                 AddToImplIncludes("MessagePort.h");
                 $TransferListName = ucfirst($transferListName);
                 $parameterCheckString .= "    MessagePortArray messagePortArray$TransferListName;\n";

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp (113798 => 113799)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-04-11 01:15:30 UTC (rev 113799)
@@ -23,7 +23,6 @@
 
 #if ENABLE(Condition1) || ENABLE(Condition2)
 
-#include "ArrayBuffer.h"
 #include "ExceptionCode.h"
 #include "MessagePort.h"
 #include "RuntimeEnabledFeatures.h"
@@ -34,6 +33,7 @@
 #include "V8DOMWrapper.h"
 #include "V8IsolatedContext.h"
 #include "V8Proxy.h"
+#include <wtf/ArrayBuffer.h>
 #include <wtf/UnusedParam.h>
 
 namespace WebCore {

Modified: trunk/Source/WebKit/chromium/public/WebIntent.h (113798 => 113799)


--- trunk/Source/WebKit/chromium/public/WebIntent.h	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebKit/chromium/public/WebIntent.h	2012-04-11 01:15:30 UTC (rev 113799)
@@ -31,9 +31,11 @@
 #ifndef WebIntent_h
 #define WebIntent_h
 
+#include "WebMessagePortChannel.h"
 #include "platform/WebCommon.h"
 #include "platform/WebPrivatePtr.h"
 #include "platform/WebString.h"
+#include "platform/WebVector.h"
 
 namespace WebCore { class Intent; }
 
@@ -62,6 +64,9 @@
     WEBKIT_EXPORT WebString type() const;
     WEBKIT_EXPORT WebString data() const;
 
+    // Caller takes ownership of the ports.
+    WEBKIT_EXPORT WebMessagePortChannelArray* messagePortChannelsRelease() const;
+
 #if WEBKIT_IMPLEMENTATION
     WebIntent(const WTF::PassRefPtr<WebCore::Intent>&);
 #endif

Modified: trunk/Source/WebKit/chromium/src/WebIntent.cpp (113798 => 113799)


--- trunk/Source/WebKit/chromium/src/WebIntent.cpp	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Source/WebKit/chromium/src/WebIntent.cpp	2012-04-11 01:15:30 UTC (rev 113799)
@@ -32,6 +32,7 @@
 #include "WebIntent.h"
 
 #include "Intent.h"
+#include "PlatformMessagePortChannel.h"
 #include "SerializedScriptValue.h"
 
 namespace WebKit {
@@ -102,4 +103,21 @@
 #endif
 }
 
+WebMessagePortChannelArray* WebIntent::messagePortChannelsRelease() const
+{
+    // Note: see PlatformMessagePortChannel::postMessageToRemote.
+    WebMessagePortChannelArray* webChannels = 0;
+    WebCore::MessagePortChannelArray* messagePorts = m_private->messagePorts();
+    if (messagePorts) {
+        webChannels = new WebMessagePortChannelArray(messagePorts->size());
+        for (size_t i = 0; i < messagePorts->size(); ++i) {
+            WebCore::PlatformMessagePortChannel* platformChannel = messagePorts->at(i)->channel();
+            (*webChannels)[i] = platformChannel->webChannelRelease();
+            (*webChannels)[i]->setClient(0);
+        }
+    }
+
+    return webChannels;
+}
+
 } // namespace WebKit

Modified: trunk/Tools/DumpRenderTree/chromium/WebViewHost.cpp (113798 => 113799)


--- trunk/Tools/DumpRenderTree/chromium/WebViewHost.cpp	2012-04-11 01:09:07 UTC (rev 113798)
+++ trunk/Tools/DumpRenderTree/chromium/WebViewHost.cpp	2012-04-11 01:15:30 UTC (rev 113799)
@@ -1327,7 +1327,14 @@
     printf("Received Web Intent: action="" type=%s\n",
            request.intent().action().utf8().data(),
            request.intent().type().utf8().data());
+    WebMessagePortChannelArray* ports = request.intent().messagePortChannelsRelease();
     m_currentRequest = request;
+    if (ports) {
+        printf("Have %d ports\n", static_cast<int>(ports->size()));
+        for (size_t i = 0; i < ports->size(); ++i)
+            (*ports)[i]->destroy();
+        delete ports;
+    }
 }
 
 // Public functions -----------------------------------------------------------
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to