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

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

Issue 7049007: Origin Identifier Value Map. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: " Created 9 years, 7 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 <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 default_settings->Clear(); 76 default_settings->Clear();
77 77
78 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { 78 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
79 if (kTypeNames[i] != NULL) { 79 if (kTypeNames[i] != NULL) {
80 default_settings->SetInteger(kTypeNames[i], 80 default_settings->SetInteger(kTypeNames[i],
81 kDefaultSettings[i]); 81 kDefaultSettings[i]);
82 } 82 }
83 } 83 }
84 } 84 }
85 85
86 std::string CreatePatternString(
87 const ContentSettingsPattern& requesting_pattern,
88 const ContentSettingsPattern& embedding_pattern) {
89 DCHECK(requesting_pattern == embedding_pattern);
90 return requesting_pattern.ToString();
91 }
92
93 ContentSetting ValueToContentSetting(Value * value) {
Bernhard Bauer 2011/05/24 14:21:29 Nit: no space between |Value| and |*|
markusheintz_ 2011/05/26 13:22:13 Done.
94 DCHECK(value);
Bernhard Bauer 2011/05/24 14:21:29 Nit: I think that DCHECK is kind of unnecessary (G
markusheintz_ 2011/05/26 13:22:13 Done.
95 int int_value;
96 value->GetAsInteger(&int_value);
97 return IntToContentSetting(int_value);
98 }
99
86 } // namespace 100 } // namespace
87 101
88 namespace content_settings { 102 namespace content_settings {
89 103
90 PrefDefaultProvider::PrefDefaultProvider(Profile* profile) 104 PrefDefaultProvider::PrefDefaultProvider(Profile* profile)
91 : profile_(profile), 105 : profile_(profile),
92 is_incognito_(profile_->IsOffTheRecord()), 106 is_incognito_(profile_->IsOffTheRecord()),
93 updating_preferences_(false) { 107 updating_preferences_(false) {
94 initializing_ = true; 108 initializing_ = true;
95 PrefService* prefs = profile->GetPrefs(); 109 PrefService* prefs = profile->GetPrefs();
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 PrefService::SYNCABLE_PREF); 351 PrefService::SYNCABLE_PREF);
338 352
339 // Obsolete prefs, for migration: 353 // Obsolete prefs, for migration:
340 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts, 354 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts,
341 PrefService::UNSYNCABLE_PREF); 355 PrefService::UNSYNCABLE_PREF);
342 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings, 356 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings,
343 PrefService::UNSYNCABLE_PREF); 357 PrefService::UNSYNCABLE_PREF);
344 } 358 }
345 359
346 PrefProvider::PrefProvider(Profile* profile) 360 PrefProvider::PrefProvider(Profile* profile)
347 : BaseProvider(profile->IsOffTheRecord()), 361 : profile_(profile),
348 profile_(profile), 362 is_incognito_(profile_->IsOffTheRecord()),
349 updating_preferences_(false) { 363 updating_preferences_(false) {
350 Init(); 364 Init();
351 } 365 }
352 366
353 void PrefProvider::Init() { 367 void PrefProvider::Init() {
354 initializing_ = true; 368 initializing_ = true;
355 PrefService* prefs = profile_->GetPrefs(); 369 PrefService* prefs = profile_->GetPrefs();
356 370
357 // Migrate obsolete preferences. 371 // Migrate obsolete preferences.
358 MigrateObsoletePerhostPref(prefs); 372 MigrateObsoletePerhostPref(prefs);
(...skipping 14 matching lines...) Expand all
373 ReadExceptions(false); 387 ReadExceptions(false);
374 388
375 pref_change_registrar_.Init(prefs); 389 pref_change_registrar_.Init(prefs);
376 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this); 390 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this);
377 391
378 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, 392 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
379 Source<Profile>(profile_)); 393 Source<Profile>(profile_));
380 initializing_ = false; 394 initializing_ = false;
381 } 395 }
382 396
397 ContentSetting PrefProvider::GetContentSetting(
398 const GURL& requesting_url,
399 const GURL& embedding_url,
400 ContentSettingsType content_type,
401 const ResourceIdentifier& resource_identifier) const {
402 // Support for item, top-level-frame URLs are not enabled yet.
403 DCHECK(requesting_url == embedding_url);
404
405 // For a non incognito provider this will alwasy return NULL.
Bernhard Bauer 2011/05/24 14:21:29 Nit: "always"
Bernhard Bauer 2011/05/24 14:21:29 How does this work? Do we have separate providers
markusheintz_ 2011/05/26 13:22:13 Done.
markusheintz_ 2011/05/26 13:22:13 Sorry that comment was garbage. Fixed
406 Value* incognito_value = incognito_value_map_.GetValue(
407 requesting_url,
408 embedding_url,
409 content_type,
410 resource_identifier);
411 if (incognito_value != NULL)
Bernhard Bauer 2011/05/24 14:21:29 Nit: just |if (incognito_value)|?
markusheintz_ 2011/05/26 13:22:13 Done. Also for the if (value ... below
412 return ValueToContentSetting(incognito_value);
413
414 Value* value = value_map_.GetValue(
415 requesting_url,
416 embedding_url,
417 content_type,
418 resource_identifier);
419 if (value != NULL)
420 return ValueToContentSetting(value);
421
422 return CONTENT_SETTING_DEFAULT;
423 }
424
425 void PrefProvider::GetAllContentSettingsRules(
426 ContentSettingsType content_type,
427 const ResourceIdentifier& resource_identifier,
428 Rules* content_setting_rules) const {
429 DCHECK_NE(BaseProvider::RequiresResourceIdentifier(content_type),
430 resource_identifier.empty());
431 DCHECK(content_setting_rules);
432 content_setting_rules->clear();
433
434 const OriginIdentifierValueMap* map_to_return =
435 is_incognito_ ? &incognito_value_map_ : &value_map_;
436
437 base::AutoLock auto_lock(lock_);
438 for (OriginIdentifierValueMap::ConstIterator entry = map_to_return->Begin();
439 entry != map_to_return->End();
440 ++entry) {
441 if (entry->c == content_type && entry->d == resource_identifier) {
442 ContentSetting setting = ValueToContentSetting(entry->e);
443 DCHECK(setting != CONTENT_SETTING_DEFAULT);
444 content_setting_rules->push_back(Rule(entry->a, entry->b, setting));
445 }
446 }
447 }
448
383 void PrefProvider::SetContentSetting( 449 void PrefProvider::SetContentSetting(
384 const ContentSettingsPattern& requesting_pattern, 450 const ContentSettingsPattern& requesting_pattern,
385 const ContentSettingsPattern& embedding_pattern, 451 const ContentSettingsPattern& embedding_pattern,
386 ContentSettingsType content_type, 452 ContentSettingsType content_type,
387 const ResourceIdentifier& resource_identifier, 453 const ResourceIdentifier& resource_identifier,
388 ContentSetting setting) { 454 ContentSetting setting) {
389 // Support for embedding_patterns is not implemented yet. 455 // Support for embedding_patterns is not implemented yet.
390 DCHECK(requesting_pattern == embedding_pattern); 456 DCHECK(requesting_pattern == embedding_pattern);
391 457
392 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. 458 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
393 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 459 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
394 DCHECK_NE(RequiresResourceIdentifier(content_type), 460 DCHECK_NE(BaseProvider::RequiresResourceIdentifier(content_type),
395 resource_identifier.empty()); 461 resource_identifier.empty());
396 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS || 462 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS ||
397 setting != CONTENT_SETTING_ASK || 463 setting != CONTENT_SETTING_ASK ||
398 CommandLine::ForCurrentProcess()->HasSwitch( 464 CommandLine::ForCurrentProcess()->HasSwitch(
399 switches::kEnableClickToPlay)); 465 switches::kEnableClickToPlay));
400 466
401 bool early_exit = false;
402 std::string pattern_str(requesting_pattern.ToString());
403 DictionaryValue* all_settings_dictionary = NULL;
404
405 updating_preferences_ = true; 467 updating_preferences_ = true;
406 { 468 {
407 // Begin scope of update.
408 // profile_ may be NULL in unit tests.
409 DictionaryPrefUpdate update(profile_ ? profile_->GetPrefs() : NULL, 469 DictionaryPrefUpdate update(profile_ ? profile_->GetPrefs() : NULL,
410 prefs::kContentSettingsPatterns); 470 prefs::kContentSettingsPatterns);
471 DictionaryValue* all_settings_dictionary = NULL;
411 472
412 // Select content-settings-map to write to. 473 OriginIdentifierValueMap* map_to_modify = &incognito_value_map_;
413 HostContentSettings* map_to_modify = incognito_settings(); 474 if (!is_incognito_) {
414 if (!is_incognito()) { 475 map_to_modify = &value_map_;
415 all_settings_dictionary = update.Get(); 476 all_settings_dictionary = update.Get();
416
417 map_to_modify = host_content_settings();
418 } 477 }
419 478
420 // Update content-settings-map. 479 // Update in memory value map.
421 { 480 {
422 base::AutoLock auto_lock(lock()); 481 base::AutoLock auto_lock(lock_);
423 if (!map_to_modify->count(pattern_str)) 482 if (setting == CONTENT_SETTING_DEFAULT) {
424 (*map_to_modify)[pattern_str].content_settings = ContentSettings(); 483 map_to_modify->DeleteValue(
425 HostContentSettings::iterator i(map_to_modify->find(pattern_str)); 484 requesting_pattern,
426 ContentSettings& settings = i->second.content_settings; 485 embedding_pattern,
427 if (RequiresResourceIdentifier(content_type)) { 486 content_type,
428 settings.settings[content_type] = CONTENT_SETTING_DEFAULT; 487 resource_identifier);
429 if (setting != CONTENT_SETTING_DEFAULT) {
430 i->second.content_settings_for_resources[
431 ContentSettingsTypeResourceIdentifierPair(content_type,
432 resource_identifier)] = setting;
433 } else {
434 i->second.content_settings_for_resources.erase(
435 ContentSettingsTypeResourceIdentifierPair(content_type,
436 resource_identifier));
437 }
438 } else { 488 } else {
439 settings.settings[content_type] = setting; 489 map_to_modify->SetValue(
440 } 490 requesting_pattern,
441 if (AllDefault(i->second)) { 491 embedding_pattern,
442 map_to_modify->erase(i); 492 content_type,
443 if (all_settings_dictionary) 493 resource_identifier,
444 all_settings_dictionary->RemoveWithoutPathExpansion( 494 Value::CreateIntegerValue(setting));
445 pattern_str, NULL);
446
447 // We can't just return because |NotifyObservers()| needs to be called,
448 // without lock() being held.
449 early_exit = true;
450 } 495 }
451 } 496 }
452 497
453 // Update the content_settings preference. 498 // Update the content settings preference.
454 if (!early_exit && all_settings_dictionary) { 499 std::string pattern_str(CreatePatternString(requesting_pattern,
455 DictionaryValue* host_settings_dictionary = NULL; 500 embedding_pattern));
501 if (all_settings_dictionary) {
502 // Get settings dictionary for the pattern string (key).
503 DictionaryValue* settings_dictionary = NULL;
456 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion( 504 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
457 pattern_str, &host_settings_dictionary); 505 pattern_str, &settings_dictionary);
506
458 if (!found) { 507 if (!found) {
459 host_settings_dictionary = new DictionaryValue; 508 if (setting == CONTENT_SETTING_DEFAULT)
509 return; // Nothing to remove. Exit early.
510 settings_dictionary = new DictionaryValue;
460 all_settings_dictionary->SetWithoutPathExpansion( 511 all_settings_dictionary->SetWithoutPathExpansion(
461 pattern_str, host_settings_dictionary); 512 pattern_str, settings_dictionary);
462 DCHECK_NE(setting, CONTENT_SETTING_DEFAULT);
463 } 513 }
464 if (RequiresResourceIdentifier(content_type)) { 514
465 std::string dictionary_path(kResourceTypeNames[content_type]); 515 if (BaseProvider::RequiresResourceIdentifier(content_type)) {
516 // Get resource dictionary.
517 std::string res_dictionary_path(kResourceTypeNames[content_type]);
466 DictionaryValue* resource_dictionary = NULL; 518 DictionaryValue* resource_dictionary = NULL;
467 found = host_settings_dictionary->GetDictionary( 519 found = settings_dictionary->GetDictionary(
468 dictionary_path, &resource_dictionary); 520 res_dictionary_path, &resource_dictionary);
469 if (!found) { 521 if (!found) {
522 if (setting == CONTENT_SETTING_DEFAULT)
523 return; // Nothing to remove. Exit early.
470 resource_dictionary = new DictionaryValue; 524 resource_dictionary = new DictionaryValue;
471 host_settings_dictionary->Set(dictionary_path, resource_dictionary); 525 settings_dictionary->Set(res_dictionary_path, resource_dictionary);
472 } 526 }
527 // Update resource dictionary.
473 if (setting == CONTENT_SETTING_DEFAULT) { 528 if (setting == CONTENT_SETTING_DEFAULT) {
474 resource_dictionary->RemoveWithoutPathExpansion(resource_identifier, 529 resource_dictionary->RemoveWithoutPathExpansion(resource_identifier,
475 NULL); 530 NULL);
531 if (resource_dictionary->empty()) {
532 settings_dictionary->RemoveWithoutPathExpansion(
533 res_dictionary_path, NULL);
534 }
476 } else { 535 } else {
477 resource_dictionary->SetWithoutPathExpansion( 536 resource_dictionary->SetWithoutPathExpansion(
478 resource_identifier, Value::CreateIntegerValue(setting)); 537 resource_identifier, Value::CreateIntegerValue(setting));
479 } 538 }
480 } else { 539 } else {
481 std::string dictionary_path(kTypeNames[content_type]); 540 // Update settings dictionary.
541 std::string setting_path(kTypeNames[content_type]);
482 if (setting == CONTENT_SETTING_DEFAULT) { 542 if (setting == CONTENT_SETTING_DEFAULT) {
483 host_settings_dictionary->RemoveWithoutPathExpansion(dictionary_path, 543 settings_dictionary->RemoveWithoutPathExpansion(setting_path,
484 NULL); 544 NULL);
485 } else { 545 } else {
486 host_settings_dictionary->SetWithoutPathExpansion( 546 settings_dictionary->SetWithoutPathExpansion(
487 dictionary_path, Value::CreateIntegerValue(setting)); 547 setting_path, Value::CreateIntegerValue(setting));
488 } 548 }
489 } 549 }
550 // Remove the settings dictionary if it is empty.
551 if (settings_dictionary->empty()) {
552 all_settings_dictionary->RemoveWithoutPathExpansion(
553 pattern_str, NULL);
554 }
490 } 555 }
491 } // End scope of update. 556 }
492 updating_preferences_ = false; 557 updating_preferences_ = false;
493 558
494 NotifyObservers(ContentSettingsDetails(requesting_pattern, content_type, "")); 559 NotifyObservers(ContentSettingsDetails(requesting_pattern, content_type, ""));
495 } 560 }
496 561
497 void PrefProvider::ResetToDefaults() { 562 void PrefProvider::ResetToDefaults() {
498 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 563 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
499 564
500 { 565 {
501 base::AutoLock auto_lock(lock()); 566 base::AutoLock auto_lock(lock_);
502 host_content_settings()->clear(); 567 value_map_.Clear();
503 incognito_settings()->clear(); 568 incognito_value_map_.Clear();
504 } 569 }
505 570
506 if (!is_incognito()) { 571 if (!is_incognito_) {
507 PrefService* prefs = profile_->GetPrefs(); 572 PrefService* prefs = profile_->GetPrefs();
508 updating_preferences_ = true; 573 updating_preferences_ = true;
509 prefs->ClearPref(prefs::kContentSettingsPatterns); 574 prefs->ClearPref(prefs::kContentSettingsPatterns);
510 updating_preferences_ = false; 575 updating_preferences_ = false;
511 } 576 }
512 } 577 }
513 578
514 void PrefProvider::ClearAllContentSettingsRules( 579 void PrefProvider::ClearAllContentSettingsRules(
515 ContentSettingsType content_type) { 580 ContentSettingsType content_type) {
516 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. 581 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
517 582
518 DictionaryValue* all_settings_dictionary = NULL;
519 HostContentSettings* map_to_modify = incognito_settings();
520
521 updating_preferences_ = true; 583 updating_preferences_ = true;
522 { // Begin scope of update. 584 { // Begin scope of update.
523 DictionaryPrefUpdate update(profile_->GetPrefs(), 585 DictionaryPrefUpdate update(profile_->GetPrefs(),
524 prefs::kContentSettingsPatterns); 586 prefs::kContentSettingsPatterns);
525 587
526 if (!is_incognito()) { 588 DictionaryValue* all_settings_dictionary = NULL;
589 OriginIdentifierValueMap* map_to_modify = &incognito_value_map_;
590 if (!is_incognito_) {
527 all_settings_dictionary = update.Get(); 591 all_settings_dictionary = update.Get();
528 map_to_modify = host_content_settings(); 592 map_to_modify = &value_map_;
529 } 593 }
530 594
531 { 595 {
532 base::AutoLock auto_lock(lock()); 596 base::AutoLock auto_lock(lock_);
533 for (HostContentSettings::iterator i(map_to_modify->begin()); 597
534 i != map_to_modify->end(); ) { 598 OriginIdentifierValueMap::Iterator entry(map_to_modify->Begin());
535 if (RequiresResourceIdentifier(content_type) || 599 while (entry != map_to_modify->End()) {
536 i->second.content_settings.settings[content_type] != 600 // TODO: What happens if no resource identifier is required?
Bernhard Bauer 2011/05/24 14:21:29 Nit: TODO(markusheintz) ;-)
markusheintz_ 2011/05/26 13:22:13 Removed.
537 CONTENT_SETTING_DEFAULT) { 601 if (entry->c == content_type) {
538 if (RequiresResourceIdentifier(content_type)) 602 std::string pattern_str = CreatePatternString(entry->a, entry->b);
539 i->second.content_settings_for_resources.clear(); 603 // Delete current |entry| and set |entry| to the next value map entry.
540 i->second.content_settings.settings[content_type] = 604 entry = map_to_modify->DeleteValue(entry);
541 CONTENT_SETTING_DEFAULT; 605
542 std::string host(i->first); 606 // Update the content settings preference.
543 if (AllDefault(i->second)) { 607 if (all_settings_dictionary) {
544 if (all_settings_dictionary) 608 // Update the settings dictionary.
545 all_settings_dictionary->RemoveWithoutPathExpansion(host, NULL); 609 DictionaryValue* settings_dictionary;
546 map_to_modify->erase(i++);
547 } else if (all_settings_dictionary) {
548 DictionaryValue* host_settings_dictionary;
549 bool found = 610 bool found =
550 all_settings_dictionary->GetDictionaryWithoutPathExpansion( 611 all_settings_dictionary->GetDictionaryWithoutPathExpansion(
551 host, &host_settings_dictionary); 612 pattern_str, &settings_dictionary);
552 DCHECK(found); 613 DCHECK(found);
553 host_settings_dictionary->RemoveWithoutPathExpansion( 614 settings_dictionary->RemoveWithoutPathExpansion(
554 kTypeNames[content_type], NULL); 615 kTypeNames[content_type], NULL);
555 ++i; 616 // Remove empty dictionaries.
617 if (settings_dictionary->empty())
618 all_settings_dictionary->RemoveWithoutPathExpansion(pattern_str,
619 NULL);
556 } 620 }
557 } else { 621 } else {
558 ++i; 622 // No action required move to next value map entry.
Bernhard Bauer 2011/05/24 14:21:29 Nit: semicolon between "No action required" and "m
markusheintz_ 2011/05/26 13:22:13 Done.
623 ++entry;
559 } 624 }
560 } 625 }
561 } 626 }
562 } // End scope of update. 627 } // End scope of update.
563 updating_preferences_ = false; 628 updating_preferences_ = false;
564 629
565 NotifyObservers( 630 NotifyObservers(
566 ContentSettingsDetails(ContentSettingsPattern(), content_type, "")); 631 ContentSettingsDetails(ContentSettingsPattern(), content_type, ""));
567 } 632 }
568 633
569 void PrefProvider::Observe( 634 void PrefProvider::Observe(
570 NotificationType type, 635 NotificationType type,
571 const NotificationSource& source, 636 const NotificationSource& source,
572 const NotificationDetails& details) { 637 const NotificationDetails& details) {
573 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 638 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
574 639
575 if (type == NotificationType::PREF_CHANGED) { 640 if (type == NotificationType::PREF_CHANGED) {
576 DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr()); 641 DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
577 if (updating_preferences_) 642 if (updating_preferences_)
578 return; 643 return;
579 644
580 std::string* name = Details<std::string>(details).ptr(); 645 std::string* name = Details<std::string>(details).ptr();
581 if (*name == prefs::kContentSettingsPatterns) { 646 if (*name == prefs::kContentSettingsPatterns) {
582 ReadExceptions(true); 647 ReadExceptions(true);
583 } else { 648 } else {
584 NOTREACHED() << "Unexpected preference observed"; 649 NOTREACHED() << "Unexpected preference observed";
585 return; 650 return;
586 } 651 }
587 652
588 if (!is_incognito()) { 653 if (!is_incognito_) {
589 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), 654 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(),
590 CONTENT_SETTINGS_TYPE_DEFAULT, 655 CONTENT_SETTINGS_TYPE_DEFAULT,
591 "")); 656 ""));
592 } 657 }
593 } else if (type == NotificationType::PROFILE_DESTROYED) { 658 } else if (type == NotificationType::PROFILE_DESTROYED) {
594 DCHECK_EQ(profile_, Source<Profile>(source).ptr()); 659 DCHECK_EQ(profile_, Source<Profile>(source).ptr());
595 UnregisterObservers(); 660 UnregisterObservers();
596 } else { 661 } else {
597 NOTREACHED() << "Unexpected notification"; 662 NOTREACHED() << "Unexpected notification";
598 } 663 }
599 } 664 }
600 665
601 PrefProvider::~PrefProvider() { 666 PrefProvider::~PrefProvider() {
602 UnregisterObservers(); 667 UnregisterObservers();
603 } 668 }
604 669
605 // //////////////////////////////////////////////////////////////////////////// 670 // ////////////////////////////////////////////////////////////////////////////
606 // Private 671 // Private
607 672
608 void PrefProvider::ReadExceptions(bool overwrite) { 673 void PrefProvider::ReadExceptions(bool overwrite) {
609 base::AutoLock auto_lock(lock()); 674 base::AutoLock auto_lock(lock_);
610 675
611 PrefService* prefs = profile_->GetPrefs(); 676 PrefService* prefs = profile_->GetPrefs();
612 const DictionaryValue* all_settings_dictionary = 677 const DictionaryValue* all_settings_dictionary =
613 prefs->GetDictionary(prefs::kContentSettingsPatterns); 678 prefs->GetDictionary(prefs::kContentSettingsPatterns);
614 679
615 if (overwrite) 680 if (overwrite)
616 host_content_settings()->clear(); 681 value_map_.Clear();
617 682
618 updating_preferences_ = true; 683 updating_preferences_ = true;
619
620 // Careful: The returned value could be NULL if the pref has never been set. 684 // Careful: The returned value could be NULL if the pref has never been set.
621 if (all_settings_dictionary != NULL) { 685 if (all_settings_dictionary != NULL) {
622 DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatterns); 686 DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatterns);
623 DictionaryValue* mutable_settings; 687 DictionaryValue* mutable_settings;
624 scoped_ptr<DictionaryValue> mutable_settings_scope; 688 scoped_ptr<DictionaryValue> mutable_settings_scope;
625 689
626 if (!is_incognito()) { 690 if (!is_incognito_) {
627 mutable_settings = update.Get(); 691 mutable_settings = update.Get();
628 } else { 692 } else {
629 // Create copy as we do not want to persist anything in OTR prefs. 693 // Create copy as we do not want to persist anything in OTR prefs.
630 mutable_settings = all_settings_dictionary->DeepCopy(); 694 mutable_settings = all_settings_dictionary->DeepCopy();
631 mutable_settings_scope.reset(mutable_settings); 695 mutable_settings_scope.reset(mutable_settings);
632 } 696 }
633
634 // Convert all Unicode patterns into punycode form, then read. 697 // Convert all Unicode patterns into punycode form, then read.
635 CanonicalizeContentSettingsExceptions(mutable_settings); 698 CanonicalizeContentSettingsExceptions(mutable_settings);
636 699
637 for (DictionaryValue::key_iterator i(mutable_settings->begin_keys()); 700 for (DictionaryValue::key_iterator i(mutable_settings->begin_keys());
638 i != mutable_settings->end_keys(); ++i) { 701 i != mutable_settings->end_keys(); ++i) {
639 const std::string& pattern(*i); 702 const std::string& pattern(*i);
640 if (!ContentSettingsPattern::FromString(pattern).IsValid()) 703 if (!ContentSettingsPattern::FromString(pattern).IsValid())
641 LOG(WARNING) << "Invalid pattern stored in content settings"; 704 LOG(WARNING) << "Invalid pattern stored in content settings";
705 // Get settings dictionary for the current pattern string.
642 DictionaryValue* pattern_settings_dictionary = NULL; 706 DictionaryValue* pattern_settings_dictionary = NULL;
643 bool found = mutable_settings->GetDictionaryWithoutPathExpansion( 707 bool found = mutable_settings->GetDictionaryWithoutPathExpansion(
644 pattern, &pattern_settings_dictionary); 708 pattern, &pattern_settings_dictionary);
645 DCHECK(found); 709 DCHECK(found);
646 710
711 // TODO(markusheintz): It is not necessary to read the preferences to an
712 // ExtendedContentSettings struct first. Read the settings from the
713 // directory an write them directly to the value_map.
647 ExtendedContentSettings extended_settings; 714 ExtendedContentSettings extended_settings;
648 GetSettingsFromDictionary(pattern_settings_dictionary, 715 GetSettingsFromDictionary(pattern_settings_dictionary,
649 &extended_settings.content_settings); 716 &extended_settings.content_settings);
650 GetResourceSettingsFromDictionary( 717 GetResourceSettingsFromDictionary(
651 pattern_settings_dictionary, 718 pattern_settings_dictionary,
652 &extended_settings.content_settings_for_resources); 719 &extended_settings.content_settings_for_resources);
653 720
654 (*host_content_settings())[pattern] = extended_settings; 721 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
722 ContentSettingsType content_type = ContentSettingsType(i);
723 if (BaseProvider::RequiresResourceIdentifier(content_type)) {
724 ResourceContentSettings* res_settings =
725 &extended_settings.content_settings_for_resources;
726 for (ResourceContentSettings::iterator entry = res_settings->begin();
727 entry != res_settings->end();
728 ++entry) {
729 ContentSettingsType content_type = entry->first.first;
730 ResourceIdentifier identifier = entry->first.second;
731 ContentSetting setting = entry->second;
732 value_map_.SetValue(ContentSettingsPattern::FromString(pattern),
733 ContentSettingsPattern::FromString(pattern),
734 content_type,
735 identifier,
736 Value::CreateIntegerValue(setting));
737 }
738
739 } else {
740 ContentSetting setting =
741 extended_settings.content_settings.settings[i];
742 if (setting == CONTENT_SETTING_DEFAULT)
743 continue;
744 value_map_.SetValue(ContentSettingsPattern::FromString(pattern),
745 ContentSettingsPattern::FromString(pattern),
746 content_type,
747 ResourceIdentifier(""),
748 Value::CreateIntegerValue(setting));
749 }
750 }
655 } 751 }
656 } 752 }
657 updating_preferences_ = false; 753 updating_preferences_ = false;
658 } 754 }
659 755
660 void PrefProvider::CanonicalizeContentSettingsExceptions( 756 void PrefProvider::CanonicalizeContentSettingsExceptions(
661 DictionaryValue* all_settings_dictionary) { 757 DictionaryValue* all_settings_dictionary) {
662 DCHECK(all_settings_dictionary); 758 DCHECK(all_settings_dictionary);
663 759
664 std::vector<std::string> remove_items; 760 std::vector<std::string> remove_items;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 break; 813 break;
718 } 814 }
719 } 815 }
720 } 816 }
721 // Migrate obsolete cookie prompt mode. 817 // Migrate obsolete cookie prompt mode.
722 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] == 818 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] ==
723 CONTENT_SETTING_ASK) 819 CONTENT_SETTING_ASK)
724 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK; 820 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK;
725 821
726 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] = 822 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] =
727 ClickToPlayFixup(CONTENT_SETTINGS_TYPE_PLUGINS, 823 BaseProvider::ClickToPlayFixup(
728 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]); 824 CONTENT_SETTINGS_TYPE_PLUGINS,
825 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]);
729 } 826 }
730 827
731 void PrefProvider::GetResourceSettingsFromDictionary( 828 void PrefProvider::GetResourceSettingsFromDictionary(
732 const DictionaryValue* dictionary, 829 const DictionaryValue* dictionary,
733 ResourceContentSettings* settings) { 830 ResourceContentSettings* settings) {
734 for (DictionaryValue::key_iterator i(dictionary->begin_keys()); 831 for (DictionaryValue::key_iterator i(dictionary->begin_keys());
735 i != dictionary->end_keys(); ++i) { 832 i != dictionary->end_keys(); ++i) {
736 const std::string& content_type(*i); 833 const std::string& content_type(*i);
737 for (size_t type = 0; type < arraysize(kResourceTypeNames); ++type) { 834 for (size_t type = 0; type < arraysize(kResourceTypeNames); ++type) {
738 if ((kResourceTypeNames[type] != NULL) && 835 if ((kResourceTypeNames[type] != NULL) &&
739 (kResourceTypeNames[type] == content_type)) { 836 (kResourceTypeNames[type] == content_type)) {
740 DictionaryValue* resource_dictionary = NULL; 837 DictionaryValue* resource_dictionary = NULL;
741 bool found = dictionary->GetDictionary(content_type, 838 bool found = dictionary->GetDictionary(content_type,
742 &resource_dictionary); 839 &resource_dictionary);
743 DCHECK(found); 840 DCHECK(found);
744 for (DictionaryValue::key_iterator j(resource_dictionary->begin_keys()); 841 for (DictionaryValue::key_iterator j(resource_dictionary->begin_keys());
745 j != resource_dictionary->end_keys(); ++j) { 842 j != resource_dictionary->end_keys(); ++j) {
746 const std::string& resource_identifier(*j); 843 const std::string& resource_identifier(*j);
747 int setting = CONTENT_SETTING_DEFAULT; 844 int setting = CONTENT_SETTING_DEFAULT;
748 bool found = resource_dictionary->GetIntegerWithoutPathExpansion( 845 bool found = resource_dictionary->GetIntegerWithoutPathExpansion(
749 resource_identifier, &setting); 846 resource_identifier, &setting);
750 DCHECK(found); 847 DCHECK(found);
751 (*settings)[ContentSettingsTypeResourceIdentifierPair( 848 (*settings)[ContentSettingsTypeResourceIdentifierPair(
752 ContentSettingsType(type), resource_identifier)] = 849 ContentSettingsType(type), resource_identifier)] =
753 ClickToPlayFixup(ContentSettingsType(type), 850 BaseProvider::ClickToPlayFixup(ContentSettingsType(type),
754 ContentSetting(setting)); 851 ContentSetting(setting));
755 } 852 }
756 853
757 break; 854 break;
758 } 855 }
759 } 856 }
760 } 857 }
761 } 858 }
762 859
763 void PrefProvider::NotifyObservers( 860 void PrefProvider::NotifyObservers(
764 const ContentSettingsDetails& details) { 861 const ContentSettingsDetails& details) {
(...skipping 29 matching lines...) Expand all
794 ContentSettingsPattern pattern = ContentSettingsPattern::FromString( 891 ContentSettingsPattern pattern = ContentSettingsPattern::FromString(
795 std::string(ContentSettingsPattern::kDomainWildcard) + host); 892 std::string(ContentSettingsPattern::kDomainWildcard) + host);
796 DictionaryValue* host_settings_dictionary = NULL; 893 DictionaryValue* host_settings_dictionary = NULL;
797 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion( 894 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
798 host, &host_settings_dictionary); 895 host, &host_settings_dictionary);
799 DCHECK(found); 896 DCHECK(found);
800 ContentSettings settings; 897 ContentSettings settings;
801 GetSettingsFromDictionary(host_settings_dictionary, &settings); 898 GetSettingsFromDictionary(host_settings_dictionary, &settings);
802 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) { 899 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) {
803 if (settings.settings[j] != CONTENT_SETTING_DEFAULT && 900 if (settings.settings[j] != CONTENT_SETTING_DEFAULT &&
804 !RequiresResourceIdentifier(ContentSettingsType(j))) { 901 !BaseProvider::RequiresResourceIdentifier(ContentSettingsType(j))) {
805 SetContentSetting( 902 SetContentSetting(
806 pattern, 903 pattern,
807 pattern, 904 pattern,
808 ContentSettingsType(j), 905 ContentSettingsType(j),
809 "", 906 "",
810 settings.settings[j]); 907 settings.settings[j]);
811 } 908 }
812 } 909 }
813 } 910 }
814 prefs->ClearPref(prefs::kPerHostContentSettings); 911 prefs->ClearPref(prefs::kPerHostContentSettings);
(...skipping 12 matching lines...) Expand all
827 ContentSettingsPattern::FromString(host), 924 ContentSettingsPattern::FromString(host),
828 CONTENT_SETTINGS_TYPE_POPUPS, 925 CONTENT_SETTINGS_TYPE_POPUPS,
829 "", 926 "",
830 CONTENT_SETTING_ALLOW); 927 CONTENT_SETTING_ALLOW);
831 } 928 }
832 prefs->ClearPref(prefs::kPopupWhitelistedHosts); 929 prefs->ClearPref(prefs::kPopupWhitelistedHosts);
833 } 930 }
834 } 931 }
835 932
836 } // namespace content_settings 933 } // namespace content_settings
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698