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

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

Issue 6484035: Add a content_settings::BaseProvider for code that is shared by all content settings providers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 9 years, 10 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/pref_content_settings_provider.h" 5 #include "chrome/browser/content_settings/pref_content_settings_provider.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 const char* kTypeNames[CONTENT_SETTINGS_NUM_TYPES] = { 53 const char* kTypeNames[CONTENT_SETTINGS_NUM_TYPES] = {
54 "cookies", 54 "cookies",
55 "images", 55 "images",
56 "javascript", 56 "javascript",
57 "plugins", 57 "plugins",
58 "popups", 58 "popups",
59 NULL, // Not used for Geolocation 59 NULL, // Not used for Geolocation
60 NULL, // Not used for Notifications 60 NULL, // Not used for Notifications
61 }; 61 };
62 62
63 // True if a given content settings type requires additional resource
64 // identifiers.
65 const bool kRequiresResourceIdentifier[CONTENT_SETTINGS_NUM_TYPES] = {
66 false, // CONTENT_SETTINGS_TYPE_COOKIES
67 false, // CONTENT_SETTINGS_TYPE_IMAGES
68 false, // CONTET_SETTINGS_TYPE_JAVASCRIPT
69 true, // CONTENT_SETTINGS_TYPE_PLUGINS
70 false, // CONTENT_SETTINGS_TYPE_POPUPS
71 false, // Not used for Geolocation
72 false, // Not used for Notifications
73 };
74
75 // Map ASK for the plugins content type to BLOCK if click-to-play is
76 // not enabled.
77 ContentSetting ClickToPlayFixup(ContentSettingsType content_type,
78 ContentSetting setting) {
79 if (setting == CONTENT_SETTING_ASK &&
80 content_type == CONTENT_SETTINGS_TYPE_PLUGINS &&
81 !CommandLine::ForCurrentProcess()->HasSwitch(
82 switches::kEnableClickToPlay)) {
83 return CONTENT_SETTING_BLOCK;
84 }
85 return setting;
86 }
87
88 } // namespace 63 } // namespace
89 64
90 namespace content_settings { 65 namespace content_settings {
91 66
92 struct PrefProvider::ExtendedContentSettings {
93 ContentSettings content_settings;
94 ResourceContentSettings content_settings_for_resources;
95 };
96
97 PrefDefaultProvider::PrefDefaultProvider(Profile* profile) 67 PrefDefaultProvider::PrefDefaultProvider(Profile* profile)
98 : profile_(profile), 68 : profile_(profile),
99 is_off_the_record_(profile_->IsOffTheRecord()), 69 is_off_the_record_(profile_->IsOffTheRecord()),
100 updating_preferences_(false) { 70 updating_preferences_(false) {
101 PrefService* prefs = profile->GetPrefs(); 71 PrefService* prefs = profile->GetPrefs();
102 72
103 // Read global defaults. 73 // Read global defaults.
104 DCHECK_EQ(arraysize(kTypeNames), 74 DCHECK_EQ(arraysize(kTypeNames),
105 static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES)); 75 static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES));
106 ReadDefaultSettings(true); 76 ReadDefaultSettings(true);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 break; 236 break;
267 } 237 }
268 } 238 }
269 } 239 }
270 // Migrate obsolete cookie prompt mode. 240 // Migrate obsolete cookie prompt mode.
271 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] == 241 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] ==
272 CONTENT_SETTING_ASK) 242 CONTENT_SETTING_ASK)
273 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK; 243 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK;
274 244
275 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] = 245 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] =
276 ClickToPlayFixup(CONTENT_SETTINGS_TYPE_PLUGINS, 246 BaseProvider::ClickToPlayFixup(
277 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]); 247 CONTENT_SETTINGS_TYPE_PLUGINS,
248 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]);
278 } 249 }
279 250
280 void PrefDefaultProvider::NotifyObservers( 251 void PrefDefaultProvider::NotifyObservers(
281 const ContentSettingsDetails& details) { 252 const ContentSettingsDetails& details) {
282 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
283 if (profile_ == NULL) 254 if (profile_ == NULL)
284 return; 255 return;
285 NotificationService::current()->Notify( 256 NotificationService::current()->Notify(
286 NotificationType::CONTENT_SETTINGS_CHANGED, 257 NotificationType::CONTENT_SETTINGS_CHANGED,
287 Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()), 258 Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()),
288 Details<const ContentSettingsDetails>(&details)); 259 Details<const ContentSettingsDetails>(&details));
289 } 260 }
290 261
291
292 // static 262 // static
293 void PrefDefaultProvider::RegisterUserPrefs(PrefService* prefs) { 263 void PrefDefaultProvider::RegisterUserPrefs(PrefService* prefs) {
294 prefs->RegisterDictionaryPref(prefs::kDefaultContentSettings); 264 prefs->RegisterDictionaryPref(prefs::kDefaultContentSettings);
295 } 265 }
296 266
297 // //////////////////////////////////////////////////////////////////////////// 267 // ////////////////////////////////////////////////////////////////////////////
298 // PrefProvider:: 268 // PrefProvider:
299 // 269 //
300 270
301 // static 271 // static
302 void PrefProvider::RegisterUserPrefs(PrefService* prefs) { 272 void PrefProvider::RegisterUserPrefs(PrefService* prefs) {
303 prefs->RegisterIntegerPref(prefs::kContentSettingsVersion, 273 prefs->RegisterIntegerPref(prefs::kContentSettingsVersion,
304 ContentSettingsPattern::kContentSettingsPatternVersion); 274 ContentSettingsPattern::kContentSettingsPatternVersion);
305 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns); 275 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns);
306 276
307 // Obsolete prefs, for migration: 277 // Obsolete prefs, for migration:
308 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); 278 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts);
309 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings); 279 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings);
310 } 280 }
311 281
312 PrefProvider::PrefProvider(Profile* profile) 282 PrefProvider::PrefProvider(Profile* profile)
313 : profile_(profile), 283 : BaseProvider(profile->IsOffTheRecord()),
314 is_off_the_record_(profile_->IsOffTheRecord()), 284 profile_(profile),
315 updating_preferences_(false) { 285 updating_preferences_(false) {
286 Init();
287 }
288
289 void PrefProvider::Init() {
316 initializing_ = true; 290 initializing_ = true;
317 PrefService* prefs = profile_->GetPrefs(); 291 PrefService* prefs = profile_->GetPrefs();
318 292
319 // Migrate obsolete preferences. 293 // Migrate obsolete preferences.
320 MigrateObsoletePerhostPref(prefs); 294 MigrateObsoletePerhostPref(prefs);
321 MigrateObsoletePopupsPref(prefs); 295 MigrateObsoletePopupsPref(prefs);
322 296
323 // Verify preferences version. 297 // Verify preferences version.
324 if (!prefs->HasPrefPath(prefs::kContentSettingsVersion)) { 298 if (!prefs->HasPrefPath(prefs::kContentSettingsVersion)) {
325 prefs->SetInteger(prefs::kContentSettingsVersion, 299 prefs->SetInteger(prefs::kContentSettingsVersion,
(...skipping 14 matching lines...) Expand all
340 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, 314 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
341 Source<Profile>(profile_)); 315 Source<Profile>(profile_));
342 initializing_ = false; 316 initializing_ = false;
343 } 317 }
344 318
345 bool PrefProvider::ContentSettingsTypeIsManaged( 319 bool PrefProvider::ContentSettingsTypeIsManaged(
346 ContentSettingsType content_type) { 320 ContentSettingsType content_type) {
347 return false; 321 return false;
348 } 322 }
349 323
350 ContentSetting PrefProvider::GetContentSetting(
351 const GURL& requesting_url,
352 const GURL& embedding_url,
353 ContentSettingsType content_type,
354 const ResourceIdentifier& resource_identifier) const {
355 // Support for embedding_patterns is not implemented yet.
356 DCHECK(requesting_url == embedding_url);
357
358 if (!RequiresResourceIdentifier(content_type))
359 return GetNonDefaultContentSettings(requesting_url).settings[content_type];
360
361 if (RequiresResourceIdentifier(content_type) && resource_identifier.empty())
362 return CONTENT_SETTING_DEFAULT;
363
364 if (CommandLine::ForCurrentProcess()->HasSwitch(
365 switches::kEnableResourceContentSettings)) {
366 DCHECK(!resource_identifier.empty());
367 }
368
369 base::AutoLock auto_lock(lock_);
370
371 const std::string host(net::GetHostOrSpecFromURL(requesting_url));
372 ContentSettingsTypeResourceIdentifierPair
373 requested_setting(content_type, resource_identifier);
374
375 // Check for exact matches first.
376 HostContentSettings::const_iterator i(host_content_settings_.find(host));
377 if (i != host_content_settings_.end() &&
378 i->second.content_settings_for_resources.find(requested_setting) !=
379 i->second.content_settings_for_resources.end()) {
380 return i->second.content_settings_for_resources.find(
381 requested_setting)->second;
382 }
383
384 // If this map is not for an off-the-record profile, these searches will never
385 // match. The additional off-the-record exceptions always overwrite the
386 // regular ones.
387 i = off_the_record_settings_.find(host);
388 if (i != off_the_record_settings_.end() &&
389 i->second.content_settings_for_resources.find(requested_setting) !=
390 i->second.content_settings_for_resources.end()) {
391 return i->second.content_settings_for_resources.find(
392 requested_setting)->second;
393 }
394
395 // Match patterns starting with the most concrete pattern match.
396 for (std::string key =
397 std::string(ContentSettingsPattern::kDomainWildcard) + host; ; ) {
398 HostContentSettings::const_iterator i(off_the_record_settings_.find(key));
399 if (i != off_the_record_settings_.end() &&
400 i->second.content_settings_for_resources.find(requested_setting) !=
401 i->second.content_settings_for_resources.end()) {
402 return i->second.content_settings_for_resources.find(
403 requested_setting)->second;
404 }
405
406 i = host_content_settings_.find(key);
407 if (i != host_content_settings_.end() &&
408 i->second.content_settings_for_resources.find(requested_setting) !=
409 i->second.content_settings_for_resources.end()) {
410 return i->second.content_settings_for_resources.find(
411 requested_setting)->second;
412 }
413
414 const size_t next_dot =
415 key.find('.', ContentSettingsPattern::kDomainWildcardLength);
416 if (next_dot == std::string::npos)
417 break;
418 key.erase(ContentSettingsPattern::kDomainWildcardLength,
419 next_dot - ContentSettingsPattern::kDomainWildcardLength + 1);
420 }
421
422 return CONTENT_SETTING_DEFAULT;
423 }
424
425 void PrefProvider::SetContentSetting( 324 void PrefProvider::SetContentSetting(
426 const ContentSettingsPattern& requesting_pattern, 325 const ContentSettingsPattern& requesting_pattern,
427 const ContentSettingsPattern& embedding_pattern, 326 const ContentSettingsPattern& embedding_pattern,
428 ContentSettingsType content_type, 327 ContentSettingsType content_type,
429 const ResourceIdentifier& resource_identifier, 328 const ResourceIdentifier& resource_identifier,
430 ContentSetting setting) { 329 ContentSetting setting) {
431 // Support for embedding_patterns is not implemented yet. 330 // Support for embedding_patterns is not implemented yet.
432 DCHECK(requesting_pattern == embedding_pattern); 331 DCHECK(requesting_pattern == embedding_pattern);
433 332
434 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. 333 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
435 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
436 DCHECK_NE(RequiresResourceIdentifier(content_type), 335 DCHECK_NE(RequiresResourceIdentifier(content_type),
437 resource_identifier.empty()); 336 resource_identifier.empty());
438 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS || 337 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS ||
439 setting != CONTENT_SETTING_ASK || 338 setting != CONTENT_SETTING_ASK ||
440 CommandLine::ForCurrentProcess()->HasSwitch( 339 CommandLine::ForCurrentProcess()->HasSwitch(
441 switches::kEnableClickToPlay)); 340 switches::kEnableClickToPlay));
442 341
443 const ContentSettingsPattern pattern( 342 const ContentSettingsPattern pattern(
444 requesting_pattern.CanonicalizePattern()); 343 requesting_pattern.CanonicalizePattern());
445 344
446 bool early_exit = false; 345 bool early_exit = false;
447 std::string pattern_str(pattern.AsString()); 346 std::string pattern_str(pattern.AsString());
448 PrefService* prefs = NULL; 347 PrefService* prefs = NULL;
449 DictionaryValue* all_settings_dictionary = NULL; 348 DictionaryValue* all_settings_dictionary = NULL;
450 HostContentSettings* map_to_modify = &off_the_record_settings_; 349
451 if (!is_off_the_record_) { 350 // Select content-settings-map to write to.
351 HostContentSettings* map_to_modify = off_the_record_settings();
352 if (!is_off_the_record()) {
452 prefs = profile_->GetPrefs(); 353 prefs = profile_->GetPrefs();
453 all_settings_dictionary = 354 all_settings_dictionary =
454 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns); 355 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns);
455 map_to_modify = &host_content_settings_; 356
357 map_to_modify = host_content_settings();
456 } 358 }
457 359
360 // Update content-settings-map.
458 { 361 {
459 base::AutoLock auto_lock(lock_); 362 base::AutoLock auto_lock(lock());
460 if (!map_to_modify->count(pattern_str)) 363 if (!map_to_modify->count(pattern_str))
461 (*map_to_modify)[pattern_str].content_settings = ContentSettings(); 364 (*map_to_modify)[pattern_str].content_settings = ContentSettings();
462 HostContentSettings::iterator i( 365 HostContentSettings::iterator i(
463 map_to_modify->find(pattern_str)); 366 map_to_modify->find(pattern_str));
464 ContentSettings& settings = i->second.content_settings; 367 ContentSettings& settings = i->second.content_settings;
465 if (RequiresResourceIdentifier(content_type)) { 368 if (RequiresResourceIdentifier(content_type)) {
466 settings.settings[content_type] = CONTENT_SETTING_DEFAULT; 369 settings.settings[content_type] = CONTENT_SETTING_DEFAULT;
467 if (setting != CONTENT_SETTING_DEFAULT) { 370 if (setting != CONTENT_SETTING_DEFAULT) {
468 i->second.content_settings_for_resources[ 371 i->second.content_settings_for_resources[
469 ContentSettingsTypeResourceIdentifierPair(content_type, 372 ContentSettingsTypeResourceIdentifierPair(content_type,
470 resource_identifier)] = setting; 373 resource_identifier)] = setting;
471 } else { 374 } else {
472 i->second.content_settings_for_resources.erase( 375 i->second.content_settings_for_resources.erase(
473 ContentSettingsTypeResourceIdentifierPair(content_type, 376 ContentSettingsTypeResourceIdentifierPair(content_type,
474 resource_identifier)); 377 resource_identifier));
475 } 378 }
476 } else { 379 } else {
477 settings.settings[content_type] = setting; 380 settings.settings[content_type] = setting;
478 } 381 }
479 if (AllDefault(i->second)) { 382 if (AllDefault(i->second)) {
480 map_to_modify->erase(i); 383 map_to_modify->erase(i);
481 if (all_settings_dictionary) 384 if (all_settings_dictionary)
482 all_settings_dictionary->RemoveWithoutPathExpansion(pattern_str, NULL); 385 all_settings_dictionary->RemoveWithoutPathExpansion(pattern_str, NULL);
483 386
484 // We can't just return because |NotifyObservers()| needs to be called, 387 // We can't just return because |NotifyObservers()| needs to be called,
485 // without |lock_| being held. 388 // without lock() being held.
486 early_exit = true; 389 early_exit = true;
487 } 390 }
488 } 391 }
489 392
393 // Update the content_settings preference.
490 if (!early_exit && all_settings_dictionary) { 394 if (!early_exit && all_settings_dictionary) {
491 DictionaryValue* host_settings_dictionary = NULL; 395 DictionaryValue* host_settings_dictionary = NULL;
492 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion( 396 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
493 pattern_str, &host_settings_dictionary); 397 pattern_str, &host_settings_dictionary);
494 if (!found) { 398 if (!found) {
495 host_settings_dictionary = new DictionaryValue; 399 host_settings_dictionary = new DictionaryValue;
496 all_settings_dictionary->SetWithoutPathExpansion( 400 all_settings_dictionary->SetWithoutPathExpansion(
497 pattern_str, host_settings_dictionary); 401 pattern_str, host_settings_dictionary);
498 DCHECK_NE(setting, CONTENT_SETTING_DEFAULT); 402 DCHECK_NE(setting, CONTENT_SETTING_DEFAULT);
499 } 403 }
(...skipping 19 matching lines...) Expand all
519 host_settings_dictionary->RemoveWithoutPathExpansion(dictionary_path, 423 host_settings_dictionary->RemoveWithoutPathExpansion(dictionary_path,
520 NULL); 424 NULL);
521 } else { 425 } else {
522 host_settings_dictionary->SetWithoutPathExpansion( 426 host_settings_dictionary->SetWithoutPathExpansion(
523 dictionary_path, Value::CreateIntegerValue(setting)); 427 dictionary_path, Value::CreateIntegerValue(setting));
524 } 428 }
525 } 429 }
526 } 430 }
527 431
528 updating_preferences_ = true; 432 updating_preferences_ = true;
529 if (!is_off_the_record_) 433 if (!is_off_the_record())
530 ScopedPrefUpdate update(prefs, prefs::kContentSettingsPatterns); 434 ScopedPrefUpdate update(prefs, prefs::kContentSettingsPatterns);
531 updating_preferences_ = false; 435 updating_preferences_ = false;
532 436
533 NotifyObservers(ContentSettingsDetails(pattern, content_type, "")); 437 NotifyObservers(ContentSettingsDetails(pattern, content_type, ""));
534 } 438 }
535 439
536 void PrefProvider::GetAllContentSettingsRules(
537 ContentSettingsType content_type,
538 const ResourceIdentifier& resource_identifier,
539 Rules* content_setting_rules) const {
540 DCHECK(RequiresResourceIdentifier(content_type) !=
541 resource_identifier.empty());
542 DCHECK(content_setting_rules);
543 content_setting_rules->clear();
544
545 const HostContentSettings* map_to_return =
546 is_off_the_record_ ? &off_the_record_settings_ : &host_content_settings_;
547 ContentSettingsTypeResourceIdentifierPair requested_setting(
548 content_type, resource_identifier);
549
550 base::AutoLock auto_lock(lock_);
551 for (HostContentSettings::const_iterator i(map_to_return->begin());
552 i != map_to_return->end(); ++i) {
553 ContentSetting setting;
554 if (RequiresResourceIdentifier(content_type)) {
555 if (i->second.content_settings_for_resources.find(requested_setting) !=
556 i->second.content_settings_for_resources.end()) {
557 setting = i->second.content_settings_for_resources.find(
558 requested_setting)->second;
559 } else {
560 setting = CONTENT_SETTING_DEFAULT;
561 }
562 } else {
563 setting = i->second.content_settings.settings[content_type];
564 }
565 if (setting != CONTENT_SETTING_DEFAULT) {
566 // Use of push_back() relies on the map iterator traversing in order of
567 // ascending keys.
568 content_setting_rules->push_back(Rule(ContentSettingsPattern(i->first),
569 ContentSettingsPattern(i->first),
570 setting));
571 }
572 }
573 }
574
575 void PrefProvider::ResetToDefaults() { 440 void PrefProvider::ResetToDefaults() {
576 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 441 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
577 442
578 { 443 {
579 base::AutoLock auto_lock(lock_); 444 base::AutoLock auto_lock(lock());
580 host_content_settings_.clear(); 445 host_content_settings()->clear();
581 off_the_record_settings_.clear(); 446 off_the_record_settings()->clear();
582 } 447 }
583 448
584 if (!is_off_the_record_) { 449 if (!is_off_the_record()) {
585 PrefService* prefs = profile_->GetPrefs(); 450 PrefService* prefs = profile_->GetPrefs();
586 updating_preferences_ = true; 451 updating_preferences_ = true;
587 prefs->ClearPref(prefs::kContentSettingsPatterns); 452 prefs->ClearPref(prefs::kContentSettingsPatterns);
588 updating_preferences_ = false; 453 updating_preferences_ = false;
589 } 454 }
590 } 455 }
591 456
592 void PrefProvider::ClearAllContentSettingsRules( 457 void PrefProvider::ClearAllContentSettingsRules(
593 ContentSettingsType content_type) { 458 ContentSettingsType content_type) {
594 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. 459 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
595 460
596 PrefService* prefs = NULL; 461 PrefService* prefs = NULL;
597 DictionaryValue* all_settings_dictionary = NULL; 462 DictionaryValue* all_settings_dictionary = NULL;
598 HostContentSettings* map_to_modify = &off_the_record_settings_; 463 HostContentSettings* map_to_modify = off_the_record_settings();
599 464
600 if (!is_off_the_record_) { 465 if (!is_off_the_record()) {
601 prefs = profile_->GetPrefs(); 466 prefs = profile_->GetPrefs();
602 all_settings_dictionary = 467 all_settings_dictionary =
603 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns); 468 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns);
604 map_to_modify = &host_content_settings_; 469 map_to_modify = host_content_settings();
605 } 470 }
606 471
607 { 472 {
608 base::AutoLock auto_lock(lock_); 473 base::AutoLock auto_lock(lock());
609 for (HostContentSettings::iterator i(map_to_modify->begin()); 474 for (HostContentSettings::iterator i(map_to_modify->begin());
610 i != map_to_modify->end(); ) { 475 i != map_to_modify->end(); ) {
611 if (RequiresResourceIdentifier(content_type) || 476 if (RequiresResourceIdentifier(content_type) ||
612 i->second.content_settings.settings[content_type] != 477 i->second.content_settings.settings[content_type] !=
613 CONTENT_SETTING_DEFAULT) { 478 CONTENT_SETTING_DEFAULT) {
614 if (RequiresResourceIdentifier(content_type)) 479 if (RequiresResourceIdentifier(content_type))
615 i->second.content_settings_for_resources.clear(); 480 i->second.content_settings_for_resources.clear();
616 i->second.content_settings.settings[content_type] = 481 i->second.content_settings.settings[content_type] =
617 CONTENT_SETTING_DEFAULT; 482 CONTENT_SETTING_DEFAULT;
618 std::string host(i->first); 483 std::string host(i->first);
619 if (AllDefault(i->second)) { 484 if (AllDefault(i->second)) {
620 if (all_settings_dictionary) 485 if (all_settings_dictionary)
621 all_settings_dictionary->RemoveWithoutPathExpansion(host, NULL); 486 all_settings_dictionary->RemoveWithoutPathExpansion(host, NULL);
622 map_to_modify->erase(i++); 487 map_to_modify->erase(i++);
623 } else if (all_settings_dictionary) { 488 } else if (all_settings_dictionary) {
624 DictionaryValue* host_settings_dictionary; 489 DictionaryValue* host_settings_dictionary;
625 bool found = 490 bool found =
626 all_settings_dictionary->GetDictionaryWithoutPathExpansion( 491 all_settings_dictionary->GetDictionaryWithoutPathExpansion(
627 host, &host_settings_dictionary); 492 host, &host_settings_dictionary);
628 DCHECK(found); 493 DCHECK(found);
629 host_settings_dictionary->RemoveWithoutPathExpansion( 494 host_settings_dictionary->RemoveWithoutPathExpansion(
630 kTypeNames[content_type], NULL); 495 kTypeNames[content_type], NULL);
631 ++i; 496 ++i;
632 } 497 }
633 } else { 498 } else {
634 ++i; 499 ++i;
635 } 500 }
636 } 501 }
637 } 502 }
638 503
639 updating_preferences_ = true; 504 updating_preferences_ = true;
640 if (!is_off_the_record_) 505 if (!is_off_the_record())
641 ScopedPrefUpdate update(prefs, prefs::kContentSettingsPatterns); 506 ScopedPrefUpdate update(prefs, prefs::kContentSettingsPatterns);
642 updating_preferences_ = false; 507 updating_preferences_ = false;
643 508
644 NotifyObservers( 509 NotifyObservers(
645 ContentSettingsDetails(ContentSettingsPattern(), content_type, "")); 510 ContentSettingsDetails(ContentSettingsPattern(), content_type, ""));
646 } 511 }
647 512
648 void PrefProvider::Observe( 513 void PrefProvider::Observe(
649 NotificationType type, 514 NotificationType type,
650 const NotificationSource& source, 515 const NotificationSource& source,
651 const NotificationDetails& details) { 516 const NotificationDetails& details) {
652 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 517 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
653 518
654 if (type == NotificationType::PREF_CHANGED) { 519 if (type == NotificationType::PREF_CHANGED) {
655 DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr()); 520 DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
656 if (updating_preferences_) 521 if (updating_preferences_)
657 return; 522 return;
658 523
659 std::string* name = Details<std::string>(details).ptr(); 524 std::string* name = Details<std::string>(details).ptr();
660 if (*name == prefs::kContentSettingsPatterns) { 525 if (*name == prefs::kContentSettingsPatterns) {
661 ReadExceptions(true); 526 ReadExceptions(true);
662 } else { 527 } else {
663 NOTREACHED() << "Unexpected preference observed"; 528 NOTREACHED() << "Unexpected preference observed";
664 return; 529 return;
665 } 530 }
666 531
667 if (!is_off_the_record_) { 532 if (!is_off_the_record()) {
668 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), 533 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(),
669 CONTENT_SETTINGS_TYPE_DEFAULT, 534 CONTENT_SETTINGS_TYPE_DEFAULT,
670 "")); 535 ""));
671 } 536 }
672 } else if (type == NotificationType::PROFILE_DESTROYED) { 537 } else if (type == NotificationType::PROFILE_DESTROYED) {
673 DCHECK_EQ(profile_, Source<Profile>(source).ptr()); 538 DCHECK_EQ(profile_, Source<Profile>(source).ptr());
674 UnregisterObservers(); 539 UnregisterObservers();
675 } else { 540 } else {
676 NOTREACHED() << "Unexpected notification"; 541 NOTREACHED() << "Unexpected notification";
677 } 542 }
678 } 543 }
679 544
680 PrefProvider::~PrefProvider() { 545 PrefProvider::~PrefProvider() {
681 UnregisterObservers(); 546 UnregisterObservers();
682 } 547 }
683 548
684 // //////////////////////////////////////////////////////////////////////////// 549 // ////////////////////////////////////////////////////////////////////////////
685 // Private 550 // Private
686 551
687 bool PrefProvider::RequiresResourceIdentifier(
688 ContentSettingsType content_type) const {
689 if (CommandLine::ForCurrentProcess()->HasSwitch(
690 switches::kEnableResourceContentSettings)) {
691 return kRequiresResourceIdentifier[content_type];
692 } else {
693 return false;
694 }
695 }
696
697 bool PrefProvider::AllDefault(
698 const ExtendedContentSettings& settings) const {
699 for (size_t i = 0; i < arraysize(settings.content_settings.settings); ++i) {
700 if (settings.content_settings.settings[i] != CONTENT_SETTING_DEFAULT)
701 return false;
702 }
703 return settings.content_settings_for_resources.empty();
704 }
705
706 void PrefProvider::ReadExceptions(bool overwrite) { 552 void PrefProvider::ReadExceptions(bool overwrite) {
707 base::AutoLock lock(lock_); 553 base::AutoLock auto_lock(lock());
708 554
709 PrefService* prefs = profile_->GetPrefs(); 555 PrefService* prefs = profile_->GetPrefs();
710 DictionaryValue* all_settings_dictionary = 556 DictionaryValue* all_settings_dictionary =
711 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns); 557 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns);
712 558
713 if (overwrite) 559 if (overwrite)
714 host_content_settings_.clear(); 560 host_content_settings()->clear();
715 561
716 // Careful: The returned value could be NULL if the pref has never been set. 562 // Careful: The returned value could be NULL if the pref has never been set.
717 if (all_settings_dictionary != NULL) { 563 if (all_settings_dictionary != NULL) {
718 // Convert all Unicode patterns into punycode form, then read. 564 // Convert all Unicode patterns into punycode form, then read.
719 CanonicalizeContentSettingsExceptions(all_settings_dictionary); 565 CanonicalizeContentSettingsExceptions(all_settings_dictionary);
720 566
721 for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys()); 567 for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys());
722 i != all_settings_dictionary->end_keys(); ++i) { 568 i != all_settings_dictionary->end_keys(); ++i) {
723 const std::string& pattern(*i); 569 const std::string& pattern(*i);
724 if (!ContentSettingsPattern(pattern).IsValid()) 570 if (!ContentSettingsPattern(pattern).IsValid())
725 LOG(WARNING) << "Invalid pattern stored in content settings"; 571 LOG(WARNING) << "Invalid pattern stored in content settings";
726 DictionaryValue* pattern_settings_dictionary = NULL; 572 DictionaryValue* pattern_settings_dictionary = NULL;
727 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion( 573 bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
728 pattern, &pattern_settings_dictionary); 574 pattern, &pattern_settings_dictionary);
729 DCHECK(found); 575 DCHECK(found);
730 ContentSettings settings; 576
731 GetSettingsFromDictionary(pattern_settings_dictionary, &settings); 577 ExtendedContentSettings extended_settings;
732 host_content_settings_[pattern].content_settings = settings; 578 GetSettingsFromDictionary(pattern_settings_dictionary,
579 &extended_settings.content_settings);
733 GetResourceSettingsFromDictionary( 580 GetResourceSettingsFromDictionary(
734 pattern_settings_dictionary, 581 pattern_settings_dictionary,
735 &host_content_settings_[pattern].content_settings_for_resources); 582 &extended_settings.content_settings_for_resources);
583
584 (*host_content_settings())[pattern] = extended_settings;
736 } 585 }
737 } 586 }
738 } 587 }
739 588
740 void PrefProvider::CanonicalizeContentSettingsExceptions( 589 void PrefProvider::CanonicalizeContentSettingsExceptions(
741 DictionaryValue* all_settings_dictionary) { 590 DictionaryValue* all_settings_dictionary) {
742 DCHECK(all_settings_dictionary); 591 DCHECK(all_settings_dictionary);
743 592
744 std::vector<std::string> remove_items; 593 std::vector<std::string> remove_items;
745 std::vector<std::pair<std::string, std::string> > move_items; 594 std::vector<std::pair<std::string, std::string> > move_items;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 break; 646 break;
798 } 647 }
799 } 648 }
800 } 649 }
801 // Migrate obsolete cookie prompt mode. 650 // Migrate obsolete cookie prompt mode.
802 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] == 651 if (settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] ==
803 CONTENT_SETTING_ASK) 652 CONTENT_SETTING_ASK)
804 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK; 653 settings->settings[CONTENT_SETTINGS_TYPE_COOKIES] = CONTENT_SETTING_BLOCK;
805 654
806 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] = 655 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS] =
807 ClickToPlayFixup(CONTENT_SETTINGS_TYPE_PLUGINS, 656 BaseProvider::ClickToPlayFixup(
Bernhard Bauer 2011/02/15 12:28:05 Is that even necessary if we're inheriting from Ba
808 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]); 657 CONTENT_SETTINGS_TYPE_PLUGINS,
658 settings->settings[CONTENT_SETTINGS_TYPE_PLUGINS]);
809 } 659 }
810 660
811 void PrefProvider::GetResourceSettingsFromDictionary( 661 void PrefProvider::GetResourceSettingsFromDictionary(
812 const DictionaryValue* dictionary, 662 const DictionaryValue* dictionary,
813 ResourceContentSettings* settings) { 663 ResourceContentSettings* settings) {
814 for (DictionaryValue::key_iterator i(dictionary->begin_keys()); 664 for (DictionaryValue::key_iterator i(dictionary->begin_keys());
815 i != dictionary->end_keys(); ++i) { 665 i != dictionary->end_keys(); ++i) {
816 const std::string& content_type(*i); 666 const std::string& content_type(*i);
817 for (size_t type = 0; type < arraysize(kResourceTypeNames); ++type) { 667 for (size_t type = 0; type < arraysize(kResourceTypeNames); ++type) {
818 if ((kResourceTypeNames[type] != NULL) && 668 if ((kResourceTypeNames[type] != NULL) &&
819 (kResourceTypeNames[type] == content_type)) { 669 (kResourceTypeNames[type] == content_type)) {
820 DictionaryValue* resource_dictionary = NULL; 670 DictionaryValue* resource_dictionary = NULL;
821 bool found = dictionary->GetDictionary(content_type, 671 bool found = dictionary->GetDictionary(content_type,
822 &resource_dictionary); 672 &resource_dictionary);
823 DCHECK(found); 673 DCHECK(found);
824 for (DictionaryValue::key_iterator j(resource_dictionary->begin_keys()); 674 for (DictionaryValue::key_iterator j(resource_dictionary->begin_keys());
825 j != resource_dictionary->end_keys(); ++j) { 675 j != resource_dictionary->end_keys(); ++j) {
826 const std::string& resource_identifier(*j); 676 const std::string& resource_identifier(*j);
827 int setting = CONTENT_SETTING_DEFAULT; 677 int setting = CONTENT_SETTING_DEFAULT;
828 bool found = resource_dictionary->GetIntegerWithoutPathExpansion( 678 bool found = resource_dictionary->GetIntegerWithoutPathExpansion(
829 resource_identifier, &setting); 679 resource_identifier, &setting);
830 DCHECK(found); 680 DCHECK(found);
831 (*settings)[ContentSettingsTypeResourceIdentifierPair( 681 (*settings)[ContentSettingsTypeResourceIdentifierPair(
832 ContentSettingsType(type), resource_identifier)] = 682 ContentSettingsType(type), resource_identifier)] =
833 ClickToPlayFixup(ContentSettingsType(type), 683 BaseProvider::ClickToPlayFixup(ContentSettingsType(type),
834 ContentSetting(setting)); 684 ContentSetting(setting));
835 } 685 }
836 686
837 break; 687 break;
838 } 688 }
839 } 689 }
840 } 690 }
841 } 691 }
842 692
843 void PrefProvider::NotifyObservers( 693 void PrefProvider::NotifyObservers(
844 const ContentSettingsDetails& details) { 694 const ContentSettingsDetails& details) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 SetContentSetting(ContentSettingsPattern(host), 754 SetContentSetting(ContentSettingsPattern(host),
905 ContentSettingsPattern(host), 755 ContentSettingsPattern(host),
906 CONTENT_SETTINGS_TYPE_POPUPS, 756 CONTENT_SETTINGS_TYPE_POPUPS,
907 "", 757 "",
908 CONTENT_SETTING_ALLOW); 758 CONTENT_SETTING_ALLOW);
909 } 759 }
910 prefs->ClearPref(prefs::kPopupWhitelistedHosts); 760 prefs->ClearPref(prefs::kPopupWhitelistedHosts);
911 } 761 }
912 } 762 }
913 763
914 // ////////////////////////////////////////////////////////////////////////////
915 // LEGACY TBR
916 //
917
918 ContentSettings PrefProvider::GetNonDefaultContentSettings(
919 const GURL& url) const {
920 base::AutoLock auto_lock(lock_);
921
922 const std::string host(net::GetHostOrSpecFromURL(url));
923 ContentSettings output;
924 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j)
925 output.settings[j] = CONTENT_SETTING_DEFAULT;
926
927 // Check for exact matches first.
928 HostContentSettings::const_iterator i(host_content_settings_.find(host));
929 if (i != host_content_settings_.end())
930 output = i->second.content_settings;
931
932 // If this map is not for an off-the-record profile, these searches will never
933 // match. The additional off-the-record exceptions always overwrite the
934 // regular ones.
935 i = off_the_record_settings_.find(host);
936 if (i != off_the_record_settings_.end()) {
937 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j)
938 if (i->second.content_settings.settings[j] != CONTENT_SETTING_DEFAULT)
939 output.settings[j] = i->second.content_settings.settings[j];
940 }
941
942 // Match patterns starting with the most concrete pattern match.
943 for (std::string key =
944 std::string(ContentSettingsPattern::kDomainWildcard) + host; ; ) {
945 HostContentSettings::const_iterator i(off_the_record_settings_.find(key));
946 if (i != off_the_record_settings_.end()) {
947 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) {
948 if (output.settings[j] == CONTENT_SETTING_DEFAULT)
949 output.settings[j] = i->second.content_settings.settings[j];
950 }
951 }
952 i = host_content_settings_.find(key);
953 if (i != host_content_settings_.end()) {
954 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) {
955 if (output.settings[j] == CONTENT_SETTING_DEFAULT)
956 output.settings[j] = i->second.content_settings.settings[j];
957 }
958 }
959 const size_t next_dot =
960 key.find('.', ContentSettingsPattern::kDomainWildcardLength);
961 if (next_dot == std::string::npos)
962 break;
963 key.erase(ContentSettingsPattern::kDomainWildcardLength,
964 next_dot - ContentSettingsPattern::kDomainWildcardLength + 1);
965 }
966
967 return output;
968 }
969
970 } // namespace content_settings 764 } // namespace content_settings
OLDNEW
« no previous file with comments | « chrome/browser/content_settings/pref_content_settings_provider.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698