| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/content_settings/core/browser/content_settings_registry.h" | 5 #include "components/content_settings/core/browser/content_settings_registry.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "components/content_settings/core/browser/content_settings_utils.h" | 10 #include "components/content_settings/core/browser/content_settings_utils.h" |
| 11 #include "components/content_settings/core/browser/website_settings_registry.h" | 11 #include "components/content_settings/core/browser/website_settings_registry.h" |
| 12 #include "components/content_settings/core/common/content_settings.h" | 12 #include "components/content_settings/core/common/content_settings.h" |
| 13 | 13 |
| 14 #if defined(ENABLE_PLUGINS) | 14 #if defined(ENABLE_PLUGINS) |
| 15 #include "components/content_settings/core/browser/plugins_field_trial.h" | 15 #include "components/content_settings/core/browser/plugins_field_trial.h" |
| 16 #endif | 16 #endif |
| 17 | 17 |
| 18 namespace content_settings { | 18 namespace content_settings { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 base::LazyInstance<content_settings::ContentSettingsRegistry> g_instance = | 22 base::LazyInstance<ContentSettingsRegistry> g_instance = |
| 23 LAZY_INSTANCE_INITIALIZER; | 23 LAZY_INSTANCE_INITIALIZER; |
| 24 | 24 |
| 25 // These functions return a vector of schemes in which various permissions will | 25 // TODO(raymes): These overloaded functions make the registration code clearer. |
| 26 // be whitelisted. | 26 // When initializer lists are available they won't be needed. The initializer |
| 27 const std::vector<std::string>& NoWhitelistedSchemes() { | 27 // list can be implicitly or explicitly converted to a std::vector. |
| 28 CR_DEFINE_STATIC_LOCAL(std::vector<std::string>, kNoWhitelistedSchemes, ()); | 28 std::vector<std::string> WhitelistedSchemes() { |
| 29 return kNoWhitelistedSchemes; | 29 return std::vector<std::string>(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 const std::vector<std::string>& WhitelistedForWebUI() { | 32 std::vector<std::string> WhitelistedSchemes(const char* scheme1, |
| 33 CR_DEFINE_STATIC_LOCAL(std::vector<std::string>, kWhitelistedForWebUI, ()); | 33 const char* scheme2) { |
| 34 if (kWhitelistedForWebUI.size() == 0) { | 34 const char* schemes[] = {scheme1, scheme2}; |
| 35 kWhitelistedForWebUI.push_back(kChromeDevToolsScheme); | 35 return std::vector<std::string>(schemes, schemes + arraysize(schemes)); |
| 36 kWhitelistedForWebUI.push_back(kChromeUIScheme); | |
| 37 } | |
| 38 return kWhitelistedForWebUI; | |
| 39 } | 36 } |
| 40 | 37 |
| 41 const std::vector<std::string>& WhitelistedForWebUIAndExtensions() { | 38 std::vector<std::string> WhitelistedSchemes(const char* scheme1, |
| 42 CR_DEFINE_STATIC_LOCAL(std::vector<std::string>, | 39 const char* scheme2, |
| 43 kWhitelistedForWebUIAndExtensions, ()); | 40 const char* scheme3) { |
| 44 if (kWhitelistedForWebUIAndExtensions.size() == 0) { | 41 const char* schemes[] = {scheme1, scheme2, scheme3}; |
| 45 kWhitelistedForWebUIAndExtensions = WhitelistedForWebUI(); | 42 return std::vector<std::string>(schemes, schemes + arraysize(schemes)); |
| 46 #if defined(ENABLE_EXTENSIONS) | 43 } |
| 47 kWhitelistedForWebUIAndExtensions.push_back(kExtensionScheme); | 44 |
| 48 #endif | 45 std::set<ContentSetting> ValidSettings() { |
| 49 } | 46 return std::set<ContentSetting>(); |
| 50 return kWhitelistedForWebUIAndExtensions; | 47 } |
| 48 |
| 49 std::set<ContentSetting> ValidSettings(ContentSetting setting1, |
| 50 ContentSetting setting2) { |
| 51 ContentSetting settings[] = {setting1, setting2}; |
| 52 return std::set<ContentSetting>(settings, settings + arraysize(settings)); |
| 53 } |
| 54 |
| 55 std::set<ContentSetting> ValidSettings(ContentSetting setting1, |
| 56 ContentSetting setting2, |
| 57 ContentSetting setting3) { |
| 58 ContentSetting settings[] = {setting1, setting2, setting3}; |
| 59 return std::set<ContentSetting>(settings, settings + arraysize(settings)); |
| 60 } |
| 61 |
| 62 std::set<ContentSetting> ValidSettings(ContentSetting setting1, |
| 63 ContentSetting setting2, |
| 64 ContentSetting setting3, |
| 65 ContentSetting setting4) { |
| 66 ContentSetting settings[] = {setting1, setting2, setting3, setting4}; |
| 67 return std::set<ContentSetting>(settings, settings + arraysize(settings)); |
| 51 } | 68 } |
| 52 | 69 |
| 53 ContentSetting GetDefaultPluginsContentSetting() { | 70 ContentSetting GetDefaultPluginsContentSetting() { |
| 54 #if defined(ENABLE_PLUGINS) | 71 #if defined(ENABLE_PLUGINS) |
| 55 return PluginsFieldTrial::GetDefaultPluginsContentSetting(); | 72 return PluginsFieldTrial::GetDefaultPluginsContentSetting(); |
| 56 #else | 73 #else |
| 57 return CONTENT_SETTING_BLOCK; | 74 return CONTENT_SETTING_BLOCK; |
| 58 #endif | 75 #endif |
| 59 } | 76 } |
| 60 | 77 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 } | 118 } |
| 102 | 119 |
| 103 void ContentSettingsRegistry::Init() { | 120 void ContentSettingsRegistry::Init() { |
| 104 // TODO(raymes): This registration code should not have to be in a single | 121 // TODO(raymes): This registration code should not have to be in a single |
| 105 // location. It should be possible to register a setting from the code | 122 // location. It should be possible to register a setting from the code |
| 106 // associated with it. | 123 // associated with it. |
| 107 | 124 |
| 108 // WARNING: The string names of the permissions passed in below are used to | 125 // WARNING: The string names of the permissions passed in below are used to |
| 109 // generate preference names and should never be changed! | 126 // generate preference names and should never be changed! |
| 110 | 127 |
| 111 // Content settings (those with allow/block/ask/etc. values). | |
| 112 Register(CONTENT_SETTINGS_TYPE_COOKIES, "cookies", CONTENT_SETTING_ALLOW, | 128 Register(CONTENT_SETTINGS_TYPE_COOKIES, "cookies", CONTENT_SETTING_ALLOW, |
| 113 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUI()); | 129 WebsiteSettingsInfo::SYNCABLE, |
| 130 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 131 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 132 CONTENT_SETTING_SESSION_ONLY)); |
| 133 |
| 114 Register(CONTENT_SETTINGS_TYPE_IMAGES, "images", CONTENT_SETTING_ALLOW, | 134 Register(CONTENT_SETTINGS_TYPE_IMAGES, "images", CONTENT_SETTING_ALLOW, |
| 115 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUIAndExtensions()); | 135 WebsiteSettingsInfo::SYNCABLE, |
| 136 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme, |
| 137 kExtensionScheme), |
| 138 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK)); |
| 139 |
| 116 Register(CONTENT_SETTINGS_TYPE_JAVASCRIPT, "javascript", | 140 Register(CONTENT_SETTINGS_TYPE_JAVASCRIPT, "javascript", |
| 117 CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::SYNCABLE, | 141 CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::SYNCABLE, |
| 118 WhitelistedForWebUIAndExtensions()); | 142 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme, |
| 143 kExtensionScheme), |
| 144 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK)); |
| 145 |
| 119 Register(CONTENT_SETTINGS_TYPE_PLUGINS, "plugins", | 146 Register(CONTENT_SETTINGS_TYPE_PLUGINS, "plugins", |
| 120 GetDefaultPluginsContentSetting(), | 147 GetDefaultPluginsContentSetting(), WebsiteSettingsInfo::SYNCABLE, |
| 121 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUI()); | 148 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 149 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 150 CONTENT_SETTING_ASK, |
| 151 CONTENT_SETTING_DETECT_IMPORTANT_CONTENT)); |
| 152 |
| 122 Register(CONTENT_SETTINGS_TYPE_POPUPS, "popups", CONTENT_SETTING_BLOCK, | 153 Register(CONTENT_SETTINGS_TYPE_POPUPS, "popups", CONTENT_SETTING_BLOCK, |
| 123 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUIAndExtensions()); | 154 WebsiteSettingsInfo::SYNCABLE, |
| 155 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme, |
| 156 kExtensionScheme), |
| 157 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK)); |
| 158 |
| 124 Register(CONTENT_SETTINGS_TYPE_GEOLOCATION, "geolocation", | 159 Register(CONTENT_SETTINGS_TYPE_GEOLOCATION, "geolocation", |
| 125 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 160 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 126 NoWhitelistedSchemes()); | 161 WhitelistedSchemes(), |
| 162 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 163 CONTENT_SETTING_ASK)); |
| 164 |
| 127 Register(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, "notifications", | 165 Register(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, "notifications", |
| 128 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 166 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 129 NoWhitelistedSchemes()); | 167 WhitelistedSchemes(), |
| 168 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 169 CONTENT_SETTING_ASK)); |
| 170 |
| 130 Register(CONTENT_SETTINGS_TYPE_FULLSCREEN, "fullscreen", CONTENT_SETTING_ASK, | 171 Register(CONTENT_SETTINGS_TYPE_FULLSCREEN, "fullscreen", CONTENT_SETTING_ASK, |
| 131 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUI()); | 172 WebsiteSettingsInfo::SYNCABLE, |
| 173 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 174 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK)); |
| 175 |
| 132 Register(CONTENT_SETTINGS_TYPE_MOUSELOCK, "mouselock", CONTENT_SETTING_ASK, | 176 Register(CONTENT_SETTINGS_TYPE_MOUSELOCK, "mouselock", CONTENT_SETTING_ASK, |
| 133 WebsiteSettingsInfo::SYNCABLE, WhitelistedForWebUI()); | 177 WebsiteSettingsInfo::SYNCABLE, |
| 178 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 179 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 180 CONTENT_SETTING_ASK)); |
| 181 |
| 134 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, "media-stream-mic", | 182 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, "media-stream-mic", |
| 135 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 183 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 136 WhitelistedForWebUI()); | 184 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 185 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 186 CONTENT_SETTING_ASK)); |
| 187 |
| 137 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, "media-stream-camera", | 188 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, "media-stream-camera", |
| 138 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 189 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 139 WhitelistedForWebUI()); | 190 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 191 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 192 CONTENT_SETTING_ASK)); |
| 193 |
| 140 Register(CONTENT_SETTINGS_TYPE_PPAPI_BROKER, "ppapi-broker", | 194 Register(CONTENT_SETTINGS_TYPE_PPAPI_BROKER, "ppapi-broker", |
| 141 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 195 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 142 WhitelistedForWebUI()); | 196 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), |
| 197 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 198 CONTENT_SETTING_ASK)); |
| 199 |
| 143 Register(CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, "automatic-downloads", | 200 Register(CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, "automatic-downloads", |
| 144 CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, | 201 CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, |
| 145 WhitelistedForWebUIAndExtensions()); | 202 WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme, |
| 203 kExtensionScheme), |
| 204 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 205 CONTENT_SETTING_ASK)); |
| 206 |
| 146 Register(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, "midi-sysex", CONTENT_SETTING_ASK, | 207 Register(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, "midi-sysex", CONTENT_SETTING_ASK, |
| 147 WebsiteSettingsInfo::SYNCABLE, NoWhitelistedSchemes()); | 208 WebsiteSettingsInfo::SYNCABLE, WhitelistedSchemes(), |
| 209 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 210 CONTENT_SETTING_ASK)); |
| 211 |
| 148 Register(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, "push-messaging", | 212 Register(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, "push-messaging", |
| 149 CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, | 213 CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, |
| 150 NoWhitelistedSchemes()); | 214 WhitelistedSchemes(), |
| 215 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 216 CONTENT_SETTING_ASK)); |
| 217 |
| 151 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) | 218 #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
| 152 Register(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, | 219 Register(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, |
| 153 "protected-media-identifier", CONTENT_SETTING_ASK, | 220 "protected-media-identifier", CONTENT_SETTING_ASK, |
| 154 WebsiteSettingsInfo::UNSYNCABLE, NoWhitelistedSchemes()); | 221 WebsiteSettingsInfo::UNSYNCABLE, WhitelistedSchemes(), |
| 222 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, |
| 223 CONTENT_SETTING_ASK)); |
| 155 #endif | 224 #endif |
| 225 |
| 156 Register(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, "durable-storage", | 226 Register(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, "durable-storage", |
| 157 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, | 227 CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, |
| 158 NoWhitelistedSchemes()); | 228 WhitelistedSchemes(), |
| 229 ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK)); |
| 159 | 230 |
| 160 // Content settings that aren't used to store any data. TODO(raymes): use a | 231 // Content settings that aren't used to store any data. TODO(raymes): use a |
| 161 // different mechanism rather than content settings to represent these. | 232 // different mechanism rather than content settings to represent these. |
| 162 // Since nothing is stored in them, there is no real point in them being a | 233 // Since nothing is stored in them, there is no real point in them being a |
| 163 // content setting. | 234 // content setting. |
| 164 Register(CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, "protocol-handler", | 235 Register(CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, "protocol-handler", |
| 165 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, | 236 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, |
| 166 NoWhitelistedSchemes()); | 237 WhitelistedSchemes(), ValidSettings()); |
| 238 |
| 167 Register(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, "mixed-script", | 239 Register(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, "mixed-script", |
| 168 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, | 240 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, |
| 169 NoWhitelistedSchemes()); | 241 WhitelistedSchemes(), ValidSettings()); |
| 170 | 242 |
| 171 // Deprecated. | 243 // Deprecated. |
| 172 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM, "media-stream", | 244 Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM, "media-stream", |
| 173 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, | 245 CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, |
| 174 NoWhitelistedSchemes()); | 246 WhitelistedSchemes(), ValidSettings()); |
| 175 } | 247 } |
| 176 | 248 |
| 177 void ContentSettingsRegistry::Register( | 249 void ContentSettingsRegistry::Register( |
| 178 ContentSettingsType type, | 250 ContentSettingsType type, |
| 179 const std::string& name, | 251 const std::string& name, |
| 180 ContentSetting initial_default_value, | 252 ContentSetting initial_default_value, |
| 181 WebsiteSettingsInfo::SyncStatus sync_status, | 253 WebsiteSettingsInfo::SyncStatus sync_status, |
| 182 const std::vector<std::string>& whitelisted_schemes) { | 254 const std::vector<std::string>& whitelisted_schemes, |
| 255 const std::set<ContentSetting>& valid_settings) { |
| 183 // Ensure that nothing has been registered yet for the given type. | 256 // Ensure that nothing has been registered yet for the given type. |
| 184 DCHECK(!website_settings_registry_->Get(type)); | 257 DCHECK(!website_settings_registry_->Get(type)); |
| 185 scoped_ptr<base::Value> default_value( | 258 scoped_ptr<base::Value> default_value( |
| 186 new base::FundamentalValue(static_cast<int>(initial_default_value))); | 259 new base::FundamentalValue(static_cast<int>(initial_default_value))); |
| 187 const WebsiteSettingsInfo* website_settings_info = | 260 const WebsiteSettingsInfo* website_settings_info = |
| 188 website_settings_registry_->Register(type, name, default_value.Pass(), | 261 website_settings_registry_->Register(type, name, default_value.Pass(), |
| 189 sync_status, | 262 sync_status, |
| 190 WebsiteSettingsInfo::NOT_LOSSY); | 263 WebsiteSettingsInfo::NOT_LOSSY); |
| 191 DCHECK(!ContainsKey(content_settings_info_, type)); | 264 DCHECK(!ContainsKey(content_settings_info_, type)); |
| 192 content_settings_info_.set( | 265 content_settings_info_.set( |
| 193 type, make_scoped_ptr(new ContentSettingsInfo(website_settings_info, | 266 type, make_scoped_ptr(new ContentSettingsInfo( |
| 194 whitelisted_schemes))); | 267 website_settings_info, whitelisted_schemes, valid_settings))); |
| 195 } | 268 } |
| 196 | 269 |
| 197 } // namespace content_settings | 270 } // namespace content_settings |
| OLD | NEW |