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

Side by Side Diff: content/browser/tab_contents/render_view_host_manager_unittest.cc

Issue 9645003: Introduce abstractions to allow embedders to test RenderViewHost (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to head. Created 8 years, 9 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) 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/mock_render_process_host.h"
9 #include "content/browser/renderer_host/test_render_view_host.h" 10 #include "content/browser/renderer_host/test_render_view_host.h"
10 #include "content/browser/site_instance_impl.h" 11 #include "content/browser/site_instance_impl.h"
11 #include "content/browser/tab_contents/navigation_controller_impl.h" 12 #include "content/browser/tab_contents/navigation_controller_impl.h"
12 #include "content/browser/tab_contents/navigation_entry_impl.h" 13 #include "content/browser/tab_contents/navigation_entry_impl.h"
13 #include "content/browser/tab_contents/render_view_host_manager.h" 14 #include "content/browser/tab_contents/render_view_host_manager.h"
14 #include "content/browser/tab_contents/test_tab_contents.h" 15 #include "content/browser/tab_contents/test_tab_contents.h"
15 #include "content/common/test_url_constants.h" 16 #include "content/common/test_url_constants.h"
16 #include "content/common/view_messages.h" 17 #include "content/common/view_messages.h"
17 #include "content/public/browser/notification_details.h" 18 #include "content/public/browser/notification_details.h"
18 #include "content/public/browser/notification_source.h" 19 #include "content/public/browser/notification_source.h"
(...skipping 10 matching lines...) Expand all
29 #include "webkit/glue/webkit_glue.h" 30 #include "webkit/glue/webkit_glue.h"
30 31
31 using content::BrowserContext; 32 using content::BrowserContext;
32 using content::BrowserThread; 33 using content::BrowserThread;
33 using content::BrowserThreadImpl; 34 using content::BrowserThreadImpl;
34 using content::NavigationController; 35 using content::NavigationController;
35 using content::NavigationEntry; 36 using content::NavigationEntry;
36 using content::NavigationEntryImpl; 37 using content::NavigationEntryImpl;
37 using content::RenderViewHost; 38 using content::RenderViewHost;
38 using content::RenderViewHostImpl; 39 using content::RenderViewHostImpl;
40 using content::RenderViewHostImplTestHarness;
39 using content::SiteInstance; 41 using content::SiteInstance;
40 using content::TestRenderViewHost; 42 using content::TestRenderViewHost;
41 using content::WebContents; 43 using content::WebContents;
42 using content::WebUI; 44 using content::WebUI;
43 using content::WebUIController; 45 using content::WebUIController;
44 46
45 namespace { 47 namespace {
46 48
47 const char kChromeUISchemeButNotWebUIURL[] = "chrome://not-webui"; 49 const char kChromeUISchemeButNotWebUIURL[] = "chrome://not-webui";
48 50
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 116 }
115 117
116 private: 118 private:
117 RenderViewHostManagerTestWebUIControllerFactory factory_; 119 RenderViewHostManagerTestWebUIControllerFactory factory_;
118 120
119 DISALLOW_COPY_AND_ASSIGN(RenderViewHostManagerTestBrowserClient); 121 DISALLOW_COPY_AND_ASSIGN(RenderViewHostManagerTestBrowserClient);
120 }; 122 };
121 123
122 } // namespace 124 } // namespace
123 125
124 class RenderViewHostManagerTest : public RenderViewHostTestHarness { 126 class RenderViewHostManagerTest
127 : public RenderViewHostImplTestHarness {
125 public: 128 public:
126 virtual void SetUp() OVERRIDE { 129 virtual void SetUp() OVERRIDE {
127 RenderViewHostTestHarness::SetUp(); 130 RenderViewHostTestHarness::SetUp();
128 old_browser_client_ = content::GetContentClient()->browser(); 131 old_browser_client_ = content::GetContentClient()->browser();
129 content::GetContentClient()->set_browser(&browser_client_); 132 content::GetContentClient()->set_browser(&browser_client_);
130 url_util::AddStandardScheme(chrome::kChromeUIScheme); 133 url_util::AddStandardScheme(chrome::kChromeUIScheme);
131 } 134 }
132 135
133 virtual void TearDown() OVERRIDE { 136 virtual void TearDown() OVERRIDE {
134 RenderViewHostTestHarness::TearDown(); 137 RenderViewHostTestHarness::TearDown();
135 content::GetContentClient()->set_browser(old_browser_client_); 138 content::GetContentClient()->set_browser(old_browser_client_);
136 } 139 }
137 140
138 void set_should_create_webui(bool should_create_webui) { 141 void set_should_create_webui(bool should_create_webui) {
139 browser_client_.set_should_create_webui(should_create_webui); 142 browser_client_.set_should_create_webui(should_create_webui);
140 } 143 }
141 144
142 void NavigateActiveAndCommit(const GURL& url) { 145 void NavigateActiveAndCommit(const GURL& url) {
143 // Note: we navigate the active RenderViewHost because previous navigations 146 // Note: we navigate the active RenderViewHost because previous navigations
144 // won't have committed yet, so NavigateAndCommit does the wrong thing 147 // won't have committed yet, so NavigateAndCommit does the wrong thing
145 // for us. 148 // for us.
146 controller().LoadURL( 149 controller().LoadURL(
147 url, content::Referrer(), content::PAGE_TRANSITION_LINK, std::string()); 150 url, content::Referrer(), content::PAGE_TRANSITION_LINK, std::string());
148 TestRenderViewHost* old_rvh = rvh(); 151 TestRenderViewHost* old_rvh = test_rvh();
149 152
150 // Simulate the ShouldClose_ACK that is received from the current renderer 153 // Simulate the ShouldClose_ACK that is received from the current renderer
151 // for a cross-site navigation. 154 // for a cross-site navigation.
152 if (old_rvh != active_rvh()) 155 if (old_rvh != active_rvh())
153 old_rvh->SendShouldCloseACK(true); 156 old_rvh->SendShouldCloseACK(true);
154 157
155 // Commit the navigation with a new page ID. 158 // Commit the navigation with a new page ID.
156 int32 max_page_id = contents()->GetMaxPageIDForSiteInstance( 159 int32 max_page_id = contents()->GetMaxPageIDForSiteInstance(
157 active_rvh()->GetSiteInstance()); 160 active_rvh()->GetSiteInstance());
158 active_rvh()->SendNavigate(max_page_id + 1, url); 161 active_test_rvh()->SendNavigate(max_page_id + 1, url);
159 162
160 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation 163 // Simulate the SwapOut_ACK that fires if you commit a cross-site navigation
161 // without making any network requests. 164 // without making any network requests.
162 if (old_rvh != active_rvh()) 165 if (old_rvh != active_rvh())
163 old_rvh->OnSwapOutACK(); 166 old_rvh->OnSwapOutACK();
164 } 167 }
165 168
166 bool ShouldSwapProcesses(RenderViewHostManager* manager, 169 bool ShouldSwapProcesses(RenderViewHostManager* manager,
167 const NavigationEntryImpl* cur_entry, 170 const NavigationEntryImpl* cur_entry,
168 const NavigationEntryImpl* new_entry) const { 171 const NavigationEntryImpl* new_entry) const {
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 // one will create a new SiteInstance. Because current_instance and 334 // one will create a new SiteInstance. Because current_instance and
332 // new_instance will be different, a new RenderViewHost will be created for 335 // new_instance will be different, a new RenderViewHost will be created for
333 // the second navigation. We have to avoid this in order to exercise the 336 // the second navigation. We have to avoid this in order to exercise the
334 // target code patch. 337 // target code patch.
335 NavigateActiveAndCommit(kNtpUrl); 338 NavigateActiveAndCommit(kNtpUrl);
336 339
337 // Navigate. 340 // Navigate.
338 controller().LoadURL( 341 controller().LoadURL(
339 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); 342 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
340 // Simulate response from RenderView for FirePageBeforeUnload. 343 // Simulate response from RenderView for FirePageBeforeUnload.
341 rvh()->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK( 344 test_rvh()->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(
342 rvh()->GetRoutingID(), true, base::TimeTicks(), base::TimeTicks())); 345 rvh()->GetRoutingID(), true, base::TimeTicks(), base::TimeTicks()));
343 ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created. 346 ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created.
344 RenderViewHost* last_rvh = pending_rvh(); 347 RenderViewHost* last_rvh = pending_rvh();
345 int32 new_id = contents()->GetMaxPageIDForSiteInstance( 348 int32 new_id = contents()->GetMaxPageIDForSiteInstance(
346 active_rvh()->GetSiteInstance()) + 1; 349 active_rvh()->GetSiteInstance()) + 1;
347 pending_rvh()->SendNavigate(new_id, kUrl); 350 pending_test_rvh()->SendNavigate(new_id, kUrl);
348 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1); 351 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1);
349 ASSERT_TRUE(controller().GetLastCommittedEntry()); 352 ASSERT_TRUE(controller().GetLastCommittedEntry());
350 EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->GetURL()); 353 EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->GetURL());
351 EXPECT_FALSE(controller().GetPendingEntry()); 354 EXPECT_FALSE(controller().GetPendingEntry());
352 // Because we're using TestTabContents and TestRenderViewHost in this 355 // Because we're using TestTabContents and TestRenderViewHost in this
353 // unittest, no one calls TabContents::RenderViewCreated(). So, we see no 356 // unittest, no one calls TabContents::RenderViewCreated(). So, we see no
354 // EnableViewSourceMode message, here. 357 // EnableViewSourceMode message, here.
355 358
356 // Clear queued messages before load. 359 // Clear queued messages before load.
357 process()->sink().ClearMessages(); 360 process()->sink().ClearMessages();
358 // Navigate, again. 361 // Navigate, again.
359 controller().LoadURL( 362 controller().LoadURL(
360 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); 363 kUrl, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
361 // The same RenderViewHost should be reused. 364 // The same RenderViewHost should be reused.
362 EXPECT_FALSE(pending_rvh()); 365 EXPECT_FALSE(pending_rvh());
363 EXPECT_TRUE(last_rvh == rvh()); 366 EXPECT_TRUE(last_rvh == rvh());
364 rvh()->SendNavigate(new_id, kUrl); // The same page_id returned. 367 test_rvh()->SendNavigate(new_id, kUrl); // The same page_id returned.
365 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1); 368 EXPECT_EQ(controller().GetLastCommittedEntryIndex(), 1);
366 EXPECT_FALSE(controller().GetPendingEntry()); 369 EXPECT_FALSE(controller().GetPendingEntry());
367 // New message should be sent out to make sure to enter view-source mode. 370 // New message should be sent out to make sure to enter view-source mode.
368 EXPECT_TRUE(process()->sink().GetUniqueMessageMatching( 371 EXPECT_TRUE(process()->sink().GetUniqueMessageMatching(
369 ViewMsg_EnableViewSourceMode::ID)); 372 ViewMsg_EnableViewSourceMode::ID));
370 } 373 }
371 374
372 // Tests the Init function by checking the initial RenderViewHost. 375 // Tests the Init function by checking the initial RenderViewHost.
373 TEST_F(RenderViewHostManagerTest, Init) { 376 TEST_F(RenderViewHostManagerTest, Init) {
374 // Using TestBrowserContext. 377 // Using TestBrowserContext.
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 } 750 }
748 751
749 // Ensure that we can go back and forward even if a SwapOut ACK isn't received. 752 // Ensure that we can go back and forward even if a SwapOut ACK isn't received.
750 // See http://crbug.com/93427. 753 // See http://crbug.com/93427.
751 TEST_F(RenderViewHostManagerTest, NavigateAfterMissingSwapOutACK) { 754 TEST_F(RenderViewHostManagerTest, NavigateAfterMissingSwapOutACK) {
752 const GURL kUrl1("http://www.google.com/"); 755 const GURL kUrl1("http://www.google.com/");
753 const GURL kUrl2("http://www.chromium.org/"); 756 const GURL kUrl2("http://www.chromium.org/");
754 757
755 // Navigate to two pages. 758 // Navigate to two pages.
756 contents()->NavigateAndCommit(kUrl1); 759 contents()->NavigateAndCommit(kUrl1);
757 TestRenderViewHost* rvh1 = rvh(); 760 TestRenderViewHost* rvh1 = test_rvh();
758 contents()->NavigateAndCommit(kUrl2); 761 contents()->NavigateAndCommit(kUrl2);
759 TestRenderViewHost* rvh2 = rvh(); 762 TestRenderViewHost* rvh2 = test_rvh();
760 763
761 // Now go back, but suppose the SwapOut_ACK isn't received. This shouldn't 764 // Now go back, but suppose the SwapOut_ACK isn't received. This shouldn't
762 // happen, but we have seen it when going back quickly across many entries 765 // happen, but we have seen it when going back quickly across many entries
763 // (http://crbug.com/93427). 766 // (http://crbug.com/93427).
764 contents()->GetController().GoBack(); 767 contents()->GetController().GoBack();
765 EXPECT_TRUE(rvh2->is_waiting_for_beforeunload_ack()); 768 EXPECT_TRUE(rvh2->is_waiting_for_beforeunload_ack());
766 contents()->ProceedWithCrossSiteNavigation(); 769 contents()->ProceedWithCrossSiteNavigation();
767 EXPECT_FALSE(rvh2->is_waiting_for_beforeunload_ack()); 770 EXPECT_FALSE(rvh2->is_waiting_for_beforeunload_ack());
768 rvh2->SwapOut(1, 1); 771 rvh2->SwapOut(1, 1);
769 EXPECT_TRUE(rvh2->is_waiting_for_unload_ack()); 772 EXPECT_TRUE(rvh2->is_waiting_for_unload_ack());
770 773
771 // The back navigation commits. We should proactively clear the 774 // The back navigation commits. We should proactively clear the
772 // is_waiting_for_unload_ack state to be safe. 775 // is_waiting_for_unload_ack state to be safe.
773 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry(); 776 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry();
774 rvh1->SendNavigate(entry1->GetPageID(), entry1->GetURL()); 777 rvh1->SendNavigate(entry1->GetPageID(), entry1->GetURL());
775 EXPECT_TRUE(rvh2->is_swapped_out()); 778 EXPECT_TRUE(rvh2->is_swapped_out());
776 EXPECT_FALSE(rvh2->is_waiting_for_unload_ack()); 779 EXPECT_FALSE(rvh2->is_waiting_for_unload_ack());
777 780
778 // We should be able to navigate forward. 781 // We should be able to navigate forward.
779 contents()->GetController().GoForward(); 782 contents()->GetController().GoForward();
780 contents()->ProceedWithCrossSiteNavigation(); 783 contents()->ProceedWithCrossSiteNavigation();
781 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); 784 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry();
782 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL()); 785 rvh2->SendNavigate(entry2->GetPageID(), entry2->GetURL());
783 EXPECT_EQ(rvh2, rvh()); 786 EXPECT_EQ(rvh2, rvh());
784 EXPECT_FALSE(rvh2->is_swapped_out()); 787 EXPECT_FALSE(rvh2->is_swapped_out());
785 EXPECT_TRUE(rvh1->is_swapped_out()); 788 EXPECT_TRUE(rvh1->is_swapped_out());
786 } 789 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698