Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: chrome/browser/browsing_data_database_helper.cc

Issue 6246105: Only invoke WebKit methods in browsing data helpers on the WEBKIT thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/browsing_data_database_helper.h" 5 #include "chrome/browser/browsing_data_database_helper.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/browser_thread.h" 11 #include "chrome/browser/browser_thread.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h" 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCString.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
17 17
18 using WebKit::WebSecurityOrigin;
19
18 BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo() {} 20 BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo() {}
19 21
20 BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo( 22 BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo(
21 const std::string& host, 23 const std::string& host,
22 const std::string& database_name, 24 const std::string& database_name,
23 const std::string& origin_identifier, 25 const std::string& origin_identifier,
24 const std::string& description, 26 const std::string& description,
25 const std::string& origin, 27 const std::string& origin,
26 int64 size, 28 int64 size,
27 base::Time last_modified) 29 base::Time last_modified)
28 : host(host), 30 : host(host),
29 database_name(database_name), 31 database_name(database_name),
30 origin_identifier(origin_identifier), 32 origin_identifier(origin_identifier),
31 description(description), 33 description(description),
32 origin(origin), 34 origin(origin),
33 size(size), 35 size(size),
34 last_modified(last_modified) { 36 last_modified(last_modified) {
35 } 37 }
36 38
37 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {} 39 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {}
38 40
39 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() { 41 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() {
40 return StartsWithASCII(origin_identifier, 42 return StartsWithASCII(origin_identifier,
41 std::string(chrome::kFileScheme), 43 std::string(chrome::kFileScheme),
42 true); 44 true);
43 } 45 }
44 46
45 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) 47 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile)
46 : tracker_(profile->GetDatabaseTracker()), 48 : completion_callback_(NULL),
47 completion_callback_(NULL), 49 is_fetching_(false),
48 is_fetching_(false) { 50 tracker_(profile->GetDatabaseTracker()) {
49 } 51 }
50 52
51 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { 53 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() {
52 } 54 }
53 55
54 void BrowsingDataDatabaseHelper::StartFetching( 56 void BrowsingDataDatabaseHelper::StartFetching(
55 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { 57 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
57 DCHECK(!is_fetching_); 59 DCHECK(!is_fetching_);
58 DCHECK(callback); 60 DCHECK(callback);
59 is_fetching_ = true; 61 is_fetching_ = true;
60 database_info_.clear(); 62 database_info_.clear();
61 completion_callback_.reset(callback); 63 completion_callback_.reset(callback);
62 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( 64 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
63 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread)); 65 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread));
64 } 66 }
65 67
66 void BrowsingDataDatabaseHelper::CancelNotification() { 68 void BrowsingDataDatabaseHelper::CancelNotification() {
67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
68 completion_callback_.reset(NULL); 70 completion_callback_.reset(NULL);
69 } 71 }
70 72
71 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, 73 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin,
72 const std::string& name) { 74 const std::string& name) {
73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
74 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( 76 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
75 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread, origin, 77 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread, origin,
76 name)); 78 name));
77 } 79 }
78 80
79 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread() { 81 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread() {
80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 82 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
81 std::vector<webkit_database::OriginInfo> origins_info; 83 std::vector<webkit_database::OriginInfo> origins_info;
82 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { 84 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) {
83 for (std::vector<webkit_database::OriginInfo>::const_iterator ori = 85 for (std::vector<webkit_database::OriginInfo>::const_iterator ori =
84 origins_info.begin(); ori != origins_info.end(); ++ori) { 86 origins_info.begin(); ori != origins_info.end(); ++ori) {
85 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin())); 87 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin()));
86 if (StartsWithASCII(origin_identifier, 88 if (StartsWithASCII(origin_identifier,
87 std::string(chrome::kExtensionScheme), 89 std::string(chrome::kExtensionScheme),
88 true)) { 90 true)) {
89 // Extension state is not considered browsing data. 91 // Extension state is not considered browsing data.
90 continue; 92 continue;
91 } 93 }
92 WebKit::WebSecurityOrigin web_security_origin = 94 WebSecurityOrigin web_security_origin =
93 WebKit::WebSecurityOrigin::createFromDatabaseIdentifier( 95 WebSecurityOrigin::createFromDatabaseIdentifier(
94 ori->GetOrigin()); 96 ori->GetOrigin());
95 std::vector<string16> databases; 97 std::vector<string16> databases;
96 ori->GetAllDatabaseNames(&databases); 98 ori->GetAllDatabaseNames(&databases);
97 for (std::vector<string16>::const_iterator db = databases.begin(); 99 for (std::vector<string16>::const_iterator db = databases.begin();
98 db != databases.end(); ++db) { 100 db != databases.end(); ++db) {
99 FilePath file_path = tracker_->GetFullDBFilePath(ori->GetOrigin(), *db); 101 FilePath file_path = tracker_->GetFullDBFilePath(ori->GetOrigin(), *db);
100 base::PlatformFileInfo file_info; 102 base::PlatformFileInfo file_info;
101 if (file_util::GetFileInfo(file_path, &file_info)) { 103 if (file_util::GetFileInfo(file_path, &file_info)) {
102 database_info_.push_back(DatabaseInfo( 104 database_info_.push_back(DatabaseInfo(
103 web_security_origin.host().utf8(), 105 web_security_origin.host().utf8(),
(...skipping 18 matching lines...) Expand all
122 // Note: completion_callback_ mutates only in the UI thread, so it's safe to 124 // Note: completion_callback_ mutates only in the UI thread, so it's safe to
123 // test it here. 125 // test it here.
124 if (completion_callback_ != NULL) { 126 if (completion_callback_ != NULL) {
125 completion_callback_->Run(database_info_); 127 completion_callback_->Run(database_info_);
126 completion_callback_.reset(); 128 completion_callback_.reset();
127 } 129 }
128 is_fetching_ = false; 130 is_fetching_ = false;
129 database_info_.clear(); 131 database_info_.clear();
130 } 132 }
131 133
132 void BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread( 134 void BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread(
133 const std::string& origin, 135 const std::string& origin,
134 const std::string& name) { 136 const std::string& name) {
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
136 if (!tracker_.get()) 138 if (!tracker_.get())
137 return; 139 return;
138 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL); 140 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL);
139 } 141 }
140 142
143 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo() {}
144
145 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo(
146 const GURL& origin,
147 const std::string& name,
148 const std::string& description)
149 : origin(origin),
150 name(name),
151 description(description) {
152 }
153
154 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {}
155
141 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( 156 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper(
142 Profile* profile) 157 Profile* profile)
143 : BrowsingDataDatabaseHelper(profile) { 158 : BrowsingDataDatabaseHelper(profile) {
144 } 159 }
145 160
146 void CannedBrowsingDataDatabaseHelper::AddDatabase( 161 void CannedBrowsingDataDatabaseHelper::AddDatabase(
147 const GURL& origin, 162 const GURL& origin,
148 const std::string& name, 163 const std::string& name,
149 const std::string& description) { 164 const std::string& description) {
150 WebKit::WebSecurityOrigin web_security_origin = 165 base::AutoLock auto_lock(lock_);
151 WebKit::WebSecurityOrigin::createFromString( 166 pending_database_info_.push_back(PendingDatabaseInfo(
152 UTF8ToUTF16(origin.spec())); 167 origin, name, description));
153 std::string origin_identifier =
154 web_security_origin.databaseIdentifier().utf8();
155
156 for (std::vector<DatabaseInfo>::iterator database = database_info_.begin();
157 database != database_info_.end(); ++database) {
158 if (database->origin_identifier == origin_identifier &&
159 database->database_name == name)
160 return;
161 }
162
163 database_info_.push_back(DatabaseInfo(
164 web_security_origin.host().utf8(),
165 name,
166 origin_identifier,
167 description,
168 web_security_origin.toString().utf8(),
169 0,
170 base::Time()));
171 } 168 }
172 169
173 void CannedBrowsingDataDatabaseHelper::Reset() { 170 void CannedBrowsingDataDatabaseHelper::Reset() {
171 base::AutoLock auto_lock(lock_);
174 database_info_.clear(); 172 database_info_.clear();
173 pending_database_info_.clear();
175 } 174 }
176 175
177 bool CannedBrowsingDataDatabaseHelper::empty() const { 176 bool CannedBrowsingDataDatabaseHelper::empty() const {
178 return database_info_.empty(); 177 base::AutoLock auto_lock(lock_);
178 return database_info_.empty() && pending_database_info_.empty();
bulach 2011/02/22 22:34:01 nit: odd indent (sorry!)
179 } 179 }
180 180
181 void CannedBrowsingDataDatabaseHelper::StartFetching( 181 void CannedBrowsingDataDatabaseHelper::StartFetching(
182 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { 182 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
183 callback->Run(database_info_); 183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
184 delete callback; 184 DCHECK(!is_fetching_);
185 DCHECK(callback);
186 is_fetching_ = true;
187 completion_callback_.reset(callback);
188 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
189 this, &CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread));
185 } 190 }
191
192 void CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() {
193 base::AutoLock auto_lock(lock_);
bulach 2011/02/22 22:34:01 nit: you may want to put the this lock and the fol
194 for (std::vector<PendingDatabaseInfo>::const_iterator
195 info = pending_database_info_.begin();
196 info != pending_database_info_.end(); ++info) {
197 WebSecurityOrigin web_security_origin =
198 WebSecurityOrigin::createFromString(
199 UTF8ToUTF16(info->origin.spec()));
200 std::string origin_identifier =
201 web_security_origin.databaseIdentifier().utf8();
202
203 bool duplicate = false;
204 for (std::vector<DatabaseInfo>::iterator database = database_info_.begin();
205 database != database_info_.end(); ++database) {
206 if (database->origin_identifier == origin_identifier &&
207 database->database_name == info->name) {
208 duplicate = true;
209 break;
210 }
211 }
212 if (duplicate)
213 continue;
214
215 database_info_.push_back(DatabaseInfo(
216 web_security_origin.host().utf8(),
217 info->name,
218 origin_identifier,
219 info->description,
220 web_security_origin.toString().utf8(),
221 0,
222 base::Time()));
223 }
224 pending_database_info_.clear();
225
226 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
227 this, &CannedBrowsingDataDatabaseHelper::NotifyInUIThread));
228 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698