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_browser_context.h" 6 7 #include "android_webview/browser/aw_form_database_service.h" 8 #include "android_webview/browser/aw_pref_store.h" 9 #include "android_webview/browser/aw_quota_manager_bridge.h" 10 #include "android_webview/browser/aw_resource_context.h" 11 #include "android_webview/browser/jni_dependency_factory.h" 12 #include "android_webview/browser/net/aw_url_request_context_getter.h" 13 #include "android_webview/browser/net/init_native_callback.h" 14 #include "base/prefs/pref_registry_simple.h" 15 #include "base/prefs/pref_service.h" 16 #include "base/prefs/pref_service_factory.h" 17 #include "components/autofill/core/common/autofill_pref_names.h" 18 #include "components/user_prefs/user_prefs.h" 19 #include "components/visitedlink/browser/visitedlink_master.h" 20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/storage_partition.h" 22 #include "content/public/browser/web_contents.h" 23 #include "net/cookies/cookie_store.h" 24 25 using base::FilePath; 26 using content::BrowserThread; 27 28 namespace android_webview { 29 30 namespace { 31 32 // Shows notifications which correspond to PersistentPrefStore's reading errors. 33 void HandleReadError(PersistentPrefStore::PrefReadError error) { 34 } 35 36 AwBrowserContext* g_browser_context = NULL; 37 38 } // namespace 39 40 AwBrowserContext::AwBrowserContext( 41 const FilePath path, 42 JniDependencyFactory* native_factory) 43 : context_storage_path_(path), 44 native_factory_(native_factory) { 45 DCHECK(g_browser_context == NULL); 46 g_browser_context = this; 47 48 // This constructor is entered during the creation of ContentBrowserClient, 49 // before browser threads are created. Therefore any checks to enforce 50 // threading (such as BrowserThread::CurrentlyOn()) will fail here. 51 } 52 53 AwBrowserContext::~AwBrowserContext() { 54 DCHECK(g_browser_context == this); 55 g_browser_context = NULL; 56 } 57 58 // static 59 AwBrowserContext* AwBrowserContext::GetDefault() { 60 // TODO(joth): rather than store in a global here, lookup this instance 61 // from the Java-side peer. 62 return g_browser_context; 63 } 64 65 // static 66 AwBrowserContext* AwBrowserContext::FromWebContents( 67 content::WebContents* web_contents) { 68 // This is safe; this is the only implementation of the browser context. 69 return static_cast<AwBrowserContext*>(web_contents->GetBrowserContext()); 70 } 71 72 void AwBrowserContext::PreMainMessageLoopRun() { 73 cookie_store_ = CreateCookieStore(this); 74 url_request_context_getter_ = 75 new AwURLRequestContextGetter(GetPath(), cookie_store_.get()); 76 77 visitedlink_master_.reset( 78 new visitedlink::VisitedLinkMaster(this, this, false)); 79 visitedlink_master_->Init(); 80 81 form_database_service_.reset( 82 new AwFormDatabaseService(context_storage_path_)); 83 } 84 85 void AwBrowserContext::AddVisitedURLs(const std::vector<GURL>& urls) { 86 DCHECK(visitedlink_master_); 87 visitedlink_master_->AddURLs(urls); 88 } 89 90 net::URLRequestContextGetter* AwBrowserContext::CreateRequestContext( 91 content::ProtocolHandlerMap* protocol_handlers) { 92 // This function cannot actually create the request context because 93 // there is a reentrant dependency on GetResourceContext() via 94 // content::StoragePartitionImplMap::Create(). This is not fixable 95 // until http://crbug.com/159193. Until then, assert that the context 96 // has already been allocated and just handle setting the protocol_handlers. 97 DCHECK(url_request_context_getter_); 98 url_request_context_getter_->SetProtocolHandlers(protocol_handlers); 99 return url_request_context_getter_; 100 } 101 102 net::URLRequestContextGetter* 103 AwBrowserContext::CreateRequestContextForStoragePartition( 104 const base::FilePath& partition_path, 105 bool in_memory, 106 content::ProtocolHandlerMap* protocol_handlers) { 107 NOTREACHED(); 108 return NULL; 109 } 110 111 AwQuotaManagerBridge* AwBrowserContext::GetQuotaManagerBridge() { 112 if (!quota_manager_bridge_.get()) { 113 quota_manager_bridge_ = native_factory_->CreateAwQuotaManagerBridge(this); 114 } 115 return quota_manager_bridge_.get(); 116 } 117 118 AwFormDatabaseService* AwBrowserContext::GetFormDatabaseService() { 119 return form_database_service_.get(); 120 } 121 122 // Create user pref service for autofill functionality. 123 void AwBrowserContext::CreateUserPrefServiceIfNecessary() { 124 if (user_pref_service_) 125 return; 126 127 PrefRegistrySimple* pref_registry = new PrefRegistrySimple(); 128 // We only use the autocomplete feature of the Autofill, which is 129 // controlled via the manager_delegate. We don't use the rest 130 // of autofill, which is why it is hardcoded as disabled here. 131 pref_registry->RegisterBooleanPref( 132 autofill::prefs::kAutofillEnabled, false); 133 pref_registry->RegisterDoublePref( 134 autofill::prefs::kAutofillPositiveUploadRate, 0.0); 135 pref_registry->RegisterDoublePref( 136 autofill::prefs::kAutofillNegativeUploadRate, 0.0); 137 138 base::PrefServiceFactory pref_service_factory; 139 pref_service_factory.set_user_prefs(make_scoped_refptr(new AwPrefStore())); 140 pref_service_factory.set_read_error_callback(base::Bind(&HandleReadError)); 141 user_pref_service_ = pref_service_factory.Create(pref_registry).Pass(); 142 143 user_prefs::UserPrefs::Set(this, user_pref_service_.get()); 144 } 145 146 base::FilePath AwBrowserContext::GetPath() const { 147 return context_storage_path_; 148 } 149 150 bool AwBrowserContext::IsOffTheRecord() const { 151 // Android WebView does not support off the record profile yet. 152 return false; 153 } 154 155 net::URLRequestContextGetter* AwBrowserContext::GetRequestContext() { 156 return GetDefaultStoragePartition(this)->GetURLRequestContext(); 157 } 158 159 net::URLRequestContextGetter* 160 AwBrowserContext::GetRequestContextForRenderProcess( 161 int renderer_child_id) { 162 return GetRequestContext(); 163 } 164 165 net::URLRequestContextGetter* AwBrowserContext::GetMediaRequestContext() { 166 return GetRequestContext(); 167 } 168 169 void AwBrowserContext::RequestMIDISysExPermission( 170 int render_process_id, 171 int render_view_id, 172 int bridge_id, 173 const GURL& requesting_frame, 174 const MIDISysExPermissionCallback& callback) { 175 // TODO(toyoshim): Android is not supported yet. 176 callback.Run(false); 177 } 178 179 void AwBrowserContext::CancelMIDISysExPermissionRequest( 180 int render_process_id, 181 int render_view_id, 182 int bridge_id, 183 const GURL& requesting_frame) { 184 } 185 186 net::URLRequestContextGetter* 187 AwBrowserContext::GetMediaRequestContextForRenderProcess( 188 int renderer_child_id) { 189 return GetRequestContext(); 190 } 191 192 net::URLRequestContextGetter* 193 AwBrowserContext::GetMediaRequestContextForStoragePartition( 194 const base::FilePath& partition_path, 195 bool in_memory) { 196 NOTREACHED(); 197 return NULL; 198 } 199 200 content::ResourceContext* AwBrowserContext::GetResourceContext() { 201 if (!resource_context_) { 202 resource_context_.reset( 203 new AwResourceContext(url_request_context_getter_.get())); 204 } 205 return resource_context_.get(); 206 } 207 208 content::DownloadManagerDelegate* 209 AwBrowserContext::GetDownloadManagerDelegate() { 210 return &download_manager_delegate_; 211 } 212 213 content::GeolocationPermissionContext* 214 AwBrowserContext::GetGeolocationPermissionContext() { 215 if (!geolocation_permission_context_.get()) { 216 geolocation_permission_context_ = 217 native_factory_->CreateGeolocationPermission(this); 218 } 219 return geolocation_permission_context_.get(); 220 } 221 222 quota::SpecialStoragePolicy* AwBrowserContext::GetSpecialStoragePolicy() { 223 // Intentionally returning NULL as 'Extensions' and 'Apps' not supported. 224 return NULL; 225 } 226 227 void AwBrowserContext::RebuildTable( 228 const scoped_refptr<URLEnumerator>& enumerator) { 229 // Android WebView rebuilds from WebChromeClient.getVisitedHistory. The client 230 // can change in the lifetime of this WebView and may not yet be set here. 231 // Therefore this initialization path is not used. 232 enumerator->OnComplete(true); 233 } 234 235 } // namespace android_webview 236