OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/macros.h" | |
6 #include "chrome/browser/extensions/active_script_controller.h" | |
7 #include "chrome/browser/extensions/extension_action.h" | |
8 #include "chrome/browser/extensions/extension_browsertest.h" | |
9 #include "chrome/browser/extensions/extension_test_message_listener.h" | |
10 #include "chrome/browser/extensions/location_bar_controller.h" | |
11 #include "chrome/browser/extensions/tab_helper.h" | |
12 #include "chrome/browser/ui/browser.h" | |
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
14 #include "chrome/test/base/ui_test_utils.h" | |
15 #include "extensions/common/feature_switch.h" | |
16 #include "net/test/embedded_test_server/embedded_test_server.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | |
18 | |
19 namespace extensions { | |
20 | |
21 class ActiveScriptControllerBrowserTest : public ExtensionBrowserTest { | |
22 public: | |
23 ActiveScriptControllerBrowserTest() | |
24 : feature_override_(FeatureSwitch::scripts_require_action(), | |
25 FeatureSwitch::OVERRIDE_ENABLED) {} | |
26 private: | |
27 FeatureSwitch::ScopedOverride feature_override_; | |
28 }; | |
29 | |
30 class ActiveScriptTester { | |
31 public: | |
32 ActiveScriptTester(const std::string& name, | |
33 const Extension* extension, | |
34 bool expect_has_action); | |
35 ~ActiveScriptTester(); | |
36 | |
37 testing::AssertionResult Verify(Browser* browser); | |
38 | |
39 private: | |
40 // The name of the extension, and also the message it sends. | |
41 std::string name_; | |
42 | |
43 // The extension associated with this tester. | |
44 const Extension* extension_; | |
45 | |
46 // Whether or not we expect the extension to have an action for script | |
47 // injection. | |
48 bool expect_has_action_; | |
49 | |
50 // All of these extensions should inject a script (either through content | |
51 // scripts or through chrome.tabs.executeScript()) that sends a message with | |
52 // their names (for verification). | |
53 // Be prepared to wait for each extension to inject the script. | |
54 linked_ptr<ExtensionTestMessageListener> listener_; | |
55 }; | |
56 | |
57 ActiveScriptTester::ActiveScriptTester( | |
58 const std::string& name, | |
59 const Extension* extension, | |
60 bool expect_has_action) | |
61 : name_(name), | |
62 extension_(extension), | |
63 expect_has_action_(expect_has_action), | |
64 listener_( | |
65 new ExtensionTestMessageListener(name, false /* won't reply */)) { | |
66 } | |
67 | |
68 ActiveScriptTester::~ActiveScriptTester() { | |
69 } | |
70 | |
71 testing::AssertionResult ActiveScriptTester::Verify(Browser* browser) { | |
72 if (!extension_) | |
73 return testing::AssertionFailure() << "Could not load extension: " << name_; | |
not at google - send to devlin
2014/05/08 23:33:19
what happened to your RETURN_IF_FALSE macro?
Devlin
2014/05/09 00:15:32
I don't wanna just chuck it into a test file. I'l
| |
74 | |
75 listener_->WaitUntilSatisfied(); | |
76 content::WebContents* web_contents = | |
77 browser ? browser->tab_strip_model()->GetActiveWebContents() : NULL; | |
78 | |
79 if (!web_contents) | |
80 return testing::AssertionFailure() << "Could not find web contents."; | |
81 | |
82 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); | |
83 if (!tab_helper) | |
84 return testing::AssertionFailure() << "Could not find tab helper."; | |
85 | |
86 ActiveScriptController* controller = | |
87 tab_helper->location_bar_controller()->active_script_controller(); | |
88 if (!controller) | |
89 return testing::AssertionFailure() << "Could not find controller."; | |
90 | |
91 bool has_action = controller->GetActionForExtension(extension_) != NULL; | |
92 if (expect_has_action_ != has_action) { | |
93 return testing::AssertionFailure() | |
94 << "Improper action status: expected " << expect_has_action_ | |
95 << ", found " << has_action; | |
96 } | |
97 | |
98 return testing::AssertionSuccess(); | |
99 } | |
100 | |
101 | |
102 IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, | |
103 ActiveScriptsAreDisplayed) { | |
104 base::FilePath active_script_path = | |
105 test_data_dir_.AppendASCII("active_script"); | |
106 | |
107 const char* kExtensionNames[] = { | |
108 "content_scripts_all_hosts", | |
109 "inject_scripts_all_hosts", | |
110 "content_scripts_explicit_hosts" | |
111 }; | |
112 | |
113 // First, we load up three extensions: | |
114 // - An extension with a content script that runs on all hosts, | |
115 // - An extension that injects scripts into all hosts, | |
116 // - An extension with a content script that runs on explicit hosts. | |
117 ActiveScriptTester testers[] = { | |
118 ActiveScriptTester( | |
119 kExtensionNames[0], | |
120 LoadExtension(active_script_path.AppendASCII(kExtensionNames[0])), | |
121 true /* expect action */), | |
122 ActiveScriptTester( | |
123 kExtensionNames[1], | |
124 LoadExtension(active_script_path.AppendASCII(kExtensionNames[1])), | |
125 true /* expect action */), | |
126 ActiveScriptTester( | |
127 kExtensionNames[2], | |
128 LoadExtension(active_script_path.AppendASCII(kExtensionNames[2])), | |
129 false /* expect action */) | |
130 }; | |
131 | |
132 // Navigate to an URL (which matches the explicit host specified in the | |
133 // extension content_scripts_explicit_hosts). All three extensions should | |
134 // inject the script. | |
135 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
136 ui_test_utils::NavigateToURL( | |
137 browser(), | |
138 embedded_test_server()->GetURL("/extensions/test_file.html")); | |
139 | |
140 for (size_t i = 0u; i < arraysize(testers); ++i) | |
141 ASSERT_TRUE(testers[i].Verify(browser())) << kExtensionNames[i]; | |
142 } | |
143 | |
144 } // namespace extensions | |
OLD | NEW |