Index: chrome/browser/browsing_data_local_storage_helper.cc |
=================================================================== |
--- chrome/browser/browsing_data_local_storage_helper.cc (revision 0) |
+++ chrome/browser/browsing_data_local_storage_helper.cc (revision 0) |
@@ -0,0 +1,125 @@ |
+// Copyright (c) 2009 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/browsing_data_local_storage_helper.h" |
+ |
+#include "base/file_util.h" |
+#include "base/message_loop.h" |
+#include "chrome/browser/chrome_thread.h" |
+#include "chrome/browser/in_process_webkit/webkit_context.h" |
+#include "chrome/browser/profile.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebSecurityOrigin.h" |
+#include "third_party/WebKit/WebKit/chromium/public/WebString.h" |
+#include "webkit/glue/glue_util.h" |
+#include "webkit/glue/webkit_glue.h" |
+ |
+BrowsingDataLocalStorageHelper::BrowsingDataLocalStorageHelper( |
+ Profile* profile) |
+ : profile_(profile), |
+ completion_callback_(NULL), |
+ is_fetching_(false) { |
+ DCHECK(profile_); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::StartFetching( |
+ Callback1<const std::vector<LocalStorageInfo>& >::Type* callback) { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ DCHECK(!is_fetching_); |
+ DCHECK(callback); |
+ is_fetching_ = true; |
+ completion_callback_.reset(callback); |
+ ChromeThread::PostTask( |
+ ChromeThread::WEBKIT, FROM_HERE, |
+ NewRunnableMethod( |
+ this, |
+ &BrowsingDataLocalStorageHelper:: |
+ FetchLocalStorageInfoInWebKitThread)); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::CancelNotification() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ completion_callback_.reset(NULL); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::DeleteLocalStorageFile( |
+ const FilePath& file_path) { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ ChromeThread::PostTask( |
+ ChromeThread::WEBKIT, FROM_HERE, |
+ NewRunnableMethod( |
+ this, |
+ &BrowsingDataLocalStorageHelper:: |
+ DeleteLocalStorageFileInWebKitThread, |
+ file_path)); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::DeleteAllLocalStorageFiles() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ ChromeThread::PostTask( |
+ ChromeThread::WEBKIT, FROM_HERE, |
+ NewRunnableMethod( |
+ this, |
+ &BrowsingDataLocalStorageHelper:: |
+ DeleteAllLocalStorageFilesInWebKitThread)); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::FetchLocalStorageInfoInWebKitThread() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
+ file_util::FileEnumerator file_enumerator( |
+ profile_->GetWebKitContext()->data_path().Append( |
+ DOMStorageContext::kLocalStorageDirectory), |
+ false, file_util::FileEnumerator::FILES); |
+ for (FilePath file_path = file_enumerator.Next(); !file_path.empty(); |
+ file_path = file_enumerator.Next()) { |
+ if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) { |
+ scoped_ptr<WebKit::WebSecurityOrigin> web_security_origin( |
+ WebKit::WebSecurityOrigin::createFromDatabaseIdentifier( |
+ webkit_glue::FilePathToWebString(file_path.BaseName()))); |
+ file_util::FileInfo file_info; |
+ bool ret = file_util::GetFileInfo(file_path, &file_info); |
+ if (ret) { |
+ local_storage_info_.push_back(LocalStorageInfo( |
+ webkit_glue::WebStringToStdString(web_security_origin->protocol()), |
+ webkit_glue::WebStringToStdString(web_security_origin->host()), |
+ web_security_origin->port(), |
+ webkit_glue::WebStringToStdString( |
+ web_security_origin->databaseIdentifier()), |
+ webkit_glue::WebStringToStdString( |
+ web_security_origin->toString()), |
+ file_path, |
+ file_info.size, |
+ file_info.last_modified)); |
+ } |
+ } |
+ } |
+ |
+ ChromeThread::PostTask( |
+ ChromeThread::UI, FROM_HERE, |
+ NewRunnableMethod( |
+ this, &BrowsingDataLocalStorageHelper::NotifyInUIThread)); |
+} |
+ |
+void BrowsingDataLocalStorageHelper::NotifyInUIThread() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
+ DCHECK(is_fetching_); |
+ // Note: completion_callback_ mutates only in the UI thread, so it's safe to |
+ // test it here. |
+ if (completion_callback_ != NULL) |
+ completion_callback_->Run(local_storage_info_); |
+ is_fetching_ = false; |
+} |
+ |
+void BrowsingDataLocalStorageHelper::DeleteLocalStorageFileInWebKitThread( |
+ const FilePath& file_path) { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
+ profile_->GetWebKitContext()->dom_storage_context()->DeleteLocalStorageFile( |
+ file_path); |
+} |
+ |
+void |
+ BrowsingDataLocalStorageHelper::DeleteAllLocalStorageFilesInWebKitThread() { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
+ profile_->GetWebKitContext()->dom_storage_context() |
+ ->DeleteAllLocalStorageFiles(); |
+} |