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 e71fddbcee0119272ce6897892b2341bca640b3c..48c1d8fd0695c9d2af14ae5a9574370dc1db6963 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" |
| @@ -30,9 +33,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. |
| +// 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); |
|
boliu
2013/12/06 20:28:23
need explicit keyword for 1-arg constructor
sgurun-gerrit only
2013/12/07 00:11:07
Done.
|
| + |
| + // BrowserMessageFilter methods |
|
boliu
2013/12/06 20:28:23
nit: period
sgurun-gerrit only
2013/12/07 00:11:07
Done.
|
| + 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() { } |
| @@ -56,6 +88,46 @@ class AwAccessTokenStore : public content::AccessTokenStore { |
| } |
| +AwContentsMessageFilter::AwContentsMessageFilter(int process_id) |
|
boliu
2013/12/06 20:28:23
nit: why not keep implementation next to the class
sgurun-gerrit only
2013/12/07 00:11:07
Done.
|
| + : 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) { |
|
boliu
2013/12/06 20:28:23
DCHECK this is running on ui thread
sgurun-gerrit only
2013/12/07 00:11:07
Done.
|
| + *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(); |
| @@ -122,6 +194,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* |