| Index: chrome/browser/extensions/extension_content_settings_store.cc
|
| diff --git a/chrome/browser/extensions/extension_content_settings_store.cc b/chrome/browser/extensions/extension_content_settings_store.cc
|
| index 5a8dc57c43e4bb50d2722a4de3ad3648b1bb3e75..c81c1bddadfe82d749da6e360b52910a535938c7 100644
|
| --- a/chrome/browser/extensions/extension_content_settings_store.cc
|
| +++ b/chrome/browser/extensions/extension_content_settings_store.cc
|
| @@ -25,8 +25,10 @@ struct ExtensionContentSettingsStore::ExtensionEntry {
|
| bool enabled;
|
| // Content settings.
|
| ContentSettingSpecList settings;
|
| - // Incognito content settings.
|
| - ContentSettingSpecList incognito_settings;
|
| + // Persistent incognito content settings.
|
| + ContentSettingSpecList incognito_persistent_settings;
|
| + // Session-only incognito content settings.
|
| + ContentSettingSpecList incognito_session_only_settings;
|
| };
|
|
|
| ExtensionContentSettingsStore::ExtensionContentSettingsStore() {
|
| @@ -46,11 +48,11 @@ void ExtensionContentSettingsStore::SetExtensionContentSetting(
|
| ContentSettingsType type,
|
| const content_settings::ResourceIdentifier& identifier,
|
| ContentSetting setting,
|
| - bool incognito) {
|
| + extension_prefs_scope::Scope scope) {
|
| {
|
| base::AutoLock lock(lock_);
|
| ContentSettingSpecList* setting_spec_list =
|
| - GetContentSettingSpecList(ext_id, incognito);
|
| + GetContentSettingSpecList(ext_id, scope);
|
|
|
| // Find |ContentSettingSpec|.
|
| ContentSettingSpecList::iterator setting_spec = setting_spec_list->begin();
|
| @@ -85,7 +87,8 @@ void ExtensionContentSettingsStore::SetExtensionContentSetting(
|
| // TODO(markusheintz): Notifications should only be sent if the set content
|
| // setting is effective and not hidden by another setting of another
|
| // extension installed more recently.
|
| - NotifyOfContentSettingChanged(ext_id, incognito);
|
| + NotifyOfContentSettingChanged(ext_id,
|
| + scope != extension_prefs_scope::kRegular);
|
| }
|
|
|
| void ExtensionContentSettingsStore::RegisterExtension(
|
| @@ -112,7 +115,8 @@ void ExtensionContentSettingsStore::UnregisterExtension(
|
| if (i == entries_.end())
|
| return;
|
| notify = !i->second->settings.empty();
|
| - notify_incognito = !i->second->incognito_settings.empty();
|
| + notify_incognito = !i->second->incognito_persistent_settings.empty() ||
|
| + !i->second->incognito_session_only_settings.empty();
|
|
|
| delete i->second;
|
| entries_.erase(i);
|
| @@ -133,7 +137,8 @@ void ExtensionContentSettingsStore::SetExtensionState(
|
| if (i == entries_.end())
|
| return;
|
| notify = !i->second->settings.empty();
|
| - notify_incognito = !i->second->incognito_settings.empty();
|
| + notify_incognito = !i->second->incognito_persistent_settings.empty() ||
|
| + !i->second->incognito_session_only_settings.empty();
|
|
|
| i->second->enabled = is_enabled;
|
| }
|
| @@ -146,24 +151,39 @@ void ExtensionContentSettingsStore::SetExtensionState(
|
| ExtensionContentSettingsStore::ContentSettingSpecList*
|
| ExtensionContentSettingsStore::GetContentSettingSpecList(
|
| const std::string& ext_id,
|
| - bool incognito) {
|
| + extension_prefs_scope::Scope scope) {
|
| ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
|
| DCHECK(i != entries_.end());
|
| - return incognito ? &(i->second->incognito_settings)
|
| - : &(i->second->settings);
|
| + switch (scope) {
|
| + case extension_prefs_scope::kRegular:
|
| + return &(i->second->settings);
|
| + case extension_prefs_scope::kIncognitoPersistent:
|
| + return &(i->second->incognito_persistent_settings);
|
| + case extension_prefs_scope::kIncognitoSessionOnly:
|
| + return &(i->second->incognito_session_only_settings);
|
| + }
|
| + NOTREACHED();
|
| + return NULL;
|
| }
|
|
|
| const ExtensionContentSettingsStore::ContentSettingSpecList*
|
| ExtensionContentSettingsStore::GetContentSettingSpecList(
|
| const std::string& ext_id,
|
| - bool incognito) const {
|
| + extension_prefs_scope::Scope scope) const {
|
| ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
|
| DCHECK(i != entries_.end());
|
| - return incognito ? &(i->second->incognito_settings)
|
| - : &(i->second->settings);
|
| + switch (scope) {
|
| + case extension_prefs_scope::kRegular:
|
| + return &(i->second->settings);
|
| + case extension_prefs_scope::kIncognitoPersistent:
|
| + return &(i->second->incognito_persistent_settings);
|
| + case extension_prefs_scope::kIncognitoSessionOnly:
|
| + return &(i->second->incognito_session_only_settings);
|
| + }
|
| + NOTREACHED();
|
| + return NULL;
|
| }
|
|
|
| -
|
| ContentSetting ExtensionContentSettingsStore::GetContentSettingFromSpecList(
|
| const GURL& embedded_url,
|
| const GURL& top_level_url,
|
| @@ -181,9 +201,9 @@ ContentSetting ExtensionContentSettingsStore::GetContentSettingFromSpecList(
|
| continue;
|
| }
|
|
|
| - // TODO(markusheintz): Compare top-level patterns as well?
|
| + // TODO(markusheintz): Compare embedded patterns as well?
|
| if (winner_spec == setting_spec_list.end() ||
|
| - spec->embedded_pattern.Compare(winner_spec->embedded_pattern) ==
|
| + winner_spec->top_level_pattern.Compare(spec->top_level_pattern) ==
|
| ContentSettingsPattern::SUCCESSOR) {
|
| winner_spec = spec;
|
| }
|
| @@ -216,13 +236,19 @@ ContentSetting ExtensionContentSettingsStore::GetEffectiveContentSetting(
|
|
|
| ContentSetting setting = CONTENT_SETTING_DEFAULT;
|
| if (incognito) {
|
| - // Get incognito setting
|
| - setting = GetContentSettingFromSpecList(embedded_url, top_level_url, type,
|
| - identifier,
|
| - i->second->incognito_settings);
|
| + // Try session-only incognito setting first.
|
| + setting = GetContentSettingFromSpecList(
|
| + embedded_url, top_level_url, type, identifier,
|
| + i->second->incognito_session_only_settings);
|
| + if (setting == CONTENT_SETTING_DEFAULT) {
|
| + // Next, persistent incognito setting.
|
| + setting = GetContentSettingFromSpecList(
|
| + embedded_url, top_level_url, type, identifier,
|
| + i->second->incognito_persistent_settings);
|
| + }
|
| }
|
| if (setting == CONTENT_SETTING_DEFAULT) {
|
| - // Get non incognito setting
|
| + // Then, non-incognito setting.
|
| setting = GetContentSettingFromSpecList(embedded_url, top_level_url, type,
|
| identifier, i->second->settings);
|
| }
|
| @@ -236,6 +262,38 @@ ContentSetting ExtensionContentSettingsStore::GetEffectiveContentSetting(
|
| return winner_setting;
|
| }
|
|
|
| +void ExtensionContentSettingsStore::ClearContentSettingsForExtension(
|
| + const std::string& ext_id,
|
| + extension_prefs_scope::Scope scope) {
|
| + bool notify = false;
|
| + {
|
| + base::AutoLock lock(lock_);
|
| + ContentSettingSpecList* setting_spec_list =
|
| + GetContentSettingSpecList(ext_id, scope);
|
| + notify = !setting_spec_list->empty();
|
| + setting_spec_list->clear();
|
| + }
|
| + if (notify) {
|
| + NotifyOfContentSettingChanged(ext_id,
|
| + scope != extension_prefs_scope::kRegular);
|
| + }
|
| +}
|
| +
|
| +// static
|
| +void ExtensionContentSettingsStore::AddRules(
|
| + ContentSettingsType type,
|
| + const content_settings::ResourceIdentifier& identifier,
|
| + const ContentSettingSpecList* setting_spec_list,
|
| + content_settings::ProviderInterface::Rules* rules) {
|
| + ContentSettingSpecList::const_iterator it;
|
| + for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) {
|
| + if (it->content_type == type && it->resource_identifier == identifier) {
|
| + rules->push_back(content_settings::ProviderInterface::Rule(
|
| + it->embedded_pattern, it->top_level_pattern, it->setting));
|
| + }
|
| + }
|
| +}
|
| +
|
| void ExtensionContentSettingsStore::GetContentSettingsForContentType(
|
| ContentSettingsType type,
|
| const content_settings::ResourceIdentifier& identifier,
|
| @@ -244,25 +302,34 @@ void ExtensionContentSettingsStore::GetContentSettingsForContentType(
|
| base::AutoLock lock(lock_);
|
| ExtensionEntryMap::const_iterator ext_it;
|
| for (ext_it = entries_.begin(); ext_it != entries_.end(); ++ext_it) {
|
| - const ContentSettingSpecList* setting_spec_list =
|
| - GetContentSettingSpecList(ext_it->first, incognito);
|
| - ContentSettingSpecList::const_iterator it;
|
| - for (it = setting_spec_list->begin(); it != setting_spec_list->end();
|
| - ++it) {
|
| - if (it->content_type == type && it->resource_identifier == identifier) {
|
| - rules->push_back(content_settings::ProviderInterface::Rule(
|
| - it->embedded_pattern, it->top_level_pattern, it->setting));
|
| - }
|
| + if (incognito) {
|
| + AddRules(type, identifier,
|
| + GetContentSettingSpecList(
|
| + ext_it->first,
|
| + extension_prefs_scope::kIncognitoPersistent),
|
| + rules);
|
| + AddRules(type, identifier,
|
| + GetContentSettingSpecList(
|
| + ext_it->first,
|
| + extension_prefs_scope::kIncognitoSessionOnly),
|
| + rules);
|
| + } else {
|
| + AddRules(type, identifier,
|
| + GetContentSettingSpecList(
|
| + ext_it->first,
|
| + extension_prefs_scope::kRegular),
|
| + rules);
|
| }
|
| }
|
| }
|
|
|
| ListValue* ExtensionContentSettingsStore::GetSettingsForExtension(
|
| - const std::string& extension_id) const {
|
| + const std::string& extension_id,
|
| + extension_prefs_scope::Scope scope) const {
|
| base::AutoLock lock(lock_);
|
| ListValue* settings = new ListValue();
|
| const ContentSettingSpecList* setting_spec_list =
|
| - GetContentSettingSpecList(extension_id, false);
|
| + GetContentSettingSpecList(extension_id, scope);
|
| ContentSettingSpecList::const_iterator it;
|
| for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) {
|
| DictionaryValue* setting_dict = new DictionaryValue();
|
| @@ -284,7 +351,8 @@ ListValue* ExtensionContentSettingsStore::GetSettingsForExtension(
|
|
|
| void ExtensionContentSettingsStore::SetExtensionContentSettingsFromList(
|
| const std::string& extension_id,
|
| - const ListValue* list) {
|
| + const ListValue* list,
|
| + extension_prefs_scope::Scope scope) {
|
| for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) {
|
| if ((*it)->GetType() != Value::TYPE_DICTIONARY) {
|
| NOTREACHED();
|
| @@ -325,7 +393,7 @@ void ExtensionContentSettingsStore::SetExtensionContentSettingsFromList(
|
| content_settings_type,
|
| resource_identifier,
|
| setting,
|
| - false);
|
| + scope);
|
| }
|
| }
|
|
|
|
|