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

Side by Side Diff: chrome/common/extensions/extension_constants.cc

Issue 8693005: Remove potentially many static initializers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: no streq Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/common/extensions/extension_constants.h" 5 #include "chrome/common/extensions/extension_constants.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "chrome/common/chrome_switches.h" 11 #include "chrome/common/chrome_switches.h"
12 12
13 namespace extension_manifest_keys { 13 namespace extension_manifest_keys {
14 14
15 const char* kAllFrames = "all_frames"; 15 const char kAllFrames[] = "all_frames";
16 const char* kAltKey = "altKey"; 16 const char kAltKey[] = "altKey";
17 const char* kApp = "app"; 17 const char kApp[] = "app";
18 const char* kBackground = "background_page"; 18 const char kBackground[] = "background_page";
19 const char* kBrowserAction = "browser_action"; 19 const char kBrowserAction[] = "browser_action";
20 const char* kChromeURLOverrides = "chrome_url_overrides"; 20 const char kChromeURLOverrides[] = "chrome_url_overrides";
21 const char* kContentScripts = "content_scripts"; 21 const char kContentScripts[] = "content_scripts";
22 const char* kContentSecurityPolicy = "content_security_policy"; 22 const char kContentSecurityPolicy[] = "content_security_policy";
23 const char* kConvertedFromUserScript = "converted_from_user_script"; 23 const char kConvertedFromUserScript[] = "converted_from_user_script";
24 const char* kCss = "css"; 24 const char kCss[] = "css";
25 const char* kCtrlKey = "ctrlKey"; 25 const char kCtrlKey[] = "ctrlKey";
26 const char* kCurrentLocale = "current_locale"; 26 const char kCurrentLocale[] = "current_locale";
27 const char* kDefaultLocale = "default_locale"; 27 const char kDefaultLocale[] = "default_locale";
28 const char* kDescription = "description"; 28 const char kDescription[] = "description";
29 const char* kDevToolsPage = "devtools_page"; 29 const char kDevToolsPage[] = "devtools_page";
30 const char* kExcludeGlobs = "exclude_globs"; 30 const char kExcludeGlobs[] = "exclude_globs";
31 const char* kExcludeMatches = "exclude_matches"; 31 const char kExcludeMatches[] = "exclude_matches";
32 const char* kFileFilters = "file_filters"; 32 const char kFileFilters[] = "file_filters";
33 const char* kFileBrowserHandlers = "file_browser_handlers"; 33 const char kFileBrowserHandlers[] = "file_browser_handlers";
34 const char* kHomepageURL = "homepage_url"; 34 const char kHomepageURL[] = "homepage_url";
35 const char* kIcons = "icons"; 35 const char kIcons[] = "icons";
36 const char* kId = "id"; 36 const char kId[] = "id";
37 const char* kIncognito = "incognito"; 37 const char kIncognito[] = "incognito";
38 const char* kIncludeGlobs = "include_globs"; 38 const char kIncludeGlobs[] = "include_globs";
39 const char* kInputComponents = "input_components"; 39 const char kInputComponents[] = "input_components";
40 const char* kIntents = "intents"; 40 const char kIntents[] = "intents";
41 const char* kIntentType = "type"; 41 const char kIntentType[] = "type";
42 const char* kIntentPath = "path"; 42 const char kIntentPath[] = "path";
43 const char* kIntentTitle = "title"; 43 const char kIntentTitle[] = "title";
44 const char* kIntentDisposition = "disposition"; 44 const char kIntentDisposition[] = "disposition";
45 const char* kIsolation = "app.isolation"; 45 const char kIsolation[] = "app.isolation";
46 const char* kJs = "js"; 46 const char kJs[] = "js";
47 const char* kKeycode = "keyCode"; 47 const char kKeycode[] = "keyCode";
48 const char* kLanguage = "language"; 48 const char kLanguage[] = "language";
49 const char* kLaunch = "app.launch"; 49 const char kLaunch[] = "app.launch";
50 const char* kLaunchContainer = "app.launch.container"; 50 const char kLaunchContainer[] = "app.launch.container";
51 const char* kLaunchHeight = "app.launch.height"; 51 const char kLaunchHeight[] = "app.launch.height";
52 const char* kLaunchLocalPath = "app.launch.local_path"; 52 const char kLaunchLocalPath[] = "app.launch.local_path";
53 const char* kLaunchWebURL = "app.launch.web_url"; 53 const char kLaunchWebURL[] = "app.launch.web_url";
54 const char* kLaunchWidth = "app.launch.width"; 54 const char kLaunchWidth[] = "app.launch.width";
55 const char* kLayouts = "layouts"; 55 const char kLayouts[] = "layouts";
56 const char* kManifestVersion = "manifest_version"; 56 const char kManifestVersion[] = "manifest_version";
57 const char* kMatches = "matches"; 57 const char kMatches[] = "matches";
58 const char* kMinimumChromeVersion = "minimum_chrome_version"; 58 const char kMinimumChromeVersion[] = "minimum_chrome_version";
59 const char* kName = "name"; 59 const char kName[] = "name";
60 const char* kNaClModules = "nacl_modules"; 60 const char kNaClModules[] = "nacl_modules";
61 const char* kNaClModulesMIMEType = "mime_type"; 61 const char kNaClModulesMIMEType[] = "mime_type";
62 const char* kNaClModulesPath = "path"; 62 const char kNaClModulesPath[] = "path";
63 const char* kOfflineEnabled = "offline_enabled"; 63 const char kOfflineEnabled[] = "offline_enabled";
64 const char* kOmnibox = "omnibox"; 64 const char kOmnibox[] = "omnibox";
65 const char* kOmniboxKeyword = "omnibox.keyword"; 65 const char kOmniboxKeyword[] = "omnibox.keyword";
66 const char* kOptionalPermissions = "optional_permissions"; 66 const char kOptionalPermissions[] = "optional_permissions";
67 const char* kOptionsPage = "options_page"; 67 const char kOptionsPage[] = "options_page";
68 const char* kPageAction = "page_action"; 68 const char kPageAction[] = "page_action";
69 const char* kPageActionDefaultIcon = "default_icon"; 69 const char kPageActionDefaultIcon[] = "default_icon";
70 const char* kPageActionDefaultPopup = "default_popup"; 70 const char kPageActionDefaultPopup[] = "default_popup";
71 const char* kPageActionDefaultTitle = "default_title"; 71 const char kPageActionDefaultTitle[] = "default_title";
72 const char* kPageActionIcons = "icons"; 72 const char kPageActionIcons[] = "icons";
73 const char* kPageActionId = "id"; 73 const char kPageActionId[] = "id";
74 const char* kPageActionPopup = "popup"; 74 const char kPageActionPopup[] = "popup";
75 const char* kPageActionPopupHeight = "height"; 75 const char kPageActionPopupHeight[] = "height";
76 const char* kPageActionPopupPath = "path"; 76 const char kPageActionPopupPath[] = "path";
77 const char* kPageActions = "page_actions"; 77 const char kPageActions[] = "page_actions";
78 const char* kPermissions = "permissions"; 78 const char kPermissions[] = "permissions";
79 const char* kPlatformApp = "platform_app"; 79 const char kPlatformApp[] = "platform_app";
80 const char* kPlugins = "plugins"; 80 const char kPlugins[] = "plugins";
81 const char* kPluginsPath = "path"; 81 const char kPluginsPath[] = "path";
82 const char* kPluginsPublic = "public"; 82 const char kPluginsPublic[] = "public";
83 const char* kPublicKey = "key"; 83 const char kPublicKey[] = "key";
84 const char* kRequirements = "requirements"; 84 const char kRequirements[] = "requirements";
85 const char* kRunAt = "run_at"; 85 const char kRunAt[] = "run_at";
86 const char* kShiftKey = "shiftKey"; 86 const char kShiftKey[] = "shiftKey";
87 const char* kShortcutKey = "shortcutKey"; 87 const char kShortcutKey[] = "shortcutKey";
88 const char* kSidebar = "sidebar"; 88 const char kSidebar[] = "sidebar";
89 const char* kSidebarDefaultIcon = "default_icon"; 89 const char kSidebarDefaultIcon[] = "default_icon";
90 const char* kSidebarDefaultPage = "default_page"; 90 const char kSidebarDefaultPage[] = "default_page";
91 const char* kSidebarDefaultTitle = "default_title"; 91 const char kSidebarDefaultTitle[] = "default_title";
92 const char* kSignature = "signature"; 92 const char kSignature[] = "signature";
93 const char* kTheme = "theme"; 93 const char kTheme[] = "theme";
94 const char* kThemeColors = "colors"; 94 const char kThemeColors[] = "colors";
95 const char* kThemeDisplayProperties = "properties"; 95 const char kThemeDisplayProperties[] = "properties";
96 const char* kThemeImages = "images"; 96 const char kThemeImages[] = "images";
97 const char* kThemeTints = "tints"; 97 const char kThemeTints[] = "tints";
98 const char* kTtsEngine = "tts_engine"; 98 const char kTtsEngine[] = "tts_engine";
99 const char* kTtsGenderFemale = "female"; 99 const char kTtsGenderFemale[] = "female";
100 const char* kTtsGenderMale = "male"; 100 const char kTtsGenderMale[] = "male";
101 const char* kTtsVoices = "voices"; 101 const char kTtsVoices[] = "voices";
102 const char* kTtsVoicesEventTypeEnd = "end"; 102 const char kTtsVoicesEventTypeEnd[] = "end";
103 const char* kTtsVoicesEventTypeError = "error"; 103 const char kTtsVoicesEventTypeError[] = "error";
104 const char* kTtsVoicesEventTypeMarker = "marker"; 104 const char kTtsVoicesEventTypeMarker[] = "marker";
105 const char* kTtsVoicesEventTypeSentence = "sentence"; 105 const char kTtsVoicesEventTypeSentence[] = "sentence";
106 const char* kTtsVoicesEventTypeStart = "start"; 106 const char kTtsVoicesEventTypeStart[] = "start";
107 const char* kTtsVoicesEventTypeWord = "word"; 107 const char kTtsVoicesEventTypeWord[] = "word";
108 const char* kTtsVoicesEventTypes = "event_types"; 108 const char kTtsVoicesEventTypes[] = "event_types";
109 const char* kTtsVoicesGender = "gender"; 109 const char kTtsVoicesGender[] = "gender";
110 const char* kTtsVoicesLang = "lang"; 110 const char kTtsVoicesLang[] = "lang";
111 const char* kTtsVoicesVoiceName = "voice_name"; 111 const char kTtsVoicesVoiceName[] = "voice_name";
112 const char* kType = "type"; 112 const char kType[] = "type";
113 const char* kUpdateURL = "update_url"; 113 const char kUpdateURL[] = "update_url";
114 const char* kVersion = "version"; 114 const char kVersion[] = "version";
115 const char* kWebURLs = "app.urls"; 115 const char kWebURLs[] = "app.urls";
116 } // namespace extension_manifest_keys 116 } // namespace extension_manifest_keys
117 117
118 namespace extension_manifest_values { 118 namespace extension_manifest_values {
119 const char* kIncognitoSplit = "split"; 119 const char kIncognitoSplit[] = "split";
120 const char* kIncognitoSpanning = "spanning"; 120 const char kIncognitoSpanning[] = "spanning";
121 const char* kIntentDispositionWindow = "window"; 121 const char kIntentDispositionWindow[] = "window";
122 const char* kIntentDispositionInline = "inline"; 122 const char kIntentDispositionInline[] = "inline";
123 const char* kIsolatedStorage = "storage"; 123 const char kIsolatedStorage[] = "storage";
124 const char* kRunAtDocumentStart = "document_start"; 124 const char kRunAtDocumentStart[] = "document_start";
125 const char* kRunAtDocumentEnd = "document_end"; 125 const char kRunAtDocumentEnd[] = "document_end";
126 const char* kRunAtDocumentIdle = "document_idle"; 126 const char kRunAtDocumentIdle[] = "document_idle";
127 const char* kPageActionTypeTab = "tab"; 127 const char kPageActionTypeTab[] = "tab";
128 const char* kPageActionTypePermanent = "permanent"; 128 const char kPageActionTypePermanent[] = "permanent";
129 const char* kLaunchContainerPanel = "panel"; 129 const char kLaunchContainerPanel[] = "panel";
130 const char* kLaunchContainerTab = "tab"; 130 const char kLaunchContainerTab[] = "tab";
131 const char* kLaunchContainerWindow = "window"; 131 const char kLaunchContainerWindow[] = "window";
132 } // namespace extension_manifest_values 132 } // namespace extension_manifest_values
133 133
134 // Extension-related error messages. Some of these are simple patterns, where a 134 // Extension-related error messages. Some of these are simple patterns, where a
135 // '*' is replaced at runtime with a specific value. This is used instead of 135 // '*' is replaced at runtime with a specific value. This is used instead of
136 // printf because we want to unit test them and scanf is hard to make 136 // printf because we want to unit test them and scanf is hard to make
137 // cross-platform. 137 // cross-platform.
138 namespace extension_manifest_errors { 138 namespace extension_manifest_errors {
139 const char* kAppsNotEnabled = 139 const char kAppsNotEnabled[] =
140 "Apps are not enabled."; 140 "Apps are not enabled.";
141 const char* kBackgroundPermissionNeeded = 141 const char kBackgroundPermissionNeeded[] =
142 "Hosted apps that use 'background_page' must have the 'background' " 142 "Hosted apps that use 'background_page' must have the 'background' "
143 "permission."; 143 "permission.";
144 const char* kCannotAccessPage = 144 const char kCannotAccessPage[] =
145 "Cannot access contents of url \"*\". " 145 "Cannot access contents of url \"*\". "
146 "Extension manifest must request permission to access this host."; 146 "Extension manifest must request permission to access this host.";
147 const char* kCannotChangeExtensionID = 147 const char kCannotChangeExtensionID[] =
148 "Installed extensions cannot change their IDs."; 148 "Installed extensions cannot change their IDs.";
149 const char* kCannotClaimAllHostsInExtent = 149 const char kCannotClaimAllHostsInExtent[] =
150 "Cannot claim all hosts ('*') in an extent."; 150 "Cannot claim all hosts ('*') in an extent.";
151 const char* kCannotClaimAllURLsInExtent = 151 const char kCannotClaimAllURLsInExtent[] =
152 "Cannot claim all URLs in an extent."; 152 "Cannot claim all URLs in an extent.";
153 const char* kCannotScriptGallery = 153 const char kCannotScriptGallery[] =
154 "The extensions gallery cannot be scripted."; 154 "The extensions gallery cannot be scripted.";
155 const char* kCannotUninstallManagedExtension = 155 const char kCannotUninstallManagedExtension[] =
156 "Attempted uninstallation of an extension that is not user-manageable."; 156 "Attempted uninstallation of an extension that is not user-manageable.";
157 const char* kChromeVersionTooLow = 157 const char kChromeVersionTooLow[] =
158 "This extension requires * version * or greater."; 158 "This extension requires * version * or greater.";
159 const char* kDisabledByPolicy = 159 const char kDisabledByPolicy[] =
160 "This extension has been disabled by your administrator."; 160 "This extension has been disabled by your administrator.";
161 const char* kDevToolsExperimental = 161 const char kDevToolsExperimental[] =
162 "You must request the 'experimental' permission in order to use the" 162 "You must request the 'experimental' permission in order to use the"
163 " DevTools API."; 163 " DevTools API.";
164 const char* kExpectString = "Expect string value."; 164 const char kExpectString[] = "Expect string value.";
165 const char* kExperimentalFlagRequired = 165 const char kExperimentalFlagRequired[] =
166 "Loading extensions with 'experimental' permission requires" 166 "Loading extensions with 'experimental' permission requires"
167 " --enable-experimental-extension-apis command line flag."; 167 " --enable-experimental-extension-apis command line flag.";
168 const char* kHostedAppsCannotIncludeExtensionFeatures = 168 const char kHostedAppsCannotIncludeExtensionFeatures[] =
169 "Hosted apps cannot use the extension feature '*'."; 169 "Hosted apps cannot use the extension feature '*'.";
170 const char* kInvalidAllFrames = 170 const char kInvalidAllFrames[] =
171 "Invalid value for 'content_scripts[*].all_frames'."; 171 "Invalid value for 'content_scripts[*].all_frames'.";
172 const char* kInvalidBackground = 172 const char kInvalidBackground[] =
173 "Invalid value for 'background_page'."; 173 "Invalid value for 'background_page'.";
174 const char* kInvalidBackgroundInHostedApp = 174 const char kInvalidBackgroundInHostedApp[] =
175 "Invalid value for 'background_page'. Hosted apps must specify an " 175 "Invalid value for 'background_page'. Hosted apps must specify an "
176 "absolute HTTPS URL for the background page."; 176 "absolute HTTPS URL for the background page.";
177 const char* kInvalidBrowserAction = 177 const char kInvalidBrowserAction[] =
178 "Invalid value for 'browser_action'."; 178 "Invalid value for 'browser_action'.";
179 const char* kInvalidChromeURLOverrides = 179 const char kInvalidChromeURLOverrides[] =
180 "Invalid value for 'chrome_url_overrides'."; 180 "Invalid value for 'chrome_url_overrides'.";
181 const char* kInvalidContentScript = 181 const char kInvalidContentScript[] =
182 "Invalid value for 'content_scripts[*]'."; 182 "Invalid value for 'content_scripts[*]'.";
183 const char* kInvalidContentSecurityPolicy = 183 const char kInvalidContentSecurityPolicy[] =
184 "Invalid value for 'content_security_policy'."; 184 "Invalid value for 'content_security_policy'.";
185 const char* kInvalidContentScriptsList = 185 const char kInvalidContentScriptsList[] =
186 "Invalid value for 'content_scripts'."; 186 "Invalid value for 'content_scripts'.";
187 const char* kInvalidCss = 187 const char kInvalidCss[] =
188 "Invalid value for 'content_scripts[*].css[*]'."; 188 "Invalid value for 'content_scripts[*].css[*]'.";
189 const char* kInvalidCssList = 189 const char kInvalidCssList[] =
190 "Required value 'content_scripts[*].css' is invalid."; 190 "Required value 'content_scripts[*].css' is invalid.";
191 const char* kInvalidDefaultLocale = 191 const char kInvalidDefaultLocale[] =
192 "Invalid value for default locale - locale name must be a string."; 192 "Invalid value for default locale - locale name must be a string.";
193 const char* kInvalidDescription = 193 const char kInvalidDescription[] =
194 "Invalid value for 'description'."; 194 "Invalid value for 'description'.";
195 const char* kInvalidDevToolsPage = 195 const char kInvalidDevToolsPage[] =
196 "Invalid value for 'devtools_page'."; 196 "Invalid value for 'devtools_page'.";
197 const char* kInvalidExcludeMatch = 197 const char kInvalidExcludeMatch[] =
198 "Invalid value for 'content_scripts[*].exclude_matches[*]': *"; 198 "Invalid value for 'content_scripts[*].exclude_matches[*]': *";
199 const char* kInvalidExcludeMatches = 199 const char kInvalidExcludeMatches[] =
200 "Invalid value for 'content_scripts[*].exclude_matches'."; 200 "Invalid value for 'content_scripts[*].exclude_matches'.";
201 const char* kInvalidFileBrowserHandler = 201 const char kInvalidFileBrowserHandler[] =
202 "Invalid value for 'file_browser_handers'."; 202 "Invalid value for 'file_browser_handers'.";
203 const char* kInvalidFileFiltersList = 203 const char kInvalidFileFiltersList[] =
204 "Invalid value for 'file_filters'."; 204 "Invalid value for 'file_filters'.";
205 const char* kInvalidFileFilterValue = 205 const char kInvalidFileFilterValue[] =
206 "Invalid value for 'file_filters[*]'."; 206 "Invalid value for 'file_filters[*]'.";
207 const char* kInvalidGlob = 207 const char kInvalidGlob[] =
208 "Invalid value for 'content_scripts[*].*[*]'."; 208 "Invalid value for 'content_scripts[*].*[*]'.";
209 const char* kInvalidGlobList = 209 const char kInvalidGlobList[] =
210 "Invalid value for 'content_scripts[*].*'."; 210 "Invalid value for 'content_scripts[*].*'.";
211 const char* kInvalidHomepageURL = 211 const char kInvalidHomepageURL[] =
212 "Invalid value for homepage url: '[*]'."; 212 "Invalid value for homepage url: '[*]'.";
213 const char* kInvalidIconPath = 213 const char kInvalidIconPath[] =
214 "Invalid value for 'icons[\"*\"]'."; 214 "Invalid value for 'icons[\"*\"]'.";
215 const char* kInvalidIcons = 215 const char kInvalidIcons[] =
216 "Invalid value for 'icons'."; 216 "Invalid value for 'icons'.";
217 const char* kInvalidIncognitoBehavior = 217 const char kInvalidIncognitoBehavior[] =
218 "Invalid value for 'incognito'."; 218 "Invalid value for 'incognito'.";
219 const char* kInvalidInputComponents = 219 const char kInvalidInputComponents[] =
220 "Invalid value for 'input_components'"; 220 "Invalid value for 'input_components'";
221 const char* kInvalidInputComponentDescription = 221 const char kInvalidInputComponentDescription[] =
222 "Invalid value for 'input_conponents[*].description"; 222 "Invalid value for 'input_conponents[*].description";
223 const char* kInvalidInputComponentLayoutName = 223 const char kInvalidInputComponentLayoutName[] =
224 "Invalid value for 'input_conponents[*].layouts[*]"; 224 "Invalid value for 'input_conponents[*].layouts[*]";
225 const char* kInvalidInputComponentLayouts = 225 const char kInvalidInputComponentLayouts[] =
226 "Invalid value for 'input_conponents[*].layouts"; 226 "Invalid value for 'input_conponents[*].layouts";
227 const char* kInvalidInputComponentName = 227 const char kInvalidInputComponentName[] =
228 "Invalid value for 'input_conponents[*].name"; 228 "Invalid value for 'input_conponents[*].name";
229 const char* kInvalidInputComponentShortcutKey = 229 const char kInvalidInputComponentShortcutKey[] =
230 "Invalid value for 'input_conponents[*].shortcutKey"; 230 "Invalid value for 'input_conponents[*].shortcutKey";
231 const char* kInvalidInputComponentShortcutKeycode = 231 const char kInvalidInputComponentShortcutKeycode[] =
232 "Invalid value for 'input_conponents[*].shortcutKey.keyCode"; 232 "Invalid value for 'input_conponents[*].shortcutKey.keyCode";
233 const char* kInvalidInputComponentType = 233 const char kInvalidInputComponentType[] =
234 "Invalid value for 'input_conponents[*].type"; 234 "Invalid value for 'input_conponents[*].type";
235 const char* kInvalidIntent = 235 const char kInvalidIntent[] =
236 "Invalid value for intents[*]"; 236 "Invalid value for intents[*]";
237 const char* kInvalidIntentDisposition = 237 const char kInvalidIntentDisposition[] =
238 "Invalid value for intents[*].disposition"; 238 "Invalid value for intents[*].disposition";
239 const char* kInvalidIntentPath = 239 const char kInvalidIntentPath[] =
240 "Invalid value for intents[*].path"; 240 "Invalid value for intents[*].path";
241 const char* kInvalidIntents = 241 const char kInvalidIntents[] =
242 "Invalid value for intents"; 242 "Invalid value for intents";
243 const char* kInvalidIntentType = 243 const char kInvalidIntentType[] =
244 "Invalid value for intents[*].type"; 244 "Invalid value for intents[*].type";
245 const char* kInvalidIntentTitle = 245 const char kInvalidIntentTitle[] =
246 "Invalid value for intents[*].title"; 246 "Invalid value for intents[*].title";
247 const char* kInvalidIsolation = 247 const char kInvalidIsolation[] =
248 "Invalid value for 'app.isolation'."; 248 "Invalid value for 'app.isolation'.";
249 const char* kInvalidIsolationValue = 249 const char kInvalidIsolationValue[] =
250 "Invalid value for 'app.isolation[*]'."; 250 "Invalid value for 'app.isolation[*]'.";
251 const char* kInvalidJs = 251 const char kInvalidJs[] =
252 "Invalid value for 'content_scripts[*].js[*]'."; 252 "Invalid value for 'content_scripts[*].js[*]'.";
253 const char* kInvalidJsList = 253 const char kInvalidJsList[] =
254 "Required value 'content_scripts[*].js' is invalid."; 254 "Required value 'content_scripts[*].js' is invalid.";
255 const char* kInvalidKey = 255 const char kInvalidKey[] =
256 "Value 'key' is missing or invalid."; 256 "Value 'key' is missing or invalid.";
257 const char* kInvalidLaunchContainer = 257 const char kInvalidLaunchContainer[] =
258 "Invalid value for 'app.launch.container'."; 258 "Invalid value for 'app.launch.container'.";
259 const char* kInvalidLaunchContainerForPlatform = 259 const char kInvalidLaunchContainerForPlatform[] =
260 "platform_app requires 'app.launch.container' == 'panel'."; 260 "platform_app requires 'app.launch.container' == 'panel'.";
261 const char* kInvalidLaunchHeight = 261 const char kInvalidLaunchHeight[] =
262 "Invalid value for 'app.launch.height'."; 262 "Invalid value for 'app.launch.height'.";
263 const char* kInvalidLaunchHeightContainer = 263 const char kInvalidLaunchHeightContainer[] =
264 "Invalid container type for 'app.launch.height'."; 264 "Invalid container type for 'app.launch.height'.";
265 const char* kInvalidLaunchLocalPath = 265 const char kInvalidLaunchLocalPath[] =
266 "Invalid value for 'app.launch.local_path'."; 266 "Invalid value for 'app.launch.local_path'.";
267 const char* kInvalidLaunchWebURL = 267 const char kInvalidLaunchWebURL[] =
268 "Invalid value for 'app.launch.web_url'."; 268 "Invalid value for 'app.launch.web_url'.";
269 const char* kInvalidLaunchWidth = 269 const char kInvalidLaunchWidth[] =
270 "Invalid value for 'app.launch.width'."; 270 "Invalid value for 'app.launch.width'.";
271 const char* kInvalidLaunchWidthContainer = 271 const char kInvalidLaunchWidthContainer[] =
272 "Invalid container type for 'app.launch.width'."; 272 "Invalid container type for 'app.launch.width'.";
273 const char* kInvalidManifest = 273 const char kInvalidManifest[] =
274 "Manifest file is invalid."; 274 "Manifest file is invalid.";
275 const char* kInvalidManifestVersion = 275 const char kInvalidManifestVersion[] =
276 "Invalid value for 'manifest_version'."; 276 "Invalid value for 'manifest_version'.";
277 const char* kInvalidMatch = 277 const char kInvalidMatch[] =
278 "Invalid value for 'content_scripts[*].matches[*]': *"; 278 "Invalid value for 'content_scripts[*].matches[*]': *";
279 const char* kInvalidMatchCount = 279 const char kInvalidMatchCount[] =
280 "Invalid value for 'content_scripts[*].matches'. There must be at least " 280 "Invalid value for 'content_scripts[*].matches'. There must be at least "
281 "one match specified."; 281 "one match specified.";
282 const char* kInvalidMatches = 282 const char kInvalidMatches[] =
283 "Required value 'content_scripts[*].matches' is missing or invalid."; 283 "Required value 'content_scripts[*].matches' is missing or invalid.";
284 const char* kInvalidMinimumChromeVersion = 284 const char kInvalidMinimumChromeVersion[] =
285 "Invalid value for 'minimum_chrome_version'."; 285 "Invalid value for 'minimum_chrome_version'.";
286 const char* kInvalidName = 286 const char kInvalidName[] =
287 "Required value 'name' is missing or invalid."; 287 "Required value 'name' is missing or invalid.";
288 const char* kInvalidNaClModules = 288 const char kInvalidNaClModules[] =
289 "Invalid value for 'nacl_modules'."; 289 "Invalid value for 'nacl_modules'.";
290 const char* kInvalidNaClModulesPath = 290 const char kInvalidNaClModulesPath[] =
291 "Invalid value for 'nacl_modules[*].path'."; 291 "Invalid value for 'nacl_modules[*].path'.";
292 const char* kInvalidNaClModulesMIMEType = 292 const char kInvalidNaClModulesMIMEType[] =
293 "Invalid value for 'nacl_modules[*].mime_type'."; 293 "Invalid value for 'nacl_modules[*].mime_type'.";
294 const char* kInvalidOfflineEnabled = 294 const char kInvalidOfflineEnabled[] =
295 "Invalid value for 'offline_enabled'."; 295 "Invalid value for 'offline_enabled'.";
296 const char* kInvalidOmniboxKeyword = 296 const char kInvalidOmniboxKeyword[] =
297 "Invalid value for 'omnibox.keyword'."; 297 "Invalid value for 'omnibox.keyword'.";
298 const char* kInvalidOptionsPage = 298 const char kInvalidOptionsPage[] =
299 "Invalid value for 'options_page'."; 299 "Invalid value for 'options_page'.";
300 const char* kInvalidOptionsPageExpectUrlInPackage = 300 const char kInvalidOptionsPageExpectUrlInPackage[] =
301 "Invalid value for 'options_page'. Value must be a relative path."; 301 "Invalid value for 'options_page'. Value must be a relative path.";
302 const char* kInvalidOptionsPageInHostedApp = 302 const char kInvalidOptionsPageInHostedApp[] =
303 "Invalid value for 'options_page'. Hosted apps must specify an " 303 "Invalid value for 'options_page'. Hosted apps must specify an "
304 "absolute URL."; 304 "absolute URL.";
305 const char* kInvalidPageAction = 305 const char kInvalidPageAction[] =
306 "Invalid value for 'page_action'."; 306 "Invalid value for 'page_action'.";
307 const char* kInvalidPageActionDefaultTitle = 307 const char kInvalidPageActionDefaultTitle[] =
308 "Invalid value for 'default_title'."; 308 "Invalid value for 'default_title'.";
309 const char* kInvalidPageActionIconPath = 309 const char kInvalidPageActionIconPath[] =
310 "Invalid value for 'page_action.default_icon'."; 310 "Invalid value for 'page_action.default_icon'.";
311 const char* kInvalidPageActionId = 311 const char kInvalidPageActionId[] =
312 "Required value 'id' is missing or invalid."; 312 "Required value 'id' is missing or invalid.";
313 const char* kInvalidPageActionName = 313 const char kInvalidPageActionName[] =
314 "Invalid value for 'page_action.name'."; 314 "Invalid value for 'page_action.name'.";
315 const char* kInvalidPageActionOldAndNewKeys = 315 const char kInvalidPageActionOldAndNewKeys[] =
316 "Key \"*\" is deprecated. Key \"*\" has the same meaning. You can not " 316 "Key \"*\" is deprecated. Key \"*\" has the same meaning. You can not "
317 "use both."; 317 "use both.";
318 const char* kInvalidPageActionPopup = 318 const char kInvalidPageActionPopup[] =
319 "Invalid type for page action popup."; 319 "Invalid type for page action popup.";
320 const char* kInvalidPageActionPopupHeight = 320 const char kInvalidPageActionPopupHeight[] =
321 "Invalid value for page action popup height [*]."; 321 "Invalid value for page action popup height [*].";
322 const char* kInvalidPageActionPopupPath = 322 const char kInvalidPageActionPopupPath[] =
323 "Invalid value for page action popup path [*]."; 323 "Invalid value for page action popup path [*].";
324 const char* kInvalidPageActionsList = 324 const char kInvalidPageActionsList[] =
325 "Invalid value for 'page_actions'."; 325 "Invalid value for 'page_actions'.";
326 const char* kInvalidPageActionsListSize = 326 const char kInvalidPageActionsListSize[] =
327 "Invalid value for 'page_actions'. There can be at most one page action."; 327 "Invalid value for 'page_actions'. There can be at most one page action.";
328 const char* kInvalidPageActionTypeValue = 328 const char kInvalidPageActionTypeValue[] =
329 "Invalid value for 'page_actions[*].type', expected 'tab' or 'permanent'."; 329 "Invalid value for 'page_actions[*].type', expected 'tab' or 'permanent'.";
330 const char* kInvalidPermission = 330 const char kInvalidPermission[] =
331 "Invalid value for 'permissions[*]'."; 331 "Invalid value for 'permissions[*]'.";
332 const char* kInvalidPermissions = 332 const char kInvalidPermissions[] =
333 "Required value 'permissions' is missing or invalid."; 333 "Required value 'permissions' is missing or invalid.";
334 const char* kInvalidPermissionScheme = 334 const char kInvalidPermissionScheme[] =
335 "Invalid scheme for 'permissions[*]'."; 335 "Invalid scheme for 'permissions[*]'.";
336 const char* kInvalidPlugins = 336 const char kInvalidPlugins[] =
337 "Invalid value for 'plugins'."; 337 "Invalid value for 'plugins'.";
338 const char* kInvalidPluginsPath = 338 const char kInvalidPluginsPath[] =
339 "Invalid value for 'plugins[*].path'."; 339 "Invalid value for 'plugins[*].path'.";
340 const char* kInvalidPluginsPublic = 340 const char kInvalidPluginsPublic[] =
341 "Invalid value for 'plugins[*].public'."; 341 "Invalid value for 'plugins[*].public'.";
342 const char* kInvalidRequirement = 342 const char kInvalidRequirement[] =
343 "Invalid value for requirement \"*\""; 343 "Invalid value for requirement \"*\"";
344 const char* kInvalidRequirements = 344 const char kInvalidRequirements[] =
345 "Invalid value for 'requirements'"; 345 "Invalid value for 'requirements'";
346 const char* kInvalidRunAt = 346 const char kInvalidRunAt[] =
347 "Invalid value for 'content_scripts[*].run_at'."; 347 "Invalid value for 'content_scripts[*].run_at'.";
348 const char* kInvalidSidebar = 348 const char kInvalidSidebar[] =
349 "Invalid value for 'sidebar'."; 349 "Invalid value for 'sidebar'.";
350 const char* kInvalidSidebarDefaultIconPath = 350 const char kInvalidSidebarDefaultIconPath[] =
351 "Invalid value for 'sidebar.default_icon'."; 351 "Invalid value for 'sidebar.default_icon'.";
352 const char* kInvalidSidebarDefaultPage = 352 const char kInvalidSidebarDefaultPage[] =
353 "Invalid value for 'sidebar.default_page'."; 353 "Invalid value for 'sidebar.default_page'.";
354 const char* kInvalidSidebarDefaultTitle = 354 const char kInvalidSidebarDefaultTitle[] =
355 "Invalid value for 'sidebar.default_title'."; 355 "Invalid value for 'sidebar.default_title'.";
356 const char* kInvalidSignature = 356 const char kInvalidSignature[] =
357 "Value 'signature' is missing or invalid."; 357 "Value 'signature' is missing or invalid.";
358 const char* kInvalidTheme = 358 const char kInvalidTheme[] =
359 "Invalid value for 'theme'."; 359 "Invalid value for 'theme'.";
360 const char* kInvalidThemeColors = 360 const char kInvalidThemeColors[] =
361 "Invalid value for theme colors - colors must be integers"; 361 "Invalid value for theme colors - colors must be integers";
362 const char* kInvalidThemeImages = 362 const char kInvalidThemeImages[] =
363 "Invalid value for theme images - images must be strings."; 363 "Invalid value for theme images - images must be strings.";
364 const char* kInvalidThemeImagesMissing = 364 const char kInvalidThemeImagesMissing[] =
365 "An image specified in the theme is missing."; 365 "An image specified in the theme is missing.";
366 const char* kInvalidThemeTints = 366 const char kInvalidThemeTints[] =
367 "Invalid value for theme images - tints must be decimal numbers."; 367 "Invalid value for theme images - tints must be decimal numbers.";
368 const char* kInvalidTts = 368 const char kInvalidTts[] =
369 "Invalid value for 'tts_engine'."; 369 "Invalid value for 'tts_engine'.";
370 const char* kInvalidTtsVoices = 370 const char kInvalidTtsVoices[] =
371 "Invalid value for 'tts_engine.voices'."; 371 "Invalid value for 'tts_engine.voices'.";
372 const char* kInvalidTtsVoicesEventTypes = 372 const char kInvalidTtsVoicesEventTypes[] =
373 "Invalid value for 'tts_engine.voices[*].event_types'."; 373 "Invalid value for 'tts_engine.voices[*].event_types'.";
374 const char* kInvalidTtsVoicesGender = 374 const char kInvalidTtsVoicesGender[] =
375 "Invalid value for 'tts_engine.voices[*].gender'."; 375 "Invalid value for 'tts_engine.voices[*].gender'.";
376 const char* kInvalidTtsVoicesLang = 376 const char kInvalidTtsVoicesLang[] =
377 "Invalid value for 'tts_engine.voices[*].lang'."; 377 "Invalid value for 'tts_engine.voices[*].lang'.";
378 const char* kInvalidTtsVoicesVoiceName = 378 const char kInvalidTtsVoicesVoiceName[] =
379 "Invalid value for 'tts_engine.voices[*].voice_name'."; 379 "Invalid value for 'tts_engine.voices[*].voice_name'.";
380 const char* kInvalidUpdateURL = 380 const char kInvalidUpdateURL[] =
381 "Invalid value for update url: '[*]'."; 381 "Invalid value for update url: '[*]'.";
382 const char* kInvalidURLPatternError = 382 const char kInvalidURLPatternError[] =
383 "Invalid url pattern '*'"; 383 "Invalid url pattern '*'";
384 const char* kInvalidVersion = 384 const char kInvalidVersion[] =
385 "Required value 'version' is missing or invalid. It must be between 1-4 " 385 "Required value 'version' is missing or invalid. It must be between 1-4 "
386 "dot-separated integers each between 0 and 65536."; 386 "dot-separated integers each between 0 and 65536.";
387 const char* kInvalidWebURL = 387 const char kInvalidWebURL[] =
388 "Invalid value for 'app.urls[*]': *"; 388 "Invalid value for 'app.urls[*]': *";
389 const char* kInvalidWebURLs = 389 const char kInvalidWebURLs[] =
390 "Invalid value for 'app.urls'."; 390 "Invalid value for 'app.urls'.";
391 const char* kInvalidZipHash = 391 const char kInvalidZipHash[] =
392 "Required key 'zip_hash' is missing or invalid."; 392 "Required key 'zip_hash' is missing or invalid.";
393 const char* kLaunchPathAndExtentAreExclusive = 393 const char kLaunchPathAndExtentAreExclusive[] =
394 "The 'app.launch.local_path' and 'app.urls' keys cannot both be set."; 394 "The 'app.launch.local_path' and 'app.urls' keys cannot both be set.";
395 const char* kLaunchPathAndURLAreExclusive = 395 const char kLaunchPathAndURLAreExclusive[] =
396 "The 'app.launch.local_path' and 'app.launch.web_url' keys cannot " 396 "The 'app.launch.local_path' and 'app.launch.web_url' keys cannot "
397 "both be set."; 397 "both be set.";
398 const char* kLaunchURLRequired = 398 const char kLaunchURLRequired[] =
399 "Either 'app.launch.local_path' or 'app.launch.web_url' is required."; 399 "Either 'app.launch.local_path' or 'app.launch.web_url' is required.";
400 const char* kLocalesMessagesFileMissing = 400 const char kLocalesMessagesFileMissing[] =
401 "Messages file is missing for locale."; 401 "Messages file is missing for locale.";
402 const char* kLocalesNoDefaultLocaleSpecified = 402 const char kLocalesNoDefaultLocaleSpecified[] =
403 "Localization used, but default_locale wasn't specified in the manifest."; 403 "Localization used, but default_locale wasn't specified in the manifest.";
404 const char* kLocalesNoDefaultMessages = 404 const char kLocalesNoDefaultMessages[] =
405 "Default locale is defined but default data couldn't be loaded."; 405 "Default locale is defined but default data couldn't be loaded.";
406 const char* kLocalesNoValidLocaleNamesListed = 406 const char kLocalesNoValidLocaleNamesListed[] =
407 "No valid locale name could be found in _locales directory."; 407 "No valid locale name could be found in _locales directory.";
408 const char* kLocalesTreeMissing = 408 const char kLocalesTreeMissing[] =
409 "Default locale was specified, but _locales subtree is missing."; 409 "Default locale was specified, but _locales subtree is missing.";
410 const char* kManifestParseError = 410 const char kManifestParseError[] =
411 "Manifest is not valid JSON."; 411 "Manifest is not valid JSON.";
412 const char* kManifestUnreadable = 412 const char kManifestUnreadable[] =
413 "Manifest file is missing or unreadable."; 413 "Manifest file is missing or unreadable.";
414 const char* kMissingFile = 414 const char kMissingFile[] =
415 "At least one js or css file is required for 'content_scripts[*]'."; 415 "At least one js or css file is required for 'content_scripts[*]'.";
416 const char* kMultipleOverrides = 416 const char kMultipleOverrides[] =
417 "An extension cannot override more than one page."; 417 "An extension cannot override more than one page.";
418 const char* kNoWildCardsInPaths = 418 const char kNoWildCardsInPaths[] =
419 "Wildcards are not allowed in extent URL pattern paths."; 419 "Wildcards are not allowed in extent URL pattern paths.";
420 const char* kOneUISurfaceOnly = 420 const char kOneUISurfaceOnly[] =
421 "Only one of 'browser_action', 'page_action', and 'app' can be specified."; 421 "Only one of 'browser_action', 'page_action', and 'app' can be specified.";
422 const char* kPermissionNotAllowed = 422 const char kPermissionNotAllowed[] =
423 "Access to permission '*' denied."; 423 "Access to permission '*' denied.";
424 const char* kReservedMessageFound = 424 const char kReservedMessageFound[] =
425 "Reserved key * found in message catalog."; 425 "Reserved key * found in message catalog.";
426 const char* kSidebarExperimental = 426 const char kSidebarExperimental[] =
427 "You must request the 'experimental' permission in order to use the" 427 "You must request the 'experimental' permission in order to use the"
428 " Sidebar API."; 428 " Sidebar API.";
429 const char* kThemesCannotContainExtensions = 429 const char kThemesCannotContainExtensions[] =
430 "A theme cannot contain extensions code."; 430 "A theme cannot contain extensions code.";
431 #if defined(OS_CHROMEOS) 431 #if defined(OS_CHROMEOS)
432 const char* kIllegalPlugins = 432 const char kIllegalPlugins[] =
433 "Extensions cannot install plugins on Chrome OS"; 433 "Extensions cannot install plugins on Chrome OS";
434 #endif 434 #endif
435 } // namespace extension_manifest_errors 435 } // namespace extension_manifest_errors
436 436
437 namespace extension_urls { 437 namespace extension_urls {
438 std::string GetWebstoreLaunchURL() { 438 std::string GetWebstoreLaunchURL() {
439 std::string gallery_prefix = kGalleryBrowsePrefix; 439 std::string gallery_prefix = kGalleryBrowsePrefix;
440 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAppsGalleryURL)) 440 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAppsGalleryURL))
441 gallery_prefix = CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 441 gallery_prefix = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
442 switches::kAppsGalleryURL); 442 switches::kAppsGalleryURL);
443 if (EndsWith(gallery_prefix, "/", true)) 443 if (EndsWith(gallery_prefix, "/", true))
444 gallery_prefix = gallery_prefix.substr(0, gallery_prefix.length() - 1); 444 gallery_prefix = gallery_prefix.substr(0, gallery_prefix.length() - 1);
445 return gallery_prefix; 445 return gallery_prefix;
446 } 446 }
447 447
448 std::string GetWebstoreItemDetailURLPrefix() { 448 std::string GetWebstoreItemDetailURLPrefix() {
449 return GetWebstoreLaunchURL() + "/detail/"; 449 return GetWebstoreLaunchURL() + "/detail/";
450 } 450 }
451 451
452 GURL GetWebstoreItemJsonDataURL(const std::string& extension_id) { 452 GURL GetWebstoreItemJsonDataURL(const std::string& extension_id) {
453 return GURL(GetWebstoreLaunchURL() + "/inlineinstall/detail/" + extension_id); 453 return GURL(GetWebstoreLaunchURL() + "/inlineinstall/detail/" + extension_id);
454 } 454 }
455 455
456 const char* kGalleryUpdateHttpUrl = 456 const char kGalleryUpdateHttpUrl[] =
457 "http://clients2.google.com/service/update2/crx"; 457 "http://clients2.google.com/service/update2/crx";
458 const char* kGalleryUpdateHttpsUrl = 458 const char kGalleryUpdateHttpsUrl[] =
459 "https://clients2.google.com/service/update2/crx"; 459 "https://clients2.google.com/service/update2/crx";
460 460
461 GURL GetWebstoreUpdateUrl(bool secure) { 461 GURL GetWebstoreUpdateUrl(bool secure) {
462 CommandLine* cmdline = CommandLine::ForCurrentProcess(); 462 CommandLine* cmdline = CommandLine::ForCurrentProcess();
463 if (cmdline->HasSwitch(switches::kAppsGalleryUpdateURL)) 463 if (cmdline->HasSwitch(switches::kAppsGalleryUpdateURL))
464 return GURL(cmdline->GetSwitchValueASCII(switches::kAppsGalleryUpdateURL)); 464 return GURL(cmdline->GetSwitchValueASCII(switches::kAppsGalleryUpdateURL));
465 else 465 else
466 return GURL(secure ? kGalleryUpdateHttpsUrl : kGalleryUpdateHttpUrl); 466 return GURL(secure ? kGalleryUpdateHttpsUrl : kGalleryUpdateHttpUrl);
467 } 467 }
468 468
469 const char* kGalleryBrowsePrefix = "https://chrome.google.com/webstore"; 469 const char kGalleryBrowsePrefix[] = "https://chrome.google.com/webstore";
470 } 470 }
471 471
472 namespace extension_filenames { 472 namespace extension_filenames {
473 const char* kTempExtensionName = "CRX_INSTALL"; 473 const char kTempExtensionName[] = "CRX_INSTALL";
474 474
475 // The file to write our decoded images to, relative to the extension_path. 475 // The file to write our decoded images to, relative to the extension_path.
476 const char* kDecodedImagesFilename = "DECODED_IMAGES"; 476 const char kDecodedImagesFilename[] = "DECODED_IMAGES";
477 477
478 // The file to write our decoded message catalogs to, relative to the 478 // The file to write our decoded message catalogs to, relative to the
479 // extension_path. 479 // extension_path.
480 const char* kDecodedMessageCatalogsFilename = "DECODED_MESSAGE_CATALOGS"; 480 const char kDecodedMessageCatalogsFilename[] = "DECODED_MESSAGE_CATALOGS";
481 } 481 }
482 482
483 namespace extension_misc { 483 namespace extension_misc {
484 const char* kBookmarkManagerId = "eemcgdkfndhakfknompkggombfjjjeno"; 484 const char kBookmarkManagerId[] = "eemcgdkfndhakfknompkggombfjjjeno";
485 const char* kWebStoreAppId = "ahfgeienlihckogmohjhadlkjgocpleb"; 485 const char kWebStoreAppId[] = "ahfgeienlihckogmohjhadlkjgocpleb";
486 const char* kCloudPrintAppId = "mfehgcgbbipciphmccgaenjidiccnmng"; 486 const char kCloudPrintAppId[] = "mfehgcgbbipciphmccgaenjidiccnmng";
487 const char* kAppsPromoHistogram = "Extensions.AppsPromo"; 487 const char kAppsPromoHistogram[] = "Extensions.AppsPromo";
488 const char* kAppLaunchHistogram = "Extensions.AppLaunch"; 488 const char kAppLaunchHistogram[] = "Extensions.AppLaunch";
489 #if defined(OS_CHROMEOS) 489 #if defined(OS_CHROMEOS)
490 const char* kAccessExtensionPath = 490 const char kAccessExtensionPath[] =
491 "/usr/share/chromeos-assets/accessibility/extensions"; 491 "/usr/share/chromeos-assets/accessibility/extensions";
492 const char* kChromeVoxDirectoryName = "access_chromevox"; 492 const char kChromeVoxDirectoryName[] = "access_chromevox";
493 #endif 493 #endif
494 494
495 } 495 }
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension_constants.h ('k') | chrome/common/extensions/extension_l10n_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698