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

Unified Diff: chrome/common/extensions/extension.cc

Issue 340057: Add first-class support for user scripts (Closed)
Patch Set: newness Created 11 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/extension.cc
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index 429dfb5ea9e8dd38c0e4bbb360d7d435374475ee..f67e26eaa9fe1f8765dead750b21e35cdeb93785 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -246,6 +246,17 @@ bool Extension::LoadUserScriptHelper(const DictionaryValue* content_script,
result->add_url_pattern(pattern);
}
+ // include/exclude globs (mostly for Greasemonkey compat)
+ if (!LoadGlobsHelper(content_script, definition_index, keys::kIncludeGlobs,
+ error, &UserScript::add_glob, result)) {
+ return false;
+ }
+
+ if (!LoadGlobsHelper(content_script, definition_index, keys::kExcludeGlobs,
+ error, &UserScript::add_exclude_glob, result)) {
+ return false;
+ }
+
// js and css keys
ListValue* js = NULL;
if (content_script->HasKey(keys::kJs) &&
@@ -309,6 +320,38 @@ bool Extension::LoadUserScriptHelper(const DictionaryValue* content_script,
return true;
}
+bool Extension::LoadGlobsHelper(
+ const DictionaryValue* content_script,
+ int content_script_index,
+ const wchar_t* globs_property_name,
+ std::string* error,
+ void (UserScript::*add_method) (const std::string& glob),
+ UserScript *instance) {
+ if (!content_script->HasKey(globs_property_name))
+ return true; // they are optional
+
+ ListValue* list = NULL;
+ if (!content_script->GetList(globs_property_name, &list)) {
+ *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidGlobList,
+ IntToString(content_script_index), WideToASCII(globs_property_name));
+ return false;
+ }
+
+ for (size_t i = 0; i < list->GetSize(); ++i) {
+ std::string glob;
+ if (!list->GetString(i, &glob)) {
+ *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidGlob,
+ IntToString(content_script_index), WideToASCII(globs_property_name),
+ IntToString(i));
+ return false;
+ }
+
+ (instance->*add_method)(glob);
+ }
+
+ return true;
+}
+
ExtensionAction* Extension::LoadExtensionActionHelper(
const DictionaryValue* extension_action, std::string* error) {
scoped_ptr<ExtensionAction> result(new ExtensionAction());
@@ -448,7 +491,8 @@ ExtensionResource Extension::GetResource(const FilePath& extension_path,
}
Extension::Extension(const FilePath& path)
- : is_theme_(false), background_page_ready_(false) {
+ : is_theme_(false), background_page_ready_(false),
+ converted_from_user_script_(false) {
DCHECK(path.IsAbsolute());
location_ = INVALID;
@@ -666,6 +710,10 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
}
}
+ // Initialize converted_from_user_script (if present)
+ source.GetBoolean(keys::kConvertedFromUserScript,
+ &converted_from_user_script_);
+
// Initialize icons (if present).
if (source.HasKey(keys::kIcons)) {
DictionaryValue* icons_value = NULL;
@@ -941,6 +989,8 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
if (!LoadUserScriptHelper(content_script, i, error, &script))
return false; // Failed to parse script context definition
script.set_extension_id(id());
+ if (converted_from_user_script_)
+ script.set_emulate_greasemonkey(true);
content_scripts_.push_back(script);
}
}

Powered by Google App Engine
This is Rietveld 408576698