// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/file_path.h" #include "base/pickle.h" #include "chrome/common/extensions/user_script.h" #include "googleurl/src/gurl.h" #include "testing/gtest/include/gtest/gtest.h" static const int kAllSchemes = URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | URLPattern::SCHEME_FILE | URLPattern::SCHEME_FTP | URLPattern::SCHEME_CHROMEUI; TEST(ExtensionUserScriptTest, Match1) { UserScript script; script.add_glob("*mail.google.com*"); script.add_glob("*mail.yahoo.com*"); script.add_glob("*mail.msn.com*"); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo"))); EXPECT_TRUE(script.MatchesUrl(GURL("https://mail.google.com/foo"))); EXPECT_TRUE(script.MatchesUrl(GURL("ftp://mail.google.com/foo"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://woo.mail.google.com/foo"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.yahoo.com/bar"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.msn.com/baz"))); EXPECT_FALSE(script.MatchesUrl(GURL("http://www.hotmail.com"))); script.add_exclude_glob("*foo*"); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com"))); EXPECT_FALSE(script.MatchesUrl(GURL("http://mail.google.com/foo"))); } TEST(ExtensionUserScriptTest, Match2) { UserScript script; script.add_glob("*mail.google.com/"); // GURL normalizes the URL to have a trailing "/" EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/"))); EXPECT_FALSE(script.MatchesUrl(GURL("http://mail.google.com/foo"))); } TEST(ExtensionUserScriptTest, Match3) { UserScript script; script.add_glob("http://mail.google.com/*"); // GURL normalizes the URL to have a trailing "/" EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://mail.google.com/foo"))); EXPECT_FALSE(script.MatchesUrl(GURL("https://mail.google.com/foo"))); } TEST(ExtensionUserScriptTest, Match4) { UserScript script; script.add_glob("*"); EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://hot.com/dog"))); EXPECT_TRUE(script.MatchesUrl(GURL("https://hot.com/dog"))); EXPECT_TRUE(script.MatchesUrl(GURL("file:///foo/bar"))); } TEST(ExtensionUserScriptTest, Match5) { UserScript script; script.add_glob("*foo*"); EXPECT_TRUE(script.MatchesUrl(GURL("http://foo.com/bar"))); EXPECT_TRUE(script.MatchesUrl(GURL("http://baz.org/foo/bar"))); EXPECT_FALSE(script.MatchesUrl(GURL("http://baz.org"))); } TEST(ExtensionUserScriptTest, Match6) { URLPattern pattern(kAllSchemes); ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://*/foo*", URLPattern::PARSE_STRICT)); UserScript script; script.add_url_pattern(pattern); EXPECT_TRUE(script.MatchesUrl(GURL("http://monkey.com/foobar"))); EXPECT_FALSE(script.MatchesUrl(GURL("http://monkey.com/hotdog"))); // NOTE: URLPattern is tested more extensively in url_pattern_unittest.cc. } TEST(ExtensionUserScriptTest, UrlPatternGlobInteraction) { // If there are both, match intersection(union(globs), union(urlpatterns)). UserScript script; URLPattern pattern(kAllSchemes); ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern.Parse("http://www.google.com/*", URLPattern::PARSE_STRICT)); script.add_url_pattern(pattern); script.add_glob("*bar*"); // No match, because it doesn't match the glob. EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/foo"))); script.add_exclude_glob("*baz*"); // No match, because it matches the exclude glob. EXPECT_FALSE(script.MatchesUrl(GURL("http://www.google.com/baz"))); // Match, because it matches the glob, doesn't match the exclude glob. EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/bar"))); // Try with just a single exclude glob. script.clear_globs(); EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo"))); // Try with no globs or exclude globs. script.clear_exclude_globs(); EXPECT_TRUE(script.MatchesUrl(GURL("http://www.google.com/foo"))); } TEST(ExtensionUserScriptTest, Pickle) { URLPattern pattern1(kAllSchemes); URLPattern pattern2(kAllSchemes); ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern1.Parse("http://*/foo*", URLPattern::PARSE_STRICT)); ASSERT_EQ(URLPattern::PARSE_SUCCESS, pattern2.Parse("http://bar/baz*", URLPattern::PARSE_STRICT)); UserScript script1; script1.js_scripts().push_back(UserScript::File( FilePath(FILE_PATH_LITERAL("c:\\foo\\")), FilePath(FILE_PATH_LITERAL("foo.user.js")), GURL("chrome-user-script:/foo.user.js"))); script1.css_scripts().push_back(UserScript::File( FilePath(FILE_PATH_LITERAL("c:\\foo\\")), FilePath(FILE_PATH_LITERAL("foo.user.css")), GURL("chrome-user-script:/foo.user.css"))); script1.css_scripts().push_back(UserScript::File( FilePath(FILE_PATH_LITERAL("c:\\foo\\")), FilePath(FILE_PATH_LITERAL("foo2.user.css")), GURL("chrome-user-script:/foo2.user.css"))); script1.set_run_location(UserScript::DOCUMENT_START); script1.add_url_pattern(pattern1); script1.add_url_pattern(pattern2); Pickle pickle; script1.Pickle(&pickle); void* iter = NULL; UserScript script2; script2.Unpickle(pickle, &iter); EXPECT_EQ(1U, script2.js_scripts().size()); EXPECT_EQ(script1.js_scripts()[0].url(), script2.js_scripts()[0].url()); EXPECT_EQ(2U, script2.css_scripts().size()); for (size_t i = 0; i < script2.js_scripts().size(); ++i) { EXPECT_EQ(script1.css_scripts()[i].url(), script2.css_scripts()[i].url()); } ASSERT_EQ(script1.globs().size(), script2.globs().size()); for (size_t i = 0; i < script1.globs().size(); ++i) { EXPECT_EQ(script1.globs()[i], script2.globs()[i]); } ASSERT_EQ(script1.url_patterns().size(), script2.url_patterns().size()); for (size_t i = 0; i < script1.url_patterns().size(); ++i) { EXPECT_EQ(script1.url_patterns()[i].GetAsString(), script2.url_patterns()[i].GetAsString()); } } TEST(ExtensionUserScriptTest, Defaults) { UserScript script; ASSERT_EQ(UserScript::DOCUMENT_IDLE, script.run_location()); }