Chromium Code Reviews| Index: content/browser/web_contents/web_contents_impl.cc |
| diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
| index a1ad421e10aa4e62d4ae2b5a0b16297eb67bce28..027c8e8ccbdbe812ed113db67ae2870148c134d4 100644 |
| --- a/content/browser/web_contents/web_contents_impl.cc |
| +++ b/content/browser/web_contents/web_contents_impl.cc |
| @@ -204,15 +204,23 @@ void SetAccessibilityModeOnFrame(AccessibilityMode mode, |
| } // namespace |
| WebContents* WebContents::Create(const WebContents::CreateParams& params) { |
| - return WebContentsImpl::CreateWithOpener( |
| - params, static_cast<WebContentsImpl*>(params.opener)); |
| + FrameTreeNode* opener_node = nullptr; |
| + CHECK(!params.opener || params.opener_render_frame_id != MSG_ROUTING_NONE); |
| + if (params.opener_render_frame_id != MSG_ROUTING_NONE) { |
| + RenderFrameHostImpl* opener_rfh = RenderFrameHostImpl::FromID( |
| + params.opener->GetRenderProcessHost()->GetID(), |
|
alexmos
2015/06/01 17:44:55
I didn't remove "opener" from WebContents::CreateP
Charlie Reis
2015/06/03 20:01:37
CreateParams is public, so we shouldn't put FrameT
alexmos
2015/06/05 22:34:31
Done.
|
| + params.opener_render_frame_id); |
| + // TODO: Is this null check needed? Seems like opener could navigate away. |
|
Charlie Reis
2015/06/03 20:01:37
Good question. I *think* opener_rfh would be the
alexmos
2015/06/05 22:34:31
Acknowledged.
|
| + if (opener_rfh) |
| + opener_node = opener_rfh->frame_tree_node(); |
| + } |
| + return WebContentsImpl::CreateWithOpener(params, opener_node); |
| } |
| WebContents* WebContents::CreateWithSessionStorage( |
| const WebContents::CreateParams& params, |
| const SessionStorageNamespaceMap& session_storage_namespace_map) { |
| - WebContentsImpl* new_contents = new WebContentsImpl( |
| - params.browser_context, NULL); |
| + WebContentsImpl* new_contents = new WebContentsImpl(params.browser_context); |
| for (SessionStorageNamespaceMap::const_iterator it = |
| session_storage_namespace_map.begin(); |
| @@ -288,13 +296,11 @@ WebContentsImpl::ColorChooserInfo::~ColorChooserInfo() { |
| // WebContentsImpl ------------------------------------------------------------- |
| -WebContentsImpl::WebContentsImpl(BrowserContext* browser_context, |
| - WebContentsImpl* opener) |
| +WebContentsImpl::WebContentsImpl(BrowserContext* browser_context) |
| : delegate_(NULL), |
| controller_(this, browser_context), |
| render_view_host_delegate_view_(NULL), |
| - opener_(opener), |
| - created_with_opener_(!!opener), |
| + created_with_opener_(false), |
| #if defined(OS_WIN) |
| accessible_parent_(NULL), |
| #endif |
| @@ -422,10 +428,14 @@ WebContentsImpl::~WebContentsImpl() { |
| WebContentsImpl* WebContentsImpl::CreateWithOpener( |
| const WebContents::CreateParams& params, |
| - WebContentsImpl* opener) { |
| + FrameTreeNode* opener) { |
| TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener"); |
| - WebContentsImpl* new_contents = new WebContentsImpl( |
| - params.browser_context, params.opener_suppressed ? NULL : opener); |
| + WebContentsImpl* new_contents = new WebContentsImpl(params.browser_context); |
| + |
| + if (!params.opener_suppressed && opener) { |
| + new_contents->GetFrameTree()->root()->SetOpener(opener); |
| + new_contents->created_with_opener_ = true; |
| + } |
| if (params.created_with_opener) |
| new_contents->created_with_opener_ = true; |
|
Charlie Reis
2015/06/03 20:01:37
Why do we need both this and the case above? If t
alexmos
2015/06/05 22:34:32
I added a comment. It's needed in the case of all
|
| @@ -473,6 +483,13 @@ WebContentsImpl* WebContentsImpl::FromFrameTreeNode( |
| WebContents::FromRenderFrameHost(frame_tree_node->current_frame_host())); |
| } |
| +WebContentsImpl* WebContentsImpl::opener() const { |
| + FrameTreeNode* opener_ftn = frame_tree_.root()->opener(); |
| + // TODO(alexmos): what if opener_ftn->current_frame_host() is null? This |
| + // will return nullptr, but can we ever have a valid WebContents w/o a RFH? |
|
alexmos
2015/06/01 17:44:55
I think that's impossible, but just wanted to doub
Charlie Reis
2015/06/03 20:01:37
I *think* the RFH is only null before WebContentsI
alexmos
2015/06/05 22:34:32
Yes, CreateWithOpener only has a few lines between
|
| + return opener_ftn ? FromFrameTreeNode(opener_ftn) : nullptr; |
| +} |
| + |
| RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { |
| return GetRenderManager(); |
| } |
| @@ -1160,11 +1177,12 @@ void WebContentsImpl::Stop() { |
| WebContents* WebContentsImpl::Clone() { |
| // We use our current SiteInstance since the cloned entry will use it anyway. |
| - // We pass our own opener so that the cloned page can access it if it was |
| + // We pass our own opener so that the cloned page can access it if it was set |
| // before. |
| CreateParams create_params(GetBrowserContext(), GetSiteInstance()); |
| create_params.initial_size = GetContainerBounds().size(); |
| - WebContentsImpl* tc = CreateWithOpener(create_params, opener_); |
| + WebContentsImpl* tc = |
| + CreateWithOpener(create_params, frame_tree_.root()->opener()); |
|
alexmos
2015/06/01 17:44:55
Uncovered an interesting bug here which I haven't
Charlie Reis
2015/06/03 20:01:37
Nice. Worth filing it so that we make sure it get
alexmos
2015/06/05 22:34:32
Done. Filed issue 497382.
|
| tc->GetController().CopyStateFrom(controller_); |
| FOR_EACH_OBSERVER(WebContentsObserver, |
| observers_, |
| @@ -1245,10 +1263,6 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { |
| gfx::Size initial_size = params.initial_size; |
| view_->CreateView(initial_size, params.context); |
| - // Listen for whether our opener gets destroyed. |
| - if (opener_) |
| - AddDestructionObserver(opener_); |
| - |
| #if defined(ENABLE_PLUGINS) |
| plugin_content_origin_whitelist_.reset( |
| new PluginContentOriginWhitelist(this)); |
| @@ -1294,11 +1308,6 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { |
| void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { |
| RemoveDestructionObserver(web_contents); |
| - // Clear the opener if it has been closed. |
| - if (web_contents == opener_) { |
| - opener_ = NULL; |
| - return; |
| - } |
| // Clear a pending contents that has been closed before being shown. |
| for (PendingContents::iterator iter = pending_contents_.begin(); |
| iter != pending_contents_.end(); |
| @@ -1601,6 +1610,7 @@ void WebContentsImpl::CreateNewWindow( |
| create_params.main_frame_routing_id = main_frame_route_id; |
| create_params.main_frame_name = base::UTF16ToUTF8(params.frame_name); |
| create_params.opener = this; |
| + create_params.opener_render_frame_id = params.opener_render_frame_id; |
| create_params.opener_suppressed = params.opener_suppressed; |
| if (params.disposition == NEW_BACKGROUND_TAB) |
| create_params.initially_hidden = true; |
| @@ -2469,11 +2479,11 @@ bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) { |
| } |
| bool WebContentsImpl::HasOpener() const { |
| - return opener_ != NULL; |
| + return opener() != NULL; |
| } |
| WebContents* WebContentsImpl::GetOpener() const { |
| - return static_cast<WebContents*>(opener_); |
| + return static_cast<WebContents*>(opener()); |
| } |
| void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) { |
| @@ -3808,22 +3818,6 @@ void WebContentsImpl::DidChangeName(RenderFrameHost* render_frame_host, |
| FrameNameChanged(render_frame_host, name)); |
| } |
| -void WebContentsImpl::DidDisownOpener(RenderFrameHost* render_frame_host) { |
| - // No action is necessary if the opener has already been cleared. |
| - if (!opener_) |
| - return; |
| - |
| - // Clear our opener so that future cross-process navigations don't have an |
| - // opener assigned. |
| - RemoveDestructionObserver(opener_); |
| - opener_ = NULL; |
| - |
| - // Notify all swapped out RenderViewHosts for this tab. This is important |
| - // in case we go back to them, or if another window in those processes tries |
| - // to access window.opener. |
| - GetRenderManager()->DidDisownOpener(render_frame_host); |
| -} |
| - |
| void WebContentsImpl::DocumentOnLoadCompleted( |
| RenderFrameHost* render_frame_host) { |
| FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
| @@ -4095,11 +4089,11 @@ void WebContentsImpl::NotifyMainFrameSwappedFromRenderManager( |
| int WebContentsImpl::CreateOpenerRenderViewsForRenderManager( |
| SiteInstance* instance) { |
| - if (!opener_) |
| + if (!opener()) |
| return MSG_ROUTING_NONE; |
| // Recursively create RenderViews for anything else in the opener chain. |
| - return opener_->CreateOpenerRenderViews(instance); |
| + return opener()->CreateOpenerRenderViews(instance); |
| } |
| int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { |
| @@ -4107,8 +4101,8 @@ int WebContentsImpl::CreateOpenerRenderViews(SiteInstance* instance) { |
| // If this tab has an opener, ensure it has a RenderView in the given |
| // SiteInstance as well. |
| - if (opener_) |
| - opener_route_id = opener_->CreateOpenerRenderViews(instance); |
| + if (opener()) |
| + opener_route_id = opener()->CreateOpenerRenderViews(instance); |
| // If any of the renderers (current, pending, or swapped out) for this |
| // WebContents has the same SiteInstance, use it. |