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 3 // found in the LICENSE file. 4 5 #include "content/test/test_web_contents.h" 6 7 #include <utility> 8 9 #include "content/browser/browser_url_handler_impl.h" 10 #include "content/browser/frame_host/navigation_entry_impl.h" 11 #include "content/browser/renderer_host/render_view_host_impl.h" 12 #include "content/browser/site_instance_impl.h" 13 #include "content/common/view_messages.h" 14 #include "content/public/browser/notification_registrar.h" 15 #include "content/public/browser/notification_source.h" 16 #include "content/public/browser/notification_types.h" 17 #include "content/public/common/page_state.h" 18 #include "content/public/common/page_transition_types.h" 19 #include "content/public/test/mock_render_process_host.h" 20 #include "content/test/test_render_view_host.h" 21 22 namespace content { 23 24 TestWebContents::TestWebContents(BrowserContext* browser_context) 25 : WebContentsImpl(browser_context, NULL), 26 transition_cross_site(false), 27 delegate_view_override_(NULL), 28 expect_set_history_length_and_prune_(false), 29 expect_set_history_length_and_prune_site_instance_(NULL), 30 expect_set_history_length_and_prune_history_length_(0), 31 expect_set_history_length_and_prune_min_page_id_(-1) { 32 } 33 34 TestWebContents* TestWebContents::Create(BrowserContext* browser_context, 35 SiteInstance* instance) { 36 TestWebContents* test_web_contents = new TestWebContents(browser_context); 37 test_web_contents->Init(WebContents::CreateParams(browser_context, instance)); 38 return test_web_contents; 39 } 40 41 TestWebContents::~TestWebContents() { 42 EXPECT_FALSE(expect_set_history_length_and_prune_); 43 } 44 45 RenderViewHost* TestWebContents::GetPendingRenderViewHost() const { 46 return GetRenderManager()->pending_render_view_host_; 47 } 48 49 TestRenderViewHost* TestWebContents::pending_test_rvh() const { 50 return static_cast<TestRenderViewHost*>(GetPendingRenderViewHost()); 51 } 52 53 void TestWebContents::TestDidNavigate(RenderViewHost* render_view_host, 54 int page_id, 55 const GURL& url, 56 PageTransition transition) { 57 TestDidNavigateWithReferrer(render_view_host, 58 page_id, 59 url, 60 Referrer(), 61 transition); 62 } 63 64 void TestWebContents::TestDidNavigateWithReferrer( 65 RenderViewHost* render_view_host, 66 int page_id, 67 const GURL& url, 68 const Referrer& referrer, 69 PageTransition transition) { 70 ViewHostMsg_FrameNavigate_Params params; 71 72 params.page_id = page_id; 73 params.url = url; 74 params.referrer = referrer; 75 params.transition = transition; 76 params.redirects = std::vector<GURL>(); 77 params.should_update_history = false; 78 params.searchable_form_url = GURL(); 79 params.searchable_form_encoding = std::string(); 80 params.security_info = std::string(); 81 params.gesture = NavigationGestureUser; 82 params.was_within_same_page = false; 83 params.is_post = false; 84 params.page_state = PageState::CreateFromURL(url); 85 86 DidNavigate(render_view_host, params); 87 } 88 89 WebPreferences TestWebContents::TestGetWebkitPrefs() { 90 return GetWebkitPrefs(); 91 } 92 93 bool TestWebContents::CreateRenderViewForRenderManager( 94 RenderViewHost* render_view_host, int opener_route_id) { 95 // This will go to a TestRenderViewHost. 96 static_cast<RenderViewHostImpl*>( 97 render_view_host)->CreateRenderView(base::string16(), 98 opener_route_id, 99 -1); 100 return true; 101 } 102 103 WebContents* TestWebContents::Clone() { 104 WebContentsImpl* contents = 105 Create(GetBrowserContext(), SiteInstance::Create(GetBrowserContext())); 106 contents->GetController().CopyStateFrom(controller_); 107 return contents; 108 } 109 110 void TestWebContents::NavigateAndCommit(const GURL& url) { 111 GetController().LoadURL( 112 url, Referrer(), PAGE_TRANSITION_LINK, std::string()); 113 GURL loaded_url(url); 114 bool reverse_on_redirect = false; 115 BrowserURLHandlerImpl::GetInstance()->RewriteURLIfNecessary( 116 &loaded_url, GetBrowserContext(), &reverse_on_redirect); 117 118 // LoadURL created a navigation entry, now simulate the RenderView sending 119 // a notification that it actually navigated. 120 CommitPendingNavigation(); 121 } 122 123 void TestWebContents::TestSetIsLoading(bool value) { 124 SetIsLoading(GetRenderViewHost(), value, NULL); 125 } 126 127 void TestWebContents::CommitPendingNavigation() { 128 // If we are doing a cross-site navigation, this simulates the current RVH 129 // notifying that it has unloaded so the pending RVH is resumed and can 130 // navigate. 131 ProceedWithCrossSiteNavigation(); 132 RenderViewHost* old_rvh = GetRenderViewHost(); 133 TestRenderViewHost* rvh = 134 static_cast<TestRenderViewHost*>(GetPendingRenderViewHost()); 135 if (!rvh) 136 rvh = static_cast<TestRenderViewHost*>(old_rvh); 137 138 const NavigationEntry* entry = GetController().GetPendingEntry(); 139 DCHECK(entry); 140 int page_id = entry->GetPageID(); 141 if (page_id == -1) { 142 // It's a new navigation, assign a never-seen page id to it. 143 page_id = GetMaxPageIDForSiteInstance(rvh->GetSiteInstance()) + 1; 144 } 145 146 // Simulate the SwapOut_ACK that happens when we swap out the old 147 // RVH, before the navigation commits. This is needed when 148 // cross-site navigation happens (old_rvh != rvh). 149 if (old_rvh != rvh) 150 static_cast<RenderViewHostImpl*>(old_rvh)->OnSwappedOut(false); 151 rvh->SendNavigate(page_id, entry->GetURL()); 152 } 153 154 void TestWebContents::ProceedWithCrossSiteNavigation() { 155 if (!GetPendingRenderViewHost()) 156 return; 157 TestRenderViewHost* rvh = static_cast<TestRenderViewHost*>( 158 GetRenderViewHost()); 159 rvh->SendShouldCloseACK(true); 160 } 161 162 RenderViewHostDelegateView* TestWebContents::GetDelegateView() { 163 if (delegate_view_override_) 164 return delegate_view_override_; 165 return WebContentsImpl::GetDelegateView(); 166 } 167 168 void TestWebContents::SetOpener(TestWebContents* opener) { 169 // This is normally only set in the WebContents constructor, which also 170 // registers an observer for when the opener gets closed. 171 opener_ = opener; 172 AddDestructionObserver(opener_); 173 } 174 175 void TestWebContents::AddPendingContents(TestWebContents* contents) { 176 // This is normally only done in WebContentsImpl::CreateNewWindow. 177 pending_contents_[contents->GetRenderViewHost()->GetRoutingID()] = contents; 178 AddDestructionObserver(contents); 179 } 180 181 void TestWebContents::ExpectSetHistoryLengthAndPrune( 182 const SiteInstance* site_instance, 183 int history_length, 184 int32 min_page_id) { 185 expect_set_history_length_and_prune_ = true; 186 expect_set_history_length_and_prune_site_instance_ = 187 static_cast<const SiteInstanceImpl*>(site_instance); 188 expect_set_history_length_and_prune_history_length_ = history_length; 189 expect_set_history_length_and_prune_min_page_id_ = min_page_id; 190 } 191 192 void TestWebContents::SetHistoryLengthAndPrune( 193 const SiteInstance* site_instance, int history_length, 194 int32 min_page_id) { 195 EXPECT_TRUE(expect_set_history_length_and_prune_); 196 expect_set_history_length_and_prune_ = false; 197 EXPECT_EQ(expect_set_history_length_and_prune_site_instance_, site_instance); 198 EXPECT_EQ(expect_set_history_length_and_prune_history_length_, 199 history_length); 200 EXPECT_EQ(expect_set_history_length_and_prune_min_page_id_, min_page_id); 201 } 202 203 void TestWebContents::TestDidFinishLoad(int64 frame_id, 204 const GURL& url, 205 bool is_main_frame) { 206 ViewHostMsg_DidFinishLoad msg(0, frame_id, url, is_main_frame); 207 OnMessageReceived(GetRenderViewHost(), msg); 208 } 209 210 void TestWebContents::TestDidFailLoadWithError( 211 int64 frame_id, 212 const GURL& url, 213 bool is_main_frame, 214 int error_code, 215 const base::string16& error_description) { 216 ViewHostMsg_DidFailLoadWithError msg( 217 0, frame_id, url, is_main_frame, error_code, error_description); 218 OnMessageReceived(GetRenderViewHost(), msg); 219 } 220 221 void TestWebContents::CreateNewWindow( 222 int render_process_id, 223 int route_id, 224 int main_frame_route_id, 225 const ViewHostMsg_CreateWindow_Params& params, 226 SessionStorageNamespace* session_storage_namespace) { 227 } 228 229 void TestWebContents::CreateNewWidget(int render_process_id, 230 int route_id, 231 blink::WebPopupType popup_type) { 232 } 233 234 void TestWebContents::CreateNewFullscreenWidget(int render_process_id, 235 int route_id) { 236 } 237 238 void TestWebContents::ShowCreatedWindow(int route_id, 239 WindowOpenDisposition disposition, 240 const gfx::Rect& initial_pos, 241 bool user_gesture) { 242 } 243 244 void TestWebContents::ShowCreatedWidget(int route_id, 245 const gfx::Rect& initial_pos) { 246 } 247 248 void TestWebContents::ShowCreatedFullscreenWidget(int route_id) { 249 } 250 251 } // namespace content 252