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