Simply the closing model.
authorCheng Zhao <zcbenz@gmail.com>
Wed, 1 May 2013 08:12:00 +0000 (16:12 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 1 May 2013 08:12:00 +0000 (16:12 +0800)
browser/native_window.cc
browser/native_window.h
browser/native_window_mac.h
browser/native_window_mac.mm

index 8640401..99f5b53 100644 (file)
@@ -39,9 +39,7 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
                            base::DictionaryValue* options)
     : content::WebContentsObserver(web_contents),
       inspectable_web_contents_(
-          brightray::InspectableWebContents::Create(web_contents)),
-      window_going_to_destroy_(false),
-      can_destroy_window_(false) {
+          brightray::InspectableWebContents::Create(web_contents)) {
   web_contents->SetDelegate(this);
 
   windows_.push_back(this);
@@ -135,26 +133,15 @@ void NativeWindow::CloseDevTools() {
   inspectable_web_contents()->GetView()->CloseDevTools();
 }
 
-void NativeWindow::RequestToDestroyWindow() {
-  if (window_going_to_destroy_)
-    return;
-
-  window_going_to_destroy_ = true;
-
+void NativeWindow::CloseWebContents() {
   content::WebContents* web_contents(GetWebContents());
 
-  web_contents->OnCloseStarted();
-
   if (web_contents->NeedToFireBeforeUnload())
     web_contents->GetRenderViewHost()->FirePageBeforeUnload(false);
   else
     web_contents->Close();
 }
 
-bool NativeWindow::CanClose() {
-  return !GetWebContents()->NeedToFireBeforeUnload() || can_destroy_window_;
-}
-
 content::WebContents* NativeWindow::GetWebContents() const {
   return inspectable_web_contents_->GetWebContents();
 }
@@ -184,24 +171,11 @@ content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager() {
   return dialog_manager_.get();
 }
 
-void NativeWindow::BeforeUnloadFired(content::WebContents* source,
-                                     bool proceed,
-                                     bool* proceed_to_fire_unload) {
-  *proceed_to_fire_unload = proceed;
-
-  if (proceed && window_going_to_destroy_) {
-    can_destroy_window_ = true;
-  } else {
-    window_going_to_destroy_ = false;
-    can_destroy_window_ = false;
-  }
-}
-
 void NativeWindow::CloseContents(content::WebContents* source) {
   // When the web contents is gone, close the window immediately, but the
-  // wrapper itself will not get destroyed until you call delete.
+  // memory will not be freed until you call delete.
   // In this way, it would be safe to manage windows via smart pointers.
-  Close();
+  CloseImmediately();
 }
 
 bool NativeWindow::OnMessageReceived(const IPC::Message& message) {
index 6b20e0d..c2ebf49 100644 (file)
@@ -62,6 +62,7 @@ class NativeWindow : public content::WebContentsDelegate,
   void InitFromOptions(base::DictionaryValue* options);
 
   virtual void Close() = 0;
+  virtual void CloseImmediately() = 0;
   virtual void Move(const gfx::Rect& pos) = 0;
   virtual void Focus(bool focus) = 0;
   virtual void Show() = 0;
@@ -94,13 +95,10 @@ class NativeWindow : public content::WebContentsDelegate,
   virtual void ShowDevTools();
   virtual void CloseDevTools();
 
-  // Close the web page in this window and then desctruct.
-  virtual void RequestToDestroyWindow();
-
-  // Used by platform dependent code to determine whether the window can be
-  // closed. A window can only be closed when the beforeunload handler
-  // doesn't prevent it.
-  bool CanClose();
+  // The same with closing a tab in a real browser.
+  //
+  // Should be called by platform code when user want to close the window.
+  virtual void CloseWebContents();
 
   content::WebContents* GetWebContents() const;
 
@@ -129,9 +127,6 @@ class NativeWindow : public content::WebContentsDelegate,
   virtual content::JavaScriptDialogManager*
       GetJavaScriptDialogManager() OVERRIDE;
   virtual void CloseContents(content::WebContents* source) OVERRIDE;
-  virtual void BeforeUnloadFired(content::WebContents* source,
-                                 bool proceed,
-                                 bool* proceed_to_fire_unload) OVERRIDE;
 
   // Implementations of content::WebContentsObserver.
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
@@ -163,7 +158,6 @@ class NativeWindow : public content::WebContentsDelegate,
   scoped_ptr<brightray::InspectableWebContents> inspectable_web_contents_;
 
   bool window_going_to_destroy_;
-  bool can_destroy_window_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeWindow);
 };
index 87f5d9e..99f7c29 100644 (file)
@@ -20,6 +20,7 @@ class NativeWindowMac : public NativeWindow {
 
   // NativeWindow implementation.
   virtual void Close() OVERRIDE;
+  virtual void CloseImmediately() OVERRIDE;
   virtual void Move(const gfx::Rect& pos) OVERRIDE;
   virtual void Focus(bool focus) OVERRIDE;
   virtual void Show() OVERRIDE;
index 83effce..0d490a6 100644 (file)
   return self;
 }
 
-- (BOOL)windowShouldClose:(id)window {
-  if (!shell_->CanClose()) {
-    shell_->RequestToDestroyWindow();
-    return NO;
-  }
-
-  [self release];
+- (void)windowWillClose:(NSNotification *)notification {
+  [self autorelease];
+}
 
-  return YES;
+- (BOOL)windowShouldClose:(id)window {
+  // When user tries to close the window by clicking the close button, we do
+  // not close the window immediately, instead we try to close the web page
+  // fisrt, and when the web page is closed the window will also be closed.
+  shell_->CloseWebContents();
+  return NO;
 }
 
 @end
@@ -121,6 +122,10 @@ void NativeWindowMac::Close() {
   [window() performClose:nil];
 }
 
+void NativeWindowMac::CloseImmediately() {
+  [window() close];
+}
+
 void NativeWindowMac::Move(const gfx::Rect& pos) {
   NSRect cocoa_bounds = NSMakeRect(pos.x(), 0,
                                    pos.width(),