| 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 "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 5 #include "chrome/test/base/testing_profile.h" | 6 #include "chrome/test/base/testing_profile.h" |
| 6 #include "content/browser/browser_thread.h" | 7 #include "content/browser/browser_thread.h" |
| 7 #include "content/browser/browser_url_handler.h" | 8 #include "content/browser/browser_url_handler.h" |
| 8 #include "content/browser/renderer_host/test_render_view_host.h" | |
| 9 #include "content/browser/site_instance.h" | 9 #include "content/browser/site_instance.h" |
| 10 #include "content/browser/tab_contents/navigation_controller.h" | 10 #include "content/browser/tab_contents/navigation_controller.h" |
| 11 #include "content/browser/tab_contents/navigation_entry.h" | 11 #include "content/browser/tab_contents/navigation_entry.h" |
| 12 #include "content/browser/tab_contents/render_view_host_manager.h" | 12 #include "content/browser/tab_contents/render_view_host_manager.h" |
| 13 #include "content/browser/tab_contents/test_tab_contents.h" | 13 #include "content/browser/tab_contents/test_tab_contents.h" |
| 14 #include "content/common/notification_details.h" | 14 #include "content/common/notification_details.h" |
| 15 #include "content/common/notification_source.h" | 15 #include "content/common/notification_source.h" |
| 16 #include "content/common/page_transition_types.h" | 16 #include "content/common/page_transition_types.h" |
| 17 #include "content/common/test_url_constants.h" | 17 #include "content/common/test_url_constants.h" |
| 18 #include "content/common/view_messages.h" | 18 #include "content/common/view_messages.h" |
| 19 #include "content/test/test_notification_tracker.h" | 19 #include "content/test/test_notification_tracker.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "webkit/glue/webkit_glue.h" | 21 #include "webkit/glue/webkit_glue.h" |
| 22 | 22 |
| 23 class RenderViewHostManagerTest : public RenderViewHostTestHarness { | 23 class RenderViewHostManagerTest : public ChromeRenderViewHostTestHarness { |
| 24 public: | 24 public: |
| 25 void NavigateActiveAndCommit(const GURL& url) { | 25 void NavigateActiveAndCommit(const GURL& url) { |
| 26 // Note: we navigate the active RenderViewHost because previous navigations | 26 // Note: we navigate the active RenderViewHost because previous navigations |
| 27 // won't have committed yet, so NavigateAndCommit does the wrong thing | 27 // won't have committed yet, so NavigateAndCommit does the wrong thing |
| 28 // for us. | 28 // for us. |
| 29 controller().LoadURL(url, GURL(), PageTransition::LINK, std::string()); | 29 controller().LoadURL(url, GURL(), PageTransition::LINK, std::string()); |
| 30 TestRenderViewHost* old_rvh = rvh(); | 30 TestRenderViewHost* old_rvh = rvh(); |
| 31 | 31 |
| 32 // Simulate the ShouldClose_ACK that is received from the current renderer | 32 // Simulate the ShouldClose_ACK that is received from the current renderer |
| 33 // for a cross-site navigation. | 33 // for a cross-site navigation. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 60 TEST_F(RenderViewHostManagerTest, NewTabPageProcesses) { | 60 TEST_F(RenderViewHostManagerTest, NewTabPageProcesses) { |
| 61 BrowserThread ui_thread(BrowserThread::UI, MessageLoop::current()); | 61 BrowserThread ui_thread(BrowserThread::UI, MessageLoop::current()); |
| 62 const GURL kNtpUrl(chrome::kTestNewTabURL); | 62 const GURL kNtpUrl(chrome::kTestNewTabURL); |
| 63 const GURL kDestUrl("http://www.google.com/"); | 63 const GURL kDestUrl("http://www.google.com/"); |
| 64 | 64 |
| 65 // Navigate our first tab to the new tab page and then to the destination. | 65 // Navigate our first tab to the new tab page and then to the destination. |
| 66 NavigateActiveAndCommit(kNtpUrl); | 66 NavigateActiveAndCommit(kNtpUrl); |
| 67 NavigateActiveAndCommit(kDestUrl); | 67 NavigateActiveAndCommit(kDestUrl); |
| 68 | 68 |
| 69 // Make a second tab. | 69 // Make a second tab. |
| 70 TestTabContents contents2(profile_.get(), NULL); | 70 TestTabContents contents2(profile(), NULL); |
| 71 | 71 |
| 72 // Load the two URLs in the second tab. Note that the first navigation creates | 72 // Load the two URLs in the second tab. Note that the first navigation creates |
| 73 // a RVH that's not pending (since there is no cross-site transition), so | 73 // a RVH that's not pending (since there is no cross-site transition), so |
| 74 // we use the committed one. | 74 // we use the committed one. |
| 75 contents2.controller().LoadURL(kNtpUrl, GURL(), PageTransition::LINK, | 75 contents2.controller().LoadURL(kNtpUrl, GURL(), PageTransition::LINK, |
| 76 std::string()); | 76 std::string()); |
| 77 TestRenderViewHost* ntp_rvh2 = static_cast<TestRenderViewHost*>( | 77 TestRenderViewHost* ntp_rvh2 = static_cast<TestRenderViewHost*>( |
| 78 contents2.render_manager()->current_host()); | 78 contents2.render_manager()->current_host()); |
| 79 EXPECT_FALSE(contents2.cross_navigation_pending()); | 79 EXPECT_FALSE(contents2.cross_navigation_pending()); |
| 80 ntp_rvh2->SendNavigate(100, kNtpUrl); | 80 ntp_rvh2->SendNavigate(100, kNtpUrl); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 EXPECT_EQ(controller().last_committed_entry_index(), 1); | 160 EXPECT_EQ(controller().last_committed_entry_index(), 1); |
| 161 EXPECT_FALSE(controller().pending_entry()); | 161 EXPECT_FALSE(controller().pending_entry()); |
| 162 // New message should be sent out to make sure to enter view-source mode. | 162 // New message should be sent out to make sure to enter view-source mode. |
| 163 EXPECT_TRUE(process()->sink().GetUniqueMessageMatching( | 163 EXPECT_TRUE(process()->sink().GetUniqueMessageMatching( |
| 164 ViewMsg_EnableViewSourceMode::ID)); | 164 ViewMsg_EnableViewSourceMode::ID)); |
| 165 } | 165 } |
| 166 | 166 |
| 167 // Tests the Init function by checking the initial RenderViewHost. | 167 // Tests the Init function by checking the initial RenderViewHost. |
| 168 TEST_F(RenderViewHostManagerTest, Init) { | 168 TEST_F(RenderViewHostManagerTest, Init) { |
| 169 // Using TestingProfile. | 169 // Using TestingProfile. |
| 170 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); | 170 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile()); |
| 171 EXPECT_FALSE(instance->has_site()); | 171 EXPECT_FALSE(instance->has_site()); |
| 172 | 172 |
| 173 TestTabContents tab_contents(profile_.get(), instance); | 173 TestTabContents tab_contents(profile(), instance); |
| 174 RenderViewHostManager manager(&tab_contents, &tab_contents); | 174 RenderViewHostManager manager(&tab_contents, &tab_contents); |
| 175 | 175 |
| 176 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE); | 176 manager.Init(profile(), instance, MSG_ROUTING_NONE); |
| 177 | 177 |
| 178 RenderViewHost* host = manager.current_host(); | 178 RenderViewHost* host = manager.current_host(); |
| 179 ASSERT_TRUE(host); | 179 ASSERT_TRUE(host); |
| 180 EXPECT_TRUE(instance == host->site_instance()); | 180 EXPECT_TRUE(instance == host->site_instance()); |
| 181 EXPECT_TRUE(&tab_contents == host->delegate()); | 181 EXPECT_TRUE(&tab_contents == host->delegate()); |
| 182 EXPECT_TRUE(manager.GetRenderWidgetHostView()); | 182 EXPECT_TRUE(manager.GetRenderWidgetHostView()); |
| 183 EXPECT_FALSE(manager.pending_render_view_host()); | 183 EXPECT_FALSE(manager.pending_render_view_host()); |
| 184 } | 184 } |
| 185 | 185 |
| 186 // Tests the Navigate function. We navigate three sites consecutively and check | 186 // Tests the Navigate function. We navigate three sites consecutively and check |
| 187 // how the pending/committed RenderViewHost are modified. | 187 // how the pending/committed RenderViewHost are modified. |
| 188 TEST_F(RenderViewHostManagerTest, Navigate) { | 188 TEST_F(RenderViewHostManagerTest, Navigate) { |
| 189 TestNotificationTracker notifications; | 189 TestNotificationTracker notifications; |
| 190 | 190 |
| 191 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); | 191 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile()); |
| 192 | 192 |
| 193 TestTabContents tab_contents(profile_.get(), instance); | 193 TestTabContents tab_contents(profile(), instance); |
| 194 notifications.ListenFor(content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 194 notifications.ListenFor(content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
| 195 Source<NavigationController>(&tab_contents.controller())); | 195 Source<NavigationController>(&tab_contents.controller())); |
| 196 | 196 |
| 197 // Create. | 197 // Create. |
| 198 RenderViewHostManager manager(&tab_contents, &tab_contents); | 198 RenderViewHostManager manager(&tab_contents, &tab_contents); |
| 199 | 199 |
| 200 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE); | 200 manager.Init(profile(), instance, MSG_ROUTING_NONE); |
| 201 | 201 |
| 202 RenderViewHost* host; | 202 RenderViewHost* host; |
| 203 | 203 |
| 204 // 1) The first navigation. -------------------------- | 204 // 1) The first navigation. -------------------------- |
| 205 const GURL kUrl1("http://www.google.com/"); | 205 const GURL kUrl1("http://www.google.com/"); |
| 206 NavigationEntry entry1(NULL /* instance */, -1 /* page_id */, kUrl1, | 206 NavigationEntry entry1(NULL /* instance */, -1 /* page_id */, kUrl1, |
| 207 GURL() /* referrer */, string16() /* title */, | 207 GURL() /* referrer */, string16() /* title */, |
| 208 PageTransition::TYPED); | 208 PageTransition::TYPED); |
| 209 host = manager.Navigate(entry1); | 209 host = manager.Navigate(entry1); |
| 210 | 210 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 EXPECT_FALSE(manager.pending_render_view_host()); | 259 EXPECT_FALSE(manager.pending_render_view_host()); |
| 260 | 260 |
| 261 // We should observe a notification. | 261 // We should observe a notification. |
| 262 EXPECT_TRUE(notifications.Check1AndReset( | 262 EXPECT_TRUE(notifications.Check1AndReset( |
| 263 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 263 content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
| 264 } | 264 } |
| 265 | 265 |
| 266 // Tests WebUI creation. | 266 // Tests WebUI creation. |
| 267 TEST_F(RenderViewHostManagerTest, WebUI) { | 267 TEST_F(RenderViewHostManagerTest, WebUI) { |
| 268 BrowserThread ui_thread(BrowserThread::UI, MessageLoop::current()); | 268 BrowserThread ui_thread(BrowserThread::UI, MessageLoop::current()); |
| 269 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); | 269 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile()); |
| 270 | 270 |
| 271 TestTabContents tab_contents(profile_.get(), instance); | 271 TestTabContents tab_contents(profile(), instance); |
| 272 RenderViewHostManager manager(&tab_contents, &tab_contents); | 272 RenderViewHostManager manager(&tab_contents, &tab_contents); |
| 273 | 273 |
| 274 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE); | 274 manager.Init(profile(), instance, MSG_ROUTING_NONE); |
| 275 | 275 |
| 276 const GURL kUrl(chrome::kTestNewTabURL); | 276 const GURL kUrl(chrome::kTestNewTabURL); |
| 277 NavigationEntry entry(NULL /* instance */, -1 /* page_id */, kUrl, | 277 NavigationEntry entry(NULL /* instance */, -1 /* page_id */, kUrl, |
| 278 GURL() /* referrer */, string16() /* title */, | 278 GURL() /* referrer */, string16() /* title */, |
| 279 PageTransition::TYPED); | 279 PageTransition::TYPED); |
| 280 RenderViewHost* host = manager.Navigate(entry); | 280 RenderViewHost* host = manager.Navigate(entry); |
| 281 | 281 |
| 282 EXPECT_TRUE(host); | 282 EXPECT_TRUE(host); |
| 283 EXPECT_TRUE(host == manager.current_host()); | 283 EXPECT_TRUE(host == manager.current_host()); |
| 284 EXPECT_FALSE(manager.pending_render_view_host()); | 284 EXPECT_FALSE(manager.pending_render_view_host()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 298 // Commit. | 298 // Commit. |
| 299 manager.DidNavigateMainFrame(host); | 299 manager.DidNavigateMainFrame(host); |
| 300 } | 300 } |
| 301 | 301 |
| 302 // Tests that chrome: URLs that are not Web UI pages do not get grouped into | 302 // Tests that chrome: URLs that are not Web UI pages do not get grouped into |
| 303 // Web UI renderers, even if --process-per-tab is enabled. In that mode, we | 303 // Web UI renderers, even if --process-per-tab is enabled. In that mode, we |
| 304 // still swap processes if ShouldSwapProcessesForNavigation is true. | 304 // still swap processes if ShouldSwapProcessesForNavigation is true. |
| 305 // Regression test for bug 46290. | 305 // Regression test for bug 46290. |
| 306 TEST_F(RenderViewHostManagerTest, NonWebUIChromeURLs) { | 306 TEST_F(RenderViewHostManagerTest, NonWebUIChromeURLs) { |
| 307 BrowserThread thread(BrowserThread::UI, &message_loop_); | 307 BrowserThread thread(BrowserThread::UI, &message_loop_); |
| 308 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); | 308 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile()); |
| 309 TestTabContents tab_contents(profile_.get(), instance); | 309 TestTabContents tab_contents(profile(), instance); |
| 310 RenderViewHostManager manager(&tab_contents, &tab_contents); | 310 RenderViewHostManager manager(&tab_contents, &tab_contents); |
| 311 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE); | 311 manager.Init(profile(), instance, MSG_ROUTING_NONE); |
| 312 | 312 |
| 313 // NTP is a Web UI page. | 313 // NTP is a Web UI page. |
| 314 const GURL kNtpUrl(chrome::kTestNewTabURL); | 314 const GURL kNtpUrl(chrome::kTestNewTabURL); |
| 315 NavigationEntry ntp_entry(NULL /* instance */, -1 /* page_id */, kNtpUrl, | 315 NavigationEntry ntp_entry(NULL /* instance */, -1 /* page_id */, kNtpUrl, |
| 316 GURL() /* referrer */, string16() /* title */, | 316 GURL() /* referrer */, string16() /* title */, |
| 317 PageTransition::TYPED); | 317 PageTransition::TYPED); |
| 318 | 318 |
| 319 // about: URLs are not Web UI pages. | 319 // about: URLs are not Web UI pages. |
| 320 GURL about_url(chrome::kTestMemoryURL); | 320 GURL about_url(chrome::kTestMemoryURL); |
| 321 // Rewrite so it looks like chrome://about/memory | 321 // Rewrite so it looks like chrome://about/memory |
| 322 bool reverse_on_redirect = false; | 322 bool reverse_on_redirect = false; |
| 323 BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( | 323 BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( |
| 324 &about_url, profile_.get(), &reverse_on_redirect); | 324 &about_url, profile(), &reverse_on_redirect); |
| 325 NavigationEntry about_entry(NULL /* instance */, -1 /* page_id */, about_url, | 325 NavigationEntry about_entry(NULL /* instance */, -1 /* page_id */, about_url, |
| 326 GURL() /* referrer */, string16() /* title */, | 326 GURL() /* referrer */, string16() /* title */, |
| 327 PageTransition::TYPED); | 327 PageTransition::TYPED); |
| 328 | 328 |
| 329 EXPECT_TRUE(ShouldSwapProcesses(&manager, &ntp_entry, &about_entry)); | 329 EXPECT_TRUE(ShouldSwapProcesses(&manager, &ntp_entry, &about_entry)); |
| 330 } | 330 } |
| 331 | 331 |
| 332 // Tests that we don't end up in an inconsistent state if a page does a back and | 332 // Tests that we don't end up in an inconsistent state if a page does a back and |
| 333 // then reload. http://crbug.com/51680 | 333 // then reload. http://crbug.com/51680 |
| 334 TEST_F(RenderViewHostManagerTest, PageDoesBackAndReload) { | 334 TEST_F(RenderViewHostManagerTest, PageDoesBackAndReload) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 365 // That should have cancelled the pending RVH, and the evil RVH should be the | 365 // That should have cancelled the pending RVH, and the evil RVH should be the |
| 366 // current one. | 366 // current one. |
| 367 EXPECT_TRUE(contents()->render_manager()->pending_render_view_host() == NULL); | 367 EXPECT_TRUE(contents()->render_manager()->pending_render_view_host() == NULL); |
| 368 EXPECT_EQ(evil_rvh, contents()->render_manager()->current_host()); | 368 EXPECT_EQ(evil_rvh, contents()->render_manager()->current_host()); |
| 369 | 369 |
| 370 // Also we should not have a pending navigation entry. | 370 // Also we should not have a pending navigation entry. |
| 371 NavigationEntry* entry = contents()->controller().GetActiveEntry(); | 371 NavigationEntry* entry = contents()->controller().GetActiveEntry(); |
| 372 ASSERT_TRUE(entry != NULL); | 372 ASSERT_TRUE(entry != NULL); |
| 373 EXPECT_EQ(kUrl2, entry->url()); | 373 EXPECT_EQ(kUrl2, entry->url()); |
| 374 } | 374 } |
| OLD | NEW |