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
3// found in the LICENSE file.
4
5#include "base/file_path.h"
6#include "base/pickle.h"
7#include "chrome/common/extensions/user_script.h"
8#include "googleurl/src/gurl.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11static const int kAllSchemes =
12    URLPattern::SCHEME_HTTP |
13    URLPattern::SCHEME_HTTPS |
14    URLPattern::SCHEME_FILE |
15    URLPattern::SCHEME_FTP |
16    URLPattern::SCHEME_CHROMEUI;
17
18TEST(ExtensionUserScriptTest, Match1) {
19  UserScript script;
20  script.add_glob("*mail.google.com*");
21  script.add_glob("*mail.yahoo.com*");
22  script.add_glob("*mail.msn.com*");
23  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
24  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
25  EXPECT_TRUE(script.MatchesUrl(GURL("https://mail.google.com/foo")));
26  EXPECT_TRUE(script.MatchesUrl(GURL("ftp://mail.google.com/foo")));
27  EXPECT_TRUE(script.MatchesUrl(GURL("http://woo.mail.google.com/foo")));
28  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.yahoo.com/bar")));
29  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.msn.com/baz")));
30  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.hotmail.com")));
31
32  script.add_exclude_glob("*foo*");
33  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
34  EXPECT_FALSE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
35}
36
37TEST(ExtensionUserScriptTest, Match2) {
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
46TEST(ExtensionUserScriptTest, Match3) {
47  UserScript script;
48  script.add_glob("http://mail.google.com/*");
49  // GURL normalizes the URL to have a trailing "/"
50  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
51  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
52  EXPECT_FALSE(script.MatchesUrl(GURL("https://mail.google.com/foo")));
53}
54
55TEST(ExtensionUserScriptTest, Match4) {
56  UserScript script;
57  script.add_glob("*");
58  EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar")));
59  EXPECT_TRUE(script.MatchesUrl(GURL("http://hot.com/dog")));
60  EXPECT_TRUE(script.MatchesUrl(GURL("https://hot.com/dog")));
61  EXPECT_TRUE(script.MatchesUrl(GURL("file:///foo/bar")));
62}
63
64TEST(ExtensionUserScriptTest, Match5) {
65  UserScript script;
66  script.add_glob("*foo*");
67  EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar")));
68  EXPECT_TRUE(script.MatchesUrl(GURL("http://baz.org/foo/bar")));
69  EXPECT_FALSE(script.MatchesUrl(GURL("http://baz.org")));
70}
71
72TEST(ExtensionUserScriptTest, Match6) {
73  URLPattern pattern(kAllSchemes);
74  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
75            pattern.Parse("http://*/foo*", URLPattern::PARSE_STRICT));
76
77  UserScript script;
78  script.add_url_pattern(pattern);
79  EXPECT_TRUE(script.MatchesUrl(GURL("http://monkey.com/foobar")));
80  EXPECT_FALSE(script.MatchesUrl(GURL("http://monkey.com/hotdog")));
81
82  // NOTE: URLPattern is tested more extensively in url_pattern_unittest.cc.
83}
84
85TEST(ExtensionUserScriptTest, UrlPatternGlobInteraction) {
86  // If there are both, match intersection(union(globs), union(urlpatterns)).
87  UserScript script;
88
89  URLPattern pattern(kAllSchemes);
90  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
91            pattern.Parse("http://www.google.com/*",
92                          URLPattern::PARSE_STRICT));
93  script.add_url_pattern(pattern);
94
95  script.add_glob("*bar*");
96
97  // No match, because it doesn't match the glob.
98  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/foo")));
99
100  script.add_exclude_glob("*baz*");
101
102  // No match, because it matches the exclude glob.
103  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/baz")));
104
105  // Match, because it matches the glob, doesn't match the exclude glob.
106  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/bar")));
107
108  // Try with just a single exclude glob.
109  script.clear_globs();
110  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo")));
111
112  // Try with no globs or exclude globs.
113  script.clear_exclude_globs();
114  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo")));
115}
116
117TEST(ExtensionUserScriptTest, Pickle) {
118  URLPattern pattern1(kAllSchemes);
119  URLPattern pattern2(kAllSchemes);
120  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
121            pattern1.Parse("http://*/foo*", URLPattern::PARSE_STRICT));
122  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
123            pattern2.Parse("http://bar/baz*", URLPattern::PARSE_STRICT));
124
125  UserScript script1;
126  script1.js_scripts().push_back(UserScript::File(
127      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
128      FilePath(FILE_PATH_LITERAL("foo.user.js")),
129      GURL("chrome-user-script:/foo.user.js")));
130  script1.css_scripts().push_back(UserScript::File(
131      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
132      FilePath(FILE_PATH_LITERAL("foo.user.css")),
133      GURL("chrome-user-script:/foo.user.css")));
134  script1.css_scripts().push_back(UserScript::File(
135      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
136      FilePath(FILE_PATH_LITERAL("foo2.user.css")),
137      GURL("chrome-user-script:/foo2.user.css")));
138  script1.set_run_location(UserScript::DOCUMENT_START);
139
140  script1.add_url_pattern(pattern1);
141  script1.add_url_pattern(pattern2);
142
143  Pickle pickle;
144  script1.Pickle(&pickle);
145
146  void* iter = NULL;
147  UserScript script2;
148  script2.Unpickle(pickle, &iter);
149
150  EXPECT_EQ(1U, script2.js_scripts().size());
151  EXPECT_EQ(script1.js_scripts()[0].url(), script2.js_scripts()[0].url());
152
153  EXPECT_EQ(2U, script2.css_scripts().size());
154  for (size_t i = 0; i < script2.js_scripts().size(); ++i) {
155    EXPECT_EQ(script1.css_scripts()[i].url(), script2.css_scripts()[i].url());
156  }
157
158  ASSERT_EQ(script1.globs().size(), script2.globs().size());
159  for (size_t i = 0; i < script1.globs().size(); ++i) {
160    EXPECT_EQ(script1.globs()[i], script2.globs()[i]);
161  }
162  ASSERT_EQ(script1.url_patterns().size(), script2.url_patterns().size());
163  for (size_t i = 0; i < script1.url_patterns().size(); ++i) {
164    EXPECT_EQ(script1.url_patterns()[i].GetAsString(),
165              script2.url_patterns()[i].GetAsString());
166  }
167}
168
169TEST(ExtensionUserScriptTest, Defaults) {
170  UserScript script;
171  ASSERT_EQ(UserScript::DOCUMENT_IDLE, script.run_location());
172}
173