172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_local_storage_helper.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/in_process_webkit/webkit_context.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webkit_glue.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing WebKit::WebSecurityOrigin; 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowsingDataLocalStorageHelper::LocalStorageInfo::LocalStorageInfo() 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : port(0), 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size(0) { 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowsingDataLocalStorageHelper::LocalStorageInfo::LocalStorageInfo( 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& protocol, 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& host, 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen unsigned short port, 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& database_identifier, 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& origin, 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const FilePath& file_path, 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int64 size, 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Time last_modified) 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : protocol(protocol), 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host(host), 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen port(port), 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen database_identifier(database_identifier), 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen origin(origin), 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen file_path(file_path), 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size(size), 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen last_modified(last_modified) { 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBrowsingDataLocalStorageHelper::LocalStorageInfo::~LocalStorageInfo() {} 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowsingDataLocalStorageHelper::BrowsingDataLocalStorageHelper( 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : profile_(profile), 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_(NULL), 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_(false) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile_); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowsingDataLocalStorageHelper::~BrowsingDataLocalStorageHelper() { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::StartFetching( 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Callback1<const std::vector<LocalStorageInfo>& >::Type* callback) { 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!is_fetching_); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(callback); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_ = true; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(callback); 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::WEBKIT, FROM_HERE, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &BrowsingDataLocalStorageHelper:: 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FetchLocalStorageInfoInWebKitThread)); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::CancelNotification() { 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(NULL); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::DeleteLocalStorageFile( 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& file_path) { 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::WEBKIT, FROM_HERE, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &BrowsingDataLocalStorageHelper:: 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeleteLocalStorageFileInWebKitThread, 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path)); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::FetchLocalStorageInfoInWebKitThread() { 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::FileEnumerator file_enumerator( 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetWebKitContext()->data_path().Append( 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DOMStorageContext::kLocalStorageDirectory), 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false, file_util::FileEnumerator::FILES); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (FilePath file_path = file_enumerator.Next(); !file_path.empty(); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path = file_enumerator.Next()) { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (file_path.Extension() == DOMStorageContext::kLocalStorageExtension) { 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebSecurityOrigin web_security_origin = 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebSecurityOrigin::createFromDatabaseIdentifier( 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch webkit_glue::FilePathToWebString(file_path.BaseName())); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (EqualsASCII(web_security_origin.protocol(), 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chrome::kExtensionScheme)) { 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Extension state is not considered browsing data. 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch continue; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::PlatformFileInfo file_info; 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ret = file_util::GetFileInfo(file_path, &file_info); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ret) { 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch local_storage_info_.push_back(LocalStorageInfo( 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_security_origin.protocol().utf8(), 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_security_origin.host().utf8(), 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_security_origin.port(), 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_security_origin.databaseIdentifier().utf8(), 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch web_security_origin.toString().utf8(), 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path, 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_info.size, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_info.last_modified)); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, FROM_HERE, 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, &BrowsingDataLocalStorageHelper::NotifyInUIThread)); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::NotifyInUIThread() { 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(is_fetching_); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note: completion_callback_ mutates only in the UI thread, so it's safe to 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // test it here. 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (completion_callback_ != NULL) { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_->Run(local_storage_info_); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion_callback_.reset(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_fetching_ = false; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowsingDataLocalStorageHelper::DeleteLocalStorageFileInWebKitThread( 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& file_path) { 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_->GetWebKitContext()->dom_storage_context()->DeleteLocalStorageFile( 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCannedBrowsingDataLocalStorageHelper::CannedBrowsingDataLocalStorageHelper( 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : BrowsingDataLocalStorageHelper(profile), 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_(profile) { 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCannedBrowsingDataLocalStorageHelper* 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCannedBrowsingDataLocalStorageHelper::Clone() { 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CannedBrowsingDataLocalStorageHelper* clone = 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new CannedBrowsingDataLocalStorageHelper(profile_); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::AutoLock auto_lock(lock_); 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clone->pending_local_storage_info_ = pending_local_storage_info_; 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clone->local_storage_info_ = local_storage_info_; 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return clone; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataLocalStorageHelper::AddLocalStorage( 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& origin) { 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock auto_lock(lock_); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_local_storage_info_.push_back(origin); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataLocalStorageHelper::Reset() { 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock auto_lock(lock_); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch local_storage_info_.clear(); 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_local_storage_info_.clear(); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CannedBrowsingDataLocalStorageHelper::empty() const { 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock auto_lock(lock_); 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return local_storage_info_.empty() && pending_local_storage_info_.empty(); 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CannedBrowsingDataLocalStorageHelper::StartFetching( 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Callback1<const std::vector<LocalStorageInfo>& >::Type* callback) { 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(!is_fetching_); 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(callback); 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_fetching_ = true; 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen completion_callback_.reset(callback); 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::PostTask( 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::WEBKIT, FROM_HERE, 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NewRunnableMethod( 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &CannedBrowsingDataLocalStorageHelper:: 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ConvertPendingInfoInWebKitThread)); 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCannedBrowsingDataLocalStorageHelper::~CannedBrowsingDataLocalStorageHelper() {} 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CannedBrowsingDataLocalStorageHelper::ConvertPendingInfoInWebKitThread() { 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock auto_lock(lock_); 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (std::vector<GURL>::iterator info = pending_local_storage_info_.begin(); 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen info != pending_local_storage_info_.end(); ++info) { 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebSecurityOrigin web_security_origin = 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebSecurityOrigin::createFromString( 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UTF8ToUTF16(info->spec())); 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string security_origin(web_security_origin.toString().utf8()); 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool duplicate = false; 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (std::vector<LocalStorageInfo>::iterator 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen local_storage = local_storage_info_.begin(); 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen local_storage != local_storage_info_.end(); ++local_storage) { 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (local_storage->origin == security_origin) { 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen duplicate = true; 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (duplicate) 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen local_storage_info_.push_back(LocalStorageInfo( 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_security_origin.protocol().utf8(), 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_security_origin.host().utf8(), 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_security_origin.port(), 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_security_origin.databaseIdentifier().utf8(), 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen security_origin, 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_->GetWebKitContext()->dom_storage_context()-> 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetLocalStorageFilePath(web_security_origin.databaseIdentifier()), 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Time())); 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pending_local_storage_info_.clear(); 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::PostTask( 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::UI, FROM_HERE, 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NewRunnableMethod( 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this, &CannedBrowsingDataLocalStorageHelper::NotifyInUIThread)); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 239