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

Unified Diff: chrome/browser/extensions/extension_content_settings_store.cc

Issue 6927028: TODO (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 8 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 side-by-side diff with in-line comments
Download patch
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
new file mode 100644
index 0000000000000000000000000000000000000000..117ce2f8de7b4dbd9d2cb0408b2d255460f8dc1e
--- /dev/null
+++ b/chrome/browser/extensions/extension_content_settings_store.cc
@@ -0,0 +1,258 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_content_settings_store.h"
+
+#include <set>
+
+#include "base/logging.h"
+
+struct ExtensionContentSettingsStore::ExtensionEntry {
+ // Installation time of the extension.
+ base::Time install_time;
+ // Whether extension is enabled in the profile.
+ bool enabled;
+ // Content settings.
+ ContentSettingSpecList settings;
+ // Incognito content settings
+ ContentSettingSpecList incognito_settings;
+};
+
+ExtensionContentSettingsStore::ExtensionContentSettingsStore() {
+}
+
+ExtensionContentSettingsStore::~ExtensionContentSettingsStore() {
+ NotifyOfDestruction();
+}
+
+void ExtensionContentSettingsStore::SetExtensionDefaultContentSetting(
+ ContentSettingsType content_type,
+ ContentSetting setting) {
+ // TODO(markusheintz): Implement.
+}
+
+ContentSetting
+ ExtensionContentSettingsStore::GetEffectiveDefaultContentSetting(
+ ContentSettingsType content_type) {
+ // TODO(markusheintz): Implement.
+ return CONTENT_SETTING_DEFAULT;
+}
+
+void ExtensionContentSettingsStore::SetExtensionContentSetting(
+ const std::string& ext_id,
+ const ContentSettingsPattern& pattern,
+ const ContentSettingsPattern& embedder_pattern,
+ const ContentSettingsType& type,
+ const content_settings::ResourceIdentifier& identifier,
+ ContentSetting setting,
+ bool incognito) {
+ ContentSettingSpecList* setting_spec_list =
+ GetContentSettingSpecList(ext_id, incognito);
+
+ // Find |ContentSettingSpec|
+ ContentSettingSpecList::iterator setting_spec = setting_spec_list->begin();
+ while (setting_spec != setting_spec_list->end()) {
+ if (setting_spec->a == pattern &&
+ setting_spec->b == embedder_pattern &&
+ setting_spec->c == type &&
+ setting_spec->d == identifier) {
+ break;
+ }
+ ++setting_spec;
+ }
+ if (setting_spec == setting_spec_list->end()) {
+ setting_spec = setting_spec_list->insert(
+ setting_spec_list->end(),
+ MakeTuple(pattern, embedder_pattern, type, identifier, setting));
+ }
+
+ // Update setting
+ if (setting != CONTENT_SETTING_DEFAULT) {
+ setting_spec->e = setting;
+ } else {
+ setting_spec_list->erase(setting_spec);
+ }
+
+ // Send notification that content settings changed
+ // TODO(markusheintz): Notifications should only be sent if the set content
+ // setting is effective and not hidden by an other setting of an other
+ // extensions installed more recently.
+ NotifyOfContentSettingChanged(
+ pattern,
+ embedder_pattern,
+ type,
+ identifier,
+ setting,
+ incognito);
+}
+
+void ExtensionContentSettingsStore::RegisterExtension(
+ const std::string& ext_id,
+ const base::Time& install_time,
+ bool is_enabled) {
+ if (entries_.find(ext_id) != entries_.end())
+ UnregisterExtension(ext_id);
+ entries_[ext_id] = new ExtensionEntry;
+ entries_[ext_id]->install_time = install_time;
+ entries_[ext_id]->enabled = is_enabled;
+}
+void ExtensionContentSettingsStore::UnregisterExtension(
+ const std::string& ext_id) {
+ ExtensionEntryMap::iterator i = entries_.find(ext_id);
+ if (i == entries_.end())
+ return;
+
+ delete i->second;
+ entries_.erase(i);
+}
+
+void ExtensionContentSettingsStore::SetExtensionState(
+ const std::string& ext_id, bool is_enabled) {
+ ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
+ CHECK(i != entries_.end());
+ if (i->second->enabled == is_enabled)
+ return;
+ i->second->enabled = is_enabled;
+}
+
+ExtensionContentSettingsStore::ContentSettingSpecList*
+ ExtensionContentSettingsStore::GetContentSettingSpecList(
+ const std::string& ext_id,
+ bool incognito) {
+ ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
+ CHECK(i != entries_.end());
+ return incognito ? &(i->second->incognito_settings)
+ : &(i->second->settings);
+}
+
+const ExtensionContentSettingsStore::ContentSettingSpecList*
+ ExtensionContentSettingsStore::GetContentSettingSpecList(
+ const std::string& ext_id,
+ bool incognito) const {
+ ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
+ CHECK(i != entries_.end());
+ return incognito ? &(i->second->incognito_settings)
+ : &(i->second->settings);
+}
+
+ContentSetting ExtensionContentSettingsStore::GetContentSettingFrom(
+ const GURL& url,
+ const GURL& embedder_url,
+ const ContentSettingsType& type,
+ const content_settings::ResourceIdentifier& identifier,
+ const ContentSettingSpecList* setting_spec_list) const {
+ ContentSettingSpecList::const_iterator winner_spec =
+ setting_spec_list->end();
+
+ for (ContentSettingSpecList::const_iterator spec =
+ setting_spec_list->begin();
+ spec!= setting_spec_list->end();
+ ++spec) {
+ if (!spec->a.Matches(url) ||
+ !spec->b.Matches(embedder_url) ||
+ spec->c != type ||
+ spec->d != identifier) {
+ continue;
+ }
+
+ if (winner_spec == setting_spec_list->end() ||
+ spec->a.Compare(winner_spec->a) == ContentSettingsPattern::SUCCESSOR) {
+ winner_spec = spec;
+ }
+ }
+
+ return (winner_spec != setting_spec_list->end()) ? winner_spec->e
+ : CONTENT_SETTING_DEFAULT;
+}
+
+ContentSetting ExtensionContentSettingsStore::GetEffectiveContentSetting(
+ const GURL& url,
+ const GURL& embedder_url,
+ const ContentSettingsType& type,
+ const content_settings::ResourceIdentifier& identifier,
+ bool incognito) const {
+ ExtensionEntryMap::const_iterator winner = entries_.end();
+ base::Time winners_install_time;
+ ContentSetting winner_setting = CONTENT_SETTING_DEFAULT;
+
+ ExtensionEntryMap::const_iterator i;
+ for (i = entries_.begin(); i != entries_.end(); ++i) {
+ const std::string& ext_id = i->first;
+ const base::Time& install_time = i->second->install_time;
+ const bool enabled = i->second->enabled;
+
+ if (!enabled)
+ continue;
+ if (install_time < winners_install_time)
+ continue;
+
+ const ContentSettingSpecList* setting_spec_list =
+ GetContentSettingSpecList(ext_id, false);
+ // Get non incognito setting
+ ContentSetting setting = GetContentSettingFrom(
+ url,
+ embedder_url,
+ type,
+ identifier,
+ setting_spec_list);
+
+ if (setting != CONTENT_SETTING_DEFAULT) {
+ winner = i;
+ winners_install_time = install_time;
+ winner_setting = setting;
+ }
+
+ if (!incognito)
+ continue;
+ // Get incognito setting
+ setting_spec_list =
+ GetContentSettingSpecList(ext_id, true);
+ setting = GetContentSettingFrom(
+ url,
+ embedder_url,
+ type,
+ identifier,
+ setting_spec_list);
+
+ if (setting != CONTENT_SETTING_DEFAULT) {
+ winner = i;
+ winners_install_time = install_time;
+ winner_setting = setting;
+ }
+ }
+
+ return winner_setting;
+}
+
+void ExtensionContentSettingsStore::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void ExtensionContentSettingsStore::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+void ExtensionContentSettingsStore::NotifyOfDestruction() {
+ FOR_EACH_OBSERVER(ExtensionContentSettingsStore::Observer,
+ observers_,
+ OnDestruction());
+}
+
+void ExtensionContentSettingsStore::NotifyOfContentSettingChanged(
+ const ContentSettingsPattern& pattern,
+ const ContentSettingsPattern& embedder_pattern,
+ const ContentSettingsType& type,
+ const content_settings::ResourceIdentifier& identifier,
+ ContentSetting setting,
+ bool incognito) {
+ FOR_EACH_OBSERVER(ExtensionContentSettingsStore::Observer,
+ observers_,
+ OnContentSettingChanged(
+ pattern,
+ embedder_pattern,
+ type,
+ identifier,
+ setting,
+ incognito));
+}

Powered by Google App Engine
This is Rietveld 408576698