OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/manifest_handlers/content_scripts_handler.h" | 5 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" |
6 | 6 |
7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 errors::kInvalidGlobList, | 50 errors::kInvalidGlobList, |
51 base::IntToString(content_script_index), | 51 base::IntToString(content_script_index), |
52 globs_property_name); | 52 globs_property_name); |
53 return false; | 53 return false; |
54 } | 54 } |
55 | 55 |
56 for (size_t i = 0; i < list->GetSize(); ++i) { | 56 for (size_t i = 0; i < list->GetSize(); ++i) { |
57 std::string glob; | 57 std::string glob; |
58 if (!list->GetString(i, &glob)) { | 58 if (!list->GetString(i, &glob)) { |
59 *error = ErrorUtils::FormatErrorMessageUTF16( | 59 *error = ErrorUtils::FormatErrorMessageUTF16( |
60 errors::kInvalidGlob, | 60 errors::kInvalidGlob, base::IntToString(content_script_index), |
61 base::IntToString(content_script_index), | 61 globs_property_name, base::SizeTToString(i)); |
62 globs_property_name, | |
63 base::IntToString(i)); | |
64 return false; | 62 return false; |
65 } | 63 } |
66 | 64 |
67 (instance->*add_method)(glob); | 65 (instance->*add_method)(glob); |
68 } | 66 } |
69 | 67 |
70 return true; | 68 return true; |
71 } | 69 } |
72 | 70 |
73 // Helper method that loads a UserScript object from a dictionary in the | 71 // Helper method that loads a UserScript object from a dictionary in the |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 if (matches->GetSize() == 0) { | 134 if (matches->GetSize() == 0) { |
137 *error = ErrorUtils::FormatErrorMessageUTF16( | 135 *error = ErrorUtils::FormatErrorMessageUTF16( |
138 errors::kInvalidMatchCount, | 136 errors::kInvalidMatchCount, |
139 base::IntToString(definition_index)); | 137 base::IntToString(definition_index)); |
140 return false; | 138 return false; |
141 } | 139 } |
142 for (size_t j = 0; j < matches->GetSize(); ++j) { | 140 for (size_t j = 0; j < matches->GetSize(); ++j) { |
143 std::string match_str; | 141 std::string match_str; |
144 if (!matches->GetString(j, &match_str)) { | 142 if (!matches->GetString(j, &match_str)) { |
145 *error = ErrorUtils::FormatErrorMessageUTF16( | 143 *error = ErrorUtils::FormatErrorMessageUTF16( |
146 errors::kInvalidMatch, | 144 errors::kInvalidMatch, base::IntToString(definition_index), |
147 base::IntToString(definition_index), | 145 base::SizeTToString(j), errors::kExpectString); |
148 base::IntToString(j), | |
149 errors::kExpectString); | |
150 return false; | 146 return false; |
151 } | 147 } |
152 | 148 |
153 URLPattern pattern(UserScript::ValidUserScriptSchemes( | 149 URLPattern pattern(UserScript::ValidUserScriptSchemes( |
154 PermissionsData::CanExecuteScriptEverywhere(extension))); | 150 PermissionsData::CanExecuteScriptEverywhere(extension))); |
155 | 151 |
156 URLPattern::ParseResult parse_result = pattern.Parse(match_str); | 152 URLPattern::ParseResult parse_result = pattern.Parse(match_str); |
157 if (parse_result != URLPattern::PARSE_SUCCESS) { | 153 if (parse_result != URLPattern::PARSE_SUCCESS) { |
158 *error = ErrorUtils::FormatErrorMessageUTF16( | 154 *error = ErrorUtils::FormatErrorMessageUTF16( |
159 errors::kInvalidMatch, | 155 errors::kInvalidMatch, base::IntToString(definition_index), |
160 base::IntToString(definition_index), | 156 base::SizeTToString(j), |
161 base::IntToString(j), | |
162 URLPattern::GetParseResultString(parse_result)); | 157 URLPattern::GetParseResultString(parse_result)); |
163 return false; | 158 return false; |
164 } | 159 } |
165 | 160 |
166 // TODO(aboxhall): check for webstore | 161 // TODO(aboxhall): check for webstore |
167 if (!PermissionsData::CanExecuteScriptEverywhere(extension) && | 162 if (!PermissionsData::CanExecuteScriptEverywhere(extension) && |
168 pattern.scheme() != content::kChromeUIScheme) { | 163 pattern.scheme() != content::kChromeUIScheme) { |
169 // Exclude SCHEME_CHROMEUI unless it's been explicitly requested. | 164 // Exclude SCHEME_CHROMEUI unless it's been explicitly requested. |
170 // If the --extensions-on-chrome-urls flag has not been passed, requesting | 165 // If the --extensions-on-chrome-urls flag has not been passed, requesting |
171 // a chrome:// url will cause a parse failure above, so there's no need to | 166 // a chrome:// url will cause a parse failure above, so there's no need to |
(...skipping 21 matching lines...) Expand all Loading... |
193 *error = ErrorUtils::FormatErrorMessageUTF16( | 188 *error = ErrorUtils::FormatErrorMessageUTF16( |
194 errors::kInvalidExcludeMatches, | 189 errors::kInvalidExcludeMatches, |
195 base::IntToString(definition_index)); | 190 base::IntToString(definition_index)); |
196 return false; | 191 return false; |
197 } | 192 } |
198 | 193 |
199 for (size_t j = 0; j < exclude_matches->GetSize(); ++j) { | 194 for (size_t j = 0; j < exclude_matches->GetSize(); ++j) { |
200 std::string match_str; | 195 std::string match_str; |
201 if (!exclude_matches->GetString(j, &match_str)) { | 196 if (!exclude_matches->GetString(j, &match_str)) { |
202 *error = ErrorUtils::FormatErrorMessageUTF16( | 197 *error = ErrorUtils::FormatErrorMessageUTF16( |
203 errors::kInvalidExcludeMatch, | 198 errors::kInvalidExcludeMatch, base::IntToString(definition_index), |
204 base::IntToString(definition_index), | 199 base::SizeTToString(j), errors::kExpectString); |
205 base::IntToString(j), | |
206 errors::kExpectString); | |
207 return false; | 200 return false; |
208 } | 201 } |
209 | 202 |
210 int valid_schemes = UserScript::ValidUserScriptSchemes( | 203 int valid_schemes = UserScript::ValidUserScriptSchemes( |
211 PermissionsData::CanExecuteScriptEverywhere(extension)); | 204 PermissionsData::CanExecuteScriptEverywhere(extension)); |
212 URLPattern pattern(valid_schemes); | 205 URLPattern pattern(valid_schemes); |
213 | 206 |
214 URLPattern::ParseResult parse_result = pattern.Parse(match_str); | 207 URLPattern::ParseResult parse_result = pattern.Parse(match_str); |
215 if (parse_result != URLPattern::PARSE_SUCCESS) { | 208 if (parse_result != URLPattern::PARSE_SUCCESS) { |
216 *error = ErrorUtils::FormatErrorMessageUTF16( | 209 *error = ErrorUtils::FormatErrorMessageUTF16( |
217 errors::kInvalidExcludeMatch, | 210 errors::kInvalidExcludeMatch, base::IntToString(definition_index), |
218 base::IntToString(definition_index), base::IntToString(j), | 211 base::SizeTToString(j), |
219 URLPattern::GetParseResultString(parse_result)); | 212 URLPattern::GetParseResultString(parse_result)); |
220 return false; | 213 return false; |
221 } | 214 } |
222 | 215 |
223 result->add_exclude_url_pattern(pattern); | 216 result->add_exclude_url_pattern(pattern); |
224 } | 217 } |
225 } | 218 } |
226 | 219 |
227 // include/exclude globs (mostly for Greasemonkey compatibility) | 220 // include/exclude globs (mostly for Greasemonkey compatibility) |
228 if (!LoadGlobsHelper(content_script, definition_index, keys::kIncludeGlobs, | 221 if (!LoadGlobsHelper(content_script, definition_index, keys::kIncludeGlobs, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 return false; | 255 return false; |
263 } | 256 } |
264 | 257 |
265 if (js) { | 258 if (js) { |
266 for (size_t script_index = 0; script_index < js->GetSize(); | 259 for (size_t script_index = 0; script_index < js->GetSize(); |
267 ++script_index) { | 260 ++script_index) { |
268 const base::Value* value; | 261 const base::Value* value; |
269 std::string relative; | 262 std::string relative; |
270 if (!js->Get(script_index, &value) || !value->GetAsString(&relative)) { | 263 if (!js->Get(script_index, &value) || !value->GetAsString(&relative)) { |
271 *error = ErrorUtils::FormatErrorMessageUTF16( | 264 *error = ErrorUtils::FormatErrorMessageUTF16( |
272 errors::kInvalidJs, | 265 errors::kInvalidJs, base::IntToString(definition_index), |
273 base::IntToString(definition_index), | 266 base::SizeTToString(script_index)); |
274 base::IntToString(script_index)); | |
275 return false; | 267 return false; |
276 } | 268 } |
277 GURL url = extension->GetResourceURL(relative); | 269 GURL url = extension->GetResourceURL(relative); |
278 ExtensionResource resource = extension->GetResource(relative); | 270 ExtensionResource resource = extension->GetResource(relative); |
279 result->js_scripts().push_back(UserScript::File( | 271 result->js_scripts().push_back(UserScript::File( |
280 resource.extension_root(), resource.relative_path(), url)); | 272 resource.extension_root(), resource.relative_path(), url)); |
281 } | 273 } |
282 } | 274 } |
283 | 275 |
284 if (css) { | 276 if (css) { |
285 for (size_t script_index = 0; script_index < css->GetSize(); | 277 for (size_t script_index = 0; script_index < css->GetSize(); |
286 ++script_index) { | 278 ++script_index) { |
287 const base::Value* value; | 279 const base::Value* value; |
288 std::string relative; | 280 std::string relative; |
289 if (!css->Get(script_index, &value) || !value->GetAsString(&relative)) { | 281 if (!css->Get(script_index, &value) || !value->GetAsString(&relative)) { |
290 *error = ErrorUtils::FormatErrorMessageUTF16( | 282 *error = ErrorUtils::FormatErrorMessageUTF16( |
291 errors::kInvalidCss, | 283 errors::kInvalidCss, base::IntToString(definition_index), |
292 base::IntToString(definition_index), | 284 base::SizeTToString(script_index)); |
293 base::IntToString(script_index)); | |
294 return false; | 285 return false; |
295 } | 286 } |
296 GURL url = extension->GetResourceURL(relative); | 287 GURL url = extension->GetResourceURL(relative); |
297 ExtensionResource resource = extension->GetResource(relative); | 288 ExtensionResource resource = extension->GetResource(relative); |
298 result->css_scripts().push_back(UserScript::File( | 289 result->css_scripts().push_back(UserScript::File( |
299 resource.extension_root(), resource.relative_path(), url)); | 290 resource.extension_root(), resource.relative_path(), url)); |
300 } | 291 } |
301 } | 292 } |
302 | 293 |
303 return true; | 294 return true; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 const base::ListValue* scripts_list = NULL; | 390 const base::ListValue* scripts_list = NULL; |
400 if (!extension->manifest()->GetList(keys::kContentScripts, &scripts_list)) { | 391 if (!extension->manifest()->GetList(keys::kContentScripts, &scripts_list)) { |
401 *error = base::ASCIIToUTF16(errors::kInvalidContentScriptsList); | 392 *error = base::ASCIIToUTF16(errors::kInvalidContentScriptsList); |
402 return false; | 393 return false; |
403 } | 394 } |
404 | 395 |
405 for (size_t i = 0; i < scripts_list->GetSize(); ++i) { | 396 for (size_t i = 0; i < scripts_list->GetSize(); ++i) { |
406 const base::DictionaryValue* script_dict = NULL; | 397 const base::DictionaryValue* script_dict = NULL; |
407 if (!scripts_list->GetDictionary(i, &script_dict)) { | 398 if (!scripts_list->GetDictionary(i, &script_dict)) { |
408 *error = ErrorUtils::FormatErrorMessageUTF16( | 399 *error = ErrorUtils::FormatErrorMessageUTF16( |
409 errors::kInvalidContentScript, | 400 errors::kInvalidContentScript, base::SizeTToString(i)); |
410 base::IntToString(i)); | |
411 return false; | 401 return false; |
412 } | 402 } |
413 | 403 |
414 UserScript user_script; | 404 UserScript user_script; |
415 if (!LoadUserScriptFromDictionary(script_dict, | 405 if (!LoadUserScriptFromDictionary(script_dict, |
416 i, | 406 i, |
417 extension, | 407 extension, |
418 error, | 408 error, |
419 &user_script)) { | 409 &user_script)) { |
420 return false; // Failed to parse script context definition. | 410 return false; // Failed to parse script context definition. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 if (!IsScriptValid(path, css_script.relative_path(), | 463 if (!IsScriptValid(path, css_script.relative_path(), |
474 IDS_EXTENSION_LOAD_CSS_FAILED, error)) | 464 IDS_EXTENSION_LOAD_CSS_FAILED, error)) |
475 return false; | 465 return false; |
476 } | 466 } |
477 } | 467 } |
478 | 468 |
479 return true; | 469 return true; |
480 } | 470 } |
481 | 471 |
482 } // namespace extensions | 472 } // namespace extensions |
OLD | NEW |