// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/extensions/extension_data_deleter.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/extension.h" #include "content/browser/in_process_webkit/webkit_context.h" #include "net/base/cookie_monster.h" #include "net/base/net_errors.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" #include "webkit/database/database_tracker.h" #include "webkit/database/database_util.h" #include "webkit/fileapi/file_system_context.h" ExtensionDataDeleter::ExtensionDataDeleter(Profile* profile, const GURL& extension_url) { DCHECK(profile); webkit_context_ = profile->GetWebKitContext(); database_tracker_ = profile->GetDatabaseTracker(); extension_request_context_ = profile->GetRequestContextForExtensions(); file_system_context_ = profile->GetFileSystemContext(); extension_url_ = extension_url; origin_id_ = webkit_database::DatabaseUtil::GetOriginIdentifier(extension_url_); } ExtensionDataDeleter::~ExtensionDataDeleter() { } void ExtensionDataDeleter::StartDeleting() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, NewRunnableMethod(this, &ExtensionDataDeleter::DeleteCookiesOnIOThread)); BrowserThread::PostTask( BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( this, &ExtensionDataDeleter::DeleteLocalStorageOnWebkitThread)); BrowserThread::PostTask( BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod( this, &ExtensionDataDeleter::DeleteIndexedDBOnWebkitThread)); BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, NewRunnableMethod( this, &ExtensionDataDeleter::DeleteDatabaseOnFileThread)); BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, NewRunnableMethod( this, &ExtensionDataDeleter::DeleteFileSystemOnFileThread)); } void ExtensionDataDeleter::DeleteCookiesOnIOThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); net::CookieMonster* cookie_monster = extension_request_context_->GetURLRequestContext()->cookie_store()-> GetCookieMonster(); if (cookie_monster) cookie_monster->DeleteAllForHost(extension_url_); } void ExtensionDataDeleter::DeleteDatabaseOnFileThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); int rv = database_tracker_->DeleteDataForOrigin(origin_id_, NULL); DCHECK(rv == net::OK || rv == net::ERR_IO_PENDING); } void ExtensionDataDeleter::DeleteLocalStorageOnWebkitThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); webkit_context_->dom_storage_context()->DeleteLocalStorageForOrigin( origin_id_); } void ExtensionDataDeleter::DeleteIndexedDBOnWebkitThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); webkit_context_->indexed_db_context()->DeleteIndexedDBForOrigin(origin_id_); } void ExtensionDataDeleter::DeleteFileSystemOnFileThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); file_system_context_->DeleteDataForOriginOnFileThread(extension_url_); }