| 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" | |
| 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 Loading... |
| 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 Loading... |
| 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(¶ms.screen_info); | 281 GetWebScreenInfo(¶ms.screen_info); |
| (...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |