render_frame_host_impl.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/containers/hash_tables.h" 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/lazy_instance.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/user_metrics_action.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/frame_tree.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/frame_tree_node.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/navigator.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_delegate.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_constants.h" 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// The (process id, routing id) pair that identifies one RenderFrame. 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef std::pair<int32, int32> RenderFrameHostID; 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap; 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderFrameHost* RenderFrameHost::FromID(int render_process_id, 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// static 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)RenderFrameHostImpl* RenderFrameHostImpl::FromID( 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int process_id, int routing_id) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap::iterator it = frames->find( 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(process_id, routing_id)); 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return it == frames->end() ? NULL : it->second; 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameHostImpl::RenderFrameHostImpl( 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RenderViewHostImpl* render_view_host, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostDelegate* delegate, 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTree* frame_tree, 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameTreeNode* frame_tree_node, 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int routing_id, 56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool is_swapped_out) 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : render_view_host_(render_view_host), 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_(delegate), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cross_process_frame_connector_(NULL), 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_(frame_tree), 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_node_(frame_tree_node), 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_(routing_id), 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_swapped_out_(is_swapped_out) { 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_->RegisterRenderFrameHost(this); 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->AddRoute(routing_id_, this); 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().insert(std::make_pair( 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_), 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) this)); 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameHostImpl::~RenderFrameHostImpl() { 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->RemoveRoute(routing_id_); 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().erase( 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_) 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_->RenderFrameDeleted(this); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Notify the FrameTree that this RFH is going away, allowing it to shut down 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the corresponding RenderViewHost if it is no longer needed. 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_->UnregisterRenderFrameHost(this); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SiteInstance* RenderFrameHostImpl::GetSiteInstance() { 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_->GetSiteInstance(); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderProcessHost* RenderFrameHostImpl::GetProcess() { 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): This should return its own process, once we have working 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cross-process navigation for subframes. 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_->GetProcess(); 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int RenderFrameHostImpl::GetRoutingID() { 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return routing_id_; 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView RenderFrameHostImpl::GetNativeView() { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* view = render_view_host_->GetView(); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!view) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return view->GetNativeView(); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::NotifyContextMenuClosed( 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const CustomContextMenuContext& context) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameMsg_ContextMenuClosed(routing_id_, context)); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::ExecuteCustomContextMenuCommand( 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int action, const CustomContextMenuContext& context) { 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameMsg_CustomContextMenuAction(routing_id_, context, action)); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)RenderViewHost* RenderFrameHostImpl::GetRenderViewHost() { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host_; 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::Send(IPC::Message* message) { 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return GetProcess()->Send(message); 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_->OnMessageReceived(this, msg)) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cross_process_frame_connector_ && 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cross_process_frame_connector_->OnMessageReceived(msg)) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool handled = true; 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool msg_is_ok = true; 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameHostImpl, msg, msg_is_ok) 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach) 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartProvisionalLoadForFrame, 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) OnDidStartProvisionalLoadForFrame) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailProvisionalLoadWithError, 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDidFailProvisionalLoadWithError) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidRedirectProvisionalLoad, 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDidRedirectProvisionalLoad) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailLoadWithError, 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDidFailLoadWithError) 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_DidCommitProvisionalLoad, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnNavigate(msg)) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!msg_is_ok) { 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The message had a handler, but its de-serialization failed. 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Kill the renderer. 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("BadMessageTerminate_RFH")); 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return handled; 158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderFrameHostImpl::Init() { 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->ResumeRequestsForView(routing_id_); 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameHostImpl::OnCreateChildFrame(int new_frame_routing_id, 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 parent_frame_id, 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 frame_id, 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& frame_name) { 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new_frame_routing_id, parent_frame_id, frame_id, frame_name); 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (delegate_) 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_->RenderFrameCreated(new_frame); 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameHostImpl::OnDetach(int64 parent_frame_id, int64 frame_id) { 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_->RemoveFrame(this, parent_frame_id, frame_id); 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int64 frame_id, 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int64 parent_frame_id, 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool is_main_frame, 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& url) { 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_tree_node_->navigator()->DidStartProvisionalLoad( 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, frame_id, parent_frame_id, is_main_frame, url); 1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidFailProvisionalLoadWithError( 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(this, params); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidFailLoadWithError( 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 frame_id, 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_main_frame, 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int error_code, 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& error_description) { 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL validated_url(url); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->FilterURL(false, &validated_url); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->navigator()->DidFailLoadWithError( 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, frame_id, validated_url, is_main_frame, error_code, 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error_description); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidRedirectProvisionalLoad( 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 page_id, 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& source_url, 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& target_url) { 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->navigator()->DidRedirectProvisionalLoad( 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, page_id, source_url, target_url); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Called when the renderer navigates. For every frame loaded, we'll get this 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// notification containing parameters identifying the navigation. 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Subframes are identified by the page transition type. For subframes loaded 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// as part of a wider page load, the page_id will be the same as for the top 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// level frame. If the user explicitly requests a subframe navigation, we will 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// get a new page_id because we need to create a new navigation entry for that 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// action. 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnNavigate(const IPC::Message& msg) { 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Read the parameters out of the IPC message directly to avoid making another 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // copy when we filter the URLs. 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PickleIterator iter(msg); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Read(&msg, &iter, &validated_params)) 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we're waiting for a cross-site beforeunload ack from this renderer and 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // we receive a Navigate message from the main frame, then the renderer was 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigating already and sent it before hearing the ViewMsg_Stop message. 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We do not want to cancel the pending navigation in this case, since the 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // old page will soon be stopped. Instead, treat this as a beforeunload ack 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to allow the pending navigation to continue. 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->is_waiting_for_beforeunload_ack_ && 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->unload_ack_is_for_cross_site_transition_ && 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PageTransitionIsMainFrame(validated_params.transition)) { 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->OnShouldCloseACK( 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, render_view_host_->send_should_close_start_time_, 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::Now()); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If we're waiting for an unload ack from this renderer and we receive a 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Navigate message, then the renderer was navigating before it received the 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // unload request. It will either respond to the unload request soon or our 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // timer will expire. Either way, we should ignore this message, because we 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // have already committed to closing this renderer. 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->IsWaitingForUnloadACK()) 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cache the main frame id, so we can use it for creating the frame tree 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // root node when needed. 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (PageTransitionIsMainFrame(validated_params.transition)) { 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->main_frame_id_ == -1) { 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->main_frame_id_ = validated_params.frame_id; 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(nasko): We plan to remove the usage of frame_id in navigation 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and move to routing ids. This is in place to ensure that a 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // renderer is not misbehaving and sending us incorrect data. 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(render_view_host_->main_frame_id_, validated_params.frame_id); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderProcessHost* process = GetProcess(); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Attempts to commit certain off-limits URL should be caught more strictly 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // than our FilterURL checks below. If a renderer violates this policy, it 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // should be killed. 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!CanCommitURL(validated_params.url)) { 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Blocked URL " << validated_params.url.spec(); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validated_params.url = GURL(kAboutBlankURL); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordAction(base::UserMetricsAction("CanCommitURL_BlockedAndKilled")); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Kills the process. 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->ReceivedBadMessage(); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Now that something has committed, we don't need to track whether the 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // initial page has been accessed. 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->has_accessed_initial_document_ = false; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Without this check, an evil renderer can trick the browser into creating 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a navigation entry for a banned URL. If the user clicks the back button 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // followed by the forward button (or clicks reload, or round-trips through 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // session restore, etc), we'll think that the browser commanded the 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // renderer to load the URL and grant the renderer the privileges to request 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the URL. To prevent this attack, we block the renderer from inserting 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // banned URLs into the navigation controller in the first place. 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &validated_params.url); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.referrer.url); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != validated_params.redirects.end(); ++it) { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &(*it)); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.searchable_form_url); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Without this check, the renderer can trick the browser into using 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // filenames it can't access in a future session restore. 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!render_view_host_->CanAccessFilesOfPageState( 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validated_params.page_state)) { 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->ReceivedBadMessage(); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node()->navigator()->DidNavigate(this, validated_params); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::SwapOut() { 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->IsRenderViewLive()) { 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameMsg_SwapOut(routing_id_)); 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Our RenderViewHost doesn't have a live renderer, so just skip the unload 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // event. 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnSwappedOut(true); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidStartLoading() { 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidStartLoading(this); 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnDidStopLoading() { 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidStopLoading(this); 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnSwapOutACK() { 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnSwappedOut(false); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnSwappedOut(bool timed_out) { 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame_tree_node_->render_manager()->SwappedOutFrame(this); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) { 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Validate the URLs in |params|. If the renderer can't request the URLs 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // directly, don't show them in the context menu. 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContextMenuParams validated_params(params); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderProcessHost* process = GetProcess(); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We don't validate |unfiltered_link_url| so that this field can be used 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // when users want to copy the original link URL. 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.link_url); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.src_url); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(false, &validated_params.page_url); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) process->FilterURL(true, &validated_params.frame_url); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowContextMenu(this, validated_params); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->SetPendingShutdown(on_swap_out); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(creis): We should also check for WebUI pages here. Also, when the 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // out-of-process iframes implementation is ready, we should check for 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // cross-site URLs that are not allowed to commit in this process. 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Give the client a chance to disallow URLs from committing. 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::Navigate(const FrameMsg_Navigate_Params& params) { 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TRACE_EVENT0("frame_host", "RenderFrameHostImpl::Navigate"); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Browser plugin guests are not allowed to navigate outside web-safe schemes, 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // so do not grant them the ability to request additional URLs. 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetProcess()->IsGuest()) { 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->GetID(), params.url); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (params.url.SchemeIs(kDataScheme) && 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.base_url_for_data_url.SchemeIs(kFileScheme)) { 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If 'data:' is used, and we have a 'file:' base url, grant access to 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // local files. 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetProcess()->GetID(), params.base_url_for_data_url); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only send the message if we aren't suspended at the start of a cross-site 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // request. 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (render_view_host_->navigations_suspended_) { 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shouldn't be possible to have a second navigation while suspended, since 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // navigations will only be suspended during a cross-site request. If a 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // second navigation occurs, RenderFrameHostManager will cancel this pending 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RFH and create a new pending RFH. 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!render_view_host_->suspended_nav_params_.get()); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->suspended_nav_params_.reset( 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new FrameMsg_Navigate_Params(params)); 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get back to a clean state, in case we start a new navigation without 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // completing a RVH swap or unload handler. 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host_->SetState(RenderViewHostImpl::STATE_DEFAULT); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Send(new FrameMsg_Navigate(GetRoutingID(), params)); 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Force the throbber to start. We do this because Blink's "started 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // loading" message will be received asynchronously from the UI of the 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // browser. But we want to keep the throbber in sync with what's happening 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // in the UI. For example, we want to start throbbing immediately when the 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // user naivgates even if the renderer is delayed. There is also an issue 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with the throbber starting because the WebUI (which controls whether the 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // favicon is displayed) happens synchronously. If the start loading 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // messages was asynchronous, then the default favicon would flash in. 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Blink doesn't send throb notifications for JavaScript URLs, so we 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // don't want to either. 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!params.url.SchemeIs(kJavaScriptScheme)) 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->DidStartLoading(this); 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RenderFrameHostImpl::NavigateToURL(const GURL& url) { 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameMsg_Navigate_Params params; 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.page_id = -1; 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.pending_history_list_offset = -1; 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.current_history_list_offset = -1; 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.current_history_list_length = 0; 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.url = url; 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.transition = PAGE_TRANSITION_LINK; 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigate(params); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 426