Home | History | Annotate | Download | only in common
      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 
      5 #include "base/files/file_path.h"
      6 #include "base/pickle.h"
      7 #include "extensions/common/user_script.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 #include "url/gurl.h"
     10 
     11 namespace extensions {
     12 
     13 static const int kAllSchemes =
     14     URLPattern::SCHEME_HTTP |
     15     URLPattern::SCHEME_HTTPS |
     16     URLPattern::SCHEME_FILE |
     17     URLPattern::SCHEME_FTP |
     18     URLPattern::SCHEME_CHROMEUI;
     19 
     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 
     34   script.add_exclude_glob("*foo*");
     35   EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
     36   EXPECT_FALSE(script.MatchesURL(GURL("http://mail.google.com/foo")));
     37 }
     38 
     39 TEST(ExtensionUserScriptTest, Glob_TrailingSlash) {
     40   UserScript script;
     41   script.add_glob("*mail.google.com/");
     42   // GURL normalizes the URL to have a trailing "/"
     43   EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
     44   EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com/")));
     45   EXPECT_FALSE(script.MatchesURL(GURL("http://mail.google.com/foo")));
     46 }
     47 
     48 TEST(ExtensionUserScriptTest, Glob_TrailingSlashStar) {
     49   UserScript script;
     50   script.add_glob("http://mail.google.com/*");
     51   // GURL normalizes the URL to have a trailing "/"
     52   EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com")));
     53   EXPECT_TRUE(script.MatchesURL(GURL("http://mail.google.com/foo")));
     54   EXPECT_FALSE(script.MatchesURL(GURL("https://mail.google.com/foo")));
     55 }
     56 
     57 TEST(ExtensionUserScriptTest, Glob_Star) {
     58   UserScript script;
     59   script.add_glob("*");
     60   EXPECT_TRUE(script.MatchesURL(GURL("http://foo.com/bar")));
     61   EXPECT_TRUE(script.MatchesURL(GURL("http://hot.com/dog")));
     62   EXPECT_TRUE(script.MatchesURL(GURL("https://hot.com/dog")));
     63   EXPECT_TRUE(script.MatchesURL(GURL("file:///foo/bar")));
     64   EXPECT_TRUE(script.MatchesURL(GURL("file://localhost/foo/bar")));
     65 }
     66 
     67 TEST(ExtensionUserScriptTest, Glob_StringAnywhere) {
     68   UserScript script;
     69   script.add_glob("*foo*");
     70   EXPECT_TRUE(script.MatchesURL(GURL("http://foo.com/bar")));
     71   EXPECT_TRUE(script.MatchesURL(GURL("http://baz.org/foo/bar")));
     72   EXPECT_FALSE(script.MatchesURL(GURL("http://baz.org")));
     73 }
     74 
     75 TEST(ExtensionUserScriptTest, UrlPattern) {
     76   URLPattern pattern(kAllSchemes);
     77   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*/foo*"));
     78 
     79   UserScript script;
     80   script.add_url_pattern(pattern);
     81   EXPECT_TRUE(script.MatchesURL(GURL("http://monkey.com/foobar")));
     82   EXPECT_FALSE(script.MatchesURL(GURL("http://monkey.com/hotdog")));
     83 
     84   // NOTE: URLPattern is tested more extensively in url_pattern_unittest.cc.
     85 }
     86 
     87 TEST(ExtensionUserScriptTest, ExcludeUrlPattern) {
     88   UserScript script;
     89 
     90   URLPattern pattern(kAllSchemes);
     91   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*"));
     92   script.add_url_pattern(pattern);
     93 
     94   URLPattern exclude(kAllSchemes);
     95   ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude.Parse("*://*/*business*"));
     96   script.add_exclude_url_pattern(exclude);
     97 
     98   EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/health")));
     99   EXPECT_FALSE(script.MatchesURL(GURL("http://www.nytimes.com/business")));
    100   EXPECT_TRUE(script.MatchesURL(GURL("http://business.nytimes.com")));
    101 }
    102 
    103 TEST(ExtensionUserScriptTest, UrlPatternAndIncludeGlobs) {
    104   UserScript script;
    105 
    106   URLPattern pattern(kAllSchemes);
    107   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*"));
    108   script.add_url_pattern(pattern);
    109 
    110   script.add_glob("*nytimes.com/???s/*");
    111 
    112   EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/arts/1.html")));
    113   EXPECT_TRUE(script.MatchesURL(GURL("http://www.nytimes.com/jobs/1.html")));
    114   EXPECT_FALSE(script.MatchesURL(GURL("http://www.nytimes.com/sports/1.html")));
    115 }
    116 
    117 TEST(ExtensionUserScriptTest, UrlPatternAndExcludeGlobs) {
    118   UserScript script;
    119 
    120   URLPattern pattern(kAllSchemes);
    121   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*.nytimes.com/*"));
    122   script.add_url_pattern(pattern);
    123 
    124   script.add_exclude_glob("*science*");
    125 
    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 
    131 TEST(ExtensionUserScriptTest, UrlPatternGlobInteraction) {
    132   // If there are both, match intersection(union(globs), union(urlpatterns)).
    133   UserScript script;
    134 
    135   URLPattern pattern(kAllSchemes);
    136   ASSERT_EQ(URLPattern::PARSE_SUCCESS,pattern.Parse("http://www.google.com/*"));
    137   script.add_url_pattern(pattern);
    138 
    139   script.add_glob("*bar*");
    140 
    141   // No match, because it doesn't match the glob.
    142   EXPECT_FALSE(script.MatchesURL(GURL("http://www.google.com/foo")));
    143 
    144   script.add_exclude_glob("*baz*");
    145 
    146   // No match, because it matches the exclude glob.
    147   EXPECT_FALSE(script.MatchesURL(GURL("http://www.google.com/baz")));
    148 
    149   // Match, because it matches the glob, doesn't match the exclude glob.
    150   EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/bar")));
    151 
    152   // Try with just a single exclude glob.
    153   script.clear_globs();
    154   EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/foo")));
    155 
    156   // Try with no globs or exclude globs.
    157   script.clear_exclude_globs();
    158   EXPECT_TRUE(script.MatchesURL(GURL("http://www.google.com/foo")));
    159 }
    160 
    161 TEST(ExtensionUserScriptTest, Pickle) {
    162   URLPattern pattern1(kAllSchemes);
    163   URLPattern pattern2(kAllSchemes);
    164   URLPattern exclude1(kAllSchemes);
    165   URLPattern exclude2(kAllSchemes);
    166   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse("http://*/foo*"));
    167   ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse("http://bar/baz*"));
    168   ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude1.Parse("*://*/*bar"));
    169   ASSERT_EQ(URLPattern::PARSE_SUCCESS, exclude2.Parse("https://*/*"));
    170 
    171   UserScript script1;
    172   script1.js_scripts().push_back(UserScript::File(
    173       base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
    174       base::FilePath(FILE_PATH_LITERAL("foo.user.js")),
    175       GURL("chrome-extension://abc/foo.user.js")));
    176   script1.css_scripts().push_back(UserScript::File(
    177       base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
    178       base::FilePath(FILE_PATH_LITERAL("foo.user.css")),
    179       GURL("chrome-extension://abc/foo.user.css")));
    180   script1.css_scripts().push_back(UserScript::File(
    181       base::FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
    182       base::FilePath(FILE_PATH_LITERAL("foo2.user.css")),
    183       GURL("chrome-extension://abc/foo2.user.css")));
    184   script1.set_run_location(UserScript::DOCUMENT_START);
    185 
    186   script1.add_url_pattern(pattern1);
    187   script1.add_url_pattern(pattern2);
    188   script1.add_exclude_url_pattern(exclude1);
    189   script1.add_exclude_url_pattern(exclude2);
    190 
    191   Pickle pickle;
    192   script1.Pickle(&pickle);
    193 
    194   PickleIterator iter(pickle);
    195   UserScript script2;
    196   script2.Unpickle(pickle, &iter);
    197 
    198   EXPECT_EQ(1U, script2.js_scripts().size());
    199   EXPECT_EQ(script1.js_scripts()[0].url(), script2.js_scripts()[0].url());
    200 
    201   EXPECT_EQ(2U, script2.css_scripts().size());
    202   for (size_t i = 0; i < script2.js_scripts().size(); ++i) {
    203     EXPECT_EQ(script1.css_scripts()[i].url(), script2.css_scripts()[i].url());
    204   }
    205 
    206   ASSERT_EQ(script1.globs().size(), script2.globs().size());
    207   for (size_t i = 0; i < script1.globs().size(); ++i) {
    208     EXPECT_EQ(script1.globs()[i], script2.globs()[i]);
    209   }
    210 
    211   ASSERT_EQ(script1.url_patterns(), script2.url_patterns());
    212   ASSERT_EQ(script1.exclude_url_patterns(), script2.exclude_url_patterns());
    213 }
    214 
    215 TEST(ExtensionUserScriptTest, Defaults) {
    216   UserScript script;
    217   ASSERT_EQ(UserScript::DOCUMENT_IDLE, script.run_location());
    218 }
    219 
    220 }  // namespace extensions
    221