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