user_script_unittest.cc 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <stddef.h>
  5. #include <stdint.h>
  6. #include "base/files/file_path.h"
  7. #include "base/pickle.h"
  8. #include "extensions/common/mojom/host_id.mojom.h"
  9. #include "extensions/common/mojom/run_location.mojom-shared.h"
  10. #include "extensions/common/user_script.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. #include "url/gurl.h"
  13. namespace extensions {
  14. static const int kAllSchemes =
  15. URLPattern::SCHEME_HTTP |
  16. URLPattern::SCHEME_HTTPS |
  17. URLPattern::SCHEME_FILE |
  18. URLPattern::SCHEME_FTP |
  19. URLPattern::SCHEME_CHROMEUI;
  20. TEST(ExtensionUserScriptTest, Glob_HostString) {
  21. UserScript script;
  22. script.add_glob("*mail.google.com*");
  23. script.add_glob("*mail.yahoo.com*");
  24. script.add_glob("*mail.msn.com*");
  25. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
  26. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com/foo")));
  27. EXPECT_TRUE(script.MatchesURL(GURL("https://mail.google.com/foo")));
  28. EXPECT_TRUE(script.MatchesURL(GURL("ftp://mail.google.com/foo")));
  29. EXPECT_TRUE(script.MatchesURL(GURL("http://woo.mail.google.com/foo")));
  30. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.yahoo.com/bar")));
  31. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.msn.com/baz")));
  32. EXPECT_FALSE(script.MatchesURL(GURL("http://www.hotmail.com")));
  33. script.add_exclude_glob("*foo*");
  34. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
  35. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.google.com/foo")));
  36. }
  37. TEST(ExtensionUserScriptTest, Glob_TrailingSlash) {
  38. UserScript script;
  39. script.add_glob("*mail.google.com/");
  40. // GURL normalizes the URL to have a trailing "/"
  41. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
  42. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com/")));
  43. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.google.com/foo")));
  44. }
  45. TEST(ExtensionUserScriptTest, Glob_TrailingSlashStar) {
  46. UserScript script;
  47. script.add_glob("http://mail.google.com/*");
  48. // GURL normalizes the URL to have a trailing "/"
  49. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
  50. EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com/foo")));
  51. EXPECT_FALSE(script.MatchesURL(GURL("https://mail.google.com/foo")));
  52. }
  53. TEST(ExtensionUserScriptTest, Glob_Star) {
  54. UserScript script;
  55. script.add_glob("*");
  56. EXPECT_TRUE(script.MatchesURL(GURL("http://foo.com/bar")));
  57. EXPECT_TRUE(script.MatchesURL(GURL("http://hot.com/dog")));
  58. EXPECT_TRUE(script.MatchesURL(GURL("https://hot.com/dog")));
  59. EXPECT_TRUE(script.MatchesURL(GURL("file:///foo/bar")));
  60. EXPECT_TRUE(script.MatchesURL(GURL("file://localhost/foo/bar")));
  61. }
  62. TEST(ExtensionUserScriptTest, Glob_StringAnywhere) {
  63. UserScript script;
  64. script.add_glob("*foo*");
  65. EXPECT_TRUE(script.MatchesURL(GURL("http://foo.com/bar")));
  66. EXPECT_TRUE(script.MatchesURL(GURL("http://baz.org/foo/bar")));
  67. EXPECT_FALSE(script.MatchesURL(GURL("http://baz.org")));
  68. }
  69. TEST(ExtensionUserScriptTest, UrlPattern) {
  70. URLPattern pattern(kAllSchemes);
  71. ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("http://*/foo*"));
  72. UserScript script;
  73. script.add_url_pattern(pattern);
  74. EXPECT_TRUE(script.MatchesURL(GURL("http://monkey.com/foobar")));
  75. EXPECT_FALSE(script.MatchesURL(GURL("http://monkey.com/hotdog")));
  76. // NOTE: URLPattern is tested more extensively in url_pattern_unittest.cc.
  77. }
  78. TEST(ExtensionUserScriptTest, ExcludeUrlPattern) {
  79. UserScript script;
  80. URLPattern pattern(kAllSchemes);
  81. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  82. pattern.Parse("http://*.nytimes.com/*"));
  83. script.add_url_pattern(pattern);
  84. URLPattern exclude(kAllSchemes);
  85. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  86. exclude.Parse("*://*/*business*"));
  87. script.add_exclude_url_pattern(exclude);
  88. EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/health")));
  89. EXPECT_FALSE(script.MatchesURL(GURL("http://www.nytimes.com/business")));
  90. EXPECT_TRUE(script.MatchesURL(GURL("http://business.nytimes.com")));
  91. }
  92. TEST(ExtensionUserScriptTest, ExcludeUrlPatternWithTrailingDot) {
  93. UserScript script;
  94. URLPattern pattern(kAllSchemes);
  95. ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern.Parse("*://*/*"));
  96. script.add_url_pattern(pattern);
  97. URLPattern exclude(kAllSchemes);
  98. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  99. exclude.Parse("*://mail.nytimes.com/*"));
  100. script.add_exclude_url_pattern(exclude);
  101. EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/health")));
  102. EXPECT_TRUE(script.MatchesURL(GURL("http://business.nytimes.com")));
  103. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.nytimes.com")));
  104. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.nytimes.com.")));
  105. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.nytimes.com/login")));
  106. EXPECT_FALSE(script.MatchesURL(GURL("http://mail.nytimes.com./login")));
  107. }
  108. TEST(ExtensionUserScriptTest, UrlPatternAndIncludeGlobs) {
  109. UserScript script;
  110. URLPattern pattern(kAllSchemes);
  111. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  112. pattern.Parse("http://*.nytimes.com/*"));
  113. script.add_url_pattern(pattern);
  114. script.add_glob("*nytimes.com/???s/*");
  115. EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/arts/1.html")));
  116. EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/jobs/1.html")));
  117. EXPECT_FALSE(script.MatchesURL(GURL("http://www.nytimes.com/sports/1.html")));
  118. }
  119. TEST(ExtensionUserScriptTest, UrlPatternAndExcludeGlobs) {
  120. UserScript script;
  121. URLPattern pattern(kAllSchemes);
  122. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  123. pattern.Parse("http://*.nytimes.com/*"));
  124. script.add_url_pattern(pattern);
  125. script.add_exclude_glob("*science*");
  126. EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com")));
  127. EXPECT_FALSE(script.MatchesURL(GURL("http://science.nytimes.com")));
  128. EXPECT_FALSE(script.MatchesURL(GURL("http://www.nytimes.com/science")));
  129. }
  130. TEST(ExtensionUserScriptTest, UrlPatternGlobInteraction) {
  131. // If there are both, match intersection(union(globs), union(urlpatterns)).
  132. UserScript script;
  133. URLPattern pattern(kAllSchemes);
  134. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  135. pattern.Parse("http://www.google.com/*"));
  136. script.add_url_pattern(pattern);
  137. script.add_glob("*bar*");
  138. // No match, because it doesn't match the glob.
  139. EXPECT_FALSE(script.MatchesURL(GURL("http://www.google.com/foo")));
  140. script.add_exclude_glob("*baz*");
  141. // No match, because it matches the exclude glob.
  142. EXPECT_FALSE(script.MatchesURL(GURL("http://www.google.com/baz")));
  143. // Match, because it matches the glob, doesn't match the exclude glob.
  144. EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/bar")));
  145. // Try with just a single exclude glob.
  146. script.clear_globs();
  147. EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/foo")));
  148. // Try with no globs or exclude globs.
  149. script.clear_exclude_globs();
  150. EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/foo")));
  151. }
  152. TEST(ExtensionUserScriptTest, Pickle) {
  153. URLPattern pattern1(kAllSchemes);
  154. URLPattern pattern2(kAllSchemes);
  155. URLPattern exclude1(kAllSchemes);
  156. URLPattern exclude2(kAllSchemes);
  157. ASSERT_EQ(URLPattern::ParseResult::kSuccess, pattern1.Parse("http://*/foo*"));
  158. ASSERT_EQ(URLPattern::ParseResult::kSuccess,
  159. pattern2.Parse("http://bar/baz*"));
  160. ASSERT_EQ(URLPattern::ParseResult::kSuccess, exclude1.Parse("*://*/*bar"));
  161. ASSERT_EQ(URLPattern::ParseResult::kSuccess, exclude2.Parse("https://*/*"));
  162. UserScript script1;
  163. script1.js_scripts().push_back(std::make_unique<UserScript::File>(
  164. base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
  165. base::FilePath(FILE_PATH_LITERAL("foo.user.js")),
  166. GURL("chrome-extension://abc/foo.user.js")));
  167. script1.css_scripts().push_back(std::make_unique<UserScript::File>(
  168. base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
  169. base::FilePath(FILE_PATH_LITERAL("foo.user.css")),
  170. GURL("chrome-extension://abc/foo.user.css")));
  171. script1.css_scripts().push_back(std::make_unique<UserScript::File>(
  172. base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
  173. base::FilePath(FILE_PATH_LITERAL("foo2.user.css")),
  174. GURL("chrome-extension://abc/foo2.user.css")));
  175. script1.set_run_location(mojom::RunLocation::kDocumentStart);
  176. script1.add_url_pattern(pattern1);
  177. script1.add_url_pattern(pattern2);
  178. script1.add_exclude_url_pattern(exclude1);
  179. script1.add_exclude_url_pattern(exclude2);
  180. const std::string kId = "_12";
  181. script1.set_id(kId);
  182. const std::string kExtensionId = "foo";
  183. mojom::HostID id(mojom::HostID::HostType::kExtensions, kExtensionId);
  184. script1.set_host_id(id);
  185. base::Pickle pickle;
  186. script1.Pickle(&pickle);
  187. base::PickleIterator iter(pickle);
  188. UserScript script2;
  189. script2.Unpickle(pickle, &iter);
  190. EXPECT_EQ(1U, script2.js_scripts().size());
  191. EXPECT_EQ(script1.js_scripts()[0]->url(), script2.js_scripts()[0]->url());
  192. EXPECT_EQ(2U, script2.css_scripts().size());
  193. for (size_t i = 0; i < script2.js_scripts().size(); ++i) {
  194. EXPECT_EQ(script1.css_scripts()[i]->url(), script2.css_scripts()[i]->url());
  195. }
  196. ASSERT_EQ(script1.globs().size(), script2.globs().size());
  197. for (size_t i = 0; i < script1.globs().size(); ++i) {
  198. EXPECT_EQ(script1.globs()[i], script2.globs()[i]);
  199. }
  200. ASSERT_EQ(script1.url_patterns(), script2.url_patterns());
  201. ASSERT_EQ(script1.exclude_url_patterns(), script2.exclude_url_patterns());
  202. EXPECT_EQ(kExtensionId, script2.extension_id());
  203. EXPECT_EQ(kId, script2.id());
  204. }
  205. TEST(ExtensionUserScriptTest, Defaults) {
  206. UserScript script;
  207. ASSERT_EQ(mojom::RunLocation::kDocumentIdle, script.run_location());
  208. }
  209. } // namespace extensions