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>