summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-31 23:25:14 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-31 23:25:14 +0000
commit2914600dedd1b9c37b3844d5f878c063a7d2c106 (patch)
treec2d343dda665060d69b7167154074452a8918764
parent5f372f899b8709dac700710b5f0f90959dcf9ecb (diff)
downloadchromium_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.h5
-rw-r--r--chrome/browser/debugger/devtools_http_protocol_handler.cc3
-rw-r--r--chrome/browser/debugger/devtools_manager.cc15
-rw-r--r--chrome/browser/debugger/devtools_manager.h12
-rw-r--r--chrome/browser/debugger/devtools_manager_unittest.cc3
-rw-r--r--chrome/browser/debugger/devtools_window.cc5
-rw-r--r--chrome/browser/debugger/devtools_window.h2
-rw-r--r--chrome/browser/debugger/inspectable_tab_proxy.cc5
-rw-r--r--chrome/browser/debugger/inspectable_tab_proxy.h1
-rw-r--r--chrome/browser/extensions/extension_devtools_bridge.cc6
-rw-r--r--chrome/browser/extensions/extension_devtools_bridge.h2
-rw-r--r--chrome/browser/ui/browser.cc4
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) {