diff options
author | brettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:46:53 +0000 |
---|---|---|
committer | brettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:46:53 +0000 |
commit | 212b7ae16eb243fcc59a04bc67b0c1293dbd1390 (patch) | |
tree | 4ab9a3355bc53bfdcd9ad92894bf5f308ecf1c6f /chrome | |
parent | 70e2e4a95a549e6b86443bd50454e76c195ebd6a (diff) | |
download | chromium_src-212b7ae16eb243fcc59a04bc67b0c1293dbd1390.zip chromium_src-212b7ae16eb243fcc59a04bc67b0c1293dbd1390.tar.gz chromium_src-212b7ae16eb243fcc59a04bc67b0c1293dbd1390.tar.bz2 |
Make sure view-source: is applied to RenderView when it is reused for a new
navigation. On page loading errors, WebFrameImpl::DidFail() will call
RenderView::OnEnableViewSourceMode(false) not to show error pages in view
source mode. We should overwrite the mode for new navigations not to show
view-source: added inputs in non view-source mode.
This fix is related to
http://code.google.com/p/chromium/issues/detail?id=4516
But this doesn't resolve reloading case.
BUG=none
TEST=1) View some site using view-source:. 2) let the site return error for
example 404 Not Found, and then view using view-source:. 3) make it 200
again and view using view-source:. It must show source code.
Original review: http://codereview.chromium.org/119233
Patch by tyoshino@google.com
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18211 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
3 files changed, 60 insertions, 1 deletions
diff --git a/chrome/browser/tab_contents/render_view_host_manager.cc b/chrome/browser/tab_contents/render_view_host_manager.cc index 4a55dbb..710723f 100644 --- a/chrome/browser/tab_contents/render_view_host_manager.cc +++ b/chrome/browser/tab_contents/render_view_host_manager.cc @@ -18,6 +18,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/notification_service.h" #include "chrome/common/notification_type.h" +#include "chrome/common/render_messages.h" namespace base { class WaitableEvent; @@ -549,6 +550,13 @@ RenderViewHost* RenderViewHostManager::UpdateRendererStateForNavigate( render_view_host_->FirePageBeforeUnload(); return pending_render_view_host_; + } else { + // The renderer can exit view source mode when any error or cancellation + // happen. We must overwrite to recover the mode. + if (entry.IsViewSourceMode()) { + render_view_host_->Send( + new ViewMsg_EnableViewSourceMode(render_view_host_->routing_id())); + } } // Same SiteInstance can be used. Navigate render_view_host_ if we are not diff --git a/chrome/browser/tab_contents/render_view_host_manager_unittest.cc b/chrome/browser/tab_contents/render_view_host_manager_unittest.cc index 108eed7..7a4bcc5 100644 --- a/chrome/browser/tab_contents/render_view_host_manager_unittest.cc +++ b/chrome/browser/tab_contents/render_view_host_manager_unittest.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "chrome/browser/renderer_host/test_render_view_host.h" +#include "chrome/browser/tab_contents/navigation_entry.h" +#include "chrome/common/render_messages.h" #include "chrome/common/url_constants.h" #include "testing/gtest/include/gtest/gtest.h" @@ -63,3 +65,52 @@ TEST_F(RenderViewHostManagerTest, NewTabPageProcesses) { EXPECT_EQ(active_rvh()->site_instance(), contents2.render_view_host()->site_instance()); } + +// When there is an error with the specified page, renderer exits view-source +// mode. See WebFrameImpl::DidFail(). We check by this test that +// EnableViewSourceMode message is sent on every navigation regardless +// RenderView is being newly created or reused. +TEST_F(RenderViewHostManagerTest, AlwaysSendEnableViewSourceMode) { + const GURL kNtpUrl(chrome::kChromeUINewTabURL); + const GURL kUrl("view-source:http://foo"); + + // We have to navigate to some page at first since without this, the first + // navigation will reuse the SiteInstance created by Init(), and the second + // one will create a new SiteInstance. Because current_instance and + // new_instance will be different, a new RenderViewHost will be created for + // the second navigation. We have to avoid this in order to exercise the + // target code patch. + NavigateActiveAndCommit(kNtpUrl); + + // Navigate. + controller().LoadURL(kUrl, GURL() /* referer */, PageTransition::TYPED); + // Simulate response from RenderView for FirePageBeforeUnload. + rvh()->TestOnMessageReceived( + ViewHostMsg_ShouldClose_ACK(rvh()->routing_id(), true)); + ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created. + RenderViewHost* last_rvh = pending_rvh(); + int new_id = static_cast<MockRenderProcessHost*>(pending_rvh()->process())-> + max_page_id() + 1; + pending_rvh()->SendNavigate(new_id, kUrl); + EXPECT_EQ(controller().last_committed_entry_index(), 1); + ASSERT_TRUE(controller().GetLastCommittedEntry()); + EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->url()); + EXPECT_FALSE(controller().pending_entry()); + // Because we're using TestTabContents and TestRenderViewHost in this + // unittest, no one calls TabContents::RenderViewCreated(). So, we see no + // EnableViewSourceMode message, here. + + // Clear queued messages before load. + process()->sink().ClearMessages(); + // Navigate, again. + controller().LoadURL(kUrl, GURL() /* referer */, PageTransition::TYPED); + // The same RenderViewHost should be reused. + EXPECT_FALSE(pending_rvh()); + EXPECT_TRUE(last_rvh == rvh()); + rvh()->SendNavigate(new_id, kUrl); // The same page_id returned. + EXPECT_EQ(controller().last_committed_entry_index(), 1); + EXPECT_FALSE(controller().pending_entry()); + // New message should be sent out to make sure to enter view-source mode. + EXPECT_TRUE(process()->sink().GetUniqueMessageMatching( + ViewMsg_EnableViewSourceMode::ID)); +} diff --git a/chrome/browser/tab_contents/web_contents_unittest.cc b/chrome/browser/tab_contents/web_contents_unittest.cc index 5db8bb8..ac425d6 100644 --- a/chrome/browser/tab_contents/web_contents_unittest.cc +++ b/chrome/browser/tab_contents/web_contents_unittest.cc @@ -221,7 +221,7 @@ TEST_F(TabContentsTest, NTPViewSource) { controller().LoadURL(kGURL, GURL(), PageTransition::TYPED); rvh()->delegate()->RenderViewCreated(rvh()); // Did we get the expected message? - EXPECT_TRUE(process()->sink().GetUniqueMessageMatching( + EXPECT_TRUE(process()->sink().GetFirstMessageMatching( ViewMsg_EnableViewSourceMode::ID)); ViewHostMsg_FrameNavigate_Params params; |