summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/user_script_master.cc25
-rw-r--r--chrome/browser/extensions/user_script_master_unittest.cc19
2 files changed, 34 insertions, 10 deletions
diff --git a/chrome/browser/extensions/user_script_master.cc b/chrome/browser/extensions/user_script_master.cc
index 528f1b9..d142e0a 100644
--- a/chrome/browser/extensions/user_script_master.cc
+++ b/chrome/browser/extensions/user_script_master.cc
@@ -26,11 +26,16 @@
static bool GetDeclarationValue(const base::StringPiece& line,
const base::StringPiece& prefix,
std::string* value) {
- if (!line.starts_with(prefix))
+ base::StringPiece::size_type index = line.find(prefix);
+ if (index == base::StringPiece::npos)
+ return false;
+
+ std::string temp(line.data() + index + prefix.length(),
+ line.length() - index - prefix.length());
+
+ if (temp.size() == 0 || !IsWhitespace(temp[0]))
return false;
- std::string temp(line.data() + prefix.length(),
- line.length() - prefix.length());
TrimWhitespaceASCII(temp, TRIM_ALL, value);
return true;
}
@@ -56,13 +61,13 @@ bool UserScriptMaster::ScriptReloader::ParseMetadataHeader(
static const base::StringPiece kUserScriptBegin("// ==UserScript==");
static const base::StringPiece kUserScriptEng("// ==/UserScript==");
- static const base::StringPiece kNamespaceDeclaration("// @namespace ");
- static const base::StringPiece kNameDeclaration("// @name ");
- static const base::StringPiece kDescriptionDeclaration("// @description ");
- static const base::StringPiece kIncludeDeclaration("// @include ");
- static const base::StringPiece kExcludeDeclaration("// @exclude ");
- static const base::StringPiece kMatchDeclaration("// @match ");
- static const base::StringPiece kRunAtDeclaration("// @run-at ");
+ static const base::StringPiece kNamespaceDeclaration("// @namespace");
+ static const base::StringPiece kNameDeclaration("// @name");
+ static const base::StringPiece kDescriptionDeclaration("// @description");
+ static const base::StringPiece kIncludeDeclaration("// @include");
+ static const base::StringPiece kExcludeDeclaration("// @exclude");
+ static const base::StringPiece kMatchDeclaration("// @match");
+ static const base::StringPiece kRunAtDeclaration("// @run-at");
static const base::StringPiece kRunAtDocumentStartValue("document-start");
static const base::StringPiece kRunAtDocumentEndValue("document-end");
diff --git a/chrome/browser/extensions/user_script_master_unittest.cc b/chrome/browser/extensions/user_script_master_unittest.cc
index 562f4cf..ef5ac2f 100644
--- a/chrome/browser/extensions/user_script_master_unittest.cc
+++ b/chrome/browser/extensions/user_script_master_unittest.cc
@@ -240,3 +240,22 @@ TEST_F(UserScriptMasterTest, Parse7) {
EXPECT_EQ("http://*.mail.google.com/*",
script.url_patterns()[0].GetAsString());
}
+
+TEST_F(UserScriptMasterTest, Parse8) {
+ // Greasemonkey allows there to be any leading text before the comment marker.
+ const std::string text(
+ "// ==UserScript==\n"
+ "adsasdfasf// @name hello\n"
+ " // @description\twiggity woo\n"
+ "\t// @match \t http://mail.yahoo.com/*\n"
+ "// ==/UserScript==\n");
+
+ UserScript script;
+ EXPECT_TRUE(UserScriptMaster::ScriptReloader::ParseMetadataHeader(
+ text, &script));
+ ASSERT_EQ("hello", script.name());
+ ASSERT_EQ("wiggity woo", script.description());
+ ASSERT_EQ(1U, script.url_patterns().size());
+ EXPECT_EQ("http://mail.yahoo.com/*",
+ script.url_patterns()[0].GetAsString());
+}