Store the devtools window in weak pointer.
authorCheng Zhao <zcbenz@gmail.com>
Tue, 4 Mar 2014 10:42:37 +0000 (18:42 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Tue, 4 Mar 2014 10:42:37 +0000 (18:42 +0800)
browser/native_window.cc
browser/native_window.h

index e16c45f..b3e492d 100644 (file)
@@ -181,8 +181,10 @@ bool NativeWindow::HasModalDialog() {
 }
 
 void NativeWindow::OpenDevTools() {
-  // For docked devtools we give it to brightray.
-  inspectable_web_contents()->ShowDevTools();
+  if (devtools_window_)
+    devtools_window_->Focus(true);
+  else
+    inspectable_web_contents()->ShowDevTools();
 }
 
 void NativeWindow::CloseDevTools() {
@@ -472,11 +474,17 @@ void NativeWindow::Observe(int type,
 
 bool NativeWindow::DevToolsSetDockSide(const std::string& dock_side,
                                        bool* succeed) {
-  if (dock_side != "undocked")
+  if (dock_side != "undocked") {
+    //  Switch to docked mode.
+    if (devtools_window_) {
+      devtools_window_->Close();
+      devtools_window_.reset();
+    }
     return false;
+  }
 
   CloseDevTools();
-  Debug(GetWebContents());
+  devtools_window_ = Debug(GetWebContents())->GetWeakPtr();
   return true;
 }
 
@@ -484,7 +492,7 @@ bool NativeWindow::DevToolsShow(const std::string& dock_side) {
   if (dock_side != "undocked")
     return false;
 
-  Debug(GetWebContents());
+  devtools_window_ = Debug(GetWebContents())->GetWeakPtr();
   return true;
 }
 
index 1b3b38d..8a0c1cc 100644 (file)
@@ -153,6 +153,10 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
   // Should be called by platform code when user want to close the window.
   virtual void CloseWebContents();
 
+  base::WeakPtr<NativeWindow> GetWeakPtr() {
+    return weak_factory_.GetWeakPtr();
+  }
+
   content::WebContents* GetWebContents() const;
   content::WebContents* GetDevToolsWebContents() const;
 
@@ -267,6 +271,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
 
   base::WeakPtrFactory<NativeWindow> weak_factory_;
 
+  base::WeakPtr<NativeWindow> devtools_window_;
+
   scoped_ptr<DevToolsDelegate> devtools_delegate_;
   scoped_ptr<AtomJavaScriptDialogManager> dialog_manager_;
   scoped_ptr<brightray::InspectableWebContents> inspectable_web_contents_;