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

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: Some cleanup Created 9 years 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 ce57e9c265a0d9a6837cd06efc513f1f67e496e5..19820fb3296a21a3a32e6b5b466cbfea87830521 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -26,6 +26,7 @@
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "content/common/appcache/appcache_dispatcher.h"
+#include "content/common/child_thread.h"
#include "content/common/clipboard_messages.h"
#include "content/common/database_messages.h"
#include "content/common/drag_messages.h"
@@ -89,6 +90,8 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.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/WebElement.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystemCallbacks.h"
@@ -113,6 +116,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/platform/WebSerializedScriptValue.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSettings.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageNamespace.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageQuotaCallbacks.h"
@@ -180,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;
@@ -219,6 +225,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;
@@ -333,6 +340,7 @@ RenderViewImpl::RenderViewImpl(
int32 routing_id,
int64 session_storage_namespace_id,
const string16& frame_name,
+ bool is_renderer_created,
int32 next_page_id)
: RenderWidget(WebKit::WebPopupTypeNone),
webkit_preferences_(webkit_prefs),
@@ -363,12 +371,13 @@ RenderViewImpl::RenderViewImpl(
renderer_accessibility_(NULL),
session_storage_namespace_id_(session_storage_namespace_id),
handling_select_range_(false),
+ active_content_frame_id_(-1),
#if defined(OS_WIN)
focused_plugin_id_(-1),
#endif
ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)) {
routing_id_ = routing_id;
- if (opener_id != MSG_ROUTING_NONE)
+ if (opener_id != MSG_ROUTING_NONE && is_renderer_created)
opener_id_ = opener_id;
// Ensure we start with a valid next_page_id_ from the browser.
@@ -400,7 +409,7 @@ RenderViewImpl::RenderViewImpl(
// If this is a popup, we must wait for the CreatingNew_ACK message before
// completing initialization. Otherwise, we can finish it now.
- if (opener_id == MSG_ROUTING_NONE) {
+ if (opener_id_ == MSG_ROUTING_NONE) {
did_show_ = true;
CompleteInit(parent_hwnd);
}
@@ -440,6 +449,15 @@ RenderViewImpl::RenderViewImpl(
}
content::GetContentClient()->renderer()->RenderViewCreated(this);
+
+ // If we have an opener_id but we weren't created by a renderer, then
+ // it's the browser asking us to set our opener to another RenderView.
+ if (opener_id != MSG_ROUTING_NONE && !is_renderer_created) {
+ RenderViewImpl* opener_rv =
+ static_cast<RenderViewImpl*>(
+ ChildThread::current()->ResolveRoute(opener_id));
+ webview()->mainFrame()->setOpener(opener_rv->webview()->mainFrame());
+ }
}
RenderViewImpl::~RenderViewImpl() {
@@ -510,6 +528,7 @@ RenderViewImpl* RenderViewImpl::Create(
int32 routing_id,
int64 session_storage_namespace_id,
const string16& frame_name,
+ bool is_renderer_created,
int32 next_page_id) {
DCHECK(routing_id != MSG_ROUTING_NONE);
return new RenderViewImpl(
@@ -521,6 +540,7 @@ RenderViewImpl* RenderViewImpl::Create(
routing_id,
session_storage_namespace_id,
frame_name,
+ is_renderer_created,
next_page_id); // adds reference
}
@@ -698,6 +718,7 @@ 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)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
@@ -726,8 +747,10 @@ void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) {
return;
// Swap this renderer back in if necessary.
- if (is_swapped_out_)
+ if (is_swapped_out_) {
SetSwappedOut(false);
+ active_content_frame_id_ = -1;
+ }
history_list_offset_ = params.current_history_list_offset;
history_list_length_ = params.current_history_list_length;
@@ -943,6 +966,38 @@ 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. An empty target origin means that
+ // "*" was passed in, and any target origin is acceptable.
+ if (!params.targetOrigin.empty()) {
+ WebSecurityOrigin messageSpecifiedOrigin =
+ WebSecurityOrigin::createFromString(WebString(params.targetOrigin));
+ if (!frame->document().securityOrigin().canReceiveMessagesFor(
+ &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
awong 2011/12/21 01:56:07 |canBubble| and |cancellable| are always false.
supersat 2011/12/23 03:22:46 Done.
+ false, false,
+ WebSerializedScriptValue::fromString(params.data),
+ params.sourceOrigin, 0 /* source frame */,
+ "" /* last event id, not used with postmsg */);
+
+ DLOG(WARNING) << "Dispatching postMessage event";
+ frame->dispatchEvent(msgEvent);
+}
+
void RenderViewImpl::OnReplace(const string16& text) {
if (!webview())
return;
@@ -1347,6 +1402,7 @@ WebView* RenderViewImpl::createView(
routing_id,
cloned_session_storage_namespace_id,
frame_name,
+ true,
1);
view->opened_by_user_gesture_ = params.user_gesture;
@@ -2021,6 +2077,8 @@ 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.
+ // TODO(supersat): This currently causes a crash when reloading an app that
+ // opens an out-of-app window
if (is_swapped_out_) {
DCHECK(request.url() == GURL("about:swappedout"));
return default_policy;
@@ -3114,6 +3172,26 @@ void RenderViewImpl::registerIntentService(
service.disposition()));
}
+bool RenderViewImpl::interceptPostMessage(WebKit::WebFrame* source,
+ WebKit::WebSecurityOrigin targetOrig,
+ WebKit::WebDOMMessageEvent event) {
+ DLOG(WARNING) << "interceptPostMessage called";
+
+ if (!is_swapped_out_)
+ return false;
+ DCHECK_NE(active_content_frame_id_, -1);
+
+ ViewMsg_PostMessage_Params params;
+ params.data = event.data().toString();
+ params.sourceOrigin = event.origin();
+ if (!targetOrig.isNull())
awong 2011/12/21 01:56:07 s/targetOrig/targetOrigin/g
supersat 2011/12/23 03:22:46 Done.
+ params.targetOrigin = targetOrig.toString();
+
+ Send(new ViewHostMsg_SendPostMessage(
+ active_content_frame_id_, params));
+ return true;
+}
+
void RenderViewImpl::dispatchIntent(WebKit::WebFrame* frame,
const WebKit::WebIntent& intent) {
webkit_glue::WebIntentData intent_data(intent);
@@ -4040,6 +4118,8 @@ void RenderViewImpl::OnSwapOut(const ViewMsg_SwapOut_Params& params) {
GURL("about:swappedout"),
false);
+ active_content_frame_id_ = params.content_frame_id;
+
// 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