Chromium Code Reviews| 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 97bdf1f575a2001c163dd9cef6ebcf22ac095fba..f90a5493f2c456bfdda77fab1fbd5578f7cb124f 100644 |
| --- a/android_webview/browser/aw_content_browser_client.cc |
| +++ b/android_webview/browser/aw_content_browser_client.cc |
| @@ -13,10 +13,13 @@ |
| #include "android_webview/browser/jni_dependency_factory.h" |
| #include "android_webview/browser/net_disk_cache_remover.h" |
| #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h" |
| +#include "android_webview/common/render_view_messages.h" |
| #include "android_webview/common/url_constants.h" |
| #include "base/base_paths_android.h" |
| #include "base/path_service.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/render_process_host.h" |
| #include "content/public/browser/render_view_host.h" |
| @@ -29,9 +32,38 @@ |
| #include "ui/base/resource/resource_bundle.h" |
| #include "webkit/common/webpreferences.h" |
| +using content::BrowserThread; |
| + |
| namespace android_webview { |
| namespace { |
| +// TODO(sgurun) move this to its own file. |
|
mkosiba (inactive)
2013/10/17 10:27:45
any reason not to do this now?
sgurun-gerrit only
2013/12/06 00:17:48
Given the very temporary nature of these changes,
|
| +// This class filters out incoming aw_contents related IPC messages for the |
| +// renderer process on the IPC thread. |
| +class AwContentsMessageFilter : public content::BrowserMessageFilter { |
| +public: |
| + AwContentsMessageFilter(int process_id); |
| + |
| + // BrowserMessageFilter methods |
| + virtual void OverrideThreadForMessage( |
| + const IPC::Message& message, |
| + BrowserThread::ID* thread) OVERRIDE; |
| + virtual bool OnMessageReceived( |
| + const IPC::Message& message, |
| + bool* message_was_ok) OVERRIDE; |
| + |
| + void OnShouldOverrideUrlLoading(int routing_id, |
| + const base::string16& url, |
| + bool* ignore_navigation); |
| + |
| +private: |
| + virtual ~AwContentsMessageFilter(); |
| + |
| + int process_id_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(AwContentsMessageFilter); |
| +}; |
| + |
| class AwAccessTokenStore : public content::AccessTokenStore { |
| public: |
| AwAccessTokenStore() { } |
| @@ -55,6 +87,46 @@ class AwAccessTokenStore : public content::AccessTokenStore { |
| } |
| +AwContentsMessageFilter::AwContentsMessageFilter(int process_id) |
| + : process_id_(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* message_was_ok) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP_EX(AwContentsMessageFilter, message, *message_was_ok) |
| + IPC_MESSAGE_HANDLER(AwViewHostMsg_ShouldOverrideUrlLoading, |
| + OnShouldOverrideUrlLoading) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| +void AwContentsMessageFilter::OnShouldOverrideUrlLoading( |
| + int routing_id, |
| + const base::string16& url, |
| + bool* ignore_navigation) { |
| + *ignore_navigation = false; |
| + AwContentsClientBridgeBase* client = |
| + AwContentsClientBridgeBase::FromID(process_id_, routing_id); |
| + if (client) { |
| + *ignore_navigation = client->ShouldOverrideUrlLoading(url); |
| + } else { |
| + LOG(WARNING) << "Failed to find the associated render view host for url: " |
| + << url; |
| + } |
| +} |
| + |
| std::string AwContentBrowserClient::GetAcceptLangsImpl() { |
| // Start with the currnet locale. |
| std::string langs = l10n_util::GetDefaultLocale(); |
| @@ -121,6 +193,8 @@ void AwContentBrowserClient::RenderProcessHostCreated( |
| host->GetID(), android_webview::kContentScheme); |
| content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme( |
| host->GetID(), chrome::kFileScheme); |
| + |
| + host->AddFilter(new AwContentsMessageFilter(host->GetID())); |
| } |
| net::URLRequestContextGetter* |