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> |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 routing_id, | 191 routing_id, |
192 hidden), | 192 hidden), |
193 delegate_(delegate), | 193 delegate_(delegate), |
194 instance_(static_cast<SiteInstanceImpl*>(instance)), | 194 instance_(static_cast<SiteInstanceImpl*>(instance)), |
195 waiting_for_drag_context_response_(false), | 195 waiting_for_drag_context_response_(false), |
196 enabled_bindings_(0), | 196 enabled_bindings_(0), |
197 navigations_suspended_(false), | 197 navigations_suspended_(false), |
198 has_accessed_initial_document_(false), | 198 has_accessed_initial_document_(false), |
199 is_swapped_out_(swapped_out), | 199 is_swapped_out_(swapped_out), |
200 is_subframe_(false), | 200 is_subframe_(false), |
201 main_frame_id_(-1), | |
202 main_frame_routing_id_(main_frame_routing_id), | 201 main_frame_routing_id_(main_frame_routing_id), |
203 run_modal_reply_msg_(NULL), | 202 run_modal_reply_msg_(NULL), |
204 run_modal_opener_id_(MSG_ROUTING_NONE), | 203 run_modal_opener_id_(MSG_ROUTING_NONE), |
205 is_waiting_for_beforeunload_ack_(false), | 204 is_waiting_for_beforeunload_ack_(false), |
206 is_waiting_for_unload_ack_(false), | 205 is_waiting_for_unload_ack_(false), |
207 has_timed_out_on_unload_(false), | 206 has_timed_out_on_unload_(false), |
208 unload_ack_is_for_cross_site_transition_(false), | 207 unload_ack_is_for_cross_site_transition_(false), |
209 are_javascript_messages_suppressed_(false), | 208 are_javascript_messages_suppressed_(false), |
210 sudden_termination_allowed_(false), | 209 sudden_termination_allowed_(false), |
211 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), | 210 render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), |
212 virtual_keyboard_requested_(false) { | 211 virtual_keyboard_requested_(false) { |
213 DCHECK(instance_.get()); | 212 DCHECK(instance_.get()); |
214 CHECK(delegate_); // http://crbug.com/82827 | 213 CHECK(delegate_); // http://crbug.com/82827 |
215 | 214 |
216 GetProcess()->EnableSendQueue(); | 215 GetProcess()->EnableSendQueue(); |
217 | 216 |
218 if (!swapped_out) | 217 if (!swapped_out) |
219 instance_->increment_active_view_count(); | 218 instance_->increment_active_view_count(); |
220 | 219 |
221 if (ResourceDispatcherHostImpl::Get()) { | 220 if (ResourceDispatcherHostImpl::Get()) { |
222 BrowserThread::PostTask( | 221 BrowserThread::PostTask( |
223 BrowserThread::IO, FROM_HERE, | 222 BrowserThread::IO, FROM_HERE, |
224 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, | 223 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, |
225 base::Unretained(ResourceDispatcherHostImpl::Get()), | 224 base::Unretained(ResourceDispatcherHostImpl::Get()), |
226 GetProcess()->GetID(), GetRoutingID())); | 225 GetProcess()->GetID(), GetRoutingID())); |
227 } | 226 } |
| 227 LOG(INFO) << "NEW RVH: process " << GetProcess()->GetID() << |
| 228 ", route " << GetRoutingID() << ", SID " << |
| 229 instance_->GetId() << ", site " << instance_->GetSiteURL(); |
228 | 230 |
229 #if defined(OS_ANDROID) | 231 #if defined(OS_ANDROID) |
230 media_player_manager_.reset(BrowserMediaPlayerManager::Create(this)); | 232 media_player_manager_.reset(BrowserMediaPlayerManager::Create(this)); |
231 #endif | 233 #endif |
232 } | 234 } |
233 | 235 |
234 RenderViewHostImpl::~RenderViewHostImpl() { | 236 RenderViewHostImpl::~RenderViewHostImpl() { |
| 237 LOG(INFO) << "DELETE RVH: process " << GetProcess()->GetID() << |
| 238 ", route " << GetRoutingID() << ", SID " << instance_->GetId(); |
235 if (ResourceDispatcherHostImpl::Get()) { | 239 if (ResourceDispatcherHostImpl::Get()) { |
236 BrowserThread::PostTask( | 240 BrowserThread::PostTask( |
237 BrowserThread::IO, FROM_HERE, | 241 BrowserThread::IO, FROM_HERE, |
238 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, | 242 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, |
239 base::Unretained(ResourceDispatcherHostImpl::Get()), | 243 base::Unretained(ResourceDispatcherHostImpl::Get()), |
240 GetProcess()->GetID(), GetRoutingID())); | 244 GetProcess()->GetID(), GetRoutingID())); |
241 } | 245 } |
242 | 246 |
243 delegate_->RenderViewDeleted(this); | 247 delegate_->RenderViewDeleted(this); |
244 | 248 |
245 // Be sure to clean up any leftover state from cross-site requests. | 249 // Be sure to clean up any leftover state from cross-site requests. |
246 CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest( | 250 CrossSiteRequestManager::GetInstance()->SetHasPendingCrossSiteRequest( |
247 GetProcess()->GetID(), GetRoutingID(), false); | 251 GetProcess()->GetID(), GetRoutingID(), false); |
248 | 252 |
249 // If this was swapped out, it already decremented the active view | 253 // If this was swapped out, it already decremented the active view |
250 // count of the SiteInstance it belongs to. | 254 // count of the SiteInstance it belongs to. |
251 if (!is_swapped_out_) | 255 if (!is_swapped_out_) |
252 instance_->decrement_active_view_count(); | 256 instance_->decrement_active_view_count(); |
253 } | 257 } |
254 | 258 |
255 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const { | 259 RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const { |
256 return delegate_; | 260 return delegate_; |
257 } | 261 } |
258 | 262 |
259 SiteInstance* RenderViewHostImpl::GetSiteInstance() const { | 263 SiteInstance* RenderViewHostImpl::GetSiteInstance() const { |
260 return instance_.get(); | 264 return instance_.get(); |
261 } | 265 } |
262 | 266 |
| 267 void RenderViewHostImpl::RegisterFrameID(int64 frame_id, |
| 268 int64 frame_tree_node_id) { |
| 269 frame_id_map_[frame_id] = frame_tree_node_id; |
| 270 } |
| 271 |
| 272 void RenderViewHostImpl::UnregisterFrameID(int64 frame_id) { |
| 273 CHECK(HasFrameID(frame_id)); |
| 274 frame_id_map_.erase(frame_id); |
| 275 } |
| 276 |
| 277 bool RenderViewHostImpl::HasFrameID(int64 frame_id) const { |
| 278 return frame_id_map_.find(frame_id) != frame_id_map_.end(); |
| 279 } |
| 280 |
| 281 int64 RenderViewHostImpl::GetFrameTreeNodeID(int64 frame_id) { |
| 282 return frame_id_map_[frame_id]; |
| 283 } |
| 284 |
| 285 int64 RenderViewHostImpl::GetFrameIDForTesting(int64 frame_tree_node_id) const { |
| 286 for (FrameIDMap::const_iterator iter = frame_id_map_.begin(); |
| 287 iter != frame_id_map_.end(); |
| 288 iter++) { |
| 289 if (iter->second == frame_tree_node_id) |
| 290 return iter->first; |
| 291 } |
| 292 return -1; |
| 293 } |
| 294 |
263 bool RenderViewHostImpl::CreateRenderView( | 295 bool RenderViewHostImpl::CreateRenderView( |
264 const base::string16& frame_name, | 296 const base::string16& frame_name, |
265 int opener_route_id, | 297 int opener_route_id, |
266 int32 max_page_id) { | 298 int32 max_page_id) { |
267 TRACE_EVENT0("renderer_host", "RenderViewHostImpl::CreateRenderView"); | 299 TRACE_EVENT0("renderer_host", "RenderViewHostImpl::CreateRenderView"); |
268 DCHECK(!IsRenderViewLive()) << "Creating view twice"; | 300 DCHECK(!IsRenderViewLive()) << "Creating view twice"; |
269 | 301 |
270 // The process may (if we're sharing a process with another host that already | 302 // The process may (if we're sharing a process with another host that already |
271 // initialized it) or may not (we have our own process or the old process | 303 // initialized it) or may not (we have our own process or the old process |
272 // crashed) have been initialized. Calling Init multiple times will be | 304 // crashed) have been initialized. Calling Init multiple times will be |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 } | 727 } |
696 | 728 |
697 void RenderViewHostImpl::OnCrossSiteResponse( | 729 void RenderViewHostImpl::OnCrossSiteResponse( |
698 const GlobalRequestID& global_request_id, | 730 const GlobalRequestID& global_request_id, |
699 bool is_transfer, | 731 bool is_transfer, |
700 const std::vector<GURL>& transfer_url_chain, | 732 const std::vector<GURL>& transfer_url_chain, |
701 const Referrer& referrer, | 733 const Referrer& referrer, |
702 PageTransition page_transition, | 734 PageTransition page_transition, |
703 int64 frame_id, | 735 int64 frame_id, |
704 bool should_replace_current_entry) { | 736 bool should_replace_current_entry) { |
705 RenderViewHostDelegate::RendererManagement* manager = | 737 FrameTreeNode* node = NULL; |
706 delegate_->GetRendererManagementDelegate(); | 738 if (frame_id != -1) { |
| 739 CHECK(HasFrameID(frame_id)); |
| 740 int64 frame_tree_node_id = GetFrameTreeNodeID(frame_id); |
| 741 node = delegate_->GetFrameTree()->FindByID(frame_tree_node_id); |
| 742 } |
| 743 |
| 744 // TODO(creis): We should always be able to get the RFHM for a frame_id, |
| 745 // but today the frame_id is -1 for the main frame. |
| 746 RenderViewHostDelegate::RendererManagement* manager = node ? |
| 747 node->render_manager() : delegate_->GetRendererManagementDelegate(); |
| 748 CHECK(manager); |
707 if (manager) { | 749 if (manager) { |
708 manager->OnCrossSiteResponse(this, global_request_id, is_transfer, | 750 manager->OnCrossSiteResponse(this, global_request_id, is_transfer, |
709 transfer_url_chain, referrer, page_transition, | 751 transfer_url_chain, referrer, page_transition, |
710 frame_id, should_replace_current_entry); | 752 frame_id, should_replace_current_entry); |
711 } | 753 } |
712 } | 754 } |
713 | 755 |
714 void RenderViewHostImpl::SuppressDialogsUntilSwapOut() { | 756 void RenderViewHostImpl::SuppressDialogsUntilSwapOut() { |
715 Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID())); | 757 Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID())); |
716 } | 758 } |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1408 | 1450 |
1409 void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { | 1451 void RenderViewHostImpl::OnRenderProcessGone(int status, int exit_code) { |
1410 // Keep the termination status so we can get at it later when we | 1452 // Keep the termination status so we can get at it later when we |
1411 // need to know why it died. | 1453 // need to know why it died. |
1412 render_view_termination_status_ = | 1454 render_view_termination_status_ = |
1413 static_cast<base::TerminationStatus>(status); | 1455 static_cast<base::TerminationStatus>(status); |
1414 | 1456 |
1415 // Reset frame tree state. | 1457 // Reset frame tree state. |
1416 // TODO(creis): Once subframes can be in different processes, we'll need to | 1458 // TODO(creis): Once subframes can be in different processes, we'll need to |
1417 // clear just the FrameTreeNodes affected by the crash (and their subtrees). | 1459 // clear just the FrameTreeNodes affected by the crash (and their subtrees). |
1418 main_frame_id_ = -1; | |
1419 delegate_->GetFrameTree()->ResetForMainFrameSwap(); | 1460 delegate_->GetFrameTree()->ResetForMainFrameSwap(); |
| 1461 frame_id_map_.clear(); |
1420 | 1462 |
1421 // Our base class RenderWidgetHost needs to reset some stuff. | 1463 // Our base class RenderWidgetHost needs to reset some stuff. |
1422 RendererExited(render_view_termination_status_, exit_code); | 1464 RendererExited(render_view_termination_status_, exit_code); |
1423 | 1465 |
1424 delegate_->RenderViewTerminated(this, | 1466 delegate_->RenderViewTerminated(this, |
1425 static_cast<base::TerminationStatus>(status), | 1467 static_cast<base::TerminationStatus>(status), |
1426 exit_code); | 1468 exit_code); |
1427 } | 1469 } |
1428 | 1470 |
1429 void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame( | 1471 void RenderViewHostImpl::OnDidStartProvisionalLoadForFrame( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1482 // Navigate message, then the renderer was navigating before it received the | 1524 // Navigate message, then the renderer was navigating before it received the |
1483 // unload request. It will either respond to the unload request soon or our | 1525 // unload request. It will either respond to the unload request soon or our |
1484 // timer will expire. Either way, we should ignore this message, because we | 1526 // timer will expire. Either way, we should ignore this message, because we |
1485 // have already committed to closing this renderer. | 1527 // have already committed to closing this renderer. |
1486 if (is_waiting_for_unload_ack_) | 1528 if (is_waiting_for_unload_ack_) |
1487 return; | 1529 return; |
1488 | 1530 |
1489 // Cache the main frame id, so we can use it for creating the frame tree | 1531 // Cache the main frame id, so we can use it for creating the frame tree |
1490 // root node when needed. | 1532 // root node when needed. |
1491 if (PageTransitionIsMainFrame(validated_params.transition)) { | 1533 if (PageTransitionIsMainFrame(validated_params.transition)) { |
1492 if (main_frame_id_ == -1) { | 1534 int frame_tree_node_id = |
1493 main_frame_id_ = validated_params.frame_id; | 1535 delegate_->GetFrameTree()->root()->frame_tree_node_id(); |
| 1536 if (!HasFrameID(validated_params.frame_id)) { |
| 1537 RegisterFrameID(validated_params.frame_id, frame_tree_node_id); |
1494 } else { | 1538 } else { |
1495 // TODO(nasko): We plan to remove the usage of frame_id in navigation | 1539 // TODO(nasko): We plan to remove the usage of frame_id in navigation |
1496 // and move to routing ids. This is in place to ensure that a | 1540 // and move to routing ids. This is in place to ensure that a |
1497 // renderer is not misbehaving and sending us incorrect data. | 1541 // renderer is not misbehaving and sending us incorrect data. |
1498 DCHECK_EQ(main_frame_id_, validated_params.frame_id); | 1542 DCHECK_EQ(frame_tree_node_id, |
| 1543 GetFrameTreeNodeID(validated_params.frame_id)); |
1499 } | 1544 } |
1500 } | 1545 } |
1501 RenderProcessHost* process = GetProcess(); | 1546 RenderProcessHost* process = GetProcess(); |
1502 | 1547 |
1503 // Attempts to commit certain off-limits URL should be caught more strictly | 1548 // Attempts to commit certain off-limits URL should be caught more strictly |
1504 // than our FilterURL checks below. If a renderer violates this policy, it | 1549 // than our FilterURL checks below. If a renderer violates this policy, it |
1505 // should be killed. | 1550 // should be killed. |
1506 if (!CanCommitURL(validated_params.url)) { | 1551 if (!CanCommitURL(validated_params.url)) { |
1507 VLOG(1) << "Blocked URL " << validated_params.url.spec(); | 1552 VLOG(1) << "Blocked URL " << validated_params.url.spec(); |
1508 validated_params.url = GURL(kAboutBlankURL); | 1553 validated_params.url = GURL(kAboutBlankURL); |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 for (std::vector<base::FilePath>::const_iterator file = file_paths.begin(); | 2358 for (std::vector<base::FilePath>::const_iterator file = file_paths.begin(); |
2314 file != file_paths.end(); ++file) { | 2359 file != file_paths.end(); ++file) { |
2315 if (!policy->CanReadFile(GetProcess()->GetID(), *file)) | 2360 if (!policy->CanReadFile(GetProcess()->GetID(), *file)) |
2316 return false; | 2361 return false; |
2317 } | 2362 } |
2318 return true; | 2363 return true; |
2319 } | 2364 } |
2320 | 2365 |
2321 void RenderViewHostImpl::AttachToFrameTree() { | 2366 void RenderViewHostImpl::AttachToFrameTree() { |
2322 FrameTree* frame_tree = delegate_->GetFrameTree(); | 2367 FrameTree* frame_tree = delegate_->GetFrameTree(); |
2323 | |
2324 frame_tree->ResetForMainFrameSwap(); | 2368 frame_tree->ResetForMainFrameSwap(); |
2325 if (main_frame_id() != FrameTreeNode::kInvalidFrameId) { | |
2326 frame_tree->OnFirstNavigationAfterSwap(main_frame_id()); | |
2327 } | |
2328 } | 2369 } |
2329 | 2370 |
2330 } // namespace content | 2371 } // namespace content |
OLD | NEW |