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

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

Issue 371363005: [DevTools] Add explicit closing state in DevToolsWindow life time. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months 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
« no previous file with comments | « chrome/browser/devtools/devtools_window.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « chrome/browser/devtools/devtools_window.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698