Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
| 6 #include "chrome/browser/extensions/extension_apitest.h" | 6 #include "chrome/browser/extensions/extension_apitest.h" |
| 7 #include "chrome/browser/extensions/extension_host.h" | 7 #include "chrome/browser/extensions/extension_host.h" |
| 8 #include "chrome/browser/extensions/extension_process_manager.h" | 8 #include "chrome/browser/extensions/extension_process_manager.h" |
| 9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
| 10 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 EXPECT_TRUE(browser()->GetTabContentsAt(2)->render_view_host()->process()-> | 103 EXPECT_TRUE(browser()->GetTabContentsAt(2)->render_view_host()->process()-> |
| 104 is_extension_process()); | 104 is_extension_process()); |
| 105 EXPECT_FALSE(browser()->GetTabContentsAt(2)->web_ui()); | 105 EXPECT_FALSE(browser()->GetTabContentsAt(2)->web_ui()); |
| 106 browser()->NewTab(); | 106 browser()->NewTab(); |
| 107 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path3/empty.html")); | 107 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path3/empty.html")); |
| 108 EXPECT_FALSE(browser()->GetTabContentsAt(3)->render_view_host()->process()-> | 108 EXPECT_FALSE(browser()->GetTabContentsAt(3)->render_view_host()->process()-> |
| 109 is_extension_process()); | 109 is_extension_process()); |
| 110 EXPECT_FALSE(browser()->GetTabContentsAt(3)->web_ui()); | 110 EXPECT_FALSE(browser()->GetTabContentsAt(3)->web_ui()); |
| 111 | 111 |
| 112 // The extension should have opened 3 new tabs. Including the original blank | 112 // The extension should have opened 3 new tabs. Including the original blank |
| 113 // tab, we now have 4 tabs. Two should be part of the extension app, and | 113 // tab, we now have 4 tabs. Because the app_process app has the background |
| 114 // grouped in the same process. | 114 // permission, all of its instances are in the same process. Thus two tabs |
| 115 // should be part of the extension app and grouped in the same process. | |
| 115 ASSERT_EQ(4, browser()->tab_count()); | 116 ASSERT_EQ(4, browser()->tab_count()); |
| 116 RenderViewHost* host = browser()->GetTabContentsAt(1)->render_view_host(); | 117 RenderViewHost* host = browser()->GetTabContentsAt(1)->render_view_host(); |
| 117 | 118 |
| 118 EXPECT_EQ(host->process(), | 119 EXPECT_EQ(host->process(), |
| 119 browser()->GetTabContentsAt(2)->render_view_host()->process()); | 120 browser()->GetTabContentsAt(2)->render_view_host()->process()); |
| 120 EXPECT_NE(host->process(), | 121 EXPECT_NE(host->process(), |
| 121 browser()->GetTabContentsAt(3)->render_view_host()->process()); | 122 browser()->GetTabContentsAt(3)->render_view_host()->process()); |
| 122 | 123 |
| 123 // Now let's do the same using window.open. The same should happen. | 124 // Now let's do the same using window.open. The same should happen. |
| 124 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); | 125 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 147 EXPECT_EQ(host->process(), | 148 EXPECT_EQ(host->process(), |
| 148 browser()->GetTabContentsAt(6)->render_view_host()->process()); | 149 browser()->GetTabContentsAt(6)->render_view_host()->process()); |
| 149 bool windowOpenerValid = false; | 150 bool windowOpenerValid = false; |
| 150 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 151 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| 151 browser()->GetTabContentsAt(6)->render_view_host(), L"", | 152 browser()->GetTabContentsAt(6)->render_view_host(), L"", |
| 152 L"window.domAutomationController.send(window.opener != null)", | 153 L"window.domAutomationController.send(window.opener != null)", |
| 153 &windowOpenerValid)); | 154 &windowOpenerValid)); |
| 154 ASSERT_TRUE(windowOpenerValid); | 155 ASSERT_TRUE(windowOpenerValid); |
| 155 } | 156 } |
| 156 | 157 |
| 158 // Test that hosted apps without the background permission use a process per app | |
| 159 // instance model, such that separate instances are in separate processes. | |
| 160 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessInstances) { | |
| 161 CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 162 switches::kDisablePopupBlocking); | |
| 163 | |
| 164 host_resolver()->AddRule("*", "127.0.0.1"); | |
| 165 ASSERT_TRUE(test_server()->Start()); | |
| 166 | |
| 167 ASSERT_TRUE(LoadExtension( | |
| 168 test_data_dir_.AppendASCII("app_process_instances"))); | |
| 169 | |
| 170 // Open two tabs in the app, one outside it. | |
| 171 GURL base_url = test_server()->GetURL( | |
| 172 "files/extensions/api_test/app_process_instances/"); | |
| 173 | |
| 174 // The app under test acts on URLs whose host is "localhost", | |
| 175 // so the URLs we navigate to must have host "localhost". | |
| 176 GURL::Replacements replace_host; | |
| 177 std::string host_str("localhost"); // must stay in scope with replace_host | |
| 178 replace_host.SetHostStr(host_str); | |
| 179 base_url = base_url.ReplaceComponents(replace_host); | |
| 180 | |
| 181 // Test both opening a URL in a new tab, and opening a tab and then navigating | |
| 182 // it. Either way, app tabs should be considered extension processes, but | |
| 183 // they have no elevated privileges and thus should not have WebUI bindings. | |
| 184 ui_test_utils::NavigateToURLWithDisposition( | |
| 185 browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB, | |
| 186 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
| 187 EXPECT_TRUE(browser()->GetTabContentsAt(1)->render_view_host()->process()-> | |
| 188 is_extension_process()); | |
| 189 EXPECT_FALSE(browser()->GetTabContentsAt(1)->web_ui()); | |
| 190 browser()->NewTab(); | |
| 191 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html")); | |
| 192 EXPECT_TRUE(browser()->GetTabContentsAt(2)->render_view_host()->process()-> | |
| 193 is_extension_process()); | |
| 194 EXPECT_FALSE(browser()->GetTabContentsAt(2)->web_ui()); | |
| 195 | |
| 196 // The extension should have opened 2 new tabs. Including the original blank | |
|
Matt Perry
2011/07/08 22:18:35
the extension didn't open the tabs, we did, right?
Charlie Reis
2011/07/08 22:49:50
Yep. Fixed in the test above as well.
| |
| 197 // tab, we now have 3 tabs. The two app tabs should not be in the same | |
| 198 // process, since they do not have the background permission. (Thus, we want | |
| 199 // to separate them to improve responsiveness.) | |
| 200 ASSERT_EQ(3, browser()->tab_count()); | |
| 201 RenderViewHost* host1 = browser()->GetTabContentsAt(1)->render_view_host(); | |
| 202 RenderViewHost* host2 = browser()->GetTabContentsAt(2)->render_view_host(); | |
| 203 EXPECT_NE(host1->process(), host2->process()); | |
| 204 | |
| 205 // Opening tabs with window.open should keep the page in the opener's process. | |
| 206 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); | |
| 207 WindowOpenHelper(browser(), host1, | |
| 208 base_url.Resolve("path1/empty.html"), true); | |
| 209 WindowOpenHelper(browser(), host2, | |
| 210 base_url.Resolve("path2/empty.html"), true); | |
| 211 } | |
| 212 | |
| 157 // Tests that app process switching works properly in the following scenario: | 213 // Tests that app process switching works properly in the following scenario: |
| 158 // 1. navigate to a page1 in the app | 214 // 1. navigate to a page1 in the app |
| 159 // 2. page1 redirects to a page2 outside the app extent (ie, "/server-redirect") | 215 // 2. page1 redirects to a page2 outside the app extent (ie, "/server-redirect") |
| 160 // 3. page2 redirects back to a page in the app | 216 // 3. page2 redirects back to a page in the app |
| 161 // The final navigation should end up in the app process. | 217 // The final navigation should end up in the app process. |
| 162 // See http://crbug.com/61757 | 218 // See http://crbug.com/61757 |
| 163 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessRedirectBack) { | 219 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessRedirectBack) { |
| 164 CommandLine::ForCurrentProcess()->AppendSwitch( | 220 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 165 switches::kDisablePopupBlocking); | 221 switches::kDisablePopupBlocking); |
| 166 | 222 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 ui_test_utils::WaitForNavigation(&contents->controller()); | 296 ui_test_utils::WaitForNavigation(&contents->controller()); |
| 241 EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process()); | 297 EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process()); |
| 242 | 298 |
| 243 // Disable app and reload via JavaScript. | 299 // Disable app and reload via JavaScript. |
| 244 DisableExtension(app->id()); | 300 DisableExtension(app->id()); |
| 245 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(), | 301 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(), |
| 246 L"", L"location.reload();")); | 302 L"", L"location.reload();")); |
| 247 ui_test_utils::WaitForNavigation(&contents->controller()); | 303 ui_test_utils::WaitForNavigation(&contents->controller()); |
| 248 EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process()); | 304 EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process()); |
| 249 } | 305 } |
| OLD | NEW |