Index: android_webview/browser/aw_content_browser_client.cc |
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc |
index 5c3aaf9bedcf19a7ea750ef84cb70f6ddf863c91..96ed1053d4f438a8d35ff514bcc36c16d4fdb70b 100644 |
--- a/android_webview/browser/aw_content_browser_client.cc |
+++ b/android_webview/browser/aw_content_browser_client.cc |
@@ -33,6 +33,7 @@ |
#include "components/navigation_interception/intercept_navigation_delegate.h" |
#include "content/public/browser/access_token_store.h" |
#include "content/public/browser/browser_message_filter.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/child_process_security_policy.h" |
#include "content/public/browser/client_certificate_delegate.h" |
#include "content/public/browser/navigation_handle.h" |
@@ -51,6 +52,7 @@ |
#include "ui/base/resource/resource_bundle_android.h" |
#include "ui/resources/grit/ui_resources.h" |
+using content::BrowserThread; |
using content::ResourceType; |
namespace android_webview { |
@@ -64,8 +66,16 @@ public: |
explicit AwContentsMessageFilter(int process_id); |
// BrowserMessageFilter methods. |
+ void OverrideThreadForMessage(const IPC::Message& message, |
+ BrowserThread::ID* thread) override; |
bool OnMessageReceived(const IPC::Message& message) override; |
+ void OnShouldOverrideUrlLoading(int routing_id, |
+ const base::string16& url, |
+ bool has_user_gesture, |
+ bool is_redirect, |
+ bool is_main_frame, |
+ bool* ignore_navigation); |
void OnSubFrameCreated(int parent_render_frame_id, int child_render_frame_id); |
private: |
@@ -84,15 +94,45 @@ AwContentsMessageFilter::AwContentsMessageFilter(int process_id) |
AwContentsMessageFilter::~AwContentsMessageFilter() { |
} |
+void AwContentsMessageFilter::OverrideThreadForMessage( |
+ const IPC::Message& message, |
+ BrowserThread::ID* thread) { |
+ if (message.type() == AwViewHostMsg_ShouldOverrideUrlLoading::ID) { |
+ *thread = BrowserThread::UI; |
+ } |
+} |
+ |
bool AwContentsMessageFilter::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(AwContentsMessageFilter, message) |
+ IPC_MESSAGE_HANDLER(AwViewHostMsg_ShouldOverrideUrlLoading, |
+ OnShouldOverrideUrlLoading) |
IPC_MESSAGE_HANDLER(AwViewHostMsg_SubFrameCreated, OnSubFrameCreated) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
} |
+void AwContentsMessageFilter::OnShouldOverrideUrlLoading( |
+ int render_frame_id, |
+ const base::string16& url, |
+ bool has_user_gesture, |
+ bool is_redirect, |
+ bool is_main_frame, |
+ bool* ignore_navigation) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ *ignore_navigation = false; |
+ AwContentsClientBridgeBase* client = |
+ AwContentsClientBridgeBase::FromID(process_id_, render_frame_id); |
+ if (client) { |
+ *ignore_navigation = client->ShouldOverrideUrlLoading( |
+ url, has_user_gesture, is_redirect, is_main_frame); |
+ } else { |
+ LOG(WARNING) << "Failed to find the associated render view host for url: " |
+ << url; |
+ } |
+} |
+ |
void AwContentsMessageFilter::OnSubFrameCreated(int parent_render_frame_id, |
int child_render_frame_id) { |
AwContentsIoThreadClient::SubFrameCreated( |
@@ -520,10 +560,10 @@ ScopedVector<content::NavigationThrottle> |
AwContentBrowserClient::CreateThrottlesForNavigation( |
content::NavigationHandle* navigation_handle) { |
ScopedVector<content::NavigationThrottle> throttles; |
- if (navigation_handle->IsInMainFrame() || |
- (!navigation_handle->GetURL().SchemeIs(url::kHttpScheme) && |
- !navigation_handle->GetURL().SchemeIs(url::kHttpsScheme) && |
- !navigation_handle->GetURL().SchemeIs(url::kAboutScheme))) { |
+ // We allow intercepting only navigations within main frames. This |
+ // is used to post onPageStarted. We handle shouldOverrideUrlLoading |
+ // via a sync IPC. |
+ if (navigation_handle->IsInMainFrame()) { |
throttles.push_back( |
navigation_interception::InterceptNavigationDelegate::CreateThrottleFor( |
navigation_handle)); |