blob: 830aada8424b7a71de326f01dbdb60c7a13b0490 [file] [log] [blame]
[email protected]aa84a7e2012-03-15 21:29:061// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]c10da4b02010-03-25 14:38:322// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]d9ede582012-08-14 19:21:385#include "chrome/browser/extensions/data_deleter.h"
[email protected]c10da4b02010-03-25 14:38:326
[email protected]dc0b5a12011-10-14 00:06:137#include "base/bind.h"
[email protected]0d6ec3a72011-09-02 02:09:438#include "base/file_util.h"
[email protected]dc0b5a12011-10-14 00:06:139#include "chrome/browser/extensions/extension_service.h"
[email protected]0d9a2202011-11-09 13:48:4110#include "chrome/browser/extensions/settings/settings_frontend.h"
[email protected]aa84a7e2012-03-15 21:29:0611#include "chrome/browser/profiles/profile.h"
[email protected]0d6ec3a72011-09-02 02:09:4312#include "chrome/common/chrome_constants.h"
[email protected]c10da4b02010-03-25 14:38:3213#include "chrome/common/extensions/extension.h"
[email protected]2a80aee2011-10-07 16:06:0314#include "chrome/common/url_constants.h"
[email protected]35cc399e2012-02-23 18:19:2815#include "content/public/browser/dom_storage_context.h"
16#include "content/public/browser/indexed_db_context.h"
[email protected]314c3e22012-02-21 03:57:4217#include "content/public/browser/resource_context.h"
[email protected]00bbe1662011-12-22 02:25:2118#include "net/base/completion_callback.h"
[email protected]c10da4b02010-03-25 14:38:3219#include "net/base/net_errors.h"
[email protected]aa84a7e2012-03-15 21:29:0620#include "net/cookies/cookie_monster.h"
[email protected]277ec262011-03-30 21:09:4021#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3422#include "net/url_request/url_request_context_getter.h"
[email protected]314c3e22012-02-21 03:57:4223#include "webkit/appcache/appcache_service.h"
[email protected]04068382010-08-26 22:51:5424#include "webkit/database/database_tracker.h"
[email protected]397281f2011-02-14 05:15:5325#include "webkit/database/database_util.h"
26#include "webkit/fileapi/file_system_context.h"
[email protected]c10da4b02010-03-25 14:38:3227
[email protected]55eb70e762012-02-20 17:38:3928using content::BrowserContext;
[email protected]631bb742011-11-02 11:29:3929using content::BrowserThread;
[email protected]35cc399e2012-02-23 18:19:2830using content::DOMStorageContext;
31using content::IndexedDBContext;
[email protected]314c3e22012-02-21 03:57:4232using content::ResourceContext;
[email protected]631bb742011-11-02 11:29:3933
[email protected]d9ede582012-08-14 19:21:3834namespace extensions {
35
[email protected]123f2742011-12-02 04:26:5236// static
[email protected]d9ede582012-08-14 19:21:3837void DataDeleter::StartDeleting(Profile* profile,
38 const std::string& extension_id,
39 const GURL& storage_origin,
40 bool is_storage_isolated) {
[email protected]dc0b5a12011-10-14 00:06:1341 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
[email protected]c10da4b02010-03-25 14:38:3242 DCHECK(profile);
[email protected]d9ede582012-08-14 19:21:3843 scoped_refptr<DataDeleter> deleter = new DataDeleter(
44 profile, extension_id, storage_origin, is_storage_isolated);
[email protected]dc0b5a12011-10-14 00:06:1345
46 BrowserThread::PostTask(
47 BrowserThread::IO, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3848 base::Bind(&DataDeleter::DeleteCookiesOnIOThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1349
[email protected]d7c7c98a2012-07-12 21:27:4450 BrowserContext::GetDefaultDOMStorageContext(profile)->DeleteOrigin(
51 storage_origin);
[email protected]dc0b5a12011-10-14 00:06:1352
53 BrowserThread::PostTask(
[email protected]e1dd5622011-12-20 12:28:5854 BrowserThread::WEBKIT_DEPRECATED, FROM_HERE,
[email protected]dc0b5a12011-10-14 00:06:1355 base::Bind(
[email protected]d9ede582012-08-14 19:21:3856 &DataDeleter::DeleteIndexedDBOnWebkitThread,
57 deleter,
[email protected]c1fff072012-02-24 23:38:1258 make_scoped_refptr(BrowserContext::GetIndexedDBContext(profile))));
[email protected]dc0b5a12011-10-14 00:06:1359
60 BrowserThread::PostTask(
61 BrowserThread::FILE, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3862 base::Bind(&DataDeleter::DeleteDatabaseOnFileThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1363
64 BrowserThread::PostTask(
65 BrowserThread::FILE, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3866 base::Bind(&DataDeleter::DeleteFileSystemOnFileThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1367
68 BrowserThread::PostTask(
69 BrowserThread::IO, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3870 base::Bind(&DataDeleter::DeleteAppcachesOnIOThread,
71 deleter,
72 profile->GetResourceContext()));
[email protected]dc0b5a12011-10-14 00:06:1373
[email protected]0d9a2202011-11-09 13:48:4174 profile->GetExtensionService()->settings_frontend()->
[email protected]27cc7332011-11-01 01:56:4375 DeleteStorageSoon(extension_id);
[email protected]dc0b5a12011-10-14 00:06:1376}
77
[email protected]d9ede582012-08-14 19:21:3878DataDeleter::DataDeleter(
[email protected]dc0b5a12011-10-14 00:06:1379 Profile* profile,
80 const std::string& extension_id,
81 const GURL& storage_origin,
82 bool is_storage_isolated)
83 : extension_id_(extension_id) {
[email protected]55eb70e762012-02-20 17:38:3984 database_tracker_ = BrowserContext::GetDatabaseTracker(profile);
[email protected]0d6ec3a72011-09-02 02:09:4385 // Pick the right request context depending on whether it's an extension,
86 // isolated app, or regular app.
87 if (storage_origin.SchemeIs(chrome::kExtensionScheme)) {
88 extension_request_context_ = profile->GetRequestContextForExtensions();
89 } else if (is_storage_isolated) {
90 extension_request_context_ =
91 profile->GetRequestContextForIsolatedApp(extension_id);
92 isolated_app_path_ = profile->GetPath().
93 Append(chrome::kIsolatedAppStateDirname).AppendASCII(extension_id);
94 } else {
95 extension_request_context_ = profile->GetRequestContext();
96 }
[email protected]55eb70e762012-02-20 17:38:3997 file_system_context_ = BrowserContext::GetFileSystemContext(profile);
[email protected]0d6ec3a72011-09-02 02:09:4398 storage_origin_ = storage_origin;
[email protected]c10da4b02010-03-25 14:38:3299 origin_id_ =
[email protected]0d6ec3a72011-09-02 02:09:43100 webkit_database::DatabaseUtil::GetOriginIdentifier(storage_origin_);
[email protected]c10da4b02010-03-25 14:38:32101}
102
[email protected]d9ede582012-08-14 19:21:38103DataDeleter::~DataDeleter() {
[email protected]04068382010-08-26 22:51:54104}
105
[email protected]d9ede582012-08-14 19:21:38106void DataDeleter::DeleteCookiesOnIOThread() {
[email protected]ca4b5fa32010-10-09 12:42:18107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]c10da4b02010-03-25 14:38:32108 net::CookieMonster* cookie_monster =
[email protected]277ec262011-03-30 21:09:40109 extension_request_context_->GetURLRequestContext()->cookie_store()->
[email protected]0d6ec3a72011-09-02 02:09:43110 GetCookieMonster();
[email protected]c10da4b02010-03-25 14:38:32111 if (cookie_monster)
[email protected]b9e48094d2011-07-20 14:27:13112 cookie_monster->DeleteAllForHostAsync(
[email protected]0d6ec3a72011-09-02 02:09:43113 storage_origin_, net::CookieMonster::DeleteCallback());
[email protected]c10da4b02010-03-25 14:38:32114}
115
[email protected]d9ede582012-08-14 19:21:38116void DataDeleter::DeleteDatabaseOnFileThread() {
[email protected]ca4b5fa32010-10-09 12:42:18117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]00bbe1662011-12-22 02:25:21118 int rv = database_tracker_->DeleteDataForOrigin(
119 origin_id_, net::CompletionCallback());
[email protected]c10da4b02010-03-25 14:38:32120 DCHECK(rv == net::OK || rv == net::ERR_IO_PENDING);
121}
122
[email protected]d9ede582012-08-14 19:21:38123void DataDeleter::DeleteIndexedDBOnWebkitThread(
[email protected]35cc399e2012-02-23 18:19:28124 scoped_refptr<IndexedDBContext> indexed_db_context) {
[email protected]e1dd5622011-12-20 12:28:58125 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
[email protected]35cc399e2012-02-23 18:19:28126 indexed_db_context->DeleteForOrigin(storage_origin_);
[email protected]e1dcf922010-11-22 19:12:12127}
[email protected]09a316022010-12-03 03:21:37128
[email protected]d9ede582012-08-14 19:21:38129void DataDeleter::DeleteFileSystemOnFileThread() {
[email protected]09a316022010-12-03 03:21:37130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]0d6ec3a72011-09-02 02:09:43131 file_system_context_->DeleteDataForOriginOnFileThread(storage_origin_);
132
133 // TODO(creis): The following call fails because the request context is still
134 // around, and holding open file handles in this directory.
135 // See http://crbug.com/85127
136 if (!isolated_app_path_.empty())
137 file_util::Delete(isolated_app_path_, true);
138}
139
[email protected]d9ede582012-08-14 19:21:38140void DataDeleter::DeleteAppcachesOnIOThread(ResourceContext* context) {
[email protected]0d6ec3a72011-09-02 02:09:43141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]314c3e22012-02-21 03:57:42142 ResourceContext::GetAppCacheService(context)->DeleteAppCachesForOrigin(
[email protected]123f2742011-12-02 04:26:52143 storage_origin_, net::CompletionCallback());
[email protected]09a316022010-12-03 03:21:37144}
[email protected]d9ede582012-08-14 19:21:38145
146} // namespace extensions