https://bugs.webkit.org/show_bug.cgi?id=73883
Source/WebCore:
To support cross-process postMessage calls in Chromium (bug 73337), we need to intercept
postMessage calls to proxy windows. Originally we were just going to add a native event
listener on the Chromium side, but that required more changes to WebKit and was a bit of
a hack. See bug 73359 for a discuss about moving to this approach.
Patch by Karl Koscher <supersat@chromium.org> on 2012-01-03
Reviewed by Adam Barth.
Test: platform/chromium/fast/events/intercept-postmessage.html
* loader/FrameLoaderClient.h:
(WebCore::FrameLoaderClient::willCheckAndDispatchPostMessage): new method to allow the
embedder to intercept postMessage calls
* page/DOMWindow.cpp:
(WebCore::DOMWindow::postMessageTimerFired): add a call to
FrameLoaderClient::willCheckAndDispatchPostMessage
Source/WebKit/chromium:
Patch by Karl Koscher <supersat@chromium.org> on 2012-01-03
Reviewed by Adam Barth.
* public/WebFrameClient.h:
(WebKit::WebFrameClient::willCheckAndDispatchMessageEvent):
interface to give the embedder a chance to handle this postMessage call
* src/FrameLoaderClientImpl.cpp:
(WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent): Call
willCheckAndDispatchMessageEvent on WebFrameClient
* src/FrameLoaderClientImpl.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@104005
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
--- /dev/null
+main frame - didFinishDocumentLoadForFrame
+main frame - didHandleOnloadEventsForFrame
+main frame - didFinishLoadForFrame
+intercepted postMessage
+intercepted postMessage
+RECV1
+
--- /dev/null
+<html>
+ <head>
+ <script>
+ function write(str) {
+ pre = document.getElementById('console');
+ text = document.createTextNode(str + '\n');
+ pre.appendChild(text);
+ }
+
+ function recvMsg1(e) {
+ write("RECV1");
+ window.removeEventListener("message", recvMsg1, false);
+
+ if (window.layoutTestController)
+ layoutTestController.interceptPostMessage = true;
+
+ window.addEventListener("message", recvMsg2, false);
+ window.postMessage("Message 2", "*");
+
+ // Ensure that we're intercepting postMessages before the origin check
+ window.postMessage("Message 3", "http://example.org");
+
+ // We need to call setTimeout here because we intercept the next event.
+ // If this test becomes flaky, you may need to increase this timeout.
+ window.setTimeout("done()", 50);
+ }
+
+ function recvMsg2(e) {
+ write("RECV2");
+ }
+
+ function done() {
+ if (window.layoutTestController)
+ window.layoutTestController.notifyDone();
+ }
+
+ window.addEventListener("message", recvMsg1, false);
+
+ if (window.layoutTestController) {
+ window.layoutTestController.dumpFrameLoadCallbacks();
+ window.layoutTestController.dumpAsText();
+ window.layoutTestController.waitUntilDone();
+ }
+
+ window.postMessage("Message 1", "*");
+ </script>
+ </head>
+ <body><pre id="console"></pre></body>
+</html>
+
+2012-01-03 Karl Koscher <supersat@chromium.org>
+
+ Give embedders a chance to handle postMessage calls
+ https://bugs.webkit.org/show_bug.cgi?id=73883
+
+ To support cross-process postMessage calls in Chromium (bug 73337), we need to intercept
+ postMessage calls to proxy windows. Originally we were just going to add a native event
+ listener on the Chromium side, but that required more changes to WebKit and was a bit of
+ a hack. See bug 73359 for a discuss about moving to this approach.
+
+ Reviewed by Adam Barth.
+
+ Test: platform/chromium/fast/events/intercept-postmessage.html
+
+ * loader/FrameLoaderClient.h:
+ (WebCore::FrameLoaderClient::willCheckAndDispatchPostMessage): new method to allow the
+ embedder to intercept postMessage calls
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::postMessageTimerFired): add a call to
+ FrameLoaderClient::willCheckAndDispatchPostMessage
+
2012-01-03 Eric Penner <epenner@google.com>
[chromium] Prevent crashing due to NULL texture updater.
class HTMLPlugInElement;
class IntSize;
class KURL;
+ class MessageEvent;
class NavigationAction;
class Page;
class ProtectionSpace;
virtual PassRefPtr<FrameNetworkingContext> createNetworkingContext() = 0;
virtual bool shouldPaintBrokenImage(const KURL&) const { return true; }
+
+ // Returns true if the embedder intercepted the postMessage call
+ virtual bool willCheckAndDispatchMessageEvent(SecurityOrigin* /*target*/, MessageEvent*) const { return false; }
};
} // namespace WebCore
#include "Frame.h"
#include "FrameLoadRequest.h"
#include "FrameLoader.h"
+#include "FrameLoaderClient.h"
#include "FrameTree.h"
#include "FrameView.h"
#include "HTMLFrameOwnerElement.h"
if (!document())
return;
+ RefPtr<MessageEvent> event = timer->event(document());
+
+ // Give the embedder a chance to intercept this postMessage because this
+ // DOMWindow might be a proxy for another in browsers that support
+ // postMessage calls across WebKit instances.
+ if (isCurrentlyDisplayedInFrame() && m_frame->loader()->client()->willCheckAndDispatchMessageEvent(timer->targetOrigin(), PassRefPtr<MessageEvent>(event).leakRef()))
+ return;
+
if (timer->targetOrigin()) {
- // Check target origin now since the target document may have changed since the simer was scheduled.
+ // 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() +
". Recipient has origin " + document()->securityOrigin()->toString() + ".\n";
}
}
- dispatchEvent(timer->event(document()));
+ dispatchEvent(event);
}
DOMSelection* DOMWindow::getSelection()
+2012-01-03 Karl Koscher <supersat@chromium.org>
+
+ Give embedders a chance to handle postMessage calls
+ https://bugs.webkit.org/show_bug.cgi?id=73883
+
+ Reviewed by Adam Barth.
+
+ * public/WebFrameClient.h:
+ (WebKit::WebFrameClient::willCheckAndDispatchMessageEvent):
+ interface to give the embedder a chance to handle this postMessage call
+ * src/FrameLoaderClientImpl.cpp:
+ (WebKit::FrameLoaderClientImpl::willCheckAndDispatchMessageEvent): Call
+ willCheckAndDispatchMessageEvent on WebFrameClient
+ * src/FrameLoaderClientImpl.h:
+
2012-01-03 Shawn Singh <shawnsingh@chromium.org>
[chromium] CCLayerSorter accidentally reverses order of some layers.
#include "platform/WebSerializedScriptValue.h"
#if WEBKIT_IMPLEMENTATION
-namespace WebCore { class Event; }
+#include "Event.h"
+#include "MessageEvent.h"
#endif
namespace WebKit {
WEBKIT_EXPORT WebSerializedScriptValue data() const;
WEBKIT_EXPORT WebString origin() const;
+
+#if WEBKIT_IMPLEMENTATION
+ explicit WebDOMMessageEvent(const WTF::PassRefPtr<WebCore::MessageEvent>& e) : WebDOMEvent(e) { }
+#endif
};
} // namespace WebKit
#ifndef WebFrameClient_h
#define WebFrameClient_h
+#include "WebDOMMessageEvent.h"
#include "WebIconURL.h"
#include "WebNavigationPolicy.h"
#include "WebNavigationType.h"
+#include "WebSecurityOrigin.h"
#include "WebStorageQuotaType.h"
#include "WebTextDirection.h"
#include "platform/WebCommon.h"
class WebApplicationCacheHostClient;
class WebCookieJar;
class WebDataSource;
+class WebDOMEvent;
class WebFormElement;
class WebFrame;
class WebIntentServiceInfo;
class WebMediaPlayerClient;
class WebNode;
class WebPlugin;
-class WebSecurityOrigin;
class WebSharedWorker;
class WebStorageQuotaCallbacks;
class WebString;
// the WebFrame starting the activity.
virtual void dispatchIntent(WebFrame*, const WebIntent&) { }
+ // Messages ------------------------------------------------------
+
+ // Notifies the embedder that a postMessage was issued on this frame, and
+ // gives the embedder a chance to handle it instead of WebKit. Returns true
+ // if the embedder handled it.
+ virtual bool willCheckAndDispatchMessageEvent(
+ WebFrame* source,
+ WebSecurityOrigin target,
+ WebDOMMessageEvent) { return false; }
+
protected:
~WebFrameClient() { }
};
#include "HTMLAppletElement.h"
#include "HTMLFormElement.h" // needed by FormState.h
#include "HTMLNames.h"
+#include "MessageEvent.h"
#include "MIMETypeRegistry.h"
#include "MouseEvent.h"
#include "Page.h"
#include "ResourceLoader.h"
#include "Settings.h"
#include "StringExtras.h"
+#include "WebDOMEvent.h"
#include "WebDataSourceImpl.h"
#include "WebDevToolsAgentPrivate.h"
#include "WebDocument.h"
return FrameNetworkingContextImpl::create(m_webFrame->frame());
}
+bool FrameLoaderClientImpl::willCheckAndDispatchMessageEvent(
+ SecurityOrigin* target, MessageEvent* event) const
+{
+ if (!m_webFrame->client())
+ return false;
+
+ return m_webFrame->client()->willCheckAndDispatchMessageEvent(
+ m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
+}
+
} // namespace WebKit
virtual void didNotAllowPlugins();
virtual PassRefPtr<WebCore::FrameNetworkingContext> createNetworkingContext();
+ virtual bool willCheckAndDispatchMessageEvent(WebCore::SecurityOrigin* target, WebCore::MessageEvent*) const;
private:
void makeDocumentView();
bindProperty("webHistoryItemCount", &m_webHistoryItemCount);
bindProperty("titleTextDirection", &m_titleTextDirection);
bindProperty("platformName", &m_platformName);
+ bindProperty("interceptPostMessage", &m_interceptPostMessage);
}
LayoutTestController::~LayoutTestController()
m_webHistoryItemCount.set(0);
m_titleTextDirection.set("ltr");
m_platformName.set("chromium");
+ m_interceptPostMessage.set(false);
m_userStyleSheetLocation = WebURL();
m_isPrinting = false;
m_titleTextDirection.set(dir == WebKit::WebTextDirectionLeftToRight ? "ltr" : "rtl");
}
+ bool shouldInterceptPostMessage()
+ {
+ return m_interceptPostMessage.isBool() && m_interceptPostMessage.toBoolean();
+ }
+
void setIsPrinting(bool value) { m_isPrinting = value; }
bool isPrinting() { return m_isPrinting; }
// Bound variable to return the name of this platform (chromium).
CppVariant m_platformName;
+ // Bound variable to set whether postMessages should be intercepted or not
+ CppVariant m_interceptPostMessage;
+
WebKit::WebURL m_userStyleSheetLocation;
OwnPtr<WebKit::WebSpeechInputControllerMock> m_speechInputControllerMock;
#include "platform/WebCString.h"
#include "WebConsoleMessage.h"
#include "WebContextMenuData.h"
+#include "WebDOMMessageEvent.h"
#include "WebDataSource.h"
#include "WebDeviceOrientationClientMock.h"
#include "platform/WebDragData.h"
webkit_support::OpenFileSystem(frame, type, size, create, callbacks);
}
+bool WebViewHost::willCheckAndDispatchMessageEvent(WebFrame* source, WebSecurityOrigin target, WebDOMMessageEvent event)
+{
+ if (m_shell->layoutTestController()->shouldInterceptPostMessage()) {
+ fputs("intercepted postMessage\n", stdout);
+ return true;
+ }
+
+ return false;
+}
+
// Public functions -----------------------------------------------------------
WebViewHost::WebViewHost(TestShell* shell)
virtual void didRunInsecureContent(WebKit::WebFrame*, const WebKit::WebSecurityOrigin&, const WebKit::WebURL&);
virtual void didDetectXSS(WebKit::WebFrame*, const WebKit::WebURL&, bool didBlockEntirePage);
virtual void openFileSystem(WebKit::WebFrame*, WebKit::WebFileSystem::Type, long long size, bool create, WebKit::WebFileSystemCallbacks*);
+ virtual bool willCheckAndDispatchMessageEvent(WebKit::WebFrame* source, WebKit::WebSecurityOrigin target, WebKit::WebDOMMessageEvent);
WebKit::WebDeviceOrientationClientMock* deviceOrientationClientMock();