Pass isGuest when creating WebContents
authorCheng Zhao <zcbenz@gmail.com>
Wed, 24 Jun 2015 15:29:32 +0000 (23:29 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 24 Jun 2015 15:29:32 +0000 (23:29 +0800)
atom/browser/api/atom_api_web_contents.cc
atom/browser/common_web_contents_delegate.cc
atom/browser/common_web_contents_delegate.h
atom/browser/lib/guest-view-manager.coffee
atom/browser/native_window.cc

index e5d31d7..a7877fa 100644 (file)
@@ -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() {
index aee5375..af42992 100644 (file)
@@ -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();
 }
index 006ca02..8c87548 100644 (file)
@@ -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();
index ea6be55..4385d38 100644 (file)
@@ -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.
index e635dae..4d85f7c 100644 (file)
@@ -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_);