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

Side by Side Diff: chrome/browser/renderer_host/render_view_host_manager_unittest.cc

Issue 150069: Move RenderViewHostManager back to tab_contents. Moving it to renderer_host... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 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
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/renderer_host/test_render_view_host.h"
6 #include "chrome/browser/tab_contents/navigation_controller.h"
7 #include "chrome/browser/tab_contents/navigation_entry.h"
8 #include "chrome/browser/renderer_host/render_view_host_manager.h"
9 #include "chrome/common/ipc_message.h"
10 #include "chrome/common/render_messages.h"
11 #include "chrome/common/url_constants.h"
12 #include "chrome/test/test_notification_tracker.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 class RenderViewHostManagerTest : public RenderViewHostTestHarness {
16 public:
17 void NavigateActiveAndCommit(const GURL& url) {
18 // Note: we navigate the active RenderViewHost because previous navigations
19 // won't have committed yet, so NavigateAndCommit does the wrong thing
20 // for us.
21 controller().LoadURL(url, GURL(), 0);
22 active_rvh()->SendNavigate(
23 static_cast<MockRenderProcessHost*>(active_rvh()->process())->
24 max_page_id() + 1,
25 url);
26 }
27 };
28
29 // Tests that when you navigate from the New TabPage to another page, and
30 // then do that same thing in another tab, that the two resulting pages have
31 // different SiteInstances, BrowsingInstances, and RenderProcessHosts. This is
32 // a regression test for bug 9364.
33 TEST_F(RenderViewHostManagerTest, NewTabPageProcesses) {
34 GURL ntp(chrome::kChromeUINewTabURL);
35 GURL dest("http://www.google.com/");
36
37 // Navigate our first tab to the new tab page and then to the destination.
38 NavigateActiveAndCommit(ntp);
39 NavigateActiveAndCommit(dest);
40
41 // Make a second tab.
42 TestTabContents contents2(profile_.get(), NULL);
43
44 // Load the two URLs in the second tab. Note that the first navigation creates
45 // a RVH that's not pending (since there is no cross-site transition), so
46 // we use the committed one, but the second one is the opposite.
47 contents2.controller().LoadURL(ntp, GURL(), PageTransition::LINK);
48 static_cast<TestRenderViewHost*>(contents2.render_manager()->
49 current_host())->SendNavigate(100, ntp);
50 contents2.controller().LoadURL(dest, GURL(), PageTransition::LINK);
51 static_cast<TestRenderViewHost*>(contents2.render_manager()->
52 pending_render_view_host())->SendNavigate(101, dest);
53
54 // The two RVH's should be different in every way.
55 EXPECT_NE(active_rvh()->process(), contents2.render_view_host()->process());
56 EXPECT_NE(active_rvh()->site_instance(),
57 contents2.render_view_host()->site_instance());
58 EXPECT_NE(active_rvh()->site_instance()->browsing_instance(),
59 contents2.render_view_host()->site_instance()->browsing_instance());
60
61 // Navigate both to the new tab page, and verify that they share a
62 // SiteInstance.
63 NavigateActiveAndCommit(ntp);
64
65 contents2.controller().LoadURL(ntp, GURL(), PageTransition::LINK);
66 static_cast<TestRenderViewHost*>(contents2.render_manager()->
67 pending_render_view_host())->SendNavigate(102, ntp);
68
69 EXPECT_EQ(active_rvh()->site_instance(),
70 contents2.render_view_host()->site_instance());
71 }
72
73 // When there is an error with the specified page, renderer exits view-source
74 // mode. See WebFrameImpl::DidFail(). We check by this test that
75 // EnableViewSourceMode message is sent on every navigation regardless
76 // RenderView is being newly created or reused.
77 TEST_F(RenderViewHostManagerTest, AlwaysSendEnableViewSourceMode) {
78 const GURL kNtpUrl(chrome::kChromeUINewTabURL);
79 const GURL kUrl("view-source:http://foo");
80
81 // We have to navigate to some page at first since without this, the first
82 // navigation will reuse the SiteInstance created by Init(), and the second
83 // one will create a new SiteInstance. Because current_instance and
84 // new_instance will be different, a new RenderViewHost will be created for
85 // the second navigation. We have to avoid this in order to exercise the
86 // target code patch.
87 NavigateActiveAndCommit(kNtpUrl);
88
89 // Navigate.
90 controller().LoadURL(kUrl, GURL() /* referer */, PageTransition::TYPED);
91 // Simulate response from RenderView for FirePageBeforeUnload.
92 rvh()->TestOnMessageReceived(
93 ViewHostMsg_ShouldClose_ACK(rvh()->routing_id(), true));
94 ASSERT_TRUE(pending_rvh()); // New pending RenderViewHost will be created.
95 RenderViewHost* last_rvh = pending_rvh();
96 int new_id = static_cast<MockRenderProcessHost*>(pending_rvh()->process())->
97 max_page_id() + 1;
98 pending_rvh()->SendNavigate(new_id, kUrl);
99 EXPECT_EQ(controller().last_committed_entry_index(), 1);
100 ASSERT_TRUE(controller().GetLastCommittedEntry());
101 EXPECT_TRUE(kUrl == controller().GetLastCommittedEntry()->url());
102 EXPECT_FALSE(controller().pending_entry());
103 // Because we're using TestTabContents and TestRenderViewHost in this
104 // unittest, no one calls TabContents::RenderViewCreated(). So, we see no
105 // EnableViewSourceMode message, here.
106
107 // Clear queued messages before load.
108 process()->sink().ClearMessages();
109 // Navigate, again.
110 controller().LoadURL(kUrl, GURL() /* referer */, PageTransition::TYPED);
111 // The same RenderViewHost should be reused.
112 EXPECT_FALSE(pending_rvh());
113 EXPECT_TRUE(last_rvh == rvh());
114 rvh()->SendNavigate(new_id, kUrl); // The same page_id returned.
115 EXPECT_EQ(controller().last_committed_entry_index(), 1);
116 EXPECT_FALSE(controller().pending_entry());
117 // New message should be sent out to make sure to enter view-source mode.
118 EXPECT_TRUE(process()->sink().GetUniqueMessageMatching(
119 ViewMsg_EnableViewSourceMode::ID));
120 }
121
122 // Tests the Init function by checking the initial RenderViewHost.
123 TEST_F(RenderViewHostManagerTest, Init) {
124 // Using TestingProfile.
125 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get());
126 EXPECT_FALSE(instance->has_site());
127
128 TestTabContents tab_contents(profile_.get(), instance);
129 RenderViewHostManager manager(&tab_contents, &tab_contents);
130
131 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE,
132 NULL /* modal_dialog_event */);
133
134 RenderViewHost* host = manager.current_host();
135 ASSERT_TRUE(host);
136 EXPECT_TRUE(instance == host->site_instance());
137 EXPECT_TRUE(&tab_contents == host->delegate());
138 EXPECT_TRUE(manager.current_view());
139 EXPECT_FALSE(manager.pending_render_view_host());
140 }
141
142 // Tests the Navigate function. We navigate three sites consequently and check
143 // how the pending/committed RenderViewHost are modified.
144 TEST_F(RenderViewHostManagerTest, Navigate) {
145 TestNotificationTracker notifications;
146
147 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get());
148
149 TestTabContents tab_contents(profile_.get(), instance);
150 notifications.ListenFor(NotificationType::RENDER_VIEW_HOST_CHANGED,
151 Source<NavigationController>(&tab_contents.controller()));
152
153 // Create.
154 RenderViewHostManager manager(&tab_contents, &tab_contents);
155
156 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE,
157 NULL /* modal_dialog_event */);
158
159 RenderViewHost* host;
160
161 // 1) The first navigation. --------------------------
162 GURL url1("http://www.google.com/");
163 NavigationEntry entry1(NULL /* instance */, -1 /* page_id */, url1,
164 GURL() /* referrer */, string16() /* title */,
165 PageTransition::TYPED);
166 host = manager.Navigate(entry1);
167
168 // The RenderViewHost created in Init will be reused.
169 EXPECT_TRUE(host == manager.current_host());
170 EXPECT_FALSE(manager.pending_render_view_host());
171
172 // Commit.
173 manager.DidNavigateMainFrame(host);
174 // Commit to SiteInstance should be delayed until RenderView commit.
175 EXPECT_TRUE(host == manager.current_host());
176 ASSERT_TRUE(host);
177 EXPECT_FALSE(host->site_instance()->has_site());
178 host->site_instance()->SetSite(url1);
179
180 // 2) Navigate to next site. -------------------------
181 GURL url2("http://www.google.com/foo");
182 NavigationEntry entry2(NULL /* instance */, -1 /* page_id */, url2,
183 url1 /* referrer */, string16() /* title */,
184 PageTransition::LINK);
185 host = manager.Navigate(entry2);
186
187 // The RenderViewHost created in Init will be reused.
188 EXPECT_TRUE(host == manager.current_host());
189 EXPECT_FALSE(manager.pending_render_view_host());
190
191 // Commit.
192 manager.DidNavigateMainFrame(host);
193 EXPECT_TRUE(host == manager.current_host());
194 ASSERT_TRUE(host);
195 EXPECT_TRUE(host->site_instance()->has_site());
196
197 // 3) Cross-site navigate to next site. --------------
198 GURL url3("http://webkit.org/");
199 NavigationEntry entry3(NULL /* instance */, -1 /* page_id */, url3,
200 url2 /* referrer */, string16() /* title */,
201 PageTransition::LINK);
202 host = manager.Navigate(entry3);
203
204 // A new RenderViewHost should be created.
205 EXPECT_TRUE(manager.pending_render_view_host());
206 EXPECT_TRUE(host == manager.pending_render_view_host());
207
208 notifications.Reset();
209
210 // Commit.
211 manager.DidNavigateMainFrame(manager.pending_render_view_host());
212 EXPECT_TRUE(host == manager.current_host());
213 ASSERT_TRUE(host);
214 EXPECT_TRUE(host->site_instance()->has_site());
215 // Check the pending RenderViewHost has been committed.
216 EXPECT_FALSE(manager.pending_render_view_host());
217
218 // We should observe a notification.
219 EXPECT_TRUE(notifications.Check1AndReset(
220 NotificationType::RENDER_VIEW_HOST_CHANGED));
221 }
222
223 // Tests DOMUI creation.
224 TEST_F(RenderViewHostManagerTest, DOMUI) {
225 SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get());
226
227 TestTabContents tab_contents(profile_.get(), instance);
228 RenderViewHostManager manager(&tab_contents, &tab_contents);
229
230 manager.Init(profile_.get(), instance, MSG_ROUTING_NONE,
231 NULL /* modal_dialog_event */);
232
233 GURL url("chrome://newtab");
234 NavigationEntry entry(NULL /* instance */, -1 /* page_id */, url,
235 GURL() /* referrer */, string16() /* title */,
236 PageTransition::TYPED);
237 RenderViewHost* host = manager.Navigate(entry);
238
239 EXPECT_TRUE(host);
240 EXPECT_TRUE(host == manager.current_host());
241 EXPECT_FALSE(manager.pending_render_view_host());
242 EXPECT_TRUE(manager.pending_dom_ui());
243 EXPECT_FALSE(manager.dom_ui());
244
245 // Commit.
246 manager.DidNavigateMainFrame(host);
247
248 EXPECT_FALSE(manager.pending_dom_ui());
249 EXPECT_TRUE(manager.dom_ui());
250 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_view_host_manager.cc ('k') | chrome/browser/renderer_host/resource_dispatcher_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698