summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorbrettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-11 21:46:53 +0000
committerbrettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-11 21:46:53 +0000
commit212b7ae16eb243fcc59a04bc67b0c1293dbd1390 (patch)
tree4ab9a3355bc53bfdcd9ad92894bf5f308ecf1c6f /chrome
parent70e2e4a95a549e6b86443bd50454e76c195ebd6a (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/tab_contents/render_view_host_manager.cc8
-rw-r--r--chrome/browser/tab_contents/render_view_host_manager_unittest.cc51
-rw-r--r--chrome/browser/tab_contents/web_contents_unittest.cc2
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;