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