| Index: chrome/browser/devtools/devtools_window.cc
|
| diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
|
| index a055ca668c6363110359ced2e62a68f491663018..e765988795d2fac970e8bcfd6b416e8ca7a62b96 100644
|
| --- a/chrome/browser/devtools/devtools_window.cc
|
| +++ b/chrome/browser/devtools/devtools_window.cc
|
| @@ -3,7 +3,6 @@
|
| // found in the LICENSE file.
|
|
|
| #include "chrome/browser/devtools/devtools_window.h"
|
| -
|
| #include <algorithm>
|
|
|
| #include "base/command_line.h"
|
| @@ -228,14 +227,8 @@ typedef std::vector<DevToolsWindow*> DevToolsWindows;
|
| base::LazyInstance<DevToolsWindows>::Leaky g_instances =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| -const char kPrefBottom[] = "dock_bottom";
|
| -const char kPrefRight[] = "dock_right";
|
| -const char kPrefUndocked[] = "undocked";
|
| -
|
| -const char kDockSideBottom[] = "bottom";
|
| -const char kDockSideRight[] = "right";
|
| +// TODO(dgozman): remove after switching to SetIsDocked.
|
| const char kDockSideUndocked[] = "undocked";
|
| -const char kDockSideMinimized[] = "minimized";
|
|
|
| static const char kFrontendHostId[] = "id";
|
| static const char kFrontendHostMethod[] = "method";
|
| @@ -290,12 +283,6 @@ std::string DevToolsWindow::GetDevToolsWindowPlacementPrefKey() {
|
| // static
|
| void DevToolsWindow::RegisterProfilePrefs(
|
| user_prefs::PrefRegistrySyncable* registry) {
|
| - registry->RegisterBooleanPref(
|
| - prefs::kDevToolsOpenDocked, true,
|
| - user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
|
| - registry->RegisterStringPref(
|
| - prefs::kDevToolsDockSide, kDockSideBottom,
|
| - user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
|
| registry->RegisterDictionaryPref(
|
| prefs::kDevToolsEditedFiles,
|
| user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
|
| @@ -332,7 +319,13 @@ DevToolsWindow* DevToolsWindow::GetDockedInstanceForInspectedTab(
|
| content::WebContents* inspected_web_contents) {
|
| DevToolsWindow* window = GetInstanceForInspectedRenderViewHost(
|
| inspected_web_contents->GetRenderViewHost());
|
| - return (window && window->IsDocked()) ? window : NULL;
|
| + if (!window)
|
| + 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;
|
| + return window->is_docked_ && is_docked_set ? window : NULL;
|
| }
|
|
|
| // static
|
| @@ -362,7 +355,7 @@ DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker(
|
| content::DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
|
| worker_agent, window->frontend_host_.get());
|
| }
|
| - window->Show(DevToolsToggleAction::Show());
|
| + window->ScheduleShow(DevToolsToggleAction::Show());
|
| return window;
|
| }
|
|
|
| @@ -370,8 +363,7 @@ DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker(
|
| DevToolsWindow* DevToolsWindow::CreateDevToolsWindowForWorker(
|
| Profile* profile) {
|
| content::RecordAction(base::UserMetricsAction("DevTools_InspectWorker"));
|
| - return Create(profile, GURL(), NULL, DEVTOOLS_DOCK_SIDE_UNDOCKED, true,
|
| - false, false);
|
| + return Create(profile, GURL(), NULL, true, false, false);
|
| }
|
|
|
| // static
|
| @@ -382,6 +374,32 @@ DevToolsWindow* DevToolsWindow::OpenDevToolsWindow(
|
| }
|
|
|
| // static
|
| +DevToolsWindow* DevToolsWindow::OpenDevToolsWindow(
|
| + content::RenderViewHost* inspected_rvh,
|
| + const DevToolsToggleAction& action) {
|
| + return ToggleDevToolsWindow(
|
| + inspected_rvh, true, action);
|
| +}
|
| +
|
| +// static
|
| +DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForTest(
|
| + content::RenderViewHost* inspected_rvh,
|
| + bool is_docked) {
|
| + DevToolsWindow* window = OpenDevToolsWindow(inspected_rvh);
|
| + window->SetIsDockedAndShowImmediatelyForTest(is_docked);
|
| + return window;
|
| +}
|
| +
|
| +// static
|
| +DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForTest(
|
| + Browser* browser,
|
| + bool is_docked) {
|
| + return OpenDevToolsWindowForTest(
|
| + browser->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(),
|
| + is_docked);
|
| +}
|
| +
|
| +// static
|
| DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow(
|
| Browser* browser,
|
| const DevToolsToggleAction& action) {
|
| @@ -404,11 +422,11 @@ void DevToolsWindow::OpenExternalFrontend(
|
| DevToolsWindow* window = FindDevToolsWindow(agent_host);
|
| if (!window) {
|
| window = Create(profile, DevToolsUI::GetProxyURL(frontend_url), NULL,
|
| - DEVTOOLS_DOCK_SIDE_UNDOCKED, false, true, false);
|
| + false, true, false);
|
| content::DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
|
| agent_host, window->frontend_host_.get());
|
| }
|
| - window->Show(DevToolsToggleAction::Show());
|
| + window->ScheduleShow(DevToolsToggleAction::Show());
|
| }
|
|
|
| // static
|
| @@ -424,11 +442,9 @@ DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow(
|
| if (!window) {
|
| Profile* profile = Profile::FromBrowserContext(
|
| inspected_rvh->GetProcess()->GetBrowserContext());
|
| - DevToolsDockSide dock_side = GetDockSideFromPrefs(profile);
|
| content::RecordAction(
|
| base::UserMetricsAction("DevTools_InspectRenderer"));
|
| - window = Create(profile, GURL(), inspected_rvh, dock_side, false, false,
|
| - true);
|
| + window = Create(profile, GURL(), inspected_rvh, false, false, true);
|
| manager->RegisterDevToolsClientHostFor(agent.get(),
|
| window->frontend_host_.get());
|
| do_open = true;
|
| @@ -438,11 +454,9 @@ DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow(
|
| window->UpdateBrowserToolbar();
|
|
|
| // If window is docked and visible, we hide it on toggle. If window is
|
| - // undocked, we show (activate) it. If window is minimized, we maximize it.
|
| - if (window->dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED)
|
| - window->Restore();
|
| - else if (!window->IsDocked() || do_open)
|
| - window->Show(action);
|
| + // undocked, we show (activate) it.
|
| + if (!window->is_docked_ || do_open)
|
| + window->ScheduleShow(action);
|
| else
|
| window->CloseWindow();
|
|
|
| @@ -469,6 +483,8 @@ int DevToolsWindow::GetMinimizedHeight() {
|
|
|
| void DevToolsWindow::InspectedContentsClosing() {
|
| intercepted_page_beforeunload_ = false;
|
| + // This will prevent any activity after frontend is loaded.
|
| + action_on_load_ = DevToolsToggleAction::NoOp();
|
| web_contents_->GetRenderViewHost()->ClosePage();
|
| }
|
|
|
| @@ -476,10 +492,6 @@ content::RenderViewHost* DevToolsWindow::GetRenderViewHost() {
|
| return web_contents_->GetRenderViewHost();
|
| }
|
|
|
| -content::DevToolsClientHost* DevToolsWindow::GetDevToolsClientHostForTest() {
|
| - return frontend_host_.get();
|
| -}
|
| -
|
| gfx::Insets DevToolsWindow::GetContentsInsets() const {
|
| return contents_insets_;
|
| }
|
| @@ -489,30 +501,50 @@ gfx::Size DevToolsWindow::GetMinimumSize() const {
|
| return kMinDevToolsSize;
|
| }
|
|
|
| +void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) {
|
| + if (load_state_ == kLoadCompleted) {
|
| + Show(action);
|
| + return;
|
| + }
|
| +
|
| + // Action will be done only after load completed.
|
| + action_on_load_ = action;
|
| +
|
| + if (!can_dock_) {
|
| + // No harm to show always-undocked window right away.
|
| + is_docked_ = false;
|
| + Show(DevToolsToggleAction::Show());
|
| + }
|
| +}
|
| +
|
| void DevToolsWindow::Show(const DevToolsToggleAction& action) {
|
| - if (IsDocked()) {
|
| + if (action.type() == DevToolsToggleAction::kNoOp)
|
| + return;
|
| +
|
| + if (is_docked_) {
|
| + DCHECK(can_dock_);
|
| Browser* inspected_browser = NULL;
|
| int inspected_tab_index = -1;
|
| + FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
|
| + &inspected_browser,
|
| + &inspected_tab_index);
|
| + DCHECK(inspected_browser);
|
| + DCHECK(inspected_tab_index != -1);
|
| +
|
| // Tell inspected browser to update splitter and switch to inspected panel.
|
| - if (!IsInspectedBrowserPopup() &&
|
| - FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
|
| - &inspected_browser,
|
| - &inspected_tab_index)) {
|
| - BrowserWindow* inspected_window = inspected_browser->window();
|
| - web_contents_->SetDelegate(this);
|
| - inspected_window->UpdateDevTools();
|
| - web_contents_->GetView()->SetInitialFocus();
|
| - inspected_window->Show();
|
| - TabStripModel* tab_strip_model = inspected_browser->tab_strip_model();
|
| - tab_strip_model->ActivateTabAt(inspected_tab_index, true);
|
| - PrefsTabHelper::CreateForWebContents(web_contents_);
|
| - GetRenderViewHost()->SyncRendererPrefs();
|
| - ScheduleAction(action);
|
| - return;
|
| - }
|
| + BrowserWindow* inspected_window = inspected_browser->window();
|
| + web_contents_->SetDelegate(this);
|
| + inspected_window->UpdateDevTools();
|
| + web_contents_->GetView()->SetInitialFocus();
|
| + inspected_window->Show();
|
| +
|
| + TabStripModel* tab_strip_model = inspected_browser->tab_strip_model();
|
| + tab_strip_model->ActivateTabAt(inspected_tab_index, true);
|
| + PrefsTabHelper::CreateForWebContents(web_contents_);
|
| + GetRenderViewHost()->SyncRendererPrefs();
|
|
|
| - // Sometimes we don't know where to dock. Stay undocked.
|
| - dock_side_ = DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| + DoAction(action);
|
| + return;
|
| }
|
|
|
| // Avoid consecutive window switching if the devtools window has been opened
|
| @@ -528,7 +560,7 @@ void DevToolsWindow::Show(const DevToolsToggleAction& action) {
|
| web_contents_->GetView()->SetInitialFocus();
|
| }
|
|
|
| - ScheduleAction(action);
|
| + DoAction(action);
|
| }
|
|
|
| // static
|
| @@ -553,6 +585,10 @@ bool DevToolsWindow::InterceptPageBeforeUnload(content::WebContents* contents) {
|
| if (!window || window->intercepted_page_beforeunload_)
|
| return false;
|
|
|
| + // Not yet loaded frontend will not handle beforeunload.
|
| + if (window->load_state_ != kLoadCompleted)
|
| + 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.
|
| @@ -600,26 +636,30 @@ void DevToolsWindow::OnPageCloseCanceled(content::WebContents* contents) {
|
| 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,
|
| - DevToolsDockSide dock_side)
|
| + bool can_dock)
|
| : profile_(profile),
|
| browser_(NULL),
|
| - dock_side_(dock_side),
|
| - is_loaded_(false),
|
| - action_on_load_(DevToolsToggleAction::Show()),
|
| - dock_side_before_minimized_(dock_side),
|
| + is_docked_(true),
|
| + can_dock_(can_dock),
|
| + // 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),
|
| + action_on_load_(DevToolsToggleAction::NoOp()),
|
| + ignore_set_is_docked_for_test_(false),
|
| intercepted_page_beforeunload_(false),
|
| weak_factory_(this) {
|
| web_contents_ =
|
| content::WebContents::Create(content::WebContents::CreateParams(profile));
|
| frontend_contents_observer_.reset(new FrontendWebContentsObserver(this));
|
|
|
| + // Set up delegate, so we get fully-functional window immediately.
|
| + // It will not appear in UI though until |load_state_ == kLoadCompleted|.
|
| + web_contents_->SetDelegate(this);
|
| +
|
| web_contents_->GetController().LoadURL(url, content::Referrer(),
|
| content::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string());
|
|
|
| @@ -657,7 +697,6 @@ DevToolsWindow* DevToolsWindow::Create(
|
| Profile* profile,
|
| const GURL& frontend_url,
|
| content::RenderViewHost* inspected_rvh,
|
| - DevToolsDockSide dock_side,
|
| bool shared_worker_frontend,
|
| bool external_frontend,
|
| bool can_dock) {
|
| @@ -675,17 +714,16 @@ DevToolsWindow* DevToolsWindow::Create(
|
| }
|
|
|
| // Create WebContents with devtools.
|
| - GURL url(GetDevToolsURL(profile, frontend_url, dock_side,
|
| + GURL url(GetDevToolsURL(profile, frontend_url,
|
| shared_worker_frontend,
|
| external_frontend,
|
| can_dock));
|
| - return new DevToolsWindow(profile, url, inspected_rvh, dock_side);
|
| + return new DevToolsWindow(profile, url, inspected_rvh, can_dock);
|
| }
|
|
|
| // static
|
| GURL DevToolsWindow::GetDevToolsURL(Profile* profile,
|
| const GURL& base_url,
|
| - DevToolsDockSide dock_side,
|
| bool shared_worker_frontend,
|
| bool external_frontend,
|
| bool can_dock) {
|
| @@ -699,7 +737,7 @@ GURL DevToolsWindow::GetDevToolsURL(Profile* profile,
|
| std::string url_string(
|
| frontend_url +
|
| ((frontend_url.find("?") == std::string::npos) ? "?" : "&") +
|
| - "dockSide=" + SideToString(dock_side) +
|
| + "dockSide=undocked" + // TODO(dgozman): remove this support in M38.
|
| "&toolbarColor=" +
|
| SkColorToRGBAString(tp->GetColor(ThemeProperties::COLOR_TOOLBAR)) +
|
| "&textColor=" +
|
| @@ -745,49 +783,10 @@ DevToolsWindow* DevToolsWindow::AsDevToolsWindow(
|
| return NULL;
|
| }
|
|
|
| +// TODO(dgozman): remove after switch to SetIsDocked.
|
| // static
|
| -DevToolsDockSide DevToolsWindow::GetDockSideFromPrefs(Profile* profile) {
|
| - std::string dock_side =
|
| - profile->GetPrefs()->GetString(prefs::kDevToolsDockSide);
|
| -
|
| - // Migrate prefs.
|
| - const char kOldPrefBottom[] = "bottom";
|
| - const char kOldPrefRight[] = "right";
|
| - if ((dock_side == kOldPrefBottom) || (dock_side == kOldPrefRight)) {
|
| - if (!profile->GetPrefs()->GetBoolean(prefs::kDevToolsOpenDocked))
|
| - return DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| - return (dock_side == kOldPrefBottom) ?
|
| - DEVTOOLS_DOCK_SIDE_BOTTOM : DEVTOOLS_DOCK_SIDE_RIGHT;
|
| - }
|
| -
|
| - if (dock_side == kPrefUndocked)
|
| - return DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| - if (dock_side == kPrefRight)
|
| - return DEVTOOLS_DOCK_SIDE_RIGHT;
|
| - // Default to docked to bottom.
|
| - return DEVTOOLS_DOCK_SIDE_BOTTOM;
|
| -}
|
| -
|
| -// static
|
| -std::string DevToolsWindow::SideToString(DevToolsDockSide dock_side) {
|
| - switch (dock_side) {
|
| - case DEVTOOLS_DOCK_SIDE_UNDOCKED: return kDockSideUndocked;
|
| - case DEVTOOLS_DOCK_SIDE_RIGHT: return kDockSideRight;
|
| - case DEVTOOLS_DOCK_SIDE_BOTTOM: return kDockSideBottom;
|
| - case DEVTOOLS_DOCK_SIDE_MINIMIZED: return kDockSideMinimized;
|
| - default: return kDockSideUndocked;
|
| - }
|
| -}
|
| -
|
| -// static
|
| -DevToolsDockSide DevToolsWindow::SideFromString(
|
| - const std::string& dock_side) {
|
| - if (dock_side == kDockSideRight)
|
| - return DEVTOOLS_DOCK_SIDE_RIGHT;
|
| - if (dock_side == kDockSideBottom)
|
| - return DEVTOOLS_DOCK_SIDE_BOTTOM;
|
| - return (dock_side == kDockSideMinimized) ?
|
| - DEVTOOLS_DOCK_SIDE_MINIMIZED : DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| +bool DevToolsWindow::IsDockedFromString(const std::string& dock_side) {
|
| + return dock_side != kDockSideUndocked;
|
| }
|
|
|
| void DevToolsWindow::Observe(int type,
|
| @@ -840,7 +839,9 @@ void DevToolsWindow::AddNewContents(content::WebContents* source,
|
| }
|
|
|
| void DevToolsWindow::CloseContents(content::WebContents* source) {
|
| - CHECK(IsDocked());
|
| + CHECK(is_docked_);
|
| + // This will prevent any activity after frontend is loaded.
|
| + action_on_load_ = DevToolsToggleAction::NoOp();
|
| // Update dev tools to reflect removed dev tools window.
|
| BrowserWindow* inspected_window = GetInspectedBrowserWindow();
|
| if (inspected_window)
|
| @@ -880,7 +881,7 @@ bool DevToolsWindow::PreHandleKeyboardEvent(
|
| content::WebContents* source,
|
| const content::NativeWebKeyboardEvent& event,
|
| bool* is_keyboard_shortcut) {
|
| - if (IsDocked()) {
|
| + if (is_docked_) {
|
| BrowserWindow* inspected_window = GetInspectedBrowserWindow();
|
| if (inspected_window) {
|
| return inspected_window->PreHandleKeyboardEvent(event,
|
| @@ -893,7 +894,7 @@ bool DevToolsWindow::PreHandleKeyboardEvent(
|
| void DevToolsWindow::HandleKeyboardEvent(
|
| content::WebContents* source,
|
| const content::NativeWebKeyboardEvent& event) {
|
| - if (IsDocked()) {
|
| + if (is_docked_) {
|
| if (event.windowsKeyCode == 0x08) {
|
| // Do not navigate back in history on Windows (http://crbug.com/74156).
|
| return;
|
| @@ -926,7 +927,7 @@ void DevToolsWindow::RunFileChooser(content::WebContents* web_contents,
|
| void DevToolsWindow::WebContentsFocused(content::WebContents* contents) {
|
| Browser* inspected_browser = NULL;
|
| int inspected_tab_index = -1;
|
| - if (IsDocked() && FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
|
| + if (is_docked_ && FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
|
| &inspected_browser,
|
| &inspected_tab_index))
|
| inspected_browser->window()->WebContentsFocused(contents);
|
| @@ -961,14 +962,14 @@ void DevToolsWindow::DispatchOnEmbedder(const std::string& message) {
|
| }
|
|
|
| void DevToolsWindow::ActivateWindow() {
|
| - if (IsDocked() && GetInspectedBrowserWindow())
|
| + if (is_docked_ && GetInspectedBrowserWindow())
|
| web_contents_->GetView()->Focus();
|
| - else if (!IsDocked() && !browser_->window()->IsActive())
|
| + else if (!is_docked_ && !browser_->window()->IsActive())
|
| browser_->window()->Activate();
|
| }
|
|
|
| void DevToolsWindow::ActivateContents(content::WebContents* contents) {
|
| - if (IsDocked()) {
|
| + if (is_docked_) {
|
| content::WebContents* inspected_tab = this->GetInspectedWebContents();
|
| inspected_tab->GetDelegate()->ActivateContents(inspected_tab);
|
| } else {
|
| @@ -977,7 +978,9 @@ void DevToolsWindow::ActivateContents(content::WebContents* contents) {
|
| }
|
|
|
| void DevToolsWindow::CloseWindow() {
|
| - DCHECK(IsDocked());
|
| + DCHECK(is_docked_);
|
| + // This will prevent any activity after frontend is loaded.
|
| + action_on_load_ = DevToolsToggleAction::NoOp();
|
| web_contents_->GetRenderViewHost()->FirePageBeforeUnload(false);
|
| }
|
|
|
| @@ -991,7 +994,7 @@ void DevToolsWindow::SetContentsInsets(
|
| }
|
|
|
| contents_insets_ = gfx::Insets(top, left, bottom, right);
|
| - if (IsDocked()) {
|
| + if (is_docked_) {
|
| // Update inspected window.
|
| BrowserWindow* inspected_window = GetInspectedBrowserWindow();
|
| if (inspected_window)
|
| @@ -1000,63 +1003,70 @@ void DevToolsWindow::SetContentsInsets(
|
| }
|
|
|
| void DevToolsWindow::MoveWindow(int x, int y) {
|
| - if (!IsDocked()) {
|
| + if (!is_docked_) {
|
| gfx::Rect bounds = browser_->window()->GetBounds();
|
| bounds.Offset(x, y);
|
| browser_->window()->SetBounds(bounds);
|
| }
|
| }
|
|
|
| +void DevToolsWindow::SetIsDockedAndShowImmediatelyForTest(bool is_docked) {
|
| + DCHECK(!is_docked || can_dock_);
|
| + if (load_state_ == kLoadCompleted) {
|
| + SetIsDocked(is_docked);
|
| + } else {
|
| + is_docked_ = is_docked;
|
| + load_state_ = load_state_ == kNotLoaded ? kIsDockedSet : kLoadCompleted;
|
| + // 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)
|
| + LoadCompleted();
|
| + }
|
| + ignore_set_is_docked_for_test_ = true;
|
| +}
|
| +
|
| void DevToolsWindow::SetDockSide(const std::string& side) {
|
| - DevToolsDockSide requested_side = SideFromString(side);
|
| - bool dock_requested = requested_side != DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| - bool is_docked = IsDocked();
|
| -
|
| - if (dock_requested &&
|
| - (!GetInspectedWebContents() || !GetInspectedBrowserWindow() ||
|
| - IsInspectedBrowserPopup())) {
|
| - // Cannot dock, avoid window flashing due to close-reopen cycle.
|
| + // TODO(dgozman): remove this method after frontend switches to SetIsDocked.
|
| + SetIsDocked(IsDockedFromString(side));
|
| +}
|
| +
|
| +void DevToolsWindow::SetIsDocked(bool dock_requested) {
|
| + if (ignore_set_is_docked_for_test_)
|
| + return;
|
| +
|
| + DCHECK(can_dock_ || !dock_requested);
|
| + if (!can_dock_)
|
| + dock_requested = false;
|
| +
|
| + bool was_docked = is_docked_;
|
| + is_docked_ = dock_requested;
|
| +
|
| + if (load_state_ != kLoadCompleted) {
|
| + // This is a first time call we waited for to initialize.
|
| + load_state_ = load_state_ == kNotLoaded ? kIsDockedSet : kLoadCompleted;
|
| + if (load_state_ == kLoadCompleted)
|
| + LoadCompleted();
|
| return;
|
| }
|
|
|
| - if ((dock_side_ != DEVTOOLS_DOCK_SIDE_MINIMIZED) &&
|
| - (requested_side == DEVTOOLS_DOCK_SIDE_MINIMIZED))
|
| - dock_side_before_minimized_ = dock_side_;
|
| + if (dock_requested == was_docked)
|
| + return;
|
|
|
| - dock_side_ = requested_side;
|
| - if (dock_requested && !is_docked) {
|
| + if (dock_requested && !was_docked) {
|
| // Detach window from the external devtools browser. It will lead to
|
| // the browser object's close and delete. Remove observer first.
|
| TabStripModel* tab_strip_model = browser_->tab_strip_model();
|
| tab_strip_model->DetachWebContentsAt(
|
| tab_strip_model->GetIndexOfWebContents(web_contents_));
|
| browser_ = NULL;
|
| - } else if (!dock_requested && is_docked) {
|
| + } else if (!dock_requested && was_docked) {
|
| // Update inspected window to hide split and reset it.
|
| BrowserWindow* inspected_window = GetInspectedBrowserWindow();
|
| if (inspected_window)
|
| inspected_window->UpdateDevTools();
|
| }
|
|
|
| - if (dock_side_ != DEVTOOLS_DOCK_SIDE_MINIMIZED) {
|
| - std::string pref_value = kPrefBottom;
|
| - switch (dock_side_) {
|
| - case DEVTOOLS_DOCK_SIDE_UNDOCKED:
|
| - pref_value = kPrefUndocked;
|
| - break;
|
| - case DEVTOOLS_DOCK_SIDE_RIGHT:
|
| - pref_value = kPrefRight;
|
| - break;
|
| - case DEVTOOLS_DOCK_SIDE_BOTTOM:
|
| - pref_value = kPrefBottom;
|
| - break;
|
| - case DEVTOOLS_DOCK_SIDE_MINIMIZED:
|
| - // We don't persist minimized state.
|
| - break;
|
| - }
|
| - profile_->GetPrefs()->SetString(prefs::kDevToolsDockSide, pref_value);
|
| - }
|
| -
|
| Show(DevToolsToggleAction::Show());
|
| }
|
|
|
| @@ -1282,7 +1292,7 @@ void DevToolsWindow::ShowDevToolsConfirmInfoBar(
|
| const base::string16& message,
|
| const InfoBarCallback& callback) {
|
| DevToolsConfirmInfoBarDelegate::Create(
|
| - IsDocked() ?
|
| + is_docked_ ?
|
| InfoBarService::FromWebContents(GetInspectedWebContents()) :
|
| InfoBarService::FromWebContents(web_contents_),
|
| callback, message);
|
| @@ -1339,32 +1349,8 @@ BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() {
|
| browser->window() : NULL;
|
| }
|
|
|
| -bool DevToolsWindow::IsInspectedBrowserPopup() {
|
| - Browser* browser = NULL;
|
| - int tab;
|
| - return FindInspectedBrowserAndTabIndex(GetInspectedWebContents(),
|
| - &browser, &tab) &&
|
| - browser->is_type_popup();
|
| -}
|
| -
|
| -void DevToolsWindow::UpdateFrontendDockSide() {
|
| - base::StringValue dock_side(SideToString(dock_side_));
|
| - CallClientFunction("InspectorFrontendAPI.setDockSide", &dock_side, NULL,
|
| - NULL);
|
| - base::FundamentalValue docked(IsDocked());
|
| - CallClientFunction("InspectorFrontendAPI.setAttachedWindow", &docked, NULL,
|
| - NULL);
|
| -}
|
| -
|
| -void DevToolsWindow::ScheduleAction(const DevToolsToggleAction& action) {
|
| - action_on_load_ = action;
|
| - if (is_loaded_)
|
| - DoAction();
|
| -}
|
| -
|
| -void DevToolsWindow::DoAction() {
|
| - UpdateFrontendDockSide();
|
| - switch (action_on_load_.type()) {
|
| +void DevToolsWindow::DoAction(const DevToolsToggleAction& action) {
|
| + switch (action.type()) {
|
| case DevToolsToggleAction::kShowConsole:
|
| CallClientFunction("InspectorFrontendAPI.showConsole", NULL, NULL, NULL);
|
| break;
|
| @@ -1381,7 +1367,7 @@ void DevToolsWindow::DoAction() {
|
|
|
| case DevToolsToggleAction::kReveal: {
|
| const DevToolsToggleAction::RevealParams* params =
|
| - action_on_load_.params();
|
| + action.params();
|
| CHECK(params);
|
| base::StringValue url_value(params->url);
|
| base::FundamentalValue line_value(static_cast<int>(params->line_number));
|
| @@ -1397,7 +1383,6 @@ void DevToolsWindow::DoAction() {
|
| NOTREACHED();
|
| break;
|
| }
|
| - action_on_load_ = DevToolsToggleAction::Show();
|
| }
|
|
|
| void DevToolsWindow::UpdateTheme() {
|
| @@ -1482,23 +1467,20 @@ void DevToolsWindow::UpdateBrowserToolbar() {
|
| inspected_window->UpdateToolbar(NULL);
|
| }
|
|
|
| -bool DevToolsWindow::IsDocked() {
|
| - return dock_side_ != DEVTOOLS_DOCK_SIDE_UNDOCKED;
|
| -}
|
| -
|
| -void DevToolsWindow::Restore() {
|
| - if (dock_side_ == DEVTOOLS_DOCK_SIDE_MINIMIZED)
|
| - SetDockSide(SideToString(dock_side_before_minimized_));
|
| -}
|
| -
|
| content::WebContents* DevToolsWindow::GetInspectedWebContents() {
|
| return inspected_contents_observer_ ?
|
| inspected_contents_observer_->web_contents() : NULL;
|
| }
|
|
|
| void DevToolsWindow::DocumentOnLoadCompletedInMainFrame() {
|
| - is_loaded_ = true;
|
| + load_state_ = load_state_ == kNotLoaded ? kOnLoadFired : kLoadCompleted;
|
| + if (load_state_ == kLoadCompleted)
|
| + LoadCompleted();
|
| +}
|
| +
|
| +void DevToolsWindow::LoadCompleted() {
|
| + Show(action_on_load_);
|
| + action_on_load_ = DevToolsToggleAction::NoOp();
|
| UpdateTheme();
|
| - DoAction();
|
| AddDevToolsExtensionsToClient();
|
| }
|
|
|