blob: 81f3d404c2ac4ed4106d53d0e87e8dc394a92d55 [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]4c3a23582012-08-18 08:54:3418#include "content/public/browser/storage_partition.h"
[email protected]00bbe1662011-12-22 02:25:2119#include "net/base/completion_callback.h"
[email protected]c10da4b02010-03-25 14:38:3220#include "net/base/net_errors.h"
[email protected]aa84a7e2012-03-15 21:29:0621#include "net/cookies/cookie_monster.h"
[email protected]277ec262011-03-30 21:09:4022#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3423#include "net/url_request/url_request_context_getter.h"
[email protected]314c3e22012-02-21 03:57:4224#include "webkit/appcache/appcache_service.h"
[email protected]04068382010-08-26 22:51:5425#include "webkit/database/database_tracker.h"
[email protected]397281f2011-02-14 05:15:5326#include "webkit/database/database_util.h"
27#include "webkit/fileapi/file_system_context.h"
[email protected]c10da4b02010-03-25 14:38:3228
[email protected]55eb70e762012-02-20 17:38:3929using content::BrowserContext;
[email protected]631bb742011-11-02 11:29:3930using content::BrowserThread;
[email protected]35cc399e2012-02-23 18:19:2831using content::DOMStorageContext;
32using content::IndexedDBContext;
[email protected]314c3e22012-02-21 03:57:4233using content::ResourceContext;
[email protected]631bb742011-11-02 11:29:3934
[email protected]d9ede582012-08-14 19:21:3835namespace extensions {
36
[email protected]123f2742011-12-02 04:26:5237// static
[email protected]d9ede582012-08-14 19:21:3838void DataDeleter::StartDeleting(Profile* profile,
39 const std::string& extension_id,
40 const GURL& storage_origin,
41 bool is_storage_isolated) {
[email protected]dc0b5a12011-10-14 00:06:1342 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
[email protected]c10da4b02010-03-25 14:38:3243 DCHECK(profile);
[email protected]d9ede582012-08-14 19:21:3844 scoped_refptr<DataDeleter> deleter = new DataDeleter(
45 profile, extension_id, storage_origin, is_storage_isolated);
[email protected]dc0b5a12011-10-14 00:06:1346
47 BrowserThread::PostTask(
48 BrowserThread::IO, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3849 base::Bind(&DataDeleter::DeleteCookiesOnIOThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1350
[email protected]4c3a23582012-08-18 08:54:3451 content::BrowserContext::GetDefaultStoragePartition(profile)->
52 GetDOMStorageContext()->DeleteOrigin(storage_origin);
[email protected]dc0b5a12011-10-14 00:06:1353
54 BrowserThread::PostTask(
[email protected]e1dd5622011-12-20 12:28:5855 BrowserThread::WEBKIT_DEPRECATED, FROM_HERE,
[email protected]dc0b5a12011-10-14 00:06:1356 base::Bind(
[email protected]d9ede582012-08-14 19:21:3857 &DataDeleter::DeleteIndexedDBOnWebkitThread,
58 deleter,
[email protected]c1fff072012-02-24 23:38:1259 make_scoped_refptr(BrowserContext::GetIndexedDBContext(profile))));
[email protected]dc0b5a12011-10-14 00:06:1360
61 BrowserThread::PostTask(
62 BrowserThread::FILE, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3863 base::Bind(&DataDeleter::DeleteDatabaseOnFileThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1364
65 BrowserThread::PostTask(
66 BrowserThread::FILE, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3867 base::Bind(&DataDeleter::DeleteFileSystemOnFileThread, deleter));
[email protected]dc0b5a12011-10-14 00:06:1368
69 BrowserThread::PostTask(
70 BrowserThread::IO, FROM_HERE,
[email protected]d9ede582012-08-14 19:21:3871 base::Bind(&DataDeleter::DeleteAppcachesOnIOThread,
72 deleter,
73 profile->GetResourceContext()));
[email protected]dc0b5a12011-10-14 00:06:1374
[email protected]0d9a2202011-11-09 13:48:4175 profile->GetExtensionService()->settings_frontend()->
[email protected]27cc7332011-11-01 01:56:4376 DeleteStorageSoon(extension_id);
[email protected]dc0b5a12011-10-14 00:06:1377}
78
[email protected]d9ede582012-08-14 19:21:3879DataDeleter::DataDeleter(
[email protected]dc0b5a12011-10-14 00:06:1380 Profile* profile,
81 const std::string& extension_id,
82 const GURL& storage_origin,
83 bool is_storage_isolated)
84 : extension_id_(extension_id) {
[email protected]55eb70e762012-02-20 17:38:3985 database_tracker_ = BrowserContext::GetDatabaseTracker(profile);
[email protected]0d6ec3a72011-09-02 02:09:4386 // Pick the right request context depending on whether it's an extension,
87 // isolated app, or regular app.
88 if (storage_origin.SchemeIs(chrome::kExtensionScheme)) {
89 extension_request_context_ = profile->GetRequestContextForExtensions();
90 } else if (is_storage_isolated) {
91 extension_request_context_ =
92 profile->GetRequestContextForIsolatedApp(extension_id);
93 isolated_app_path_ = profile->GetPath().
94 Append(chrome::kIsolatedAppStateDirname).AppendASCII(extension_id);
95 } else {
96 extension_request_context_ = profile->GetRequestContext();
97 }
[email protected]55eb70e762012-02-20 17:38:3998 file_system_context_ = BrowserContext::GetFileSystemContext(profile);
[email protected]0d6ec3a72011-09-02 02:09:4399 storage_origin_ = storage_origin;
[email protected]c10da4b02010-03-25 14:38:32100 origin_id_ =
[email protected]0d6ec3a72011-09-02 02:09:43101 webkit_database::DatabaseUtil::GetOriginIdentifier(storage_origin_);
[email protected]c10da4b02010-03-25 14:38:32102}
103
[email protected]d9ede582012-08-14 19:21:38104DataDeleter::~DataDeleter() {
[email protected]04068382010-08-26 22:51:54105}
106
[email protected]d9ede582012-08-14 19:21:38107void DataDeleter::DeleteCookiesOnIOThread() {
[email protected]ca4b5fa32010-10-09 12:42:18108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]c10da4b02010-03-25 14:38:32109 net::CookieMonster* cookie_monster =
[email protected]277ec262011-03-30 21:09:40110 extension_request_context_->GetURLRequestContext()->cookie_store()->
[email protected]0d6ec3a72011-09-02 02:09:43111 GetCookieMonster();
[email protected]c10da4b02010-03-25 14:38:32112 if (cookie_monster)
[email protected]b9e48094d2011-07-20 14:27:13113 cookie_monster->DeleteAllForHostAsync(
[email protected]0d6ec3a72011-09-02 02:09:43114 storage_origin_, net::CookieMonster::DeleteCallback());
[email protected]c10da4b02010-03-25 14:38:32115}
116
[email protected]d9ede582012-08-14 19:21:38117void DataDeleter::DeleteDatabaseOnFileThread() {
[email protected]ca4b5fa32010-10-09 12:42:18118 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]00bbe1662011-12-22 02:25:21119 int rv = database_tracker_->DeleteDataForOrigin(
120 origin_id_, net::CompletionCallback());
[email protected]c10da4b02010-03-25 14:38:32121 DCHECK(rv == net::OK || rv == net::ERR_IO_PENDING);
122}
123
[email protected]d9ede582012-08-14 19:21:38124void DataDeleter::DeleteIndexedDBOnWebkitThread(
[email protected]35cc399e2012-02-23 18:19:28125 scoped_refptr<IndexedDBContext> indexed_db_context) {
[email protected]e1dd5622011-12-20 12:28:58126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT_DEPRECATED));
[email protected]35cc399e2012-02-23 18:19:28127 indexed_db_context->DeleteForOrigin(storage_origin_);
[email protected]e1dcf922010-11-22 19:12:12128}
[email protected]09a316022010-12-03 03:21:37129
[email protected]d9ede582012-08-14 19:21:38130void DataDeleter::DeleteFileSystemOnFileThread() {
[email protected]09a316022010-12-03 03:21:37131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]0d6ec3a72011-09-02 02:09:43132 file_system_context_->DeleteDataForOriginOnFileThread(storage_origin_);
133
134 // TODO(creis): The following call fails because the request context is still
135 // around, and holding open file handles in this directory.
136 // See http://crbug.com/85127
137 if (!isolated_app_path_.empty())
138 file_util::Delete(isolated_app_path_, true);
139}
140
[email protected]d9ede582012-08-14 19:21:38141void DataDeleter::DeleteAppcachesOnIOThread(ResourceContext* context) {
[email protected]0d6ec3a72011-09-02 02:09:43142 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]314c3e22012-02-21 03:57:42143 ResourceContext::GetAppCacheService(context)->DeleteAppCachesForOrigin(
[email protected]123f2742011-12-02 04:26:52144 storage_origin_, net::CompletionCallback());
[email protected]09a316022010-12-03 03:21:37145}
[email protected]d9ede582012-08-14 19:21:38146
147} // namespace extensions