Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1122)

Unified Diff: chrome/browser/devtools/devtools_window.cc

Issue 23835007: DevTools: Do not close devtools if there are dirty files in workspace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressing final Jeremy's comments Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/devtools/devtools_window.cc
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index c94d9aaf0560d4606d8f256b93c2e062a99f0000..afc97d28120c0b53b8883bfba28f170313e79286 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -580,6 +580,77 @@ 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->intercepted_page_beforeunload_)
+ 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->intercepted_page_beforeunload_)
+ return false;
+
+ window->intercepted_page_beforeunload_ = true;
+ // Handle case of devtools inspecting another devtools instance by passing
+ // the call up to the inspecting devtools instance.
+ if (!DevToolsWindow::InterceptPageBeforeUnload(window->web_contents())) {
+ window->web_contents()->GetRenderViewHost()->FirePageBeforeUnload(false);
+ }
+ return true;
+}
+
+// static
+bool DevToolsWindow::NeedsToInterceptBeforeUnload(
+ content::WebContents* contents) {
+ DevToolsWindow* window =
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost(
+ contents->GetRenderViewHost());
+ return window && !window->intercepted_page_beforeunload_;
+}
+
+// static
+bool DevToolsWindow::HasFiredBeforeUnloadEventForDevToolsBrowser(
+ Browser* browser) {
+ DCHECK(browser->is_devtools());
+ // When FastUnloadController is used, devtools frontend will be detached
+ // from the browser window at this point which means we've already fired
+ // beforeunload.
+ 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->intercepted_page_beforeunload_;
+}
+
+// static
+void DevToolsWindow::OnPageCloseCanceled(content::WebContents* contents) {
+ DevToolsWindow *window =
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost(
+ contents->GetRenderViewHost());
+ if (!window)
+ return;
+ window->intercepted_page_beforeunload_ = false;
+ // Propagate to devtools opened on devtools if any.
+ DevToolsWindow::OnPageCloseCanceled(window->web_contents());
+}
+
+void DevToolsWindow::SetDockSideForTest(DevToolsDockSide dock_side) {
+ SetDockSide(SideToString(dock_side));
+}
+
DevToolsWindow::DevToolsWindow(Profile* profile,
const GURL& url,
content::RenderViewHost* inspected_rvh,
@@ -592,6 +663,7 @@ DevToolsWindow::DevToolsWindow(Profile* profile,
width_(-1),
height_(-1),
dock_side_before_minimized_(dock_side),
+ intercepted_page_beforeunload_(false),
weak_factory_(this) {
web_contents_ =
content::WebContents::Create(content::WebContents::CreateParams(profile));
@@ -813,11 +885,26 @@ 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 (!intercepted_page_beforeunload_) {
+ // Docked devtools window closed directly.
+ if (proceed) {
+ content::DevToolsManager::GetInstance()->ClientHostClosing(
+ frontend_host_.get());
+ }
+ *proceed_to_fire_unload = proceed;
+ } else {
+ // Inspected page is attempting to close.
+ 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(

Powered by Google App Engine
This is Rietveld 408576698