| Index: chrome/browser/ui/webui/options/content_settings_handler.cc
|
| diff --git a/chrome/browser/ui/webui/options/content_settings_handler.cc b/chrome/browser/ui/webui/options/content_settings_handler.cc
|
| index b5a270473bff64cef11990be8c015b842606b57b..099240003b83192f058523aff610f948254cd0f6 100644
|
| --- a/chrome/browser/ui/webui/options/content_settings_handler.cc
|
| +++ b/chrome/browser/ui/webui/options/content_settings_handler.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/ui/webui/options/content_settings_handler.h"
|
|
|
| +#include <map>
|
| #include <string>
|
| #include <vector>
|
|
|
| @@ -13,10 +14,10 @@
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/content_settings/content_settings_details.h"
|
| +#include "chrome/browser/content_settings/content_settings_pattern.h"
|
| #include "chrome/browser/content_settings/content_settings_utils.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map.h"
|
| #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
|
| -#include "chrome/browser/geolocation/geolocation_content_settings_map.h"
|
| #include "chrome/browser/notifications/desktop_notification_service.h"
|
| #include "chrome/browser/notifications/desktop_notification_service_factory.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| @@ -41,6 +42,10 @@ struct ContentSettingsTypeNameEntry {
|
| const char* name;
|
| };
|
|
|
| +typedef std::map<ContentSettingsPattern, ContentSetting> OnePatternSettings;
|
| +typedef std::map<ContentSettingsPattern, OnePatternSettings>
|
| + AllPatternsSettings;
|
| +
|
| const char* kDisplayPattern = "displayPattern";
|
| const char* kSetting = "setting";
|
| const char* kOrigin = "origin";
|
| @@ -100,14 +105,16 @@ ContentSetting ContentSettingFromString(const std::string& name) {
|
| return CONTENT_SETTING_DEFAULT;
|
| }
|
|
|
| -std::string GeolocationExceptionToString(const GURL& origin,
|
| - const GURL& embedding_origin) {
|
| +std::string GeolocationExceptionToString(
|
| + const ContentSettingsPattern& origin,
|
| + const ContentSettingsPattern& embedding_origin) {
|
| if (origin == embedding_origin)
|
| - return content_settings_helper::OriginToString(origin);
|
| + return origin.ToString();
|
|
|
| // TODO(estade): the page needs to use CSS to indent the string.
|
| std::string indent(" ");
|
| - if (embedding_origin.is_empty()) {
|
| +
|
| + if (embedding_origin == ContentSettingsPattern::Wildcard()) {
|
| // NOTE: As long as the user cannot add/edit entries from the exceptions
|
| // dialog, it's impossible to actually have a non-default setting for some
|
| // origin "embedded on any other site", so this row will never appear. If
|
| @@ -119,7 +126,7 @@ std::string GeolocationExceptionToString(const GURL& origin,
|
|
|
| return indent + l10n_util::GetStringFUTF8(
|
| IDS_EXCEPTIONS_GEOLOCATION_EMBEDDED_ON_HOST,
|
| - UTF8ToUTF16(content_settings_helper::OriginToString(embedding_origin)));
|
| + UTF8ToUTF16(embedding_origin.ToString()));
|
| }
|
|
|
| // Create a DictionaryValue* that will act as a data source for a single row
|
| @@ -130,37 +137,25 @@ DictionaryValue* GetExceptionForPage(
|
| ContentSetting setting,
|
| std::string provider_name) {
|
| DictionaryValue* exception = new DictionaryValue();
|
| - exception->Set(
|
| - kDisplayPattern,
|
| - new StringValue(pattern.ToString()));
|
| - exception->Set(
|
| - kSetting,
|
| - new StringValue(ContentSettingToString(setting)));
|
| - exception->Set(
|
| - kSource,
|
| - new StringValue(provider_name));
|
| + exception->SetString(kDisplayPattern, pattern.ToString());
|
| + exception->SetString(kSetting, ContentSettingToString(setting));
|
| + exception->SetString(kSource, provider_name);
|
| return exception;
|
| }
|
|
|
| // Create a DictionaryValue* that will act as a data source for a single row
|
| // in the Geolocation exceptions table. Ownership of the pointer is passed to
|
| // the caller.
|
| -DictionaryValue* GetGeolocationExceptionForPage(const GURL& origin,
|
| - const GURL& embedding_origin,
|
| - ContentSetting setting) {
|
| +DictionaryValue* GetGeolocationExceptionForPage(
|
| + const ContentSettingsPattern& origin,
|
| + const ContentSettingsPattern& embedding_origin,
|
| + ContentSetting setting) {
|
| DictionaryValue* exception = new DictionaryValue();
|
| - exception->Set(
|
| - kDisplayPattern,
|
| - new StringValue(GeolocationExceptionToString(origin, embedding_origin)));
|
| - exception->Set(
|
| - kSetting,
|
| - new StringValue(ContentSettingToString(setting)));
|
| - exception->Set(
|
| - kOrigin,
|
| - new StringValue(origin.spec()));
|
| - exception->Set(
|
| - kEmbeddingOrigin,
|
| - new StringValue(embedding_origin.spec()));
|
| + exception->SetString(kDisplayPattern,
|
| + GeolocationExceptionToString(origin, embedding_origin));
|
| + exception->SetString(kSetting, ContentSettingToString(setting));
|
| + exception->SetString(kOrigin, origin.ToString());
|
| + exception->SetString(kEmbeddingOrigin, embedding_origin.ToString());
|
| return exception;
|
| }
|
|
|
| @@ -171,15 +166,10 @@ DictionaryValue* GetNotificationExceptionForPage(
|
| const GURL& url,
|
| ContentSetting setting) {
|
| DictionaryValue* exception = new DictionaryValue();
|
| - exception->Set(
|
| - kDisplayPattern,
|
| - new StringValue(content_settings_helper::OriginToString(url)));
|
| - exception->Set(
|
| - kSetting,
|
| - new StringValue(ContentSettingToString(setting)));
|
| - exception->Set(
|
| - kOrigin,
|
| - new StringValue(url.spec()));
|
| + exception->SetString(kDisplayPattern,
|
| + content_settings_helper::OriginToString(url));
|
| + exception->SetString(kSetting, ContentSettingToString(setting));
|
| + exception->SetString(kOrigin, url.spec());
|
| return exception;
|
| }
|
|
|
| @@ -438,36 +428,51 @@ void ContentSettingsHandler::UpdateOTRExceptionsViewFromModel(
|
| }
|
|
|
| void ContentSettingsHandler::UpdateGeolocationExceptionsView() {
|
| - GeolocationContentSettingsMap* map = web_ui_->tab_contents()->
|
| - browser_context()->GetGeolocationContentSettingsMap();
|
| - GeolocationContentSettingsMap::AllOriginsSettings all_settings =
|
| - map->GetAllOriginsSettings();
|
| - GeolocationContentSettingsMap::AllOriginsSettings::const_iterator i;
|
| + Profile* profile = Profile::FromWebUI(web_ui_);
|
| + HostContentSettingsMap* map = profile->GetHostContentSettingsMap();
|
| +
|
| + HostContentSettingsMap::SettingsForOneType all_settings;
|
| + map->GetSettingsForOneType(
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION,
|
| + std::string(),
|
| + &all_settings);
|
| +
|
| + // Group geolocation settings by primary_pattern.
|
| + AllPatternsSettings all_patterns_settings;
|
| + for (HostContentSettingsMap::SettingsForOneType::iterator i =
|
| + all_settings.begin();
|
| + i != all_settings.end();
|
| + ++i) {
|
| + all_patterns_settings[i->a][i->b] = i->c;
|
| + }
|
|
|
| ListValue exceptions;
|
| - for (i = all_settings.begin(); i != all_settings.end(); ++i) {
|
| - const GURL& origin = i->first;
|
| - const GeolocationContentSettingsMap::OneOriginSettings& one_settings =
|
| - i->second;
|
| + for (AllPatternsSettings::iterator i = all_patterns_settings.begin();
|
| + i != all_patterns_settings.end();
|
| + ++i) {
|
| + const ContentSettingsPattern& primary_pattern = i->first;
|
| + const OnePatternSettings& one_settings = i->second;
|
|
|
| - GeolocationContentSettingsMap::OneOriginSettings::const_iterator parent =
|
| - one_settings.find(origin);
|
| + OnePatternSettings::const_iterator parent =
|
| + one_settings.find(primary_pattern);
|
|
|
| // Add the "parent" entry for the non-embedded setting.
|
| ContentSetting parent_setting =
|
| parent == one_settings.end() ? CONTENT_SETTING_DEFAULT : parent->second;
|
| - exceptions.Append(
|
| - GetGeolocationExceptionForPage(origin, origin, parent_setting));
|
| + exceptions.Append(GetGeolocationExceptionForPage(primary_pattern,
|
| + primary_pattern,
|
| + parent_setting));
|
|
|
| // Add the "children" for any embedded settings.
|
| - GeolocationContentSettingsMap::OneOriginSettings::const_iterator j;
|
| - for (j = one_settings.begin(); j != one_settings.end(); ++j) {
|
| + for (OnePatternSettings::const_iterator j = one_settings.begin();
|
| + j != one_settings.end();
|
| + ++j) {
|
| // Skip the non-embedded setting which we already added above.
|
| if (j == parent)
|
| continue;
|
|
|
| exceptions.Append(
|
| - GetGeolocationExceptionForPage(origin, j->first, j->second));
|
| + GetGeolocationExceptionForPage(primary_pattern, j->first, j->second));
|
| }
|
| }
|
|
|
| @@ -516,8 +521,18 @@ void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap(
|
|
|
| ListValue exceptions;
|
| for (size_t i = 0; i < entries.size(); ++i) {
|
| - exceptions.Append(
|
| - GetExceptionForPage(entries[i].a, entries[i].c, entries[i].d));
|
| + // The content settings UI does not support secondary content settings
|
| + // pattern yet. For content settings set through the content settings UI the
|
| + // secondary pattern is by default a wildcard pattern. Hence users are not
|
| + // able to modify content settings with a secondary pattern other than the
|
| + // wildcard pattern. So only show settings that the user is able to modify.
|
| + if (entries[i].b == ContentSettingsPattern::Wildcard()) {
|
| + exceptions.Append(
|
| + GetExceptionForPage(entries[i].a, entries[i].c, entries[i].d));
|
| + } else {
|
| + LOG(DFATAL) << "Secondary content settings patterns are not"
|
| + << "supported by the content settings UI";
|
| + }
|
| }
|
|
|
| StringValue type_string(ContentSettingsTypeToGroupName(type));
|
| @@ -603,9 +618,11 @@ void ContentSettingsHandler::RemoveException(const ListValue* args) {
|
| rv = args->GetString(arg_i++, &embedding_origin);
|
| DCHECK(rv);
|
|
|
| - profile->GetGeolocationContentSettingsMap()->
|
| - SetContentSetting(GURL(origin),
|
| - GURL(embedding_origin),
|
| + profile->GetHostContentSettingsMap()->
|
| + SetContentSetting(ContentSettingsPattern::FromString(origin),
|
| + ContentSettingsPattern::FromString(embedding_origin),
|
| + CONTENT_SETTINGS_TYPE_GEOLOCATION,
|
| + std::string(),
|
| CONTENT_SETTING_DEFAULT);
|
| } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
|
| std::string origin;
|
|
|