Index: chrome/browser/devtools/devtools_window.cc |
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc |
index 0b757d9a09701d0ee939a68ae9ea9a2aae067fe9..2bbf2fe4615e104fdef480fa6c171c722bc7478b 100644 |
--- a/chrome/browser/devtools/devtools_window.cc |
+++ b/chrome/browser/devtools/devtools_window.cc |
@@ -566,6 +566,71 @@ void DevToolsWindow::Show(const DevToolsToggleAction& action) { |
ScheduleAction(action); |
} |
+// static |
+bool DevToolsWindow::HandleBeforeUnload(content::WebContents* frontend_contents, |
+ bool proceed, bool* proceed_to_fire_unload) { |
+ DevToolsWindow* window = AsDevToolsWindow( |
+ frontend_contents->GetRenderViewHost()); |
+ DCHECK(window); |
+ if (!window->inspected_page_is_closing_) |
+ return false; |
+ window->BeforeUnloadFired(frontend_contents, proceed, |
+ proceed_to_fire_unload); |
+ return true; |
+} |
+ |
+// static |
+bool DevToolsWindow::InterceptPageBeforeUnload(content::WebContents* contents) { |
+ DevToolsWindow* window = |
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost( |
+ contents->GetRenderViewHost()); |
+ if (!window || window->inspected_page_is_closing_) |
+ return false; |
+ |
+ window->inspected_page_is_closing_ = true; |
+ // Handling devtools on devtools case |
+ if (!DevToolsWindow::InterceptPageBeforeUnload(window->web_contents())) { |
+ window->web_contents()->GetRenderViewHost()->FirePageBeforeUnload(false); |
+ } |
+ return true; |
+} |
+ |
+// static |
+bool DevToolsWindow::NeedToFireBeforeUnload(content::WebContents* contents) { |
+ DevToolsWindow* window = |
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost( |
+ contents->GetRenderViewHost()); |
+ return window && !window->inspected_page_is_closing_; |
+} |
+ |
+// static |
+bool DevToolsWindow::ShouldCloseDevToolsBrowser(Browser* browser) { |
+ DCHECK(browser->is_devtools()); |
+ if (browser->tab_strip_model()->empty()) |
+ return true; |
+ content::WebContents* contents = |
+ browser->tab_strip_model()->GetWebContentsAt(0); |
+ DevToolsWindow* window = AsDevToolsWindow(contents->GetRenderViewHost()); |
+ DCHECK(window); |
+ return window->inspected_page_is_closing_; |
+} |
+ |
+// static |
+void DevToolsWindow::PageCancelClose(content::WebContents* contents) { |
vsevik
2013/11/05 12:23:30
PageClosingCanceled
|
+ DevToolsWindow *window = |
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost( |
+ contents->GetRenderViewHost()); |
+ if (!window) |
+ return; |
+ window->inspected_page_is_closing_ = false; |
+ // Propagate to DevTools opened on DevTools if any |
+ DevToolsWindow::PageCancelClose(window->web_contents()); |
+} |
+ |
+void DevToolsWindow::SetDockSideForTest(DevToolsDockSide dock_side) { |
+ SetDockSide(SideToString(dock_side)); |
+} |
+ |
DevToolsWindow::DevToolsWindow(Profile* profile, |
const GURL& url, |
content::RenderViewHost* inspected_rvh, |
@@ -578,6 +643,7 @@ DevToolsWindow::DevToolsWindow(Profile* profile, |
width_(-1), |
height_(-1), |
dock_side_before_minimized_(dock_side), |
+ inspected_page_is_closing_(false), |
weak_factory_(this) { |
web_contents_ = |
content::WebContents::Create(content::WebContents::CreateParams(profile)); |
@@ -815,11 +881,24 @@ void DevToolsWindow::CloseContents(content::WebContents* source) { |
void DevToolsWindow::BeforeUnloadFired(content::WebContents* tab, |
bool proceed, |
bool* proceed_to_fire_unload) { |
- if (proceed) { |
- content::DevToolsManager::GetInstance()->ClientHostClosing( |
- frontend_host_.get()); |
+ if (!inspected_page_is_closing_) { |
+ if (proceed) { |
+ content::DevToolsManager::GetInstance()->ClientHostClosing( |
+ frontend_host_.get()); |
+ } |
+ *proceed_to_fire_unload = proceed; |
+ } else { |
+ content::WebContents* inspected_web_contents = GetInspectedWebContents(); |
+ if (proceed) { |
+ inspected_web_contents->GetRenderViewHost()->FirePageBeforeUnload(false); |
+ } else { |
+ bool should_proceed; |
+ inspected_web_contents->GetDelegate()->BeforeUnloadFired( |
+ inspected_web_contents, false, &should_proceed); |
+ DCHECK(!should_proceed); |
+ } |
+ *proceed_to_fire_unload = false; |
} |
- *proceed_to_fire_unload = proceed; |
} |
bool DevToolsWindow::PreHandleKeyboardEvent( |