diff options
author | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-16 07:30:23 +0000 |
---|---|---|
committer | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-16 07:30:23 +0000 |
commit | bfaf3605dd235bc06fb94c268614023e5a7fe5bd (patch) | |
tree | 279e281955bd8b65ed2296cba17e8c2803ade9cd /content | |
parent | 9dfc681be07899cec20848a1294192980939c9c9 (diff) | |
download | chromium_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')
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(¶ms1, 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(); |