blob: 3812d70c07f3e86682155ec128cc52ece77691d1 [file] [log] [blame]
[email protected]277ec262011-03-30 21:09:401// Copyright (c) 2011 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
5#include "chrome/browser/extensions/extension_data_deleter.h"
6
[email protected]0d6ec3a72011-09-02 02:09:437#include "base/file_util.h"
[email protected]8ecad5e2010-12-02 21:18:338#include "chrome/browser/profiles/profile.h"
[email protected]0d6ec3a72011-09-02 02:09:439#include "chrome/common/chrome_constants.h"
[email protected]c10da4b02010-03-25 14:38:3210#include "chrome/common/extensions/extension.h"
[email protected]0d6ec3a72011-09-02 02:09:4311#include "content/browser/appcache/chrome_appcache_service.h"
[email protected]567812d2011-02-24 17:40:5012#include "content/browser/in_process_webkit/webkit_context.h"
[email protected]0d6ec3a72011-09-02 02:09:4313#include "content/common/url_constants.h"
[email protected]c10da4b02010-03-25 14:38:3214#include "net/base/cookie_monster.h"
15#include "net/base/net_errors.h"
[email protected]277ec262011-03-30 21:09:4016#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3417#include "net/url_request/url_request_context_getter.h"
[email protected]04068382010-08-26 22:51:5418#include "webkit/database/database_tracker.h"
[email protected]397281f2011-02-14 05:15:5319#include "webkit/database/database_util.h"
20#include "webkit/fileapi/file_system_context.h"
[email protected]c10da4b02010-03-25 14:38:3221
22ExtensionDataDeleter::ExtensionDataDeleter(Profile* profile,
[email protected]0d6ec3a72011-09-02 02:09:4323 const std::string& extension_id,
24 const GURL& storage_origin,
25 bool is_storage_isolated) {
[email protected]c10da4b02010-03-25 14:38:3226 DCHECK(profile);
[email protected]0d6ec3a72011-09-02 02:09:4327 appcache_service_ = profile->GetAppCacheService();
[email protected]c10da4b02010-03-25 14:38:3228 webkit_context_ = profile->GetWebKitContext();
29 database_tracker_ = profile->GetDatabaseTracker();
[email protected]0d6ec3a72011-09-02 02:09:4330 // Pick the right request context depending on whether it's an extension,
31 // isolated app, or regular app.
32 if (storage_origin.SchemeIs(chrome::kExtensionScheme)) {
33 extension_request_context_ = profile->GetRequestContextForExtensions();
34 } else if (is_storage_isolated) {
35 extension_request_context_ =
36 profile->GetRequestContextForIsolatedApp(extension_id);
37 isolated_app_path_ = profile->GetPath().
38 Append(chrome::kIsolatedAppStateDirname).AppendASCII(extension_id);
39 } else {
40 extension_request_context_ = profile->GetRequestContext();
41 }
[email protected]09a316022010-12-03 03:21:3742 file_system_context_ = profile->GetFileSystemContext();
[email protected]0d6ec3a72011-09-02 02:09:4343 storage_origin_ = storage_origin;
[email protected]c10da4b02010-03-25 14:38:3244 origin_id_ =
[email protected]0d6ec3a72011-09-02 02:09:4345 webkit_database::DatabaseUtil::GetOriginIdentifier(storage_origin_);
[email protected]c10da4b02010-03-25 14:38:3246}
47
[email protected]04068382010-08-26 22:51:5448ExtensionDataDeleter::~ExtensionDataDeleter() {
49}
50
[email protected]c10da4b02010-03-25 14:38:3251void ExtensionDataDeleter::StartDeleting() {
[email protected]ca4b5fa32010-10-09 12:42:1852 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
[email protected]9eaa18e2010-06-29 20:51:0153
[email protected]ca4b5fa32010-10-09 12:42:1854 BrowserThread::PostTask(
55 BrowserThread::IO, FROM_HERE,
[email protected]9eaa18e2010-06-29 20:51:0156 NewRunnableMethod(this, &ExtensionDataDeleter::DeleteCookiesOnIOThread));
57
[email protected]ca4b5fa32010-10-09 12:42:1858 BrowserThread::PostTask(
59 BrowserThread::WEBKIT, FROM_HERE,
[email protected]9eaa18e2010-06-29 20:51:0160 NewRunnableMethod(
61 this, &ExtensionDataDeleter::DeleteLocalStorageOnWebkitThread));
62
[email protected]ca4b5fa32010-10-09 12:42:1863 BrowserThread::PostTask(
[email protected]e1dcf922010-11-22 19:12:1264 BrowserThread::WEBKIT, FROM_HERE,
65 NewRunnableMethod(
66 this, &ExtensionDataDeleter::DeleteIndexedDBOnWebkitThread));
67
68 BrowserThread::PostTask(
[email protected]ca4b5fa32010-10-09 12:42:1869 BrowserThread::FILE, FROM_HERE,
[email protected]9eaa18e2010-06-29 20:51:0170 NewRunnableMethod(
71 this, &ExtensionDataDeleter::DeleteDatabaseOnFileThread));
[email protected]09a316022010-12-03 03:21:3772
73 BrowserThread::PostTask(
74 BrowserThread::FILE, FROM_HERE,
75 NewRunnableMethod(
76 this, &ExtensionDataDeleter::DeleteFileSystemOnFileThread));
[email protected]0d6ec3a72011-09-02 02:09:4377
78 BrowserThread::PostTask(
79 BrowserThread::IO, FROM_HERE,
80 NewRunnableMethod(
81 this, &ExtensionDataDeleter::DeleteAppcachesOnIOThread));
[email protected]9eaa18e2010-06-29 20:51:0182}
83
84void ExtensionDataDeleter::DeleteCookiesOnIOThread() {
[email protected]ca4b5fa32010-10-09 12:42:1885 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
[email protected]c10da4b02010-03-25 14:38:3286 net::CookieMonster* cookie_monster =
[email protected]277ec262011-03-30 21:09:4087 extension_request_context_->GetURLRequestContext()->cookie_store()->
[email protected]0d6ec3a72011-09-02 02:09:4388 GetCookieMonster();
[email protected]c10da4b02010-03-25 14:38:3289 if (cookie_monster)
[email protected]b9e48094d2011-07-20 14:27:1390 cookie_monster->DeleteAllForHostAsync(
[email protected]0d6ec3a72011-09-02 02:09:4391 storage_origin_, net::CookieMonster::DeleteCallback());
[email protected]c10da4b02010-03-25 14:38:3292}
93
94void ExtensionDataDeleter::DeleteDatabaseOnFileThread() {
[email protected]ca4b5fa32010-10-09 12:42:1895 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]c10da4b02010-03-25 14:38:3296 int rv = database_tracker_->DeleteDataForOrigin(origin_id_, NULL);
97 DCHECK(rv == net::OK || rv == net::ERR_IO_PENDING);
98}
99
100void ExtensionDataDeleter::DeleteLocalStorageOnWebkitThread() {
[email protected]ca4b5fa32010-10-09 12:42:18101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
[email protected]c10da4b02010-03-25 14:38:32102 webkit_context_->dom_storage_context()->DeleteLocalStorageForOrigin(
103 origin_id_);
104}
[email protected]e1dcf922010-11-22 19:12:12105
106void ExtensionDataDeleter::DeleteIndexedDBOnWebkitThread() {
107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
[email protected]682394a2011-08-05 23:53:15108 webkit_context_->indexed_db_context()->DeleteIndexedDBForOrigin(
[email protected]0d6ec3a72011-09-02 02:09:43109 storage_origin_);
[email protected]e1dcf922010-11-22 19:12:12110}
[email protected]09a316022010-12-03 03:21:37111
112void ExtensionDataDeleter::DeleteFileSystemOnFileThread() {
113 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]0d6ec3a72011-09-02 02:09:43114 file_system_context_->DeleteDataForOriginOnFileThread(storage_origin_);
115
116 // TODO(creis): The following call fails because the request context is still
117 // around, and holding open file handles in this directory.
118 // See http://crbug.com/85127
119 if (!isolated_app_path_.empty())
120 file_util::Delete(isolated_app_path_, true);
121}
122
123void ExtensionDataDeleter::DeleteAppcachesOnIOThread() {
124 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
125 appcache_service_->DeleteAppCachesForOrigin(storage_origin_, NULL);
[email protected]09a316022010-12-03 03:21:37126}