text: // 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_);
  }
  