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

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) 2010 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"
(...skipping 25 matching lines...) Expand all
36 36
37 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {} 37 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {}
38 38
39 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() { 39 bool BrowsingDataDatabaseHelper::DatabaseInfo::IsFileSchemeData() {
40 return StartsWithASCII(origin_identifier, 40 return StartsWithASCII(origin_identifier,
41 std::string(chrome::kFileScheme), 41 std::string(chrome::kFileScheme),
42 true); 42 true);
43 } 43 }
44 44
45 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) 45 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile)
46 : tracker_(profile->GetDatabaseTracker()), 46 : completion_callback_(NULL),
47 completion_callback_(NULL), 47 is_fetching_(false),
48 is_fetching_(false) { 48 tracker_(profile->GetDatabaseTracker()) {
49 } 49 }
50 50
51 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { 51 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() {
52 } 52 }
53 53
54 void BrowsingDataDatabaseHelper::StartFetching( 54 void BrowsingDataDatabaseHelper::StartFetching(
55 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { 55 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
57 DCHECK(!is_fetching_); 57 DCHECK(!is_fetching_);
58 DCHECK(callback); 58 DCHECK(callback);
59 is_fetching_ = true; 59 is_fetching_ = true;
60 database_info_.clear(); 60 database_info_.clear();
61 completion_callback_.reset(callback); 61 completion_callback_.reset(callback);
62 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( 62 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
63 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread)); 63 this, &BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread));
64 } 64 }
65 65
66 void BrowsingDataDatabaseHelper::CancelNotification() { 66 void BrowsingDataDatabaseHelper::CancelNotification() {
67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
68 completion_callback_.reset(NULL); 68 completion_callback_.reset(NULL);
69 } 69 }
70 70
71 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, 71 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin,
72 const std::string& name) { 72 const std::string& name) {
73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
74 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, NewRunnableMethod( 74 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
75 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread, origin, 75 this, &BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread, origin,
76 name)); 76 name));
77 } 77 }
78 78
79 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInFileThread() { 79 void BrowsingDataDatabaseHelper::FetchDatabaseInfoInWebKitThread() {
80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
81 std::vector<webkit_database::OriginInfo> origins_info; 81 std::vector<webkit_database::OriginInfo> origins_info;
82 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { 82 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) {
83 for (std::vector<webkit_database::OriginInfo>::const_iterator ori = 83 for (std::vector<webkit_database::OriginInfo>::const_iterator ori =
84 origins_info.begin(); ori != origins_info.end(); ++ori) { 84 origins_info.begin(); ori != origins_info.end(); ++ori) {
85 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin())); 85 const std::string origin_identifier(UTF16ToUTF8(ori->GetOrigin()));
86 if (StartsWithASCII(origin_identifier, 86 if (StartsWithASCII(origin_identifier,
87 std::string(chrome::kExtensionScheme), 87 std::string(chrome::kExtensionScheme),
88 true)) { 88 true)) {
89 // Extension state is not considered browsing data. 89 // Extension state is not considered browsing data.
90 continue; 90 continue;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 // Note: completion_callback_ mutates only in the UI thread, so it's safe to 122 // Note: completion_callback_ mutates only in the UI thread, so it's safe to
123 // test it here. 123 // test it here.
124 if (completion_callback_ != NULL) { 124 if (completion_callback_ != NULL) {
125 completion_callback_->Run(database_info_); 125 completion_callback_->Run(database_info_);
126 completion_callback_.reset(); 126 completion_callback_.reset();
127 } 127 }
128 is_fetching_ = false; 128 is_fetching_ = false;
129 database_info_.clear(); 129 database_info_.clear();
130 } 130 }
131 131
132 void BrowsingDataDatabaseHelper::DeleteDatabaseInFileThread( 132 void BrowsingDataDatabaseHelper::DeleteDatabaseInWebKitThread(
133 const std::string& origin, 133 const std::string& origin,
134 const std::string& name) { 134 const std::string& name) {
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
136 if (!tracker_.get()) 136 if (!tracker_.get())
137 return; 137 return;
138 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL); 138 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), NULL);
139 } 139 }
140 140
141 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo() {}
142
143 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo(
144 const GURL& origin,
145 const std::string& name,
146 const std::string& description)
147 : origin(origin),
148 name(name),
149 description(description) {
150 }
151
152 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {}
153
141 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( 154 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper(
142 Profile* profile) 155 Profile* profile)
143 : BrowsingDataDatabaseHelper(profile) { 156 : BrowsingDataDatabaseHelper(profile) {
144 } 157 }
145 158
146 void CannedBrowsingDataDatabaseHelper::AddDatabase( 159 void CannedBrowsingDataDatabaseHelper::AddDatabase(
147 const GURL& origin, 160 const GURL& origin,
148 const std::string& name, 161 const std::string& name,
149 const std::string& description) { 162 const std::string& description) {
150 WebKit::WebSecurityOrigin web_security_origin = 163 base::AutoLock auto_lock(lock_);
151 WebKit::WebSecurityOrigin::createFromString( 164 pending_database_info_.push_back(PendingDatabaseInfo(
152 UTF8ToUTF16(origin.spec())); 165 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 } 166 }
172 167
173 void CannedBrowsingDataDatabaseHelper::Reset() { 168 void CannedBrowsingDataDatabaseHelper::Reset() {
169 base::AutoLock auto_lock(lock_);
174 database_info_.clear(); 170 database_info_.clear();
171 pending_database_info_.clear();
175 } 172 }
176 173
177 bool CannedBrowsingDataDatabaseHelper::empty() const { 174 bool CannedBrowsingDataDatabaseHelper::empty() const {
178 return database_info_.empty(); 175 base::AutoLock auto_lock(lock_);
176 return database_info_.empty() && pending_database_info_.empty();
179 } 177 }
180 178
181 void CannedBrowsingDataDatabaseHelper::StartFetching( 179 void CannedBrowsingDataDatabaseHelper::StartFetching(
182 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) { 180 Callback1<const std::vector<DatabaseInfo>& >::Type* callback) {
183 callback->Run(database_info_); 181 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
184 delete callback; 182 DCHECK(!is_fetching_);
183 DCHECK(callback);
184 is_fetching_ = true;
185 completion_callback_.reset(callback);
186 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE, NewRunnableMethod(
187 this, &CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread));
185 } 188 }
189
190 void CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() {
191 base::AutoLock auto_lock(lock_);
192 for (std::vector<PendingDatabaseInfo>::const_iterator
193 info = pending_database_info_.begin();
194 info != pending_database_info_.end(); ++info) {
195 WebKit::WebSecurityOrigin web_security_origin =
196 WebKit::WebSecurityOrigin::createFromString(
197 UTF8ToUTF16(info->origin.spec()));
198 std::string origin_identifier =
199 web_security_origin.databaseIdentifier().utf8();
200
201 bool duplicate = false;
202 for (std::vector<DatabaseInfo>::iterator database = database_info_.begin();
203 database != database_info_.end(); ++database) {
204 if (database->origin_identifier == origin_identifier &&
205 database->database_name == info->name) {
206 duplicate = true;
207 break;
208 }
209 }
210 if (duplicate)
211 continue;
212
213 database_info_.push_back(DatabaseInfo(
214 web_security_origin.host().utf8(),
Bernhard Bauer 2011/02/08 10:49:08 Nit: Indent by two spaces less?
215 info->name,
216 origin_identifier,
217 info->description,
218 web_security_origin.toString().utf8(),
219 0,
220 base::Time()));
221 }
222 pending_database_info_.clear();
223
224 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, NewRunnableMethod(
225 this, &CannedBrowsingDataDatabaseHelper::NotifyInUIThread));
226 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698