Index: chrome/browser/devtools/devtools_window.cc |
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc |
index 2b072dda8438e8fdd27bb41bed444137b268a3aa..9f1fc48a0d291911adbb45269330e4d1d443e177 100644 |
--- a/chrome/browser/devtools/devtools_window.cc |
+++ b/chrome/browser/devtools/devtools_window.cc |
@@ -363,13 +363,13 @@ content::WebContents* DevToolsWindow::GetInTabWebContents( |
DevToolsContentsResizingStrategy* out_strategy) { |
DevToolsWindow* window = GetInstanceForInspectedWebContents( |
inspected_web_contents); |
- if (!window) |
+ if (!window || window->life_stage_ == kClosing) |
return NULL; |
// Not yet loaded window is treated as docked, but we should not present it |
// until we decided on docking. |
- bool is_docked_set = window->load_state_ == kLoadCompleted || |
- window->load_state_ == kIsDockedSet; |
+ bool is_docked_set = window->life_stage_ == kLoadCompleted || |
+ window->life_stage_ == kIsDockedSet; |
if (!is_docked_set) |
return NULL; |
@@ -539,7 +539,7 @@ void DevToolsWindow::InspectElement(content::RenderViewHost* inspected_rvh, |
} |
void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { |
- if (load_state_ == kLoadCompleted) { |
+ if (life_stage_ == kLoadCompleted) { |
Show(action); |
return; |
} |
@@ -555,6 +555,9 @@ void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { |
} |
void DevToolsWindow::Show(const DevToolsToggleAction& action) { |
+ if (life_stage_ == kClosing) |
+ return; |
+ |
if (action.type() == DevToolsToggleAction::kNoOp) |
return; |
@@ -629,7 +632,7 @@ bool DevToolsWindow::InterceptPageBeforeUnload(WebContents* contents) { |
return false; |
// Not yet loaded frontend will not handle beforeunload. |
- if (window->load_state_ != kLoadCompleted) |
+ if (window->life_stage_ != kLoadCompleted) |
return false; |
window->intercepted_page_beforeunload_ = true; |
@@ -692,12 +695,12 @@ DevToolsWindow::DevToolsWindow(Profile* profile, |
// This initialization allows external front-end to work without changes. |
// We don't wait for docking call, but instead immediately show undocked. |
// Passing "dockSide=undocked" parameter ensures proper UI. |
- load_state_(can_dock ? kNotLoaded : kIsDockedSet), |
+ life_stage_(can_dock ? kNotLoaded : kIsDockedSet), |
action_on_load_(DevToolsToggleAction::NoOp()), |
ignore_set_is_docked_(false), |
intercepted_page_beforeunload_(false) { |
// Set up delegate, so we get fully-functional window immediately. |
- // It will not appear in UI though until |load_state_ == kLoadCompleted|. |
+ // It will not appear in UI though until |life_stage_ == kLoadCompleted|. |
main_web_contents_->SetDelegate(this); |
bindings_ = new DevToolsUIBindings( |
main_web_contents_, |
@@ -871,14 +874,7 @@ void DevToolsWindow::WebContentsCreated(WebContents* source_contents, |
void DevToolsWindow::CloseContents(WebContents* source) { |
CHECK(is_docked_); |
- // Do this first so that when GetDockedInstanceForInspectedTab is called |
- // from UpdateDevTools it won't return this instance |
- // see crbug.com/372504 |
- content::DevToolsManager::GetInstance()->ClientHostClosing( |
- bindings_->frontend_host()); |
- // This will prevent any activity after frontend is loaded. |
- action_on_load_ = DevToolsToggleAction::NoOp(); |
- ignore_set_is_docked_ = true; |
+ life_stage_ = kClosing; |
UpdateBrowserWindow(); |
// In case of docked main_web_contents_, we own it so delete here. |
// Embedding DevTools window will be deleted as a result of |
@@ -987,9 +983,7 @@ void DevToolsWindow::ActivateWindow() { |
void DevToolsWindow::CloseWindow() { |
DCHECK(is_docked_); |
- // This will prevent any activity after frontend is loaded. |
- action_on_load_ = DevToolsToggleAction::NoOp(); |
- ignore_set_is_docked_ = true; |
+ life_stage_ = kClosing; |
main_web_contents_->DispatchBeforeUnload(false); |
} |
@@ -1030,24 +1024,25 @@ void DevToolsWindow::MoveWindow(int x, int y) { |
void DevToolsWindow::SetIsDockedAndShowImmediatelyForTest(bool is_docked) { |
DCHECK(!is_docked || can_dock_); |
- if (load_state_ == kLoadCompleted) { |
+ DCHECK(life_stage_ != kClosing); |
+ if (life_stage_ == kLoadCompleted) { |
SetIsDocked(is_docked); |
} else { |
is_docked_ = is_docked; |
// Load is completed when both kIsDockedSet and kOnLoadFired happened. |
// Note that kIsDockedSet may be already set when can_dock_ is false. |
- load_state_ = load_state_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; |
+ life_stage_ = life_stage_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; |
// Note that action_on_load_ will be performed after the load is actually |
// completed. For now, just show the window. |
Show(DevToolsToggleAction::Show()); |
- if (load_state_ == kLoadCompleted) |
+ if (life_stage_ == kLoadCompleted) |
LoadCompleted(); |
} |
ignore_set_is_docked_ = true; |
} |
void DevToolsWindow::SetIsDocked(bool dock_requested) { |
- if (ignore_set_is_docked_) |
+ if (ignore_set_is_docked_ || life_stage_ == kClosing) |
return; |
DCHECK(can_dock_ || !dock_requested); |
@@ -1057,10 +1052,10 @@ void DevToolsWindow::SetIsDocked(bool dock_requested) { |
bool was_docked = is_docked_; |
is_docked_ = dock_requested; |
- if (load_state_ != kLoadCompleted) { |
+ if (life_stage_ != kLoadCompleted) { |
// This is a first time call we waited for to initialize. |
- load_state_ = load_state_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; |
- if (load_state_ == kLoadCompleted) |
+ life_stage_ = life_stage_ == kOnLoadFired ? kLoadCompleted : kIsDockedSet; |
+ if (life_stage_ == kLoadCompleted) |
LoadCompleted(); |
return; |
} |
@@ -1119,9 +1114,7 @@ void DevToolsWindow::SetWhitelistedShortcuts( |
void DevToolsWindow::InspectedContentsClosing() { |
intercepted_page_beforeunload_ = false; |
- // This will prevent any activity after frontend is loaded. |
- action_on_load_ = DevToolsToggleAction::NoOp(); |
- ignore_set_is_docked_ = true; |
+ life_stage_ = kClosing; |
main_web_contents_->GetRenderViewHost()->ClosePage(); |
} |
@@ -1152,13 +1145,16 @@ void DevToolsWindow::OnLoadCompleted() { |
} |
} |
+ if (life_stage_ == kClosing) |
+ return; |
+ |
// We could be in kLoadCompleted state already if frontend reloads itself. |
- if (load_state_ != kLoadCompleted) { |
+ if (life_stage_ != kLoadCompleted) { |
// Load is completed when both kIsDockedSet and kOnLoadFired happened. |
// Here we set kOnLoadFired. |
- load_state_ = load_state_ == kIsDockedSet ? kLoadCompleted : kOnLoadFired; |
+ life_stage_ = life_stage_ == kIsDockedSet ? kLoadCompleted : kOnLoadFired; |
} |
- if (load_state_ == kLoadCompleted) |
+ if (life_stage_ == kLoadCompleted) |
LoadCompleted(); |
} |
@@ -1257,7 +1253,7 @@ void DevToolsWindow::LoadCompleted() { |
} |
void DevToolsWindow::SetLoadCompletedCallback(const base::Closure& closure) { |
- if (load_state_ == kLoadCompleted) { |
+ if (life_stage_ == kLoadCompleted) { |
if (!closure.is_null()) |
closure.Run(); |
return; |