diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-31 23:25:14 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-31 23:25:14 +0000 |
commit | 2914600dedd1b9c37b3844d5f878c063a7d2c106 (patch) | |
tree | c2d343dda665060d69b7167154074452a8918764 | |
parent | 5f372f899b8709dac700710b5f0f90959dcf9ecb (diff) | |
download | chromium_src-2914600dedd1b9c37b3844d5f878c063a7d2c106.zip chromium_src-2914600dedd1b9c37b3844d5f878c063a7d2c106.tar.gz chromium_src-2914600dedd1b9c37b3844d5f878c063a7d2c106.tar.bz2 |
Makes devtools handle tab replaced notification. This
works, but it causes a rather noticable flash as the inspector
reloads. Do you have a suggestion of making it not do that?
For background, when instant is enabled as you type in the omnibox a
new tabcontents is created and overlaid on top of the existing tab. If
the user presses enter or clicks on the page the instant tab replaced
the old tab.
BUG=68685
TEST=none
Review URL: http://codereview.chromium.org/6172002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73217 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/debugger/devtools_client_host.h | 5 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_http_protocol_handler.cc | 3 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_manager.cc | 15 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_manager.h | 12 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_manager_unittest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_window.cc | 5 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_window.h | 2 | ||||
-rw-r--r-- | chrome/browser/debugger/inspectable_tab_proxy.cc | 5 | ||||
-rw-r--r-- | chrome/browser/debugger/inspectable_tab_proxy.h | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_devtools_bridge.cc | 6 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_devtools_bridge.h | 2 | ||||
-rw-r--r-- | chrome/browser/ui/browser.cc | 4 |
12 files changed, 58 insertions, 5 deletions
diff --git a/chrome/browser/debugger/devtools_client_host.h b/chrome/browser/debugger/devtools_client_host.h index 9044448..4c81e87 100644 --- a/chrome/browser/debugger/devtools_client_host.h +++ b/chrome/browser/debugger/devtools_client_host.h @@ -15,6 +15,7 @@ class Message; } class DevToolsWindow; +class TabContentsWrapper; // Describes interface for managing devtools clients from browser process. There // are currently two types of clients: devtools windows and TCP socket @@ -49,6 +50,10 @@ class DevToolsClientHost { virtual DevToolsWindow* AsDevToolsWindow(); + // Invoked when a tab is replaced by another tab. This is triggered by + // TabStripModel::ReplaceTabContentsAt. + virtual void TabReplaced(TabContentsWrapper* new_tab) = 0; + protected: DevToolsClientHost() : close_listener_(NULL) {} diff --git a/chrome/browser/debugger/devtools_http_protocol_handler.cc b/chrome/browser/debugger/devtools_http_protocol_handler.cc index 4fe3a02..2138f6a 100644 --- a/chrome/browser/debugger/devtools_http_protocol_handler.cc +++ b/chrome/browser/debugger/devtools_http_protocol_handler.cc @@ -55,6 +55,9 @@ class DevToolsClientHostImpl : public DevToolsClientHost { IPC_END_MESSAGE_MAP() } + virtual void TabReplaced(TabContentsWrapper* new_tab) { + } + void NotifyCloseListener() { DevToolsClientHost::NotifyCloseListener(); } diff --git a/chrome/browser/debugger/devtools_manager.cc b/chrome/browser/debugger/devtools_manager.cc index b557da0..543171b 100644 --- a/chrome/browser/debugger/devtools_manager.cc +++ b/chrome/browser/debugger/devtools_manager.cc @@ -19,6 +19,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/renderer_host/site_instance.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/notification_service.h" #include "chrome/common/pref_names.h" #include "googleurl/src/gurl.h" @@ -245,6 +246,20 @@ void DevToolsManager::OnNavigatingToPendingEntry(RenderViewHost* rvh, } } +void DevToolsManager::TabReplaced(TabContentsWrapper* old_tab, + TabContentsWrapper* new_tab) { + RenderViewHost* old_rvh = old_tab->tab_contents()->render_view_host(); + DevToolsClientHost* client_host = GetDevToolsClientHostFor(old_rvh); + if (!client_host) + return; // Didn't know about old_tab. + int cookie = DetachClientHost(old_rvh); + if (cookie == -1) + return; // Didn't know about old_tab. + + client_host->TabReplaced(new_tab); + AttachClientHost(cookie, new_tab->tab_contents()->render_view_host()); +} + int DevToolsManager::DetachClientHost(RenderViewHost* from_rvh) { DevToolsClientHost* client_host = GetDevToolsClientHostFor(from_rvh); if (!client_host) diff --git a/chrome/browser/debugger/devtools_manager.h b/chrome/browser/debugger/devtools_manager.h index 736fb48..3669c32 100644 --- a/chrome/browser/debugger/devtools_manager.h +++ b/chrome/browser/debugger/devtools_manager.h @@ -24,6 +24,8 @@ class GURL; class IOThread; class PrefService; class RenderViewHost; +class TabContentsWraper; + using webkit_glue::ResourceLoaderBridge; // This class is a singleton that manages DevToolsClientHost instances and @@ -77,6 +79,10 @@ class DevToolsManager : public DevToolsClientHost::CloseListener, RenderViewHost* dest_rvh, const GURL& gurl); + // Invoked when a tab is replaced by another tab. This is triggered by + // TabStripModel::ReplaceTabContentsAt. + void TabReplaced(TabContentsWrapper* old_tab, TabContentsWrapper* new_tab); + // Detaches client host and returns cookie that can be used in // AttachClientHost. int DetachClientHost(RenderViewHost* from_rvh); @@ -124,10 +130,8 @@ class DevToolsManager : public DevToolsClientHost::CloseListener, DevToolsClientHost* client_host); // These two maps are for tracking dependencies between inspected tabs and - // their DevToolsClientHosts. They are usful for routing devtools messages - // and allow us to have at most one devtools client host per tab. We use - // NavigationController* as key because it survives crosee-site navigation in - // cases when tab contents may change. + // their DevToolsClientHosts. They are useful for routing devtools messages + // and allow us to have at most one devtools client host per tab. // // DevToolsManager start listening to DevToolsClientHosts when they are put // into these maps and removes them when they are closing. diff --git a/chrome/browser/debugger/devtools_manager_unittest.cc b/chrome/browser/debugger/devtools_manager_unittest.cc index 8c369e6..751410a 100644 --- a/chrome/browser/debugger/devtools_manager_unittest.cc +++ b/chrome/browser/debugger/devtools_manager_unittest.cc @@ -40,6 +40,9 @@ class TestDevToolsClientHost : public DevToolsClientHost { last_sent_message = &message; } + virtual void TabReplaced(TabContentsWrapper* new_tab) { + } + static void ResetCounters() { close_counter = 0; } diff --git a/chrome/browser/debugger/devtools_window.cc b/chrome/browser/debugger/devtools_window.cc index 9e86f28..fdaa847 100644 --- a/chrome/browser/debugger/devtools_window.cc +++ b/chrome/browser/debugger/devtools_window.cc @@ -126,6 +126,11 @@ void DevToolsWindow::InspectedTabClosing() { } } +void DevToolsWindow::TabReplaced(TabContentsWrapper* new_tab) { + DCHECK_EQ(profile_, new_tab->profile()); + inspected_tab_ = new_tab->tab_contents(); +} + void DevToolsWindow::Show(DevToolsToggleAction action) { if (docked_) { Browser* inspected_browser; diff --git a/chrome/browser/debugger/devtools_window.h b/chrome/browser/debugger/devtools_window.h index 89430fb..19eaa41 100644 --- a/chrome/browser/debugger/devtools_window.h +++ b/chrome/browser/debugger/devtools_window.h @@ -23,7 +23,6 @@ class Browser; class BrowserWindow; class Profile; class RenderViewHost; -class TabContentsWrapper; class Value; class DevToolsWindow @@ -41,6 +40,7 @@ class DevToolsWindow virtual DevToolsWindow* AsDevToolsWindow(); virtual void SendMessageToClient(const IPC::Message& message); virtual void InspectedTabClosing(); + virtual void TabReplaced(TabContentsWrapper* new_tab); void Show(DevToolsToggleAction action); void Activate(); diff --git a/chrome/browser/debugger/inspectable_tab_proxy.cc b/chrome/browser/debugger/inspectable_tab_proxy.cc index ae09d8e..652e540 100644 --- a/chrome/browser/debugger/inspectable_tab_proxy.cc +++ b/chrome/browser/debugger/inspectable_tab_proxy.cc @@ -48,6 +48,11 @@ void DevToolsClientHostImpl::SendMessageToClient( IPC_END_MESSAGE_MAP() } +void DevToolsClientHostImpl::TabReplaced(TabContentsWrapper* new_tab) { + map_->erase(id_); + id_ = new_tab->controller().session_id().id(); + (*map_)[id_] = this; +} void DevToolsClientHostImpl::OnDebuggerOutput(const std::string& data) { service_->DebuggerOutput(id_, data); diff --git a/chrome/browser/debugger/inspectable_tab_proxy.h b/chrome/browser/debugger/inspectable_tab_proxy.h index d07e96e..e521b31 100644 --- a/chrome/browser/debugger/inspectable_tab_proxy.h +++ b/chrome/browser/debugger/inspectable_tab_proxy.h @@ -76,6 +76,7 @@ class DevToolsClientHostImpl : public DevToolsClientHost { // DevToolsClientHost interface virtual void InspectedTabClosing(); virtual void SendMessageToClient(const IPC::Message& msg); + virtual void TabReplaced(TabContentsWrapper* new_tab); private: // Message handling routines diff --git a/chrome/browser/extensions/extension_devtools_bridge.cc b/chrome/browser/extensions/extension_devtools_bridge.cc index 71422ca..7035ded 100644 --- a/chrome/browser/extensions/extension_devtools_bridge.cc +++ b/chrome/browser/extensions/extension_devtools_bridge.cc @@ -140,6 +140,12 @@ void ExtensionDevToolsBridge::SendMessageToClient(const IPC::Message& msg) { IPC_END_MESSAGE_MAP() } +void ExtensionDevToolsBridge::TabReplaced(TabContentsWrapper* new_tab) { + DCHECK_EQ(profile_, new_tab->profile()); + // We don't update the tab id as it needs to remain the same so that we can + // properly unregister. +} + void ExtensionDevToolsBridge::OnDispatchOnInspectorFrontend( const std::string& data) { DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); diff --git a/chrome/browser/extensions/extension_devtools_bridge.h b/chrome/browser/extensions/extension_devtools_bridge.h index 894ab17..7e628e5 100644 --- a/chrome/browser/extensions/extension_devtools_bridge.h +++ b/chrome/browser/extensions/extension_devtools_bridge.h @@ -31,6 +31,8 @@ class ExtensionDevToolsBridge : public DevToolsClientHost { // DevToolsClientHost, called to send a message to this host. virtual void SendMessageToClient(const IPC::Message& msg); + virtual void TabReplaced(TabContentsWrapper* new_tab); + private: void OnDispatchOnInspectorFrontend(const std::string& data); diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index aec9bb2..59ef3db 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -2745,6 +2745,10 @@ void Browser::TabReplacedAt(TabStripModel* tab_strip_model, &new_contents->controller(), tab_handler_->GetTabStripModel()->IsTabPinned(index)); } + + DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); + if (devtools_manager) // NULL in unit tests. + devtools_manager->TabReplaced(old_contents, new_contents); } void Browser::TabPinnedStateChanged(TabContentsWrapper* contents, int index) { |