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

Side by Side Diff: chrome/browser/content_settings/host_content_settings_map.cc

Issue 7218073: Explicitly ShutdownOnUIThread the HostContentSettingsMap when destroying the Profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 9 years, 5 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/content_settings/host_content_settings_map.h" 5 #include "chrome/browser/content_settings/host_content_settings_map.h"
6 6
7 #include <list> 7 #include <list>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 const char* kProviderNames[] = { 63 const char* kProviderNames[] = {
64 "policy", 64 "policy",
65 "extension", 65 "extension",
66 "preference" 66 "preference"
67 }; 67 };
68 68
69 } // namespace 69 } // namespace
70 70
71 HostContentSettingsMap::HostContentSettingsMap(Profile* profile) 71 HostContentSettingsMap::HostContentSettingsMap(Profile* profile)
72 : profile_(profile), 72 : prefs_(profile->GetPrefs()),
73 is_off_the_record_(profile_->IsOffTheRecord()), 73 is_off_the_record_(profile->IsOffTheRecord()),
74 updating_preferences_(false), 74 updating_preferences_(false),
75 block_third_party_cookies_(false), 75 block_third_party_cookies_(false),
76 is_block_third_party_cookies_managed_(false) { 76 is_block_third_party_cookies_managed_(false) {
77 // The order in which the default content settings providers are created is 77 // The order in which the default content settings providers are created is
78 // critical, as providers that are further down in the list (i.e. added later) 78 // critical, as providers that are further down in the list (i.e. added later)
79 // override providers further up. 79 // override providers further up.
80 default_content_settings_providers_.push_back( 80 default_content_settings_providers_.push_back(
81 make_linked_ptr(new content_settings::PrefDefaultProvider(profile))); 81 make_linked_ptr(new content_settings::PrefDefaultProvider(
82 this, prefs_, is_off_the_record_)));
82 content_settings::DefaultProviderInterface* policy_default_provider = 83 content_settings::DefaultProviderInterface* policy_default_provider =
83 new content_settings::PolicyDefaultProvider(profile); 84 new content_settings::PolicyDefaultProvider(this, prefs_);
84 default_content_settings_providers_.push_back( 85 default_content_settings_providers_.push_back(
85 make_linked_ptr(policy_default_provider)); 86 make_linked_ptr(policy_default_provider));
86 87
87 PrefService* prefs = profile_->GetPrefs();
88
89 // TODO(markusheintz): Discuss whether it is sensible to move migration code 88 // TODO(markusheintz): Discuss whether it is sensible to move migration code
90 // to PrefContentSettingsProvider. 89 // to PrefContentSettingsProvider.
91 MigrateObsoleteCookiePref(prefs); 90 MigrateObsoleteCookiePref();
92 91
93 // Read misc. global settings. 92 // Read misc. global settings.
94 block_third_party_cookies_ = 93 block_third_party_cookies_ =
95 prefs->GetBoolean(prefs::kBlockThirdPartyCookies); 94 prefs_->GetBoolean(prefs::kBlockThirdPartyCookies);
96 if (block_third_party_cookies_) { 95 if (block_third_party_cookies_) {
97 UserMetrics::RecordAction( 96 UserMetrics::RecordAction(
98 UserMetricsAction("ThirdPartyCookieBlockingEnabled")); 97 UserMetricsAction("ThirdPartyCookieBlockingEnabled"));
99 } else { 98 } else {
100 UserMetrics::RecordAction( 99 UserMetrics::RecordAction(
101 UserMetricsAction("ThirdPartyCookieBlockingDisabled")); 100 UserMetricsAction("ThirdPartyCookieBlockingDisabled"));
102 } 101 }
103 is_block_third_party_cookies_managed_ = 102 is_block_third_party_cookies_managed_ =
104 prefs->IsManagedPreference(prefs::kBlockThirdPartyCookies); 103 prefs_->IsManagedPreference(prefs::kBlockThirdPartyCookies);
105 104
106 // User defined non default content settings are provided by the PrefProvider. 105 // User defined non default content settings are provided by the PrefProvider.
107 // The order in which the content settings providers are created is critical, 106 // The order in which the content settings providers are created is critical,
108 // as providers that are further up in the list (i.e. added earlier) override 107 // as providers that are further up in the list (i.e. added earlier) override
109 // providers further down. 108 // providers further down.
110 content_settings_providers_.push_back(make_linked_ptr( 109 content_settings_providers_.push_back(make_linked_ptr(
111 new content_settings::PolicyProvider(profile, policy_default_provider))); 110 new content_settings::PolicyProvider(this,
111 prefs_,
112 policy_default_provider)));
112 ExtensionService* extension_service = profile->GetExtensionService(); 113 ExtensionService* extension_service = profile->GetExtensionService();
113 if (extension_service) { 114 if (extension_service) {
114 // |extension_service| can be NULL in unit tests. 115 // |extension_service| can be NULL in unit tests.
115 content_settings_providers_.push_back(make_linked_ptr( 116 content_settings_providers_.push_back(make_linked_ptr(
116 new content_settings::ExtensionProvider( 117 new content_settings::ExtensionProvider(
117 this, 118 this,
118 extension_service->GetExtensionContentSettingsStore(), 119 extension_service->GetExtensionContentSettingsStore(),
119 is_off_the_record_))); 120 is_off_the_record_)));
120 } 121 }
121 content_settings_providers_.push_back( 122 content_settings_providers_.push_back(make_linked_ptr(
122 make_linked_ptr(new content_settings::PrefProvider(profile))); 123 new content_settings::PrefProvider(this, prefs_, is_off_the_record_)));
123 124
124 pref_change_registrar_.Init(prefs); 125 pref_change_registrar_.Init(prefs_);
125 pref_change_registrar_.Add(prefs::kBlockThirdPartyCookies, this); 126 pref_change_registrar_.Add(prefs::kBlockThirdPartyCookies, this);
126 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
127 Source<Profile>(profile_));
128 } 127 }
129 128
130 // static 129 // static
131 void HostContentSettingsMap::RegisterUserPrefs(PrefService* prefs) { 130 void HostContentSettingsMap::RegisterUserPrefs(PrefService* prefs) {
132 prefs->RegisterBooleanPref(prefs::kBlockThirdPartyCookies, 131 prefs->RegisterBooleanPref(prefs::kBlockThirdPartyCookies,
133 false, 132 false,
134 PrefService::SYNCABLE_PREF); 133 PrefService::SYNCABLE_PREF);
135 prefs->RegisterIntegerPref(prefs::kContentSettingsWindowLastTabIndex, 134 prefs->RegisterIntegerPref(prefs::kContentSettingsWindowLastTabIndex,
136 0, 135 0,
137 PrefService::UNSYNCABLE_PREF); 136 PrefService::UNSYNCABLE_PREF);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 case CONTENT_SETTINGS_TYPE_GEOLOCATION: 414 case CONTENT_SETTINGS_TYPE_GEOLOCATION:
416 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: 415 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
417 return (setting == CONTENT_SETTING_ASK); 416 return (setting == CONTENT_SETTING_ASK);
418 default: 417 default:
419 return false; 418 return false;
420 } 419 }
421 } 420 }
422 421
423 void HostContentSettingsMap::SetBlockThirdPartyCookies(bool block) { 422 void HostContentSettingsMap::SetBlockThirdPartyCookies(bool block) {
424 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 423 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
424 DCHECK(prefs_);
425 425
426 // This setting may not be directly modified for OTR sessions. Instead, it 426 // This setting may not be directly modified for OTR sessions. Instead, it
427 // is synced to the main profile's setting. 427 // is synced to the main profile's setting.
428 if (is_off_the_record_) { 428 if (is_off_the_record_) {
429 NOTREACHED(); 429 NOTREACHED();
430 return; 430 return;
431 } 431 }
432 432
433 PrefService* prefs = profile_->GetPrefs();
434 // If the preference block-third-party-cookies is managed then do not allow to 433 // If the preference block-third-party-cookies is managed then do not allow to
435 // change it. 434 // change it.
436 if (prefs->IsManagedPreference(prefs::kBlockThirdPartyCookies)) { 435 if (prefs_->IsManagedPreference(prefs::kBlockThirdPartyCookies)) {
437 NOTREACHED(); 436 NOTREACHED();
438 return; 437 return;
439 } 438 }
440 439
441 { 440 {
442 base::AutoLock auto_lock(lock_); 441 base::AutoLock auto_lock(lock_);
443 block_third_party_cookies_ = block; 442 block_third_party_cookies_ = block;
444 } 443 }
445 444
446 profile_->GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, block); 445 prefs_->SetBoolean(prefs::kBlockThirdPartyCookies, block);
447 } 446 }
448 447
449 void HostContentSettingsMap::ResetToDefaults() { 448 void HostContentSettingsMap::ResetToDefaults() {
450 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 449 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
451 450
452 { 451 {
453 base::AutoLock auto_lock(lock_); 452 base::AutoLock auto_lock(lock_);
454 for (DefaultProviderIterator provider = 453 for (DefaultProviderIterator provider =
455 default_content_settings_providers_.begin(); 454 default_content_settings_providers_.begin();
456 provider != default_content_settings_providers_.end(); ++provider) { 455 provider != default_content_settings_providers_.end(); ++provider) {
457 (*provider)->ResetToDefaults(); 456 (*provider)->ResetToDefaults();
458 } 457 }
459 458
460 for (ProviderIterator provider = content_settings_providers_.begin(); 459 for (ProviderIterator provider = content_settings_providers_.begin();
461 provider != content_settings_providers_.end(); 460 provider != content_settings_providers_.end();
462 ++provider) { 461 ++provider) {
463 (*provider)->ResetToDefaults(); 462 (*provider)->ResetToDefaults();
464 } 463 }
465 464
466 // Don't reset block third party cookies if they are managed. 465 // Don't reset block third party cookies if they are managed.
467 if (!IsBlockThirdPartyCookiesManaged()) 466 if (!IsBlockThirdPartyCookiesManaged())
468 block_third_party_cookies_ = false; 467 block_third_party_cookies_ = false;
469 } 468 }
470 469
471 if (!is_off_the_record_) { 470 if (!is_off_the_record_) {
472 PrefService* prefs = profile_->GetPrefs(); 471 DCHECK(prefs_);
473 updating_preferences_ = true; 472 updating_preferences_ = true;
474 // If the block third party cookies preference is managed we still must 473 // If the block third party cookies preference is managed we still must
475 // clear it in order to restore the default value for later when the 474 // clear it in order to restore the default value for later when the
476 // preference is not managed anymore. 475 // preference is not managed anymore.
477 prefs->ClearPref(prefs::kBlockThirdPartyCookies); 476 prefs_->ClearPref(prefs::kBlockThirdPartyCookies);
478 updating_preferences_ = false; 477 updating_preferences_ = false;
479 } 478 }
480 } 479 }
481 480
482 void HostContentSettingsMap::Observe(NotificationType type, 481 void HostContentSettingsMap::Observe(NotificationType type,
483 const NotificationSource& source, 482 const NotificationSource& source,
484 const NotificationDetails& details) { 483 const NotificationDetails& details) {
485 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 484 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
486 485
487 if (type == NotificationType::PREF_CHANGED) { 486 if (type == NotificationType::PREF_CHANGED) {
488 DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr()); 487 DCHECK_EQ(prefs_, Source<PrefService>(source).ptr());
489 if (updating_preferences_) 488 if (updating_preferences_)
490 return; 489 return;
491 490
492 std::string* name = Details<std::string>(details).ptr(); 491 std::string* name = Details<std::string>(details).ptr();
493 if (*name == prefs::kBlockThirdPartyCookies) { 492 if (*name == prefs::kBlockThirdPartyCookies) {
494 base::AutoLock auto_lock(lock_); 493 base::AutoLock auto_lock(lock_);
495 block_third_party_cookies_ = profile_->GetPrefs()->GetBoolean( 494 block_third_party_cookies_ = prefs_->GetBoolean(
496 prefs::kBlockThirdPartyCookies); 495 prefs::kBlockThirdPartyCookies);
497 is_block_third_party_cookies_managed_ = 496 is_block_third_party_cookies_managed_ =
498 profile_->GetPrefs()->IsManagedPreference( 497 prefs_->IsManagedPreference(
499 prefs::kBlockThirdPartyCookies); 498 prefs::kBlockThirdPartyCookies);
500 } else { 499 } else {
501 NOTREACHED() << "Unexpected preference observed"; 500 NOTREACHED() << "Unexpected preference observed";
502 return; 501 return;
503 } 502 }
504 } else if (type == NotificationType::PROFILE_DESTROYED) {
505 DCHECK_EQ(profile_, Source<Profile>(source).ptr());
506 UnregisterObservers();
507 } else { 503 } else {
508 NOTREACHED() << "Unexpected notification"; 504 NOTREACHED() << "Unexpected notification";
509 } 505 }
510 } 506 }
511 507
512 HostContentSettingsMap::~HostContentSettingsMap() { 508 HostContentSettingsMap::~HostContentSettingsMap() {
513 UnregisterObservers(); 509 DCHECK(!prefs_);
514 } 510 }
515 511
516 bool HostContentSettingsMap::IsDefaultContentSettingManaged( 512 bool HostContentSettingsMap::IsDefaultContentSettingManaged(
517 ContentSettingsType content_type) const { 513 ContentSettingsType content_type) const {
518 for (ConstDefaultProviderIterator provider = 514 for (ConstDefaultProviderIterator provider =
519 default_content_settings_providers_.begin(); 515 default_content_settings_providers_.begin();
520 provider != default_content_settings_providers_.end(); ++provider) { 516 provider != default_content_settings_providers_.end(); ++provider) {
521 if ((*provider)->DefaultSettingIsManaged(content_type)) 517 if ((*provider)->DefaultSettingIsManaged(content_type))
522 return true; 518 return true;
523 } 519 }
524 return false; 520 return false;
525 } 521 }
526 522
527 void HostContentSettingsMap::ShutdownOnUIThread() { 523 void HostContentSettingsMap::ShutdownOnUIThread() {
524 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
525 if (!prefs_)
526 return;
527 pref_change_registrar_.RemoveAll();
528 prefs_ = NULL;
528 for (ProviderIterator it = content_settings_providers_.begin(); 529 for (ProviderIterator it = content_settings_providers_.begin();
529 it != content_settings_providers_.end(); 530 it != content_settings_providers_.end();
530 ++it) { 531 ++it) {
531 (*it)->ShutdownOnUIThread(); 532 (*it)->ShutdownOnUIThread();
532 } 533 }
534 for (DefaultProviderIterator it = default_content_settings_providers_.begin();
535 it != default_content_settings_providers_.end();
536 ++it) {
537 (*it)->ShutdownOnUIThread();
538 }
533 } 539 }
534 540
535 void HostContentSettingsMap::UnregisterObservers() { 541 void HostContentSettingsMap::MigrateObsoleteCookiePref() {
536 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 542 if (prefs_->HasPrefPath(prefs::kCookieBehavior)) {
537 if (!profile_) 543 int cookie_behavior = prefs_->GetInteger(prefs::kCookieBehavior);
538 return; 544 prefs_->ClearPref(prefs::kCookieBehavior);
539 pref_change_registrar_.RemoveAll(); 545 if (!prefs_->HasPrefPath(prefs::kDefaultContentSettings)) {
540 notification_registrar_.Remove(this, NotificationType::PROFILE_DESTROYED,
541 Source<Profile>(profile_));
542 profile_ = NULL;
543 }
544
545 void HostContentSettingsMap::MigrateObsoleteCookiePref(PrefService* prefs) {
546 if (prefs->HasPrefPath(prefs::kCookieBehavior)) {
547 int cookie_behavior = prefs->GetInteger(prefs::kCookieBehavior);
548 prefs->ClearPref(prefs::kCookieBehavior);
549 if (!prefs->HasPrefPath(prefs::kDefaultContentSettings)) {
550 SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES, 546 SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES,
551 (cookie_behavior == net::StaticCookiePolicy::BLOCK_ALL_COOKIES) ? 547 (cookie_behavior == net::StaticCookiePolicy::BLOCK_ALL_COOKIES) ?
552 CONTENT_SETTING_BLOCK : CONTENT_SETTING_ALLOW); 548 CONTENT_SETTING_BLOCK : CONTENT_SETTING_ALLOW);
553 } 549 }
554 if (!prefs->HasPrefPath(prefs::kBlockThirdPartyCookies)) { 550 if (!prefs_->HasPrefPath(prefs::kBlockThirdPartyCookies)) {
555 SetBlockThirdPartyCookies(cookie_behavior == 551 SetBlockThirdPartyCookies(cookie_behavior ==
556 net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES); 552 net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES);
557 } 553 }
558 } 554 }
559 } 555 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698