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

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: revisiting naming & 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..4fa60227258fcb16ac282bdc9eab0e403c2e24c5 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -580,6 +580,72 @@ 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::NeedsToInterceptBeforeUnload(
+ 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::OnPageCloseCanceled(content::WebContents* contents) {
+ DevToolsWindow *window =
+ DevToolsWindow::GetInstanceForInspectedRenderViewHost(
+ contents->GetRenderViewHost());
+ if (!window)
+ return;
+ window->inspected_page_is_closing_ = 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 +658,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));
@@ -813,11 +880,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(

Powered by Google App Engine
This is Rietveld 408576698