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