15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_manager_impl.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/fileapi/chrome_blob_storage_context.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/indexed_db/indexed_db_context_impl.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_dispatcher_host_impl.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/browser/push_messaging_router.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/storage_partition_impl_map.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_host_impl.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/blob_handle.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/site_instance.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/channel_id_service.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/channel_id_store.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/database/database_tracker.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !OS_IOS 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::UserDataAdapter; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Only ~BrowserContext() is needed on iOS. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key names on BrowserContext. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDownloadManagerKeyName[] = "download_manager"; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kStorageParitionMapKeyName[] = "content_storage_partition_map"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS) 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMountPointsKey[] = "mount_points"; 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StoragePartitionImplMap* GetStoragePartitionMap( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserContext* browser_context) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoragePartitionImplMap* partition_map = 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<StoragePartitionImplMap*>( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context->GetUserData(kStorageParitionMapKeyName)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!partition_map) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_map = new StoragePartitionImplMap(browser_context); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context->SetUserData(kStorageParitionMapKeyName, partition_map); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return partition_map; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StoragePartition* GetStoragePartitionFromConfig( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserContext* browser_context, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& partition_domain, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& partition_name, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_memory) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StoragePartitionImplMap* partition_map = 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStoragePartitionMap(browser_context); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_context->IsOffTheRecord()) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_memory = true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return partition_map->Get(partition_domain, partition_name, in_memory); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SaveSessionStateOnIOThread( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<net::URLRequestContextGetter>& context_getter, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AppCacheServiceImpl* appcache_service) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContext* context = context_getter->GetURLRequestContext(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->cookie_store()->GetCookieMonster()-> 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetForceKeepSessionState(); 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context->channel_id_service()->GetChannelIDStore()-> 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetForceKeepSessionState(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) appcache_service->set_force_keep_session_state(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SaveSessionStateOnIndexedDBThread( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IndexedDBContextImpl> indexed_db_context) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indexed_db_context->SetForceKeepSessionState(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserContext::AsyncObliterateStoragePartition( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserContext* browser_context, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& site, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& on_gc_required) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStoragePartitionMap(browser_context)->AsyncObliterate(site, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_gc_required); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserContext::GarbageCollectStoragePartitions( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserContext* browser_context, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::hash_set<base::FilePath> > active_paths, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& done) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetStoragePartitionMap(browser_context)->GarbageCollect( 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_paths.Pass(), done); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadManager* BrowserContext::GetDownloadManager( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* context) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!context->GetUserData(kDownloadManagerKeyName)) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rdh); 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DownloadManager* download_manager = 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DownloadManagerImpl( 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetContentClient()->browser()->GetNetLog(), context); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->SetUserData( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDownloadManagerKeyName, 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) download_manager); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_manager->SetDelegate(context->GetDownloadManagerDelegate()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return static_cast<DownloadManager*>( 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context->GetUserData(kDownloadManagerKeyName)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::ExternalMountPoints* BrowserContext::GetMountPoints( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserContext* context) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure that these methods are called on the UI thread, except for 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unittests where a UI thread might not have been created. 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !BrowserThread::IsMessageLoopValid(BrowserThread::UI)); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context->GetUserData(kMountPointsKey)) { 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::ExternalMountPoints> mount_points = 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::ExternalMountPoints::CreateRefCounted(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->SetUserData( 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kMountPointsKey, 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new UserDataAdapter<storage::ExternalMountPoints>(mount_points.get())); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return UserDataAdapter<storage::ExternalMountPoints>::Get(context, 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) kMountPointsKey); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StoragePartition* BrowserContext::GetStoragePartition( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_domain; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_name; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_memory = false; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ajwong): After GetDefaultStoragePartition() is removed, get rid of 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this conditional and require that |site_instance| is non-NULL. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (site_instance) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetStoragePartitionConfigForSite( 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_context, site_instance->GetSiteURL(), true, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &partition_domain, &partition_name, &in_memory); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStoragePartitionFromConfig( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, partition_domain, partition_name, in_memory); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StoragePartition* BrowserContext::GetStoragePartitionForSite( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& site) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_domain; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partition_name; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_memory; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->browser()->GetStoragePartitionConfigForSite( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_context, site, true, &partition_domain, &partition_name, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &in_memory); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStoragePartitionFromConfig( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context, partition_domain, partition_name, in_memory); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserContext::ForEachStoragePartition( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StoragePartitionCallback& callback) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoragePartitionImplMap* partition_map = 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<StoragePartitionImplMap*>( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context->GetUserData(kStorageParitionMapKeyName)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!partition_map) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partition_map->ForEach(callback); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StoragePartition* BrowserContext::GetDefaultStoragePartition( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStoragePartition(browser_context, NULL); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BrowserContext::CreateMemoryBackedBlob(BrowserContext* browser_context, 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* data, size_t length, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const BlobCallback& callback) { 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ChromeBlobStorageContext* blob_context = 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ChromeBlobStorageContext::GetFor(browser_context); 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::PostTaskAndReplyWithResult( 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&ChromeBlobStorageContext::CreateMemoryBackedBlob, 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) make_scoped_refptr(blob_context), data, length), 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowserContext::DeliverPushMessage( 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BrowserContext* browser_context, 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& origin, 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 service_worker_registration_id, 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& data, 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Callback<void(PushMessagingStatus)>& callback) { 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PushMessagingRouter::DeliverMessage( 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_context, origin, service_worker_registration_id, data, callback); 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserContext::EnsureResourceContextInitialized(BrowserContext* context) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will be enough to tickle initialization of BrowserContext if 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary, which initializes ResourceContext. The reason we don't call 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceContext::InitializeResourceContext() directly here is that 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceContext initialization may call back into BrowserContext 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and when that call returns it'll end rewriting its UserData map. It will 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end up rewriting the same value but this still causes a race condition. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/115678. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultStoragePartition(context); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserContext::SaveSessionState(BrowserContext* browser_context) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultStoragePartition(browser_context)->GetDatabaseTracker()-> 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetForceKeepSessionState(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoragePartition* storage_partition = 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext::GetDefaultStoragePartition(browser_context); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SaveSessionStateOnIOThread, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_scoped_refptr(browser_context->GetRequestContext()), 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<AppCacheServiceImpl*>( 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) storage_partition->GetAppCacheService()))); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageContextWrapper* dom_storage_context_proxy = 257bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static_cast<DOMStorageContextWrapper*>( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_partition->GetDOMStorageContext()); 259bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch dom_storage_context_proxy->SetForceKeepSessionState(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexedDBContextImpl* indexed_db_context_impl = 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<IndexedDBContextImpl*>( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) storage_partition->GetIndexedDBContext()); 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // No task runner in unit tests. 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (indexed_db_context_impl->TaskRunner()) { 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch indexed_db_context_impl->TaskRunner()->PostTask( 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&SaveSessionStateOnIndexedDBThread, 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch make_scoped_refptr(indexed_db_context_impl))); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !OS_IOS 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserContext::~BrowserContext() { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUserData(kDownloadManagerKeyName)) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloadManager(this)->Shutdown(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 283