From 081a4597e93e5b6bb5c7c2909fb63a98177fa0d6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 24 Jun 2015 23:29:32 +0800 Subject: [PATCH] Pass isGuest when creating WebContents --- atom/browser/api/atom_api_web_contents.cc | 47 ++++++++++++++++++---------- atom/browser/common_web_contents_delegate.cc | 14 +++++---- atom/browser/common_web_contents_delegate.h | 8 +++-- atom/browser/lib/guest-view-manager.coffee | 2 +- atom/browser/native_window.cc | 3 +- 5 files changed, 46 insertions(+), 28 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index e5d31d7..a7877fa 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -163,29 +163,42 @@ WebContents::WebContents(const mate::Dictionary& options) : guest_opaque_(true), guest_host_(nullptr), auto_size_enabled_(false), - is_full_page_plugin_(false), - type_(WEB_VIEW) { + is_full_page_plugin_(false) { + bool is_guest = false; + options.Get("isGuest", &is_guest); + + type_ = is_guest ? WEB_VIEW : BROWSER_WINDOW; + auto browser_context = AtomBrowserMainParts::Get()->browser_context(); - content::SiteInstance* site_instance = content::SiteInstance::CreateForURL( - browser_context, GURL("chrome-guest://fake-host")); - - content::WebContents::CreateParams params(browser_context, site_instance); - params.guest_delegate = this; - auto web_contents = content::WebContents::Create(params); - - NativeWindow* owner_window = nullptr; - WebContents* embedder = nullptr; - if (options.Get("embedder", &embedder) && embedder) { - auto relay = NativeWindowRelay::FromWebContents(embedder->web_contents()); - if (relay) - owner_window = relay->window.get(); + content::WebContents* web_contents; + if (is_guest) { + content::SiteInstance* site_instance = content::SiteInstance::CreateForURL( + browser_context, GURL("chrome-guest://fake-host")); + content::WebContents::CreateParams params(browser_context, site_instance); + params.guest_delegate = this; + web_contents = content::WebContents::Create(params); + } else { + content::WebContents::CreateParams params(browser_context); + web_contents = content::WebContents::Create(params); } + Observe(web_contents); AttachAsUserData(web_contents); - InitWithWebContents(web_contents, owner_window); + InitWithWebContents(web_contents); inspectable_web_contents_ = managed_web_contents(); - Observe(GetWebContents()); + if (is_guest) { + NativeWindow* owner_window = nullptr; + WebContents* embedder = nullptr; + if (options.Get("embedder", &embedder) && embedder) { + // New WebContents's owner_window is the embedder's owner_window. + auto relay = NativeWindowRelay::FromWebContents(embedder->web_contents()); + if (relay) + owner_window = relay->window.get(); + } + if (owner_window) + SetOwnerWindow(owner_window); + } } WebContents::~WebContents() { diff --git a/atom/browser/common_web_contents_delegate.cc b/atom/browser/common_web_contents_delegate.cc index aee5375..af42992 100644 --- a/atom/browser/common_web_contents_delegate.cc +++ b/atom/browser/common_web_contents_delegate.cc @@ -116,14 +116,9 @@ CommonWebContentsDelegate::~CommonWebContentsDelegate() { } void CommonWebContentsDelegate::InitWithWebContents( - content::WebContents* web_contents, - NativeWindow* owner_window) { - owner_window_ = owner_window->GetWeakPtr(); + content::WebContents* web_contents) { web_contents->SetDelegate(this); - NativeWindowRelay* relay = new NativeWindowRelay(owner_window_); - web_contents->SetUserData(relay->key, relay); - printing::PrintViewManagerBasic::CreateForWebContents(web_contents); printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents); @@ -132,6 +127,13 @@ void CommonWebContentsDelegate::InitWithWebContents( web_contents_->SetDelegate(this); } +void CommonWebContentsDelegate::SetOwnerWindow(NativeWindow* owner_window) { + content::WebContents* web_contents = GetWebContents(); + owner_window_ = owner_window->GetWeakPtr(); + NativeWindowRelay* relay = new NativeWindowRelay(owner_window_); + web_contents->SetUserData(relay->key, relay); +} + void CommonWebContentsDelegate::DestroyWebContents() { web_contents_.reset(); } diff --git a/atom/browser/common_web_contents_delegate.h b/atom/browser/common_web_contents_delegate.h index 006ca02..8c87548 100644 --- a/atom/browser/common_web_contents_delegate.h +++ b/atom/browser/common_web_contents_delegate.h @@ -26,10 +26,12 @@ class CommonWebContentsDelegate CommonWebContentsDelegate(); virtual ~CommonWebContentsDelegate(); - // Create a InspectableWebContents object and takes onwership of + // Creates a InspectableWebContents object and takes onwership of // |web_contents|. - void InitWithWebContents(content::WebContents* web_contents, - NativeWindow* owner_window); + void InitWithWebContents(content::WebContents* web_contents); + + // Set the window as owner window. + void SetOwnerWindow(NativeWindow* owner_window); // Destroy the managed InspectableWebContents object. void DestroyWebContents(); diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index ea6be55..4385d38 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -38,7 +38,7 @@ createGuest = (embedder, params) -> webViewManager ?= process.atomBinding 'web_view_manager' id = getNextInstanceId embedder - guest = webContents.create {embedder} + guest = webContents.create {isGuest: true, embedder} guestInstances[id] = {guest, embedder} # Destroy guest when the embedder is gone or navigated. diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index e635dae..4d85f7c 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -94,7 +94,8 @@ NativeWindow::NativeWindow(content::WebContents* web_contents, has_dialog_attached_(false), zoom_factor_(1.0), weak_factory_(this) { - InitWithWebContents(web_contents, this); + InitWithWebContents(web_contents); + SetOwnerWindow(this); options.Get(switches::kFrame, &has_frame_); options.Get(switches::kTransparent, &transparent_); -- 2.7.4