Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: chrome/browser/extensions/extension_user_script_loader_unittest.cc

Issue 822453002: Introduce HostID and de-couple Extensions from "script injection System" [browser side] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/user_script_loader.h" 5 #include "chrome/browser/extensions/extension_user_script_loader.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 9
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/files/file_util.h" 11 #include "base/files/file_util.h"
12 #include "base/files/scoped_temp_dir.h" 12 #include "base/files/scoped_temp_dir.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "chrome/browser/chrome_notification_types.h" 15 #include "chrome/browser/chrome_notification_types.h"
16 #include "chrome/test/base/testing_profile.h" 16 #include "chrome/test/base/testing_profile.h"
17 #include "content/public/browser/notification_observer.h" 17 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h" 18 #include "content/public/browser/notification_registrar.h"
19 #include "content/public/browser/notification_service.h" 19 #include "content/public/browser/notification_service.h"
20 #include "content/public/test/test_browser_thread.h" 20 #include "content/public/test/test_browser_thread.h"
21 #include "extensions/common/host_id.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
23 using content::BrowserThread; 24 using content::BrowserThread;
24 using extensions::URLPatternSet; 25 using extensions::URLPatternSet;
25 26
26 namespace { 27 namespace {
27 28
28 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { 29 static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
29 int schemes = URLPattern::SCHEME_ALL; 30 int schemes = URLPattern::SCHEME_ALL;
30 extent->AddPattern(URLPattern(schemes, pattern)); 31 extent->AddPattern(URLPattern(schemes, pattern));
31 } 32 }
32 } 33 }
33 34
34 namespace extensions { 35 namespace extensions {
35 36
36 // Test bringing up a script loader on a specific directory, putting a script 37 // Test bringing up a script loader on a specific directory, putting a script
37 // in there, etc. 38 // in there, etc.
38 39
39 class UserScriptLoaderTest : public testing::Test, 40 class ExtensionUserScriptLoaderTest : public testing::Test,
40 public content::NotificationObserver { 41 public content::NotificationObserver {
41 public: 42 public:
42 UserScriptLoaderTest() : shared_memory_(NULL) {} 43 ExtensionUserScriptLoaderTest() : shared_memory_(NULL) {}
43 44
44 void SetUp() override { 45 void SetUp() override {
45 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 46 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
46 47
47 // Register for all user script notifications. 48 // Register for all user script notifications.
48 registrar_.Add(this, 49 registrar_.Add(this,
49 extensions::NOTIFICATION_USER_SCRIPTS_UPDATED, 50 extensions::NOTIFICATION_USER_SCRIPTS_UPDATED,
50 content::NotificationService::AllSources()); 51 content::NotificationService::AllSources());
51 52
52 // UserScriptLoader posts tasks to the file thread so make the current 53 // ExtensionUserScriptLoader posts tasks to the file thread so make the
53 // thread look like one. 54 // current thread look like one.
54 file_thread_.reset(new content::TestBrowserThread( 55 file_thread_.reset(new content::TestBrowserThread(
55 BrowserThread::FILE, base::MessageLoop::current())); 56 BrowserThread::FILE, base::MessageLoop::current()));
56 ui_thread_.reset(new content::TestBrowserThread( 57 ui_thread_.reset(new content::TestBrowserThread(
57 BrowserThread::UI, base::MessageLoop::current())); 58 BrowserThread::UI, base::MessageLoop::current()));
58 } 59 }
59 60
60 void TearDown() override { 61 void TearDown() override {
61 file_thread_.reset(); 62 file_thread_.reset();
62 ui_thread_.reset(); 63 ui_thread_.reset();
63 } 64 }
(...skipping 17 matching lines...) Expand all
81 base::MessageLoopForUI message_loop_; 82 base::MessageLoopForUI message_loop_;
82 83
83 scoped_ptr<content::TestBrowserThread> file_thread_; 84 scoped_ptr<content::TestBrowserThread> file_thread_;
84 scoped_ptr<content::TestBrowserThread> ui_thread_; 85 scoped_ptr<content::TestBrowserThread> ui_thread_;
85 86
86 // Updated to the script shared memory when we get notified. 87 // Updated to the script shared memory when we get notified.
87 base::SharedMemory* shared_memory_; 88 base::SharedMemory* shared_memory_;
88 }; 89 };
89 90
90 // Test that we get notified even when there are no scripts. 91 // Test that we get notified even when there are no scripts.
91 TEST_F(UserScriptLoaderTest, NoScripts) { 92 TEST_F(ExtensionUserScriptLoaderTest, NoScripts) {
92 TestingProfile profile; 93 TestingProfile profile;
93 UserScriptLoader loader(&profile, 94 ExtensionUserScriptLoader loader(
94 std::string() /* owner_extension_id */, 95 &profile,
95 true /* listen_for_extension_system_loaded */); 96 HostID(),
97 true /* listen_for_extension_system_loaded */);
96 loader.StartLoad(); 98 loader.StartLoad();
97 message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 99 message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
98 message_loop_.Run(); 100 message_loop_.Run();
99 101
100 ASSERT_TRUE(shared_memory_ != NULL); 102 ASSERT_TRUE(shared_memory_ != NULL);
101 } 103 }
102 104
103 TEST_F(UserScriptLoaderTest, Parse1) { 105 TEST_F(ExtensionUserScriptLoaderTest, Parse1) {
104 const std::string text( 106 const std::string text(
105 "// This is my awesome script\n" 107 "// This is my awesome script\n"
106 "// It does stuff.\n" 108 "// It does stuff.\n"
107 "// ==UserScript== trailing garbage\n" 109 "// ==UserScript== trailing garbage\n"
108 "// @name foobar script\n" 110 "// @name foobar script\n"
109 "// @namespace http://www.google.com/\n" 111 "// @namespace http://www.google.com/\n"
110 "// @include *mail.google.com*\n" 112 "// @include *mail.google.com*\n"
111 "// \n" 113 "// \n"
112 "// @othergarbage\n" 114 "// @othergarbage\n"
113 "// @include *mail.yahoo.com*\r\n" 115 "// @include *mail.yahoo.com*\r\n"
114 "// @include \t *mail.msn.com*\n" // extra spaces after "@include" OK 116 "// @include \t *mail.msn.com*\n" // extra spaces after "@include" OK
115 "//@include not-recognized\n" // must have one space after "//" 117 "//@include not-recognized\n" // must have one space after "//"
116 "// ==/UserScript== trailing garbage\n" 118 "// ==/UserScript== trailing garbage\n"
117 "\n" 119 "\n"
118 "\n" 120 "\n"
119 "alert('hoo!');\n"); 121 "alert('hoo!');\n");
120 122
121 UserScript script; 123 UserScript script;
122 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 124 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
123 ASSERT_EQ(3U, script.globs().size()); 125 ASSERT_EQ(3U, script.globs().size());
124 EXPECT_EQ("*mail.google.com*", script.globs()[0]); 126 EXPECT_EQ("*mail.google.com*", script.globs()[0]);
125 EXPECT_EQ("*mail.yahoo.com*", script.globs()[1]); 127 EXPECT_EQ("*mail.yahoo.com*", script.globs()[1]);
126 EXPECT_EQ("*mail.msn.com*", script.globs()[2]); 128 EXPECT_EQ("*mail.msn.com*", script.globs()[2]);
127 } 129 }
128 130
129 TEST_F(UserScriptLoaderTest, Parse2) { 131 TEST_F(ExtensionUserScriptLoaderTest, Parse2) {
130 const std::string text("default to @include *"); 132 const std::string text("default to @include *");
131 133
132 UserScript script; 134 UserScript script;
133 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 135 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
134 ASSERT_EQ(1U, script.globs().size()); 136 ASSERT_EQ(1U, script.globs().size());
135 EXPECT_EQ("*", script.globs()[0]); 137 EXPECT_EQ("*", script.globs()[0]);
136 } 138 }
137 139
138 TEST_F(UserScriptLoaderTest, Parse3) { 140 TEST_F(ExtensionUserScriptLoaderTest, Parse3) {
139 const std::string text( 141 const std::string text(
140 "// ==UserScript==\n" 142 "// ==UserScript==\n"
141 "// @include *foo*\n" 143 "// @include *foo*\n"
142 "// ==/UserScript=="); // no trailing newline 144 "// ==/UserScript=="); // no trailing newline
143 145
144 UserScript script; 146 UserScript script;
145 UserScriptLoader::ParseMetadataHeader(text, &script); 147 ExtensionUserScriptLoader::ParseMetadataHeader(text, &script);
146 ASSERT_EQ(1U, script.globs().size()); 148 ASSERT_EQ(1U, script.globs().size());
147 EXPECT_EQ("*foo*", script.globs()[0]); 149 EXPECT_EQ("*foo*", script.globs()[0]);
148 } 150 }
149 151
150 TEST_F(UserScriptLoaderTest, Parse4) { 152 TEST_F(ExtensionUserScriptLoaderTest, Parse4) {
151 const std::string text( 153 const std::string text(
152 "// ==UserScript==\n" 154 "// ==UserScript==\n"
153 "// @match http://*.mail.google.com/*\n" 155 "// @match http://*.mail.google.com/*\n"
154 "// @match \t http://mail.yahoo.com/*\n" 156 "// @match \t http://mail.yahoo.com/*\n"
155 "// ==/UserScript==\n"); 157 "// ==/UserScript==\n");
156 158
157 URLPatternSet expected_patterns; 159 URLPatternSet expected_patterns;
158 AddPattern(&expected_patterns, "http://*.mail.google.com/*"); 160 AddPattern(&expected_patterns, "http://*.mail.google.com/*");
159 AddPattern(&expected_patterns, "http://mail.yahoo.com/*"); 161 AddPattern(&expected_patterns, "http://mail.yahoo.com/*");
160 162
161 UserScript script; 163 UserScript script;
162 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 164 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
163 EXPECT_EQ(0U, script.globs().size()); 165 EXPECT_EQ(0U, script.globs().size());
164 EXPECT_EQ(expected_patterns, script.url_patterns()); 166 EXPECT_EQ(expected_patterns, script.url_patterns());
165 } 167 }
166 168
167 TEST_F(UserScriptLoaderTest, Parse5) { 169 TEST_F(ExtensionUserScriptLoaderTest, Parse5) {
168 const std::string text( 170 const std::string text(
169 "// ==UserScript==\n" 171 "// ==UserScript==\n"
170 "// @match http://*mail.google.com/*\n" 172 "// @match http://*mail.google.com/*\n"
171 "// ==/UserScript==\n"); 173 "// ==/UserScript==\n");
172 174
173 // Invalid @match value. 175 // Invalid @match value.
174 UserScript script; 176 UserScript script;
175 EXPECT_FALSE(UserScriptLoader::ParseMetadataHeader(text, &script)); 177 EXPECT_FALSE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
176 } 178 }
177 179
178 TEST_F(UserScriptLoaderTest, Parse6) { 180 TEST_F(ExtensionUserScriptLoaderTest, Parse6) {
179 const std::string text( 181 const std::string text(
180 "// ==UserScript==\n" 182 "// ==UserScript==\n"
181 "// @include http://*.mail.google.com/*\n" 183 "// @include http://*.mail.google.com/*\n"
182 "// @match \t http://mail.yahoo.com/*\n" 184 "// @match \t http://mail.yahoo.com/*\n"
183 "// ==/UserScript==\n"); 185 "// ==/UserScript==\n");
184 186
185 // Allowed to match @include and @match. 187 // Allowed to match @include and @match.
186 UserScript script; 188 UserScript script;
187 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 189 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
188 } 190 }
189 191
190 TEST_F(UserScriptLoaderTest, Parse7) { 192 TEST_F(ExtensionUserScriptLoaderTest, Parse7) {
191 // Greasemonkey allows there to be any leading text before the comment marker. 193 // Greasemonkey allows there to be any leading text before the comment marker.
192 const std::string text( 194 const std::string text(
193 "// ==UserScript==\n" 195 "// ==UserScript==\n"
194 "adsasdfasf// @name hello\n" 196 "adsasdfasf// @name hello\n"
195 " // @description\twiggity woo\n" 197 " // @description\twiggity woo\n"
196 "\t// @match \t http://mail.yahoo.com/*\n" 198 "\t// @match \t http://mail.yahoo.com/*\n"
197 "// ==/UserScript==\n"); 199 "// ==/UserScript==\n");
198 200
199 UserScript script; 201 UserScript script;
200 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 202 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
201 ASSERT_EQ("hello", script.name()); 203 ASSERT_EQ("hello", script.name());
202 ASSERT_EQ("wiggity woo", script.description()); 204 ASSERT_EQ("wiggity woo", script.description());
203 ASSERT_EQ(1U, script.url_patterns().patterns().size()); 205 ASSERT_EQ(1U, script.url_patterns().patterns().size());
204 EXPECT_EQ("http://mail.yahoo.com/*", 206 EXPECT_EQ("http://mail.yahoo.com/*",
205 script.url_patterns().begin()->GetAsString()); 207 script.url_patterns().begin()->GetAsString());
206 } 208 }
207 209
208 TEST_F(UserScriptLoaderTest, Parse8) { 210 TEST_F(ExtensionUserScriptLoaderTest, Parse8) {
209 const std::string text( 211 const std::string text(
210 "// ==UserScript==\n" 212 "// ==UserScript==\n"
211 "// @name myscript\n" 213 "// @name myscript\n"
212 "// @match http://www.google.com/*\n" 214 "// @match http://www.google.com/*\n"
213 "// @exclude_match http://www.google.com/foo*\n" 215 "// @exclude_match http://www.google.com/foo*\n"
214 "// ==/UserScript==\n"); 216 "// ==/UserScript==\n");
215 217
216 UserScript script; 218 UserScript script;
217 EXPECT_TRUE(UserScriptLoader::ParseMetadataHeader(text, &script)); 219 EXPECT_TRUE(ExtensionUserScriptLoader::ParseMetadataHeader(text, &script));
218 ASSERT_EQ("myscript", script.name()); 220 ASSERT_EQ("myscript", script.name());
219 ASSERT_EQ(1U, script.url_patterns().patterns().size()); 221 ASSERT_EQ(1U, script.url_patterns().patterns().size());
220 EXPECT_EQ("http://www.google.com/*", 222 EXPECT_EQ("http://www.google.com/*",
221 script.url_patterns().begin()->GetAsString()); 223 script.url_patterns().begin()->GetAsString());
222 ASSERT_EQ(1U, script.exclude_url_patterns().patterns().size()); 224 ASSERT_EQ(1U, script.exclude_url_patterns().patterns().size());
223 EXPECT_EQ("http://www.google.com/foo*", 225 EXPECT_EQ("http://www.google.com/foo*",
224 script.exclude_url_patterns().begin()->GetAsString()); 226 script.exclude_url_patterns().begin()->GetAsString());
225 } 227 }
226 228
227 TEST_F(UserScriptLoaderTest, SkipBOMAtTheBeginning) { 229 TEST_F(ExtensionUserScriptLoaderTest, SkipBOMAtTheBeginning) {
228 base::FilePath path = temp_dir_.path().AppendASCII("script.user.js"); 230 base::FilePath path = temp_dir_.path().AppendASCII("script.user.js");
229 const std::string content("\xEF\xBB\xBF alert('hello');"); 231 const std::string content("\xEF\xBB\xBF alert('hello');");
230 size_t written = base::WriteFile(path, content.c_str(), content.size()); 232 size_t written = base::WriteFile(path, content.c_str(), content.size());
231 ASSERT_EQ(written, content.size()); 233 ASSERT_EQ(written, content.size());
232 234
233 UserScript user_script; 235 UserScript user_script;
234 user_script.js_scripts().push_back( 236 user_script.js_scripts().push_back(
235 UserScript::File(temp_dir_.path(), path.BaseName(), GURL())); 237 UserScript::File(temp_dir_.path(), path.BaseName(), GURL()));
236 238
237 UserScriptList user_scripts; 239 UserScriptList user_scripts;
238 user_scripts.push_back(user_script); 240 user_scripts.push_back(user_script);
239 241
240 UserScriptLoader::LoadScriptsForTest(&user_scripts); 242 TestingProfile profile;
243 ExtensionUserScriptLoader loader(
244 &profile,
245 HostID(),
246 true /* listen_for_extension_system_loaded */);
247 loader.LoadScriptsForTest(&user_scripts);
241 248
242 EXPECT_EQ(content.substr(3), 249 EXPECT_EQ(content.substr(3),
243 user_scripts[0].js_scripts()[0].GetContent().as_string()); 250 user_scripts[0].js_scripts()[0].GetContent().as_string());
244 } 251 }
245 252
246 TEST_F(UserScriptLoaderTest, LeaveBOMNotAtTheBeginning) { 253 TEST_F(ExtensionUserScriptLoaderTest, LeaveBOMNotAtTheBeginning) {
247 base::FilePath path = temp_dir_.path().AppendASCII("script.user.js"); 254 base::FilePath path = temp_dir_.path().AppendASCII("script.user.js");
248 const std::string content("alert('here's a BOOM: \xEF\xBB\xBF');"); 255 const std::string content("alert('here's a BOOM: \xEF\xBB\xBF');");
249 size_t written = base::WriteFile(path, content.c_str(), content.size()); 256 size_t written = base::WriteFile(path, content.c_str(), content.size());
250 ASSERT_EQ(written, content.size()); 257 ASSERT_EQ(written, content.size());
251 258
252 UserScript user_script; 259 UserScript user_script;
253 user_script.js_scripts().push_back(UserScript::File( 260 user_script.js_scripts().push_back(UserScript::File(
254 temp_dir_.path(), path.BaseName(), GURL())); 261 temp_dir_.path(), path.BaseName(), GURL()));
255 262
256 UserScriptList user_scripts; 263 UserScriptList user_scripts;
257 user_scripts.push_back(user_script); 264 user_scripts.push_back(user_script);
258 265
259 UserScriptLoader::LoadScriptsForTest(&user_scripts); 266 TestingProfile profile;
267 ExtensionUserScriptLoader loader(
268 &profile,
269 HostID(),
270 true /* listen_for_extension_system_loaded */);
271 loader.LoadScriptsForTest(&user_scripts);
260 272
261 EXPECT_EQ(content, user_scripts[0].js_scripts()[0].GetContent().as_string()); 273 EXPECT_EQ(content, user_scripts[0].js_scripts()[0].GetContent().as_string());
262 } 274 }
263 275
264 } // namespace extensions 276 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_user_script_loader.cc ('k') | chrome/browser/extensions/shared_user_script_master.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698