OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include "base/command_line.h" | |
8 #include "base/memory/scoped_vector.h" | 7 #include "base/memory/scoped_vector.h" |
9 #include "base/path_service.h" | 8 #include "base/path_service.h" |
10 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
11 #include "build/build_config.h" | 10 #include "build/build_config.h" |
12 #include "chrome/browser/extensions/extension_apitest.h" | 11 #include "chrome/browser/extensions/extension_apitest.h" |
13 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/ui/browser.h" | 13 #include "chrome/browser/ui/browser.h" |
15 #include "chrome/browser/ui/browser_finder.h" | 14 #include "chrome/browser/ui/browser_finder.h" |
16 #include "chrome/browser/ui/browser_list.h" | 15 #include "chrome/browser/ui/browser_list.h" |
17 #include "chrome/browser/ui/panels/panel_manager.h" | |
18 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 16 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
19 #include "chrome/common/chrome_paths.h" | 17 #include "chrome/common/chrome_paths.h" |
20 #include "chrome/common/chrome_switches.h" | |
21 #include "chrome/test/base/ui_test_utils.h" | 18 #include "chrome/test/base/ui_test_utils.h" |
22 #include "content/public/browser/render_process_host.h" | 19 #include "content/public/browser/render_process_host.h" |
23 #include "content/public/browser/web_contents.h" | 20 #include "content/public/browser/web_contents.h" |
24 #include "content/public/common/result_codes.h" | 21 #include "content/public/common/result_codes.h" |
25 #include "content/public/common/url_constants.h" | 22 #include "content/public/common/url_constants.h" |
26 #include "content/public/test/browser_test_utils.h" | 23 #include "content/public/test/browser_test_utils.h" |
27 #include "extensions/browser/extension_host.h" | 24 #include "extensions/browser/extension_host.h" |
28 #include "extensions/browser/process_manager.h" | 25 #include "extensions/browser/process_manager.h" |
29 #include "extensions/common/constants.h" | 26 #include "extensions/common/constants.h" |
30 #include "extensions/common/extension.h" | 27 #include "extensions/common/extension.h" |
31 #include "extensions/common/switches.h" | |
32 #include "extensions/test/extension_test_message_listener.h" | 28 #include "extensions/test/extension_test_message_listener.h" |
33 #include "extensions/test/result_catcher.h" | 29 #include "extensions/test/result_catcher.h" |
34 #include "net/dns/mock_host_resolver.h" | 30 #include "net/dns/mock_host_resolver.h" |
35 #include "net/test/embedded_test_server/embedded_test_server.h" | 31 #include "net/test/embedded_test_server/embedded_test_server.h" |
36 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
37 | 33 |
38 #if defined(USE_ASH) | 34 #if defined(USE_ASH) |
39 #include "extensions/browser/app_window/app_window_registry.h" | 35 #include "extensions/browser/app_window/app_window_registry.h" |
40 #endif | 36 #endif |
41 | 37 |
42 #if defined(USE_ASH) && defined(OS_CHROMEOS) | |
43 // TODO(stevenjb): Figure out the correct behavior for Ash + Win | |
44 #define USE_ASH_PANELS | |
45 #endif | |
46 | |
47 using content::OpenURLParams; | 38 using content::OpenURLParams; |
48 using content::Referrer; | 39 using content::Referrer; |
49 using content::WebContents; | 40 using content::WebContents; |
50 | 41 |
51 // The test uses the chrome.browserAction.openPopup API, which requires that the | 42 // The test uses the chrome.browserAction.openPopup API, which requires that the |
52 // window can automatically be activated. | 43 // window can automatically be activated. |
53 // See comments at BrowserActionInteractiveTest::ShouldRunPopupTest | 44 // See comments at BrowserActionInteractiveTest::ShouldRunPopupTest |
54 // Fails flakily on all platforms. https://crbug.com/477691 | 45 // Fails flakily on all platforms. https://crbug.com/477691 |
55 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_WindowOpen) { | 46 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_WindowOpen) { |
56 extensions::ResultCatcher catcher; | 47 extensions::ResultCatcher catcher; |
57 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_ | 48 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_ |
58 .AppendASCII("window_open").AppendASCII("spanning"))); | 49 .AppendASCII("window_open").AppendASCII("spanning"))); |
59 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); | 50 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
60 } | 51 } |
61 | 52 |
62 int GetPanelCount(Browser* browser) { | |
63 #if defined(USE_ASH_PANELS) | |
64 return static_cast<int>(extensions::AppWindowRegistry::Get( | |
65 browser->profile())->app_windows().size()); | |
66 #else | |
67 return PanelManager::GetInstance()->num_panels(); | |
68 #endif | |
69 } | |
70 | |
71 bool WaitForTabsAndPopups(Browser* browser, | 53 bool WaitForTabsAndPopups(Browser* browser, |
72 int num_tabs, | 54 int num_tabs, |
73 int num_popups, | 55 int num_popups) { |
74 int num_panels) { | |
75 SCOPED_TRACE( | 56 SCOPED_TRACE( |
76 base::StringPrintf("WaitForTabsAndPopups tabs:%d, popups:%d, panels:%d", | 57 base::StringPrintf("WaitForTabsAndPopups tabs:%d, popups:%d", |
77 num_tabs, num_popups, num_panels)); | 58 num_tabs, num_popups)); |
78 // We start with one tab and one browser already open. | 59 // We start with one tab and one browser already open. |
79 ++num_tabs; | 60 ++num_tabs; |
80 size_t num_browsers = static_cast<size_t>(num_popups) + 1; | 61 size_t num_browsers = static_cast<size_t>(num_popups) + 1; |
81 | 62 |
82 const base::TimeDelta kWaitTime = base::TimeDelta::FromSeconds(10); | 63 const base::TimeDelta kWaitTime = base::TimeDelta::FromSeconds(10); |
83 base::TimeTicks end_time = base::TimeTicks::Now() + kWaitTime; | 64 base::TimeTicks end_time = base::TimeTicks::Now() + kWaitTime; |
84 while (base::TimeTicks::Now() < end_time) { | 65 while (base::TimeTicks::Now() < end_time) { |
85 if (chrome::GetBrowserCount(browser->profile()) == num_browsers && | 66 if (chrome::GetBrowserCount(browser->profile()) == num_browsers && |
86 browser->tab_strip_model()->count() == num_tabs && | 67 browser->tab_strip_model()->count() == num_tabs) |
87 GetPanelCount(browser) == num_panels) | |
88 break; | 68 break; |
89 | 69 |
90 content::RunAllPendingInMessageLoop(); | 70 content::RunAllPendingInMessageLoop(); |
91 } | 71 } |
92 | 72 |
93 EXPECT_EQ(num_browsers, chrome::GetBrowserCount(browser->profile())); | 73 EXPECT_EQ(num_browsers, chrome::GetBrowserCount(browser->profile())); |
94 EXPECT_EQ(num_tabs, browser->tab_strip_model()->count()); | 74 EXPECT_EQ(num_tabs, browser->tab_strip_model()->count()); |
95 EXPECT_EQ(num_panels, GetPanelCount(browser)); | |
96 | 75 |
97 int num_popups_seen = 0; | 76 int num_popups_seen = 0; |
98 for (auto* b : *BrowserList::GetInstance()) { | 77 for (auto* b : *BrowserList::GetInstance()) { |
99 if (b == browser) | 78 if (b == browser) |
100 continue; | 79 continue; |
101 | 80 |
102 EXPECT_TRUE(b->is_type_popup()); | 81 EXPECT_TRUE(b->is_type_popup()); |
103 ++num_popups_seen; | 82 ++num_popups_seen; |
104 } | 83 } |
105 EXPECT_EQ(num_popups, num_popups_seen); | 84 EXPECT_EQ(num_popups, num_popups_seen); |
106 | 85 |
107 return ((num_browsers == chrome::GetBrowserCount(browser->profile())) && | 86 return ((num_browsers == chrome::GetBrowserCount(browser->profile())) && |
108 (num_tabs == browser->tab_strip_model()->count()) && | 87 (num_tabs == browser->tab_strip_model()->count()) && |
109 (num_panels == GetPanelCount(browser)) && | |
110 (num_popups == num_popups_seen)); | 88 (num_popups == num_popups_seen)); |
111 } | 89 } |
112 | 90 |
113 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, BrowserIsApp) { | 91 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, BrowserIsApp) { |
114 host_resolver()->AddRule("a.com", "127.0.0.1"); | 92 host_resolver()->AddRule("a.com", "127.0.0.1"); |
115 ASSERT_TRUE(StartEmbeddedTestServer()); | 93 ASSERT_TRUE(StartEmbeddedTestServer()); |
116 ASSERT_TRUE(LoadExtension( | 94 ASSERT_TRUE(LoadExtension( |
117 test_data_dir_.AppendASCII("window_open").AppendASCII("browser_is_app"))); | 95 test_data_dir_.AppendASCII("window_open").AppendASCII("browser_is_app"))); |
118 | 96 |
119 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 0, 2, 0)); | 97 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 0, 2)); |
120 | 98 |
121 for (auto* b : *BrowserList::GetInstance()) { | 99 for (auto* b : *BrowserList::GetInstance()) { |
122 if (b == browser()) | 100 if (b == browser()) |
123 ASSERT_FALSE(b->is_app()); | 101 ASSERT_FALSE(b->is_app()); |
124 else | 102 else |
125 ASSERT_TRUE(b->is_app()); | 103 ASSERT_TRUE(b->is_app()); |
126 } | 104 } |
127 } | 105 } |
128 | 106 |
129 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupDefault) { | 107 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupDefault) { |
130 ASSERT_TRUE(StartEmbeddedTestServer()); | 108 ASSERT_TRUE(StartEmbeddedTestServer()); |
131 ASSERT_TRUE(LoadExtension( | 109 ASSERT_TRUE(LoadExtension( |
132 test_data_dir_.AppendASCII("window_open").AppendASCII("popup"))); | 110 test_data_dir_.AppendASCII("window_open").AppendASCII("popup"))); |
133 | 111 |
134 const int num_tabs = 1; | 112 const int num_tabs = 1; |
135 const int num_popups = 0; | 113 const int num_popups = 0; |
136 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups, 0)); | 114 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups)); |
137 } | 115 } |
138 | 116 |
139 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupIframe) { | 117 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupIframe) { |
140 ASSERT_TRUE(StartEmbeddedTestServer()); | 118 ASSERT_TRUE(StartEmbeddedTestServer()); |
141 base::FilePath test_data_dir; | 119 base::FilePath test_data_dir; |
142 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); | 120 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); |
143 embedded_test_server()->ServeFilesFromDirectory(test_data_dir); | 121 embedded_test_server()->ServeFilesFromDirectory(test_data_dir); |
144 ASSERT_TRUE(LoadExtension( | 122 ASSERT_TRUE(LoadExtension( |
145 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_iframe"))); | 123 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_iframe"))); |
146 | 124 |
147 const int num_tabs = 1; | 125 const int num_tabs = 1; |
148 const int num_popups = 0; | 126 const int num_popups = 0; |
149 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups, 0)); | 127 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups)); |
150 } | 128 } |
151 | 129 |
152 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupLarge) { | 130 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupLarge) { |
153 ASSERT_TRUE(StartEmbeddedTestServer()); | 131 ASSERT_TRUE(StartEmbeddedTestServer()); |
154 ASSERT_TRUE(LoadExtension( | 132 ASSERT_TRUE(LoadExtension( |
155 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_large"))); | 133 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_large"))); |
156 | 134 |
157 // On other systems this should open a new popup window. | 135 // On other systems this should open a new popup window. |
158 const int num_tabs = 0; | 136 const int num_tabs = 0; |
159 const int num_popups = 1; | 137 const int num_popups = 1; |
160 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups, 0)); | 138 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups)); |
161 } | 139 } |
162 | 140 |
163 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupSmall) { | 141 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowOpenPopupSmall) { |
164 ASSERT_TRUE(StartEmbeddedTestServer()); | 142 ASSERT_TRUE(StartEmbeddedTestServer()); |
165 ASSERT_TRUE(LoadExtension( | 143 ASSERT_TRUE(LoadExtension( |
166 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_small"))); | 144 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_small"))); |
167 | 145 |
168 // On ChromeOS this should open a new panel (acts like a new popup window). | 146 // On ChromeOS this should open a new panel (acts like a new popup window). |
169 // On other systems this should open a new popup window. | 147 // On other systems this should open a new popup window. |
170 const int num_tabs = 0; | 148 const int num_tabs = 0; |
171 const int num_popups = 1; | 149 const int num_popups = 1; |
172 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups, 0)); | 150 EXPECT_TRUE(WaitForTabsAndPopups(browser(), num_tabs, num_popups)); |
173 } | 151 } |
174 | 152 |
175 // Disabled on Windows. Often times out or fails: crbug.com/177530 | 153 // Disabled on Windows. Often times out or fails: crbug.com/177530 |
176 #if defined(OS_WIN) | 154 #if defined(OS_WIN) |
177 #define MAYBE_PopupBlockingExtension DISABLED_PopupBlockingExtension | 155 #define MAYBE_PopupBlockingExtension DISABLED_PopupBlockingExtension |
178 #else | 156 #else |
179 #define MAYBE_PopupBlockingExtension PopupBlockingExtension | 157 #define MAYBE_PopupBlockingExtension PopupBlockingExtension |
180 #endif | 158 #endif |
181 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_PopupBlockingExtension) { | 159 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_PopupBlockingExtension) { |
182 host_resolver()->AddRule("*", "127.0.0.1"); | 160 host_resolver()->AddRule("*", "127.0.0.1"); |
183 ASSERT_TRUE(StartEmbeddedTestServer()); | 161 ASSERT_TRUE(StartEmbeddedTestServer()); |
184 | 162 |
185 ASSERT_TRUE(LoadExtension( | 163 ASSERT_TRUE(LoadExtension( |
186 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking") | 164 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking") |
187 .AppendASCII("extension"))); | 165 .AppendASCII("extension"))); |
188 | 166 |
189 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 5, 3, 0)); | 167 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 5, 3)); |
190 } | 168 } |
191 | 169 |
192 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PopupBlockingHostedApp) { | 170 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PopupBlockingHostedApp) { |
193 host_resolver()->AddRule("*", "127.0.0.1"); | 171 host_resolver()->AddRule("*", "127.0.0.1"); |
194 ASSERT_TRUE(embedded_test_server()->Start()); | 172 ASSERT_TRUE(embedded_test_server()->Start()); |
195 | 173 |
196 ASSERT_TRUE(LoadExtension( | 174 ASSERT_TRUE(LoadExtension( |
197 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking") | 175 test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking") |
198 .AppendASCII("hosted_app"))); | 176 .AppendASCII("hosted_app"))); |
199 | 177 |
(...skipping 13 matching lines...) Expand all Loading... |
213 ->GetURL(popup_app_contents_path + "open_popup.html") | 191 ->GetURL(popup_app_contents_path + "open_popup.html") |
214 .ReplaceComponents(replace_host); | 192 .ReplaceComponents(replace_host); |
215 | 193 |
216 browser()->OpenURL(OpenURLParams( | 194 browser()->OpenURL(OpenURLParams( |
217 open_tab, Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, | 195 open_tab, Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, |
218 false)); | 196 false)); |
219 browser()->OpenURL(OpenURLParams( | 197 browser()->OpenURL(OpenURLParams( |
220 open_popup, Referrer(), NEW_FOREGROUND_TAB, | 198 open_popup, Referrer(), NEW_FOREGROUND_TAB, |
221 ui::PAGE_TRANSITION_TYPED, false)); | 199 ui::PAGE_TRANSITION_TYPED, false)); |
222 | 200 |
223 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 3, 1, 0)); | 201 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 3, 1)); |
224 } | 202 } |
225 | 203 |
226 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowArgumentsOverflow) { | 204 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, WindowArgumentsOverflow) { |
227 ASSERT_TRUE(RunExtensionTest("window_open/argument_overflow")) << message_; | 205 ASSERT_TRUE(RunExtensionTest("window_open/argument_overflow")) << message_; |
228 } | 206 } |
229 | 207 |
230 class WindowOpenPanelDisabledTest : public ExtensionApiTest { | |
231 void SetUpCommandLine(base::CommandLine* command_line) override { | |
232 ExtensionApiTest::SetUpCommandLine(command_line); | |
233 command_line->AppendSwitch(switches::kDisablePanels); | |
234 } | |
235 }; | |
236 | |
237 IN_PROC_BROWSER_TEST_F(WindowOpenPanelDisabledTest, WindowOpenPanelNotEnabled) { | |
238 ASSERT_TRUE(RunExtensionTest("window_open/panel_not_enabled")) << message_; | |
239 } | |
240 | |
241 class WindowOpenPanelTest : public ExtensionApiTest { | |
242 void SetUpCommandLine(base::CommandLine* command_line) override { | |
243 ExtensionApiTest::SetUpCommandLine(command_line); | |
244 command_line->AppendSwitch(switches::kEnablePanels); | |
245 } | |
246 }; | |
247 | |
248 #if defined(USE_ASH_PANELS) | |
249 // On Ash, this currently fails because we're currently opening new panel | |
250 // windows as popup windows instead. | |
251 #define MAYBE_WindowOpenPanel DISABLED_WindowOpenPanel | |
252 #else | |
253 #define MAYBE_WindowOpenPanel WindowOpenPanel | |
254 #endif | |
255 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, MAYBE_WindowOpenPanel) { | |
256 ASSERT_TRUE(RunExtensionTest("window_open/panel")) << message_; | |
257 } | |
258 | |
259 // Test verifying that panel-subframe can use window.open to find | |
260 // background-subframe (see the picture below). In other words, the test | |
261 // verifies that the everything on the picture below stays in the same | |
262 // BrowsingInstance. | |
263 // | |
264 // +-extension background page---+ +-panel-----------------------------+ | |
265 // | | | | | |
266 // | chrome.windows.create( | | +-panel-subframe----------------+ | | |
267 // | 'type':'panel') -------------> | | (foo.com) | | | |
268 // | | | | | | | |
269 // | +-background-subframe-+ | | | w = window.open(..., | | | |
270 // | | (foo.com) | | | | "background-subframe-name") | | | |
271 // | | | <--------------/ | | | |
272 // | +---------------------+ | | +-------------------------------+ | | |
273 // | | | | | |
274 // +-----------------------------+ +-----------------------------------+ | |
275 // | |
276 // See also crbug.com/568357 for more info / context. | |
277 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, BrowsingInstanceTest) { | |
278 host_resolver()->AddRule("*", "127.0.0.1"); | |
279 ASSERT_TRUE(StartEmbeddedTestServer()); | |
280 | |
281 ASSERT_TRUE( | |
282 RunExtensionTestWithArg("window_open/panel_browsing_instance", "panel")) | |
283 << message_; | |
284 } | |
285 | |
286 // Similar to the previous test, but for when panels are disabled. | |
287 IN_PROC_BROWSER_TEST_F(WindowOpenPanelDisabledTest, BrowsingInstanceTest) { | |
288 host_resolver()->AddRule("*", "127.0.0.1"); | |
289 ASSERT_TRUE(StartEmbeddedTestServer()); | |
290 | |
291 ASSERT_TRUE( | |
292 RunExtensionTestWithArg("window_open/panel_browsing_instance", "popup")) | |
293 << message_; | |
294 } | |
295 | |
296 #if defined(USE_ASH_PANELS) || defined(OS_LINUX) | |
297 // On Ash, this currently fails because we're currently opening new panel | |
298 // windows as popup windows instead. | |
299 // We're also failing on Linux-aura due to the panel is not opened in the | |
300 // right origin. | |
301 #define MAYBE_WindowOpenPanelDetached DISABLED_WindowOpenPanelDetached | |
302 #else | |
303 #define MAYBE_WindowOpenPanelDetached WindowOpenPanelDetached | |
304 #endif | |
305 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, MAYBE_WindowOpenPanelDetached) { | |
306 ASSERT_TRUE(RunExtensionTest("window_open/panel_detached")) << message_; | |
307 } | |
308 | |
309 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | |
310 // TODO(erg): Bring up ash http://crbug.com/300084 | |
311 #define MAYBE_CloseNonExtensionPanelsOnUninstall \ | |
312 DISABLED_CloseNonExtensionPanelsOnUninstall | |
313 #else | |
314 #define MAYBE_CloseNonExtensionPanelsOnUninstall \ | |
315 CloseNonExtensionPanelsOnUninstall | |
316 #endif | |
317 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, | |
318 MAYBE_CloseNonExtensionPanelsOnUninstall) { | |
319 #if defined(USE_ASH_PANELS) | |
320 // On Ash, new panel windows open as popup windows instead. | |
321 int num_popups, num_panels; | |
322 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
323 switches::kEnablePanels)) { | |
324 num_popups = 2; | |
325 num_panels = 2; | |
326 } else { | |
327 num_popups = 4; | |
328 num_panels = 0; | |
329 } | |
330 #else | |
331 int num_popups = 2; | |
332 int num_panels = 2; | |
333 #endif | |
334 ASSERT_TRUE(StartEmbeddedTestServer()); | |
335 | |
336 // Setup listeners to wait on strings we expect the extension pages to send. | |
337 std::vector<std::string> test_strings; | |
338 test_strings.push_back("content_tab"); | |
339 if (num_panels) | |
340 test_strings.push_back("content_panel"); | |
341 test_strings.push_back("content_popup"); | |
342 | |
343 ScopedVector<ExtensionTestMessageListener> listeners; | |
344 for (size_t i = 0; i < test_strings.size(); ++i) { | |
345 listeners.push_back( | |
346 new ExtensionTestMessageListener(test_strings[i], false)); | |
347 } | |
348 | |
349 const extensions::Extension* extension = LoadExtension( | |
350 test_data_dir_.AppendASCII("window_open").AppendASCII( | |
351 "close_panels_on_uninstall")); | |
352 ASSERT_TRUE(extension); | |
353 | |
354 // Two tabs. One in extension domain and one in non-extension domain. | |
355 // Two popups - one in extension domain and one in non-extension domain. | |
356 // Two panels - one in extension domain and one in non-extension domain. | |
357 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 2, num_popups, num_panels)); | |
358 | |
359 // Wait on test messages to make sure the pages loaded. | |
360 for (size_t i = 0; i < listeners.size(); ++i) | |
361 ASSERT_TRUE(listeners[i]->WaitUntilSatisfied()); | |
362 | |
363 UninstallExtension(extension->id()); | |
364 | |
365 // Wait for the tabs and popups in non-extension domain to stay open. | |
366 // Expect everything else, including panels, to close. | |
367 num_popups -= 1; | |
368 #if defined(USE_ASH_PANELS) | |
369 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | |
370 switches::kEnablePanels)) { | |
371 // On Ash, new panel windows open as popup windows instead, so there are 2 | |
372 // extension domain popups that will close (instead of 1 popup on non-Ash). | |
373 num_popups -= 1; | |
374 } | |
375 #endif | |
376 #if defined(USE_ASH) | |
377 #if !defined(OS_WIN) | |
378 // On linux ash we close all popup applications when closing its extension. | |
379 num_popups = 0; | |
380 #endif | |
381 #endif | |
382 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 1, num_popups, 0)); | |
383 } | |
384 | |
385 // This test isn't applicable on Chrome OS, which automatically reloads crashed | |
386 // pages. | |
387 #if !defined(OS_CHROMEOS) | |
388 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, ClosePanelsOnExtensionCrash) { | |
389 #if defined(USE_ASH_PANELS) | |
390 // On Ash, new panel windows open as popup windows instead. | |
391 int num_popups = 4; | |
392 int num_panels = 0; | |
393 #else | |
394 int num_popups = 2; | |
395 int num_panels = 2; | |
396 #endif | |
397 ASSERT_TRUE(StartEmbeddedTestServer()); | |
398 | |
399 // Setup listeners to wait on strings we expect the extension pages to send. | |
400 std::vector<std::string> test_strings; | |
401 test_strings.push_back("content_tab"); | |
402 if (num_panels) | |
403 test_strings.push_back("content_panel"); | |
404 test_strings.push_back("content_popup"); | |
405 | |
406 ScopedVector<ExtensionTestMessageListener> listeners; | |
407 for (size_t i = 0; i < test_strings.size(); ++i) { | |
408 listeners.push_back( | |
409 new ExtensionTestMessageListener(test_strings[i], false)); | |
410 } | |
411 | |
412 const extensions::Extension* extension = LoadExtension( | |
413 test_data_dir_.AppendASCII("window_open").AppendASCII( | |
414 "close_panels_on_uninstall")); | |
415 ASSERT_TRUE(extension); | |
416 | |
417 // Two tabs. One in extension domain and one in non-extension domain. | |
418 // Two popups - one in extension domain and one in non-extension domain. | |
419 // Two panels - one in extension domain and one in non-extension domain. | |
420 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 2, num_popups, num_panels)); | |
421 | |
422 // Wait on test messages to make sure the pages loaded. | |
423 for (size_t i = 0; i < listeners.size(); ++i) | |
424 ASSERT_TRUE(listeners[i]->WaitUntilSatisfied()); | |
425 | |
426 // Crash the extension. | |
427 extensions::ExtensionHost* extension_host = | |
428 extensions::ProcessManager::Get(browser()->profile()) | |
429 ->GetBackgroundHostForExtension(extension->id()); | |
430 ASSERT_TRUE(extension_host); | |
431 extension_host->render_process_host()->Shutdown(content::RESULT_CODE_KILLED, | |
432 false); | |
433 WaitForExtensionCrash(extension->id()); | |
434 | |
435 // Only expect panels to close. The rest stay open to show a sad-tab. | |
436 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 2, num_popups, 0)); | |
437 } | |
438 #endif // !defined(OS_CHROMEOS) | |
439 | |
440 #if defined(USE_ASH_PANELS) | |
441 // This test is not applicable on Ash. The modified window.open behavior only | |
442 // applies to non-Ash panel windows. | |
443 #define MAYBE_WindowOpenFromPanel DISABLED_WindowOpenFromPanel | |
444 #else | |
445 #define MAYBE_WindowOpenFromPanel WindowOpenFromPanel | |
446 #endif | |
447 IN_PROC_BROWSER_TEST_F(WindowOpenPanelTest, MAYBE_WindowOpenFromPanel) { | |
448 ASSERT_TRUE(StartEmbeddedTestServer()); | |
449 | |
450 // Load the extension that will open a panel which then calls window.open. | |
451 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("window_open"). | |
452 AppendASCII("panel_window_open"))); | |
453 | |
454 // Expect one panel (opened by extension) and one tab (from the panel calling | |
455 // window.open). Panels modify the WindowOpenDisposition in window.open | |
456 // to always open in a tab. | |
457 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 1, 0, 1)); | |
458 } | |
459 | |
460 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_WindowOpener) { | 208 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_WindowOpener) { |
461 ASSERT_TRUE(RunExtensionTest("window_open/opener")) << message_; | 209 ASSERT_TRUE(RunExtensionTest("window_open/opener")) << message_; |
462 } | 210 } |
463 | 211 |
464 #if defined(OS_MACOSX) | 212 #if defined(OS_MACOSX) |
465 // Extension popup windows are incorrectly sized on OSX, crbug.com/225601 | 213 // Extension popup windows are incorrectly sized on OSX, crbug.com/225601 |
466 #define MAYBE_WindowOpenSized DISABLED_WindowOpenSized | 214 #define MAYBE_WindowOpenSized DISABLED_WindowOpenSized |
467 #else | 215 #else |
468 #define MAYBE_WindowOpenSized WindowOpenSized | 216 #define MAYBE_WindowOpenSized WindowOpenSized |
469 #endif | 217 #endif |
470 // Ensure that the width and height properties of a window opened with | 218 // Ensure that the width and height properties of a window opened with |
471 // chrome.windows.create match the creation parameters. See crbug.com/173831. | 219 // chrome.windows.create match the creation parameters. See crbug.com/173831. |
472 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_WindowOpenSized) { | 220 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_WindowOpenSized) { |
473 ASSERT_TRUE(RunExtensionTest("window_open/window_size")) << message_; | 221 ASSERT_TRUE(RunExtensionTest("window_open/window_size")) << message_; |
474 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 0, 1, 0)); | 222 EXPECT_TRUE(WaitForTabsAndPopups(browser(), 0, 1)); |
475 } | 223 } |
476 | 224 |
477 // Tests that an extension page can call window.open to an extension URL and | 225 // Tests that an extension page can call window.open to an extension URL and |
478 // the new window has extension privileges. | 226 // the new window has extension privileges. |
479 IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, WindowOpenExtension) { | 227 IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, WindowOpenExtension) { |
480 ASSERT_TRUE(LoadExtension( | 228 ASSERT_TRUE(LoadExtension( |
481 test_data_dir_.AppendASCII("uitest").AppendASCII("window_open"))); | 229 test_data_dir_.AppendASCII("uitest").AppendASCII("window_open"))); |
482 | 230 |
483 GURL start_url(std::string(extensions::kExtensionScheme) + | 231 GURL start_url(std::string(extensions::kExtensionScheme) + |
484 url::kStandardSchemeSeparator + | 232 url::kStandardSchemeSeparator + |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 last_loaded_extension_id() + "/newtab.html"), | 278 last_loaded_extension_id() + "/newtab.html"), |
531 false, | 279 false, |
532 &newtab)); | 280 &newtab)); |
533 | 281 |
534 // Extension API should succeed. | 282 // Extension API should succeed. |
535 bool result = false; | 283 bool result = false; |
536 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(newtab, "testExtensionApi()", | 284 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(newtab, "testExtensionApi()", |
537 &result)); | 285 &result)); |
538 EXPECT_TRUE(result); | 286 EXPECT_TRUE(result); |
539 } | 287 } |
OLD | NEW |