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 |