OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/browser.h" | 6 #include "chrome/browser/browser.h" |
| 7 #include "chrome/browser/browser_list.h" |
7 #include "chrome/browser/extensions/extension_apitest.h" | 8 #include "chrome/browser/extensions/extension_apitest.h" |
8 #include "chrome/browser/extensions/extension_host.h" | 9 #include "chrome/browser/extensions/extension_host.h" |
9 #include "chrome/browser/extensions/extension_process_manager.h" | 10 #include "chrome/browser/extensions/extension_process_manager.h" |
10 #include "chrome/browser/profile.h" | 11 #include "chrome/browser/profile.h" |
11 #include "chrome/browser/renderer_host/render_view_host.h" | 12 #include "chrome/browser/renderer_host/render_view_host.h" |
12 #include "chrome/browser/tab_contents/tab_contents.h" | 13 #include "chrome/browser/tab_contents/tab_contents.h" |
13 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
14 #include "chrome/test/ui_test_utils.h" | 15 #include "chrome/test/ui_test_utils.h" |
15 #include "net/base/mock_host_resolver.h" | 16 #include "net/base/mock_host_resolver.h" |
16 | 17 |
17 class AppApiTest : public ExtensionApiTest { | 18 class AppApiTest : public ExtensionApiTest { |
18 }; | 19 }; |
19 | 20 |
20 // Simulates a page calling window.open on an URL, and waits for the navigation. | 21 // Simulates a page calling window.open on an URL, and waits for the navigation. |
21 static void WindowOpenHelper(Browser* browser, | 22 static void WindowOpenHelper(Browser* browser, |
22 RenderViewHost* opener_host, const GURL& url) { | 23 RenderViewHost* opener_host, |
| 24 const GURL& url, |
| 25 bool newtab_process_should_equal_opener) { |
23 bool result = false; | 26 bool result = false; |
24 ui_test_utils::ExecuteJavaScriptAndExtractBool( | 27 ui_test_utils::ExecuteJavaScriptAndExtractBool( |
25 opener_host, L"", | 28 opener_host, L"", |
26 L"window.open('" + UTF8ToWide(url.spec()) + L"');" | 29 L"window.open('" + UTF8ToWide(url.spec()) + L"');" |
27 L"window.domAutomationController.send(true);", | 30 L"window.domAutomationController.send(true);", |
28 &result); | 31 &result); |
29 ASSERT_TRUE(result); | 32 ASSERT_TRUE(result); |
30 | 33 |
31 // Now the current tab should be the new tab. | 34 // The above window.open call is not user-initiated, it will create |
32 TabContents* newtab = browser->GetSelectedTabContents(); | 35 // a popup window instead of a new tab in current window. |
| 36 // Now the active tab in last active window should be the new tab. |
| 37 Browser* last_active_browser = BrowserList::GetLastActive(); |
| 38 EXPECT_TRUE(last_active_browser); |
| 39 TabContents* newtab = last_active_browser->GetSelectedTabContents(); |
| 40 EXPECT_TRUE(newtab); |
33 if (!newtab->controller().GetLastCommittedEntry() || | 41 if (!newtab->controller().GetLastCommittedEntry() || |
34 newtab->controller().GetLastCommittedEntry()->url() != url) | 42 newtab->controller().GetLastCommittedEntry()->url() != url) |
35 ui_test_utils::WaitForNavigation(&newtab->controller()); | 43 ui_test_utils::WaitForNavigation(&newtab->controller()); |
36 EXPECT_EQ(url, newtab->controller().GetLastCommittedEntry()->url()); | 44 EXPECT_EQ(url, newtab->controller().GetLastCommittedEntry()->url()); |
| 45 if (newtab_process_should_equal_opener) |
| 46 EXPECT_EQ(opener_host->process(), newtab->render_view_host()->process()); |
| 47 else |
| 48 EXPECT_NE(opener_host->process(), newtab->render_view_host()->process()); |
37 } | 49 } |
38 | 50 |
39 // Simulates a page navigating itself to an URL, and waits for the navigation. | 51 // Simulates a page navigating itself to an URL, and waits for the navigation. |
40 static void NavigateTabHelper(TabContents* contents, const GURL& url) { | 52 static void NavigateTabHelper(TabContents* contents, const GURL& url) { |
41 bool result = false; | 53 bool result = false; |
42 ui_test_utils::ExecuteJavaScriptAndExtractBool( | 54 ui_test_utils::ExecuteJavaScriptAndExtractBool( |
43 contents->render_view_host(), L"", | 55 contents->render_view_host(), L"", |
44 L"window.addEventListener('unload', function() {" | 56 L"window.addEventListener('unload', function() {" |
45 L" window.domAutomationController.send(true);" | 57 L" window.domAutomationController.send(true);" |
46 L"}, false);" | 58 L"}, false);" |
47 L"window.location = '" + UTF8ToWide(url.spec()) + L"';", | 59 L"window.location = '" + UTF8ToWide(url.spec()) + L"';", |
48 &result); | 60 &result); |
49 ASSERT_TRUE(result); | 61 ASSERT_TRUE(result); |
50 | 62 |
51 if (!contents->controller().GetLastCommittedEntry() || | 63 if (!contents->controller().GetLastCommittedEntry() || |
52 contents->controller().GetLastCommittedEntry()->url() != url) | 64 contents->controller().GetLastCommittedEntry()->url() != url) |
53 ui_test_utils::WaitForNavigation(&contents->controller()); | 65 ui_test_utils::WaitForNavigation(&contents->controller()); |
54 EXPECT_EQ(url, contents->controller().GetLastCommittedEntry()->url()); | 66 EXPECT_EQ(url, contents->controller().GetLastCommittedEntry()->url()); |
55 } | 67 } |
56 | 68 |
57 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) { | 69 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) { |
| 70 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 71 switches::kDisablePopupBlocking); |
| 72 |
58 host_resolver()->AddRule("*", "127.0.0.1"); | 73 host_resolver()->AddRule("*", "127.0.0.1"); |
59 ASSERT_TRUE(test_server()->Start()); | 74 ASSERT_TRUE(test_server()->Start()); |
60 | 75 |
61 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process"))); | 76 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process"))); |
62 | 77 |
63 // Open two tabs in the app, one outside it. | 78 // Open two tabs in the app, one outside it. |
64 GURL base_url("http://localhost:1337/files/extensions/api_test/app_process/"); | 79 GURL base_url("http://localhost:1337/files/extensions/api_test/app_process/"); |
65 browser()->NewTab(); | 80 browser()->NewTab(); |
66 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); | 81 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); |
67 browser()->NewTab(); | 82 browser()->NewTab(); |
68 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html")); | 83 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html")); |
69 browser()->NewTab(); | 84 browser()->NewTab(); |
70 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path3/empty.html")); | 85 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path3/empty.html")); |
71 | 86 |
72 // The extension should have opened 3 new tabs. Including the original blank | 87 // The extension should have opened 3 new tabs. Including the original blank |
73 // tab, we now have 4 tabs. Two should be part of the extension app, and | 88 // tab, we now have 4 tabs. Two should be part of the extension app, and |
74 // grouped in the extension process. | 89 // grouped in the extension process. |
75 ASSERT_EQ(4, browser()->tab_count()); | 90 ASSERT_EQ(4, browser()->tab_count()); |
76 RenderViewHost* host = browser()->GetTabContentsAt(1)->render_view_host(); | 91 RenderViewHost* host = browser()->GetTabContentsAt(1)->render_view_host(); |
77 EXPECT_TRUE(host->is_extension_process()); | 92 EXPECT_TRUE(host->is_extension_process()); |
78 | 93 |
79 EXPECT_EQ(host->process(), | 94 EXPECT_EQ(host->process(), |
80 browser()->GetTabContentsAt(2)->render_view_host()->process()); | 95 browser()->GetTabContentsAt(2)->render_view_host()->process()); |
81 EXPECT_NE(host->process(), | 96 EXPECT_NE(host->process(), |
82 browser()->GetTabContentsAt(3)->render_view_host()->process()); | 97 browser()->GetTabContentsAt(3)->render_view_host()->process()); |
83 | 98 |
84 // Now let's do the same using window.open. The same should happen. | 99 // Now let's do the same using window.open. The same should happen. |
| 100 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile())); |
85 WindowOpenHelper(browser(), host, | 101 WindowOpenHelper(browser(), host, |
86 base_url.Resolve("path1/empty.html")); | 102 base_url.Resolve("path1/empty.html"), true); |
87 WindowOpenHelper(browser(), host, | 103 WindowOpenHelper(browser(), host, |
88 base_url.Resolve("path2/empty.html")); | 104 base_url.Resolve("path2/empty.html"), true); |
89 WindowOpenHelper(browser(), host, | 105 WindowOpenHelper(browser(), host, |
90 base_url.Resolve("path3/empty.html")); | 106 base_url.Resolve("path3/empty.html"), false); |
91 | |
92 ASSERT_EQ(7, browser()->tab_count()); | |
93 EXPECT_EQ(host->process(), | |
94 browser()->GetTabContentsAt(4)->render_view_host()->process()); | |
95 EXPECT_EQ(host->process(), | |
96 browser()->GetTabContentsAt(5)->render_view_host()->process()); | |
97 EXPECT_NE(host->process(), | |
98 browser()->GetTabContentsAt(6)->render_view_host()->process()); | |
99 | 107 |
100 // Now let's have these pages navigate, into or out of the extension web | 108 // Now let's have these pages navigate, into or out of the extension web |
101 // extent. They should switch processes. | 109 // extent. They should switch processes. |
102 const GURL& app_url(base_url.Resolve("path1/empty.html")); | 110 const GURL& app_url(base_url.Resolve("path1/empty.html")); |
103 const GURL& non_app_url(base_url.Resolve("path3/empty.html")); | 111 const GURL& non_app_url(base_url.Resolve("path3/empty.html")); |
104 NavigateTabHelper(browser()->GetTabContentsAt(2), non_app_url); | 112 NavigateTabHelper(browser()->GetTabContentsAt(2), non_app_url); |
105 NavigateTabHelper(browser()->GetTabContentsAt(3), app_url); | 113 NavigateTabHelper(browser()->GetTabContentsAt(3), app_url); |
106 EXPECT_NE(host->process(), | 114 EXPECT_NE(host->process(), |
107 browser()->GetTabContentsAt(2)->render_view_host()->process()); | 115 browser()->GetTabContentsAt(2)->render_view_host()->process()); |
108 EXPECT_EQ(host->process(), | 116 EXPECT_EQ(host->process(), |
109 browser()->GetTabContentsAt(3)->render_view_host()->process()); | 117 browser()->GetTabContentsAt(3)->render_view_host()->process()); |
110 | 118 |
111 // Navigate the non-app tab into the browse extent. It should not enter the | 119 // Navigate the non-app tab into the browse extent. It should not enter the |
112 // app process. | 120 // app process. |
113 // Navigate the app tab into the browse extent. It should stay in the app | 121 // Navigate the app tab into the browse extent. It should stay in the app |
114 // process. | 122 // process. |
115 const GURL& browse_url(base_url.Resolve("path4/empty.html")); | 123 const GURL& browse_url(base_url.Resolve("path4/empty.html")); |
116 NavigateTabHelper(browser()->GetTabContentsAt(2), browse_url); | 124 NavigateTabHelper(browser()->GetTabContentsAt(2), browse_url); |
117 NavigateTabHelper(browser()->GetTabContentsAt(3), browse_url); | 125 NavigateTabHelper(browser()->GetTabContentsAt(3), browse_url); |
118 EXPECT_NE(host->process(), | 126 EXPECT_NE(host->process(), |
119 browser()->GetTabContentsAt(2)->render_view_host()->process()); | 127 browser()->GetTabContentsAt(2)->render_view_host()->process()); |
120 EXPECT_EQ(host->process(), | 128 EXPECT_EQ(host->process(), |
121 browser()->GetTabContentsAt(3)->render_view_host()->process()); | 129 browser()->GetTabContentsAt(3)->render_view_host()->process()); |
122 } | 130 } |
OLD | NEW |