diff options
9 files changed, 79 insertions, 40 deletions
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd index 91e3dbc..7a0b200 100644 --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd @@ -367,6 +367,7 @@ <include name="IDR_UPDATE_MENU4" file="update_menu4.png" type="BINDATA" /> <include name="IDR_UPDATE_UPTODATE" file="update_uptodate.png" type="BINDATA" /> <include name="IDR_WARNING" file="alert_small.png" type="BINDATA" /> + <include name="IDR_MANAGED" file="managed_small.png" type="BINDATA" /> <if expr="pp_ifdef('_google_chrome')"> <include name="IDR_WEBSTORE_ICON" file="google_chrome/webstore_icon.png" type="BINDATA" /> <include name="IDR_WEBSTORE_ICON_16" file="google_chrome/webstore_icon_16.png" type="BINDATA" /> diff --git a/chrome/browser/content_settings/content_settings_extension_provider.h b/chrome/browser/content_settings/content_settings_extension_provider.h index 2bc8e96..06c2569 100644 --- a/chrome/browser/content_settings/content_settings_extension_provider.h +++ b/chrome/browser/content_settings/content_settings_extension_provider.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_EXTENSION_PROVIDER_H_ #define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_EXTENSION_PROVIDER_H_ +#include <string> + #include "chrome/browser/content_settings/content_settings_provider.h" #include "chrome/browser/extensions/extension_content_settings_store.h" @@ -37,8 +39,6 @@ class ExtensionProvider : public ProviderInterface, const ResourceIdentifier& resource_identifier, ContentSetting content_setting) {} - // TODO(markusheintz): The UI needs a way to discover that these rules are - // managed by an extension. virtual void GetAllContentSettingsRules( ContentSettingsType content_type, const ResourceIdentifier& resource_identifier, diff --git a/chrome/browser/content_settings/content_settings_pref_provider.cc b/chrome/browser/content_settings/content_settings_pref_provider.cc index 027718a..3474166 100644 --- a/chrome/browser/content_settings/content_settings_pref_provider.cc +++ b/chrome/browser/content_settings/content_settings_pref_provider.cc @@ -4,6 +4,7 @@ #include "chrome/browser/content_settings/content_settings_pref_provider.h" +#include <list> #include <string> #include <utility> #include <vector> diff --git a/chrome/browser/content_settings/host_content_settings_map.cc b/chrome/browser/content_settings/host_content_settings_map.cc index 0c6bf93..102c560 100644 --- a/chrome/browser/content_settings/host_content_settings_map.cc +++ b/chrome/browser/content_settings/host_content_settings_map.cc @@ -4,6 +4,8 @@ #include "chrome/browser/content_settings/host_content_settings_map.h" +#include <list> + #include "base/command_line.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" @@ -58,6 +60,12 @@ typedef content_settings::ProviderInterface::Rules::iterator typedef content_settings::ProviderInterface::Rules::const_iterator const_rules_iterator; +const char* kProviderNames[] = { + "policy", + "extension", + "preference" +}; + } // namespace HostContentSettingsMap::HostContentSettingsMap(Profile* profile) @@ -290,41 +298,35 @@ void HostContentSettingsMap::GetSettingsForOneType( DCHECK_NE(content_settings::RequiresResourceIdentifier(content_type), resource_identifier.empty()); DCHECK(settings); - // Collect content_settings::Rules for the given content_type and - // resource_identifier from the content settings providers. - std::map<std::string, PatternSettingPair> - pattern_str_pattern_setting_pair_map; - for (ConstProviderIterator provider = content_settings_providers_.begin(); - provider != content_settings_providers_.end(); - ++provider) { + + settings->clear(); + for (size_t i = 0; i < content_settings_providers_.size(); ++i) { + // Get rules from the content settings provider. Rules rules; - (*provider)->GetAllContentSettingsRules( + content_settings_providers_[i]->GetAllContentSettingsRules( content_type, resource_identifier, &rules); - // TODO(markusheintz): Only the rules that are applied should be collected. + + // Sort rules according to their primary pattern string using a map. + std::map<std::string, PatternSettingSourceTriple> settings_map; for (Rules::iterator rule = rules.begin(); rule != rules.end(); ++rule) { - // As long as we don't support pattern pairs in the UI we display the + // We do not support pattern pairs in the UI, so we only display the // primary pattern. - ContentSettingsPattern pattern = rule->primary_pattern; - std::string key = pattern.ToString(); - // Only add a rule if no provider with a higher priority has a rule with - // an identical primary pattern. - if (pattern_str_pattern_setting_pair_map.find(key) == - pattern_str_pattern_setting_pair_map.end()) { - pattern_str_pattern_setting_pair_map[key] = - PatternSettingPair(pattern, rule->content_setting); - } + std::string sort_key = rule->primary_pattern.ToString(); + settings_map[sort_key] = PatternSettingSourceTriple( + rule->primary_pattern, + rule->content_setting, + kProviderNames[i]); } - } - settings->clear(); - // Rely on the maps iterator to sort the rules. - for (std::map<std::string, PatternSettingPair>::iterator i( - pattern_str_pattern_setting_pair_map.begin()); - i != pattern_str_pattern_setting_pair_map.end(); - ++i) { - settings->push_back(i->second); + // TODO(markusheintz): Only the rules that are applied should be added. + for (std::map<std::string, PatternSettingSourceTriple>::iterator i( + settings_map.begin()); + i != settings_map.end(); + ++i) { + settings->push_back(i->second); + } } } diff --git a/chrome/browser/content_settings/host_content_settings_map.h b/chrome/browser/content_settings/host_content_settings_map.h index dcb48cf..a4ed56f 100644 --- a/chrome/browser/content_settings/host_content_settings_map.h +++ b/chrome/browser/content_settings/host_content_settings_map.h @@ -41,8 +41,9 @@ class HostContentSettingsMap public base::RefCountedThreadSafe<HostContentSettingsMap, BrowserThread::DeleteOnUIThread> { public: - typedef std::pair<ContentSettingsPattern, ContentSetting> PatternSettingPair; - typedef std::vector<PatternSettingPair> SettingsForOneType; + typedef Tuple3<ContentSettingsPattern, ContentSetting, std::string> + PatternSettingSourceTriple; + typedef std::vector<PatternSettingSourceTriple> SettingsForOneType; explicit HostContentSettingsMap(Profile* profile); diff --git a/chrome/browser/plugin_exceptions_table_model.cc b/chrome/browser/plugin_exceptions_table_model.cc index 365c538..1cf2a69 100644 --- a/chrome/browser/plugin_exceptions_table_model.cc +++ b/chrome/browser/plugin_exceptions_table_model.cc @@ -162,9 +162,9 @@ void PluginExceptionsTableModel::LoadSettings() { settings.begin(); setting_it != settings.end(); ++setting_it) { SettingsEntry entry = { - setting_it->first, + setting_it->a, group_id, - setting_it->second, + setting_it->b, false }; settings_.push_back(entry); @@ -173,9 +173,9 @@ void PluginExceptionsTableModel::LoadSettings() { otr_settings.begin(); setting_it != otr_settings.end(); ++setting_it) { SettingsEntry entry = { - setting_it->first, + setting_it->a, group_id, - setting_it->second, + setting_it->b, true }; settings_.push_back(entry); diff --git a/chrome/browser/resources/options/content_settings.css b/chrome/browser/resources/options/content_settings.css index babbf17..d48c6a0 100644 --- a/chrome/browser/resources/options/content_settings.css +++ b/chrome/browser/resources/options/content_settings.css @@ -50,3 +50,22 @@ select.exception-setting { display: block; margin: 7px 0px; } + +div[role="listitem"][managedby] { + color: #666; + font-style: italic; + position: relative; +} + +div[role="listitem"][managedby="policy"][selected][lead], +div[role="listitem"][managedby="policy"][selected], +div[role="listitem"][managedby="policy"] { + background: -webkit-linear-gradient(#fff1b5, #fae692); + border-top: 0; + border-bottom: 1px solid #c9bd8d; +} + +list div[role="listitem"][managedby="policy"] .close-button { + background-image: url("chrome://theme/IDR_MANAGED"); + opacity: 1; +} diff --git a/chrome/browser/resources/options/content_settings_exceptions_area.js b/chrome/browser/resources/options/content_settings_exceptions_area.js index 8609725..fcc3e7b 100644 --- a/chrome/browser/resources/options/content_settings_exceptions_area.js +++ b/chrome/browser/resources/options/content_settings_exceptions_area.js @@ -115,6 +115,14 @@ cr.define('options.contentSettings', function() { this.editable = false; } + // If the source of the content setting exception is a policy, then the + // content settings exception is managed and the user can't edit it. + if (this.dataItem.source == 'policy') { + this.setAttribute('managedby', this.dataItem.source); + this.deletable = false; + this.editable = false; + } + var listItem = this; // Handle events on the editable nodes. input.oninput = function(event) { diff --git a/chrome/browser/ui/webui/options/content_settings_handler.cc b/chrome/browser/ui/webui/options/content_settings_handler.cc index 35f4461..9047d97 100644 --- a/chrome/browser/ui/webui/options/content_settings_handler.cc +++ b/chrome/browser/ui/webui/options/content_settings_handler.cc @@ -42,6 +42,7 @@ struct ContentSettingsTypeNameEntry { const char* kDisplayPattern = "displayPattern"; const char* kSetting = "setting"; const char* kOrigin = "origin"; +const char* kSource = "source"; const char* kEmbeddingOrigin = "embeddingOrigin"; const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = { @@ -124,7 +125,8 @@ std::string GeolocationExceptionToString(const GURL& origin, // Ownership of the pointer is passed to the caller. DictionaryValue* GetExceptionForPage( const ContentSettingsPattern& pattern, - ContentSetting setting) { + ContentSetting setting, + std::string provider_name) { DictionaryValue* exception = new DictionaryValue(); exception->Set( kDisplayPattern, @@ -132,6 +134,9 @@ DictionaryValue* GetExceptionForPage( exception->Set( kSetting, new StringValue(ContentSettingToString(setting))); + exception->Set( + kSource, + new StringValue(provider_name)); return exception; } @@ -402,7 +407,7 @@ void ContentSettingsHandler::UpdateHandlersEnabledRadios() { web_ui_->CallJavascriptFunction("ContentSettings.updateHandlersEnabledRadios", handlers_enabled); -#endif // defined(ENABLE_REGISTER_PROTOCOL_HANDLER) +#endif // defined(ENABLE_REGISTER_PROTOCOL_HANDLER) } void ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() { @@ -524,7 +529,8 @@ void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap( ListValue exceptions; for (size_t i = 0; i < entries.size(); ++i) { - exceptions.Append(GetExceptionForPage(entries[i].first, entries[i].second)); + exceptions.Append( + GetExceptionForPage(entries[i].a, entries[i].b, entries[i].c)); } StringValue type_string(ContentSettingsTypeToGroupName(type)); @@ -549,8 +555,9 @@ void ContentSettingsHandler::UpdateExceptionsViewFromOTRHostContentSettingsMap( ListValue otr_exceptions; for (size_t i = 0; i < otr_entries.size(); ++i) { - otr_exceptions.Append(GetExceptionForPage(otr_entries[i].first, - otr_entries[i].second)); + otr_exceptions.Append(GetExceptionForPage(otr_entries[i].a, + otr_entries[i].b, + otr_entries[i].c)); } StringValue type_string(ContentSettingsTypeToGroupName(type)); |