OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <limits> | 7 #include <limits> |
8 #include <memory> | 8 #include <memory> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
13 #include "content/common/frame_messages.h" | |
14 #include "content/public/common/browser_side_navigation_policy.h" | |
13 #include "content/public/common/content_constants.h" | 15 #include "content/public/common/content_constants.h" |
14 #include "content/public/test/mock_render_process_host.h" | 16 #include "content/public/test/mock_render_process_host.h" |
15 #include "content/public/test/test_utils.h" | 17 #include "content/public/test/test_utils.h" |
18 #include "content/test/test_render_frame_host.h" | |
16 #include "content/test/test_render_view_host.h" | 19 #include "content/test/test_render_view_host.h" |
20 #include "content/test/test_web_contents.h" | |
21 #include "third_party/WebKit/public/web/WebSandboxFlags.h" | |
17 | 22 |
18 namespace content { | 23 namespace content { |
19 | 24 |
20 class RenderProcessHostUnitTest : public RenderViewHostTestHarness {}; | 25 class RenderProcessHostUnitTest : public RenderViewHostImplTestHarness {}; |
21 | 26 |
22 // Tests that guest RenderProcessHosts are not considered suitable hosts when | 27 // Tests that guest RenderProcessHosts are not considered suitable hosts when |
23 // searching for RenderProcessHost. | 28 // searching for RenderProcessHost. |
24 TEST_F(RenderProcessHostUnitTest, GuestsAreNotSuitableHosts) { | 29 TEST_F(RenderProcessHostUnitTest, GuestsAreNotSuitableHosts) { |
25 GURL test_url("http://foo.com"); | 30 GURL test_url("http://foo.com"); |
26 | 31 |
27 MockRenderProcessHost guest_host(browser_context()); | 32 MockRenderProcessHost guest_host(browser_context()); |
28 guest_host.set_is_for_guests_only(true); | 33 guest_host.set_is_for_guests_only(true); |
29 | 34 |
30 EXPECT_FALSE(RenderProcessHostImpl::IsSuitableHost( | 35 EXPECT_FALSE(RenderProcessHostImpl::IsSuitableHost( |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 hosts.push_back(base::MakeUnique<MockRenderProcessHost>(browser_context())); | 82 hosts.push_back(base::MakeUnique<MockRenderProcessHost>(browser_context())); |
78 } | 83 } |
79 | 84 |
80 // Verify that the renderer sharing still won't happen. | 85 // Verify that the renderer sharing still won't happen. |
81 GURL test_url("http://foo.com"); | 86 GURL test_url("http://foo.com"); |
82 EXPECT_FALSE(RenderProcessHostImpl::ShouldTryToUseExistingProcessHost( | 87 EXPECT_FALSE(RenderProcessHostImpl::ShouldTryToUseExistingProcessHost( |
83 browser_context(), test_url)); | 88 browser_context(), test_url)); |
84 } | 89 } |
85 #endif | 90 #endif |
86 | 91 |
92 // Tests that RenderProcessHost reuse considers committed sites correctly. | |
93 TEST_F(RenderProcessHostUnitTest, ReuseCommittedSite) { | |
94 const GURL kUrl1("http://foo.com"); | |
95 const GURL kUrl2("http://bar.com"); | |
96 | |
97 // At first, trying to get a RenderProcessHost with the | |
98 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | |
99 scoped_refptr<SiteInstanceImpl> site_instance = | |
100 SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
101 site_instance->set_process_reuse_policy( | |
102 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
103 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
104 | |
105 // Have the main frame navigate to the first url. Getting a RenderProcessHost | |
106 // with the REUSE_PENDING_OR_COMMITTED_SITE policy should now return the | |
Charlie Reis
2017/05/18 00:58:34
nit: Remove extra space after "the"
Same below in
clamy
2017/05/22 16:59:52
Done.
| |
107 // process of the main RFH. | |
108 NavigateAndCommit(kUrl1); | |
109 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
110 site_instance->set_process_reuse_policy( | |
111 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
112 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
113 | |
114 // Navigate away. Getting a RenderProcessHost with the | |
115 // REUSE_PENDING_OR_COMMITTED_SITE policy should again return a new process. | |
116 NavigateAndCommit(kUrl2); | |
117 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
118 site_instance->set_process_reuse_policy( | |
119 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
120 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
121 | |
122 // Now add a subframe that navigates to kUrl1. Getting a RenderProcessHost | |
123 // with the REUSE_PENDING_OR_COMMITTED_SITE policy for kUrl1 should now | |
124 // return the process of the subframe RFH. | |
125 std::string unique_name("uniqueName0"); | |
126 main_test_rfh()->OnCreateChildFrame( | |
127 process()->GetNextRoutingID(), blink::WebTreeScopeType::kDocument, | |
128 std::string(), unique_name, blink::WebSandboxFlags::kNone, | |
129 ParsedFeaturePolicyHeader(), FrameOwnerProperties()); | |
130 TestRenderFrameHost* subframe = static_cast<TestRenderFrameHost*>( | |
131 contents()->GetFrameTree()->root()->child_at(0)->current_frame_host()); | |
132 { | |
133 FrameHostMsg_DidCommitProvisionalLoad_Params params; | |
134 params.nav_entry_id = 0; | |
135 params.frame_unique_name = unique_name; | |
136 params.did_create_new_entry = false; | |
137 params.url = kUrl1; | |
138 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | |
139 params.should_update_history = false; | |
140 params.gesture = NavigationGestureUser; | |
141 params.method = "GET"; | |
142 params.page_state = PageState::CreateFromURL(kUrl1); | |
143 subframe->SendRendererInitiatedNavigationRequest(kUrl1, false); | |
144 subframe->PrepareForCommit(); | |
145 subframe->SendNavigateWithParams(¶ms); | |
146 } | |
147 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
148 site_instance->set_process_reuse_policy( | |
149 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
150 EXPECT_EQ(subframe->GetProcess(), site_instance->GetProcess()); | |
151 } | |
152 | |
153 // Tests that RenderProcessHost will not consider reusing a process that has | |
154 // committed an error page. | |
155 TEST_F(RenderProcessHostUnitTest, DoNotReuseError) { | |
156 const GURL kUrl1("http://foo.com"); | |
157 const GURL kUrl2("http://bar.com"); | |
158 | |
159 // At first, trying to get a RenderProcessHost with the | |
160 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | |
161 scoped_refptr<SiteInstanceImpl> site_instance = | |
162 SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
163 site_instance->set_process_reuse_policy( | |
164 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
165 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
166 | |
167 // Have the main frame navigate to the first url. Getting a RenderProcessHost | |
168 // with the REUSE_PENDING_OR_COMMITTED_SITE policy should now return the | |
169 // process of the main RFH. | |
170 NavigateAndCommit(kUrl1); | |
171 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
172 site_instance->set_process_reuse_policy( | |
173 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
174 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
175 | |
176 // Navigate away. Getting a RenderProcessHost with the | |
177 // REUSE_PENDING_OR_COMMITTED_SITE policy should again return a new process. | |
178 NavigateAndCommit(kUrl2); | |
179 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
180 site_instance->set_process_reuse_policy( | |
181 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
182 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
183 | |
184 // Navigate back and simulate an error. Getting a RenderProcessHost with the | |
185 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | |
186 web_contents()->GetController().GoBack(); | |
187 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | |
188 if (!IsBrowserSideNavigationEnabled()) | |
189 pending_rfh->SimulateNavigationStart(kUrl1); | |
190 pending_rfh->SimulateNavigationError(kUrl1, net::ERR_TIMED_OUT); | |
191 pending_rfh->SimulateNavigationErrorPageCommit(); | |
192 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
193 site_instance->set_process_reuse_policy( | |
194 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
195 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
196 } | |
197 | |
198 // Tests that RenderProcessHost reuse considers navigations correctly. | |
199 TEST_F(RenderProcessHostUnitTest, ReuseNavigationProcess) { | |
200 // This is only applicable to PlzNavigate. | |
201 if (!IsBrowserSideNavigationEnabled()) | |
202 return; | |
203 | |
204 const GURL kUrl1("http://foo.com"); | |
205 const GURL kUrl2("http://bar.com"); | |
206 | |
207 // At first, trying to get a RenderProcessHost with the | |
208 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | |
209 scoped_refptr<SiteInstanceImpl> site_instance = | |
210 SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
211 site_instance->set_process_reuse_policy( | |
212 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
213 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
214 | |
215 // Start a navigation. Now Getting RenderProcessHost with the | |
216 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. | |
217 main_test_rfh()->SimulateNavigationStart(kUrl1); | |
218 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); | |
219 site_instance->set_process_reuse_policy( | |
220 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
221 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
222 | |
223 // Finish the navigation and start a new cross-site one. Getting | |
224 // RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy should | |
225 // return the process of the speculative RenderFrameHost. | |
226 main_test_rfh()->PrepareForCommit(); | |
227 main_test_rfh()->SendNavigate(0, true, kUrl1); | |
228 contents()->GetController().LoadURL(kUrl2, Referrer(), | |
229 ui::PAGE_TRANSITION_TYPED, std::string()); | |
230 main_test_rfh()->SendBeforeUnloadACK(true); | |
231 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); | |
232 site_instance->set_process_reuse_policy( | |
233 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
234 EXPECT_EQ(contents()->GetPendingMainFrame()->GetProcess(), | |
235 site_instance->GetProcess()); | |
236 | |
237 // Remember the process id and cancel the navigation. Getting | |
238 // RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy should | |
239 // no longer return the process of the speculative RenderFrameHost. | |
240 int speculative_process_host_id = | |
241 contents()->GetPendingMainFrame()->GetProcess()->GetID(); | |
242 contents()->GetPendingMainFrame()->SimulateNavigationError(kUrl2, | |
243 net::ERR_ABORTED); | |
244 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); | |
245 site_instance->set_process_reuse_policy( | |
246 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
247 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); | |
248 } | |
249 | |
250 // Tests that RenderProcessHost reuse considers navigations correctly during | |
251 // redirects. | |
252 TEST_F(RenderProcessHostUnitTest, ReuseNavigationProcessRedirects) { | |
253 // This is only applicable to PlzNavigate. | |
254 if (!IsBrowserSideNavigationEnabled()) | |
255 return; | |
256 | |
257 const GURL kUrl("http://foo.com"); | |
258 const GURL kRedirectUrl1("http://foo.com/redirect"); | |
259 const GURL kRedirectUrl2("http://bar.com"); | |
260 | |
261 // At first, trying to get a RenderProcessHost with the | |
262 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | |
263 scoped_refptr<SiteInstanceImpl> site_instance = | |
264 SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | |
265 site_instance->set_process_reuse_policy( | |
266 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
267 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
268 | |
269 // Start a navigation. Now getting RenderProcessHost with the | |
270 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. | |
271 main_test_rfh()->SimulateNavigationStart(kUrl); | |
272 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | |
273 site_instance->set_process_reuse_policy( | |
274 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
275 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
276 | |
277 // Simulate a same-site redirect. Getting RenderProcessHost with the | |
278 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. | |
279 main_test_rfh()->SimulateRedirect(kRedirectUrl1); | |
280 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | |
281 site_instance->set_process_reuse_policy( | |
282 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
283 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
284 | |
285 // Simulate a cross-site redirect. Getting RenderProcessHost with the | |
286 // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current | |
287 // process, whether for the old site or the new site. | |
288 main_test_rfh()->SimulateRedirect(kRedirectUrl2); | |
289 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | |
290 site_instance->set_process_reuse_policy( | |
291 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
292 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
293 site_instance = | |
294 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); | |
295 site_instance->set_process_reuse_policy( | |
296 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
297 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
298 | |
299 // Once the navigation is ready to commit, Getting RenderProcessHost with the | |
300 // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current | |
301 // process for the final site, but not the initial one. | |
302 main_test_rfh()->PrepareForCommit(); | |
303 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | |
304 site_instance->set_process_reuse_policy( | |
305 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
306 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
307 site_instance = | |
308 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); | |
309 site_instance->set_process_reuse_policy( | |
310 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | |
311 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | |
312 } | |
Charlie Reis
2017/05/18 00:58:34
These are great. Should we also add a NTP test in
clamy
2017/05/22 16:59:52
I was thinking of doing this in a follow up patch,
Charlie Reis
2017/05/23 07:29:13
What would that mean for the NTP in the meantime,
clamy
2017/05/23 13:41:15
This patch does not regress the situation in PlzNa
Charlie Reis
2017/05/24 04:50:54
Acknowledged.
| |
313 | |
87 } // namespace content | 314 } // namespace content |
OLD | NEW |