Title: [116608] trunk/Source
Revision
116608
Author
[email protected]
Date
2012-05-09 22:31:29 -0700 (Wed, 09 May 2012)

Log Message

Source/WebCore: Add dispatchMessageEventWithOriginCheck to DOMWindow
https://bugs.webkit.org/show_bug.cgi?id=85815

Reviewed by Adam Barth.

Useful for ports that support cross-process postMessage.
No new tests, since covered by existing postMessage tests.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::postMessageTimerFired):
(WebCore):
(WebCore::DOMWindow::dispatchMessageEventWithOriginCheck):
* page/DOMWindow.h:
(WebCore):
(DOMWindow):

Source/WebKit/chromium: Add dispatchMessageEventWithOriginCheck to WebFrame
https://bugs.webkit.org/show_bug.cgi?id=85815

Reviewed by Adam Barth.

Tested by WebFrameTest.DispatchMessageEventWithOriginCheck.
Also fixes source frame bug in willCheckAndDispatchMessageEvent.

* public/WebFrame.h:
(WebFrame):
* src/FrameLoaderClientImpl.cpp:
(WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent):
* src/WebFrameImpl.cpp:
(WebKit::WebFrameImpl::checkAndDispatchMessageEvent):
(WebKit):
* src/WebFrameImpl.h:
(WebFrameImpl):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (116607 => 116608)


--- trunk/Source/WebCore/ChangeLog	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebCore/ChangeLog	2012-05-10 05:31:29 UTC (rev 116608)
@@ -1,3 +1,21 @@
+2012-05-09  Charlie Reis  <[email protected]>
+
+        Add dispatchMessageEventWithOriginCheck to DOMWindow
+        https://bugs.webkit.org/show_bug.cgi?id=85815
+
+        Reviewed by Adam Barth.
+
+        Useful for ports that support cross-process postMessage.
+        No new tests, since covered by existing postMessage tests.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::postMessageTimerFired):
+        (WebCore):
+        (WebCore::DOMWindow::dispatchMessageEventWithOriginCheck):
+        * page/DOMWindow.h:
+        (WebCore):
+        (DOMWindow):
+
 2012-05-09  Jason Liu  <[email protected]>
 
         [BlackBerry] Cookie parsing issue. If the cookie value provided was (") then the browser creates a session cookie instead.

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (116607 => 116608)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2012-05-10 05:31:29 UTC (rev 116608)
@@ -866,12 +866,17 @@
     if (m_frame->loader()->client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), event.get()))
         return;
 
-    if (timer->targetOrigin()) {
+    dispatchMessageEventWithOriginCheck(timer->targetOrigin(), event, timer->stackTrace());
+}
+
+void DOMWindow::dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event> event, PassRefPtr<ScriptCallStack> stackTrace)
+{
+    if (intendedTargetOrigin) {
         // Check target origin now since the target document may have changed since the timer was scheduled.
-        if (!timer->targetOrigin()->isSameSchemeHostPort(document()->securityOrigin())) {
-            String message = "Unable to post message to " + timer->targetOrigin()->toString() +
+        if (!intendedTargetOrigin->isSameSchemeHostPort(document()->securityOrigin())) {
+            String message = "Unable to post message to " + intendedTargetOrigin->toString() +
                              ". Recipient has origin " + document()->securityOrigin()->toString() + ".\n";
-            console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, timer->stackTrace());
+            console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, stackTrace);
             return;
         }
     }

Modified: trunk/Source/WebCore/page/DOMWindow.h (116607 => 116608)


--- trunk/Source/WebCore/page/DOMWindow.h	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebCore/page/DOMWindow.h	2012-05-10 05:31:29 UTC (rev 116608)
@@ -54,6 +54,7 @@
     class IDBFactory;
     class Location;
     class MediaQueryList;
+    class MessageEvent;
     class Navigator;
     class Node;
     class Page;
@@ -61,6 +62,7 @@
     class PostMessageTimer;
     class ScheduledAction;
     class Screen;
+    class ScriptCallStack;
     class SecurityOrigin;
     class SerializedScriptValue;
     class Storage;
@@ -233,6 +235,7 @@
         // FIXME: remove this when we update the ObjC bindings (bug #28774).
         void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, const String& targetOrigin, DOMWindow* source, ExceptionCode&);
         void postMessageTimerFired(PassOwnPtr<PostMessageTimer>);
+        void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtr<Event>, PassRefPtr<ScriptCallStack>);
 
         void scrollBy(int x, int y) const;
         void scrollTo(int x, int y) const;

Modified: trunk/Source/WebKit/chromium/ChangeLog (116607 => 116608)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-05-10 05:31:29 UTC (rev 116608)
@@ -1,3 +1,23 @@
+2012-05-09  Charlie Reis  <[email protected]>
+
+        Add dispatchMessageEventWithOriginCheck to WebFrame
+        https://bugs.webkit.org/show_bug.cgi?id=85815
+
+        Reviewed by Adam Barth.
+
+        Tested by WebFrameTest.DispatchMessageEventWithOriginCheck.
+        Also fixes source frame bug in willCheckAndDispatchMessageEvent.
+
+        * public/WebFrame.h:
+        (WebFrame):
+        * src/FrameLoaderClientImpl.cpp:
+        (WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent):
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::checkAndDispatchMessageEvent):
+        (WebKit):
+        * src/WebFrameImpl.h:
+        (WebFrameImpl):
+
 2012-05-09  Hironori Bono  <[email protected]>
 
         Fix a crash in ContextMenuClientImpl::getCustomMenuFromDefaultItems

Modified: trunk/Source/WebKit/chromium/public/WebFrame.h (116607 => 116608)


--- trunk/Source/WebKit/chromium/public/WebFrame.h	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/public/WebFrame.h	2012-05-10 05:31:29 UTC (rev 116608)
@@ -581,6 +581,9 @@
     virtual void removeEventListener(const WebString& eventType,
                                      WebDOMEventListener*, bool useCapture) = 0;
     virtual bool dispatchEvent(const WebDOMEvent&) = 0;
+    virtual void dispatchMessageEventWithOriginCheck(
+        const WebSecurityOrigin& intendedTargetOrigin,
+        const WebDOMEvent&) = 0;
 
 
     // Web Intents ---------------------------------------------------------

Modified: trunk/Source/WebKit/chromium/src/FrameLoaderClientImpl.cpp (116607 => 116608)


--- trunk/Source/WebKit/chromium/src/FrameLoaderClientImpl.cpp	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/src/FrameLoaderClientImpl.cpp	2012-05-10 05:31:29 UTC (rev 116608)
@@ -1598,8 +1598,11 @@
     if (!m_webFrame->client())
         return false;
 
+    WebFrame* source = 0;
+    if (event && event->source() && event->source()->document())
+        source = WebFrameImpl::fromFrame(event->source()->document()->frame());
     return m_webFrame->client()->willCheckAndDispatchMessageEvent(
-        m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
+        source, WebSecurityOrigin(target), WebDOMMessageEvent(event));
 }
 
 #if ENABLE(WEB_INTENTS_TAG)

Modified: trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp (116607 => 116608)


--- trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/src/WebFrameImpl.cpp	2012-05-10 05:31:29 UTC (rev 116608)
@@ -122,6 +122,7 @@
 #include "ResourceHandle.h"
 #include "ResourceRequest.h"
 #include "SchemeRegistry.h"
+#include "ScriptCallStack.h"
 #include "ScriptController.h"
 #include "ScriptSourceCode.h"
 #include "ScriptValue.h"
@@ -1893,6 +1894,13 @@
     return m_frame->domWindow()->dispatchEvent(event);
 }
 
+void WebFrameImpl::dispatchMessageEventWithOriginCheck(const WebSecurityOrigin& intendedTargetOrigin, const WebDOMEvent& event)
+{
+    ASSERT(!event.isNull());
+    // Pass an empty call stack, since we don't have the one from the other process.
+    m_frame->domWindow()->dispatchMessageEventWithOriginCheck(intendedTargetOrigin.get(), event, 0);
+}
+
 WebString WebFrameImpl::contentAsText(size_t maxChars) const
 {
     if (!m_frame)

Modified: trunk/Source/WebKit/chromium/src/WebFrameImpl.h (116607 => 116608)


--- trunk/Source/WebKit/chromium/src/WebFrameImpl.h	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/src/WebFrameImpl.h	2012-05-10 05:31:29 UTC (rev 116608)
@@ -214,6 +214,9 @@
     virtual void removeEventListener(const WebString& eventType,
                                      WebDOMEventListener*, bool useCapture);
     virtual bool dispatchEvent(const WebDOMEvent&);
+    virtual void dispatchMessageEventWithOriginCheck(
+        const WebSecurityOrigin& intendedTargetOrigin,
+        const WebDOMEvent&);
 
     virtual WebString contentAsText(size_t maxChars) const;
     virtual WebString contentAsMarkup() const;

Modified: trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp (116607 => 116608)


--- trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp	2012-05-10 05:08:42 UTC (rev 116607)
+++ trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp	2012-05-10 05:31:29 UTC (rev 116608)
@@ -40,6 +40,7 @@
 #include "WebRange.h"
 #include "WebScriptSource.h"
 #include "WebSearchableFormData.h"
+#include "WebSecurityOrigin.h"
 #include "WebSecurityPolicy.h"
 #include "WebSettings.h"
 #include "WebViewClient.h"
@@ -152,6 +153,34 @@
     EXPECT_EQ(std::string::npos, content.find("Clobbered"));
 }
 
+TEST_F(WebFrameTest, DispatchMessageEventWithOriginCheck)
+{
+    registerMockedHttpURLLoad("postmessage_test.html");
+
+    // Pass true to enable _javascript_.
+    WebView* webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "postmessage_test.html", true);
+    
+    // Send a message with the correct origin.
+    WebSecurityOrigin correctOrigin(WebSecurityOrigin::create(GURL(m_baseURL)));
+    WebDOMEvent event = webView->mainFrame()->document().createEvent("MessageEvent");
+    WebDOMMessageEvent message = event.to<WebDOMMessageEvent>();
+    WebSerializedScriptValue data(WebSerializedScriptValue::fromString("foo"));
+    message.initMessageEvent("message", false, false, data, "http://origin.com", 0, "");
+    webView->mainFrame()->dispatchMessageEventWithOriginCheck(correctOrigin, message);
+
+    // Send another message with incorrect origin.
+    WebSecurityOrigin incorrectOrigin(WebSecurityOrigin::create(GURL(m_chromeURL)));
+    webView->mainFrame()->dispatchMessageEventWithOriginCheck(incorrectOrigin, message);
+
+    // Required to see any updates in contentAsText.
+    webView->layout();
+
+    // Verify that only the first addition is in the body of the page.
+    std::string content = webView->mainFrame()->contentAsText(1024).utf8();
+    EXPECT_NE(std::string::npos, content.find("Message 1."));
+    EXPECT_EQ(std::string::npos, content.find("Message 2."));
+}
+
 #if ENABLE(VIEWPORT)
 
 class FixedLayoutTestWebViewClient : public WebViewClient {

Added: trunk/Source/WebKit/chromium/tests/data/postmessage_test.html (0 => 116608)


--- trunk/Source/WebKit/chromium/tests/data/postmessage_test.html	                        (rev 0)
+++ trunk/Source/WebKit/chromium/tests/data/postmessage_test.html	2012-05-10 05:31:29 UTC (rev 116608)
@@ -0,0 +1,16 @@
+<html>
+<head>
+<title>PostMessage Test</title>
+<script>
+var messagesReceived = 0;
+window.addEventListener("message", messageReceived, false);
+function messageReceived(event) {
+  messagesReceived++;
+  document.body.appendChild(document.createTextNode('Message ' + messagesReceived + '.'));
+}
+</script>
+</head>
+<body>
+Test page.
+</body>
+</html>
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to