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

Side by Side Diff: content/browser/renderer_host/render_view_host_manager_browsertest.cc

Issue 9146028: Define the public interface for content browser SiteInstance. This interface is implemented by th... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 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 | Annotate | Revision Log
OLDNEW
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/file_util.h" 5 #include "base/file_util.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/path_service.h" 7 #include "base/path_service.h"
8 #include "chrome/browser/ui/browser.h" 8 #include "chrome/browser/ui/browser.h"
9 #include "chrome/test/base/in_process_browser_test.h" 9 #include "chrome/test/base/in_process_browser_test.h"
10 #include "chrome/test/base/ui_test_utils.h" 10 #include "chrome/test/base/ui_test_utils.h"
11 #include "content/browser/renderer_host/render_view_host.h" 11 #include "content/browser/renderer_host/render_view_host.h"
12 #include "content/browser/site_instance.h" 12 #include "content/browser/site_instance_impl.h"
13 #include "content/browser/tab_contents/tab_contents.h" 13 #include "content/browser/tab_contents/tab_contents.h"
14 #include "content/public/browser/notification_details.h" 14 #include "content/public/browser/notification_details.h"
15 #include "content/public/browser/notification_observer.h" 15 #include "content/public/browser/notification_observer.h"
16 #include "content/public/browser/notification_registrar.h" 16 #include "content/public/browser/notification_registrar.h"
17 #include "content/public/browser/notification_types.h" 17 #include "content/public/browser/notification_types.h"
18 #include "content/public/browser/render_view_host_observer.h" 18 #include "content/public/browser/render_view_host_observer.h"
19 #include "content/public/common/url_constants.h" 19 #include "content/public/common/url_constants.h"
20 #include "net/base/net_util.h" 20 #include "net/base/net_util.h"
21 #include "net/test/test_server.h" 21 #include "net/test/test_server.h"
22 22
(...skipping 29 matching lines...) Expand all
52 // Load a page with links that open in a new window. 52 // Load a page with links that open in a new window.
53 std::string replacement_path; 53 std::string replacement_path;
54 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 54 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
55 "files/click-noreferrer-links.html", 55 "files/click-noreferrer-links.html",
56 https_server.host_port_pair(), 56 https_server.host_port_pair(),
57 &replacement_path)); 57 &replacement_path));
58 ui_test_utils::NavigateToURL(browser(), 58 ui_test_utils::NavigateToURL(browser(),
59 test_server()->GetURL(replacement_path)); 59 test_server()->GetURL(replacement_path));
60 60
61 // Get the original SiteInstance for later comparison. 61 // Get the original SiteInstance for later comparison.
62 scoped_refptr<SiteInstance> orig_site_instance( 62 scoped_refptr<content::SiteInstance> orig_site_instance(
63 browser()->GetSelectedWebContents()->GetSiteInstance()); 63 browser()->GetSelectedWebContents()->GetSiteInstance());
64 EXPECT_TRUE(orig_site_instance != NULL); 64 EXPECT_TRUE(orig_site_instance != NULL);
65 65
66 // Test clicking a rel=noreferrer + target=blank link. 66 // Test clicking a rel=noreferrer + target=blank link.
67 bool success = false; 67 bool success = false;
68 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 68 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
69 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", 69 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"",
70 L"window.domAutomationController.send(clickNoRefTargetBlankLink());", 70 L"window.domAutomationController.send(clickNoRefTargetBlankLink());",
71 &success)); 71 &success));
72 EXPECT_TRUE(success); 72 EXPECT_TRUE(success);
73 73
74 // Wait for the tab to open. 74 // Wait for the tab to open.
75 if (browser()->tab_count() < 2) 75 if (browser()->tab_count() < 2)
76 ui_test_utils::WaitForNewTab(browser()); 76 ui_test_utils::WaitForNewTab(browser());
77 77
78 // Opens in new tab. 78 // Opens in new tab.
79 EXPECT_EQ(2, browser()->tab_count()); 79 EXPECT_EQ(2, browser()->tab_count());
80 EXPECT_EQ(1, browser()->active_index()); 80 EXPECT_EQ(1, browser()->active_index());
81 EXPECT_EQ("/files/title2.html", 81 EXPECT_EQ("/files/title2.html",
82 browser()->GetSelectedWebContents()->GetURL().path()); 82 browser()->GetSelectedWebContents()->GetURL().path());
83 83
84 // Wait for the cross-site transition in the new tab to finish. 84 // Wait for the cross-site transition in the new tab to finish.
85 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents()); 85 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents());
86 TabContents* tab_contents = static_cast<TabContents*>( 86 TabContents* tab_contents = static_cast<TabContents*>(
87 browser()->GetSelectedWebContents()); 87 browser()->GetSelectedWebContents());
88 EXPECT_FALSE(tab_contents->GetRenderManagerForTesting()-> 88 EXPECT_FALSE(tab_contents->GetRenderManagerForTesting()->
89 pending_render_view_host()); 89 pending_render_view_host());
90 90
91 // Should have a new SiteInstance. 91 // Should have a new SiteInstance.
92 scoped_refptr<SiteInstance> noref_blank_site_instance( 92 scoped_refptr<content::SiteInstance> noref_blank_site_instance(
93 browser()->GetSelectedWebContents()->GetSiteInstance()); 93 browser()->GetSelectedWebContents()->GetSiteInstance());
94 EXPECT_NE(orig_site_instance, noref_blank_site_instance); 94 EXPECT_NE(orig_site_instance, noref_blank_site_instance);
95 } 95 }
96 96
97 // Test for crbug.com/24447. Following a cross-site link with just 97 // Test for crbug.com/24447. Following a cross-site link with just
98 // target=_blank should not create a new SiteInstance. 98 // target=_blank should not create a new SiteInstance.
99 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, 99 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
100 DontSwapProcessWithOnlyTargetBlank) { 100 DontSwapProcessWithOnlyTargetBlank) {
101 // Start two servers with different sites. 101 // Start two servers with different sites.
102 ASSERT_TRUE(test_server()->Start()); 102 ASSERT_TRUE(test_server()->Start());
103 net::TestServer https_server( 103 net::TestServer https_server(
104 net::TestServer::TYPE_HTTPS, 104 net::TestServer::TYPE_HTTPS,
105 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 105 FilePath(FILE_PATH_LITERAL("chrome/test/data")));
106 ASSERT_TRUE(https_server.Start()); 106 ASSERT_TRUE(https_server.Start());
107 107
108 // Load a page with links that open in a new window. 108 // Load a page with links that open in a new window.
109 std::string replacement_path; 109 std::string replacement_path;
110 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 110 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
111 "files/click-noreferrer-links.html", 111 "files/click-noreferrer-links.html",
112 https_server.host_port_pair(), 112 https_server.host_port_pair(),
113 &replacement_path)); 113 &replacement_path));
114 ui_test_utils::NavigateToURL(browser(), 114 ui_test_utils::NavigateToURL(browser(),
115 test_server()->GetURL(replacement_path)); 115 test_server()->GetURL(replacement_path));
116 116
117 // Get the original SiteInstance for later comparison. 117 // Get the original SiteInstance for later comparison.
118 scoped_refptr<SiteInstance> orig_site_instance( 118 scoped_refptr<content::SiteInstance> orig_site_instance(
119 browser()->GetSelectedWebContents()->GetSiteInstance()); 119 browser()->GetSelectedWebContents()->GetSiteInstance());
120 EXPECT_TRUE(orig_site_instance != NULL); 120 EXPECT_TRUE(orig_site_instance != NULL);
121 121
122 // Test clicking a target=blank link. 122 // Test clicking a target=blank link.
123 bool success = false; 123 bool success = false;
124 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 124 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
125 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", 125 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"",
126 L"window.domAutomationController.send(clickTargetBlankLink());", 126 L"window.domAutomationController.send(clickTargetBlankLink());",
127 &success)); 127 &success));
128 EXPECT_TRUE(success); 128 EXPECT_TRUE(success);
129 129
130 // Wait for the tab to open. 130 // Wait for the tab to open.
131 if (browser()->tab_count() < 2) 131 if (browser()->tab_count() < 2)
132 ui_test_utils::WaitForNewTab(browser()); 132 ui_test_utils::WaitForNewTab(browser());
133 133
134 // Opens in new tab. 134 // Opens in new tab.
135 EXPECT_EQ(2, browser()->tab_count()); 135 EXPECT_EQ(2, browser()->tab_count());
136 EXPECT_EQ(1, browser()->active_index()); 136 EXPECT_EQ(1, browser()->active_index());
137 137
138 // Wait for the cross-site transition in the new tab to finish. 138 // Wait for the cross-site transition in the new tab to finish.
139 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents()); 139 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents());
140 EXPECT_EQ("/files/title2.html", 140 EXPECT_EQ("/files/title2.html",
141 browser()->GetSelectedWebContents()->GetURL().path()); 141 browser()->GetSelectedWebContents()->GetURL().path());
142 142
143 // Should have the same SiteInstance. 143 // Should have the same SiteInstance.
144 scoped_refptr<SiteInstance> blank_site_instance( 144 scoped_refptr<content::SiteInstance> blank_site_instance(
145 browser()->GetSelectedWebContents()->GetSiteInstance()); 145 browser()->GetSelectedWebContents()->GetSiteInstance());
146 EXPECT_EQ(orig_site_instance, blank_site_instance); 146 EXPECT_EQ(orig_site_instance, blank_site_instance);
147 } 147 }
148 148
149 // Test for crbug.com/24447. Following a cross-site link with rel=noreferrer 149 // Test for crbug.com/24447. Following a cross-site link with rel=noreferrer
150 // and no target=_blank should not create a new SiteInstance. 150 // and no target=_blank should not create a new SiteInstance.
151 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, 151 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
152 DontSwapProcessWithOnlyRelNoreferrer) { 152 DontSwapProcessWithOnlyRelNoreferrer) {
153 // Start two servers with different sites. 153 // Start two servers with different sites.
154 ASSERT_TRUE(test_server()->Start()); 154 ASSERT_TRUE(test_server()->Start());
155 net::TestServer https_server( 155 net::TestServer https_server(
156 net::TestServer::TYPE_HTTPS, 156 net::TestServer::TYPE_HTTPS,
157 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 157 FilePath(FILE_PATH_LITERAL("chrome/test/data")));
158 ASSERT_TRUE(https_server.Start()); 158 ASSERT_TRUE(https_server.Start());
159 159
160 // Load a page with links that open in a new window. 160 // Load a page with links that open in a new window.
161 std::string replacement_path; 161 std::string replacement_path;
162 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 162 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
163 "files/click-noreferrer-links.html", 163 "files/click-noreferrer-links.html",
164 https_server.host_port_pair(), 164 https_server.host_port_pair(),
165 &replacement_path)); 165 &replacement_path));
166 ui_test_utils::NavigateToURL(browser(), 166 ui_test_utils::NavigateToURL(browser(),
167 test_server()->GetURL(replacement_path)); 167 test_server()->GetURL(replacement_path));
168 168
169 // Get the original SiteInstance for later comparison. 169 // Get the original SiteInstance for later comparison.
170 scoped_refptr<SiteInstance> orig_site_instance( 170 scoped_refptr<content::SiteInstance> orig_site_instance(
171 browser()->GetSelectedWebContents()->GetSiteInstance()); 171 browser()->GetSelectedWebContents()->GetSiteInstance());
172 EXPECT_TRUE(orig_site_instance != NULL); 172 EXPECT_TRUE(orig_site_instance != NULL);
173 173
174 // Test clicking a rel=noreferrer link. 174 // Test clicking a rel=noreferrer link.
175 bool success = false; 175 bool success = false;
176 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 176 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
177 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", 177 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"",
178 L"window.domAutomationController.send(clickNoRefLink());", 178 L"window.domAutomationController.send(clickNoRefLink());",
179 &success)); 179 &success));
180 EXPECT_TRUE(success); 180 EXPECT_TRUE(success);
181 181
182 // Wait for the cross-site transition in the current tab to finish. 182 // Wait for the cross-site transition in the current tab to finish.
183 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents()); 183 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents());
184 184
185 // Opens in same tab. 185 // Opens in same tab.
186 EXPECT_EQ(1, browser()->tab_count()); 186 EXPECT_EQ(1, browser()->tab_count());
187 EXPECT_EQ(0, browser()->active_index()); 187 EXPECT_EQ(0, browser()->active_index());
188 EXPECT_EQ("/files/title2.html", 188 EXPECT_EQ("/files/title2.html",
189 browser()->GetSelectedWebContents()->GetURL().path()); 189 browser()->GetSelectedWebContents()->GetURL().path());
190 190
191 // Should have the same SiteInstance. 191 // Should have the same SiteInstance.
192 scoped_refptr<SiteInstance> noref_site_instance( 192 scoped_refptr<content::SiteInstance> noref_site_instance(
193 browser()->GetSelectedWebContents()->GetSiteInstance()); 193 browser()->GetSelectedWebContents()->GetSiteInstance());
194 EXPECT_EQ(orig_site_instance, noref_site_instance); 194 EXPECT_EQ(orig_site_instance, noref_site_instance);
195 } 195 }
196 196
197 // Test for crbug.com/76666. A cross-site navigation that fails with a 204 197 // Test for crbug.com/76666. A cross-site navigation that fails with a 204
198 // error should not make us ignore future renderer-initiated navigations. 198 // error should not make us ignore future renderer-initiated navigations.
199 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ClickLinkAfter204Error) { 199 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ClickLinkAfter204Error) {
200 // Start two servers with different sites. 200 // Start two servers with different sites.
201 ASSERT_TRUE(test_server()->Start()); 201 ASSERT_TRUE(test_server()->Start());
202 net::TestServer https_server( 202 net::TestServer https_server(
203 net::TestServer::TYPE_HTTPS, 203 net::TestServer::TYPE_HTTPS,
204 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); 204 FilePath(FILE_PATH_LITERAL("chrome/test/data")));
205 ASSERT_TRUE(https_server.Start()); 205 ASSERT_TRUE(https_server.Start());
206 206
207 // Load a page with links that open in a new window. 207 // Load a page with links that open in a new window.
208 // The links will point to the HTTPS server. 208 // The links will point to the HTTPS server.
209 std::string replacement_path; 209 std::string replacement_path;
210 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 210 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
211 "files/click-noreferrer-links.html", 211 "files/click-noreferrer-links.html",
212 https_server.host_port_pair(), 212 https_server.host_port_pair(),
213 &replacement_path)); 213 &replacement_path));
214 ui_test_utils::NavigateToURL(browser(), 214 ui_test_utils::NavigateToURL(browser(),
215 test_server()->GetURL(replacement_path)); 215 test_server()->GetURL(replacement_path));
216 216
217 // Get the original SiteInstance for later comparison. 217 // Get the original SiteInstance for later comparison.
218 scoped_refptr<SiteInstance> orig_site_instance( 218 scoped_refptr<content::SiteInstance> orig_site_instance(
219 browser()->GetSelectedWebContents()->GetSiteInstance()); 219 browser()->GetSelectedWebContents()->GetSiteInstance());
220 EXPECT_TRUE(orig_site_instance != NULL); 220 EXPECT_TRUE(orig_site_instance != NULL);
221 221
222 // Load a cross-site page that fails with a 204 error. 222 // Load a cross-site page that fails with a 204 error.
223 ui_test_utils::NavigateToURL(browser(), https_server.GetURL("nocontent")); 223 ui_test_utils::NavigateToURL(browser(), https_server.GetURL("nocontent"));
224 224
225 // We should still be looking at the normal page. 225 // We should still be looking at the normal page.
226 scoped_refptr<SiteInstance> post_nav_site_instance( 226 scoped_refptr<content::SiteInstance> post_nav_site_instance(
227 browser()->GetSelectedWebContents()->GetSiteInstance()); 227 browser()->GetSelectedWebContents()->GetSiteInstance());
228 EXPECT_EQ(orig_site_instance, post_nav_site_instance); 228 EXPECT_EQ(orig_site_instance, post_nav_site_instance);
229 EXPECT_EQ("/files/click-noreferrer-links.html", 229 EXPECT_EQ("/files/click-noreferrer-links.html",
230 browser()->GetSelectedWebContents()->GetURL().path()); 230 browser()->GetSelectedWebContents()->GetURL().path());
231 231
232 // Renderer-initiated navigations should work. 232 // Renderer-initiated navigations should work.
233 bool success = false; 233 bool success = false;
234 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 234 EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
235 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", 235 browser()->GetSelectedWebContents()->GetRenderViewHost(), L"",
236 L"window.domAutomationController.send(clickNoRefLink());", 236 L"window.domAutomationController.send(clickNoRefLink());",
237 &success)); 237 &success));
238 EXPECT_TRUE(success); 238 EXPECT_TRUE(success);
239 239
240 // Wait for the cross-site transition in the current tab to finish. 240 // Wait for the cross-site transition in the current tab to finish.
241 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents()); 241 ui_test_utils::WaitForLoadStop(browser()->GetSelectedWebContents());
242 242
243 // Opens in same tab. 243 // Opens in same tab.
244 EXPECT_EQ(1, browser()->tab_count()); 244 EXPECT_EQ(1, browser()->tab_count());
245 EXPECT_EQ(0, browser()->active_index()); 245 EXPECT_EQ(0, browser()->active_index());
246 EXPECT_EQ("/files/title2.html", 246 EXPECT_EQ("/files/title2.html",
247 browser()->GetSelectedWebContents()->GetURL().path()); 247 browser()->GetSelectedWebContents()->GetURL().path());
248 248
249 // Should have the same SiteInstance. 249 // Should have the same SiteInstance.
250 scoped_refptr<SiteInstance> noref_site_instance( 250 scoped_refptr<content::SiteInstance> noref_site_instance(
251 browser()->GetSelectedWebContents()->GetSiteInstance()); 251 browser()->GetSelectedWebContents()->GetSiteInstance());
252 EXPECT_EQ(orig_site_instance, noref_site_instance); 252 EXPECT_EQ(orig_site_instance, noref_site_instance);
253 } 253 }
254 254
255 // This class holds onto RenderViewHostObservers for as long as their observed 255 // This class holds onto RenderViewHostObservers for as long as their observed
256 // RenderViewHosts are alive. This allows us to confirm that all hosts have 256 // RenderViewHosts are alive. This allows us to confirm that all hosts have
257 // properly been shutdown. 257 // properly been shutdown.
258 class RenderViewHostObserverArray { 258 class RenderViewHostObserverArray {
259 public: 259 public:
260 ~RenderViewHostObserverArray() { 260 ~RenderViewHostObserverArray() {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 // Now navigate to a different instance so that we swap out again. 330 // Now navigate to a different instance so that we swap out again.
331 ui_test_utils::NavigateToURL(browser(), 331 ui_test_utils::NavigateToURL(browser(),
332 https_server.GetURL("files/title2.html")); 332 https_server.GetURL("files/title2.html"));
333 rvh_observers.AddObserverToRVH(browser()->GetSelectedWebContents()-> 333 rvh_observers.AddObserverToRVH(browser()->GetSelectedWebContents()->
334 GetRenderViewHost()); 334 GetRenderViewHost());
335 335
336 // This used to leak a render view host. 336 // This used to leak a render view host.
337 browser()->CloseTabContents(browser()->GetSelectedWebContents()); 337 browser()->CloseTabContents(browser()->GetSelectedWebContents());
338 EXPECT_EQ(0U, rvh_observers.GetNumObservers()); 338 EXPECT_EQ(0U, rvh_observers.GetNumObservers());
339 } 339 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698