OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/browsing_data_database_helper.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/callback.h" | |
9 #include "base/file_util.h" | |
10 #include "base/message_loop.h" | |
11 #include "base/utf_string_conversions.h" | |
12 #include "chrome/browser/browsing_data_helper.h" | |
13 #include "chrome/browser/profiles/profile.h" | |
14 #include "content/public/browser/browser_thread.h" | |
15 #include "net/base/completion_callback.h" | |
16 #include "net/base/net_errors.h" | |
17 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCString.h
" | |
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | |
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" | |
20 | |
21 using content::BrowserContext; | |
22 using content::BrowserThread; | |
23 using WebKit::WebSecurityOrigin; | |
24 | |
25 BrowsingDataDatabaseHelper::DatabaseInfo::DatabaseInfo( | |
26 const std::string& host, | |
27 const std::string& database_name, | |
28 const std::string& origin_identifier, | |
29 const std::string& description, | |
30 const std::string& origin, | |
31 int64 size, | |
32 base::Time last_modified) | |
33 : host(host), | |
34 database_name(database_name), | |
35 origin_identifier(origin_identifier), | |
36 description(description), | |
37 origin(origin), | |
38 size(size), | |
39 last_modified(last_modified) { | |
40 } | |
41 | |
42 BrowsingDataDatabaseHelper::DatabaseInfo::~DatabaseInfo() {} | |
43 | |
44 BrowsingDataDatabaseHelper::BrowsingDataDatabaseHelper(Profile* profile) | |
45 : is_fetching_(false), | |
46 tracker_(BrowserContext::GetDatabaseTracker(profile)) { | |
47 } | |
48 | |
49 BrowsingDataDatabaseHelper::~BrowsingDataDatabaseHelper() { | |
50 } | |
51 | |
52 void BrowsingDataDatabaseHelper::StartFetching( | |
53 const base::Callback<void(const std::list<DatabaseInfo>&)>& callback) { | |
54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
55 DCHECK(!is_fetching_); | |
56 DCHECK_EQ(false, callback.is_null()); | |
57 | |
58 is_fetching_ = true; | |
59 database_info_.clear(); | |
60 completion_callback_ = callback; | |
61 BrowserThread::PostTask( | |
62 BrowserThread::FILE, FROM_HERE, | |
63 base::Bind(&BrowsingDataDatabaseHelper::FetchDatabaseInfoOnFileThread, | |
64 this)); | |
65 } | |
66 | |
67 void BrowsingDataDatabaseHelper::DeleteDatabase(const std::string& origin, | |
68 const std::string& name) { | |
69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
70 BrowserThread::PostTask( | |
71 BrowserThread::FILE, FROM_HERE, | |
72 base::Bind(&BrowsingDataDatabaseHelper::DeleteDatabaseOnFileThread, this, | |
73 origin, name)); | |
74 } | |
75 | |
76 void BrowsingDataDatabaseHelper::FetchDatabaseInfoOnFileThread() { | |
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
78 std::vector<webkit_database::OriginInfo> origins_info; | |
79 if (tracker_.get() && tracker_->GetAllOriginsInfo(&origins_info)) { | |
80 for (std::vector<webkit_database::OriginInfo>::const_iterator ori = | |
81 origins_info.begin(); ori != origins_info.end(); ++ori) { | |
82 WebSecurityOrigin web_security_origin = | |
83 WebSecurityOrigin::createFromDatabaseIdentifier(ori->GetOrigin()); | |
84 GURL origin_url(web_security_origin.toString().utf8()); | |
85 if (!BrowsingDataHelper::HasWebScheme(origin_url)) { | |
86 // Non-websafe state is not considered browsing data. | |
87 continue; | |
88 } | |
89 std::vector<string16> databases; | |
90 ori->GetAllDatabaseNames(&databases); | |
91 for (std::vector<string16>::const_iterator db = databases.begin(); | |
92 db != databases.end(); ++db) { | |
93 FilePath file_path = tracker_->GetFullDBFilePath(ori->GetOrigin(), *db); | |
94 base::PlatformFileInfo file_info; | |
95 if (file_util::GetFileInfo(file_path, &file_info)) { | |
96 database_info_.push_back(DatabaseInfo( | |
97 web_security_origin.host().utf8(), | |
98 UTF16ToUTF8(*db), | |
99 UTF16ToUTF8(ori->GetOrigin()), | |
100 UTF16ToUTF8(ori->GetDatabaseDescription(*db)), | |
101 origin_url.spec(), | |
102 file_info.size, | |
103 file_info.last_modified)); | |
104 } | |
105 } | |
106 } | |
107 } | |
108 | |
109 BrowserThread::PostTask( | |
110 BrowserThread::UI, FROM_HERE, | |
111 base::Bind(&BrowsingDataDatabaseHelper::NotifyInUIThread, this)); | |
112 } | |
113 | |
114 void BrowsingDataDatabaseHelper::NotifyInUIThread() { | |
115 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
116 DCHECK(is_fetching_); | |
117 completion_callback_.Run(database_info_); | |
118 completion_callback_.Reset(); | |
119 is_fetching_ = false; | |
120 database_info_.clear(); | |
121 } | |
122 | |
123 void BrowsingDataDatabaseHelper::DeleteDatabaseOnFileThread( | |
124 const std::string& origin, | |
125 const std::string& name) { | |
126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
127 if (!tracker_.get()) | |
128 return; | |
129 tracker_->DeleteDatabase(UTF8ToUTF16(origin), UTF8ToUTF16(name), | |
130 net::CompletionCallback()); | |
131 } | |
132 | |
133 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::PendingDatabaseInfo( | |
134 const GURL& origin, | |
135 const std::string& name, | |
136 const std::string& description) | |
137 : origin(origin), | |
138 name(name), | |
139 description(description) { | |
140 } | |
141 | |
142 CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::~PendingDatabaseInfo() {} | |
143 | |
144 bool CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo::operator<( | |
145 const PendingDatabaseInfo& other) const { | |
146 if (origin == other.origin) | |
147 return name < other.name; | |
148 return origin < other.origin; | |
149 } | |
150 | |
151 CannedBrowsingDataDatabaseHelper::CannedBrowsingDataDatabaseHelper( | |
152 Profile* profile) | |
153 : BrowsingDataDatabaseHelper(profile), | |
154 profile_(profile) { | |
155 } | |
156 | |
157 CannedBrowsingDataDatabaseHelper* CannedBrowsingDataDatabaseHelper::Clone() { | |
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
159 CannedBrowsingDataDatabaseHelper* clone = | |
160 new CannedBrowsingDataDatabaseHelper(profile_); | |
161 | |
162 base::AutoLock auto_lock(lock_); | |
163 clone->pending_database_info_ = pending_database_info_; | |
164 return clone; | |
165 } | |
166 | |
167 void CannedBrowsingDataDatabaseHelper::AddDatabase( | |
168 const GURL& origin, | |
169 const std::string& name, | |
170 const std::string& description) { | |
171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
172 base::AutoLock auto_lock(lock_); | |
173 if (BrowsingDataHelper::HasWebScheme(origin)) { | |
174 pending_database_info_.insert(PendingDatabaseInfo( | |
175 origin, name, description)); | |
176 } | |
177 } | |
178 | |
179 void CannedBrowsingDataDatabaseHelper::Reset() { | |
180 base::AutoLock auto_lock(lock_); | |
181 pending_database_info_.clear(); | |
182 } | |
183 | |
184 bool CannedBrowsingDataDatabaseHelper::empty() const { | |
185 base::AutoLock auto_lock(lock_); | |
186 return pending_database_info_.empty(); | |
187 } | |
188 | |
189 size_t CannedBrowsingDataDatabaseHelper::GetDatabaseCount() const { | |
190 base::AutoLock auto_lock(lock_); | |
191 return pending_database_info_.size(); | |
192 } | |
193 | |
194 const std::set<CannedBrowsingDataDatabaseHelper::PendingDatabaseInfo>& | |
195 CannedBrowsingDataDatabaseHelper::GetPendingDatabaseInfo() { | |
196 return pending_database_info_; | |
197 } | |
198 | |
199 void CannedBrowsingDataDatabaseHelper::StartFetching( | |
200 const base::Callback<void(const std::list<DatabaseInfo>&)>& callback) { | |
201 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
202 DCHECK(!is_fetching_); | |
203 DCHECK_EQ(false, callback.is_null()); | |
204 | |
205 is_fetching_ = true; | |
206 completion_callback_ = callback; | |
207 BrowserThread::PostTask( | |
208 BrowserThread::WEBKIT_DEPRECATED, FROM_HERE, | |
209 base::Bind(&CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread, | |
210 this)); | |
211 } | |
212 | |
213 CannedBrowsingDataDatabaseHelper::~CannedBrowsingDataDatabaseHelper() {} | |
214 | |
215 void CannedBrowsingDataDatabaseHelper::ConvertInfoInWebKitThread() { | |
216 base::AutoLock auto_lock(lock_); | |
217 database_info_.clear(); | |
218 for (std::set<PendingDatabaseInfo>::const_iterator | |
219 info = pending_database_info_.begin(); | |
220 info != pending_database_info_.end(); ++info) { | |
221 WebSecurityOrigin web_security_origin = | |
222 WebSecurityOrigin::createFromString( | |
223 UTF8ToUTF16(info->origin.spec())); | |
224 std::string origin_identifier = | |
225 web_security_origin.databaseIdentifier().utf8(); | |
226 | |
227 database_info_.push_back(DatabaseInfo( | |
228 web_security_origin.host().utf8(), | |
229 info->name, | |
230 origin_identifier, | |
231 info->description, | |
232 web_security_origin.toString().utf8(), | |
233 0, | |
234 base::Time())); | |
235 } | |
236 | |
237 BrowserThread::PostTask( | |
238 BrowserThread::UI, FROM_HERE, | |
239 base::Bind(&CannedBrowsingDataDatabaseHelper::NotifyInUIThread, this)); | |
240 } | |
OLD | NEW |