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

Side by Side Diff: content/browser/renderer_host/render_view_host_impl.cc

Issue 108483008: Make RenderFrameHostManager swap RenderFrameHosts, not RenderViewHosts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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 "content/browser/renderer_host/render_view_host_impl.h" 5 #include "content/browser/renderer_host/render_view_host_impl.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/debug/trace_event.h" 14 #include "base/debug/trace_event.h"
15 #include "base/i18n/rtl.h" 15 #include "base/i18n/rtl.h"
16 #include "base/json/json_reader.h" 16 #include "base/json/json_reader.h"
17 #include "base/message_loop/message_loop.h" 17 #include "base/message_loop/message_loop.h"
18 #include "base/metrics/histogram.h" 18 #include "base/metrics/histogram.h"
19 #include "base/stl_util.h" 19 #include "base/stl_util.h"
20 #include "base/strings/string_util.h" 20 #include "base/strings/string_util.h"
21 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
22 #include "base/sys_info.h" 22 #include "base/sys_info.h"
23 #include "base/time/time.h" 23 #include "base/time/time.h"
24 #include "base/values.h" 24 #include "base/values.h"
25 #include "cc/base/switches.h" 25 #include "cc/base/switches.h"
26 #include "content/browser/child_process_security_policy_impl.h" 26 #include "content/browser/child_process_security_policy_impl.h"
27 #include "content/browser/cross_site_request_manager.h" 27 #include "content/browser/cross_site_request_manager.h"
28 #include "content/browser/dom_storage/session_storage_namespace_impl.h" 28 #include "content/browser/dom_storage/session_storage_namespace_impl.h"
29 #include "content/browser/frame_host/frame_tree.h" 29 #include "content/browser/frame_host/frame_tree.h"
30 #include "content/browser/frame_host/render_frame_host_factory.h"
31 #include "content/browser/gpu/compositor_util.h" 30 #include "content/browser/gpu/compositor_util.h"
32 #include "content/browser/gpu/gpu_data_manager_impl.h" 31 #include "content/browser/gpu/gpu_data_manager_impl.h"
33 #include "content/browser/gpu/gpu_process_host.h" 32 #include "content/browser/gpu/gpu_process_host.h"
34 #include "content/browser/gpu/gpu_surface_tracker.h" 33 #include "content/browser/gpu/gpu_surface_tracker.h"
35 #include "content/browser/host_zoom_map_impl.h" 34 #include "content/browser/host_zoom_map_impl.h"
36 #include "content/browser/loader/resource_dispatcher_host_impl.h" 35 #include "content/browser/loader/resource_dispatcher_host_impl.h"
37 #include "content/browser/renderer_host/dip_util.h" 36 #include "content/browser/renderer_host/dip_util.h"
38 #include "content/browser/renderer_host/media/audio_renderer_host.h" 37 #include "content/browser/renderer_host/media/audio_renderer_host.h"
39 #include "content/browser/renderer_host/render_process_host_impl.h" 38 #include "content/browser/renderer_host/render_process_host_impl.h"
40 #include "content/browser/renderer_host/render_view_host_delegate.h" 39 #include "content/browser/renderer_host/render_view_host_delegate.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 RenderWidgetHost* widget = 151 RenderWidgetHost* widget =
153 RenderWidgetHost::FromID(render_process_id, render_view_id); 152 RenderWidgetHost::FromID(render_process_id, render_view_id);
154 if (!widget || !widget->IsRenderView()) 153 if (!widget || !widget->IsRenderView())
155 return NULL; 154 return NULL;
156 return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(widget)); 155 return static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(widget));
157 } 156 }
158 157
159 RenderViewHostImpl::RenderViewHostImpl( 158 RenderViewHostImpl::RenderViewHostImpl(
160 SiteInstance* instance, 159 SiteInstance* instance,
161 RenderViewHostDelegate* delegate, 160 RenderViewHostDelegate* delegate,
162 RenderFrameHostDelegate* frame_delegate,
163 RenderWidgetHostDelegate* widget_delegate, 161 RenderWidgetHostDelegate* widget_delegate,
164 int routing_id, 162 int routing_id,
165 int main_frame_routing_id, 163 int main_frame_routing_id,
166 bool swapped_out, 164 bool swapped_out,
167 bool hidden) 165 bool hidden)
168 : RenderWidgetHostImpl(widget_delegate, 166 : RenderWidgetHostImpl(widget_delegate,
169 instance->GetProcess(), 167 instance->GetProcess(),
170 routing_id, 168 routing_id,
171 hidden), 169 hidden),
172 delegate_(delegate), 170 delegate_(delegate),
173 instance_(static_cast<SiteInstanceImpl*>(instance)), 171 instance_(static_cast<SiteInstanceImpl*>(instance)),
174 waiting_for_drag_context_response_(false), 172 waiting_for_drag_context_response_(false),
175 enabled_bindings_(0), 173 enabled_bindings_(0),
176 navigations_suspended_(false), 174 navigations_suspended_(false),
177 has_accessed_initial_document_(false), 175 has_accessed_initial_document_(false),
178 is_swapped_out_(swapped_out), 176 is_swapped_out_(swapped_out),
179 is_subframe_(false), 177 is_subframe_(false),
180 main_frame_id_(-1), 178 main_frame_id_(-1),
179 main_frame_routing_id_(main_frame_routing_id),
181 run_modal_reply_msg_(NULL), 180 run_modal_reply_msg_(NULL),
182 run_modal_opener_id_(MSG_ROUTING_NONE), 181 run_modal_opener_id_(MSG_ROUTING_NONE),
183 is_waiting_for_beforeunload_ack_(false), 182 is_waiting_for_beforeunload_ack_(false),
184 is_waiting_for_unload_ack_(false), 183 is_waiting_for_unload_ack_(false),
185 has_timed_out_on_unload_(false), 184 has_timed_out_on_unload_(false),
186 unload_ack_is_for_cross_site_transition_(false), 185 unload_ack_is_for_cross_site_transition_(false),
187 are_javascript_messages_suppressed_(false), 186 are_javascript_messages_suppressed_(false),
188 sudden_termination_allowed_(false), 187 sudden_termination_allowed_(false),
189 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) { 188 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING) {
190 DCHECK(instance_.get()); 189 DCHECK(instance_.get());
191 CHECK(delegate_); // http://crbug.com/82827 190 CHECK(delegate_); // http://crbug.com/82827
192 191
193 if (main_frame_routing_id == MSG_ROUTING_NONE)
194 main_frame_routing_id = GetProcess()->GetNextRoutingID();
195
196 main_render_frame_host_ = RenderFrameHostFactory::Create(
197 this, frame_delegate, delegate_->GetFrameTree(),
198 delegate_->GetFrameTree()->root(),
199 main_frame_routing_id, is_swapped_out_);
200 delegate_->GetFrameTree()->root()->set_render_frame_host(
201 main_render_frame_host_.get(), false);
202
203 GetProcess()->EnableSendQueue(); 192 GetProcess()->EnableSendQueue();
204 193
205 if (!swapped_out) 194 if (!swapped_out)
206 instance_->increment_active_view_count(); 195 instance_->increment_active_view_count();
207 196
208 if (ResourceDispatcherHostImpl::Get()) { 197 if (ResourceDispatcherHostImpl::Get()) {
209 BrowserThread::PostTask( 198 BrowserThread::PostTask(
210 BrowserThread::IO, FROM_HERE, 199 BrowserThread::IO, FROM_HERE,
211 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, 200 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated,
212 base::Unretained(ResourceDispatcherHostImpl::Get()), 201 base::Unretained(ResourceDispatcherHostImpl::Get()),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 // page ID it might be asked to render. 261 // page ID it might be asked to render.
273 int32 next_page_id = 1; 262 int32 next_page_id = 1;
274 if (max_page_id > -1) 263 if (max_page_id > -1)
275 next_page_id = max_page_id + 1; 264 next_page_id = max_page_id + 1;
276 265
277 ViewMsg_New_Params params; 266 ViewMsg_New_Params params;
278 params.renderer_preferences = 267 params.renderer_preferences =
279 delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext()); 268 delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext());
280 params.web_preferences = delegate_->GetWebkitPrefs(); 269 params.web_preferences = delegate_->GetWebkitPrefs();
281 params.view_id = GetRoutingID(); 270 params.view_id = GetRoutingID();
282 params.main_frame_routing_id = main_render_frame_host()->routing_id(); 271 params.main_frame_routing_id = main_frame_routing_id_;
283 params.surface_id = surface_id(); 272 params.surface_id = surface_id();
284 params.session_storage_namespace_id = 273 params.session_storage_namespace_id =
285 delegate_->GetSessionStorageNamespace(instance_)->id(); 274 delegate_->GetSessionStorageNamespace(instance_)->id();
286 params.frame_name = frame_name; 275 params.frame_name = frame_name;
287 // Ensure the RenderView sets its opener correctly. 276 // Ensure the RenderView sets its opener correctly.
288 params.opener_route_id = opener_route_id; 277 params.opener_route_id = opener_route_id;
289 params.swapped_out = is_swapped_out_; 278 params.swapped_out = is_swapped_out_;
290 params.hidden = is_hidden(); 279 params.hidden = is_hidden();
291 params.next_page_id = next_page_id; 280 params.next_page_id = next_page_id;
292 GetWebScreenInfo(&params.screen_info); 281 GetWebScreenInfo(&params.screen_info);
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 // Kill the renderer. 1272 // Kill the renderer.
1284 RecordAction(UserMetricsAction("BadMessageTerminate_RVH")); 1273 RecordAction(UserMetricsAction("BadMessageTerminate_RVH"));
1285 GetProcess()->ReceivedBadMessage(); 1274 GetProcess()->ReceivedBadMessage();
1286 } 1275 }
1287 1276
1288 return handled; 1277 return handled;
1289 } 1278 }
1290 1279
1291 void RenderViewHostImpl::Init() { 1280 void RenderViewHostImpl::Init() {
1292 RenderWidgetHostImpl::Init(); 1281 RenderWidgetHostImpl::Init();
1293 main_render_frame_host()->Init();
1294 } 1282 }
1295 1283
1296 void RenderViewHostImpl::Shutdown() { 1284 void RenderViewHostImpl::Shutdown() {
1297 // If we are being run modally (see RunModal), then we need to cleanup. 1285 // If we are being run modally (see RunModal), then we need to cleanup.
1298 if (run_modal_reply_msg_) { 1286 if (run_modal_reply_msg_) {
1299 Send(run_modal_reply_msg_); 1287 Send(run_modal_reply_msg_);
1300 run_modal_reply_msg_ = NULL; 1288 run_modal_reply_msg_ = NULL;
1301 RenderViewHostImpl* opener = 1289 RenderViewHostImpl* opener =
1302 RenderViewHostImpl::FromID(GetProcess()->GetID(), run_modal_opener_id_); 1290 RenderViewHostImpl::FromID(GetProcess()->GetID(), run_modal_opener_id_);
1303 if (opener) { 1291 if (opener) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1397 void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { 1385 void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) {
1398 // Keep the termination status so we can get at it later when we 1386 // Keep the termination status so we can get at it later when we
1399 // need to know why it died. 1387 // need to know why it died.
1400 render_view_termination_status_ = 1388 render_view_termination_status_ =
1401 static_cast<base::TerminationStatus>(status); 1389 static_cast<base::TerminationStatus>(status);
1402 1390
1403 // Reset frame tree state. 1391 // Reset frame tree state.
1404 // TODO(creis): Once subframes can be in different processes, we'll need to 1392 // TODO(creis): Once subframes can be in different processes, we'll need to
1405 // clear just the FrameTreeNodes affected by the crash (and their subtrees). 1393 // clear just the FrameTreeNodes affected by the crash (and their subtrees).
1406 main_frame_id_ = -1; 1394 main_frame_id_ = -1;
1407 delegate_->GetFrameTree()->SwapMainFrame(main_render_frame_host_.get()); 1395 delegate_->GetFrameTree()->ResetForMainFrameSwap();
1408 1396
1409 // Our base class RenderWidgetHost needs to reset some stuff. 1397 // Our base class RenderWidgetHost needs to reset some stuff.
1410 RendererExited(render_view_termination_status_, exit_code); 1398 RendererExited(render_view_termination_status_, exit_code);
1411 1399
1412 delegate_->RenderViewTerminated(this, 1400 delegate_->RenderViewTerminated(this,
1413 static_cast<base::TerminationStatus>(status), 1401 static_cast<base::TerminationStatus>(status),
1414 exit_code); 1402 exit_code);
1415 } 1403 }
1416 1404
1417 void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame( 1405 void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame(
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after
2292 file != file_paths.end(); ++file) { 2280 file != file_paths.end(); ++file) {
2293 if (!policy->CanReadFile(GetProcess()->GetID(), *file)) 2281 if (!policy->CanReadFile(GetProcess()->GetID(), *file))
2294 return false; 2282 return false;
2295 } 2283 }
2296 return true; 2284 return true;
2297 } 2285 }
2298 2286
2299 void RenderViewHostImpl::AttachToFrameTree() { 2287 void RenderViewHostImpl::AttachToFrameTree() {
2300 FrameTree* frame_tree = delegate_->GetFrameTree(); 2288 FrameTree* frame_tree = delegate_->GetFrameTree();
2301 2289
2302 frame_tree->SwapMainFrame(main_render_frame_host_.get()); 2290 frame_tree->ResetForMainFrameSwap();
2303 if (main_frame_id() != FrameTreeNode::kInvalidFrameId) { 2291 if (main_frame_id() != FrameTreeNode::kInvalidFrameId) {
2304 frame_tree->OnFirstNavigationAfterSwap(main_frame_id()); 2292 frame_tree->OnFirstNavigationAfterSwap(main_frame_id());
2305 } 2293 }
2306 } 2294 }
2307 2295
2308 } // namespace content 2296 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698