OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/process/kill.h" | 12 #include "base/process/kill.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "content/browser/accessibility/accessibility_mode_helper.h" | 14 #include "content/browser/accessibility/accessibility_mode_helper.h" |
15 #include "content/browser/accessibility/ax_tree_id_registry.h" | 15 #include "content/browser/accessibility/ax_tree_id_registry.h" |
16 #include "content/browser/accessibility/browser_accessibility_manager.h" | 16 #include "content/browser/accessibility/browser_accessibility_manager.h" |
17 #include "content/browser/accessibility/browser_accessibility_state_impl.h" | 17 #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
18 #include "content/browser/bad_message.h" | |
19 #include "content/browser/child_process_security_policy_impl.h" | 18 #include "content/browser/child_process_security_policy_impl.h" |
20 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 19 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
21 #include "content/browser/frame_host/cross_process_frame_connector.h" | 20 #include "content/browser/frame_host/cross_process_frame_connector.h" |
22 #include "content/browser/frame_host/cross_site_transferring_request.h" | 21 #include "content/browser/frame_host/cross_site_transferring_request.h" |
23 #include "content/browser/frame_host/frame_mojo_shell.h" | 22 #include "content/browser/frame_host/frame_mojo_shell.h" |
24 #include "content/browser/frame_host/frame_tree.h" | 23 #include "content/browser/frame_host/frame_tree.h" |
25 #include "content/browser/frame_host/frame_tree_node.h" | 24 #include "content/browser/frame_host/frame_tree_node.h" |
26 #include "content/browser/frame_host/navigation_handle_impl.h" | 25 #include "content/browser/frame_host/navigation_handle_impl.h" |
27 #include "content/browser/frame_host/navigation_request.h" | 26 #include "content/browser/frame_host/navigation_request.h" |
28 #include "content/browser/frame_host/navigator.h" | 27 #include "content/browser/frame_host/navigator.h" |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 OnRunJavaScriptMessage) | 472 OnRunJavaScriptMessage) |
474 IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm, | 473 IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm, |
475 OnRunBeforeUnloadConfirm) | 474 OnRunBeforeUnloadConfirm) |
476 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAccessInitialDocument, | 475 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAccessInitialDocument, |
477 OnDidAccessInitialDocument) | 476 OnDidAccessInitialDocument) |
478 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeOpener, OnDidChangeOpener) | 477 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeOpener, OnDidChangeOpener) |
479 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeName, OnDidChangeName) | 478 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeName, OnDidChangeName) |
480 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAssignPageId, OnDidAssignPageId) | 479 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAssignPageId, OnDidAssignPageId) |
481 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeSandboxFlags, | 480 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeSandboxFlags, |
482 OnDidChangeSandboxFlags) | 481 OnDidChangeSandboxFlags) |
| 482 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties, |
| 483 OnDidChangeFrameOwnerProperties) |
483 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle) | 484 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle) |
484 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding) | 485 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding) |
485 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, | 486 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, |
486 OnBeginNavigation) | 487 OnBeginNavigation) |
487 IPC_MESSAGE_HANDLER(FrameHostMsg_DispatchLoad, OnDispatchLoad) | 488 IPC_MESSAGE_HANDLER(FrameHostMsg_DispatchLoad, OnDispatchLoad) |
488 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, | 489 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, |
489 OnTextSurroundingSelectionResponse) | 490 OnTextSurroundingSelectionResponse) |
490 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) | 491 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) |
491 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, | 492 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, |
492 OnAccessibilityLocationChanges) | 493 OnAccessibilityLocationChanges) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 | 644 |
644 DCHECK(GetProcess()->HasConnection()); | 645 DCHECK(GetProcess()->HasConnection()); |
645 | 646 |
646 FrameMsg_NewFrame_Params params; | 647 FrameMsg_NewFrame_Params params; |
647 params.routing_id = routing_id_; | 648 params.routing_id = routing_id_; |
648 params.proxy_routing_id = proxy_routing_id; | 649 params.proxy_routing_id = proxy_routing_id; |
649 params.opener_routing_id = opener_routing_id; | 650 params.opener_routing_id = opener_routing_id; |
650 params.parent_routing_id = parent_routing_id; | 651 params.parent_routing_id = parent_routing_id; |
651 params.previous_sibling_routing_id = previous_sibling_routing_id; | 652 params.previous_sibling_routing_id = previous_sibling_routing_id; |
652 params.replication_state = frame_tree_node()->current_replication_state(); | 653 params.replication_state = frame_tree_node()->current_replication_state(); |
| 654 params.frame_owner_properties = frame_tree_node()->frame_owner_properties(); |
653 | 655 |
654 if (render_widget_host_) { | 656 if (render_widget_host_) { |
655 params.widget_params.routing_id = render_widget_host_->GetRoutingID(); | 657 params.widget_params.routing_id = render_widget_host_->GetRoutingID(); |
656 params.widget_params.hidden = render_widget_host_->is_hidden(); | 658 params.widget_params.hidden = render_widget_host_->is_hidden(); |
657 } else { | 659 } else { |
658 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in | 660 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in |
659 // the renderer process. | 661 // the renderer process. |
660 params.widget_params.routing_id = MSG_ROUTING_NONE; | 662 params.widget_params.routing_id = MSG_ROUTING_NONE; |
661 params.widget_params.hidden = true; | 663 params.widget_params.hidden = true; |
662 } | 664 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 logging::LogMessage("CONSOLE", line_no, resolved_level).stream() | 737 logging::LogMessage("CONSOLE", line_no, resolved_level).stream() |
736 << "\"" << message << "\", source: " << source_id << " (" << line_no | 738 << "\"" << message << "\", source: " << source_id << " (" << line_no |
737 << ")"; | 739 << ")"; |
738 } | 740 } |
739 } | 741 } |
740 | 742 |
741 void RenderFrameHostImpl::OnCreateChildFrame( | 743 void RenderFrameHostImpl::OnCreateChildFrame( |
742 int new_routing_id, | 744 int new_routing_id, |
743 blink::WebTreeScopeType scope, | 745 blink::WebTreeScopeType scope, |
744 const std::string& frame_name, | 746 const std::string& frame_name, |
745 blink::WebSandboxFlags sandbox_flags) { | 747 blink::WebSandboxFlags sandbox_flags, |
| 748 const blink::WebFrameOwnerProperties& frame_owner_properties) { |
746 // It is possible that while a new RenderFrameHost was committed, the | 749 // It is possible that while a new RenderFrameHost was committed, the |
747 // RenderFrame corresponding to this host sent an IPC message to create a | 750 // RenderFrame corresponding to this host sent an IPC message to create a |
748 // frame and it is delivered after this host is swapped out. | 751 // frame and it is delivered after this host is swapped out. |
749 // Ignore such messages, as we know this RenderFrameHost is going away. | 752 // Ignore such messages, as we know this RenderFrameHost is going away. |
750 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) | 753 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) |
751 return; | 754 return; |
752 | 755 |
753 RenderFrameHostImpl* new_frame = | 756 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( |
754 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), | 757 frame_tree_node_, GetProcess()->GetID(), new_routing_id, scope, |
755 new_routing_id, scope, frame_name, sandbox_flags); | 758 frame_name, sandbox_flags, frame_owner_properties); |
756 if (!new_frame) | 759 if (!new_frame) |
757 return; | 760 return; |
758 | 761 |
759 // We know that the RenderFrame has been created in this case, immediately | 762 // We know that the RenderFrame has been created in this case, immediately |
760 // after the CreateChildFrame IPC was sent. | 763 // after the CreateChildFrame IPC was sent. |
761 new_frame->SetRenderFrameCreated(true); | 764 new_frame->SetRenderFrameCreated(true); |
762 } | 765 } |
763 | 766 |
764 void RenderFrameHostImpl::OnDetach() { | 767 void RenderFrameHostImpl::OnDetach() { |
765 frame_tree_->RemoveFrame(frame_tree_node_); | 768 frame_tree_->RemoveFrame(frame_tree_node_); |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 frame_tree_node_->render_manager()->CreateProxiesForNewNamedFrame(); | 1313 frame_tree_node_->render_manager()->CreateProxiesForNewNamedFrame(); |
1311 delegate_->DidChangeName(this, name); | 1314 delegate_->DidChangeName(this, name); |
1312 } | 1315 } |
1313 | 1316 |
1314 void RenderFrameHostImpl::OnDidAssignPageId(int32 page_id) { | 1317 void RenderFrameHostImpl::OnDidAssignPageId(int32 page_id) { |
1315 // Update the RVH's current page ID so that future IPCs from the renderer | 1318 // Update the RVH's current page ID so that future IPCs from the renderer |
1316 // correspond to the new page. | 1319 // correspond to the new page. |
1317 render_view_host_->page_id_ = page_id; | 1320 render_view_host_->page_id_ = page_id; |
1318 } | 1321 } |
1319 | 1322 |
| 1323 FrameTreeNode* RenderFrameHostImpl::FindAndVerifyChild( |
| 1324 int32 child_frame_routing_id, |
| 1325 bad_message::BadMessageReason reason) { |
| 1326 FrameTreeNode* child = frame_tree_node()->frame_tree()->FindByRoutingID( |
| 1327 GetProcess()->GetID(), child_frame_routing_id); |
| 1328 // A race can result in |child| to be nullptr. Avoid killing the renderer in |
| 1329 // that case. |
| 1330 if (child && child->parent() != frame_tree_node()) { |
| 1331 bad_message::ReceivedBadMessage(GetProcess(), reason); |
| 1332 return nullptr; |
| 1333 } |
| 1334 return child; |
| 1335 } |
| 1336 |
1320 void RenderFrameHostImpl::OnDidChangeSandboxFlags( | 1337 void RenderFrameHostImpl::OnDidChangeSandboxFlags( |
1321 int32 frame_routing_id, | 1338 int32 frame_routing_id, |
1322 blink::WebSandboxFlags flags) { | 1339 blink::WebSandboxFlags flags) { |
1323 FrameTree* frame_tree = frame_tree_node()->frame_tree(); | 1340 // Ensure that a frame can only update sandbox flags for its immediate |
1324 FrameTreeNode* child = | 1341 // children. If this is not the case, the renderer is considered malicious |
1325 frame_tree->FindByRoutingID(GetProcess()->GetID(), frame_routing_id); | 1342 // and is killed. |
| 1343 FrameTreeNode* child = FindAndVerifyChild( |
| 1344 frame_routing_id, bad_message::RFH_SANDBOX_FLAGS); |
1326 if (!child) | 1345 if (!child) |
1327 return; | 1346 return; |
1328 | 1347 |
1329 // Ensure that a frame can only update sandbox flags for its immediate | |
1330 // children. If this is not the case, the renderer is considered malicious | |
1331 // and is killed. | |
1332 if (child->parent() != frame_tree_node()) { | |
1333 bad_message::ReceivedBadMessage(GetProcess(), | |
1334 bad_message::RFH_SANDBOX_FLAGS); | |
1335 return; | |
1336 } | |
1337 | |
1338 child->set_sandbox_flags(flags); | 1348 child->set_sandbox_flags(flags); |
1339 | 1349 |
1340 // Notify the RenderFrame if it lives in a different process from its | 1350 // Notify the RenderFrame if it lives in a different process from its |
1341 // parent. The frame's proxies in other processes also need to learn about | 1351 // parent. The frame's proxies in other processes also need to learn about |
1342 // the updated sandbox flags, but these notifications are sent later in | 1352 // the updated sandbox flags, but these notifications are sent later in |
1343 // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame | 1353 // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame |
1344 // navigates and the new sandbox flags take effect. | 1354 // navigates and the new sandbox flags take effect. |
1345 RenderFrameHost* child_rfh = child->current_frame_host(); | 1355 RenderFrameHost* child_rfh = child->current_frame_host(); |
1346 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { | 1356 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { |
1347 child_rfh->Send( | 1357 child_rfh->Send( |
1348 new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); | 1358 new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); |
1349 } | 1359 } |
1350 } | 1360 } |
1351 | 1361 |
| 1362 void RenderFrameHostImpl::OnDidChangeFrameOwnerProperties( |
| 1363 int32 frame_routing_id, |
| 1364 const blink::WebFrameOwnerProperties& frame_owner_properties) { |
| 1365 FrameTreeNode* child = FindAndVerifyChild( |
| 1366 frame_routing_id, bad_message::RFH_OWNER_PROPERTY); |
| 1367 if (!child) |
| 1368 return; |
| 1369 |
| 1370 child->set_frame_owner_properties(frame_owner_properties); |
| 1371 |
| 1372 // Notify the RenderFrame if it lives in a different process from its parent. |
| 1373 // These properties only affect the RenderFrame and live in its parent |
| 1374 // (HTMLFrameOwnerElement). Therefore, we do not need to notify this frame's |
| 1375 // proxies. |
| 1376 RenderFrameHost* child_rfh = child->current_frame_host(); |
| 1377 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { |
| 1378 child_rfh->Send(new FrameMsg_SetFrameOwnerProperties( |
| 1379 child_rfh->GetRoutingID(), frame_owner_properties)); |
| 1380 } |
| 1381 } |
| 1382 |
1352 void RenderFrameHostImpl::OnUpdateTitle( | 1383 void RenderFrameHostImpl::OnUpdateTitle( |
1353 const base::string16& title, | 1384 const base::string16& title, |
1354 blink::WebTextDirection title_direction) { | 1385 blink::WebTextDirection title_direction) { |
1355 // This message is only sent for top-level frames. TODO(avi): when frame tree | 1386 // This message is only sent for top-level frames. TODO(avi): when frame tree |
1356 // mirroring works correctly, add a check here to enforce it. | 1387 // mirroring works correctly, add a check here to enforce it. |
1357 if (title.length() > kMaxTitleChars) { | 1388 if (title.length() > kMaxTitleChars) { |
1358 NOTREACHED() << "Renderer sent too many characters in title."; | 1389 NOTREACHED() << "Renderer sent too many characters in title."; |
1359 return; | 1390 return; |
1360 } | 1391 } |
1361 | 1392 |
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2306 *dst = src; | 2337 *dst = src; |
2307 | 2338 |
2308 if (src.routing_id != -1) | 2339 if (src.routing_id != -1) |
2309 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); | 2340 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); |
2310 | 2341 |
2311 if (src.parent_routing_id != -1) | 2342 if (src.parent_routing_id != -1) |
2312 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); | 2343 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
2313 } | 2344 } |
2314 | 2345 |
2315 } // namespace content | 2346 } // namespace content |
OLD | NEW |