diff --git public/renderer/content_renderer_client.cc public/renderer/content_renderer_client.cc index 9513339..75ddff8 100644 --- public/renderer/content_renderer_client.cc +++ public/renderer/content_renderer_client.cc @@ -103,6 +103,18 @@ bool ContentRendererClient::AllowPopup() { return false; } +bool ContentRendererClient::HandleNavigation( + RenderFrame* render_frame, + DocumentState* document_state, + int opener_id, + blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationType type, + blink::WebNavigationPolicy default_policy, + bool is_redirect) { + return false; +} + bool ContentRendererClient::ShouldFork(blink::WebLocalFrame* frame, const GURL& url, const std::string& http_method, diff --git public/renderer/content_renderer_client.h public/renderer/content_renderer_client.h index ccf4b5f..91a5be3 100644 --- public/renderer/content_renderer_client.h +++ public/renderer/content_renderer_client.h @@ -16,6 +16,8 @@ #include "base/strings/string16.h" #include "content/public/common/content_client.h" #include "third_party/WebKit/public/platform/WebPageVisibilityState.h" +#include "third_party/WebKit/public/web/WebNavigationPolicy.h" +#include "third_party/WebKit/public/web/WebNavigationType.h" #include "ui/base/page_transition_types.h" #include "v8/include/v8.h" @@ -198,6 +200,17 @@ class CONTENT_EXPORT ContentRendererClient { // Returns true if a popup window should be allowed. virtual bool AllowPopup(); + // Returns true if the navigation was handled by the embedder and should be + // ignored by WebKit. This method is used by CEF and android_webview. + virtual bool HandleNavigation(RenderFrame* render_frame, + DocumentState* document_state, + int opener_id, + blink::WebFrame* frame, + const blink::WebURLRequest& request, + blink::WebNavigationType type, + blink::WebNavigationPolicy default_policy, + bool is_redirect); + // Returns true if we should fork a new process for the given navigation. // If |send_referrer| is set to false (which is the default), no referrer // header will be send for the navigation. Otherwise, the referrer header is diff --git renderer/render_frame_impl.cc renderer/render_frame_impl.cc index 8568626..9a746d2 100644 --- renderer/render_frame_impl.cc +++ renderer/render_frame_impl.cc @@ -4240,6 +4240,19 @@ void RenderFrameImpl::OnFailedNavigation( WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( RenderFrame* render_frame, const NavigationPolicyInfo& info) { + if (info.urlRequest.url() != GURL(kSwappedOutURL) && + GetContentClient()->renderer()->HandleNavigation( + render_frame, + static_cast(info.extraData), + render_view_->opener_id_, + info.frame, + info.urlRequest, + info.navigationType, + info.defaultPolicy, + info.isRedirect)) { + return blink::WebNavigationPolicyIgnore; + } + Referrer referrer(RenderViewImpl::GetReferrerFromRequest(info.frame, info.urlRequest));