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

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

Issue 2882513005: Propagate opener to BackgroundsContents. (Closed)
Patch Set: Tweaked the comment in DriveWebContentsManager::ShouldCreateWebContents Created 3 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/web_contents.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 c4e6c16e2400196297b13bc18475af672e2d3247..f74d7ca1513b344cccffa260130142f2121bdc76 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -265,9 +265,7 @@ bool GetInnerWebContentsHelper(
return false;
}
-} // namespace
-
-WebContents* WebContents::Create(const WebContents::CreateParams& params) {
+FrameTreeNode* FindOpener(const WebContents::CreateParams& params) {
FrameTreeNode* opener_node = nullptr;
if (params.opener_render_frame_id != MSG_ROUTING_NONE) {
RenderFrameHostImpl* opener_rfh = RenderFrameHostImpl::FromID(
@@ -275,13 +273,21 @@ WebContents* WebContents::Create(const WebContents::CreateParams& params) {
if (opener_rfh)
opener_node = opener_rfh->frame_tree_node();
}
- return WebContentsImpl::CreateWithOpener(params, opener_node);
+ return opener_node;
+}
+
+} // namespace
+
+WebContents* WebContents::Create(const WebContents::CreateParams& params) {
+ return WebContentsImpl::CreateWithOpener(params, FindOpener(params));
}
WebContents* WebContents::CreateWithSessionStorage(
const WebContents::CreateParams& params,
const SessionStorageNamespaceMap& session_storage_namespace_map) {
WebContentsImpl* new_contents = new WebContentsImpl(params.browser_context);
+ new_contents->SetOpenerForNewContents(FindOpener(params),
+ params.opener_suppressed);
for (SessionStorageNamespaceMap::const_iterator it =
session_storage_namespace_map.begin();
@@ -637,27 +643,14 @@ WebContentsImpl* WebContentsImpl::CreateWithOpener(
FrameTreeNode* opener) {
TRACE_EVENT0("browser", "WebContentsImpl::CreateWithOpener");
WebContentsImpl* new_contents = new WebContentsImpl(params.browser_context);
-
- FrameTreeNode* new_root = new_contents->GetFrameTree()->root();
-
- if (opener) {
- // For the "original opener", track the opener's main frame instead, because
- // if the opener is a subframe, the opener tracking could be easily bypassed
- // by spawning from a subframe and deleting the subframe.
- // https://crbug.com/705316
- new_root->SetOriginalOpener(opener->frame_tree()->root());
-
- if (!params.opener_suppressed) {
- new_root->SetOpener(opener);
- new_contents->created_with_opener_ = true;
- }
- }
+ new_contents->SetOpenerForNewContents(opener, params.opener_suppressed);
// If the opener is sandboxed, a new popup must inherit the opener's sandbox
// flags, and these flags take effect immediately. An exception is if the
// opener's sandbox flags lack the PropagatesToAuxiliaryBrowsingContexts
// bit (which is controlled by the "allow-popups-to-escape-sandbox" token).
// See https://html.spec.whatwg.org/#attr-iframe-sandbox.
+ FrameTreeNode* new_root = new_contents->GetFrameTree()->root();
if (opener) {
blink::WebSandboxFlags opener_flags = opener->effective_sandbox_flags();
const blink::WebSandboxFlags inherit_flag =
@@ -2207,10 +2200,11 @@ void WebContentsImpl::CreateNewWindow(
if (delegate_ &&
!delegate_->ShouldCreateWebContents(
- this, source_site_instance, render_view_route_id, main_frame_route_id,
- main_frame_widget_route_id, params.window_container_type,
- opener->GetLastCommittedURL(), params.frame_name, params.target_url,
- partition_id, session_storage_namespace)) {
+ this, opener, source_site_instance, render_view_route_id,
+ main_frame_route_id, main_frame_widget_route_id,
+ params.window_container_type, opener->GetLastCommittedURL(),
+ params.frame_name, params.target_url, partition_id,
+ session_storage_namespace)) {
// Note: even though we're not creating a WebContents here, it could have
// been created by the embedder so ensure that the RenderFrameHost is
// properly initialized.
@@ -3348,18 +3342,18 @@ bool WebContentsImpl::HasOpener() const {
return GetOpener() != NULL;
}
-WebContentsImpl* WebContentsImpl::GetOpener() const {
+RenderFrameHostImpl* WebContentsImpl::GetOpener() const {
FrameTreeNode* opener_ftn = frame_tree_.root()->opener();
- return opener_ftn ? FromFrameTreeNode(opener_ftn) : nullptr;
+ return opener_ftn ? opener_ftn->current_frame_host() : nullptr;
}
bool WebContentsImpl::HasOriginalOpener() const {
return GetOriginalOpener() != NULL;
}
-WebContents* WebContentsImpl::GetOriginalOpener() const {
+RenderFrameHostImpl* WebContentsImpl::GetOriginalOpener() const {
FrameTreeNode* opener_ftn = frame_tree_.root()->original_opener();
- return opener_ftn ? FromFrameTreeNode(opener_ftn) : nullptr;
+ return opener_ftn ? opener_ftn->current_frame_host() : nullptr;
}
void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
@@ -5608,4 +5602,22 @@ void WebContentsImpl::NotifyPreferencesChanged() {
render_view_host->OnWebkitPreferencesChanged();
}
+void WebContentsImpl::SetOpenerForNewContents(FrameTreeNode* opener,
+ bool opener_suppressed) {
+ if (opener) {
+ FrameTreeNode* new_root = GetFrameTree()->root();
+
+ // For the "original opener", track the opener's main frame instead, because
+ // if the opener is a subframe, the opener tracking could be easily bypassed
+ // by spawning from a subframe and deleting the subframe.
+ // https://crbug.com/705316
+ new_root->SetOriginalOpener(opener->frame_tree()->root());
+
+ if (!opener_suppressed) {
+ new_root->SetOpener(opener);
+ created_with_opener_ = true;
+ }
+ }
+}
+
} // namespace content
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/public/browser/web_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698