Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1851)

Unified Diff: content/renderer/render_view_impl.cc

Issue 8760024: Cross-process postMessage (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index c8d35b7ad626b7e5a8acc177c9059cb61547314c..7932405df3d0355fa5f0362b8e1d8355e9c8a744 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -50,6 +50,7 @@
#include "content/public/renderer/render_view_visitor.h"
#include "content/renderer/device_orientation_dispatcher.h"
#include "content/renderer/devtools_agent.h"
+#include "content/renderer/dom_proxy_installer.h"
#include "content/renderer/external_popup_menu.h"
#include "content/renderer/geolocation_dispatcher.h"
#include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h"
@@ -65,6 +66,7 @@
#include "content/renderer/notification_provider.h"
#include "content/renderer/p2p/socket_dispatcher.h"
#include "content/renderer/plugin_channel_host.h"
+#include "content/renderer/proxy_view_host.h"
#include "content/renderer/render_process.h"
#include "content/renderer/render_thread_impl.h"
#include "content/renderer/render_widget_fullscreen_pepper.h"
@@ -88,6 +90,8 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEvent.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMMessageEvent.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragData.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.h"
@@ -117,6 +121,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSearchableFormData.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptValue.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSettings.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageNamespace.h"
@@ -179,6 +184,8 @@ using WebKit::WebCookieJar;
using WebKit::WebData;
using WebKit::WebDataSource;
using WebKit::WebDocument;
+using WebKit::WebDOMEvent;
+using WebKit::WebDOMMessageEvent;
using WebKit::WebDragData;
using WebKit::WebDragOperation;
using WebKit::WebDragOperationsMask;
@@ -217,6 +224,7 @@ using WebKit::WebScriptSource;
using WebKit::WebSearchableFormData;
using WebKit::WebSecurityOrigin;
using WebKit::WebSecurityPolicy;
+using WebKit::WebSerializedScriptValue;
using WebKit::WebSettings;
using WebKit::WebSharedWorker;
using WebKit::WebSize;
@@ -242,6 +250,8 @@ using appcache::WebApplicationCacheHostImpl;
using base::Time;
using base::TimeDelta;
using content::DocumentState;
+using content::DOMProxyInstaller;
+using content::ProxyViewHost;
using content::NavigationState;
using content::RenderThread;
using content::RenderViewObserver;
@@ -694,6 +704,8 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_LockMouse_ACK, OnLockMouseACK)
IPC_MESSAGE_HANDLER(ViewMsg_MouseLockLost, OnMouseLockLost)
IPC_MESSAGE_HANDLER(JavaBridgeMsg_Init, OnJavaBridgeInit)
+ IPC_MESSAGE_HANDLER(ViewMsg_PostMessage, OnPostMessage)
+ IPC_MESSAGE_HANDLER(ViewMsg_SetOpenerProxy, OnSetOpenerProxy)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
@@ -788,6 +800,14 @@ void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) {
}
}
+ DLOG(WARNING) << "Navigating to " << params.url << " with opener = " <<
+ params.opener_browsing_instance_frame_id;
+
+ if (params.opener_browsing_instance_frame_id != -1) {
+ ProxyViewHost* proxy_view_host = new ProxyViewHost(
+ this, params.opener_browsing_instance_frame_id);
+ main_frame->setOpener(proxy_view_host->mainFrame());
+ }
Charlie Reis 2011/12/01 23:13:02 Hmm, what happens if we go back to the NavigationE
supersat 2011/12/09 23:08:20 Yeah, and we shouldn't. Fixed. (But we should test
main_frame->loadRequest(request);
}
@@ -939,6 +959,35 @@ void RenderViewImpl::OnPasteAndMatchStyle() {
WebString::fromUTF8("PasteAndMatchStyle"));
}
+void RenderViewImpl::OnPostMessage(int64 frame_id,
+ const ViewMsg_PostMessage_Params& params) {
+ // TODO(supersat): support subframes
+ WebFrame *frame = webview()->mainFrame();
+
+ // We need to check whether we can send this message to the frame, since the
+ // asynchrony of postMessage means that the target frame's origin can change
+ // in the middle of a postMessage dispatch
+ WebSecurityOrigin messageSpecifiedOrigin =
+ WebSecurityOrigin::createFromString(WebString(params.origin));
+ if (!frame->document().securityOrigin().canReceivePostMessage(
+ &messageSpecifiedOrigin))
+ return;
+
+ WebDOMEvent event = frame->document().createEvent("MessageEvent");
+ WebDOMMessageEvent msgEvent = event.to<WebDOMMessageEvent>();
+
+ // TODO(supersat): fix the source frame parameter
+ msgEvent.initMessageEvent("message",
+ // canBubble and cancellable are always false
+ false, false,
+ WebSerializedScriptValue::fromString(params.data),
+ params.origin, 0 /* source frame */,
+ params.lastEventId);
+
+ DLOG(WARNING) << "Dispatching postMessage event";
+ frame->dispatchEvent(msgEvent);
+}
+
void RenderViewImpl::OnReplace(const string16& text) {
if (!webview())
return;
@@ -1238,12 +1287,19 @@ void RenderViewImpl::OpenURL(WebFrame* frame,
const GURL& url,
const GURL& referrer,
WebNavigationPolicy policy) {
- Send(new ViewHostMsg_OpenURL(
- routing_id_,
- url,
- referrer,
- NavigationPolicyToDisposition(policy),
- frame->identifier()));
+ long long opener_frame_id = -1;
+ if (frame->opener()) {
+ opener_frame_id = frame->opener()->identifier();
+ }
+
+ ViewHostMsg_OpenURL_Params params;
+ params.url = url;
+ params.referrer = referrer;
+ params.disposition = NavigationPolicyToDisposition(policy);
+ params.source_frame_id = frame->identifier();
+ params.opener_frame_id = opener_frame_id;
+
+ Send(new ViewHostMsg_OpenURL(routing_id_, params));
}
// WebViewDelegate ------------------------------------------------------------
@@ -1987,12 +2043,6 @@ void RenderViewImpl::loadURLExternally(
WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
WebFrame* frame, const WebURLRequest& request, WebNavigationType type,
const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) {
- // TODO(creis): Remove this when we fix OnSwapOut to not need a navigation.
Charlie Reis 2011/12/01 23:13:02 This can't be removed any more, can it?
supersat 2011/12/09 23:08:20 No. Done.
- if (is_swapped_out_) {
- DCHECK(request.url() == GURL("about:swappedout"));
- return default_policy;
- }
-
// Webkit is asking whether to navigate to a new URL.
// This is fine normally, except if we're showing UI from one security
// context and they're trying to navigate to a different context.
@@ -3701,6 +3751,10 @@ void RenderViewImpl::OnExitFullscreen() {
#endif
}
+void RenderViewImpl::OnSetOpenerProxy(const ViewMsg_SetOpenerProxy_Params& params) {
+ //webview()->mainFrame()->setOpener();
+}
+
void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) {
webview()->setPageEncoding(WebString::fromUTF8(encoding_name));
}
@@ -3988,14 +4042,22 @@ void RenderViewImpl::OnSwapOut(const ViewMsg_SwapOut_Params& params) {
// Swap out and stop sending any IPC messages that are not ACKs.
SetSwappedOut(true);
- // Replace the page with a blank dummy URL. The unload handler will not be
- // run a second time, thanks to a check in FrameLoader::stopLoading.
- // TODO(creis): Need to add a better way to do this that avoids running the
- // beforeunload handler. For now, we just run it a second time silently.
- webview()->mainFrame()->loadHTMLString(std::string(),
- GURL("about:swappedout"),
- GURL("about:swappedout"),
- false);
+ // Replace the page with a blank dummy document.
+/*
+ //webview()->mainFrame()->clearDocument();
+ WebDocument dummyDocument = WebDocument::create(*frame,
+ "text/html",
+ GURL());
+ dummyDocument.securityOrigin().grantUniversalAccess();
+ frame->setDocument(dummyDocument);
+*/
+
+ WebFrame* frame = webview()->mainFrame();
+ frame->loadHTMLString(std::string(), GURL("about:swappedout"),
+ GURL("about:swappedout"), false);
+
+ // Set up the postMessage event proxy
+ new DOMProxyInstaller(this, params.browsing_instance_frame_id);
Charlie Reis 2011/12/01 23:13:02 I wonder if there's a clearer way to handle this.
supersat 2011/12/09 23:08:20 If we go with Adam's approach, we don't need the D
// Just echo back the params in the ACK.
Send(new ViewHostMsg_SwapOut_ACK(routing_id_, params));

Powered by Google App Engine
This is Rietveld 408576698