summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authoryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-16 07:30:23 +0000
committeryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-16 07:30:23 +0000
commitbfaf3605dd235bc06fb94c268614023e5a7fe5bd (patch)
tree279e281955bd8b65ed2296cba17e8c2803ade9cd /content
parent9dfc681be07899cec20848a1294192980939c9c9 (diff)
downloadchromium_src-bfaf3605dd235bc06fb94c268614023e5a7fe5bd.zip
chromium_src-bfaf3605dd235bc06fb94c268614023e5a7fe5bd.tar.gz
chromium_src-bfaf3605dd235bc06fb94c268614023e5a7fe5bd.tar.bz2
DevTools: reattach to previous RVH when pending navigation is being canceled.
BUG=DevTools window may close when navigating to different bookmarked pages TEST=DevToolsManagerTest.ReattachOnCancelPendingNavigation Review URL: http://codereview.chromium.org/8572010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110267 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/debugger/devtools_manager.cc9
-rw-r--r--content/browser/debugger/devtools_manager.h2
-rw-r--r--content/browser/debugger/devtools_manager_unittest.cc40
-rw-r--r--content/browser/tab_contents/render_view_host_manager.cc7
4 files changed, 58 insertions, 0 deletions
diff --git a/content/browser/debugger/devtools_manager.cc b/content/browser/debugger/devtools_manager.cc
index 82a7c09..11b661f 100644
--- a/content/browser/debugger/devtools_manager.cc
+++ b/content/browser/debugger/devtools_manager.cc
@@ -160,6 +160,15 @@ void DevToolsManager::OnNavigatingToPendingEntry(RenderViewHost* rvh,
}
}
+void DevToolsManager::OnCancelPendingNavigation(RenderViewHost* pending,
+ RenderViewHost* current) {
+ int cookie = DetachClientHost(pending);
+ if (cookie != -1) {
+ // Navigating to URL in the inspected window.
+ AttachClientHost(cookie, current);
+ }
+}
+
void DevToolsManager::TabReplaced(TabContents* old_tab,
TabContents* new_tab) {
RenderViewHost* old_rvh = old_tab->render_view_host();
diff --git a/content/browser/debugger/devtools_manager.h b/content/browser/debugger/devtools_manager.h
index 56807dc..b2d5338 100644
--- a/content/browser/debugger/devtools_manager.h
+++ b/content/browser/debugger/devtools_manager.h
@@ -60,6 +60,8 @@ class CONTENT_EXPORT DevToolsManager
void OnNavigatingToPendingEntry(RenderViewHost* inspected_rvh,
RenderViewHost* dest_rvh,
const GURL& gurl);
+ void OnCancelPendingNavigation(RenderViewHost* pending,
+ RenderViewHost* current);
// Invoked when a tab is replaced by another tab. This is triggered by
// TabStripModel::ReplaceTabContentsAt.
diff --git a/content/browser/debugger/devtools_manager_unittest.cc b/content/browser/debugger/devtools_manager_unittest.cc
index 5252441..5fdc945 100644
--- a/content/browser/debugger/devtools_manager_unittest.cc
+++ b/content/browser/debugger/devtools_manager_unittest.cc
@@ -11,6 +11,7 @@
#include "content/browser/renderer_host/test_render_view_host.h"
#include "content/browser/tab_contents/tab_contents_delegate.h"
#include "content/browser/tab_contents/test_tab_contents.h"
+#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -95,6 +96,12 @@ class DevToolsManagerTestBrowserClient
return &dev_tools_manager_;
}
+ virtual bool ShouldSwapProcessesForNavigation(
+ const GURL& current_url,
+ const GURL& new_url) OVERRIDE {
+ return true;
+ }
+
private:
DevToolsManager dev_tools_manager_;
@@ -198,3 +205,36 @@ TEST_F(DevToolsManagerTest, NoUnresponsiveDialogInInspectedTab) {
contents()->set_delegate(NULL);
}
+
+TEST_F(DevToolsManagerTest, ReattachOnCancelPendingNavigation) {
+ contents()->transition_cross_site = true;
+ TestRenderViewHost* orig_rvh = rvh();
+ // Navigate to URL. First URL should use first RenderViewHost.
+ const GURL url("http://www.google.com");
+ controller().LoadURL(
+ url, GURL(), content::PAGE_TRANSITION_TYPED, std::string());
+ ViewHostMsg_FrameNavigate_Params params1;
+ InitNavigateParams(&params1, 1, url, content::PAGE_TRANSITION_TYPED);
+ contents()->TestDidNavigate(orig_rvh, params1);
+ EXPECT_FALSE(contents()->cross_navigation_pending());
+
+ TestDevToolsClientHost client_host;
+ DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
+ devtools_manager->RegisterDevToolsClientHostFor(rvh(), &client_host);
+
+ // Navigate to new site which should get a new RenderViewHost.
+ const GURL url2("http://www.yahoo.com");
+ controller().LoadURL(
+ url2, GURL(), content::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(contents()->cross_navigation_pending());
+ EXPECT_EQ(&client_host,
+ devtools_manager->GetDevToolsClientHostFor(pending_rvh()));
+
+ // Interrupt pending navigation and navigate back to the original site.
+ controller().LoadURL(
+ url, GURL(), content::PAGE_TRANSITION_TYPED, std::string());
+ contents()->TestDidNavigate(orig_rvh, params1);
+ EXPECT_FALSE(contents()->cross_navigation_pending());
+ EXPECT_EQ(&client_host, devtools_manager->GetDevToolsClientHostFor(rvh()));
+ client_host.Close();
+}
diff --git a/content/browser/tab_contents/render_view_host_manager.cc b/content/browser/tab_contents/render_view_host_manager.cc
index 61b084b..593933a 100644
--- a/content/browser/tab_contents/render_view_host_manager.cc
+++ b/content/browser/tab_contents/render_view_host_manager.cc
@@ -6,6 +6,7 @@
#include "base/command_line.h"
#include "base/logging.h"
+#include "content/browser/debugger/devtools_manager.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_view_host_factory.h"
@@ -746,6 +747,12 @@ void RenderViewHostManager::CancelPending() {
RenderViewHost* pending_render_view_host = pending_render_view_host_;
pending_render_view_host_ = NULL;
+ DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
+ if (devtools_manager) { // NULL in unit tests.
+ devtools_manager->OnCancelPendingNavigation(pending_render_view_host,
+ render_view_host_);
+ }
+
// We no longer need to prevent the process from exiting.
pending_render_view_host->process()->RemovePendingView();