OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #include "app/resource_bundle.h" | 7 #include "app/resource_bundle.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 URLPattern pattern; | 239 URLPattern pattern; |
240 if (!pattern.Parse(match_str)) { | 240 if (!pattern.Parse(match_str)) { |
241 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidMatch, | 241 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidMatch, |
242 IntToString(definition_index), IntToString(j)); | 242 IntToString(definition_index), IntToString(j)); |
243 return false; | 243 return false; |
244 } | 244 } |
245 | 245 |
246 result->add_url_pattern(pattern); | 246 result->add_url_pattern(pattern); |
247 } | 247 } |
248 | 248 |
| 249 // include/exclude globs (mostly for Greasemonkey compat) |
| 250 if (!LoadGlobsHelper(content_script, definition_index, keys::kIncludeGlobs, |
| 251 error, &UserScript::add_glob, result)) { |
| 252 return false; |
| 253 } |
| 254 |
| 255 if (!LoadGlobsHelper(content_script, definition_index, keys::kExcludeGlobs, |
| 256 error, &UserScript::add_exclude_glob, result)) { |
| 257 return false; |
| 258 } |
| 259 |
249 // js and css keys | 260 // js and css keys |
250 ListValue* js = NULL; | 261 ListValue* js = NULL; |
251 if (content_script->HasKey(keys::kJs) && | 262 if (content_script->HasKey(keys::kJs) && |
252 !content_script->GetList(keys::kJs, &js)) { | 263 !content_script->GetList(keys::kJs, &js)) { |
253 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidJsList, | 264 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidJsList, |
254 IntToString(definition_index)); | 265 IntToString(definition_index)); |
255 return false; | 266 return false; |
256 } | 267 } |
257 | 268 |
258 ListValue* css = NULL; | 269 ListValue* css = NULL; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 GURL url = GetResourceURL(WideToUTF8(relative)); | 313 GURL url = GetResourceURL(WideToUTF8(relative)); |
303 ExtensionResource resource = GetResource(WideToUTF8(relative)); | 314 ExtensionResource resource = GetResource(WideToUTF8(relative)); |
304 result->css_scripts().push_back(UserScript::File( | 315 result->css_scripts().push_back(UserScript::File( |
305 resource.extension_root(), resource.relative_path(), url)); | 316 resource.extension_root(), resource.relative_path(), url)); |
306 } | 317 } |
307 } | 318 } |
308 | 319 |
309 return true; | 320 return true; |
310 } | 321 } |
311 | 322 |
| 323 bool Extension::LoadGlobsHelper( |
| 324 const DictionaryValue* content_script, |
| 325 int content_script_index, |
| 326 const wchar_t* globs_property_name, |
| 327 std::string* error, |
| 328 void (UserScript::*add_method) (const std::string& glob), |
| 329 UserScript *instance) { |
| 330 if (!content_script->HasKey(globs_property_name)) |
| 331 return true; // they are optional |
| 332 |
| 333 ListValue* list = NULL; |
| 334 if (!content_script->GetList(globs_property_name, &list)) { |
| 335 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidGlobList, |
| 336 IntToString(content_script_index), WideToASCII(globs_property_name)); |
| 337 return false; |
| 338 } |
| 339 |
| 340 for (size_t i = 0; i < list->GetSize(); ++i) { |
| 341 std::string glob; |
| 342 if (!list->GetString(i, &glob)) { |
| 343 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidGlob, |
| 344 IntToString(content_script_index), WideToASCII(globs_property_name), |
| 345 IntToString(i)); |
| 346 return false; |
| 347 } |
| 348 |
| 349 (instance->*add_method)(glob); |
| 350 } |
| 351 |
| 352 return true; |
| 353 } |
| 354 |
312 ExtensionAction* Extension::LoadExtensionActionHelper( | 355 ExtensionAction* Extension::LoadExtensionActionHelper( |
313 const DictionaryValue* extension_action, std::string* error) { | 356 const DictionaryValue* extension_action, std::string* error) { |
314 scoped_ptr<ExtensionAction> result(new ExtensionAction()); | 357 scoped_ptr<ExtensionAction> result(new ExtensionAction()); |
315 result->set_extension_id(id()); | 358 result->set_extension_id(id()); |
316 | 359 |
317 // Page actions are hidden by default, and browser actions ignore | 360 // Page actions are hidden by default, and browser actions ignore |
318 // visibility. | 361 // visibility. |
319 result->SetIsVisible(ExtensionAction::kDefaultTabId, false); | 362 result->SetIsVisible(ExtensionAction::kDefaultTabId, false); |
320 | 363 |
321 // TODO(EXTENSIONS_DEPRECATED): icons list is obsolete. | 364 // TODO(EXTENSIONS_DEPRECATED): icons list is obsolete. |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 if (start_pos == std::string::npos) | 484 if (start_pos == std::string::npos) |
442 return ExtensionResource(); | 485 return ExtensionResource(); |
443 std::string trimmed_path = relative_path.substr(start_pos); | 486 std::string trimmed_path = relative_path.substr(start_pos); |
444 | 487 |
445 FilePath relative_resource_path; | 488 FilePath relative_resource_path; |
446 return ExtensionResource(extension_path, | 489 return ExtensionResource(extension_path, |
447 relative_resource_path.AppendASCII(trimmed_path)); | 490 relative_resource_path.AppendASCII(trimmed_path)); |
448 } | 491 } |
449 | 492 |
450 Extension::Extension(const FilePath& path) | 493 Extension::Extension(const FilePath& path) |
451 : is_theme_(false), background_page_ready_(false) { | 494 : is_theme_(false), background_page_ready_(false), |
| 495 converted_from_user_script_(false) { |
452 DCHECK(path.IsAbsolute()); | 496 DCHECK(path.IsAbsolute()); |
453 location_ = INVALID; | 497 location_ = INVALID; |
454 | 498 |
455 #if defined(OS_WIN) | 499 #if defined(OS_WIN) |
456 // Normalize any drive letter to upper-case. We do this for consistency with | 500 // Normalize any drive letter to upper-case. We do this for consistency with |
457 // net_utils::FilePathToFileURL(), which does the same thing, to make string | 501 // net_utils::FilePathToFileURL(), which does the same thing, to make string |
458 // comparisons simpler. | 502 // comparisons simpler. |
459 std::wstring path_str = path.value(); | 503 std::wstring path_str = path.value(); |
460 if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' && | 504 if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' && |
461 path_str[1] == ':') | 505 path_str[1] == ':') |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 return false; | 703 return false; |
660 } | 704 } |
661 update_url_ = GURL(tmp); | 705 update_url_ = GURL(tmp); |
662 if (!update_url_.is_valid() || update_url_.has_ref()) { | 706 if (!update_url_.is_valid() || update_url_.has_ref()) { |
663 *error = ExtensionErrorUtils::FormatErrorMessage( | 707 *error = ExtensionErrorUtils::FormatErrorMessage( |
664 errors::kInvalidUpdateURL, tmp); | 708 errors::kInvalidUpdateURL, tmp); |
665 return false; | 709 return false; |
666 } | 710 } |
667 } | 711 } |
668 | 712 |
| 713 // Initialize converted_from_user_script (if present) |
| 714 source.GetBoolean(keys::kConvertedFromUserScript, |
| 715 &converted_from_user_script_); |
| 716 |
669 // Initialize icons (if present). | 717 // Initialize icons (if present). |
670 if (source.HasKey(keys::kIcons)) { | 718 if (source.HasKey(keys::kIcons)) { |
671 DictionaryValue* icons_value = NULL; | 719 DictionaryValue* icons_value = NULL; |
672 if (!source.GetDictionary(keys::kIcons, &icons_value)) { | 720 if (!source.GetDictionary(keys::kIcons, &icons_value)) { |
673 *error = errors::kInvalidIcons; | 721 *error = errors::kInvalidIcons; |
674 return false; | 722 return false; |
675 } | 723 } |
676 | 724 |
677 for (size_t i = 0; i < arraysize(kIconSizes); ++i) { | 725 for (size_t i = 0; i < arraysize(kIconSizes); ++i) { |
678 std::wstring key = ASCIIToWide(IntToString(kIconSizes[i])); | 726 std::wstring key = ASCIIToWide(IntToString(kIconSizes[i])); |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 if (!list_value->GetDictionary(i, &content_script)) { | 982 if (!list_value->GetDictionary(i, &content_script)) { |
935 *error = ExtensionErrorUtils::FormatErrorMessage( | 983 *error = ExtensionErrorUtils::FormatErrorMessage( |
936 errors::kInvalidContentScript, IntToString(i)); | 984 errors::kInvalidContentScript, IntToString(i)); |
937 return false; | 985 return false; |
938 } | 986 } |
939 | 987 |
940 UserScript script; | 988 UserScript script; |
941 if (!LoadUserScriptHelper(content_script, i, error, &script)) | 989 if (!LoadUserScriptHelper(content_script, i, error, &script)) |
942 return false; // Failed to parse script context definition | 990 return false; // Failed to parse script context definition |
943 script.set_extension_id(id()); | 991 script.set_extension_id(id()); |
| 992 if (converted_from_user_script_) |
| 993 script.set_emulate_greasemonkey(true); |
944 content_scripts_.push_back(script); | 994 content_scripts_.push_back(script); |
945 } | 995 } |
946 } | 996 } |
947 | 997 |
948 // Initialize page action (optional). | 998 // Initialize page action (optional). |
949 if (source.HasKey(keys::kPageActions)) { | 999 if (source.HasKey(keys::kPageActions)) { |
950 ListValue* list_value; | 1000 ListValue* list_value; |
951 if (!source.GetList(keys::kPageActions, &list_value)) { | 1001 if (!source.GetList(keys::kPageActions, &list_value)) { |
952 *error = errors::kInvalidPageActionsList; | 1002 *error = errors::kInvalidPageActionsList; |
953 return false; | 1003 return false; |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 UserScript::PatternList::const_iterator pattern = | 1240 UserScript::PatternList::const_iterator pattern = |
1191 content_script->url_patterns().begin(); | 1241 content_script->url_patterns().begin(); |
1192 for (; pattern != content_script->url_patterns().end(); ++pattern) { | 1242 for (; pattern != content_script->url_patterns().end(); ++pattern) { |
1193 if (pattern->match_subdomains() && pattern->host().empty()) | 1243 if (pattern->match_subdomains() && pattern->host().empty()) |
1194 return true; | 1244 return true; |
1195 } | 1245 } |
1196 } | 1246 } |
1197 | 1247 |
1198 return false; | 1248 return false; |
1199 } | 1249 } |
OLD | NEW |