| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/browsing_data_remover.h" | 5 #include "chrome/browser/browsing_data/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 27 matching lines...) Expand all Loading... |
| 38 #include "chrome/browser/search_engines/template_url_service_factory.h" | 38 #include "chrome/browser/search_engines/template_url_service_factory.h" |
| 39 #include "chrome/browser/sessions/tab_restore_service_factory.h" | 39 #include "chrome/browser/sessions/tab_restore_service_factory.h" |
| 40 #include "chrome/browser/web_data_service_factory.h" | 40 #include "chrome/browser/web_data_service_factory.h" |
| 41 #include "chrome/common/features.h" | 41 #include "chrome/common/features.h" |
| 42 #include "chrome/common/pref_names.h" | 42 #include "chrome/common/pref_names.h" |
| 43 #include "chrome/common/url_constants.h" | 43 #include "chrome/common/url_constants.h" |
| 44 #include "components/autofill/core/browser/personal_data_manager.h" | 44 #include "components/autofill/core/browser/personal_data_manager.h" |
| 45 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" | 45 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
| 46 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" | 46 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" |
| 47 #include "components/content_settings/core/browser/host_content_settings_map.h" | 47 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 48 #include "components/content_settings/core/common/content_settings.h" |
| 49 #include "components/content_settings/core/common/content_settings_pattern.h" |
| 48 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_comp
ression_stats.h" | 50 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_comp
ression_stats.h" |
| 49 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_serv
ice.h" | 51 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_serv
ice.h" |
| 50 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_sett
ings.h" | 52 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_sett
ings.h" |
| 51 #include "components/domain_reliability/service.h" | 53 #include "components/domain_reliability/service.h" |
| 52 #include "components/history/core/browser/history_service.h" | 54 #include "components/history/core/browser/history_service.h" |
| 53 #include "components/nacl/browser/nacl_browser.h" | 55 #include "components/nacl/browser/nacl_browser.h" |
| 54 #include "components/nacl/browser/pnacl_host.h" | 56 #include "components/nacl/browser/pnacl_host.h" |
| 55 #include "components/omnibox/browser/omnibox_pref_names.h" | 57 #include "components/omnibox/browser/omnibox_pref_names.h" |
| 56 #include "components/password_manager/core/browser/password_store.h" | 58 #include "components/password_manager/core/browser/password_store.h" |
| 57 #include "components/power/origin_power_map.h" | 59 #include "components/power/origin_power_map.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 } | 151 } |
| 150 | 152 |
| 151 // Another convenience method to turn a callback without arguments into one that | 153 // Another convenience method to turn a callback without arguments into one that |
| 152 // accepts (and ignores) a single argument. | 154 // accepts (and ignores) a single argument. |
| 153 template <typename T> | 155 template <typename T> |
| 154 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) { | 156 base::Callback<void(T)> IgnoreArgument(const base::Closure& callback) { |
| 155 return base::Bind(&IgnoreArgumentHelper<T>, callback); | 157 return base::Bind(&IgnoreArgumentHelper<T>, callback); |
| 156 } | 158 } |
| 157 | 159 |
| 158 // Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask. | 160 // Helper to create callback for BrowsingDataRemover::DoesOriginMatchMask. |
| 159 bool DoesOriginMatchMask( | 161 bool DoesOriginMatchMaskAndUrls( |
| 160 int origin_type_mask, | 162 int origin_type_mask, |
| 163 const base::Callback<bool(const GURL&)>& predicate, |
| 161 const GURL& origin, | 164 const GURL& origin, |
| 162 storage::SpecialStoragePolicy* special_storage_policy) { | 165 storage::SpecialStoragePolicy* special_storage_policy) { |
| 163 return BrowsingDataHelper::DoesOriginMatchMask( | 166 return predicate.Run(origin) && |
| 164 origin, origin_type_mask, special_storage_policy); | 167 BrowsingDataHelper::DoesOriginMatchMask(origin, origin_type_mask, |
| 168 special_storage_policy); |
| 169 } |
| 170 |
| 171 bool ForwardPrimaryPatternCallback( |
| 172 const base::Callback<bool(const ContentSettingsPattern&)> predicate, |
| 173 const ContentSettingsPattern& primary_pattern, |
| 174 const ContentSettingsPattern& secondary_pattern) { |
| 175 return predicate.Run(primary_pattern); |
| 165 } | 176 } |
| 166 | 177 |
| 167 void ClearHostnameResolutionCacheOnIOThread(IOThread* io_thread) { | 178 void ClearHostnameResolutionCacheOnIOThread(IOThread* io_thread) { |
| 168 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 179 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 169 | 180 |
| 170 io_thread->ClearHostCache(); | 181 io_thread->ClearHostCache(); |
| 171 } | 182 } |
| 172 | 183 |
| 173 void ClearNetworkPredictorOnIOThread(chrome_browser_net::Predictor* predictor) { | 184 void ClearNetworkPredictorOnIOThread(chrome_browser_net::Predictor* predictor) { |
| 174 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 185 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 } | 330 } |
| 320 | 331 |
| 321 void BrowsingDataRemover::SetRemoving(bool is_removing) { | 332 void BrowsingDataRemover::SetRemoving(bool is_removing) { |
| 322 DCHECK_NE(is_removing_, is_removing); | 333 DCHECK_NE(is_removing_, is_removing); |
| 323 is_removing_ = is_removing; | 334 is_removing_ = is_removing; |
| 324 } | 335 } |
| 325 | 336 |
| 326 void BrowsingDataRemover::Remove(const TimeRange& time_range, | 337 void BrowsingDataRemover::Remove(const TimeRange& time_range, |
| 327 int remove_mask, | 338 int remove_mask, |
| 328 int origin_type_mask) { | 339 int origin_type_mask) { |
| 329 RemoveImpl(time_range, remove_mask, GURL(), origin_type_mask); | 340 OriginFilterBuilder builder(OriginFilterBuilder::BLACKLIST); |
| 341 RemoveImpl(time_range, remove_mask, builder, origin_type_mask); |
| 342 } |
| 343 |
| 344 void BrowsingDataRemover::RemoveWithFilter( |
| 345 const TimeRange& time_range, |
| 346 int remove_mask, |
| 347 int origin_type_mask, |
| 348 const OriginFilterBuilder& origin_filter) { |
| 349 RemoveImpl(time_range, remove_mask, origin_filter, origin_type_mask); |
| 330 } | 350 } |
| 331 | 351 |
| 332 void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range, | 352 void BrowsingDataRemover::RemoveImpl(const TimeRange& time_range, |
| 333 int remove_mask, | 353 int remove_mask, |
| 334 const GURL& remove_url, | 354 const OriginFilterBuilder& origin_filter, |
| 335 int origin_type_mask) { | 355 int origin_type_mask) { |
| 336 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 356 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 337 | 357 |
| 338 // crbug.com/140910: Many places were calling this with base::Time() as | 358 // crbug.com/140910: Many places were calling this with base::Time() as |
| 339 // delete_end, even though they should've used base::Time::Max(). | 359 // delete_end, even though they should've used base::Time::Max(). |
| 340 DCHECK_NE(base::Time(), time_range.end); | 360 DCHECK_NE(base::Time(), time_range.end); |
| 341 | 361 |
| 342 SetRemoving(true); | 362 SetRemoving(true); |
| 343 delete_begin_ = time_range.begin; | 363 delete_begin_ = time_range.begin; |
| 344 delete_end_ = time_range.end; | 364 delete_end_ = time_range.end; |
| 345 remove_mask_ = remove_mask; | 365 remove_mask_ = remove_mask; |
| 346 origin_type_mask_ = origin_type_mask; | 366 origin_type_mask_ = origin_type_mask; |
| 347 | 367 |
| 348 // TODO(msramek): Replace |remove_origin| with |filter| in all backends. | |
| 349 const url::Origin remove_origin(remove_url); | |
| 350 OriginFilterBuilder builder(OriginFilterBuilder::BLACKLIST); | |
| 351 if (!remove_url.is_empty()) { | |
| 352 // Make sure that only URLs representing origins, with no extra components, | |
| 353 // are passed to this class. | |
| 354 DCHECK_EQ(remove_url, remove_url.GetOrigin()); | |
| 355 builder.SetMode(OriginFilterBuilder::WHITELIST); | |
| 356 builder.AddOrigin(url::Origin(remove_origin)); | |
| 357 } | |
| 358 base::Callback<bool(const GURL& url)> same_origin_filter = | 368 base::Callback<bool(const GURL& url)> same_origin_filter = |
| 359 builder.BuildSameOriginFilter(); | 369 origin_filter.BuildSameOriginFilter(); |
| 370 base::Callback<bool(const ContentSettingsPattern& url)> same_pattern_filter = |
| 371 origin_filter.BuildSameOriginContentSettingsFilter(); |
| 360 | 372 |
| 361 PrefService* prefs = profile_->GetPrefs(); | 373 PrefService* prefs = profile_->GetPrefs(); |
| 362 bool may_delete_history = prefs->GetBoolean( | 374 bool may_delete_history = prefs->GetBoolean( |
| 363 prefs::kAllowDeletingBrowserHistory); | 375 prefs::kAllowDeletingBrowserHistory); |
| 364 | 376 |
| 365 // All the UI entry points into the BrowsingDataRemover should be disabled, | 377 // All the UI entry points into the BrowsingDataRemover should be disabled, |
| 366 // but this will fire if something was missed or added. | 378 // but this will fire if something was missed or added. |
| 367 DCHECK(may_delete_history || (remove_mask & REMOVE_NOCHECKS) || | 379 DCHECK(may_delete_history || (remove_mask & REMOVE_NOCHECKS) || |
| 368 (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS))); | 380 (!(remove_mask & REMOVE_HISTORY) && !(remove_mask & REMOVE_DOWNLOADS))); |
| 369 | 381 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 385 BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB | | 397 BrowsingDataHelper::ALL == (BrowsingDataHelper::UNPROTECTED_WEB | |
| 386 BrowsingDataHelper::PROTECTED_WEB | | 398 BrowsingDataHelper::PROTECTED_WEB | |
| 387 BrowsingDataHelper::EXTENSION), | 399 BrowsingDataHelper::EXTENSION), |
| 388 "OriginTypeMask has been updated without updating user metrics"); | 400 "OriginTypeMask has been updated without updating user metrics"); |
| 389 | 401 |
| 390 if ((remove_mask & REMOVE_HISTORY) && may_delete_history) { | 402 if ((remove_mask & REMOVE_HISTORY) && may_delete_history) { |
| 391 history::HistoryService* history_service = | 403 history::HistoryService* history_service = |
| 392 HistoryServiceFactory::GetForProfile( | 404 HistoryServiceFactory::GetForProfile( |
| 393 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 405 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 394 if (history_service) { | 406 if (history_service) { |
| 395 // Selective history deletion is currently done through HistoryUI -> | 407 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 396 // HistoryBackend -> HistoryService, and that is for individual URLs, | |
| 397 // not origins. The code below is currently unused, as the only callsite | |
| 398 // supplying |remove_url| is the unittest. | |
| 399 // TODO(msramek): Make it possible to delete history per origin, not just | |
| 400 // per URL, and use that functionality here. | |
| 401 std::set<GURL> restrict_urls; | |
| 402 if (!remove_url.is_empty()) | |
| 403 restrict_urls.insert(remove_url); | |
| 404 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); | 408 content::RecordAction(UserMetricsAction("ClearBrowsingData_History")); |
| 405 waiting_for_clear_history_ = true; | 409 waiting_for_clear_history_ = true; |
| 406 | |
| 407 history_service->ExpireLocalAndRemoteHistoryBetween( | 410 history_service->ExpireLocalAndRemoteHistoryBetween( |
| 408 WebHistoryServiceFactory::GetForProfile(profile_), restrict_urls, | 411 WebHistoryServiceFactory::GetForProfile(profile_), std::set<GURL>(), |
| 409 delete_begin_, delete_end_, | 412 delete_begin_, delete_end_, |
| 410 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, | 413 base::Bind(&BrowsingDataRemover::OnHistoryDeletionDone, |
| 411 weak_ptr_factory_.GetWeakPtr()), | 414 weak_ptr_factory_.GetWeakPtr()), |
| 412 &history_task_tracker_); | 415 &history_task_tracker_); |
| 413 | 416 |
| 414 #if defined(ENABLE_EXTENSIONS) | 417 #if defined(ENABLE_EXTENSIONS) |
| 415 // The extension activity contains details of which websites extensions | 418 // The extension activity contains details of which websites extensions |
| 416 // were active on. It therefore indirectly stores details of websites a | 419 // were active on. It therefore indirectly stores details of websites a |
| 417 // user has visited so best clean from here as well. | 420 // user has visited so best clean from here as well. |
| 418 extensions::ActivityLog::GetInstance(profile_)->RemoveURLs(restrict_urls); | 421 extensions::ActivityLog::GetInstance(profile_)->RemoveURLs( |
| 422 std::set<GURL>()); |
| 419 #endif | 423 #endif |
| 420 } | 424 } |
| 421 | 425 |
| 422 #if defined(ENABLE_EXTENSIONS) | 426 #if defined(ENABLE_EXTENSIONS) |
| 423 // Clear launch times as they are a form of history. | 427 // Clear launch times as they are a form of history. |
| 424 extensions::ExtensionPrefs* extension_prefs = | 428 extensions::ExtensionPrefs* extension_prefs = |
| 425 extensions::ExtensionPrefs::Get(profile_); | 429 extensions::ExtensionPrefs::Get(profile_); |
| 426 extension_prefs->ClearLastLaunchTimes(); | 430 extension_prefs->ClearLastLaunchTimes(); |
| 427 #endif | 431 #endif |
| 428 | 432 |
| 429 // The power consumption history by origin contains details of websites | 433 // The power consumption history by origin contains details of websites |
| 430 // that were visited. | 434 // that were visited. |
| 435 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 431 power::OriginPowerMap* origin_power_map = | 436 power::OriginPowerMap* origin_power_map = |
| 432 power::OriginPowerMapFactory::GetForBrowserContext(profile_); | 437 power::OriginPowerMapFactory::GetForBrowserContext(profile_); |
| 433 if (origin_power_map) | 438 if (origin_power_map) |
| 434 origin_power_map->ClearOriginMap(); | 439 origin_power_map->ClearOriginMap(); |
| 435 | 440 |
| 436 // Need to clear the host cache and accumulated speculative data, as it also | 441 // Need to clear the host cache and accumulated speculative data, as it also |
| 437 // reveals some history: we have no mechanism to track when these items were | 442 // reveals some history: we have no mechanism to track when these items were |
| 438 // created, so we'll clear them all. Better safe than sorry. | 443 // created, so we'll clear them all. Better safe than sorry. |
| 439 if (g_browser_process->io_thread()) { | 444 if (g_browser_process->io_thread()) { |
| 445 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 440 waiting_for_clear_hostname_resolution_cache_ = true; | 446 waiting_for_clear_hostname_resolution_cache_ = true; |
| 441 BrowserThread::PostTaskAndReply( | 447 BrowserThread::PostTaskAndReply( |
| 442 BrowserThread::IO, FROM_HERE, | 448 BrowserThread::IO, FROM_HERE, |
| 443 base::Bind(&ClearHostnameResolutionCacheOnIOThread, | 449 base::Bind(&ClearHostnameResolutionCacheOnIOThread, |
| 444 g_browser_process->io_thread()), | 450 g_browser_process->io_thread()), |
| 445 base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache, | 451 base::Bind(&BrowsingDataRemover::OnClearedHostnameResolutionCache, |
| 446 weak_ptr_factory_.GetWeakPtr())); | 452 weak_ptr_factory_.GetWeakPtr())); |
| 447 } | 453 } |
| 448 if (profile_->GetNetworkPredictor()) { | 454 if (profile_->GetNetworkPredictor()) { |
| 455 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 449 waiting_for_clear_network_predictor_ = true; | 456 waiting_for_clear_network_predictor_ = true; |
| 450 BrowserThread::PostTaskAndReply( | 457 BrowserThread::PostTaskAndReply( |
| 451 BrowserThread::IO, FROM_HERE, | 458 BrowserThread::IO, FROM_HERE, |
| 452 base::Bind(&ClearNetworkPredictorOnIOThread, | 459 base::Bind(&ClearNetworkPredictorOnIOThread, |
| 453 profile_->GetNetworkPredictor()), | 460 profile_->GetNetworkPredictor()), |
| 454 base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor, | 461 base::Bind(&BrowsingDataRemover::OnClearedNetworkPredictor, |
| 455 weak_ptr_factory_.GetWeakPtr())); | 462 weak_ptr_factory_.GetWeakPtr())); |
| 456 } | 463 } |
| 457 | 464 |
| 458 // As part of history deletion we also delete the auto-generated keywords. | 465 // As part of history deletion we also delete the auto-generated keywords. |
| 459 TemplateURLService* keywords_model = | 466 TemplateURLService* keywords_model = |
| 460 TemplateURLServiceFactory::GetForProfile(profile_); | 467 TemplateURLServiceFactory::GetForProfile(profile_); |
| 468 |
| 461 if (keywords_model && !keywords_model->loaded()) { | 469 if (keywords_model && !keywords_model->loaded()) { |
| 462 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( | 470 template_url_sub_ = keywords_model->RegisterOnLoadedCallback( |
| 463 base::Bind(&BrowsingDataRemover::OnKeywordsLoaded, | 471 base::Bind(&BrowsingDataRemover::OnKeywordsLoaded, |
| 464 weak_ptr_factory_.GetWeakPtr())); | 472 weak_ptr_factory_.GetWeakPtr())); |
| 465 keywords_model->Load(); | 473 keywords_model->Load(); |
| 466 waiting_for_clear_keyword_data_ = true; | 474 waiting_for_clear_keyword_data_ = true; |
| 467 } else if (keywords_model) { | 475 } else if (keywords_model) { |
| 468 keywords_model->RemoveAutoGeneratedForOriginBetween( | 476 keywords_model->RemoveAutoGeneratedForOriginBetween(GURL(), delete_begin_, |
| 469 remove_url, delete_begin_, delete_end_); | 477 delete_end_); |
| 470 } | 478 } |
| 471 | 479 |
| 472 // The PrerenderManager keeps history of prerendered pages, so clear that. | 480 // The PrerenderManager keeps history of prerendered pages, so clear that. |
| 473 // It also may have a prerendered page. If so, the page could be | 481 // It also may have a prerendered page. If so, the page could be |
| 474 // considered to have a small amount of historical information, so delete | 482 // considered to have a small amount of historical information, so delete |
| 475 // it, too. | 483 // it, too. |
| 476 prerender::PrerenderManager* prerender_manager = | 484 prerender::PrerenderManager* prerender_manager = |
| 477 prerender::PrerenderManagerFactory::GetForProfile(profile_); | 485 prerender::PrerenderManagerFactory::GetForProfile(profile_); |
| 478 if (prerender_manager) { | 486 if (prerender_manager) { |
| 487 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 479 prerender_manager->ClearData( | 488 prerender_manager->ClearData( |
| 480 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | | 489 prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS | |
| 481 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); | 490 prerender::PrerenderManager::CLEAR_PRERENDER_HISTORY); |
| 482 } | 491 } |
| 483 | 492 |
| 484 // If the caller is removing history for all hosts, then clear ancillary | 493 // If the caller is removing history for all hosts, then clear ancillary |
| 485 // historical information. | 494 // historical information. |
| 486 if (remove_url.is_empty()) { | 495 if (origin_filter.IsEmptyBlacklist()) { |
| 487 // We also delete the list of recently closed tabs. Since these expire, | 496 // We also delete the list of recently closed tabs. Since these expire, |
| 488 // they can't be more than a day old, so we can simply clear them all. | 497 // they can't be more than a day old, so we can simply clear them all. |
| 489 sessions::TabRestoreService* tab_service = | 498 sessions::TabRestoreService* tab_service = |
| 490 TabRestoreServiceFactory::GetForProfile(profile_); | 499 TabRestoreServiceFactory::GetForProfile(profile_); |
| 491 if (tab_service) { | 500 if (tab_service) { |
| 492 tab_service->ClearEntries(); | 501 tab_service->ClearEntries(); |
| 493 tab_service->DeleteLastSession(); | 502 tab_service->DeleteLastSession(); |
| 494 } | 503 } |
| 495 | 504 |
| 496 #if defined(ENABLE_SESSION_SERVICE) | 505 #if defined(ENABLE_SESSION_SERVICE) |
| 497 // We also delete the last session when we delete the history. | 506 // We also delete the last session when we delete the history. |
| 498 SessionService* session_service = | 507 SessionService* session_service = |
| 499 SessionServiceFactory::GetForProfile(profile_); | 508 SessionServiceFactory::GetForProfile(profile_); |
| 500 if (session_service) | 509 if (session_service) |
| 501 session_service->DeleteLastSession(); | 510 session_service->DeleteLastSession(); |
| 502 #endif | 511 #endif |
| 503 } | 512 } |
| 504 | 513 |
| 505 // The saved Autofill profiles and credit cards can include the origin from | 514 // The saved Autofill profiles and credit cards can include the origin from |
| 506 // which these profiles and credit cards were learned. These are a form of | 515 // which these profiles and credit cards were learned. These are a form of |
| 507 // history, so clear them as well. | 516 // history, so clear them as well. |
| 517 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 508 scoped_refptr<autofill::AutofillWebDataService> web_data_service = | 518 scoped_refptr<autofill::AutofillWebDataService> web_data_service = |
| 509 WebDataServiceFactory::GetAutofillWebDataForProfile( | 519 WebDataServiceFactory::GetAutofillWebDataForProfile( |
| 510 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 520 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 511 if (web_data_service.get()) { | 521 if (web_data_service.get()) { |
| 512 waiting_for_clear_autofill_origin_urls_ = true; | 522 waiting_for_clear_autofill_origin_urls_ = true; |
| 513 web_data_service->RemoveOriginURLsModifiedBetween( | 523 web_data_service->RemoveOriginURLsModifiedBetween( |
| 514 delete_begin_, delete_end_); | 524 delete_begin_, delete_end_); |
| 515 // The above calls are done on the UI thread but do their work on the DB | 525 // The above calls are done on the UI thread but do their work on the DB |
| 516 // thread. So wait for it. | 526 // thread. So wait for it. |
| 517 BrowserThread::PostTaskAndReply( | 527 BrowserThread::PostTaskAndReply( |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { | 606 origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
| 597 content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies")); | 607 content::RecordAction(UserMetricsAction("ClearBrowsingData_Cookies")); |
| 598 | 608 |
| 599 storage_partition_remove_mask |= | 609 storage_partition_remove_mask |= |
| 600 content::StoragePartition::REMOVE_DATA_MASK_COOKIES; | 610 content::StoragePartition::REMOVE_DATA_MASK_COOKIES; |
| 601 | 611 |
| 602 // Clear the safebrowsing cookies only if time period is for "all time". It | 612 // Clear the safebrowsing cookies only if time period is for "all time". It |
| 603 // doesn't make sense to apply the time period of deleting in the last X | 613 // doesn't make sense to apply the time period of deleting in the last X |
| 604 // hours/days to the safebrowsing cookies since they aren't the result of | 614 // hours/days to the safebrowsing cookies since they aren't the result of |
| 605 // any user action. | 615 // any user action. |
| 616 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 606 if (delete_begin_ == base::Time()) { | 617 if (delete_begin_ == base::Time()) { |
| 607 safe_browsing::SafeBrowsingService* sb_service = | 618 safe_browsing::SafeBrowsingService* sb_service = |
| 608 g_browser_process->safe_browsing_service(); | 619 g_browser_process->safe_browsing_service(); |
| 609 if (sb_service) { | 620 if (sb_service) { |
| 610 scoped_refptr<net::URLRequestContextGetter> sb_context = | 621 scoped_refptr<net::URLRequestContextGetter> sb_context = |
| 611 sb_service->url_request_context(); | 622 sb_service->url_request_context(); |
| 612 ++waiting_for_clear_cookies_count_; | 623 ++waiting_for_clear_cookies_count_; |
| 624 // TODONOW |
| 613 BrowserThread::PostTask( | 625 BrowserThread::PostTask( |
| 614 BrowserThread::IO, FROM_HERE, | 626 BrowserThread::IO, FROM_HERE, |
| 615 base::Bind(&ClearCookiesOnIOThread, delete_begin_, delete_end_, | 627 base::Bind(&ClearCookiesOnIOThread, delete_begin_, delete_end_, |
| 616 std::move(sb_context), | 628 std::move(sb_context), |
| 617 UIThreadTrampoline( | 629 UIThreadTrampoline( |
| 618 base::Bind(&BrowsingDataRemover::OnClearedCookies, | 630 base::Bind(&BrowsingDataRemover::OnClearedCookies, |
| 619 weak_ptr_factory_.GetWeakPtr())))); | 631 weak_ptr_factory_.GetWeakPtr())))); |
| 620 } | 632 } |
| 621 } | 633 } |
| 622 | 634 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 plugin_data_remover_->StartRemoving(delete_begin_); | 702 plugin_data_remover_->StartRemoving(delete_begin_); |
| 691 | 703 |
| 692 base::WaitableEventWatcher::EventCallback watcher_callback = | 704 base::WaitableEventWatcher::EventCallback watcher_callback = |
| 693 base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled, | 705 base::Bind(&BrowsingDataRemover::OnWaitableEventSignaled, |
| 694 weak_ptr_factory_.GetWeakPtr()); | 706 weak_ptr_factory_.GetWeakPtr()); |
| 695 watcher_.StartWatching(event, watcher_callback); | 707 watcher_.StartWatching(event, watcher_callback); |
| 696 } | 708 } |
| 697 #endif | 709 #endif |
| 698 | 710 |
| 699 if (remove_mask & REMOVE_SITE_USAGE_DATA) { | 711 if (remove_mask & REMOVE_SITE_USAGE_DATA) { |
| 700 HostContentSettingsMapFactory::GetForProfile(profile_) | 712 ClearSettingsForOneTypeWithPredicate( |
| 701 ->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT); | 713 HostContentSettingsMapFactory::GetForProfile(profile_), |
| 714 CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, |
| 715 base::Bind(&ForwardPrimaryPatternCallback, same_pattern_filter)); |
| 702 } | 716 } |
| 703 | 717 |
| 704 if (remove_mask & REMOVE_SITE_USAGE_DATA || remove_mask & REMOVE_HISTORY) { | 718 if (remove_mask & REMOVE_SITE_USAGE_DATA || remove_mask & REMOVE_HISTORY) { |
| 705 HostContentSettingsMapFactory::GetForProfile(profile_) | 719 ClearSettingsForOneTypeWithPredicate( |
| 706 ->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_APP_BANNER); | 720 HostContentSettingsMapFactory::GetForProfile(profile_), |
| 721 CONTENT_SETTINGS_TYPE_APP_BANNER, |
| 722 base::Bind(&ForwardPrimaryPatternCallback, same_pattern_filter)); |
| 707 } | 723 } |
| 708 | 724 |
| 725 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 709 if (remove_mask & REMOVE_PASSWORDS) { | 726 if (remove_mask & REMOVE_PASSWORDS) { |
| 710 content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords")); | 727 content::RecordAction(UserMetricsAction("ClearBrowsingData_Passwords")); |
| 711 password_manager::PasswordStore* password_store = | 728 password_manager::PasswordStore* password_store = |
| 712 PasswordStoreFactory::GetForProfile( | 729 PasswordStoreFactory::GetForProfile( |
| 713 profile_, ServiceAccessType::EXPLICIT_ACCESS).get(); | 730 profile_, ServiceAccessType::EXPLICIT_ACCESS).get(); |
| 714 | 731 |
| 715 if (password_store) { | 732 if (password_store) { |
| 716 waiting_for_clear_passwords_ = true; | 733 waiting_for_clear_passwords_ = true; |
| 717 auto on_cleared_passwords = | 734 auto on_cleared_passwords = |
| 718 base::Bind(&BrowsingDataRemover::OnClearedPasswords, | 735 base::Bind(&BrowsingDataRemover::OnClearedPasswords, |
| 719 weak_ptr_factory_.GetWeakPtr()); | 736 weak_ptr_factory_.GetWeakPtr()); |
| 720 if (remove_url.is_empty()) { | 737 password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_, |
| 721 password_store->RemoveLoginsCreatedBetween(delete_begin_, delete_end_, | 738 on_cleared_passwords); |
| 722 on_cleared_passwords); | |
| 723 } else { | |
| 724 password_store->RemoveLoginsByOriginAndTime( | |
| 725 remove_origin, delete_begin_, delete_end_, on_cleared_passwords); | |
| 726 } | |
| 727 } | 739 } |
| 728 } | 740 } |
| 729 | 741 |
| 730 if (remove_mask & REMOVE_HISTORY) { | 742 if (remove_mask & REMOVE_HISTORY) { |
| 731 password_manager::PasswordStore* password_store = | 743 password_manager::PasswordStore* password_store = |
| 732 PasswordStoreFactory::GetForProfile( | 744 PasswordStoreFactory::GetForProfile( |
| 733 profile_, ServiceAccessType::EXPLICIT_ACCESS).get(); | 745 profile_, ServiceAccessType::EXPLICIT_ACCESS).get(); |
| 734 | 746 |
| 735 if (password_store) { | 747 if (password_store) { |
| 736 waiting_for_clear_passwords_stats_ = true; | 748 waiting_for_clear_passwords_stats_ = true; |
| 737 password_store->RemoveStatisticsCreatedBetween( | 749 password_store->RemoveStatisticsCreatedBetween( |
| 738 delete_begin_, delete_end_, | 750 delete_begin_, delete_end_, |
| 739 base::Bind(&BrowsingDataRemover::OnClearedPasswordsStats, | 751 base::Bind(&BrowsingDataRemover::OnClearedPasswordsStats, |
| 740 weak_ptr_factory_.GetWeakPtr())); | 752 weak_ptr_factory_.GetWeakPtr())); |
| 741 } | 753 } |
| 742 } | 754 } |
| 743 | 755 |
| 756 // TODO(dmurph): Support all backends with filter (crbug.com/589586). |
| 744 if (remove_mask & REMOVE_FORM_DATA) { | 757 if (remove_mask & REMOVE_FORM_DATA) { |
| 745 content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill")); | 758 content::RecordAction(UserMetricsAction("ClearBrowsingData_Autofill")); |
| 746 scoped_refptr<autofill::AutofillWebDataService> web_data_service = | 759 scoped_refptr<autofill::AutofillWebDataService> web_data_service = |
| 747 WebDataServiceFactory::GetAutofillWebDataForProfile( | 760 WebDataServiceFactory::GetAutofillWebDataForProfile( |
| 748 profile_, ServiceAccessType::EXPLICIT_ACCESS); | 761 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 749 | 762 |
| 750 if (web_data_service.get()) { | 763 if (web_data_service.get()) { |
| 751 waiting_for_clear_form_ = true; | 764 waiting_for_clear_form_ = true; |
| 752 web_data_service->RemoveFormElementsAddedBetween(delete_begin_, | 765 web_data_service->RemoveFormElementsAddedBetween(delete_begin_, |
| 753 delete_end_); | 766 delete_end_); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 if (delete_begin_ == base::Time() || | 851 if (delete_begin_ == base::Time() || |
| 839 origin_type_mask_ & | 852 origin_type_mask_ & |
| 840 (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { | 853 (BrowsingDataHelper::PROTECTED_WEB | BrowsingDataHelper::EXTENSION)) { |
| 841 // If we're deleting since the beginning of time, or we're removing | 854 // If we're deleting since the beginning of time, or we're removing |
| 842 // protected origins, then remove persistent quota data. | 855 // protected origins, then remove persistent quota data. |
| 843 quota_storage_remove_mask |= | 856 quota_storage_remove_mask |= |
| 844 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; | 857 content::StoragePartition::QUOTA_MANAGED_STORAGE_MASK_PERSISTENT; |
| 845 } | 858 } |
| 846 | 859 |
| 847 storage_partition->ClearData( | 860 storage_partition->ClearData( |
| 848 storage_partition_remove_mask, quota_storage_remove_mask, remove_url, | 861 storage_partition_remove_mask, quota_storage_remove_mask, GURL(), |
| 849 base::Bind(&DoesOriginMatchMask, origin_type_mask_), delete_begin_, | 862 base::Bind(&DoesOriginMatchMaskAndUrls, origin_type_mask_, |
| 850 delete_end_, | 863 same_origin_filter), |
| 864 delete_begin_, delete_end_, |
| 851 base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData, | 865 base::Bind(&BrowsingDataRemover::OnClearedStoragePartitionData, |
| 852 weak_ptr_factory_.GetWeakPtr())); | 866 weak_ptr_factory_.GetWeakPtr())); |
| 853 } | 867 } |
| 854 | 868 |
| 855 #if defined(ENABLE_PLUGINS) | 869 #if defined(ENABLE_PLUGINS) |
| 856 if (remove_mask & REMOVE_CONTENT_LICENSES) { | 870 if (remove_mask & REMOVE_CONTENT_LICENSES) { |
| 857 content::RecordAction( | 871 content::RecordAction( |
| 858 UserMetricsAction("ClearBrowsingData_ContentLicenses")); | 872 UserMetricsAction("ClearBrowsingData_ContentLicenses")); |
| 859 | 873 |
| 860 waiting_for_clear_content_licenses_ = true; | 874 waiting_for_clear_content_licenses_ = true; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 waiting_for_clear_webapp_data_ = true; | 934 waiting_for_clear_webapp_data_ = true; |
| 921 WebappRegistry::UnregisterWebapps( | 935 WebappRegistry::UnregisterWebapps( |
| 922 base::Bind(&BrowsingDataRemover::OnClearedWebappData, | 936 base::Bind(&BrowsingDataRemover::OnClearedWebappData, |
| 923 weak_ptr_factory_.GetWeakPtr())); | 937 weak_ptr_factory_.GetWeakPtr())); |
| 924 } | 938 } |
| 925 | 939 |
| 926 if ((remove_mask & REMOVE_OFFLINE_PAGE_DATA) && | 940 if ((remove_mask & REMOVE_OFFLINE_PAGE_DATA) && |
| 927 offline_pages::IsOfflinePagesEnabled()) { | 941 offline_pages::IsOfflinePagesEnabled()) { |
| 928 waiting_for_clear_offline_page_data_ = true; | 942 waiting_for_clear_offline_page_data_ = true; |
| 929 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_) | 943 offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_) |
| 930 ->ClearAll(base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData, | 944 ->ClearWithURLPredicate( |
| 931 weak_ptr_factory_.GetWeakPtr())); | 945 same_origin_filter, |
| 946 base::Bind(&BrowsingDataRemover::OnClearedOfflinePageData, |
| 947 weak_ptr_factory_.GetWeakPtr())); |
| 932 } | 948 } |
| 933 #endif | 949 #endif |
| 934 | 950 |
| 935 // Record the combined deletion of cookies and cache. | 951 // Record the combined deletion of cookies and cache. |
| 936 CookieOrCacheDeletionChoice choice = NEITHER_COOKIES_NOR_CACHE; | 952 CookieOrCacheDeletionChoice choice = NEITHER_COOKIES_NOR_CACHE; |
| 937 if (remove_mask & REMOVE_COOKIES && | 953 if (remove_mask & REMOVE_COOKIES && |
| 938 origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { | 954 origin_type_mask_ & BrowsingDataHelper::UNPROTECTED_WEB) { |
| 939 choice = remove_mask & REMOVE_CACHE ? BOTH_COOKIES_AND_CACHE | 955 choice = remove_mask & REMOVE_CACHE ? BOTH_COOKIES_AND_CACHE |
| 940 : ONLY_COOKIES; | 956 : ONLY_COOKIES; |
| 941 } else if (remove_mask & REMOVE_CACHE) { | 957 } else if (remove_mask & REMOVE_CACHE) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 953 | 969 |
| 954 void BrowsingDataRemover::RemoveObserver(Observer* observer) { | 970 void BrowsingDataRemover::RemoveObserver(Observer* observer) { |
| 955 observer_list_.RemoveObserver(observer); | 971 observer_list_.RemoveObserver(observer); |
| 956 } | 972 } |
| 957 | 973 |
| 958 void BrowsingDataRemover::OverrideStoragePartitionForTesting( | 974 void BrowsingDataRemover::OverrideStoragePartitionForTesting( |
| 959 content::StoragePartition* storage_partition) { | 975 content::StoragePartition* storage_partition) { |
| 960 storage_partition_for_testing_ = storage_partition; | 976 storage_partition_for_testing_ = storage_partition; |
| 961 } | 977 } |
| 962 | 978 |
| 979 void BrowsingDataRemover::ClearSettingsForOneTypeWithPredicate( |
| 980 HostContentSettingsMap* content_settings_map, |
| 981 ContentSettingsType content_type, |
| 982 const base::Callback<bool(const ContentSettingsPattern& primary_pattern, |
| 983 const ContentSettingsPattern& secondary_pattern)>& |
| 984 predicate) { |
| 985 ContentSettingsForOneType settings; |
| 986 content_settings_map->GetSettingsForOneType(content_type, std::string(), |
| 987 &settings); |
| 988 for (const ContentSettingPatternSource& setting : settings) { |
| 989 if (predicate.Run(setting.primary_pattern, setting.secondary_pattern)) { |
| 990 content_settings_map->SetWebsiteSettingCustomScope( |
| 991 setting.primary_pattern, setting.secondary_pattern, content_type, |
| 992 std::string(), nullptr); |
| 993 } |
| 994 } |
| 995 } |
| 996 |
| 963 base::Time BrowsingDataRemover::CalculateBeginDeleteTime( | 997 base::Time BrowsingDataRemover::CalculateBeginDeleteTime( |
| 964 TimePeriod time_period) { | 998 TimePeriod time_period) { |
| 965 base::TimeDelta diff; | 999 base::TimeDelta diff; |
| 966 base::Time delete_begin_time = base::Time::Now(); | 1000 base::Time delete_begin_time = base::Time::Now(); |
| 967 switch (time_period) { | 1001 switch (time_period) { |
| 968 case LAST_HOUR: | 1002 case LAST_HOUR: |
| 969 diff = base::TimeDelta::FromHours(1); | 1003 diff = base::TimeDelta::FromHours(1); |
| 970 break; | 1004 break; |
| 971 case LAST_DAY: | 1005 case LAST_DAY: |
| 972 diff = base::TimeDelta::FromHours(24); | 1006 diff = base::TimeDelta::FromHours(24); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 waiting_for_clear_domain_reliability_monitor_ = false; | 1244 waiting_for_clear_domain_reliability_monitor_ = false; |
| 1211 NotifyIfDone(); | 1245 NotifyIfDone(); |
| 1212 } | 1246 } |
| 1213 | 1247 |
| 1214 // static | 1248 // static |
| 1215 BrowsingDataRemover::CallbackSubscription | 1249 BrowsingDataRemover::CallbackSubscription |
| 1216 BrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( | 1250 BrowsingDataRemover::RegisterOnBrowsingDataRemovedCallback( |
| 1217 const BrowsingDataRemover::Callback& callback) { | 1251 const BrowsingDataRemover::Callback& callback) { |
| 1218 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); | 1252 return GetOnBrowsingDataRemovedCallbacks()->Add(callback); |
| 1219 } | 1253 } |
| OLD | NEW |