| 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 "base/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
| 6 #include "content/browser/browser_thread_impl.h" | 6 #include "content/browser/browser_thread_impl.h" |
| 7 #include "content/browser/browser_url_handler.h" | 7 #include "content/browser/browser_url_handler.h" |
| 8 #include "content/browser/mock_content_browser_client.h" | 8 #include "content/browser/mock_content_browser_client.h" |
| 9 #include "content/browser/renderer_host/test_render_view_host.h" | 9 #include "content/browser/renderer_host/test_render_view_host.h" |
| 10 #include "content/browser/site_instance_impl.h" | 10 #include "content/browser/site_instance_impl.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 controller().LoadURL( | 143 controller().LoadURL( |
| 144 url, content::Referrer(), content::PAGE_TRANSITION_LINK, std::string()); | 144 url, content::Referrer(), content::PAGE_TRANSITION_LINK, std::string()); |
| 145 TestRenderViewHost* old_rvh = rvh(); | 145 TestRenderViewHost* old_rvh = rvh(); |
| 146 | 146 |
| 147 // Simulate the ShouldClose_ACK that is received from the current renderer | 147 // Simulate the ShouldClose_ACK that is received from the current renderer |
| 148 // for a cross-site navigation. | 148 // for a cross-site navigation. |
| 149 if (old_rvh != active_rvh()) | 149 if (old_rvh != active_rvh()) |
| 150 old_rvh->SendShouldCloseACK(true); | 150 old_rvh->SendShouldCloseACK(true); |
| 151 | 151 |
| 152 // Commit the navigation with a new page ID. | 152 // Commit the navigation with a new page ID. |
| 153 int32 max_page_id = | 153 int32 max_page_id = contents()->GetMaxPageIDForSiteInstance( |
| 154 contents()->GetMaxPageIDForSiteInstance(active_rvh()->site_instance()); | 154 active_rvh()->GetSiteInstance()); |
| 155 active_rvh()->SendNavigate(max_page_id + 1, url); | 155 active_rvh()->SendNavigate(max_page_id + 1, url); |
| 156 | 156 |
| 157 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation | 157 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation |
| 158 // without making any network requests. | 158 // without making any network requests. |
| 159 if (old_rvh != active_rvh()) | 159 if (old_rvh != active_rvh()) |
| 160 old_rvh->OnSwapOutACK(); | 160 old_rvh->OnSwapOutACK(); |
| 161 } | 161 } |
| 162 | 162 |
| 163 bool ShouldSwapProcesses(RenderViewHostManager* manager, | 163 bool ShouldSwapProcesses(RenderViewHostManager* manager, |
| 164 const NavigationEntryImpl* cur_entry, | 164 const NavigationEntryImpl* cur_entry, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 std::string()); | 205 std::string()); |
| 206 EXPECT_TRUE(contents2.cross_navigation_pending()); | 206 EXPECT_TRUE(contents2.cross_navigation_pending()); |
| 207 TestRenderViewHost* dest_rvh2 = static_cast<TestRenderViewHost*>( | 207 TestRenderViewHost* dest_rvh2 = static_cast<TestRenderViewHost*>( |
| 208 contents2.GetRenderManagerForTesting()->pending_render_view_host()); | 208 contents2.GetRenderManagerForTesting()->pending_render_view_host()); |
| 209 ASSERT_TRUE(dest_rvh2); | 209 ASSERT_TRUE(dest_rvh2); |
| 210 ntp_rvh2->SendShouldCloseACK(true); | 210 ntp_rvh2->SendShouldCloseACK(true); |
| 211 dest_rvh2->SendNavigate(101, kDestUrl); | 211 dest_rvh2->SendNavigate(101, kDestUrl); |
| 212 ntp_rvh2->OnSwapOutACK(); | 212 ntp_rvh2->OnSwapOutACK(); |
| 213 | 213 |
| 214 // The two RVH's should be different in every way. | 214 // The two RVH's should be different in every way. |
| 215 EXPECT_NE(active_rvh()->process(), dest_rvh2->process()); | 215 EXPECT_NE(active_rvh()->GetProcess(), dest_rvh2->GetProcess()); |
| 216 EXPECT_NE(active_rvh()->site_instance(), dest_rvh2->site_instance()); | 216 EXPECT_NE(active_rvh()->GetSiteInstance(), dest_rvh2->GetSiteInstance()); |
| 217 EXPECT_NE(static_cast<SiteInstanceImpl*>(active_rvh()->site_instance())-> | 217 EXPECT_NE(static_cast<SiteInstanceImpl*>(active_rvh()->GetSiteInstance())-> |
| 218 browsing_instance_, | 218 browsing_instance_, |
| 219 static_cast<SiteInstanceImpl*>(dest_rvh2->site_instance())-> | 219 static_cast<SiteInstanceImpl*>(dest_rvh2->GetSiteInstance())-> |
| 220 browsing_instance_); | 220 browsing_instance_); |
| 221 | 221 |
| 222 // Navigate both to the new tab page, and verify that they share a | 222 // Navigate both to the new tab page, and verify that they share a |
| 223 // SiteInstance. | 223 // SiteInstance. |
| 224 NavigateActiveAndCommit(kNtpUrl); | 224 NavigateActiveAndCommit(kNtpUrl); |
| 225 | 225 |
| 226 contents2.GetController().LoadURL( | 226 contents2.GetController().LoadURL( |
| 227 kNtpUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, | 227 kNtpUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 228 std::string()); | 228 std::string()); |
| 229 dest_rvh2->SendShouldCloseACK(true); | 229 dest_rvh2->SendShouldCloseACK(true); |
| 230 static_cast<TestRenderViewHost*>(contents2.GetRenderManagerForTesting()-> | 230 static_cast<TestRenderViewHost*>(contents2.GetRenderManagerForTesting()-> |
| 231 pending_render_view_host())->SendNavigate(102, kNtpUrl); | 231 pending_render_view_host())->SendNavigate(102, kNtpUrl); |
| 232 dest_rvh2->OnSwapOutACK(); | 232 dest_rvh2->OnSwapOutACK(); |
| 233 | 233 |
| 234 EXPECT_EQ(active_rvh()->site_instance(), | 234 EXPECT_EQ(active_rvh()->GetSiteInstance(), |
| 235 contents2.GetRenderViewHost()->site_instance()); | 235 contents2.GetRenderViewHost()->GetSiteInstance()); |
| 236 } | 236 } |
| 237 | 237 |
| 238 // Ensure that the browser ignores most IPC messages that arrive from a | 238 // Ensure that the browser ignores most IPC messages that arrive from a |
| 239 // RenderViewHost that has been swapped out. We do not want to take | 239 // RenderViewHost that has been swapped out. We do not want to take |
| 240 // action on requests from a non-active renderer. The main exception is | 240 // action on requests from a non-active renderer. The main exception is |
| 241 // for synchronous messages, which cannot be ignored without leaving the | 241 // for synchronous messages, which cannot be ignored without leaving the |
| 242 // renderer in a stuck state. See http://crbug.com/93427. | 242 // renderer in a stuck state. See http://crbug.com/93427. |
| 243 TEST_F(RenderViewHostManagerTest, FilterMessagesWhileSwappedOut) { | 243 TEST_F(RenderViewHostManagerTest, FilterMessagesWhileSwappedOut) { |
| 244 BrowserThreadImpl ui_thread(BrowserThread::UI, MessageLoop::current()); | 244 BrowserThreadImpl ui_thread(BrowserThread::UI, MessageLoop::current()); |
| 245 const GURL kNtpUrl(chrome::kTestNewTabURL); | 245 const GURL kNtpUrl(chrome::kTestNewTabURL); |
| 246 const GURL kDestUrl("http://www.google.com/"); | 246 const GURL kDestUrl("http://www.google.com/"); |
| 247 | 247 |
| 248 // Navigate our first tab to the new tab page and then to the destination. | 248 // Navigate our first tab to the new tab page and then to the destination. |
| 249 NavigateActiveAndCommit(kNtpUrl); | 249 NavigateActiveAndCommit(kNtpUrl); |
| 250 TestRenderViewHost* ntp_rvh = static_cast<TestRenderViewHost*>( | 250 TestRenderViewHost* ntp_rvh = static_cast<TestRenderViewHost*>( |
| 251 contents()->GetRenderManagerForTesting()->current_host()); | 251 contents()->GetRenderManagerForTesting()->current_host()); |
| 252 | 252 |
| 253 // Send an update title message and make sure it works. | 253 // Send an update title message and make sure it works. |
| 254 const string16 ntp_title = ASCIIToUTF16("NTP Title"); | 254 const string16 ntp_title = ASCIIToUTF16("NTP Title"); |
| 255 WebKit::WebTextDirection direction = WebKit::WebTextDirectionLeftToRight; | 255 WebKit::WebTextDirection direction = WebKit::WebTextDirectionLeftToRight; |
| 256 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived( | 256 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived( |
| 257 ViewHostMsg_UpdateTitle(rvh()->routing_id(), 0, ntp_title, direction))); | 257 ViewHostMsg_UpdateTitle(rvh()->GetRoutingID(), 0, ntp_title, direction))); |
| 258 EXPECT_EQ(ntp_title, contents()->GetTitle()); | 258 EXPECT_EQ(ntp_title, contents()->GetTitle()); |
| 259 | 259 |
| 260 // Navigate to a cross-site URL. | 260 // Navigate to a cross-site URL. |
| 261 contents()->GetController().LoadURL( | 261 contents()->GetController().LoadURL( |
| 262 kDestUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, | 262 kDestUrl, content::Referrer(), content::PAGE_TRANSITION_LINK, |
| 263 std::string()); | 263 std::string()); |
| 264 EXPECT_TRUE(contents()->cross_navigation_pending()); | 264 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 265 TestRenderViewHost* dest_rvh = static_cast<TestRenderViewHost*>( | 265 TestRenderViewHost* dest_rvh = static_cast<TestRenderViewHost*>( |
| 266 contents()->GetRenderManagerForTesting()->pending_render_view_host()); | 266 contents()->GetRenderManagerForTesting()->pending_render_view_host()); |
| 267 ASSERT_TRUE(dest_rvh); | 267 ASSERT_TRUE(dest_rvh); |
| 268 EXPECT_NE(ntp_rvh, dest_rvh); | 268 EXPECT_NE(ntp_rvh, dest_rvh); |
| 269 | 269 |
| 270 // BeforeUnload finishes. | 270 // BeforeUnload finishes. |
| 271 ntp_rvh->SendShouldCloseACK(true); | 271 ntp_rvh->SendShouldCloseACK(true); |
| 272 | 272 |
| 273 // Assume SwapOutACK times out, so the dest_rvh proceeds and commits. | 273 // Assume SwapOutACK times out, so the dest_rvh proceeds and commits. |
| 274 dest_rvh->SendNavigate(101, kDestUrl); | 274 dest_rvh->SendNavigate(101, kDestUrl); |
| 275 | 275 |
| 276 // The new RVH should be able to update its title. | 276 // The new RVH should be able to update its title. |
| 277 const string16 dest_title = ASCIIToUTF16("Google"); | 277 const string16 dest_title = ASCIIToUTF16("Google"); |
| 278 EXPECT_TRUE(dest_rvh->TestOnMessageReceived( | 278 EXPECT_TRUE(dest_rvh->TestOnMessageReceived( |
| 279 ViewHostMsg_UpdateTitle(rvh()->routing_id(), 101, dest_title, | 279 ViewHostMsg_UpdateTitle(rvh()->GetRoutingID(), 101, dest_title, |
| 280 direction))); | 280 direction))); |
| 281 EXPECT_EQ(dest_title, contents()->GetTitle()); | 281 EXPECT_EQ(dest_title, contents()->GetTitle()); |
| 282 | 282 |
| 283 // The old renderer, being slow, now updates the title. It should be filtered | 283 // The old renderer, being slow, now updates the title. It should be filtered |
| 284 // out and not take effect. | 284 // out and not take effect. |
| 285 EXPECT_TRUE(ntp_rvh->is_swapped_out()); | 285 EXPECT_TRUE(ntp_rvh->is_swapped_out()); |
| 286 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived( | 286 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived( |
| 287 ViewHostMsg_UpdateTitle(rvh()->routing_id(), 0, ntp_title, direction))); | 287 ViewHostMsg_UpdateTitle(rvh()->GetRoutingID(), 0, ntp_title, direction))); |
| 288 EXPECT_EQ(dest_title, contents()->GetTitle()); | 288 EXPECT_EQ(dest_title, contents()->GetTitle()); |
| 289 | 289 |
| 290 // We cannot filter out synchronous IPC messages, because the renderer would | 290 // We cannot filter out synchronous IPC messages, because the renderer would |
| 291 // be left waiting for a reply. We pick RunBeforeUnloadConfirm as an example | 291 // be left waiting for a reply. We pick RunBeforeUnloadConfirm as an example |
| 292 // that can run easily within a unit test, and that needs to receive a reply | 292 // that can run easily within a unit test, and that needs to receive a reply |
| 293 // without showing an actual dialog. | 293 // without showing an actual dialog. |
| 294 MockRenderProcessHost* ntp_process_host = | 294 MockRenderProcessHost* ntp_process_host = |
| 295 static_cast<MockRenderProcessHost*>(ntp_rvh->process()); | 295 static_cast<MockRenderProcessHost*>(ntp_rvh->GetProcess()); |
| 296 ntp_process_host->sink().ClearMessages(); | 296 ntp_process_host->sink().ClearMessages(); |
| 297 const string16 msg = ASCIIToUTF16("Message"); | 297 const string16 msg = ASCIIToUTF16("Message"); |
| 298 bool result = false; | 298 bool result = false; |
| 299 string16 unused; | 299 string16 unused; |
| 300 ViewHostMsg_RunBeforeUnloadConfirm before_unload_msg( | 300 ViewHostMsg_RunBeforeUnloadConfirm before_unload_msg( |
| 301 rvh()->routing_id(), kNtpUrl, msg, false, &result, &unused); | 301 rvh()->GetRoutingID(), kNtpUrl, msg, false, &result, &unused); |
| 302 // Enable pumping for check in BrowserMessageFilter::CheckCanDispatchOnUI. | 302 // Enable pumping for check in BrowserMessageFilter::CheckCanDispatchOnUI. |
| 303 before_unload_msg.EnableMessagePumping(); | 303 before_unload_msg.EnableMessagePumping(); |
| 304 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived(before_unload_msg)); | 304 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived(before_unload_msg)); |
| 305 EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); | 305 EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); |
| 306 | 306 |
| 307 // Also test RunJavaScriptMessage. | 307 // Also test RunJavaScriptMessage. |
| 308 ntp_process_host->sink().ClearMessages(); | 308 ntp_process_host->sink().ClearMessages(); |
| 309 ViewHostMsg_RunJavaScriptMessage js_msg( | 309 ViewHostMsg_RunJavaScriptMessage js_msg( |
| 310 rvh()->routing_id(), msg, msg, kNtpUrl, | 310 rvh()->GetRoutingID(), msg, msg, kNtpUrl, |
| 311 ui::JAVASCRIPT_MESSAGE_TYPE_CONFIRM, &result, &unused); | 311 ui::JAVASCRIPT_MESSAGE_TYPE_CONFIRM, &result, &unused); |
| 312 js_msg.EnableMessagePumping(); | 312 js_msg.EnableMessagePumping(); |
| 313 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived(js_msg)); | 313 EXPECT_TRUE(ntp_rvh->TestOnMessageReceived(js_msg)); |
| 314 EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); | 314 EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); |
| 315 } | 315 } |
| 316 | 316 |
| 317 // When there is an error with the specified page, renderer exits view-source | 317 // When there is an error with the specified page, renderer exits view-source |
| 318 // mode. See WebFrameImpl::DidFail(). We check by this test that | 318 // mode. See WebFrameImpl::DidFail(). We check by this test that |
| 319 // EnableViewSourceMode message is sent on every navigation regardless | 319 // EnableViewSourceMode message is sent on every navigation regardless |
| 320 // RenderView is being newly created or reused. | 320 // RenderView is being newly created or reused. |
| 321 TEST_F(RenderViewHostManagerTest, AlwaysSendEnableViewSourceMode) { | 321 TEST_F(RenderViewHostManagerTest, AlwaysSendEnableViewSourceMode) { |
| 322 BrowserThreadImpl ui_thread(BrowserThread::UI, MessageLoop::current()); | 322 BrowserThreadImpl ui_thread(BrowserThread::UI, MessageLoop::current()); |
| 323 const GURL kNtpUrl(chrome::kTestNewTabURL); | 323 const GURL kNtpUrl(chrome::kTestNewTabURL); |
| 324 const GURL kUrl("view-source:http://foo"); | 324 const GURL kUrl("view-source:http://foo"); |
| 325 | 325 |
| 326 // We have to navigate to some page at first since without this, the first | 326 // We have to navigate to some page at first since without this, the first |
| 327 // navigation will reuse the SiteInstance created by Init(), and the second | 327 // navigation will reuse the SiteInstance created by Init(), and the second |
| 328 // one will create a new SiteInstance. Because current_instance and | 328 // one will create a new SiteInstance. Because current_instance and |
| 329 // new_instance will be different, a new RenderViewHost will be created for | 329 // new_instance will be different, a new RenderViewHost will be created for |
| 330 // the second navigation. We have to avoid this in order to exercise the | 330 // the second navigation. We have to avoid this in order to exercise the |
| 331 // target code patch. | 331 // target code patch. |
| 332 NavigateActiveAndCommit(kNtpUrl); | 332 NavigateActiveAndCommit(kNtpUrl); |
| 333 | 333 |
| 334 // Navigate. | 334 // Navigate. |
| 335 controller().LoadURL( | 335 controller().LoadURL( |
| 336 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); | 336 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
| 337 // Simulate response from RenderView for FirePageBeforeUnload. | 337 // Simulate response from RenderView for FirePageBeforeUnload. |
| 338 rvh()->TestOnMessageReceived( | 338 rvh()->TestOnMessageReceived( |
| 339 ViewHostMsg_ShouldClose_ACK(rvh()->routing_id(), true)); | 339 ViewHostMsg_ShouldClose_ACK(rvh()->GetRoutingID(), true)); |
| 340 ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created. | 340 ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created. |
| 341 RenderViewHost* last_rvh = pending_rvh(); | 341 RenderViewHost* last_rvh = pending_rvh(); |
| 342 int32 new_id = contents()->GetMaxPageIDForSiteInstance( | 342 int32 new_id = contents()->GetMaxPageIDForSiteInstance( |
| 343 active_rvh()->site_instance()) + 1; | 343 active_rvh()->GetSiteInstance()) + 1; |
| 344 pending_rvh()->SendNavigate(new_id, kUrl); | 344 pending_rvh()->SendNavigate(new_id, kUrl); |
| 345 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1); | 345 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1); |
| 346 ASSERT_TRUE(controller().GetLastCommittedEntry()); | 346 ASSERT_TRUE(controller().GetLastCommittedEntry()); |
| 347 EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->GetURL()); | 347 EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->GetURL()); |
| 348 EXPECT_FALSE(controller().GetPendingEntry()); | 348 EXPECT_FALSE(controller().GetPendingEntry()); |
| 349 // Because we're using TestTabContents and TestRenderViewHost in this | 349 // Because we're using TestTabContents and TestRenderViewHost in this |
| 350 // unittest, no one calls TabContents::RenderViewCreated(). So, we see no | 350 // unittest, no one calls TabContents::RenderViewCreated(). So, we see no |
| 351 // EnableViewSourceMode message, here. | 351 // EnableViewSourceMode message, here. |
| 352 | 352 |
| 353 // Clear queued messages before load. | 353 // Clear queued messages before load. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 373 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); | 373 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); |
| 374 EXPECT_FALSE(instance->HasSite()); | 374 EXPECT_FALSE(instance->HasSite()); |
| 375 | 375 |
| 376 TestTabContents tab_contents(browser_context(), instance); | 376 TestTabContents tab_contents(browser_context(), instance); |
| 377 RenderViewHostManager manager(&tab_contents, &tab_contents); | 377 RenderViewHostManager manager(&tab_contents, &tab_contents); |
| 378 | 378 |
| 379 manager.Init(browser_context(), instance, MSG_ROUTING_NONE); | 379 manager.Init(browser_context(), instance, MSG_ROUTING_NONE); |
| 380 | 380 |
| 381 RenderViewHost* host = manager.current_host(); | 381 RenderViewHost* host = manager.current_host(); |
| 382 ASSERT_TRUE(host); | 382 ASSERT_TRUE(host); |
| 383 EXPECT_TRUE(instance == host->site_instance()); | 383 EXPECT_TRUE(instance == host->GetSiteInstance()); |
| 384 EXPECT_TRUE(&tab_contents == host->delegate()); | 384 EXPECT_TRUE(&tab_contents == host->GetDelegate()); |
| 385 EXPECT_TRUE(manager.GetRenderWidgetHostView()); | 385 EXPECT_TRUE(manager.GetRenderWidgetHostView()); |
| 386 EXPECT_FALSE(manager.pending_render_view_host()); | 386 EXPECT_FALSE(manager.pending_render_view_host()); |
| 387 } | 387 } |
| 388 | 388 |
| 389 // Tests the Navigate function. We navigate three sites consecutively and check | 389 // Tests the Navigate function. We navigate three sites consecutively and check |
| 390 // how the pending/committed RenderViewHost are modified. | 390 // how the pending/committed RenderViewHost are modified. |
| 391 TEST_F(RenderViewHostManagerTest, Navigate) { | 391 TEST_F(RenderViewHostManagerTest, Navigate) { |
| 392 TestNotificationTracker notifications; | 392 TestNotificationTracker notifications; |
| 393 | 393 |
| 394 SiteInstance* instance = SiteInstance::Create(browser_context()); | 394 SiteInstance* instance = SiteInstance::Create(browser_context()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 416 | 416 |
| 417 // The RenderViewHost created in Init will be reused. | 417 // The RenderViewHost created in Init will be reused. |
| 418 EXPECT_TRUE(host == manager.current_host()); | 418 EXPECT_TRUE(host == manager.current_host()); |
| 419 EXPECT_FALSE(manager.pending_render_view_host()); | 419 EXPECT_FALSE(manager.pending_render_view_host()); |
| 420 | 420 |
| 421 // Commit. | 421 // Commit. |
| 422 manager.DidNavigateMainFrame(host); | 422 manager.DidNavigateMainFrame(host); |
| 423 // Commit to SiteInstance should be delayed until RenderView commit. | 423 // Commit to SiteInstance should be delayed until RenderView commit. |
| 424 EXPECT_TRUE(host == manager.current_host()); | 424 EXPECT_TRUE(host == manager.current_host()); |
| 425 ASSERT_TRUE(host); | 425 ASSERT_TRUE(host); |
| 426 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->site_instance())-> | 426 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
| 427 HasSite()); | 427 HasSite()); |
| 428 static_cast<SiteInstanceImpl*>(host->site_instance())->SetSite(kUrl1); | 428 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); |
| 429 | 429 |
| 430 // 2) Navigate to next site. ------------------------- | 430 // 2) Navigate to next site. ------------------------- |
| 431 const GURL kUrl2("http://www.google.com/foo"); | 431 const GURL kUrl2("http://www.google.com/foo"); |
| 432 NavigationEntryImpl entry2( | 432 NavigationEntryImpl entry2( |
| 433 NULL /* instance */, -1 /* page_id */, kUrl2, | 433 NULL /* instance */, -1 /* page_id */, kUrl2, |
| 434 content::Referrer(kUrl1, WebKit::WebReferrerPolicyDefault), | 434 content::Referrer(kUrl1, WebKit::WebReferrerPolicyDefault), |
| 435 string16() /* title */, content::PAGE_TRANSITION_LINK, | 435 string16() /* title */, content::PAGE_TRANSITION_LINK, |
| 436 true /* is_renderer_init */); | 436 true /* is_renderer_init */); |
| 437 host = manager.Navigate(entry2); | 437 host = manager.Navigate(entry2); |
| 438 | 438 |
| 439 // The RenderViewHost created in Init will be reused. | 439 // The RenderViewHost created in Init will be reused. |
| 440 EXPECT_TRUE(host == manager.current_host()); | 440 EXPECT_TRUE(host == manager.current_host()); |
| 441 EXPECT_FALSE(manager.pending_render_view_host()); | 441 EXPECT_FALSE(manager.pending_render_view_host()); |
| 442 | 442 |
| 443 // Commit. | 443 // Commit. |
| 444 manager.DidNavigateMainFrame(host); | 444 manager.DidNavigateMainFrame(host); |
| 445 EXPECT_TRUE(host == manager.current_host()); | 445 EXPECT_TRUE(host == manager.current_host()); |
| 446 ASSERT_TRUE(host); | 446 ASSERT_TRUE(host); |
| 447 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->site_instance())-> | 447 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
| 448 HasSite()); | 448 HasSite()); |
| 449 | 449 |
| 450 // 3) Cross-site navigate to next site. -------------- | 450 // 3) Cross-site navigate to next site. -------------- |
| 451 const GURL kUrl3("http://webkit.org/"); | 451 const GURL kUrl3("http://webkit.org/"); |
| 452 NavigationEntryImpl entry3( | 452 NavigationEntryImpl entry3( |
| 453 NULL /* instance */, -1 /* page_id */, kUrl3, | 453 NULL /* instance */, -1 /* page_id */, kUrl3, |
| 454 content::Referrer(kUrl2, WebKit::WebReferrerPolicyDefault), | 454 content::Referrer(kUrl2, WebKit::WebReferrerPolicyDefault), |
| 455 string16() /* title */, content::PAGE_TRANSITION_LINK, | 455 string16() /* title */, content::PAGE_TRANSITION_LINK, |
| 456 false /* is_renderer_init */); | 456 false /* is_renderer_init */); |
| 457 host = manager.Navigate(entry3); | 457 host = manager.Navigate(entry3); |
| 458 | 458 |
| 459 // A new RenderViewHost should be created. | 459 // A new RenderViewHost should be created. |
| 460 EXPECT_TRUE(manager.pending_render_view_host()); | 460 EXPECT_TRUE(manager.pending_render_view_host()); |
| 461 ASSERT_EQ(host, manager.pending_render_view_host()); | 461 ASSERT_EQ(host, manager.pending_render_view_host()); |
| 462 | 462 |
| 463 notifications.Reset(); | 463 notifications.Reset(); |
| 464 | 464 |
| 465 // Commit. | 465 // Commit. |
| 466 manager.DidNavigateMainFrame(manager.pending_render_view_host()); | 466 manager.DidNavigateMainFrame(manager.pending_render_view_host()); |
| 467 EXPECT_TRUE(host == manager.current_host()); | 467 EXPECT_TRUE(host == manager.current_host()); |
| 468 ASSERT_TRUE(host); | 468 ASSERT_TRUE(host); |
| 469 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->site_instance())-> | 469 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
| 470 HasSite()); | 470 HasSite()); |
| 471 // Check the pending RenderViewHost has been committed. | 471 // Check the pending RenderViewHost has been committed. |
| 472 EXPECT_FALSE(manager.pending_render_view_host()); | 472 EXPECT_FALSE(manager.pending_render_view_host()); |
| 473 | 473 |
| 474 // We should observe a notification. | 474 // We should observe a notification. |
| 475 EXPECT_TRUE(notifications.Check1AndReset( | 475 EXPECT_TRUE(notifications.Check1AndReset( |
| 476 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 476 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
| 477 } | 477 } |
| 478 | 478 |
| 479 // Tests the Navigate function. In this unit test we verify that the Navigate | 479 // Tests the Navigate function. In this unit test we verify that the Navigate |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 EXPECT_TRUE(notifications.Check1AndReset( | 512 EXPECT_TRUE(notifications.Check1AndReset( |
| 513 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 513 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
| 514 notifications.Reset(); | 514 notifications.Reset(); |
| 515 | 515 |
| 516 // Commit. | 516 // Commit. |
| 517 manager.DidNavigateMainFrame(host); | 517 manager.DidNavigateMainFrame(host); |
| 518 | 518 |
| 519 // Commit to SiteInstance should be delayed until RenderView commit. | 519 // Commit to SiteInstance should be delayed until RenderView commit. |
| 520 EXPECT_TRUE(host == manager.current_host()); | 520 EXPECT_TRUE(host == manager.current_host()); |
| 521 ASSERT_TRUE(host); | 521 ASSERT_TRUE(host); |
| 522 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->site_instance())-> | 522 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
| 523 HasSite()); | 523 HasSite()); |
| 524 static_cast<SiteInstanceImpl*>(host->site_instance())->SetSite(kUrl1); | 524 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); |
| 525 | 525 |
| 526 // 2) Cross-site navigate to next site. ------------------------- | 526 // 2) Cross-site navigate to next site. ------------------------- |
| 527 const GURL kUrl2("http://www.example.com"); | 527 const GURL kUrl2("http://www.example.com"); |
| 528 NavigationEntryImpl entry2( | 528 NavigationEntryImpl entry2( |
| 529 NULL /* instance */, -1 /* page_id */, kUrl2, content::Referrer(), | 529 NULL /* instance */, -1 /* page_id */, kUrl2, content::Referrer(), |
| 530 string16() /* title */, content::PAGE_TRANSITION_TYPED, | 530 string16() /* title */, content::PAGE_TRANSITION_TYPED, |
| 531 false /* is_renderer_init */); | 531 false /* is_renderer_init */); |
| 532 RenderViewHost* host2 = manager.Navigate(entry2); | 532 RenderViewHostImpl* host2 = static_cast<RenderViewHostImpl*>( |
| 533 int host2_process_id = host2->process()->GetID(); | 533 manager.Navigate(entry2)); |
| 534 int host2_process_id = host2->GetProcess()->GetID(); |
| 534 | 535 |
| 535 // A new RenderViewHost should be created. | 536 // A new RenderViewHost should be created. |
| 536 EXPECT_TRUE(manager.pending_render_view_host()); | 537 EXPECT_TRUE(manager.pending_render_view_host()); |
| 537 ASSERT_EQ(host2, manager.pending_render_view_host()); | 538 ASSERT_EQ(host2, manager.pending_render_view_host()); |
| 538 EXPECT_NE(host2, host); | 539 EXPECT_NE(host2, host); |
| 539 | 540 |
| 540 // Check that the navigation is still suspended because the old RVH | 541 // Check that the navigation is still suspended because the old RVH |
| 541 // is not swapped out, yet. | 542 // is not swapped out, yet. |
| 542 EXPECT_TRUE(host2->are_navigations_suspended()); | 543 EXPECT_TRUE(host2->are_navigations_suspended()); |
| 543 MockRenderProcessHost* test_process_host2 = | 544 MockRenderProcessHost* test_process_host2 = |
| 544 static_cast<MockRenderProcessHost*>(host2->process()); | 545 static_cast<MockRenderProcessHost*>(host2->GetProcess()); |
| 545 test_process_host2->sink().ClearMessages(); | 546 test_process_host2->sink().ClearMessages(); |
| 546 host2->NavigateToURL(kUrl2); | 547 host2->NavigateToURL(kUrl2); |
| 547 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( | 548 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
| 548 ViewMsg_Navigate::ID)); | 549 ViewMsg_Navigate::ID)); |
| 549 | 550 |
| 550 // Allow closing the current Render View (precondition for swapping out | 551 // Allow closing the current Render View (precondition for swapping out |
| 551 // the RVH): Simulate response from RenderView for ViewMsg_ShouldClose sent by | 552 // the RVH): Simulate response from RenderView for ViewMsg_ShouldClose sent by |
| 552 // FirePageBeforeUnload. | 553 // FirePageBeforeUnload. |
| 553 TestRenderViewHost* test_host = static_cast<TestRenderViewHost*>(host); | 554 TestRenderViewHost* test_host = static_cast<TestRenderViewHost*>(host); |
| 554 MockRenderProcessHost* test_process_host = | 555 MockRenderProcessHost* test_process_host = |
| 555 static_cast<MockRenderProcessHost*>(test_host->process()); | 556 static_cast<MockRenderProcessHost*>(test_host->GetProcess()); |
| 556 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 557 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 557 ViewMsg_ShouldClose::ID)); | 558 ViewMsg_ShouldClose::ID)); |
| 558 test_host->SendShouldCloseACK(true); | 559 test_host->SendShouldCloseACK(true); |
| 559 | 560 |
| 560 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 561 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
| 561 // call of RenderViewHostManager::OnCrossSiteResponse before | 562 // call of RenderViewHostManager::OnCrossSiteResponse before |
| 562 // RenderViewHostManager::DidNavigateMainFrame is called. | 563 // RenderViewHostManager::DidNavigateMainFrame is called. |
| 563 // The RVH is not swapped out until the commit. | 564 // The RVH is not swapped out until the commit. |
| 564 manager.OnCrossSiteResponse(host2->process()->GetID(), | 565 manager.OnCrossSiteResponse(host2->GetProcess()->GetID(), |
| 565 host2->GetPendingRequestId()); | 566 host2->GetPendingRequestId()); |
| 566 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 567 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 567 ViewMsg_SwapOut::ID)); | 568 ViewMsg_SwapOut::ID)); |
| 568 test_host->OnSwapOutACK(); | 569 test_host->OnSwapOutACK(); |
| 569 | 570 |
| 570 EXPECT_EQ(host, manager.current_host()); | 571 EXPECT_EQ(host, manager.current_host()); |
| 571 EXPECT_FALSE(manager.current_host()->is_swapped_out()); | 572 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
| 573 manager.current_host())->is_swapped_out()); |
| 572 EXPECT_EQ(host2, manager.pending_render_view_host()); | 574 EXPECT_EQ(host2, manager.pending_render_view_host()); |
| 573 // There should be still no navigation messages being sent. | 575 // There should be still no navigation messages being sent. |
| 574 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( | 576 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
| 575 ViewMsg_Navigate::ID)); | 577 ViewMsg_Navigate::ID)); |
| 576 | 578 |
| 577 // 3) Cross-site navigate to next site before 2) has committed. -------------- | 579 // 3) Cross-site navigate to next site before 2) has committed. -------------- |
| 578 const GURL kUrl3("http://webkit.org/"); | 580 const GURL kUrl3("http://webkit.org/"); |
| 579 NavigationEntryImpl entry3(NULL /* instance */, -1 /* page_id */, kUrl3, | 581 NavigationEntryImpl entry3(NULL /* instance */, -1 /* page_id */, kUrl3, |
| 580 content::Referrer(), string16() /* title */, | 582 content::Referrer(), string16() /* title */, |
| 581 content::PAGE_TRANSITION_TYPED, | 583 content::PAGE_TRANSITION_TYPED, |
| 582 false /* is_renderer_init */); | 584 false /* is_renderer_init */); |
| 583 test_process_host->sink().ClearMessages(); | 585 test_process_host->sink().ClearMessages(); |
| 584 RenderViewHost* host3 = manager.Navigate(entry3); | 586 RenderViewHost* host3 = manager.Navigate(entry3); |
| 585 | 587 |
| 586 // A new RenderViewHost should be created. host2 is now deleted. | 588 // A new RenderViewHost should be created. host2 is now deleted. |
| 587 EXPECT_TRUE(manager.pending_render_view_host()); | 589 EXPECT_TRUE(manager.pending_render_view_host()); |
| 588 ASSERT_EQ(host3, manager.pending_render_view_host()); | 590 ASSERT_EQ(host3, manager.pending_render_view_host()); |
| 589 EXPECT_NE(host3, host); | 591 EXPECT_NE(host3, host); |
| 590 EXPECT_NE(host3->process()->GetID(), host2_process_id); | 592 EXPECT_NE(host3->GetProcess()->GetID(), host2_process_id); |
| 591 | 593 |
| 592 // Navigations in the new RVH should be suspended, which is ok because the | 594 // Navigations in the new RVH should be suspended, which is ok because the |
| 593 // old RVH is not yet swapped out and can respond to a second beforeunload | 595 // old RVH is not yet swapped out and can respond to a second beforeunload |
| 594 // request. | 596 // request. |
| 595 EXPECT_TRUE(host3->are_navigations_suspended()); | 597 EXPECT_TRUE(static_cast<RenderViewHostImpl*>( |
| 598 host3)->are_navigations_suspended()); |
| 596 EXPECT_EQ(host, manager.current_host()); | 599 EXPECT_EQ(host, manager.current_host()); |
| 597 EXPECT_FALSE(manager.current_host()->is_swapped_out()); | 600 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
| 601 manager.current_host())->is_swapped_out()); |
| 598 | 602 |
| 599 // Simulate a response to the second beforeunload request. | 603 // Simulate a response to the second beforeunload request. |
| 600 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 604 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 601 ViewMsg_ShouldClose::ID)); | 605 ViewMsg_ShouldClose::ID)); |
| 602 test_host->SendShouldCloseACK(true); | 606 test_host->SendShouldCloseACK(true); |
| 603 | 607 |
| 604 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 608 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
| 605 // call of RenderViewHostManager::OnCrossSiteResponse before | 609 // call of RenderViewHostManager::OnCrossSiteResponse before |
| 606 // RenderViewHostManager::DidNavigateMainFrame is called. | 610 // RenderViewHostManager::DidNavigateMainFrame is called. |
| 607 // The RVH is not swapped out until the commit. | 611 // The RVH is not swapped out until the commit. |
| 608 manager.OnCrossSiteResponse(host3->process()->GetID(), | 612 manager.OnCrossSiteResponse(host3->GetProcess()->GetID(), |
| 609 host3->GetPendingRequestId()); | 613 static_cast<RenderViewHostImpl*>( |
| 614 host3)->GetPendingRequestId()); |
| 610 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 615 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
| 611 ViewMsg_SwapOut::ID)); | 616 ViewMsg_SwapOut::ID)); |
| 612 test_host->OnSwapOutACK(); | 617 test_host->OnSwapOutACK(); |
| 613 | 618 |
| 614 // Commit. | 619 // Commit. |
| 615 manager.DidNavigateMainFrame(host3); | 620 manager.DidNavigateMainFrame(host3); |
| 616 EXPECT_TRUE(host3 == manager.current_host()); | 621 EXPECT_TRUE(host3 == manager.current_host()); |
| 617 ASSERT_TRUE(host3); | 622 ASSERT_TRUE(host3); |
| 618 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->site_instance())-> | 623 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->GetSiteInstance())-> |
| 619 HasSite()); | 624 HasSite()); |
| 620 // Check the pending RenderViewHost has been committed. | 625 // Check the pending RenderViewHost has been committed. |
| 621 EXPECT_FALSE(manager.pending_render_view_host()); | 626 EXPECT_FALSE(manager.pending_render_view_host()); |
| 622 | 627 |
| 623 // We should observe a notification. | 628 // We should observe a notification. |
| 624 EXPECT_TRUE(notifications.Check1AndReset( | 629 EXPECT_TRUE(notifications.Check1AndReset( |
| 625 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 630 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
| 626 } | 631 } |
| 627 | 632 |
| 628 // Tests WebUI creation. | 633 // Tests WebUI creation. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 644 RenderViewHost* host = manager.Navigate(entry); | 649 RenderViewHost* host = manager.Navigate(entry); |
| 645 | 650 |
| 646 EXPECT_TRUE(host); | 651 EXPECT_TRUE(host); |
| 647 EXPECT_TRUE(host == manager.current_host()); | 652 EXPECT_TRUE(host == manager.current_host()); |
| 648 EXPECT_FALSE(manager.pending_render_view_host()); | 653 EXPECT_FALSE(manager.pending_render_view_host()); |
| 649 | 654 |
| 650 // It's important that the site instance get set on the Web UI page as soon | 655 // It's important that the site instance get set on the Web UI page as soon |
| 651 // as the navigation starts, rather than lazily after it commits, so we don't | 656 // as the navigation starts, rather than lazily after it commits, so we don't |
| 652 // try to re-use the SiteInstance/process for non DOM-UI things that may | 657 // try to re-use the SiteInstance/process for non DOM-UI things that may |
| 653 // get loaded in between. | 658 // get loaded in between. |
| 654 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->site_instance())-> | 659 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
| 655 HasSite()); | 660 HasSite()); |
| 656 EXPECT_EQ(kUrl, host->site_instance()->GetSite()); | 661 EXPECT_EQ(kUrl, host->GetSiteInstance()->GetSite()); |
| 657 | 662 |
| 658 // The Web UI is committed immediately because the RenderViewHost has not been | 663 // The Web UI is committed immediately because the RenderViewHost has not been |
| 659 // used yet. UpdateRendererStateForNavigate() took the short cut path. | 664 // used yet. UpdateRendererStateForNavigate() took the short cut path. |
| 660 EXPECT_FALSE(manager.pending_web_ui()); | 665 EXPECT_FALSE(manager.pending_web_ui()); |
| 661 EXPECT_TRUE(manager.web_ui()); | 666 EXPECT_TRUE(manager.web_ui()); |
| 662 | 667 |
| 663 // Commit. | 668 // Commit. |
| 664 manager.DidNavigateMainFrame(host); | 669 manager.DidNavigateMainFrame(host); |
| 665 } | 670 } |
| 666 | 671 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 | 774 |
| 770 // We should be able to navigate forward. | 775 // We should be able to navigate forward. |
| 771 contents()->GetController().GoForward(); | 776 contents()->GetController().GoForward(); |
| 772 contents()->ProceedWithCrossSiteNavigation(); | 777 contents()->ProceedWithCrossSiteNavigation(); |
| 773 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); | 778 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); |
| 774 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL()); | 779 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL()); |
| 775 EXPECT_EQ(rvh2, rvh()); | 780 EXPECT_EQ(rvh2, rvh()); |
| 776 EXPECT_FALSE(rvh2->is_swapped_out()); | 781 EXPECT_FALSE(rvh2->is_swapped_out()); |
| 777 EXPECT_TRUE(rvh1->is_swapped_out()); | 782 EXPECT_TRUE(rvh1->is_swapped_out()); |
| 778 } | 783 } |
| OLD | NEW |