• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "android_webview/browser/aw_content_browser_client.h"
6 
7 #include "android_webview/browser/aw_browser_context.h"
8 #include "android_webview/browser/aw_browser_main_parts.h"
9 #include "android_webview/browser/aw_browser_permission_request_delegate.h"
10 #include "android_webview/browser/aw_contents_client_bridge_base.h"
11 #include "android_webview/browser/aw_contents_io_thread_client.h"
12 #include "android_webview/browser/aw_cookie_access_policy.h"
13 #include "android_webview/browser/aw_quota_permission_context.h"
14 #include "android_webview/browser/aw_web_preferences_populater.h"
15 #include "android_webview/browser/jni_dependency_factory.h"
16 #include "android_webview/browser/net_disk_cache_remover.h"
17 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h"
18 #include "android_webview/common/render_view_messages.h"
19 #include "android_webview/common/url_constants.h"
20 #include "base/base_paths_android.h"
21 #include "base/path_service.h"
22 #include "components/cdm/browser/cdm_message_filter_android.h"
23 #include "content/public/browser/access_token_store.h"
24 #include "content/public/browser/browser_message_filter.h"
25 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/child_process_security_policy.h"
27 #include "content/public/browser/render_process_host.h"
28 #include "content/public/browser/render_view_host.h"
29 #include "content/public/browser/web_contents.h"
30 #include "content/public/common/url_constants.h"
31 #include "grit/ui_resources.h"
32 #include "net/android/network_library.h"
33 #include "net/ssl/ssl_cert_request_info.h"
34 #include "net/ssl/ssl_info.h"
35 #include "ui/base/l10n/l10n_util_android.h"
36 #include "ui/base/resource/resource_bundle.h"
37 #include "webkit/common/webpreferences.h"
38 
39 using content::BrowserThread;
40 
41 namespace android_webview {
42 namespace {
43 
44 // TODO(sgurun) move this to its own file.
45 // This class filters out incoming aw_contents related IPC messages for the
46 // renderer process on the IPC thread.
47 class AwContentsMessageFilter : public content::BrowserMessageFilter {
48 public:
49   explicit AwContentsMessageFilter(int process_id);
50 
51   // BrowserMessageFilter methods.
52   virtual void OverrideThreadForMessage(
53       const IPC::Message& message,
54       BrowserThread::ID* thread) OVERRIDE;
55   virtual bool OnMessageReceived(
56       const IPC::Message& message) OVERRIDE;
57 
58   void OnShouldOverrideUrlLoading(int routing_id,
59                                   const base::string16& url,
60                                   bool* ignore_navigation);
61   void OnSubFrameCreated(int parent_render_frame_id, int child_render_frame_id);
62 
63 private:
64   virtual ~AwContentsMessageFilter();
65 
66   int process_id_;
67 
68   DISALLOW_COPY_AND_ASSIGN(AwContentsMessageFilter);
69 };
70 
AwContentsMessageFilter(int process_id)71 AwContentsMessageFilter::AwContentsMessageFilter(int process_id)
72     : BrowserMessageFilter(AndroidWebViewMsgStart),
73       process_id_(process_id) {
74 }
75 
~AwContentsMessageFilter()76 AwContentsMessageFilter::~AwContentsMessageFilter() {
77 }
78 
OverrideThreadForMessage(const IPC::Message & message,BrowserThread::ID * thread)79 void AwContentsMessageFilter::OverrideThreadForMessage(
80     const IPC::Message& message, BrowserThread::ID* thread) {
81   if (message.type() == AwViewHostMsg_ShouldOverrideUrlLoading::ID) {
82     *thread = BrowserThread::UI;
83   }
84 }
85 
OnMessageReceived(const IPC::Message & message)86 bool AwContentsMessageFilter::OnMessageReceived(const IPC::Message& message) {
87   bool handled = true;
88   IPC_BEGIN_MESSAGE_MAP(AwContentsMessageFilter, message)
89     IPC_MESSAGE_HANDLER(AwViewHostMsg_ShouldOverrideUrlLoading,
90                         OnShouldOverrideUrlLoading)
91     IPC_MESSAGE_HANDLER(AwViewHostMsg_SubFrameCreated, OnSubFrameCreated)
92     IPC_MESSAGE_UNHANDLED(handled = false)
93   IPC_END_MESSAGE_MAP()
94   return handled;
95 }
96 
OnShouldOverrideUrlLoading(int render_frame_id,const base::string16 & url,bool * ignore_navigation)97 void AwContentsMessageFilter::OnShouldOverrideUrlLoading(
98     int render_frame_id,
99     const base::string16& url,
100     bool* ignore_navigation) {
101   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
102   *ignore_navigation = false;
103   AwContentsClientBridgeBase* client =
104       AwContentsClientBridgeBase::FromID(process_id_, render_frame_id);
105   if (client) {
106     *ignore_navigation = client->ShouldOverrideUrlLoading(url);
107   } else {
108     LOG(WARNING) << "Failed to find the associated render view host for url: "
109                  << url;
110   }
111 }
112 
OnSubFrameCreated(int parent_render_frame_id,int child_render_frame_id)113 void AwContentsMessageFilter::OnSubFrameCreated(int parent_render_frame_id,
114                                                 int child_render_frame_id) {
115   AwContentsIoThreadClient::SubFrameCreated(
116       process_id_, parent_render_frame_id, child_render_frame_id);
117 }
118 
119 class AwAccessTokenStore : public content::AccessTokenStore {
120  public:
AwAccessTokenStore()121   AwAccessTokenStore() { }
122 
123   // content::AccessTokenStore implementation
LoadAccessTokens(const LoadAccessTokensCallbackType & request)124   virtual void LoadAccessTokens(
125       const LoadAccessTokensCallbackType& request) OVERRIDE {
126     AccessTokenStore::AccessTokenSet access_token_set;
127     // AccessTokenSet and net::URLRequestContextGetter not used on Android,
128     // but Run needs to be called to finish the geolocation setup.
129     request.Run(access_token_set, NULL);
130   }
SaveAccessToken(const GURL & server_url,const base::string16 & access_token)131   virtual void SaveAccessToken(const GURL& server_url,
132                                const base::string16& access_token) OVERRIDE { }
133 
134  private:
~AwAccessTokenStore()135   virtual ~AwAccessTokenStore() { }
136 
137   DISALLOW_COPY_AND_ASSIGN(AwAccessTokenStore);
138 };
139 
CancelProtectedMediaIdentifierPermissionRequests(int render_process_id,int render_view_id,const GURL & origin)140 void CancelProtectedMediaIdentifierPermissionRequests(
141     int render_process_id,
142     int render_view_id,
143     const GURL& origin) {
144   AwBrowserPermissionRequestDelegate* delegate =
145       AwBrowserPermissionRequestDelegate::FromID(render_process_id,
146                                                  render_view_id);
147   if (delegate)
148     delegate->CancelProtectedMediaIdentifierPermissionRequests(origin);
149 }
150 
CancelGeolocationPermissionRequests(int render_process_id,int render_view_id,const GURL & origin)151 void CancelGeolocationPermissionRequests(
152     int render_process_id,
153     int render_view_id,
154     const GURL& origin) {
155   AwBrowserPermissionRequestDelegate* delegate =
156       AwBrowserPermissionRequestDelegate::FromID(render_process_id,
157                                                  render_view_id);
158   if (delegate)
159     delegate->CancelGeolocationPermissionRequests(origin);
160 }
161 
162 }  // namespace
163 
GetAcceptLangsImpl()164 std::string AwContentBrowserClient::GetAcceptLangsImpl() {
165   // Start with the currnet locale.
166   std::string langs = l10n_util::GetDefaultLocale();
167 
168   // If we're not en-US, add in en-US which will be
169   // used with a lower q-value.
170   if (StringToLowerASCII(langs) != "en-us") {
171     langs += ",en-US";
172   }
173   return langs;
174 }
175 
GetAwBrowserContext()176 AwBrowserContext* AwContentBrowserClient::GetAwBrowserContext() {
177   return AwBrowserContext::GetDefault();
178 }
179 
AwContentBrowserClient(JniDependencyFactory * native_factory)180 AwContentBrowserClient::AwContentBrowserClient(
181     JniDependencyFactory* native_factory)
182     : native_factory_(native_factory) {
183   base::FilePath user_data_dir;
184   if (!PathService::Get(base::DIR_ANDROID_APP_DATA, &user_data_dir)) {
185     NOTREACHED() << "Failed to get app data directory for Android WebView";
186   }
187   browser_context_.reset(
188       new AwBrowserContext(user_data_dir, native_factory_));
189 }
190 
~AwContentBrowserClient()191 AwContentBrowserClient::~AwContentBrowserClient() {
192 }
193 
AddCertificate(net::CertificateMimeType cert_type,const void * cert_data,size_t cert_size,int render_process_id,int render_frame_id)194 void AwContentBrowserClient::AddCertificate(net::CertificateMimeType cert_type,
195                                             const void* cert_data,
196                                             size_t cert_size,
197                                             int render_process_id,
198                                             int render_frame_id) {
199   if (cert_size > 0)
200     net::android::StoreCertificate(cert_type, cert_data, cert_size);
201 }
202 
CreateBrowserMainParts(const content::MainFunctionParams & parameters)203 content::BrowserMainParts* AwContentBrowserClient::CreateBrowserMainParts(
204     const content::MainFunctionParams& parameters) {
205   return new AwBrowserMainParts(browser_context_.get());
206 }
207 
208 content::WebContentsViewDelegate*
GetWebContentsViewDelegate(content::WebContents * web_contents)209 AwContentBrowserClient::GetWebContentsViewDelegate(
210     content::WebContents* web_contents) {
211   return native_factory_->CreateViewDelegate(web_contents);
212 }
213 
RenderProcessWillLaunch(content::RenderProcessHost * host)214 void AwContentBrowserClient::RenderProcessWillLaunch(
215     content::RenderProcessHost* host) {
216   // If WebView becomes multi-process capable, this may be insecure.
217   // More benefit can be derived from the ChildProcessSecurotyPolicy by
218   // deferring the GrantScheme calls until we know that a given child process
219   // really does need that priviledge. Check here to ensure we rethink this
220   // when the time comes. See crbug.com/156062.
221   CHECK(content::RenderProcessHost::run_renderer_in_process());
222 
223   // Grant content: and file: scheme to the whole process, since we impose
224   // per-view access checks.
225   content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme(
226       host->GetID(), android_webview::kContentScheme);
227   content::ChildProcessSecurityPolicy::GetInstance()->GrantScheme(
228       host->GetID(), url::kFileScheme);
229 
230   host->AddFilter(new AwContentsMessageFilter(host->GetID()));
231   host->AddFilter(new cdm::CdmMessageFilterAndroid());
232 }
233 
CreateRequestContext(content::BrowserContext * browser_context,content::ProtocolHandlerMap * protocol_handlers,content::URLRequestInterceptorScopedVector request_interceptors)234 net::URLRequestContextGetter* AwContentBrowserClient::CreateRequestContext(
235     content::BrowserContext* browser_context,
236     content::ProtocolHandlerMap* protocol_handlers,
237     content::URLRequestInterceptorScopedVector request_interceptors) {
238   DCHECK(browser_context_.get() == browser_context);
239   return browser_context_->CreateRequestContext(protocol_handlers,
240                                                 request_interceptors.Pass());
241 }
242 
243 net::URLRequestContextGetter*
CreateRequestContextForStoragePartition(content::BrowserContext * browser_context,const base::FilePath & partition_path,bool in_memory,content::ProtocolHandlerMap * protocol_handlers,content::URLRequestInterceptorScopedVector request_interceptors)244 AwContentBrowserClient::CreateRequestContextForStoragePartition(
245     content::BrowserContext* browser_context,
246     const base::FilePath& partition_path,
247     bool in_memory,
248     content::ProtocolHandlerMap* protocol_handlers,
249     content::URLRequestInterceptorScopedVector request_interceptors) {
250   DCHECK(browser_context_.get() == browser_context);
251   // TODO(mkosiba,kinuko): request_interceptors should be hooked up in the
252   // downstream. (crbug.com/350286)
253   return browser_context_->CreateRequestContextForStoragePartition(
254       partition_path, in_memory, protocol_handlers,
255       request_interceptors.Pass());
256 }
257 
GetCanonicalEncodingNameByAliasName(const std::string & alias_name)258 std::string AwContentBrowserClient::GetCanonicalEncodingNameByAliasName(
259     const std::string& alias_name) {
260   return alias_name;
261 }
262 
AppendExtraCommandLineSwitches(base::CommandLine * command_line,int child_process_id)263 void AwContentBrowserClient::AppendExtraCommandLineSwitches(
264     base::CommandLine* command_line,
265     int child_process_id) {
266   NOTREACHED() << "Android WebView does not support multi-process yet";
267 }
268 
GetApplicationLocale()269 std::string AwContentBrowserClient::GetApplicationLocale() {
270   return l10n_util::GetDefaultLocale();
271 }
272 
GetAcceptLangs(content::BrowserContext * context)273 std::string AwContentBrowserClient::GetAcceptLangs(
274     content::BrowserContext* context) {
275   return GetAcceptLangsImpl();
276 }
277 
GetDefaultFavicon()278 const gfx::ImageSkia* AwContentBrowserClient::GetDefaultFavicon() {
279   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
280   // TODO(boliu): Bundle our own default favicon?
281   return rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON);
282 }
283 
AllowAppCache(const GURL & manifest_url,const GURL & first_party,content::ResourceContext * context)284 bool AwContentBrowserClient::AllowAppCache(const GURL& manifest_url,
285                            const GURL& first_party,
286                            content::ResourceContext* context) {
287   // WebView doesn't have a per-site policy for locally stored data,
288   // instead AppCache can be disabled for individual WebViews.
289   return true;
290 }
291 
292 
AllowGetCookie(const GURL & url,const GURL & first_party,const net::CookieList & cookie_list,content::ResourceContext * context,int render_process_id,int render_frame_id)293 bool AwContentBrowserClient::AllowGetCookie(const GURL& url,
294                                             const GURL& first_party,
295                                             const net::CookieList& cookie_list,
296                                             content::ResourceContext* context,
297                                             int render_process_id,
298                                             int render_frame_id) {
299   return AwCookieAccessPolicy::GetInstance()->AllowGetCookie(url,
300                                                              first_party,
301                                                              cookie_list,
302                                                              context,
303                                                              render_process_id,
304                                                              render_frame_id);
305 }
306 
AllowSetCookie(const GURL & url,const GURL & first_party,const std::string & cookie_line,content::ResourceContext * context,int render_process_id,int render_frame_id,net::CookieOptions * options)307 bool AwContentBrowserClient::AllowSetCookie(const GURL& url,
308                                             const GURL& first_party,
309                                             const std::string& cookie_line,
310                                             content::ResourceContext* context,
311                                             int render_process_id,
312                                             int render_frame_id,
313                                             net::CookieOptions* options) {
314   return AwCookieAccessPolicy::GetInstance()->AllowSetCookie(url,
315                                                              first_party,
316                                                              cookie_line,
317                                                              context,
318                                                              render_process_id,
319                                                              render_frame_id,
320                                                              options);
321 }
322 
AllowWorkerDatabase(const GURL & url,const base::string16 & name,const base::string16 & display_name,unsigned long estimated_size,content::ResourceContext * context,const std::vector<std::pair<int,int>> & render_frames)323 bool AwContentBrowserClient::AllowWorkerDatabase(
324     const GURL& url,
325     const base::string16& name,
326     const base::string16& display_name,
327     unsigned long estimated_size,
328     content::ResourceContext* context,
329     const std::vector<std::pair<int, int> >& render_frames) {
330   // Android WebView does not yet support web workers.
331   return false;
332 }
333 
AllowWorkerFileSystem(const GURL & url,content::ResourceContext * context,const std::vector<std::pair<int,int>> & render_frames)334 bool AwContentBrowserClient::AllowWorkerFileSystem(
335     const GURL& url,
336     content::ResourceContext* context,
337     const std::vector<std::pair<int, int> >& render_frames) {
338   // Android WebView does not yet support web workers.
339   return false;
340 }
341 
AllowWorkerIndexedDB(const GURL & url,const base::string16 & name,content::ResourceContext * context,const std::vector<std::pair<int,int>> & render_frames)342 bool AwContentBrowserClient::AllowWorkerIndexedDB(
343     const GURL& url,
344     const base::string16& name,
345     content::ResourceContext* context,
346     const std::vector<std::pair<int, int> >& render_frames) {
347   // Android WebView does not yet support web workers.
348   return false;
349 }
350 
351 content::QuotaPermissionContext*
CreateQuotaPermissionContext()352 AwContentBrowserClient::CreateQuotaPermissionContext() {
353   return new AwQuotaPermissionContext;
354 }
355 
AllowCertificateError(int render_process_id,int render_frame_id,int cert_error,const net::SSLInfo & ssl_info,const GURL & request_url,ResourceType::Type resource_type,bool overridable,bool strict_enforcement,const base::Callback<void (bool)> & callback,content::CertificateRequestResultType * result)356 void AwContentBrowserClient::AllowCertificateError(
357     int render_process_id,
358     int render_frame_id,
359     int cert_error,
360     const net::SSLInfo& ssl_info,
361     const GURL& request_url,
362     ResourceType::Type resource_type,
363     bool overridable,
364     bool strict_enforcement,
365     const base::Callback<void(bool)>& callback,
366     content::CertificateRequestResultType* result) {
367   AwContentsClientBridgeBase* client =
368       AwContentsClientBridgeBase::FromID(render_process_id, render_frame_id);
369   bool cancel_request = true;
370   if (client)
371     client->AllowCertificateError(cert_error,
372                                   ssl_info.cert.get(),
373                                   request_url,
374                                   callback,
375                                   &cancel_request);
376   if (cancel_request)
377     *result = content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY;
378 }
379 
SelectClientCertificate(int render_process_id,int render_frame_id,const net::HttpNetworkSession * network_session,net::SSLCertRequestInfo * cert_request_info,const base::Callback<void (net::X509Certificate *)> & callback)380 void AwContentBrowserClient::SelectClientCertificate(
381       int render_process_id,
382       int render_frame_id,
383       const net::HttpNetworkSession* network_session,
384       net::SSLCertRequestInfo* cert_request_info,
385       const base::Callback<void(net::X509Certificate*)>& callback) {
386   AwContentsClientBridgeBase* client =
387       AwContentsClientBridgeBase::FromID(render_process_id, render_frame_id);
388   if (client) {
389     client->SelectClientCertificate(cert_request_info, callback);
390   } else {
391     callback.Run(NULL);
392   }
393 }
394 
395 blink::WebNotificationPresenter::Permission
CheckDesktopNotificationPermission(const GURL & source_url,content::ResourceContext * context,int render_process_id)396     AwContentBrowserClient::CheckDesktopNotificationPermission(
397         const GURL& source_url,
398         content::ResourceContext* context,
399         int render_process_id) {
400   // Android WebView does not support notifications, so return Denied here.
401   return blink::WebNotificationPresenter::PermissionDenied;
402 }
403 
ShowDesktopNotification(const content::ShowDesktopNotificationHostMsgParams & params,content::RenderFrameHost * render_frame_host,content::DesktopNotificationDelegate * delegate,base::Closure * cancel_callback)404 void AwContentBrowserClient::ShowDesktopNotification(
405     const content::ShowDesktopNotificationHostMsgParams& params,
406     content::RenderFrameHost* render_frame_host,
407     content::DesktopNotificationDelegate* delegate,
408     base::Closure* cancel_callback) {
409   NOTREACHED() << "Android WebView does not support desktop notifications.";
410 }
411 
RequestGeolocationPermission(content::WebContents * web_contents,int bridge_id,const GURL & requesting_frame,bool user_gesture,base::Callback<void (bool)> result_callback,base::Closure * cancel_callback)412 void AwContentBrowserClient::RequestGeolocationPermission(
413     content::WebContents* web_contents,
414     int bridge_id,
415     const GURL& requesting_frame,
416     bool user_gesture,
417     base::Callback<void(bool)> result_callback,
418     base::Closure* cancel_callback) {
419   int render_process_id = web_contents->GetRenderProcessHost()->GetID();
420   int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
421   AwBrowserPermissionRequestDelegate* delegate =
422       AwBrowserPermissionRequestDelegate::FromID(render_process_id,
423                                                  render_view_id);
424   if (delegate == NULL) {
425     DVLOG(0) << "Dropping GeolocationPermission request";
426     result_callback.Run(false);
427     return;
428   }
429 
430   GURL origin = requesting_frame.GetOrigin();
431   if (cancel_callback) {
432     *cancel_callback = base::Bind(
433         CancelGeolocationPermissionRequests, render_process_id, render_view_id,
434         origin);
435   }
436   delegate->RequestGeolocationPermission(origin, result_callback);
437 }
438 
RequestMidiSysExPermission(content::WebContents * web_contents,int bridge_id,const GURL & requesting_frame,bool user_gesture,base::Callback<void (bool)> result_callback,base::Closure * cancel_callback)439 void AwContentBrowserClient::RequestMidiSysExPermission(
440     content::WebContents* web_contents,
441     int bridge_id,
442     const GURL& requesting_frame,
443     bool user_gesture,
444     base::Callback<void(bool)> result_callback,
445     base::Closure* cancel_callback) {
446   // TODO(toyoshim): Android WebView is not supported yet.
447   // See http://crbug.com/339767.
448   result_callback.Run(false);
449 }
450 
RequestProtectedMediaIdentifierPermission(content::WebContents * web_contents,const GURL & origin,base::Callback<void (bool)> result_callback,base::Closure * cancel_callback)451 void AwContentBrowserClient::RequestProtectedMediaIdentifierPermission(
452     content::WebContents* web_contents,
453     const GURL& origin,
454     base::Callback<void(bool)> result_callback,
455     base::Closure* cancel_callback) {
456   int render_process_id = web_contents->GetRenderProcessHost()->GetID();
457   int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
458   AwBrowserPermissionRequestDelegate* delegate =
459       AwBrowserPermissionRequestDelegate::FromID(render_process_id,
460                                                  render_view_id);
461   if (delegate == NULL) {
462     DVLOG(0) << "Dropping ProtectedMediaIdentifierPermission request";
463     result_callback.Run(false);
464     return;
465   }
466 
467   if (cancel_callback) {
468     *cancel_callback = base::Bind(
469         CancelProtectedMediaIdentifierPermissionRequests,
470         render_process_id, render_view_id, origin);
471   }
472   delegate->RequestProtectedMediaIdentifierPermission(origin, result_callback);
473 }
474 
CanCreateWindow(const GURL & opener_url,const GURL & opener_top_level_frame_url,const GURL & source_origin,WindowContainerType container_type,const GURL & target_url,const content::Referrer & referrer,WindowOpenDisposition disposition,const blink::WebWindowFeatures & features,bool user_gesture,bool opener_suppressed,content::ResourceContext * context,int render_process_id,int opener_id,bool * no_javascript_access)475 bool AwContentBrowserClient::CanCreateWindow(
476     const GURL& opener_url,
477     const GURL& opener_top_level_frame_url,
478     const GURL& source_origin,
479     WindowContainerType container_type,
480     const GURL& target_url,
481     const content::Referrer& referrer,
482     WindowOpenDisposition disposition,
483     const blink::WebWindowFeatures& features,
484     bool user_gesture,
485     bool opener_suppressed,
486     content::ResourceContext* context,
487     int render_process_id,
488     int opener_id,
489     bool* no_javascript_access) {
490   // We unconditionally allow popup windows at this stage and will give
491   // the embedder the opporunity to handle displaying of the popup in
492   // WebContentsDelegate::AddContents (via the
493   // AwContentsClient.onCreateWindow callback).
494   // Note that if the embedder has blocked support for creating popup
495   // windows through AwSettings, then we won't get to this point as
496   // the popup creation will have been blocked at the WebKit level.
497   if (no_javascript_access) {
498     *no_javascript_access = false;
499   }
500   return true;
501 }
502 
GetWorkerProcessTitle(const GURL & url,content::ResourceContext * context)503 std::string AwContentBrowserClient::GetWorkerProcessTitle(const GURL& url,
504                                           content::ResourceContext* context) {
505   NOTREACHED() << "Android WebView does not yet support web workers.";
506   return std::string();
507 }
508 
509 
ResourceDispatcherHostCreated()510 void AwContentBrowserClient::ResourceDispatcherHostCreated() {
511   AwResourceDispatcherHostDelegate::ResourceDispatcherHostCreated();
512 }
513 
GetNetLog()514 net::NetLog* AwContentBrowserClient::GetNetLog() {
515   // TODO(boliu): Implement AwNetLog.
516   return NULL;
517 }
518 
CreateAccessTokenStore()519 content::AccessTokenStore* AwContentBrowserClient::CreateAccessTokenStore() {
520   return new AwAccessTokenStore();
521 }
522 
IsFastShutdownPossible()523 bool AwContentBrowserClient::IsFastShutdownPossible() {
524   NOTREACHED() << "Android WebView is single process, so IsFastShutdownPossible"
525                << " should never be called";
526   return false;
527 }
528 
UpdateInspectorSetting(content::RenderViewHost * rvh,const std::string & key,const std::string & value)529 void AwContentBrowserClient::UpdateInspectorSetting(
530     content::RenderViewHost* rvh,
531     const std::string& key,
532     const std::string& value) {
533   // TODO(boliu): Implement persisting inspector settings.
534   NOTIMPLEMENTED();
535 }
536 
ClearCache(content::RenderViewHost * rvh)537 void AwContentBrowserClient::ClearCache(content::RenderViewHost* rvh) {
538   RemoveHttpDiskCache(rvh->GetProcess()->GetBrowserContext(),
539                       rvh->GetProcess()->GetID());
540 }
541 
ClearCookies(content::RenderViewHost * rvh)542 void AwContentBrowserClient::ClearCookies(content::RenderViewHost* rvh) {
543   // TODO(boliu): Implement.
544   NOTIMPLEMENTED();
545 }
546 
GetDefaultDownloadDirectory()547 base::FilePath AwContentBrowserClient::GetDefaultDownloadDirectory() {
548   // Android WebView does not currently use the Chromium downloads system.
549   // Download requests are cancelled immedately when recognized; see
550   // AwResourceDispatcherHost::CreateResourceHandlerForDownload. However the
551   // download system still tries to start up and calls this before recognizing
552   // the request has been cancelled.
553   return base::FilePath();
554 }
555 
GetDefaultDownloadName()556 std::string AwContentBrowserClient::GetDefaultDownloadName() {
557   NOTREACHED() << "Android WebView does not use chromium downloads";
558   return std::string();
559 }
560 
DidCreatePpapiPlugin(content::BrowserPpapiHost * browser_host)561 void AwContentBrowserClient::DidCreatePpapiPlugin(
562     content::BrowserPpapiHost* browser_host) {
563   NOTREACHED() << "Android WebView does not support plugins";
564 }
565 
AllowPepperSocketAPI(content::BrowserContext * browser_context,const GURL & url,bool private_api,const content::SocketPermissionRequest * params)566 bool AwContentBrowserClient::AllowPepperSocketAPI(
567     content::BrowserContext* browser_context,
568     const GURL& url,
569     bool private_api,
570     const content::SocketPermissionRequest* params) {
571   NOTREACHED() << "Android WebView does not support plugins";
572   return false;
573 }
574 
OverrideWebkitPrefs(content::RenderViewHost * rvh,const GURL & url,WebPreferences * web_prefs)575 void AwContentBrowserClient::OverrideWebkitPrefs(content::RenderViewHost* rvh,
576                                                  const GURL& url,
577                                                  WebPreferences* web_prefs) {
578   if (!preferences_populater_.get()) {
579     preferences_populater_ = make_scoped_ptr(native_factory_->
580         CreateWebPreferencesPopulater());
581   }
582   preferences_populater_->PopulateFor(
583       content::WebContents::FromRenderViewHost(rvh), web_prefs);
584 }
585 
586 #if defined(VIDEO_HOLE)
587 content::ExternalVideoSurfaceContainer*
OverrideCreateExternalVideoSurfaceContainer(content::WebContents * web_contents)588 AwContentBrowserClient::OverrideCreateExternalVideoSurfaceContainer(
589     content::WebContents* web_contents) {
590   return native_factory_->CreateExternalVideoSurfaceContainer(web_contents);
591 }
592 #endif
593 
594 }  // namespace android_webview
595