18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Copyright (c) 2009 The Chromium Authors. All rights reserved.
28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be
38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file.
48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_path.h"
68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/pickle.h"
78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/user_script.h"
88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "googleurl/src/gurl.h"
98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstatic const int kAllSchemes =
128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    URLPattern::SCHEME_HTTP |
138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    URLPattern::SCHEME_HTTPS |
148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    URLPattern::SCHEME_FILE |
158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    URLPattern::SCHEME_FTP |
168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    URLPattern::SCHEME_CHROMEUI;
178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match1) {
198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*mail.google.com*");
218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*mail.yahoo.com*");
228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*mail.msn.com*");
238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("https://mail.google.com/foo")));
268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("ftp://mail.google.com/foo")));
278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://woo.mail.google.com/foo")));
288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.yahoo.com/bar")));
298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.msn.com/baz")));
308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.hotmail.com")));
318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_exclude_glob("*foo*");
338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match2) {
388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*mail.google.com/");
408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // GURL normalizes the URL to have a trailing "/"
418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/")));
438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match3) {
478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("http://mail.google.com/*");
498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // GURL normalizes the URL to have a trailing "/"
508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com")));
518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo")));
528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("https://mail.google.com/foo")));
538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match4) {
568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*");
588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar")));
598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://hot.com/dog")));
608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("https://hot.com/dog")));
618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("file:///foo/bar")));
628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match5) {
658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*foo*");
678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar")));
688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://baz.org/foo/bar")));
698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://baz.org")));
708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Match6) {
738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  URLPattern pattern(kAllSchemes);
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            pattern.Parse("http://*/foo*", URLPattern::PARSE_STRICT));
768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_url_pattern(pattern);
798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://monkey.com/foobar")));
808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://monkey.com/hotdog")));
818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // NOTE: URLPattern is tested more extensively in url_pattern_unittest.cc.
838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, UrlPatternGlobInteraction) {
868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // If there are both, match intersection(union(globs), union(urlpatterns)).
878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  URLPattern pattern(kAllSchemes);
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            pattern.Parse("http://www.google.com/*",
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          URLPattern::PARSE_STRICT));
938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_url_pattern(pattern);
948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_glob("*bar*");
968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // No match, because it doesn't match the glob.
988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/foo")));
998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.add_exclude_glob("*baz*");
1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // No match, because it matches the exclude glob.
1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/baz")));
1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Match, because it matches the glob, doesn't match the exclude glob.
1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/bar")));
1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Try with just a single exclude glob.
1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.clear_globs();
1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo")));
1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Try with no globs or exclude globs.
1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script.clear_exclude_globs();
1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo")));
1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Pickle) {
1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  URLPattern pattern1(kAllSchemes);
1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  URLPattern pattern2(kAllSchemes);
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            pattern1.Parse("http://*/foo*", URLPattern::PARSE_STRICT));
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(URLPattern::PARSE_SUCCESS,
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            pattern2.Parse("http://bar/baz*", URLPattern::PARSE_STRICT));
1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script1;
1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.js_scripts().push_back(UserScript::File(
1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("foo.user.js")),
1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      GURL("chrome-user-script:/foo.user.js")));
1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.css_scripts().push_back(UserScript::File(
1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("foo.user.css")),
1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      GURL("chrome-user-script:/foo.user.css")));
1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.css_scripts().push_back(UserScript::File(
1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("c:\\foo\\")),
1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      FilePath(FILE_PATH_LITERAL("foo2.user.css")),
1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      GURL("chrome-user-script:/foo2.user.css")));
1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.set_run_location(UserScript::DOCUMENT_START);
1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.add_url_pattern(pattern1);
1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.add_url_pattern(pattern2);
1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  Pickle pickle;
1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script1.Pickle(&pickle);
1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  void* iter = NULL;
1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script2;
1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  script2.Unpickle(pickle, &iter);
1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(1U, script2.js_scripts().size());
1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(script1.js_scripts()[0].url(), script2.js_scripts()[0].url());
1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(2U, script2.css_scripts().size());
1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < script2.js_scripts().size(); ++i) {
1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_EQ(script1.css_scripts()[i].url(), script2.css_scripts()[i].url());
1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(script1.globs().size(), script2.globs().size());
1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < script1.globs().size(); ++i) {
1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_EQ(script1.globs()[i], script2.globs()[i]);
1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(script1.url_patterns().size(), script2.url_patterns().size());
1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  for (size_t i = 0; i < script1.url_patterns().size(); ++i) {
1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    EXPECT_EQ(script1.url_patterns()[i].GetAsString(),
1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen              script2.url_patterns()[i].GetAsString());
1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  }
1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(ExtensionUserScriptTest, Defaults) {
1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  UserScript script;
1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(UserScript::DOCUMENT_IDLE, script.run_location());
1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
173