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

Unified Diff: content/browser/web_contents/web_contents_impl.cc

Issue 1086283002: Track frame openers in FrameTreeNodes instead of WebContents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Second round of feedback Created 5 years, 6 months 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
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/public/browser/content_browser_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 378177e48572e08096857d8b0601a39456e88912..1c7034aa605853f9ce30b085f55a093790a0dac7 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -207,15 +207,20 @@ 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;
+ if (params.opener_render_frame_id != MSG_ROUTING_NONE) {
+ RenderFrameHostImpl* opener_rfh = RenderFrameHostImpl::FromID(
+ params.opener_render_process_id, params.opener_render_frame_id);
+ 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();
@@ -291,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
@@ -426,11 +429,17 @@ 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;
+ }
+ // This may be true even when opener is null, such as when opening blocked
+ // popups.
if (params.created_with_opener)
new_contents->created_with_opener_ = true;
@@ -1173,11 +1182,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());
tc->GetController().CopyStateFrom(controller_);
FOR_EACH_OBSERVER(WebContentsObserver,
observers_,
@@ -1258,10 +1268,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));
@@ -1308,11 +1314,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();
@@ -1614,7 +1615,8 @@ void WebContentsImpl::CreateNewWindow(
create_params.routing_id = route_id;
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_process_id = GetRenderProcessHost()->GetID();
+ 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;
@@ -2484,11 +2486,12 @@ bool WebContentsImpl::GotResponseToLockMouseRequest(bool allowed) {
}
bool WebContentsImpl::HasOpener() const {
- return opener_ != NULL;
+ return GetOpener() != NULL;
}
-WebContents* WebContentsImpl::GetOpener() const {
- return static_cast<WebContents*>(opener_);
+WebContentsImpl* WebContentsImpl::GetOpener() const {
+ FrameTreeNode* opener_ftn = frame_tree_.root()->opener();
+ return opener_ftn ? FromFrameTreeNode(opener_ftn) : nullptr;
}
void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
@@ -3842,22 +3845,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_,
@@ -4134,11 +4121,12 @@ void WebContentsImpl::NotifyMainFrameSwappedFromRenderManager(
int WebContentsImpl::CreateOpenerRenderViewsForRenderManager(
SiteInstance* instance) {
- if (!opener_)
+ WebContentsImpl* opener = GetOpener();
+ 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) {
@@ -4146,8 +4134,9 @@ 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);
+ WebContentsImpl* opener = GetOpener();
+ 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.
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/public/browser/content_browser_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698