OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 } | |
OLD | NEW |