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