| 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..e85097795703834ae74f30e081a8ceff9650143d 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.target_origin.empty()) {
|
| + WebSecurityOrigin messageSpecifiedOrigin =
|
| + WebSecurityOrigin::createFromString(WebString(params.target_origin));
|
| + if (!messageSpecifiedOrigin.isSameSchemeHostPort(
|
| + frame->document().securityOrigin()))
|
| + 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.source_origin, 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,25 @@ void RenderViewImpl::registerIntentService(
|
| service.disposition()));
|
| }
|
|
|
| +bool RenderViewImpl::willCheckAndDispatchMessageEvent(
|
| + WebKit::WebFrame* source,
|
| + WebKit::WebSecurityOrigin target_origin,
|
| + WebKit::WebDOMMessageEvent event) {
|
| + if (!is_swapped_out_)
|
| + return false;
|
| + DCHECK_NE(active_content_frame_id_, -1);
|
| +
|
| + ViewMsg_PostMessage_Params params;
|
| + params.data = event.data().toString();
|
| + params.source_origin = event.origin();
|
| + if (!target_origin.isNull())
|
| + params.target_origin = target_origin.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 +4117,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));
|
| }
|
|
|