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

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

Issue 7810017: Revert 98938 - Migrate Obsolete NotificationsSettings and remove content_settings::NotificationsP... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 3 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/content_settings_pref_provider.h" 5 #include "chrome/browser/content_settings/content_settings_pref_provider.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 25 matching lines...) Expand all
36 36
37 // The preference keys where resource identifiers are stored for 37 // The preference keys where resource identifiers are stored for
38 // ContentSettingsType values that support resource identifiers. 38 // ContentSettingsType values that support resource identifiers.
39 const char* kResourceTypeNames[] = { 39 const char* kResourceTypeNames[] = {
40 NULL, 40 NULL,
41 NULL, 41 NULL,
42 NULL, 42 NULL,
43 "per_plugin", 43 "per_plugin",
44 NULL, 44 NULL,
45 NULL, 45 NULL,
46 NULL, 46 NULL, // Not used for Notifications
47 NULL, 47 NULL, // Not used for Intents.
48 NULL, 48 NULL,
49 }; 49 };
50 COMPILE_ASSERT(arraysize(kResourceTypeNames) == CONTENT_SETTINGS_NUM_TYPES, 50 COMPILE_ASSERT(arraysize(kResourceTypeNames) == CONTENT_SETTINGS_NUM_TYPES,
51 resource_type_names_incorrect_size); 51 resource_type_names_incorrect_size);
52 52
53 // The default setting for each content type. 53 // The default setting for each content type.
54 const ContentSetting kDefaultSettings[] = { 54 const ContentSetting kDefaultSettings[] = {
55 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_COOKIES 55 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_COOKIES
56 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_IMAGES 56 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_IMAGES
57 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_JAVASCRIPT 57 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_JAVASCRIPT
58 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_PLUGINS 58 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_PLUGINS
59 CONTENT_SETTING_BLOCK, // CONTENT_SETTINGS_TYPE_POPUPS 59 CONTENT_SETTING_BLOCK, // CONTENT_SETTINGS_TYPE_POPUPS
60 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_GEOLOCATION 60 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_GEOLOCATION
61 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_NOTIFICATIONS 61 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_NOTIFICATIONS
62 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_INTENTS 62 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_INTENTS
63 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE 63 CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE
64 }; 64 };
65 COMPILE_ASSERT(arraysize(kDefaultSettings) == CONTENT_SETTINGS_NUM_TYPES, 65 COMPILE_ASSERT(arraysize(kDefaultSettings) == CONTENT_SETTINGS_NUM_TYPES,
66 default_settings_incorrect_size); 66 default_settings_incorrect_size);
67 67
68 // The names of the ContentSettingsType values, for use with dictionary prefs. 68 // The names of the ContentSettingsType values, for use with dictionary prefs.
69 const char* kTypeNames[] = { 69 const char* kTypeNames[] = {
70 "cookies", 70 "cookies",
71 "images", 71 "images",
72 "javascript", 72 "javascript",
73 "plugins", 73 "plugins",
74 "popups", 74 "popups",
75 "geolocation", 75 "geolocation",
76 "notifications", 76 // TODO(markusheintz): Refactoring in progress. Content settings exceptions
77 // for notifications added next.
78 "notifications", // Only used for default Notifications settings.
77 "intents", 79 "intents",
78 "auto-select-certificate" 80 "auto-select-certificate"
79 }; 81 };
80 COMPILE_ASSERT(arraysize(kTypeNames) == CONTENT_SETTINGS_NUM_TYPES, 82 COMPILE_ASSERT(arraysize(kTypeNames) == CONTENT_SETTINGS_NUM_TYPES,
81 type_names_incorrect_size); 83 type_names_incorrect_size);
82 84
83 void SetDefaultContentSettings(DictionaryValue* default_settings) { 85 void SetDefaultContentSettings(DictionaryValue* default_settings) {
84 default_settings->Clear(); 86 default_settings->Clear();
85 87
86 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { 88 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
(...skipping 27 matching lines...) Expand all
114 116
115 ContentSetting FixObsoleteCookiePromptMode(ContentSettingsType content_type, 117 ContentSetting FixObsoleteCookiePromptMode(ContentSettingsType content_type,
116 ContentSetting setting) { 118 ContentSetting setting) {
117 if (content_type == CONTENT_SETTINGS_TYPE_COOKIES && 119 if (content_type == CONTENT_SETTINGS_TYPE_COOKIES &&
118 setting == CONTENT_SETTING_ASK) { 120 setting == CONTENT_SETTING_ASK) {
119 return CONTENT_SETTING_BLOCK; 121 return CONTENT_SETTING_BLOCK;
120 } 122 }
121 return setting; 123 return setting;
122 } 124 }
123 125
124 // Clears all settings for the given |type| in the given |pattern_pairs|
125 // dictionary.
126 void ClearSettings(ContentSettingsType type,
127 DictionaryValue* pattern_pairs) {
128 std::string type_name(kTypeNames[type]);
129 for (DictionaryValue::key_iterator i = pattern_pairs->begin_keys();
130 i != pattern_pairs->end_keys();
131 ++i) {
132 const std::string& pattern_pair(*i);
133
134 DictionaryValue* settings = NULL;
135 pattern_pairs->GetDictionaryWithoutPathExpansion(
136 pattern_pair, &settings);
137
138 settings->RemoveWithoutPathExpansion(type_name, NULL);
139 }
140 }
141
142 } // namespace 126 } // namespace
143 127
144 namespace content_settings { 128 namespace content_settings {
145 129
146 PrefDefaultProvider::PrefDefaultProvider(PrefService* prefs, 130 PrefDefaultProvider::PrefDefaultProvider(PrefService* prefs,
147 bool incognito) 131 bool incognito)
148 : prefs_(prefs), 132 : prefs_(prefs),
149 is_incognito_(incognito), 133 is_incognito_(incognito),
150 updating_preferences_(false) { 134 updating_preferences_(false) {
151 DCHECK(prefs_); 135 DCHECK(prefs_);
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 ContentSettingsPattern::kContentSettingsPatternVersion, 364 ContentSettingsPattern::kContentSettingsPatternVersion,
381 PrefService::UNSYNCABLE_PREF); 365 PrefService::UNSYNCABLE_PREF);
382 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatternPairs, 366 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatternPairs,
383 PrefService::SYNCABLE_PREF); 367 PrefService::SYNCABLE_PREF);
384 368
385 // Obsolete prefs, for migration: 369 // Obsolete prefs, for migration:
386 prefs->RegisterDictionaryPref(prefs::kGeolocationContentSettings, 370 prefs->RegisterDictionaryPref(prefs::kGeolocationContentSettings,
387 PrefService::SYNCABLE_PREF); 371 PrefService::SYNCABLE_PREF);
388 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns, 372 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns,
389 PrefService::SYNCABLE_PREF); 373 PrefService::SYNCABLE_PREF);
390 prefs->RegisterListPref(prefs::kDesktopNotificationAllowedOrigins,
391 PrefService::SYNCABLE_PREF);
392 prefs->RegisterListPref(prefs::kDesktopNotificationDeniedOrigins,
393 PrefService::SYNCABLE_PREF);
394 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts, 374 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts,
395 PrefService::UNSYNCABLE_PREF); 375 PrefService::UNSYNCABLE_PREF);
396 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings, 376 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings,
397 PrefService::UNSYNCABLE_PREF); 377 PrefService::UNSYNCABLE_PREF);
398 } 378 }
399 379
400 PrefProvider::PrefProvider(PrefService* prefs, 380 PrefProvider::PrefProvider(PrefService* prefs,
401 bool incognito) 381 bool incognito)
402 : prefs_(prefs), 382 : prefs_(prefs),
403 is_incognito_(incognito), 383 is_incognito_(incognito),
404 updating_preferences_(false) { 384 updating_preferences_(false) {
405 DCHECK(prefs_); 385 DCHECK(prefs_);
406 if (!is_incognito_) { 386 if (!is_incognito_) {
407 // Migrate obsolete preferences. 387 // Migrate obsolete preferences.
408 MigrateObsoletePerhostPref(); 388 MigrateObsoletePerhostPref();
409 MigrateObsoletePopupsPref(); 389 MigrateObsoletePopupsPref();
410 MigrateObsoleteContentSettingsPatternPref(); 390 MigrateObsoleteContentSettingsPatternPref();
411 MigrateObsoleteGeolocationPref(); 391 MigrateObsoleteGeolocationPref();
412 MigrateObsoleteNotificationsPrefs();
413 } 392 }
414 393
415 // Verify preferences version. 394 // Verify preferences version.
416 if (!prefs_->HasPrefPath(prefs::kContentSettingsVersion)) { 395 if (!prefs_->HasPrefPath(prefs::kContentSettingsVersion)) {
417 prefs_->SetInteger(prefs::kContentSettingsVersion, 396 prefs_->SetInteger(prefs::kContentSettingsVersion,
418 ContentSettingsPattern::kContentSettingsPatternVersion); 397 ContentSettingsPattern::kContentSettingsPatternVersion);
419 } 398 }
420 if (prefs_->GetInteger(prefs::kContentSettingsVersion) > 399 if (prefs_->GetInteger(prefs::kContentSettingsVersion) >
421 ContentSettingsPattern::kContentSettingsPatternVersion) { 400 ContentSettingsPattern::kContentSettingsPatternVersion) {
422 return; 401 return;
423 } 402 }
424 403
425 // Read content settings exceptions. 404 // Read content settings exceptions.
426 ReadContentSettingsFromPref(false); 405 ReadContentSettingsFromPref(false);
427 406
428 if (!is_incognito_) { 407 if (!is_incognito_) {
429 UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfExceptions", 408 UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfExceptions",
430 value_map_.size()); 409 value_map_.size());
431 } 410 }
432 411
433 pref_change_registrar_.Init(prefs_); 412 pref_change_registrar_.Init(prefs_);
434 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this); 413 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this);
435 pref_change_registrar_.Add(prefs::kContentSettingsPatternPairs, this); 414 pref_change_registrar_.Add(prefs::kContentSettingsPatternPairs, this);
436 pref_change_registrar_.Add(prefs::kGeolocationContentSettings, this); 415 pref_change_registrar_.Add(prefs::kGeolocationContentSettings, this);
437 pref_change_registrar_.Add(prefs::kDesktopNotificationAllowedOrigins, this);
438 pref_change_registrar_.Add(prefs::kDesktopNotificationDeniedOrigins, this);
439 } 416 }
440 417
441 ContentSetting PrefProvider::GetContentSetting( 418 ContentSetting PrefProvider::GetContentSetting(
442 const GURL& primary_url, 419 const GURL& primary_url,
443 const GURL& secondary_url, 420 const GURL& secondary_url,
444 ContentSettingsType content_type, 421 ContentSettingsType content_type,
445 const ResourceIdentifier& resource_identifier) const { 422 const ResourceIdentifier& resource_identifier) const {
446 // For a |PrefProvider| used in a |HostContentSettingsMap| of a non incognito 423 // For a |PrefProvider| used in a |HostContentSettingsMap| of a non incognito
447 // profile, this will always return NULL. 424 // profile, this will always return NULL.
448 // TODO(markusheintz): I don't like this. I'd like to have an 425 // TODO(markusheintz): I don't like this. I'd like to have an
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 } 504 }
528 } 505 }
529 506
530 // Update the content settings preference. 507 // Update the content settings preference.
531 if (!is_incognito_) { 508 if (!is_incognito_) {
532 UpdatePref(primary_pattern, 509 UpdatePref(primary_pattern,
533 secondary_pattern, 510 secondary_pattern,
534 content_type, 511 content_type,
535 resource_identifier, 512 resource_identifier,
536 setting); 513 setting);
537 prefs_->ScheduleSavePersistentPrefs();
538 } 514 }
539 515
540 NotifyObservers( 516 NotifyObservers(
541 primary_pattern, secondary_pattern, content_type, resource_identifier); 517 primary_pattern, secondary_pattern, content_type, resource_identifier);
542 } 518 }
543 519
544 void PrefProvider::ClearAllContentSettingsRules( 520 void PrefProvider::ClearAllContentSettingsRules(
545 ContentSettingsType content_type) { 521 ContentSettingsType content_type) {
546 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 522 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
547 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. 523 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
(...skipping 14 matching lines...) Expand all
562 entry->content_type, 538 entry->content_type,
563 entry->identifier, 539 entry->identifier,
564 CONTENT_SETTING_DEFAULT); 540 CONTENT_SETTING_DEFAULT);
565 // Delete current |entry| and set |entry| to the next value map entry. 541 // Delete current |entry| and set |entry| to the next value map entry.
566 entry = map_to_modify->erase(entry); 542 entry = map_to_modify->erase(entry);
567 } else { 543 } else {
568 ++entry; 544 ++entry;
569 } 545 }
570 } 546 }
571 } 547 }
572 prefs_->ScheduleSavePersistentPrefs(); 548
573 NotifyObservers(ContentSettingsPattern(), 549 NotifyObservers(ContentSettingsPattern(),
574 ContentSettingsPattern(), 550 ContentSettingsPattern(),
575 content_type, 551 content_type,
576 std::string()); 552 std::string());
577 } 553 }
578 554
579 void PrefProvider::Observe( 555 void PrefProvider::Observe(
580 int type, 556 int type,
581 const NotificationSource& source, 557 const NotificationSource& source,
582 const NotificationDetails& details) { 558 const NotificationDetails& details) {
583 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 559 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
584 560
585 if (type == chrome::NOTIFICATION_PREF_CHANGED) { 561 if (type == chrome::NOTIFICATION_PREF_CHANGED) {
586 DCHECK_EQ(prefs_, Source<PrefService>(source).ptr()); 562 DCHECK_EQ(prefs_, Source<PrefService>(source).ptr());
587 if (updating_preferences_) 563 if (updating_preferences_)
588 return; 564 return;
589 565
590 if (!is_incognito_) { 566 if (!is_incognito_) {
591 AutoReset<bool> auto_reset(&updating_preferences_, true); 567 AutoReset<bool> auto_reset(&updating_preferences_, true);
592 std::string* name = Details<std::string>(details).ptr(); 568 std::string* name = Details<std::string>(details).ptr();
593 if (*name == prefs::kContentSettingsPatternPairs) { 569 if (*name == prefs::kContentSettingsPatternPairs) {
594 SyncObsoletePatternPref(); 570 SyncObsoletePatternPref();
595 SyncObsoletePrefs(); 571 SyncObsoleteGeolocationPref();
596 } else if (*name == prefs::kContentSettingsPatterns) { 572 } else if (*name == prefs::kContentSettingsPatterns) {
597 MigrateObsoleteContentSettingsPatternPref(); 573 MigrateObsoleteContentSettingsPatternPref();
598 } else if (*name == prefs::kGeolocationContentSettings) { 574 } else if (*name == prefs::kGeolocationContentSettings) {
599 MigrateObsoleteGeolocationPref(); 575 MigrateObsoleteGeolocationPref();
600 } else if (*name == prefs::kDesktopNotificationAllowedOrigins ||
601 *name == prefs::kDesktopNotificationDeniedOrigins) {
602 MigrateObsoleteNotificationsPrefs();
603 } else { 576 } else {
604 NOTREACHED() << "Unexpected preference observed"; 577 NOTREACHED() << "Unexpected preference observed";
605 return; 578 return;
606 } 579 }
607 } 580 }
608 prefs_->ScheduleSavePersistentPrefs();
609 ReadContentSettingsFromPref(true); 581 ReadContentSettingsFromPref(true);
610 582
611 NotifyObservers(ContentSettingsPattern(), 583 NotifyObservers(ContentSettingsPattern(),
612 ContentSettingsPattern(), 584 ContentSettingsPattern(),
613 CONTENT_SETTINGS_TYPE_DEFAULT, 585 CONTENT_SETTINGS_TYPE_DEFAULT,
614 std::string()); 586 std::string());
615 } else { 587 } else {
616 NOTREACHED() << "Unexpected notification"; 588 NOTREACHED() << "Unexpected notification";
617 } 589 }
618 } 590 }
619 591
620 PrefProvider::~PrefProvider() { 592 PrefProvider::~PrefProvider() {
621 DCHECK(!prefs_); 593 DCHECK(!prefs_);
622 } 594 }
623 595
624 // //////////////////////////////////////////////////////////////////////////// 596 // ////////////////////////////////////////////////////////////////////////////
625 // Private 597 // Private
626 598
627 void PrefProvider::UpdatePref( 599 void PrefProvider::UpdatePref(
628 const ContentSettingsPattern& primary_pattern, 600 const ContentSettingsPattern& primary_pattern,
629 const ContentSettingsPattern& secondary_pattern, 601 const ContentSettingsPattern& secondary_pattern,
630 ContentSettingsType content_type, 602 ContentSettingsType content_type,
631 const ResourceIdentifier& resource_identifier, 603 const ResourceIdentifier& resource_identifier,
632 ContentSetting setting) { 604 ContentSetting setting) {
633 AutoReset<bool> auto_reset(&updating_preferences_, true); 605 AutoReset<bool> auto_reset(&updating_preferences_, true);
634 { 606 UpdatePatternPairsPref(primary_pattern,
635 DictionaryPrefUpdate update(prefs_, 607 secondary_pattern,
636 prefs::kContentSettingsPatternPairs); 608 content_type,
637 DictionaryValue* pattern_pairs_settings = update.Get(); 609 resource_identifier,
638 UpdatePatternPairsSettings(primary_pattern, 610 setting);
639 secondary_pattern,
640 content_type,
641 resource_identifier,
642 setting,
643 pattern_pairs_settings);
644 }
645 if (content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION && 611 if (content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION &&
646 content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { 612 content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
647 UpdateObsoletePatternsPref(primary_pattern, 613 UpdateObsoletePatternsPref(primary_pattern,
648 secondary_pattern, 614 secondary_pattern,
649 content_type, 615 content_type,
650 resource_identifier, 616 resource_identifier,
651 setting); 617 setting);
652 } else if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { 618 }
619 if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
653 UpdateObsoleteGeolocationPref(primary_pattern, secondary_pattern, setting); 620 UpdateObsoleteGeolocationPref(primary_pattern, secondary_pattern, setting);
654 } else if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
655 ListPrefUpdate update_allowed_sites(
656 prefs_, prefs::kDesktopNotificationAllowedOrigins);
657 ListPrefUpdate update_denied_sites(
658 prefs_, prefs::kDesktopNotificationDeniedOrigins);
659 UpdateObsoleteNotificationsSettings(primary_pattern,
660 secondary_pattern,
661 setting,
662 update_allowed_sites.Get(),
663 update_denied_sites.Get());
664 } 621 }
665 } 622 }
666 623
667 void PrefProvider::ReadContentSettingsFromPref(bool overwrite) { 624 void PrefProvider::ReadContentSettingsFromPref(bool overwrite) {
668 base::AutoLock auto_lock(lock_); 625 base::AutoLock auto_lock(lock_);
669 626
670 const DictionaryValue* all_settings_dictionary = 627 const DictionaryValue* all_settings_dictionary =
671 prefs_->GetDictionary(prefs::kContentSettingsPatternPairs); 628 prefs_->GetDictionary(prefs::kContentSettingsPatternPairs);
672 629
673 if (overwrite) 630 if (overwrite)
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 } 772 }
816 } 773 }
817 // Remove the settings dictionary if it is empty. 774 // Remove the settings dictionary if it is empty.
818 if (settings_dictionary->empty()) { 775 if (settings_dictionary->empty()) {
819 all_settings_dictionary->RemoveWithoutPathExpansion( 776 all_settings_dictionary->RemoveWithoutPathExpansion(
820 pattern_str, NULL); 777 pattern_str, NULL);
821 } 778 }
822 } 779 }
823 } 780 }
824 781
825 void PrefProvider::UpdatePatternPairsSettings( 782 void PrefProvider::UpdatePatternPairsPref(
826 const ContentSettingsPattern& primary_pattern, 783 const ContentSettingsPattern& primary_pattern,
827 const ContentSettingsPattern& secondary_pattern, 784 const ContentSettingsPattern& secondary_pattern,
828 ContentSettingsType content_type, 785 ContentSettingsType content_type,
829 const ResourceIdentifier& resource_identifier, 786 const ResourceIdentifier& resource_identifier,
830 ContentSetting setting, 787 ContentSetting setting) {
831 DictionaryValue* pattern_pairs_settings) { 788 DictionaryPrefUpdate update(prefs_,
789 prefs::kContentSettingsPatternPairs);
790 DictionaryValue* all_settings_dictionary = update.Get();
791
832 // Get settings dictionary for the given patterns. 792 // Get settings dictionary for the given patterns.
833 std::string pattern_str(CreatePatternString(primary_pattern, 793 std::string pattern_str(CreatePatternString(primary_pattern,
834 secondary_pattern)); 794 secondary_pattern));
835 DictionaryValue* settings_dictionary = NULL; 795 DictionaryValue* settings_dictionary = NULL;
836 bool found = pattern_pairs_settings->GetDictionaryWithoutPathExpansion( 796 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
837 pattern_str, &settings_dictionary); 797 pattern_str, &settings_dictionary);
838 798
839 if (!found && (setting != CONTENT_SETTING_DEFAULT)) { 799 if (!found && (setting != CONTENT_SETTING_DEFAULT)) {
840 settings_dictionary = new DictionaryValue; 800 settings_dictionary = new DictionaryValue;
841 pattern_pairs_settings->SetWithoutPathExpansion( 801 all_settings_dictionary->SetWithoutPathExpansion(
842 pattern_str, settings_dictionary); 802 pattern_str, settings_dictionary);
843 } 803 }
844 804
845 if (settings_dictionary) { 805 if (settings_dictionary) {
846 if (RequiresResourceIdentifier(content_type)) { 806 if (RequiresResourceIdentifier(content_type)) {
847 // Get resource dictionary. 807 // Get resource dictionary.
848 std::string res_dictionary_path(kResourceTypeNames[content_type]); 808 std::string res_dictionary_path(kResourceTypeNames[content_type]);
849 DictionaryValue* resource_dictionary = NULL; 809 DictionaryValue* resource_dictionary = NULL;
850 found = settings_dictionary->GetDictionary( 810 found = settings_dictionary->GetDictionary(
851 res_dictionary_path, &resource_dictionary); 811 res_dictionary_path, &resource_dictionary);
(...skipping 21 matching lines...) Expand all
873 if (setting == CONTENT_SETTING_DEFAULT) { 833 if (setting == CONTENT_SETTING_DEFAULT) {
874 settings_dictionary->RemoveWithoutPathExpansion(setting_path, 834 settings_dictionary->RemoveWithoutPathExpansion(setting_path,
875 NULL); 835 NULL);
876 } else { 836 } else {
877 settings_dictionary->SetWithoutPathExpansion( 837 settings_dictionary->SetWithoutPathExpansion(
878 setting_path, Value::CreateIntegerValue(setting)); 838 setting_path, Value::CreateIntegerValue(setting));
879 } 839 }
880 } 840 }
881 // Remove the settings dictionary if it is empty. 841 // Remove the settings dictionary if it is empty.
882 if (settings_dictionary->empty()) { 842 if (settings_dictionary->empty()) {
883 pattern_pairs_settings->RemoveWithoutPathExpansion( 843 all_settings_dictionary->RemoveWithoutPathExpansion(
884 pattern_str, NULL); 844 pattern_str, NULL);
885 } 845 }
886 } 846 }
887 } 847 }
888 848
889 void PrefProvider::UpdateObsoleteGeolocationPref( 849 void PrefProvider::UpdateObsoleteGeolocationPref(
890 const ContentSettingsPattern& primary_pattern, 850 const ContentSettingsPattern& primary_pattern,
891 const ContentSettingsPattern& secondary_pattern, 851 const ContentSettingsPattern& secondary_pattern,
892 ContentSetting setting) { 852 ContentSetting setting) {
893 if (!prefs_) 853 if (!prefs_)
(...skipping 22 matching lines...) Expand all
916 requesting_origin_settings_dictionary = new DictionaryValue; 876 requesting_origin_settings_dictionary = new DictionaryValue;
917 obsolete_geolocation_settings->SetWithoutPathExpansion( 877 obsolete_geolocation_settings->SetWithoutPathExpansion(
918 requesting_origin.spec(), requesting_origin_settings_dictionary); 878 requesting_origin.spec(), requesting_origin_settings_dictionary);
919 } 879 }
920 DCHECK(requesting_origin_settings_dictionary); 880 DCHECK(requesting_origin_settings_dictionary);
921 requesting_origin_settings_dictionary->SetWithoutPathExpansion( 881 requesting_origin_settings_dictionary->SetWithoutPathExpansion(
922 embedding_origin.spec(), Value::CreateIntegerValue(setting)); 882 embedding_origin.spec(), Value::CreateIntegerValue(setting));
923 } 883 }
924 } 884 }
925 885
926 void PrefProvider::UpdateObsoleteNotificationsSettings(
927 const ContentSettingsPattern& primary_pattern,
928 const ContentSettingsPattern& secondary_pattern,
929 ContentSetting setting,
930 ListValue* allowed_sites,
931 ListValue* denied_sites) {
932 DCHECK_EQ(secondary_pattern, ContentSettingsPattern::Wildcard());
933 GURL origin(primary_pattern.ToString());
934 DCHECK(origin.is_valid());
935 scoped_ptr<StringValue> value(new StringValue(origin.spec()));
936 if (setting == CONTENT_SETTING_ALLOW) {
937 denied_sites->Remove(*value, NULL);
938 allowed_sites->AppendIfNotPresent(value.release());
939 } else if (setting == CONTENT_SETTING_BLOCK) {
940 allowed_sites->Remove(*value, NULL);
941 denied_sites->AppendIfNotPresent(value.release());
942 } else if (setting == CONTENT_SETTING_DEFAULT) {
943 denied_sites->Remove(*value, NULL);
944 allowed_sites->Remove(*value, NULL);
945 } else {
946 NOTREACHED() << "Setting value: " << setting
947 << " is not supported for notifications";
948 }
949 }
950
951 // static 886 // static
952 void PrefProvider::CanonicalizeContentSettingsExceptions( 887 void PrefProvider::CanonicalizeContentSettingsExceptions(
953 DictionaryValue* all_settings_dictionary) { 888 DictionaryValue* all_settings_dictionary) {
954 DCHECK(all_settings_dictionary); 889 DCHECK(all_settings_dictionary);
955 890
956 std::vector<std::string> remove_items; 891 std::vector<std::string> remove_items;
957 std::vector<std::pair<std::string, std::string> > move_items; 892 std::vector<std::pair<std::string, std::string> > move_items;
958 for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys()); 893 for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys());
959 i != all_settings_dictionary->end_keys(); ++i) { 894 i != all_settings_dictionary->end_keys(); ++i) {
960 const std::string& pattern_str(*i); 895 const std::string& pattern_str(*i);
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 new_key, settings_dictionary_copy.release()); 1153 new_key, settings_dictionary_copy.release());
1219 } 1154 }
1220 } 1155 }
1221 } 1156 }
1222 } 1157 }
1223 1158
1224 void PrefProvider::MigrateObsoleteGeolocationPref() { 1159 void PrefProvider::MigrateObsoleteGeolocationPref() {
1225 if (!prefs_->HasPrefPath(prefs::kGeolocationContentSettings)) 1160 if (!prefs_->HasPrefPath(prefs::kGeolocationContentSettings))
1226 return; 1161 return;
1227 1162
1228 DictionaryPrefUpdate update(prefs_,
1229 prefs::kContentSettingsPatternPairs);
1230 DictionaryValue* pattern_pairs_settings = update.Get();
1231
1232 const DictionaryValue* geolocation_settings = 1163 const DictionaryValue* geolocation_settings =
1233 prefs_->GetDictionary(prefs::kGeolocationContentSettings); 1164 prefs_->GetDictionary(prefs::kGeolocationContentSettings);
1234 for (DictionaryValue::key_iterator i = 1165 for (DictionaryValue::key_iterator i =
1235 geolocation_settings->begin_keys(); 1166 geolocation_settings->begin_keys();
1236 i != geolocation_settings->end_keys(); 1167 i != geolocation_settings->end_keys();
1237 ++i) { 1168 ++i) {
1238 const std::string& primary_key(*i); 1169 const std::string& primary_key(*i);
1239 GURL primary_url(primary_key); 1170 GURL primary_url(primary_key);
1240 DCHECK(primary_url.is_valid()); 1171 DCHECK(primary_url.is_valid());
1241 1172
(...skipping 14 matching lines...) Expand all
1256 found = requesting_origin_settings->GetIntegerWithoutPathExpansion( 1187 found = requesting_origin_settings->GetIntegerWithoutPathExpansion(
1257 secondary_key, &setting_value); 1188 secondary_key, &setting_value);
1258 DCHECK(found); 1189 DCHECK(found);
1259 1190
1260 ContentSettingsPattern primary_pattern = 1191 ContentSettingsPattern primary_pattern =
1261 ContentSettingsPattern::FromURLNoWildcard(primary_url); 1192 ContentSettingsPattern::FromURLNoWildcard(primary_url);
1262 ContentSettingsPattern secondary_pattern = 1193 ContentSettingsPattern secondary_pattern =
1263 ContentSettingsPattern::FromURLNoWildcard(secondary_url); 1194 ContentSettingsPattern::FromURLNoWildcard(secondary_url);
1264 DCHECK(primary_pattern.IsValid() && secondary_pattern.IsValid()); 1195 DCHECK(primary_pattern.IsValid() && secondary_pattern.IsValid());
1265 1196
1266 UpdatePatternPairsSettings(primary_pattern, 1197 UpdatePatternPairsPref(primary_pattern,
1267 secondary_pattern, 1198 secondary_pattern,
1268 CONTENT_SETTINGS_TYPE_GEOLOCATION, 1199 CONTENT_SETTINGS_TYPE_GEOLOCATION,
1269 std::string(), 1200 std::string(),
1270 IntToContentSetting(setting_value), 1201 IntToContentSetting(setting_value));
1271 pattern_pairs_settings);
1272 } 1202 }
1273 } 1203 }
1274 } 1204 }
1275 1205
1276 void PrefProvider::MigrateObsoleteNotificationsPrefs() { 1206 void PrefProvider::SyncObsoleteGeolocationPref() {
1277 // The notifications settings in the preferences
1278 // prefs::kContentSettingsPatternPairs do not contain the latest
1279 // notifications settings. So all notification settings are cleared and
1280 // migrated from the obsolete preferences for notifications settings that
1281 // contain the latest settings.
1282 DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs);
1283 DictionaryValue* pattern_pairs_settings = update.Get();
1284 ClearSettings(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, pattern_pairs_settings);
1285
1286 const ListValue* allowed_origins =
1287 prefs_->GetList(prefs::kDesktopNotificationAllowedOrigins);
1288 for (size_t i = 0; i < allowed_origins->GetSize(); ++i) {
1289 std::string url_string;
1290 bool status = allowed_origins->GetString(i, &url_string);
1291 DCHECK(status);
1292 ContentSettingsPattern primary_pattern =
1293 ContentSettingsPattern::FromURLNoWildcard(GURL(url_string));
1294 DCHECK(primary_pattern.IsValid());
1295 UpdatePatternPairsSettings(primary_pattern,
1296 ContentSettingsPattern::Wildcard(),
1297 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
1298 std::string(),
1299 CONTENT_SETTING_ALLOW,
1300 pattern_pairs_settings);
1301 }
1302
1303 const ListValue* denied_origins =
1304 prefs_->GetList(prefs::kDesktopNotificationDeniedOrigins);
1305 for (size_t i = 0; i < denied_origins->GetSize(); ++i) {
1306 std::string url_string;
1307 bool status = denied_origins->GetString(i, &url_string);
1308 DCHECK(status);
1309 ContentSettingsPattern primary_pattern =
1310 ContentSettingsPattern::FromURLNoWildcard(GURL(url_string));
1311 DCHECK(primary_pattern.IsValid());
1312 UpdatePatternPairsSettings(primary_pattern,
1313 ContentSettingsPattern::Wildcard(),
1314 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
1315 std::string(),
1316 CONTENT_SETTING_BLOCK,
1317 pattern_pairs_settings);
1318 }
1319 }
1320
1321 void PrefProvider::SyncObsoletePrefs() {
1322 DCHECK(prefs_); 1207 DCHECK(prefs_);
1323 DCHECK(prefs_->HasPrefPath(prefs::kContentSettingsPatternPairs)); 1208 DCHECK(prefs_->HasPrefPath(prefs::kContentSettingsPatternPairs));
1324 1209
1325 // Clear obsolete preferences first. Then copy the settings from the new 1210 // Clear the obsolete preference for geolocation settings. Then copy all
1326 // preference to the obsolete ones. 1211 // geolocation settings from the new preference to the obsolete one.
1327 prefs_->ClearPref(prefs::kGeolocationContentSettings); 1212 prefs_->ClearPref(prefs::kGeolocationContentSettings);
1328 prefs_->ClearPref(prefs::kDesktopNotificationAllowedOrigins);
1329 prefs_->ClearPref(prefs::kDesktopNotificationDeniedOrigins);
1330
1331 ListPrefUpdate update_allowed_origins(
1332 prefs_, prefs::kDesktopNotificationAllowedOrigins);
1333 ListPrefUpdate update_denied_origins(
1334 prefs_, prefs::kDesktopNotificationDeniedOrigins);
1335 ListValue* allowed_origins = update_allowed_origins.Get();
1336 ListValue* denied_origins = update_denied_origins.Get();
1337
1338 const DictionaryValue* pattern_pairs_dictionary = 1213 const DictionaryValue* pattern_pairs_dictionary =
1339 prefs_->GetDictionary(prefs::kContentSettingsPatternPairs); 1214 prefs_->GetDictionary(prefs::kContentSettingsPatternPairs);
1340 for (DictionaryValue::key_iterator i = 1215 for (DictionaryValue::key_iterator i =
1341 pattern_pairs_dictionary->begin_keys(); 1216 pattern_pairs_dictionary->begin_keys();
1342 i != pattern_pairs_dictionary->end_keys(); 1217 i != pattern_pairs_dictionary->end_keys();
1343 ++i) { 1218 ++i) {
1344 const std::string& key(*i); 1219 const std::string& key(*i);
1345 std::pair<ContentSettingsPattern, ContentSettingsPattern> pattern_pair = 1220 std::pair<ContentSettingsPattern, ContentSettingsPattern> pattern_pair =
1346 ParsePatternString(key); 1221 ParsePatternString(key);
1347 DCHECK(pattern_pair.first.IsValid() && pattern_pair.second.IsValid()); 1222 DCHECK(pattern_pair.first.IsValid() && pattern_pair.second.IsValid());
1348 1223
1349 DictionaryValue* settings_dictionary = NULL; 1224 DictionaryValue* settings_dictionary = NULL;
1350 pattern_pairs_dictionary->GetDictionaryWithoutPathExpansion( 1225 bool found = pattern_pairs_dictionary->GetDictionaryWithoutPathExpansion(
1351 key, &settings_dictionary); 1226 key, &settings_dictionary);
1227 DCHECK(found);
1352 1228
1353 int setting_value = 0; 1229 if (settings_dictionary->HasKey(
1354 if (settings_dictionary->GetInteger( 1230 kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION])) {
1355 kTypeNames[CONTENT_SETTINGS_TYPE_NOTIFICATIONS], &setting_value)) { 1231 int setting_value;
1356 UpdateObsoleteNotificationsSettings(pattern_pair.first, 1232 settings_dictionary->GetInteger(
1357 pattern_pair.second, 1233 kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION], &setting_value);
1358 ContentSetting(setting_value),
1359 allowed_origins,
1360 denied_origins);
1361 }
1362 1234
1363 setting_value = 0;
1364 if (settings_dictionary->GetInteger(
1365 kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION], &setting_value)) {
1366 UpdateObsoleteGeolocationPref(pattern_pair.first, 1235 UpdateObsoleteGeolocationPref(pattern_pair.first,
1367 pattern_pair.second, 1236 pattern_pair.second,
1368 ContentSetting(setting_value)); 1237 ContentSetting(setting_value));
1369 } 1238 }
1370 } 1239 }
1371 } 1240 }
1372 1241
1373 } // namespace content_settings 1242 } // namespace content_settings
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698