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

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

Issue 2931243002: Unframe chrome://extensions as it's the last (and only) uber item (Closed)
Patch Set: cros tests Created 3 years, 6 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 "base/files/file_path.h" 5 #include "base/files/file_path.h"
6 #include "base/files/file_util.h" 6 #include "base/files/file_util.h"
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/threading/thread_restrictions.h" 9 #include "base/threading/thread_restrictions.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 16 matching lines...) Expand all
27 27
28 namespace OnMessage = api::test::OnMessage; 28 namespace OnMessage = api::test::OnMessage;
29 29
30 namespace { 30 namespace {
31 31
32 // Tests running extension APIs on WebUI. 32 // Tests running extension APIs on WebUI.
33 class ExtensionWebUITest : public ExtensionApiTest { 33 class ExtensionWebUITest : public ExtensionApiTest {
34 protected: 34 protected:
35 testing::AssertionResult RunTest(const char* name, 35 testing::AssertionResult RunTest(const char* name,
36 const GURL& page_url, 36 const GURL& page_url,
37 const GURL& frame_url,
38 bool expected_result) { 37 bool expected_result) {
39 std::string script; 38 std::string script;
40 { 39 {
41 base::ThreadRestrictions::ScopedAllowIO allow_io; 40 base::ThreadRestrictions::ScopedAllowIO allow_io;
42 // Tests are located in chrome/test/data/extensions/webui/$(name). 41 // Tests are located in chrome/test/data/extensions/webui/$(name).
43 base::FilePath path; 42 base::FilePath path;
44 PathService::Get(chrome::DIR_TEST_DATA, &path); 43 PathService::Get(chrome::DIR_TEST_DATA, &path);
45 path = 44 path =
46 path.AppendASCII("extensions").AppendASCII("webui").AppendASCII(name); 45 path.AppendASCII("extensions").AppendASCII("webui").AppendASCII(name);
47 46
48 // Read the test. 47 // Read the test.
49 if (!base::PathExists(path)) 48 if (!base::PathExists(path))
50 return testing::AssertionFailure() << "Couldn't find " << path.value(); 49 return testing::AssertionFailure() << "Couldn't find " << path.value();
51 base::ReadFileToString(path, &script); 50 base::ReadFileToString(path, &script);
52 script = "(function(){'use strict';" + script + "}());"; 51 script = "(function(){'use strict';" + script + "}());";
53 } 52 }
54 53
55 // Run the test. 54 // Run the test.
56 bool actual_result = false; 55 bool actual_result = false;
57 content::RenderFrameHost* webui = NavigateToWebUI(page_url, frame_url); 56 ui_test_utils::NavigateToURL(browser(), page_url);
57 content::RenderFrameHost* webui =
58 browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame();
58 if (!webui) 59 if (!webui)
59 return testing::AssertionFailure() << "Failed to navigate to WebUI"; 60 return testing::AssertionFailure() << "Failed to navigate to WebUI";
60 CHECK(content::ExecuteScriptAndExtractBool(webui, script, &actual_result)); 61 CHECK(content::ExecuteScriptAndExtractBool(webui, script, &actual_result));
61 return (expected_result == actual_result) 62 return (expected_result == actual_result)
62 ? testing::AssertionSuccess() 63 ? testing::AssertionSuccess()
63 : (testing::AssertionFailure() << "Check console output"); 64 : (testing::AssertionFailure() << "Check console output");
64 } 65 }
65 66
66 testing::AssertionResult RunTestOnExtensionsFrame(const char* name) { 67 testing::AssertionResult RunTestOnExtensions(const char* name) {
Devlin 2017/06/13 18:04:21 nit: maybe OnExtensionsPage? OnExtensions sounds
Dan Beam 2017/06/13 18:15:16 Done.
67 // In the current extension WebUI design, the content is actually hosted in 68 return RunTest(name, GURL("chrome://extensions"), true);
68 // an iframe at chrome://extensions-frame.
69 return RunTest(name,
70 GURL("chrome://extensions"),
71 GURL("chrome://extensions-frame"),
72 true); // tests on chrome://extensions-frame should succeed
73 }
74
75 testing::AssertionResult RunTestOnChromeExtensionsFrame(const char* name) {
76 // Like RunTestOnExtensionsFrame, but chrome://extensions is an alias for
77 // chrome://chrome/extensions so test it explicitly.
78 return RunTest(name,
79 GURL("chrome://chrome/extensions"),
80 GURL("chrome://extensions-frame"),
81 true); // tests on chrome://extensions-frame should succeed
82 }
83
84 testing::AssertionResult RunTestOnChromeExtensions(const char* name) {
85 // Despite the extensions page being hosted in an iframe, also test the
86 // top-level chrome://extensions page (which actually loads
87 // chrome://chrome/extensions). In the past there was a bug where top-level
88 // extension WebUI bindings weren't correctly set up.
89 return RunTest(name,
90 GURL("chrome://chrome/extensions"),
91 GURL("chrome://chrome/extensions"),
92 true); // tests on chrome://chrome/extensions should succeed
93 } 69 }
94 70
95 testing::AssertionResult RunTestOnAbout(const char* name) { 71 testing::AssertionResult RunTestOnAbout(const char* name) {
96 // chrome://about is an innocuous page that doesn't have any bindings. 72 // chrome://about is an innocuous page that doesn't have any bindings.
97 // Tests should fail. 73 // Tests should fail.
98 return RunTest(name, 74 return RunTest(name, GURL("chrome://about"), false);
99 GURL("chrome://about"),
100 GURL("chrome://about"),
101 false); // tests on chrome://about should fail
102 }
103
104 private:
105 // Navigates the browser to a WebUI page and returns the RenderFrameHost for
106 // that page.
107 content::RenderFrameHost* NavigateToWebUI(const GURL& page_url,
108 const GURL& frame_url) {
109 ui_test_utils::NavigateToURL(browser(), page_url);
110
111 content::WebContents* active_web_contents =
112 browser()->tab_strip_model()->GetActiveWebContents();
113
114 if (active_web_contents->GetLastCommittedURL() == frame_url)
115 return active_web_contents->GetMainFrame();
116
117 return FrameMatchingPredicate(
118 active_web_contents,
119 base::Bind(&content::FrameHasSourceUrl, frame_url));
120 } 75 }
121 }; 76 };
122 77
123 #if !defined(OS_WIN) // flaky http://crbug.com/530722 78 #if !defined(OS_WIN) // flaky http://crbug.com/530722
124 79
125 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SanityCheckAvailableAPIsInFrame) { 80 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SanityCheckAvailableAPIs) {
126 ASSERT_TRUE(RunTestOnExtensionsFrame("sanity_check_available_apis.js")); 81 ASSERT_TRUE(RunTestOnExtensions("sanity_check_available_apis.js"));
127 }
128
129 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest,
130 SanityCheckAvailableAPIsInChromeFrame) {
131 ASSERT_TRUE(RunTestOnChromeExtensionsFrame("sanity_check_available_apis.js"));
132 }
133
134 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SanityCheckAvailableAPIsInToplevel) {
135 ASSERT_TRUE(RunTestOnChromeExtensions("sanity_check_available_apis.js"));
136 } 82 }
137 83
138 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SanityCheckUnavailableAPIs) { 84 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SanityCheckUnavailableAPIs) {
139 ASSERT_TRUE(RunTestOnAbout("sanity_check_available_apis.js")); 85 ASSERT_TRUE(RunTestOnAbout("sanity_check_available_apis.js"));
140 } 86 }
141 87
142 // Tests chrome.test.sendMessage, which exercises WebUI making a 88 // Tests chrome.test.sendMessage, which exercises WebUI making a
143 // function call and receiving a response. 89 // function call and receiving a response.
144 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SendMessage) { 90 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, SendMessage) {
145 std::unique_ptr<ExtensionTestMessageListener> listener( 91 std::unique_ptr<ExtensionTestMessageListener> listener(
146 new ExtensionTestMessageListener("ping", true)); 92 new ExtensionTestMessageListener("ping", true));
147 93
148 ASSERT_TRUE(RunTestOnExtensionsFrame("send_message.js")); 94 ASSERT_TRUE(RunTestOnExtensions("send_message.js"));
149 95
150 ASSERT_TRUE(listener->WaitUntilSatisfied()); 96 ASSERT_TRUE(listener->WaitUntilSatisfied());
151 listener->Reply("pong"); 97 listener->Reply("pong");
152 98
153 listener.reset(new ExtensionTestMessageListener(false)); 99 listener.reset(new ExtensionTestMessageListener(false));
154 ASSERT_TRUE(listener->WaitUntilSatisfied()); 100 ASSERT_TRUE(listener->WaitUntilSatisfied());
155 EXPECT_EQ("true", listener->message()); 101 EXPECT_EQ("true", listener->message());
156 } 102 }
157 103
158 // Tests chrome.runtime.onMessage, which exercises WebUI registering and 104 // Tests chrome.runtime.onMessage, which exercises WebUI registering and
159 // receiving an event. 105 // receiving an event.
160 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, OnMessage) { 106 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, OnMessage) {
161 ASSERT_TRUE(RunTestOnExtensionsFrame("on_message.js")); 107 ASSERT_TRUE(RunTestOnExtensions("on_message.js"));
162 108
163 OnMessage::Info info; 109 OnMessage::Info info;
164 info.data = "hi"; 110 info.data = "hi";
165 info.last_message = true; 111 info.last_message = true;
166 EventRouter::Get(profile())->BroadcastEvent(base::WrapUnique( 112 EventRouter::Get(profile())->BroadcastEvent(base::WrapUnique(
167 new Event(events::RUNTIME_ON_MESSAGE, OnMessage::kEventName, 113 new Event(events::RUNTIME_ON_MESSAGE, OnMessage::kEventName,
168 OnMessage::Create(info)))); 114 OnMessage::Create(info))));
169 115
170 std::unique_ptr<ExtensionTestMessageListener> listener( 116 std::unique_ptr<ExtensionTestMessageListener> listener(
171 new ExtensionTestMessageListener(false)); 117 new ExtensionTestMessageListener(false));
172 ASSERT_TRUE(listener->WaitUntilSatisfied()); 118 ASSERT_TRUE(listener->WaitUntilSatisfied());
173 EXPECT_EQ("true", listener->message()); 119 EXPECT_EQ("true", listener->message());
174 } 120 }
175 121
176 // Tests chrome.runtime.lastError, which exercises WebUI accessing a property 122 // Tests chrome.runtime.lastError, which exercises WebUI accessing a property
177 // on an API which it doesn't actually have access to. A bindings test really. 123 // on an API which it doesn't actually have access to. A bindings test really.
178 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, RuntimeLastError) { 124 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, RuntimeLastError) {
179 std::unique_ptr<ExtensionTestMessageListener> listener( 125 std::unique_ptr<ExtensionTestMessageListener> listener(
180 new ExtensionTestMessageListener("ping", true)); 126 new ExtensionTestMessageListener("ping", true));
181 127
182 ASSERT_TRUE(RunTestOnExtensionsFrame("runtime_last_error.js")); 128 ASSERT_TRUE(RunTestOnExtensions("runtime_last_error.js"));
183 129
184 ASSERT_TRUE(listener->WaitUntilSatisfied()); 130 ASSERT_TRUE(listener->WaitUntilSatisfied());
185 listener->ReplyWithError("unknown host"); 131 listener->ReplyWithError("unknown host");
186 132
187 listener.reset(new ExtensionTestMessageListener(false)); 133 listener.reset(new ExtensionTestMessageListener(false));
188 ASSERT_TRUE(listener->WaitUntilSatisfied()); 134 ASSERT_TRUE(listener->WaitUntilSatisfied());
189 EXPECT_EQ("true", listener->message()); 135 EXPECT_EQ("true", listener->message());
190 } 136 }
191 137
192 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, CanEmbedExtensionOptions) { 138 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, CanEmbedExtensionOptions) {
193 std::unique_ptr<ExtensionTestMessageListener> listener( 139 std::unique_ptr<ExtensionTestMessageListener> listener(
194 new ExtensionTestMessageListener("ready", true)); 140 new ExtensionTestMessageListener("ready", true));
195 141
196 const Extension* extension = 142 const Extension* extension =
197 LoadExtension(test_data_dir_.AppendASCII("extension_options") 143 LoadExtension(test_data_dir_.AppendASCII("extension_options")
198 .AppendASCII("embed_self")); 144 .AppendASCII("embed_self"));
199 ASSERT_TRUE(extension); 145 ASSERT_TRUE(extension);
200 146
201 ASSERT_TRUE(RunTestOnExtensionsFrame("can_embed_extension_options.js")); 147 ASSERT_TRUE(RunTestOnExtensions("can_embed_extension_options.js"));
202 148
203 ASSERT_TRUE(listener->WaitUntilSatisfied()); 149 ASSERT_TRUE(listener->WaitUntilSatisfied());
204 listener->Reply(extension->id()); 150 listener->Reply(extension->id());
205 listener.reset(new ExtensionTestMessageListener("load", false)); 151 listener.reset(new ExtensionTestMessageListener("load", false));
206 ASSERT_TRUE(listener->WaitUntilSatisfied()); 152 ASSERT_TRUE(listener->WaitUntilSatisfied());
207 } 153 }
208 154
209 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, ReceivesExtensionOptionsOnClose) { 155 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, ReceivesExtensionOptionsOnClose) {
210 std::unique_ptr<ExtensionTestMessageListener> listener( 156 std::unique_ptr<ExtensionTestMessageListener> listener(
211 new ExtensionTestMessageListener("ready", true)); 157 new ExtensionTestMessageListener("ready", true));
212 158
213 const Extension* extension = 159 const Extension* extension =
214 InstallExtension(test_data_dir_.AppendASCII("extension_options") 160 InstallExtension(test_data_dir_.AppendASCII("extension_options")
215 .AppendASCII("close_self"), 1); 161 .AppendASCII("close_self"), 1);
216 ASSERT_TRUE(extension); 162 ASSERT_TRUE(extension);
217 163
218 ASSERT_TRUE( 164 ASSERT_TRUE(RunTestOnExtensions("receives_extension_options_on_close.js"));
219 RunTestOnExtensionsFrame("receives_extension_options_on_close.js"));
220 165
221 ASSERT_TRUE(listener->WaitUntilSatisfied()); 166 ASSERT_TRUE(listener->WaitUntilSatisfied());
222 listener->Reply(extension->id()); 167 listener->Reply(extension->id());
223 listener.reset(new ExtensionTestMessageListener("onclose received", false)); 168 listener.reset(new ExtensionTestMessageListener("onclose received", false));
224 ASSERT_TRUE(listener->WaitUntilSatisfied()); 169 ASSERT_TRUE(listener->WaitUntilSatisfied());
225 } 170 }
226 171
227 // Regression test for crbug.com/414526. 172 // Regression test for crbug.com/414526.
228 // 173 //
229 // Same setup as CanEmbedExtensionOptions but disable the extension before 174 // Same setup as CanEmbedExtensionOptions but disable the extension before
230 // embedding. 175 // embedding.
231 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, EmbedDisabledExtension) { 176 IN_PROC_BROWSER_TEST_F(ExtensionWebUITest, EmbedDisabledExtension) {
232 std::unique_ptr<ExtensionTestMessageListener> listener( 177 std::unique_ptr<ExtensionTestMessageListener> listener(
233 new ExtensionTestMessageListener("ready", true)); 178 new ExtensionTestMessageListener("ready", true));
234 179
235 std::string extension_id; 180 std::string extension_id;
236 { 181 {
237 const Extension* extension = 182 const Extension* extension =
238 LoadExtension(test_data_dir_.AppendASCII("extension_options") 183 LoadExtension(test_data_dir_.AppendASCII("extension_options")
239 .AppendASCII("embed_self")); 184 .AppendASCII("embed_self"));
240 ASSERT_TRUE(extension); 185 ASSERT_TRUE(extension);
241 extension_id = extension->id(); 186 extension_id = extension->id();
242 DisableExtension(extension_id); 187 DisableExtension(extension_id);
243 } 188 }
244 189
245 ASSERT_TRUE(RunTestOnExtensionsFrame("can_embed_extension_options.js")); 190 ASSERT_TRUE(RunTestOnExtensions("can_embed_extension_options.js"));
246 191
247 ASSERT_TRUE(listener->WaitUntilSatisfied()); 192 ASSERT_TRUE(listener->WaitUntilSatisfied());
248 listener->Reply(extension_id); 193 listener->Reply(extension_id);
249 listener.reset(new ExtensionTestMessageListener("createfailed", false)); 194 listener.reset(new ExtensionTestMessageListener("createfailed", false));
250 ASSERT_TRUE(listener->WaitUntilSatisfied()); 195 ASSERT_TRUE(listener->WaitUntilSatisfied());
251 } 196 }
252 197
253 #endif 198 #endif
254 199
255 } // namespace 200 } // namespace
256 201
257 } // namespace extensions 202 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698