diff options
Diffstat (limited to 'chromium/content')
5 files changed, 95 insertions, 1 deletions
diff --git a/chromium/content/public/renderer/content_renderer_client.cc b/chromium/content/public/renderer/content_renderer_client.cc index 2621de3023e..76c80b42f87 100644 --- a/chromium/content/public/renderer/content_renderer_client.cc +++ b/chromium/content/public/renderer/content_renderer_client.cc @@ -37,6 +37,10 @@ bool ContentRendererClient::HasErrorPage(int http_status_code, return false; } +bool ContentRendererClient::ShouldSuppressErrorPage(const GURL& url) { + return false; +} + void ContentRendererClient::DeferMediaLoad(RenderView* render_view, const base::Closure& closure) { closure.Run(); diff --git a/chromium/content/public/renderer/content_renderer_client.h b/chromium/content/public/renderer/content_renderer_client.h index fcb8e56b276..4434a0f083f 100644 --- a/chromium/content/public/renderer/content_renderer_client.h +++ b/chromium/content/public/renderer/content_renderer_client.h @@ -101,6 +101,10 @@ class CONTENT_EXPORT ContentRendererClient { virtual bool HasErrorPage(int http_status_code, std::string* error_domain); + // Returns true if the embedder prefers not to show an error page for a failed + // navigation to |url|. + virtual bool ShouldSuppressErrorPage(const GURL& url); + // Returns the information to display when a navigation error occurs. // If |error_html| is not null then it may be set to a HTML page containing // the details of the error and maybe links to more info. diff --git a/chromium/content/renderer/render_view_browsertest.cc b/chromium/content/renderer/render_view_browsertest.cc index fc13ec0f703..a66e041ce9d 100644 --- a/chromium/content/renderer/render_view_browsertest.cc +++ b/chromium/content/renderer/render_view_browsertest.cc @@ -1950,4 +1950,80 @@ TEST_F(RenderViewImplTest, GetSSLStatusOfFrame) { EXPECT_TRUE(net::IsCertStatusError(ssl_status.cert_status)); } +class SuppressErrorPageTest : public RenderViewTest { + public: + virtual void SetUp() OVERRIDE { + SetRendererClientForTesting(&client_); + RenderViewTest::SetUp(); + } + + RenderViewImpl* view() { + return static_cast<RenderViewImpl*>(view_); + } + + private: + class TestContentRendererClient : public ContentRendererClient { + public: + virtual bool ShouldSuppressErrorPage(const GURL& url) OVERRIDE { + return url == GURL("http://example.com/suppress"); + } + + virtual void GetNavigationErrorStrings( + WebKit::WebFrame* frame, + const WebKit::WebURLRequest& failed_request, + const WebKit::WebURLError& error, + std::string* error_html, + string16* error_description) OVERRIDE { + if (error_html) + *error_html = "A suffusion of yellow."; + } + }; + + TestContentRendererClient client_; +}; + +TEST_F(SuppressErrorPageTest, Suppresses) { + WebURLError error; + error.domain = WebString::fromUTF8(net::kErrorDomain); + error.reason = net::ERR_FILE_NOT_FOUND; + error.unreachableURL = GURL("http://example.com/suppress"); + WebFrame* web_frame = GetMainFrame(); + + // Start a load that will reach provisional state synchronously, + // but won't complete synchronously. + ViewMsg_Navigate_Params params; + params.page_id = -1; + params.navigation_type = ViewMsg_Navigate_Type::NORMAL; + params.url = GURL("data:text/html,test data"); + view()->OnNavigate(params); + + // An error occurred. + view()->didFailProvisionalLoad(web_frame, error); + const int kMaxOutputCharacters = 22; + EXPECT_EQ("", UTF16ToASCII(web_frame->contentAsText(kMaxOutputCharacters))); +} + +TEST_F(SuppressErrorPageTest, DoesNotSuppress) { + WebURLError error; + error.domain = WebString::fromUTF8(net::kErrorDomain); + error.reason = net::ERR_FILE_NOT_FOUND; + error.unreachableURL = GURL("http://example.com/dont-suppress"); + WebFrame* web_frame = GetMainFrame(); + + // Start a load that will reach provisional state synchronously, + // but won't complete synchronously. + ViewMsg_Navigate_Params params; + params.page_id = -1; + params.navigation_type = ViewMsg_Navigate_Type::NORMAL; + params.url = GURL("data:text/html,test data"); + view()->OnNavigate(params); + + // An error occurred. + view()->didFailProvisionalLoad(web_frame, error); + ProcessPendingMessages(); + const int kMaxOutputCharacters = 22; + EXPECT_EQ("A suffusion of yellow.", + UTF16ToASCII(web_frame->contentAsText(kMaxOutputCharacters))); +} + } // namespace content diff --git a/chromium/content/renderer/render_view_impl.cc b/chromium/content/renderer/render_view_impl.cc index f52080eb8d2..6efebffe5f9 100644 --- a/chromium/content/renderer/render_view_impl.cc +++ b/chromium/content/renderer/render_view_impl.cc @@ -3646,8 +3646,16 @@ void RenderViewImpl::didFailProvisionalLoad(WebFrame* frame, return; } - if (RenderThreadImpl::current()->layout_test_mode()) + // Allow the embedder to suppress an error page. + if (GetContentClient()->renderer()->ShouldSuppressErrorPage( + error.unreachableURL)) { return; + } + + if (RenderThreadImpl::current() && + RenderThreadImpl::current()->layout_test_mode()) { + return; + } // Make sure we never show errors in view source mode. frame->enableViewSourceMode(false); diff --git a/chromium/content/renderer/render_view_impl.h b/chromium/content/renderer/render_view_impl.h index 2b18b3c032c..2634ce1ebbd 100644 --- a/chromium/content/renderer/render_view_impl.h +++ b/chromium/content/renderer/render_view_impl.h @@ -832,6 +832,8 @@ class CONTENT_EXPORT RenderViewImpl ShouldUpdateSelectionTextFromContextMenuParams); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, BasicRenderFrame); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, TextInputTypeWithPepper); + FRIEND_TEST_ALL_PREFIXES(SuppressErrorPageTest, Suppresses); + FRIEND_TEST_ALL_PREFIXES(SuppressErrorPageTest, DoesNotSuppress); typedef std::map<GURL, double> HostZoomLevels; |