OLD | NEW |
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 "base/files/file_path.h" | 5 #include "base/files/file_path.h" |
6 #include "base/macros.h" | 6 #include "base/macros.h" |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "chrome/browser/extensions/active_script_controller.h" | 8 #include "chrome/browser/extensions/active_script_controller.h" |
9 #include "chrome/browser/extensions/extension_action.h" | 9 #include "chrome/browser/extensions/extension_action.h" |
10 #include "chrome/browser/extensions/extension_browsertest.h" | 10 #include "chrome/browser/extensions/extension_browsertest.h" |
11 #include "chrome/browser/extensions/extension_test_message_listener.h" | 11 #include "chrome/browser/extensions/extension_test_message_listener.h" |
12 #include "chrome/browser/extensions/location_bar_controller.h" | |
13 #include "chrome/browser/extensions/tab_helper.h" | 12 #include "chrome/browser/extensions/tab_helper.h" |
14 #include "chrome/browser/extensions/test_extension_dir.h" | 13 #include "chrome/browser/extensions/test_extension_dir.h" |
15 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
16 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
17 #include "chrome/test/base/ui_test_utils.h" | 16 #include "chrome/test/base/ui_test_utils.h" |
18 #include "content/public/test/browser_test_utils.h" | 17 #include "content/public/test/browser_test_utils.h" |
19 #include "extensions/common/feature_switch.h" | 18 #include "extensions/common/feature_switch.h" |
20 #include "extensions/common/switches.h" | 19 #include "extensions/common/switches.h" |
21 #include "net/test/embedded_test_server/embedded_test_server.h" | 20 #include "net/test/embedded_test_server/embedded_test_server.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 ActiveScriptTester(const std::string& name, | 163 ActiveScriptTester(const std::string& name, |
165 const Extension* extension, | 164 const Extension* extension, |
166 Browser* browser, | 165 Browser* browser, |
167 RequiresConsent requires_consent, | 166 RequiresConsent requires_consent, |
168 InjectionType type); | 167 InjectionType type); |
169 ~ActiveScriptTester(); | 168 ~ActiveScriptTester(); |
170 | 169 |
171 testing::AssertionResult Verify(); | 170 testing::AssertionResult Verify(); |
172 | 171 |
173 private: | 172 private: |
174 // Returns the location bar controller, or NULL if one does not exist. | |
175 LocationBarController* GetLocationBarController(); | |
176 | |
177 // Returns the active script controller, or NULL if one does not exist. | 173 // Returns the active script controller, or NULL if one does not exist. |
178 ActiveScriptController* GetActiveScriptController(); | 174 ActiveScriptController* GetActiveScriptController(); |
179 | 175 |
180 // Get the ExtensionAction for this extension, or NULL if one does not exist. | 176 // Returns true if the extension has a pending request with the active script |
181 ExtensionAction* GetAction(); | 177 // controller. |
| 178 bool WantsToRun(); |
182 | 179 |
183 // The name of the extension, and also the message it sends. | 180 // The name of the extension, and also the message it sends. |
184 std::string name_; | 181 std::string name_; |
185 | 182 |
186 // The extension associated with this tester. | 183 // The extension associated with this tester. |
187 const Extension* extension_; | 184 const Extension* extension_; |
188 | 185 |
189 // The browser the tester is running in. | 186 // The browser the tester is running in. |
190 Browser* browser_; | 187 Browser* browser_; |
191 | 188 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 if (!web_contents) | 227 if (!web_contents) |
231 return testing::AssertionFailure() << "No web contents."; | 228 return testing::AssertionFailure() << "No web contents."; |
232 | 229 |
233 // Give the extension plenty of time to inject. | 230 // Give the extension plenty of time to inject. |
234 if (!RunAllPendingInRenderer(web_contents)) | 231 if (!RunAllPendingInRenderer(web_contents)) |
235 return testing::AssertionFailure() << "Could not run pending in renderer."; | 232 return testing::AssertionFailure() << "Could not run pending in renderer."; |
236 | 233 |
237 // Make sure all running tasks are complete. | 234 // Make sure all running tasks are complete. |
238 content::RunAllPendingInMessageLoop(); | 235 content::RunAllPendingInMessageLoop(); |
239 | 236 |
240 LocationBarController* location_bar_controller = GetLocationBarController(); | 237 ActiveScriptController* controller = GetActiveScriptController(); |
241 if (!location_bar_controller) { | |
242 return testing::AssertionFailure() | |
243 << "Could not find location bar controller"; | |
244 } | |
245 | |
246 ActiveScriptController* controller = | |
247 location_bar_controller->active_script_controller(); | |
248 if (!controller) | 238 if (!controller) |
249 return testing::AssertionFailure() << "Could not find controller."; | 239 return testing::AssertionFailure() << "Could not find controller."; |
250 | 240 |
251 ExtensionAction* action = GetAction(); | 241 bool wants_to_run = WantsToRun(); |
252 bool has_action = action != NULL; | |
253 | 242 |
254 // An extension should have an action displayed iff it requires user consent. | 243 // An extension should have an action displayed iff it requires user consent. |
255 if ((requires_consent_ == REQUIRES_CONSENT && !has_action) || | 244 if ((requires_consent_ == REQUIRES_CONSENT && !wants_to_run) || |
256 (requires_consent_ == DOES_NOT_REQUIRE_CONSENT && has_action)) { | 245 (requires_consent_ == DOES_NOT_REQUIRE_CONSENT && wants_to_run)) { |
257 return testing::AssertionFailure() | 246 return testing::AssertionFailure() |
258 << "Improper action status for " << name_ << ": expected " | 247 << "Improper wants to run for " << name_ << ": expected " |
259 << (requires_consent_ == REQUIRES_CONSENT) << ", found " << has_action; | 248 << (requires_consent_ == REQUIRES_CONSENT) << ", found " |
| 249 << wants_to_run; |
260 } | 250 } |
261 | 251 |
262 // If the extension has permission, we should be able to simply wait for it | 252 // If the extension has permission, we should be able to simply wait for it |
263 // to execute. | 253 // to execute. |
264 if (requires_consent_ == DOES_NOT_REQUIRE_CONSENT) { | 254 if (requires_consent_ == DOES_NOT_REQUIRE_CONSENT) { |
265 inject_success_listener_->WaitUntilSatisfied(); | 255 inject_success_listener_->WaitUntilSatisfied(); |
266 return testing::AssertionSuccess(); | 256 return testing::AssertionSuccess(); |
267 } | 257 } |
268 | 258 |
269 // Otherwise, we don't have permission, and have to grant it. Ensure the | 259 // Otherwise, we don't have permission, and have to grant it. Ensure the |
270 // script has *not* already executed. | 260 // script has *not* already executed. |
271 if (inject_success_listener_->was_satisfied()) { | 261 if (inject_success_listener_->was_satisfied()) { |
272 return testing::AssertionFailure() << | 262 return testing::AssertionFailure() << |
273 name_ << "'s script ran without permission."; | 263 name_ << "'s script ran without permission."; |
274 } | 264 } |
275 | 265 |
276 // If we reach this point, we should always have an action. | 266 // If we reach this point, we should always want to run. |
277 DCHECK(action); | 267 DCHECK(wants_to_run); |
278 | 268 |
279 // Grant permission by clicking on the extension action. | 269 // Grant permission by clicking on the extension action. |
280 controller->OnClicked(extension_); | 270 controller->OnClicked(extension_); |
281 | 271 |
282 // Now, the extension should be able to inject the script. | 272 // Now, the extension should be able to inject the script. |
283 inject_success_listener_->WaitUntilSatisfied(); | 273 inject_success_listener_->WaitUntilSatisfied(); |
284 | 274 |
285 // The Action should have disappeared. | 275 // The extension should no longer want to run. |
286 has_action = GetAction() != NULL; | 276 wants_to_run = WantsToRun(); |
287 if (has_action) { | 277 if (wants_to_run) { |
288 return testing::AssertionFailure() | 278 return testing::AssertionFailure() |
289 << "Extension " << name_ << " has lingering action."; | 279 << "Extension " << name_ << " still wants to run after injecting."; |
290 } | 280 } |
291 | 281 |
292 return testing::AssertionSuccess(); | 282 return testing::AssertionSuccess(); |
293 } | 283 } |
294 | 284 |
295 LocationBarController* ActiveScriptTester::GetLocationBarController() { | 285 ActiveScriptController* ActiveScriptTester::GetActiveScriptController() { |
296 content::WebContents* web_contents = | 286 content::WebContents* web_contents = |
297 browser_ ? browser_->tab_strip_model()->GetActiveWebContents() : NULL; | 287 browser_ ? browser_->tab_strip_model()->GetActiveWebContents() : NULL; |
298 | 288 |
299 if (!web_contents) | 289 if (!web_contents) |
300 return NULL; | 290 return NULL; |
301 | 291 |
302 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); | 292 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); |
303 return tab_helper ? tab_helper->location_bar_controller() : NULL; | 293 return tab_helper ? tab_helper->active_script_controller() : NULL; |
304 } | 294 } |
305 | 295 |
306 ActiveScriptController* ActiveScriptTester::GetActiveScriptController() { | 296 bool ActiveScriptTester::WantsToRun() { |
307 LocationBarController* location_bar_controller = GetLocationBarController(); | |
308 return location_bar_controller ? | |
309 location_bar_controller->active_script_controller() : NULL; | |
310 } | |
311 | |
312 ExtensionAction* ActiveScriptTester::GetAction() { | |
313 ActiveScriptController* controller = GetActiveScriptController(); | 297 ActiveScriptController* controller = GetActiveScriptController(); |
314 return controller ? controller->GetActionForExtension(extension_) : NULL; | 298 return controller ? controller->WantsToRun(extension_) : false; |
315 } | 299 } |
316 | 300 |
317 IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, | 301 IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, |
318 ActiveScriptsAreDisplayedAndDelayExecution) { | 302 ActiveScriptsAreDisplayedAndDelayExecution) { |
319 base::FilePath active_script_path = | 303 base::FilePath active_script_path = |
320 test_data_dir_.AppendASCII("active_script"); | 304 test_data_dir_.AppendASCII("active_script"); |
321 | 305 |
322 const char* kExtensionNames[] = { | 306 const char* kExtensionNames[] = { |
323 "inject_scripts_all_hosts", | 307 "inject_scripts_all_hosts", |
324 "inject_scripts_explicit_hosts", | 308 "inject_scripts_explicit_hosts", |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 ASSERT_TRUE(web_contents); | 373 ASSERT_TRUE(web_contents); |
390 ActiveScriptController* active_script_controller = | 374 ActiveScriptController* active_script_controller = |
391 ActiveScriptController::GetForWebContents(web_contents); | 375 ActiveScriptController::GetForWebContents(web_contents); |
392 ASSERT_TRUE(active_script_controller); | 376 ASSERT_TRUE(active_script_controller); |
393 | 377 |
394 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 378 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
395 ui_test_utils::NavigateToURL( | 379 ui_test_utils::NavigateToURL( |
396 browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); | 380 browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); |
397 | 381 |
398 // Both extensions should have pending requests. | 382 // Both extensions should have pending requests. |
399 EXPECT_TRUE(active_script_controller->GetActionForExtension(extension1)); | 383 EXPECT_TRUE(active_script_controller->WantsToRun(extension1)); |
400 EXPECT_TRUE(active_script_controller->GetActionForExtension(extension2)); | 384 EXPECT_TRUE(active_script_controller->WantsToRun(extension2)); |
401 | 385 |
402 // Unload one of the extensions. | 386 // Unload one of the extensions. |
403 UnloadExtension(extension2->id()); | 387 UnloadExtension(extension2->id()); |
404 | 388 |
405 EXPECT_TRUE(RunAllPendingInRenderer(web_contents)); | 389 EXPECT_TRUE(RunAllPendingInRenderer(web_contents)); |
406 | 390 |
407 // We should have pending requests for extension1, but not the removed | 391 // We should have pending requests for extension1, but not the removed |
408 // extension2. | 392 // extension2. |
409 EXPECT_TRUE(active_script_controller->GetActionForExtension(extension1)); | 393 EXPECT_TRUE(active_script_controller->WantsToRun(extension1)); |
410 EXPECT_FALSE(active_script_controller->GetActionForExtension(extension2)); | 394 EXPECT_FALSE(active_script_controller->WantsToRun(extension2)); |
411 | 395 |
412 // We should still be able to run the request for extension1. | 396 // We should still be able to run the request for extension1. |
413 ExtensionTestMessageListener inject_success_listener( | 397 ExtensionTestMessageListener inject_success_listener( |
414 new ExtensionTestMessageListener(kInjectSucceeded, | 398 new ExtensionTestMessageListener(kInjectSucceeded, |
415 false /* won't reply */)); | 399 false /* won't reply */)); |
416 inject_success_listener.set_extension_id(extension1->id()); | 400 inject_success_listener.set_extension_id(extension1->id()); |
417 active_script_controller->OnClicked(extension1); | 401 active_script_controller->OnClicked(extension1); |
418 inject_success_listener.WaitUntilSatisfied(); | 402 inject_success_listener.WaitUntilSatisfied(); |
419 } | 403 } |
420 | 404 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 | 436 |
453 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 437 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
454 ui_test_utils::NavigateToURL( | 438 ui_test_utils::NavigateToURL( |
455 browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); | 439 browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); |
456 | 440 |
457 for (size_t i = 0u; i < arraysize(testers); ++i) | 441 for (size_t i = 0u; i < arraysize(testers); ++i) |
458 EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; | 442 EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; |
459 } | 443 } |
460 | 444 |
461 } // namespace extensions | 445 } // namespace extensions |
OLD | NEW |