OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" | 5 #include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... | |
31 #include "ios/chrome/browser/ios_chrome_io_thread.h" | 31 #include "ios/chrome/browser/ios_chrome_io_thread.h" |
32 #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" | 32 #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" |
33 #include "ios/chrome/browser/search_engines/template_url_service_factory.h" | 33 #include "ios/chrome/browser/search_engines/template_url_service_factory.h" |
34 #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" | 34 #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" |
35 #include "ios/chrome/browser/web_data_service_factory.h" | 35 #include "ios/chrome/browser/web_data_service_factory.h" |
36 #include "ios/net/http_cache_helper.h" | 36 #include "ios/net/http_cache_helper.h" |
37 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" | 37 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" |
38 #include "ios/web/public/user_metrics.h" | 38 #include "ios/web/public/user_metrics.h" |
39 #include "ios/web/public/web_thread.h" | 39 #include "ios/web/public/web_thread.h" |
40 #include "net/base/net_errors.h" | 40 #include "net/base/net_errors.h" |
41 #include "net/cookies/canonical_cookie.h" | |
droger
2016/04/05 19:17:30
This may not be needed.
dmurph
2016/04/05 22:15:54
Done.
| |
41 #include "net/cookies/cookie_store.h" | 42 #include "net/cookies/cookie_store.h" |
42 #include "net/http/transport_security_state.h" | 43 #include "net/http/transport_security_state.h" |
43 #include "net/ssl/channel_id_service.h" | 44 #include "net/ssl/channel_id_service.h" |
44 #include "net/ssl/channel_id_store.h" | 45 #include "net/ssl/channel_id_store.h" |
45 #include "net/url_request/url_request_context.h" | 46 #include "net/url_request/url_request_context.h" |
46 #include "net/url_request/url_request_context_getter.h" | 47 #include "net/url_request/url_request_context_getter.h" |
47 | 48 |
48 using base::UserMetricsAction; | 49 using base::UserMetricsAction; |
49 using web::WebThread; | 50 using web::WebThread; |
50 | 51 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 DCHECK(AllDone()); | 120 DCHECK(AllDone()); |
120 } | 121 } |
121 | 122 |
122 // Static. | 123 // Static. |
123 void IOSChromeBrowsingDataRemover::set_removing(bool is_removing) { | 124 void IOSChromeBrowsingDataRemover::set_removing(bool is_removing) { |
124 DCHECK(is_removing_ != is_removing); | 125 DCHECK(is_removing_ != is_removing); |
125 is_removing_ = is_removing; | 126 is_removing_ = is_removing; |
126 } | 127 } |
127 | 128 |
128 void IOSChromeBrowsingDataRemover::Remove(int remove_mask) { | 129 void IOSChromeBrowsingDataRemover::Remove(int remove_mask) { |
129 RemoveImpl(remove_mask, GURL()); | 130 RemoveImpl(remove_mask); |
130 } | 131 } |
131 | 132 |
132 void IOSChromeBrowsingDataRemover::RemoveImpl(int remove_mask, | 133 void IOSChromeBrowsingDataRemover::RemoveImpl(int remove_mask) { |
133 const GURL& remove_url) { | |
134 DCHECK_CURRENTLY_ON(WebThread::UI); | 134 DCHECK_CURRENTLY_ON(WebThread::UI); |
135 set_removing(true); | 135 set_removing(true); |
136 remove_mask_ = remove_mask; | 136 remove_mask_ = remove_mask; |
137 | 137 |
138 // On other platforms, it is possible to specify different types of origins | 138 // On other platforms, it is possible to specify different types of origins |
139 // to clear data for (e.g., unprotected web vs. extensions). On iOS, this | 139 // to clear data for (e.g., unprotected web vs. extensions). On iOS, this |
140 // mask is always implicitly the unprotected web, which is the only type that | 140 // mask is always implicitly the unprotected web, which is the only type that |
141 // is relevant. This metric is left here for historical consistency. | 141 // is relevant. This metric is left here for historical consistency. |
142 web::RecordAction( | 142 web::RecordAction( |
143 UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb")); | 143 UserMetricsAction("ClearBrowsingData_MaskContainsUnprotectedWeb")); |
144 | 144 |
145 if (remove_mask & REMOVE_HISTORY) { | 145 if (remove_mask & REMOVE_HISTORY) { |
146 history::HistoryService* history_service = | 146 history::HistoryService* history_service = |
147 ios::HistoryServiceFactory::GetForBrowserState( | 147 ios::HistoryServiceFactory::GetForBrowserState( |
148 browser_state_, ServiceAccessType::EXPLICIT_ACCESS); | 148 browser_state_, ServiceAccessType::EXPLICIT_ACCESS); |
149 if (history_service) { | 149 if (history_service) { |
150 std::set<GURL> restrict_urls; | 150 std::set<GURL> restrict_urls; |
151 if (!remove_url.is_empty()) | |
152 restrict_urls.insert(remove_url); | |
153 web::RecordAction(UserMetricsAction("ClearBrowsingData_History")); | 151 web::RecordAction(UserMetricsAction("ClearBrowsingData_History")); |
154 waiting_for_clear_history_ = true; | 152 waiting_for_clear_history_ = true; |
155 | 153 |
156 history_service->ExpireLocalAndRemoteHistoryBetween( | 154 history_service->ExpireLocalAndRemoteHistoryBetween( |
157 ios::WebHistoryServiceFactory::GetForBrowserState(browser_state_), | 155 ios::WebHistoryServiceFactory::GetForBrowserState(browser_state_), |
158 restrict_urls, delete_begin_, delete_end_, | 156 restrict_urls, delete_begin_, delete_end_, |
159 base::Bind(&IOSChromeBrowsingDataRemover::OnHistoryDeletionDone, | 157 base::Bind(&IOSChromeBrowsingDataRemover::OnHistoryDeletionDone, |
160 base::Unretained(this)), | 158 base::Unretained(this)), |
161 &history_task_tracker_); | 159 &history_task_tracker_); |
162 } | 160 } |
(...skipping 21 matching lines...) Expand all Loading... | |
184 TemplateURLService* keywords_model = | 182 TemplateURLService* keywords_model = |
185 ios::TemplateURLServiceFactory::GetForBrowserState(browser_state_); | 183 ios::TemplateURLServiceFactory::GetForBrowserState(browser_state_); |
186 if (keywords_model && !keywords_model->loaded()) { | 184 if (keywords_model && !keywords_model->loaded()) { |
187 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( | 185 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( |
188 base::Bind(&IOSChromeBrowsingDataRemover::OnKeywordsLoaded, | 186 base::Bind(&IOSChromeBrowsingDataRemover::OnKeywordsLoaded, |
189 base::Unretained(this))); | 187 base::Unretained(this))); |
190 keywords_model->Load(); | 188 keywords_model->Load(); |
191 waiting_for_clear_keyword_data_ = true; | 189 waiting_for_clear_keyword_data_ = true; |
192 } else if (keywords_model) { | 190 } else if (keywords_model) { |
193 keywords_model->RemoveAutoGeneratedForOriginBetween( | 191 keywords_model->RemoveAutoGeneratedForOriginBetween( |
194 remove_url, delete_begin_, delete_end_); | 192 GURL(), delete_begin_, delete_end_); |
195 } | 193 } |
196 } | 194 } |
197 | 195 |
198 // If the caller is removing history for all hosts, then clear ancillary | 196 // If the caller is removing history for all hosts, then clear ancillary |
199 // historical information. | 197 // historical information. |
200 if (remove_url.is_empty()) { | 198 // We also delete the list of recently closed tabs. Since these expire, |
201 // We also delete the list of recently closed tabs. Since these expire, | 199 // they can't be more than a day old, so we can simply clear them all. |
202 // they can't be more than a day old, so we can simply clear them all. | 200 sessions::TabRestoreService* tab_service = |
203 sessions::TabRestoreService* tab_service = | 201 IOSChromeTabRestoreServiceFactory::GetForBrowserState(browser_state_); |
204 IOSChromeTabRestoreServiceFactory::GetForBrowserState(browser_state_); | 202 if (tab_service) { |
205 if (tab_service) { | 203 tab_service->ClearEntries(); |
206 tab_service->ClearEntries(); | 204 tab_service->DeleteLastSession(); |
207 tab_service->DeleteLastSession(); | |
208 } | |
209 } | 205 } |
210 | 206 |
211 // The saved Autofill profiles and credit cards can include the origin from | 207 // The saved Autofill profiles and credit cards can include the origin from |
212 // which these profiles and credit cards were learned. These are a form of | 208 // which these profiles and credit cards were learned. These are a form of |
213 // history, so clear them as well. | 209 // history, so clear them as well. |
214 scoped_refptr<autofill::AutofillWebDataService> web_data_service = | 210 scoped_refptr<autofill::AutofillWebDataService> web_data_service = |
215 ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState( | 211 ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState( |
216 browser_state_, ServiceAccessType::EXPLICIT_ACCESS); | 212 browser_state_, ServiceAccessType::EXPLICIT_ACCESS); |
217 if (web_data_service.get()) { | 213 if (web_data_service.get()) { |
218 waiting_for_clear_autofill_origin_urls_ = true; | 214 waiting_for_clear_autofill_origin_urls_ = true; |
(...skipping 23 matching lines...) Expand all Loading... | |
242 // any user action. | 238 // any user action. |
243 if (delete_begin_ == base::Time()) { | 239 if (delete_begin_ == base::Time()) { |
244 scoped_refptr<net::URLRequestContextGetter> safe_browsing_context = | 240 scoped_refptr<net::URLRequestContextGetter> safe_browsing_context = |
245 make_scoped_refptr(ios::GetChromeBrowserProvider() | 241 make_scoped_refptr(ios::GetChromeBrowserProvider() |
246 ->GetSafeBrowsingURLRequestContext()); | 242 ->GetSafeBrowsingURLRequestContext()); |
247 if (safe_browsing_context) { | 243 if (safe_browsing_context) { |
248 ++waiting_for_clear_cookies_count_; | 244 ++waiting_for_clear_cookies_count_; |
249 WebThread::PostTask( | 245 WebThread::PostTask( |
250 WebThread::IO, FROM_HERE, | 246 WebThread::IO, FROM_HERE, |
251 base::Bind(&IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread, | 247 base::Bind(&IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread, |
252 base::Unretained(this), safe_browsing_context, GURL())); | 248 base::Unretained(this), safe_browsing_context)); |
253 } | 249 } |
254 } | 250 } |
255 | 251 |
256 ++waiting_for_clear_cookies_count_; | 252 ++waiting_for_clear_cookies_count_; |
257 WebThread::PostTask( | 253 WebThread::PostTask( |
258 WebThread::IO, FROM_HERE, | 254 WebThread::IO, FROM_HERE, |
259 base::Bind(&IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread, | 255 base::Bind(&IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread, |
260 base::Unretained(this), main_context_getter_, remove_url)); | 256 base::Unretained(this), main_context_getter_)); |
261 | 257 |
262 // TODO(mkwst): If we're not removing passwords, then clear the 'zero-click' | 258 // TODO(mkwst): If we're not removing passwords, then clear the 'zero-click' |
263 // flag for all credentials in the password store. | 259 // flag for all credentials in the password store. |
264 } | 260 } |
265 | 261 |
266 if (remove_mask & REMOVE_CHANNEL_IDS) { | 262 if (remove_mask & REMOVE_CHANNEL_IDS) { |
267 web::RecordAction(UserMetricsAction("ClearBrowsingData_ChannelIDs")); | 263 web::RecordAction(UserMetricsAction("ClearBrowsingData_ChannelIDs")); |
268 if (main_context_getter_) { | 264 if (main_context_getter_) { |
269 waiting_for_clear_channel_ids_ = true; | 265 waiting_for_clear_channel_ids_ = true; |
270 WebThread::PostTask( | 266 WebThread::PostTask( |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
464 base::Unretained(this), num_deleted)); | 460 base::Unretained(this), num_deleted)); |
465 return; | 461 return; |
466 } | 462 } |
467 | 463 |
468 DCHECK_GT(waiting_for_clear_cookies_count_, 0); | 464 DCHECK_GT(waiting_for_clear_cookies_count_, 0); |
469 --waiting_for_clear_cookies_count_; | 465 --waiting_for_clear_cookies_count_; |
470 NotifyAndDeleteIfDone(); | 466 NotifyAndDeleteIfDone(); |
471 } | 467 } |
472 | 468 |
473 void IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread( | 469 void IOSChromeBrowsingDataRemover::ClearCookiesOnIOThread( |
474 const scoped_refptr<net::URLRequestContextGetter>& rq_context, | 470 const scoped_refptr<net::URLRequestContextGetter>& rq_context) { |
475 const GURL& storage_url) { | |
476 DCHECK_CURRENTLY_ON(WebThread::IO); | 471 DCHECK_CURRENTLY_ON(WebThread::IO); |
477 net::CookieStore* cookie_store = | 472 net::CookieStore* cookie_store = |
478 rq_context->GetURLRequestContext()->cookie_store(); | 473 rq_context->GetURLRequestContext()->cookie_store(); |
479 if (storage_url.is_empty()) { | 474 cookie_store->DeleteAllCreatedBetweenAsync( |
480 cookie_store->DeleteAllCreatedBetweenAsync( | 475 delete_begin_, delete_end_, |
481 delete_begin_, delete_end_, | 476 base::Bind(&IOSChromeBrowsingDataRemover::OnClearedCookies, |
482 base::Bind(&IOSChromeBrowsingDataRemover::OnClearedCookies, | 477 base::Unretained(this))); |
483 base::Unretained(this))); | |
484 } else { | |
485 cookie_store->DeleteAllCreatedBetweenForHostAsync( | |
486 delete_begin_, delete_end_, storage_url, | |
487 base::Bind(&IOSChromeBrowsingDataRemover::OnClearedCookies, | |
488 base::Unretained(this))); | |
489 } | |
490 } | 478 } |
491 | 479 |
492 void IOSChromeBrowsingDataRemover::ClearChannelIDsOnIOThread( | 480 void IOSChromeBrowsingDataRemover::ClearChannelIDsOnIOThread( |
493 const scoped_refptr<net::URLRequestContextGetter>& rq_context) { | 481 const scoped_refptr<net::URLRequestContextGetter>& rq_context) { |
494 DCHECK_CURRENTLY_ON(WebThread::IO); | 482 DCHECK_CURRENTLY_ON(WebThread::IO); |
495 net::ChannelIDService* channel_id_service = | 483 net::ChannelIDService* channel_id_service = |
496 rq_context->GetURLRequestContext()->channel_id_service(); | 484 rq_context->GetURLRequestContext()->channel_id_service(); |
497 channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween( | 485 channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween( |
498 delete_begin_, delete_end_, | 486 delete_begin_, delete_end_, |
499 base::Bind(&IOSChromeBrowsingDataRemover::OnClearedChannelIDsOnIOThread, | 487 base::Bind(&IOSChromeBrowsingDataRemover::OnClearedChannelIDsOnIOThread, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
532 waiting_for_clear_autofill_origin_urls_ = false; | 520 waiting_for_clear_autofill_origin_urls_ = false; |
533 NotifyAndDeleteIfDone(); | 521 NotifyAndDeleteIfDone(); |
534 } | 522 } |
535 | 523 |
536 // static | 524 // static |
537 IOSChromeBrowsingDataRemover::CallbackSubscription | 525 IOSChromeBrowsingDataRemover::CallbackSubscription |
538 IOSChromeBrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( | 526 IOSChromeBrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( |
539 const IOSChromeBrowsingDataRemover::Callback& callback) { | 527 const IOSChromeBrowsingDataRemover::Callback& callback) { |
540 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); | 528 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); |
541 } | 529 } |
OLD | NEW |