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

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

Issue 527963003: Uncouple ActiveScriptController from LocationBarController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 <map> 5 #include <map>
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/extensions/active_script_controller.h" 8 #include "chrome/browser/extensions/active_script_controller.h"
9 #include "chrome/browser/extensions/active_tab_permission_granter.h" 9 #include "chrome/browser/extensions/active_tab_permission_granter.h"
10 #include "chrome/browser/extensions/extension_util.h" 10 #include "chrome/browser/extensions/extension_util.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 void ActiveScriptControllerUnitTest::IncrementExecutionCount( 157 void ActiveScriptControllerUnitTest::IncrementExecutionCount(
158 const std::string& extension_id) { 158 const std::string& extension_id) {
159 ++extension_executions_[extension_id]; 159 ++extension_executions_[extension_id];
160 } 160 }
161 161
162 void ActiveScriptControllerUnitTest::SetUp() { 162 void ActiveScriptControllerUnitTest::SetUp() {
163 ChromeRenderViewHostTestHarness::SetUp(); 163 ChromeRenderViewHostTestHarness::SetUp();
164 164
165 TabHelper::CreateForWebContents(web_contents()); 165 TabHelper::CreateForWebContents(web_contents());
166 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents()); 166 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents());
167 // None of these should ever be NULL. 167 // These should never be NULL.
168 DCHECK(tab_helper); 168 DCHECK(tab_helper);
169 DCHECK(tab_helper->location_bar_controller()); 169 active_script_controller_ = tab_helper->active_script_controller();
170 active_script_controller_ =
171 tab_helper->location_bar_controller()->active_script_controller();
172 DCHECK(active_script_controller_); 170 DCHECK(active_script_controller_);
173 } 171 }
174 172
175 // Test that extensions with all_hosts require permission to execute, and, once 173 // Test that extensions with all_hosts require permission to execute, and, once
176 // that permission is granted, do execute. 174 // that permission is granted, do execute.
177 TEST_F(ActiveScriptControllerUnitTest, RequestPermissionAndExecute) { 175 TEST_F(ActiveScriptControllerUnitTest, RequestPermissionAndExecute) {
178 const Extension* extension = AddExtension(); 176 const Extension* extension = AddExtension();
179 ASSERT_TRUE(extension); 177 ASSERT_TRUE(extension);
180 178
181 NavigateAndCommit(GURL("https://www.google.com")); 179 NavigateAndCommit(GURL("https://www.google.com"));
182 180
183 // Ensure that there aren't any executions pending. 181 // Ensure that there aren't any executions pending.
184 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id())); 182 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id()));
185 ASSERT_FALSE(controller()->GetActionForExtension(extension)); 183 ASSERT_FALSE(controller()->WantsToRun(extension));
186 184
187 // Since the extension requests all_hosts, we should require user consent. 185 // Since the extension requests all_hosts, we should require user consent.
188 EXPECT_TRUE(RequiresUserConsent(extension)); 186 EXPECT_TRUE(RequiresUserConsent(extension));
189 187
190 // Request an injection. There should be an action visible, but no executions. 188 // Request an injection. The extension should want to run, but should not have
189 // executed.
191 RequestInjection(extension); 190 RequestInjection(extension);
192 EXPECT_TRUE(controller()->GetActionForExtension(extension)); 191 EXPECT_TRUE(controller()->WantsToRun(extension));
193 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 192 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
194 193
195 // Click to accept the extension executing. 194 // Click to accept the extension executing.
196 controller()->OnClicked(extension); 195 controller()->OnClicked(extension);
197 196
198 // The extension should execute, and the action should go away. 197 // The extension should execute, and the extension shouldn't want to run.
199 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id())); 198 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id()));
200 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 199 EXPECT_FALSE(controller()->WantsToRun(extension));
201 200
202 // Since we already executed on the given page, we shouldn't need permission 201 // Since we already executed on the given page, we shouldn't need permission
203 // for a second time. 202 // for a second time.
204 EXPECT_FALSE(RequiresUserConsent(extension)); 203 EXPECT_FALSE(RequiresUserConsent(extension));
205 204
206 // Reloading and same-origin navigations shouldn't clear those permissions, 205 // Reloading and same-origin navigations shouldn't clear those permissions,
207 // and we shouldn't require user constent again. 206 // and we shouldn't require user constent again.
208 Reload(); 207 Reload();
209 EXPECT_FALSE(RequiresUserConsent(extension)); 208 EXPECT_FALSE(RequiresUserConsent(extension));
210 NavigateAndCommit(GURL("https://www.google.com/foo")); 209 NavigateAndCommit(GURL("https://www.google.com/foo"));
211 EXPECT_FALSE(RequiresUserConsent(extension)); 210 EXPECT_FALSE(RequiresUserConsent(extension));
212 NavigateAndCommit(GURL("https://www.google.com/bar")); 211 NavigateAndCommit(GURL("https://www.google.com/bar"));
213 EXPECT_FALSE(RequiresUserConsent(extension)); 212 EXPECT_FALSE(RequiresUserConsent(extension));
214 213
215 // Cross-origin navigations should clear permissions. 214 // Cross-origin navigations should clear permissions.
216 NavigateAndCommit(GURL("https://otherdomain.google.com")); 215 NavigateAndCommit(GURL("https://otherdomain.google.com"));
217 EXPECT_TRUE(RequiresUserConsent(extension)); 216 EXPECT_TRUE(RequiresUserConsent(extension));
218 217
219 // Grant access. 218 // Grant access.
220 RequestInjection(extension); 219 RequestInjection(extension);
221 controller()->OnClicked(extension); 220 controller()->OnClicked(extension);
222 EXPECT_EQ(2u, GetExecutionCountForExtension(extension->id())); 221 EXPECT_EQ(2u, GetExecutionCountForExtension(extension->id()));
223 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 222 EXPECT_FALSE(controller()->WantsToRun(extension));
224 223
225 // Navigating to another site should also clear the permissions. 224 // Navigating to another site should also clear the permissions.
226 NavigateAndCommit(GURL("https://www.foo.com")); 225 NavigateAndCommit(GURL("https://www.foo.com"));
227 EXPECT_TRUE(RequiresUserConsent(extension)); 226 EXPECT_TRUE(RequiresUserConsent(extension));
228 } 227 }
229 228
230 // Test that injections that are not executed by the time the user navigates are 229 // Test that injections that are not executed by the time the user navigates are
231 // ignored and never execute. 230 // ignored and never execute.
232 TEST_F(ActiveScriptControllerUnitTest, PendingInjectionsRemovedAtNavigation) { 231 TEST_F(ActiveScriptControllerUnitTest, PendingInjectionsRemovedAtNavigation) {
233 const Extension* extension = AddExtension(); 232 const Extension* extension = AddExtension();
234 ASSERT_TRUE(extension); 233 ASSERT_TRUE(extension);
235 234
236 NavigateAndCommit(GURL("https://www.google.com")); 235 NavigateAndCommit(GURL("https://www.google.com"));
237 236
238 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id())); 237 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id()));
239 238
240 // Request an injection. There should be an action visible, but no executions. 239 // Request an injection. The extension should want to run, but not execute.
241 RequestInjection(extension); 240 RequestInjection(extension);
242 EXPECT_TRUE(controller()->GetActionForExtension(extension)); 241 EXPECT_TRUE(controller()->WantsToRun(extension));
243 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 242 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
244 243
245 // Reload. This should remove the pending injection, and we should not 244 // Reload. This should remove the pending injection, and we should not
246 // execute anything. 245 // execute anything.
247 Reload(); 246 Reload();
248 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 247 EXPECT_FALSE(controller()->WantsToRun(extension));
249 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 248 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
250 249
251 // Request and accept a new injection. 250 // Request and accept a new injection.
252 RequestInjection(extension); 251 RequestInjection(extension);
253 controller()->OnClicked(extension); 252 controller()->OnClicked(extension);
254 253
255 // The extension should only have executed once, even though a grand total 254 // The extension should only have executed once, even though a grand total
256 // of two executions were requested. 255 // of two executions were requested.
257 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id())); 256 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id()));
258 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 257 EXPECT_FALSE(controller()->WantsToRun(extension));
259 } 258 }
260 259
261 // Test that queueing multiple pending injections, and then accepting, triggers 260 // Test that queueing multiple pending injections, and then accepting, triggers
262 // them all. 261 // them all.
263 TEST_F(ActiveScriptControllerUnitTest, MultiplePendingInjection) { 262 TEST_F(ActiveScriptControllerUnitTest, MultiplePendingInjection) {
264 const Extension* extension = AddExtension(); 263 const Extension* extension = AddExtension();
265 ASSERT_TRUE(extension); 264 ASSERT_TRUE(extension);
266 NavigateAndCommit(GURL("https://www.google.com")); 265 NavigateAndCommit(GURL("https://www.google.com"));
267 266
268 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id())); 267 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id()));
269 268
270 const size_t kNumInjections = 3u; 269 const size_t kNumInjections = 3u;
271 // Queue multiple pending injections. 270 // Queue multiple pending injections.
272 for (size_t i = 0u; i < kNumInjections; ++i) 271 for (size_t i = 0u; i < kNumInjections; ++i)
273 RequestInjection(extension); 272 RequestInjection(extension);
274 273
275 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 274 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
276 275
277 controller()->OnClicked(extension); 276 controller()->OnClicked(extension);
278 277
279 // All pending injections should have executed. 278 // All pending injections should have executed.
280 EXPECT_EQ(kNumInjections, GetExecutionCountForExtension(extension->id())); 279 EXPECT_EQ(kNumInjections, GetExecutionCountForExtension(extension->id()));
281 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 280 EXPECT_FALSE(controller()->WantsToRun(extension));
282 } 281 }
283 282
284 TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsUseActiveTabPermissions) { 283 TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsUseActiveTabPermissions) {
285 const Extension* extension = AddExtension(); 284 const Extension* extension = AddExtension();
286 NavigateAndCommit(GURL("https://www.google.com")); 285 NavigateAndCommit(GURL("https://www.google.com"));
287 286
288 ActiveTabPermissionGranter* active_tab_permission_granter = 287 ActiveTabPermissionGranter* active_tab_permission_granter =
289 TabHelper::FromWebContents(web_contents()) 288 TabHelper::FromWebContents(web_contents())
290 ->active_tab_permission_granter(); 289 ->active_tab_permission_granter();
291 ASSERT_TRUE(active_tab_permission_granter); 290 ASSERT_TRUE(active_tab_permission_granter);
(...skipping 16 matching lines...) Expand all
308 307
309 // Navigating to a different origin will require user consent again. 308 // Navigating to a different origin will require user consent again.
310 NavigateAndCommit(GURL("https://yahoo.com")); 309 NavigateAndCommit(GURL("https://yahoo.com"));
311 EXPECT_TRUE(RequiresUserConsent(extension)); 310 EXPECT_TRUE(RequiresUserConsent(extension));
312 311
313 // Back to the original origin should also re-require constent. 312 // Back to the original origin should also re-require constent.
314 NavigateAndCommit(GURL("https://www.google.com")); 313 NavigateAndCommit(GURL("https://www.google.com"));
315 EXPECT_TRUE(RequiresUserConsent(extension)); 314 EXPECT_TRUE(RequiresUserConsent(extension));
316 315
317 RequestInjection(extension); 316 RequestInjection(extension);
318 EXPECT_TRUE(controller()->GetActionForExtension(extension)); 317 EXPECT_TRUE(controller()->WantsToRun(extension));
319 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 318 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
320 319
321 // Grant active tab. 320 // Grant active tab.
322 active_tab_permission_granter->GrantIfRequested(extension); 321 active_tab_permission_granter->GrantIfRequested(extension);
323 322
324 // The pending injections should have run since active tab permission was 323 // The pending injections should have run since active tab permission was
325 // granted. 324 // granted.
326 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id())); 325 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id()));
327 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 326 EXPECT_FALSE(controller()->WantsToRun(extension));
328 } 327 }
329 328
330 TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsCanHaveAllUrlsPref) { 329 TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsCanHaveAllUrlsPref) {
331 const Extension* extension = AddExtension(); 330 const Extension* extension = AddExtension();
332 ASSERT_TRUE(extension); 331 ASSERT_TRUE(extension);
333 332
334 NavigateAndCommit(GURL("https://www.google.com")); 333 NavigateAndCommit(GURL("https://www.google.com"));
335 EXPECT_TRUE(RequiresUserConsent(extension)); 334 EXPECT_TRUE(RequiresUserConsent(extension));
336 335
337 // Enable the extension on all urls. 336 // Enable the extension on all urls.
(...skipping 14 matching lines...) Expand all
352 } 351 }
353 352
354 TEST_F(ActiveScriptControllerUnitTest, TestAlwaysRun) { 353 TEST_F(ActiveScriptControllerUnitTest, TestAlwaysRun) {
355 const Extension* extension = AddExtension(); 354 const Extension* extension = AddExtension();
356 ASSERT_TRUE(extension); 355 ASSERT_TRUE(extension);
357 356
358 NavigateAndCommit(GURL("https://www.google.com/?gws_rd=ssl")); 357 NavigateAndCommit(GURL("https://www.google.com/?gws_rd=ssl"));
359 358
360 // Ensure that there aren't any executions pending. 359 // Ensure that there aren't any executions pending.
361 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id())); 360 ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id()));
362 ASSERT_FALSE(controller()->GetActionForExtension(extension)); 361 ASSERT_FALSE(controller()->WantsToRun(extension));
363 362
364 // Since the extension requests all_hosts, we should require user consent. 363 // Since the extension requests all_hosts, we should require user consent.
365 EXPECT_TRUE(RequiresUserConsent(extension)); 364 EXPECT_TRUE(RequiresUserConsent(extension));
366 365
367 // Request an injection. There should be an action visible, but no executions. 366 // Request an injection. The extension should want to run, but not execute.
368 RequestInjection(extension); 367 RequestInjection(extension);
369 EXPECT_TRUE(controller()->GetActionForExtension(extension)); 368 EXPECT_TRUE(controller()->WantsToRun(extension));
370 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); 369 EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id()));
371 370
372 // Allow the extension to always run on this origin. 371 // Allow the extension to always run on this origin.
373 controller()->AlwaysRunOnVisibleOrigin(extension); 372 controller()->AlwaysRunOnVisibleOrigin(extension);
374 373
375 // The extension should execute, and the action should go away. 374 // The extension should execute, and the extension shouldn't want to run.
376 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id())); 375 EXPECT_EQ(1u, GetExecutionCountForExtension(extension->id()));
377 EXPECT_FALSE(controller()->GetActionForExtension(extension)); 376 EXPECT_FALSE(controller()->WantsToRun(extension));
378 377
379 // Since we already executed on the given page, we shouldn't need permission 378 // Since we already executed on the given page, we shouldn't need permission
380 // for a second time. 379 // for a second time.
381 EXPECT_FALSE(RequiresUserConsent(extension)); 380 EXPECT_FALSE(RequiresUserConsent(extension));
382 381
383 // Navigating to another site that hasn't been granted a persisted permission 382 // Navigating to another site that hasn't been granted a persisted permission
384 // should necessitate user consent. 383 // should necessitate user consent.
385 NavigateAndCommit(GURL("https://www.foo.com/bar")); 384 NavigateAndCommit(GURL("https://www.foo.com/bar"));
386 EXPECT_TRUE(RequiresUserConsent(extension)); 385 EXPECT_TRUE(RequiresUserConsent(extension));
387 386
(...skipping 14 matching lines...) Expand all
402 EXPECT_TRUE(RequiresUserConsent(extension)); 401 EXPECT_TRUE(RequiresUserConsent(extension));
403 // Different subdomain... 402 // Different subdomain...
404 NavigateAndCommit(GURL("https://en.google.com/foo/bar")); 403 NavigateAndCommit(GURL("https://en.google.com/foo/bar"));
405 EXPECT_TRUE(RequiresUserConsent(extension)); 404 EXPECT_TRUE(RequiresUserConsent(extension));
406 // Only the "always run" origin should be allowed to run without user consent. 405 // Only the "always run" origin should be allowed to run without user consent.
407 NavigateAndCommit(GURL("https://www.google.com/foo/bar")); 406 NavigateAndCommit(GURL("https://www.google.com/foo/bar"));
408 EXPECT_FALSE(RequiresUserConsent(extension)); 407 EXPECT_FALSE(RequiresUserConsent(extension));
409 } 408 }
410 409
411 } // namespace extensions 410 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698