render_frame_host_impl.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Copyright 2013 The Chromium Authors. All rights reserved. 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Use of this source code is governed by a BSD-style license that can be 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// found in the LICENSE file. 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/render_frame_host_impl.h" 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/containers/hash_tables.h" 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/lazy_instance.h" 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/metrics/user_metrics_action.h" 10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/child_process_security_policy_impl.h" 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/cross_process_frame_connector.h" 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/cross_site_transferring_request.h" 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/frame_tree.h" 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/frame_tree_node.h" 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/navigator.h" 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/frame_host/render_frame_host_delegate.h" 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/input/input_router.h" 18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/input/timeout_monitor.h" 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/browser/renderer_host/render_view_host_impl.h" 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/frame_messages.h" 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/input_messages.h" 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/inter_process_time_ticks_converter.h" 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/common/swapped_out_messages.h" 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/browser_thread.h" 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/content_browser_client.h" 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/render_process_host.h" 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/browser/render_widget_host_view.h" 285dfe556188df2a3b2bfe73c8bc3b3b9216171a93osdl.org!shemminger#include "content/public/browser/user_metrics.h" 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "content/public/common/url_constants.h" 3090f93024a0818dc691138d8401721e797004b042shemminger#include "content/public/common/url_utils.h" 3190f93024a0818dc691138d8401721e797004b042shemminger#include "url/gurl.h" 3290f93024a0818dc691138d8401721e797004b042shemminger 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerusing base::TimeDelta; 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernamespace content { 364094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// The (process id, routing id) pair that identifies one RenderFrame. 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef std::pair<int32, int32> RenderFrameHostID; 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RoutingIDFrameMap; 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger LAZY_INSTANCE_INITIALIZER; 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerRenderFrameHost* RenderFrameHost::FromID(int render_process_id, 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int render_frame_id) { 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// static 506b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen HemmingerRenderFrameHostImpl* RenderFrameHostImpl::FromID( 514b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger int process_id, int routing_id) { 524b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 536b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 546b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger RoutingIDFrameMap::iterator it = frames->find( 554b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger RenderFrameHostID(process_id, routing_id)); 566b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger return it == frames->end() ? NULL : it->second; 576b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger} 586b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 594b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen HemmingerRenderFrameHostImpl::RenderFrameHostImpl( 606b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger RenderViewHostImpl* render_view_host, 616b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger RenderFrameHostDelegate* delegate, 624b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger FrameTree* frame_tree, 634b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger FrameTreeNode* frame_tree_node, 644b270b172a6e570f4e9fa1ebb4bc67b0e715ee48Stephen Hemminger int routing_id, 655a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson bool is_swapped_out) 665a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson : render_view_host_(render_view_host), 675a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson delegate_(delegate), 685a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson cross_process_frame_connector_(NULL), 695a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson frame_tree_(frame_tree), 705a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson frame_tree_node_(frame_tree_node), 715a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson routing_id_(routing_id), 725a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson is_swapped_out_(is_swapped_out) { 736b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger frame_tree_->RegisterRenderFrameHost(this); 746b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger GetProcess()->AddRoute(routing_id_, this); 756b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger g_routing_id_frame_map.Get().insert(std::make_pair( 766b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger RenderFrameHostID(GetProcess()->GetID(), routing_id_), 776b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger this)); 785a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson} 796b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 805a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas HenrikssonRenderFrameHostImpl::~RenderFrameHostImpl() { 815a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson GetProcess()->RemoveRoute(routing_id_); 825a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson g_routing_id_frame_map.Get().erase( 835a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 845a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson if (delegate_) 854094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger delegate_->RenderFrameDeleted(this); 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Notify the FrameTree that this RFH is going away, allowing it to shut down 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // the corresponding RenderViewHost if it is no longer needed. 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_->UnregisterRenderFrameHost(this); 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint RenderFrameHostImpl::GetRoutingID() { 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return routing_id_; 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerSiteInstance* RenderFrameHostImpl::GetSiteInstance() { 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return render_view_host_->GetSiteInstance(); 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 9954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 10054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderProcessHost* RenderFrameHostImpl::GetProcess() { 10154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones // TODO(nasko): This should return its own process, once we have working 10254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones // cross-process navigation for subframes. 10354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return render_view_host_->GetProcess(); 10454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 10554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 10654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderFrameHost* RenderFrameHostImpl::GetParent() { 10754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones FrameTreeNode* parent_node = frame_tree_node_->parent(); 10854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones if (!parent_node) 10954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return NULL; 11054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return parent_node->current_frame_host(); 11154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 11254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 11354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesconst std::string& RenderFrameHostImpl::GetFrameName() { 11454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return frame_tree_node_->frame_name(); 11554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 11654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 11754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesbool RenderFrameHostImpl::IsCrossProcessSubframe() { 11854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones FrameTreeNode* parent_node = frame_tree_node_->parent(); 11954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones if (!parent_node) 12054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return false; 12154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return GetSiteInstance() != 12254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones parent_node->current_frame_host()->GetSiteInstance(); 12354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 12454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 12554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesGURL RenderFrameHostImpl::GetLastCommittedURL() { 12654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return frame_tree_node_->current_url(); 12754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 12854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 12954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesgfx::NativeView RenderFrameHostImpl::GetNativeView() { 13054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones RenderWidgetHostView* view = render_view_host_->GetView(); 13154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones if (!view) 13254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return NULL; 13354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return view->GetNativeView(); 13454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 13554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 13654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesvoid RenderFrameHostImpl::ExecuteJavaScript( 13754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones const base::string16& javascript) { 13854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_, 13954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones javascript, 14054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 0, false)); 14154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 14254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 14354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesvoid RenderFrameHostImpl::ExecuteJavaScript( 14454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones const base::string16& javascript, 14554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones const JavaScriptResultCallback& callback) { 14654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones static int next_id = 1; 14754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones int key = next_id++; 14854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones Send(new FrameMsg_JavaScriptExecuteRequest(routing_id_, 14954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones javascript, 15054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones key, true)); 15154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones javascript_callbacks_.insert(std::make_pair(key, callback)); 15254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 15354e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 15454e0b2e71d723e3b493ff53d1332b48250f5d4bcRick JonesRenderViewHost* RenderFrameHostImpl::GetRenderViewHost() { 15554e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return render_view_host_; 15654e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones} 15754e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones 15854e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jonesbool RenderFrameHostImpl::Send(IPC::Message* message) { 15954e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) { 16054e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones return render_view_host_->input_router()->SendInput( 16154e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones make_scoped_ptr(message)); 16254e0b2e71d723e3b493ff53d1332b48250f5d4bcRick Jones } 163c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 164c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger return GetProcess()->Send(message); 165c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 166c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 167c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerbool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 168c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // Filter out most IPC messages if this renderer is swapped out. 169c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // We still want to handle certain ACKs to keep our state consistent. 170c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // TODO(nasko): Only check RenderViewHost state, as this object's own state 171c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // isn't yet properly updated. Transition this check once the swapped out 172c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // state is correct in RenderFrameHost itself. 173c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (render_view_host_->IsSwappedOut()) { 174c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) { 175c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // If this is a synchronous message and we decided not to handle it, 176c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger // we must send an error reply, or else the renderer will be stuck 1774094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger // and won't respond to future requests. 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (msg.is_sync()) { 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger reply->set_reply_error(); 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger Send(reply); 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Don't continue looking for someone to handle it. 184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return true; 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (delegate_->OnMessageReceived(this, msg)) 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return true; 190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1914094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger if (cross_process_frame_connector_ && 192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger cross_process_frame_connector_->OnMessageReceived(msg)) 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return true; 194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bool handled = true; 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bool msg_is_ok = true; 197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameHostImpl, msg, msg_is_ok) 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_AddMessageToConsole, OnAddMessageToConsole) 199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach) 200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_FrameFocused, OnFrameFocused) 201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartProvisionalLoadForFrame, 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnDidStartProvisionalLoadForFrame) 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailProvisionalLoadWithError, 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnDidFailProvisionalLoadWithError) 2054094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidRedirectProvisionalLoad, 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnDidRedirectProvisionalLoad) 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailLoadWithError, 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnDidFailLoadWithError) 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_DidCommitProvisionalLoad, 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnNavigate(msg)) 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartLoading, OnDidStartLoading) 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading) 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL) 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK) 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK) 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER(FrameHostMsg_JavaScriptExecuteResponse, 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnJavaScriptExecuteResponse) 2194094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunJavaScriptMessage, 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnRunJavaScriptMessage) 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm, 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnRunBeforeUnloadConfirm) 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC_END_MESSAGE_MAP_EX() 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!msg_is_ok) { 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // The message had a handler, but its de-serialization failed. 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Kill the renderer. 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RecordAction(base::UserMetricsAction("BadMessageTerminate_RFH")); 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->ReceivedBadMessage(); 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return handled; 2334094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger} 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::Init() { 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->ResumeRequestsForView(routing_id_); 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnAddMessageToConsole( 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int32 level, 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::string16& message, 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int32 line_no, 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::string16& source_id) { 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 247cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger // Pass through log level only on WebUI pages to limit console spew. 248cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger int32 resolved_level = 249cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger HasWebUIScheme(delegate_->GetMainFrameLastCommittedURL()) ? level : 0; 250cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (resolved_level >= ::logging::GetMinLogLevel()) { 252cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger logging::LogMessage("CONSOLE", line_no, resolved_level).stream() << "\"" << 253cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger message << "\", source: " << source_id << " (" << line_no << ")"; 254cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger } 255cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger} 256cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger 257cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id, 258cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger const std::string& frame_name) { 259cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( 260cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger frame_tree_node_, new_routing_id, frame_name); 261cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger if (delegate_) 262cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger delegate_->RenderFrameCreated(new_frame); 263cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger} 26494afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger 265cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnDetach() { 266cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger frame_tree_->RemoveFrame(frame_tree_node_); 267cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger} 268cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger 269cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnFrameFocused() { 270cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger frame_tree_->SetFocusedFrame(frame_tree_node_); 271cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger} 272cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger 273cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemmingervoid RenderFrameHostImpl::OnOpenURL( 274cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger const FrameHostMsg_OpenURL_Params& params) { 275cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger GURL validated_url(params.url); 276cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger GetProcess()->FilterURL(false, &validated_url); 277cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger 278cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger frame_tree_node_->navigator()->RequestOpenURL( 279cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger this, validated_url, params.referrer, params.disposition, 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.should_replace_current_entry, params.user_gesture); 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int parent_routing_id, 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& url) { 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->navigator()->DidStartProvisionalLoad( 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger this, parent_routing_id, url); 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidFailProvisionalLoadWithError( 291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) { 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(this, params); 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidFailLoadWithError( 296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& url, 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int error_code, 298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::string16& error_description) { 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GURL validated_url(url); 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->FilterURL(false, &validated_url); 301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->navigator()->DidFailLoadWithError( 303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger this, validated_url, error_code, error_description); 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidRedirectProvisionalLoad( 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int32 page_id, 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& source_url, 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& target_url) { 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->navigator()->DidRedirectProvisionalLoad( 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger this, page_id, source_url, target_url); 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Called when the renderer navigates. For every frame loaded, we'll get this 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// notification containing parameters identifying the navigation. 316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// 317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Subframes are identified by the page transition type. For subframes loaded 31894afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger// as part of a wider page load, the page_id will be the same as for the top 319cafa6c8ec1d6e4bddde190edb742be864ce3f9b3Stephen Hemminger// level frame. If the user explicitly requests a subframe navigation, we will 320516ffb6b7724e97ca035293dcfd9f94cf6ce3a47Stephen Hemminger// get a new page_id because we need to create a new navigation entry for that 32194afda752956ddc6ff1accf931bc3d03c070bb18Stephen Hemminger// action. 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnNavigate(const IPC::Message& msg) { 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Read the parameters out of the IPC message directly to avoid making another 324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // copy when we filter the URLs. 325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger PickleIterator iter(msg); 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; 327fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: 328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger Read(&msg, &iter, &validated_params)) 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If we're waiting for a cross-site beforeunload ack from this renderer and 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // we receive a Navigate message from the main frame, then the renderer was 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // navigating already and sent it before hearing the ViewMsg_Stop message. 334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // We do not want to cancel the pending navigation in this case, since the 335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // old page will soon be stopped. Instead, treat this as a beforeunload ack 336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // to allow the pending navigation to continue. 337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->is_waiting_for_beforeunload_ack_ && 338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_ && 339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger PageTransitionIsMainFrame(validated_params.transition)) { 340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnBeforeUnloadACK(true, send_before_unload_start_time_, 341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::TimeTicks::Now()); 342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If we're waiting for an unload ack from this renderer and we receive a 346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Navigate message, then the renderer was navigating before it received the 347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // unload request. It will either respond to the unload request soon or our 348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // timer will expire. Either way, we should ignore this message, because we 349fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger // have already committed to closing this renderer. 350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->IsWaitingForUnloadACK()) 351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RenderProcessHost* process = GetProcess(); 354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Attempts to commit certain off-limits URL should be caught more strictly 356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // than our FilterURL checks below. If a renderer violates this policy, it 357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // should be killed. 358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!CanCommitURL(validated_params.url)) { 359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger VLOG(1) << "Blocked URL " << validated_params.url.spec(); 360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger validated_params.url = GURL(kAboutBlankURL); 361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RecordAction(base::UserMetricsAction("CanCommitURL_BlockedAndKilled")); 362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Kills the process. 363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->ReceivedBadMessage(); 3645a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson } 3655a0d1cbf69269bfcb510a8b861b8a83aed0f6b85Andreas Henriksson 366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Now that something has committed, we don't need to track whether the 367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // initial page has been accessed. 368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->has_accessed_initial_document_ = false; 369f082b64fb40b467bc1f9e5d245114aae4e256d5cnet[shemminger]!shemminger 370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Without this check, an evil renderer can trick the browser into creating 371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // a navigation entry for a banned URL. If the user clicks the back button 372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // followed by the forward button (or clicks reload, or round-trips through 373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // session restore, etc), we'll think that the browser commanded the 374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // renderer to load the URL and grant the renderer the privileges to request 375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // the URL. To prevent this attack, we block the renderer from inserting 376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // banned URLs into the navigation controller in the first place. 377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(false, &validated_params.url); 378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(true, &validated_params.referrer.url); 379c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); 380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger it != validated_params.redirects.end(); ++it) { 381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(false, &(*it)); 382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(true, &validated_params.searchable_form_url); 384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Without this check, the renderer can trick the browser into using 386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // filenames it can't access in a future session restore. 387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!render_view_host_->CanAccessFilesOfPageState( 388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger validated_params.page_state)) { 389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->ReceivedBadMessage(); 390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 392fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemminger 393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node()->navigator()->DidNavigate(this, validated_params); 394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 395aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint RenderFrameHostImpl::GetEnabledBindings() { 397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return render_view_host_->GetEnabledBindings(); 398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnCrossSiteResponse( 401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GlobalRequestID& global_request_id, 402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request, 403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const std::vector<GURL>& transfer_url_chain, 404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const Referrer& referrer, 405c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger PageTransition page_transition, 406aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bool should_replace_current_entry) { 407aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->render_manager()->OnCrossSiteResponse( 408aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger this, global_request_id, cross_site_transferring_request.Pass(), 409aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger transfer_url_chain, referrer, page_transition, 410aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger should_replace_current_entry); 411aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 412aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::SwapOut() { 414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // TODO(creis): Move swapped out state to RFH. Until then, only update it 4154094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger // when swapping out the main frame. 416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!GetParent()) { 417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If this RenderViewHost is not in the default state, it must have already 418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // gone through this, therefore just return. 419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->rvh_state_ != RenderViewHostImpl::STATE_DEFAULT) 420aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 421c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 422c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger render_view_host_->SetState( 423c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK); 424c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger render_view_host_->unload_event_monitor_timeout_->Start( 425c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger base::TimeDelta::FromMilliseconds( 426c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger RenderViewHostImpl::kUnloadTimeoutMS)); 4274094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger } 428aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 429aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->IsRenderViewLive()) 430aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger Send(new FrameMsg_SwapOut(routing_id_)); 431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 432aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!GetParent()) 4334094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger delegate_->SwappedOut(this); 434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 435aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Allow the navigation to proceed. 436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->render_manager()->SwappedOut(this); 437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 438aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 4394094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemmingervoid RenderFrameHostImpl::OnDidStartLoading(bool to_different_document) { 440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger delegate_->DidStartLoading(this, to_different_document); 441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnDidStopLoading() { 444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger delegate_->DidStopLoading(this); 4454094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger} 446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnBeforeUnloadACK( 448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bool proceed, 449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::TimeTicks& renderer_before_unload_start_time, 450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::TimeTicks& renderer_before_unload_end_time) { 451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // TODO(creis): Support beforeunload on subframes. 452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (GetParent()) { 4534094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger NOTREACHED() << "Should only receive BeforeUnload_ACK from the main frame."; 454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 4559626dfd54c3cc4deec1c651a0bfee65b50feb78bStephen Hemminger } 4569626dfd54c3cc4deec1c651a0bfee65b50feb78bStephen Hemminger 457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->decrement_in_flight_event_count(); 458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->StopHangMonitorTimeout(); 459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If this renderer navigated while the beforeunload request was in flight, we 460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // may have cleared this state in OnNavigate, in which case we can ignore 461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // this message. 462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // However renderer might also be swapped out but we still want to proceed 463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // with navigation, otherwise it would block future navigations. This can 464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // happen when pending cross-site navigation is canceled by a second one just 465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // before OnNavigate while current RVH is waiting for commit but second 466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // navigation is started from the beginning. 467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!render_view_host_->is_waiting_for_beforeunload_ack_) { 468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->is_waiting_for_beforeunload_ack_ = false; 472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::TimeTicks before_unload_end_time; 474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!send_before_unload_start_time_.is_null() && 475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger !renderer_before_unload_start_time.is_null() && 476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger !renderer_before_unload_end_time.is_null()) { 477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // When passing TimeTicks across process boundaries, we need to compensate 478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // for any skew between the processes. Here we are converting the 479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // renderer's notion of before_unload_end_time to TimeTicks in the browser 480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // process. See comments in inter_process_time_ticks_converter.h for more. 481aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger InterProcessTimeTicksConverter converter( 482aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger LocalTimeTicks::FromTimeTicks(send_before_unload_start_time_), 483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger LocalTimeTicks::FromTimeTicks(base::TimeTicks::Now()), 484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RemoteTimeTicks::FromTimeTicks(renderer_before_unload_start_time), 485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); 486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger LocalTimeTicks browser_before_unload_end_time = 487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger converter.ToLocalTimeTicks( 488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger RemoteTimeTicks::FromTimeTicks(renderer_before_unload_end_time)); 489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger before_unload_end_time = browser_before_unload_end_time.ToTimeTicks(); 490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->render_manager()->OnBeforeUnloadACK( 492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_, proceed, 493aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger before_unload_end_time); 494c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger 495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If canceled, notify the delegate to cancel its pending navigation entry. 496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!proceed) 497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->GetDelegate()->DidCancelLoading(); 498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnSwapOutACK() { 501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnSwappedOut(false); 502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnSwappedOut(bool timed_out) { 505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // For now, we only need to update the RVH state machine for top-level swaps. 506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Subframe swaps (in --site-per-process) can just continue via RFHM. 507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!GetParent()) 508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->OnSwappedOut(timed_out); 509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_tree_node_->render_manager()->SwappedOut(this); 511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 5135e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemmingervoid RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) { 5145e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger // Validate the URLs in |params|. If the renderer can't request the URLs 5155e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger // directly, don't show them in the context menu. 5165e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger ContextMenuParams validated_params(params); 5175e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger RenderProcessHost* process = GetProcess(); 5185e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger 5195e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger // We don't validate |unfiltered_link_url| so that this field can be used 5204094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger // when users want to copy the original link URL. 521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(true, &validated_params.link_url); 522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(true, &validated_params.src_url); 523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(false, &validated_params.page_url); 524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger process->FilterURL(true, &validated_params.frame_url); 525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger delegate_->ShowContextMenu(this, validated_params); 527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnJavaScriptExecuteResponse( 530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int id, const base::ListValue& result) { 531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::Value* result_value; 532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!result.Get(0, &result_value)) { 533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Programming error or rogue renderer. 534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NOTREACHED() << "Got bad arguments for OnJavaScriptExecuteResponse"; 535aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger std::map<int, JavaScriptResultCallback>::iterator it = 539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger javascript_callbacks_.find(id); 540aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (it != javascript_callbacks_.end()) { 541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger it->second.Run(result_value); 542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger javascript_callbacks_.erase(it); 5437dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger } else { 544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NOTREACHED() << "Received script response for unknown request"; 545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 5477dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger 5487dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemmingervoid RenderFrameHostImpl::OnRunJavaScriptMessage( 549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::string16& message, 5507dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger const base::string16& default_prompt, 551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& frame_url, 552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger JavaScriptMessageType type, 553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC::Message* reply_msg) { 554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // While a JS message dialog is showing, tabs in the same process shouldn't 555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // process input events. 556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->SetIgnoreInputEvents(true); 557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->StopHangMonitorTimeout(); 558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger delegate_->RunJavaScriptMessage(this, message, default_prompt, 559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger frame_url, type, reply_msg); 560aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 561aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::OnRunBeforeUnloadConfirm( 563aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const GURL& frame_url, 564aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const base::string16& message, 5657dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger bool is_reload, 566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger IPC::Message* reply_msg) { 567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // While a JS before unload dialog is showing, tabs in the same process 568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // shouldn't process input events. 569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->SetIgnoreInputEvents(true); 570aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->StopHangMonitorTimeout(); 571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg); 572aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 573aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 574aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { 575aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->SetPendingShutdown(on_swap_out); 576aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 577aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 578aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerbool RenderFrameHostImpl::CanCommitURL(const GURL& url) { 579aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // TODO(creis): We should also check for WebUI pages here. Also, when the 580aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // out-of-process iframes implementation is ready, we should check for 581aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // cross-site URLs that are not allowed to commit in this process. 582aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 583aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Give the client a chance to disallow URLs from committing. 584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); 585c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger} 586aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 587aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::Navigate(const FrameMsg_Navigate_Params& params) { 588aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger TRACE_EVENT0("frame_host", "RenderFrameHostImpl::Navigate"); 589aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Browser plugin guests are not allowed to navigate outside web-safe schemes, 590aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // so do not grant them the ability to request additional URLs. 591aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!GetProcess()->IsGuest()) { 592aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 593aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetProcess()->GetID(), params.url); 594c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger if (params.url.SchemeIs(kDataScheme) && 5954094db72b61dadd16e180eab5f62ccbc82e3976dosdl.org!shemminger params.base_url_for_data_url.SchemeIs(kFileScheme)) { 596aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // If 'data:' is used, and we have a 'file:' base url, grant access to 597aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // local files. 598aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ChildProcessSecurityPolicyImpl::GetInstance()->GrantRequestURL( 5997dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger GetProcess()->GetID(), params.base_url_for_data_url); 6007dec1bf88bc34e2d0b320f0c23bd1a060c73852bStephen Hemminger } 601aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 602aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 603aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Only send the message if we aren't suspended at the start of a cross-site 604aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // request. 605aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->navigations_suspended_) { 606aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Shouldn't be possible to have a second navigation while suspended, since 607aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // navigations will only be suspended during a cross-site request. If a 608aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // second navigation occurs, RenderFrameHostManager will cancel this pending 609aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // RFH and create a new pending RFH. 610aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DCHECK(!render_view_host_->suspended_nav_params_.get()); 611aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->suspended_nav_params_.reset( 612aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger new FrameMsg_Navigate_Params(params)); 613aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 614aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Get back to a clean state, in case we start a new navigation without 615aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // completing a RVH swap or unload handler. 616aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->SetState(RenderViewHostImpl::STATE_DEFAULT); 617aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 618aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger Send(new FrameMsg_Navigate(routing_id_, params)); 619aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 620aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 621aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Force the throbber to start. We do this because Blink's "started 622aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // loading" message will be received asynchronously from the UI of the 623aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // browser. But we want to keep the throbber in sync with what's happening 624aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // in the UI. For example, we want to start throbbing immediately when the 625aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // user naivgates even if the renderer is delayed. There is also an issue 626aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // with the throbber starting because the WebUI (which controls whether the 627aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // favicon is displayed) happens synchronously. If the start loading 628aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // messages was asynchronous, then the default favicon would flash in. 629aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // 630aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Blink doesn't send throb notifications for JavaScript URLs, so we 631f332d169246447bd5e258ac03d5ee840a70adb1eshemminger // don't want to either. 632aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!params.url.SchemeIs(kJavaScriptScheme)) 633f332d169246447bd5e258ac03d5ee840a70adb1eshemminger delegate_->DidStartLoading(this, true); 634aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 635aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 636aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::NavigateToURL(const GURL& url) { 637aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger FrameMsg_Navigate_Params params; 638aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.page_id = -1; 639aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.pending_history_list_offset = -1; 640aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.current_history_list_offset = -1; 641aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.current_history_list_length = 0; 642aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.url = url; 643aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.transition = PAGE_TRANSITION_LINK; 644aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger params.navigation_type = FrameMsg_Navigate_Type::NORMAL; 645aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger Navigate(params); 646aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 647aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 648aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid RenderFrameHostImpl::DispatchBeforeUnload(bool for_cross_site_transition) { 649aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // TODO(creis): Support subframes. 650f332d169246447bd5e258ac03d5ee840a70adb1eshemminger DCHECK(!GetParent()); 651aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 652aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!render_view_host_->IsRenderViewLive()) { 653aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // We don't have a live renderer, so just skip running beforeunload. 654aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->is_waiting_for_beforeunload_ack_ = true; 655aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_ = 656aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for_cross_site_transition; 657aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::TimeTicks now = base::TimeTicks::Now(); 658aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger OnBeforeUnloadACK(true, now, now); 659aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return; 660aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 661aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 662aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // This may be called more than once (if the user clicks the tab close button 663aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // several times, or if she clicks the tab close button then the browser close 664aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // button), and we only send the message once. 665aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (render_view_host_->is_waiting_for_beforeunload_ack_) { 666aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Some of our close messages could be for the tab, others for cross-site 667aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // transitions. We always want to think it's for closing the tab if any 668aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // of the messages were, since otherwise it might be impossible to close 669aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // (if there was a cross-site "close" request pending when the user clicked 670aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // the close button). We want to keep the "for cross site" flag only if 671aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // both the old and the new ones are also for cross site. 672aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_ = 673aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_ && 674aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for_cross_site_transition; 675aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 676aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Start the hang monitor in case the renderer hangs in the beforeunload 677aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // handler. 678aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->is_waiting_for_beforeunload_ack_ = true; 679aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->unload_ack_is_for_cross_site_transition_ = 680aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for_cross_site_transition; 681aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // Increment the in-flight event count, to ensure that input events won't 682aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger // cancel the timeout timer. 683aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->increment_in_flight_event_count(); 684aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger render_view_host_->StartHangMonitorTimeout( 685aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); 686aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger send_before_unload_start_time_ = base::TimeTicks::Now(); 68790f93024a0818dc691138d8401721e797004b042shemminger Send(new FrameMsg_BeforeUnload(routing_id_)); 68890f93024a0818dc691138d8401721e797004b042shemminger } 68990f93024a0818dc691138d8401721e797004b042shemminger} 69090f93024a0818dc691138d8401721e797004b042shemminger 69190f93024a0818dc691138d8401721e797004b042shemmingervoid RenderFrameHostImpl::ExtendSelectionAndDelete(size_t before, 69290f93024a0818dc691138d8401721e797004b042shemminger size_t after) { 69390f93024a0818dc691138d8401721e797004b042shemminger Send(new FrameMsg_ExtendSelectionAndDelete(routing_id_, before, after)); 69490f93024a0818dc691138d8401721e797004b042shemminger} 69590f93024a0818dc691138d8401721e797004b042shemminger 69690f93024a0818dc691138d8401721e797004b042shemmingervoid RenderFrameHostImpl::JavaScriptDialogClosed( 69790f93024a0818dc691138d8401721e797004b042shemminger IPC::Message* reply_msg, 69890f93024a0818dc691138d8401721e797004b042shemminger bool success, 69990f93024a0818dc691138d8401721e797004b042shemminger const base::string16& user_input, 70090f93024a0818dc691138d8401721e797004b042shemminger bool dialog_was_suppressed) { 701351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger GetProcess()->SetIgnoreInputEvents(false); 702351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger bool is_waiting = render_view_host_->is_waiting_for_beforeunload_ack() || 703351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_->IsWaitingForUnloadACK(); 704351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 705d21e88354b2a42b026384730a767f2108bcf8efeAndreas Henriksson // If we are executing as part of (before)unload event handling, we don't 706351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // want to use the regular hung_renderer_delay_ms_ if the user has agreed to 707d21e88354b2a42b026384730a767f2108bcf8efeAndreas Henriksson // leave the current page. In this case, use the regular timeout value used 708351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // during the (before)unload handling. 709ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (is_waiting) { 710351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds( 711351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger success ? RenderViewHostImpl::kUnloadTimeoutMS 712351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger : render_view_host_->hung_renderer_delay_ms_)); 713351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger } 714351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 715ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger FrameHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, 716351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger success, user_input); 717ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger Send(reply_msg); 718351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 719351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // If we are waiting for an unload or beforeunload ack and the user has 720351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // suppressed messages, kill the tab immediately; a page that's spamming 721351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // alerts in onbeforeunload is presumably malicious, so there's no point in 722351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // continuing to run its script and dragging out the process. 723351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // This must be done after sending the reply since RenderView can't close 724351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger // correctly while waiting for a response. 725351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger if (is_waiting && dialog_was_suppressed) 726351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_->delegate_->RendererUnresponsive( 727351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_, 728351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_->is_waiting_for_beforeunload_ack(), 729351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger render_view_host_->IsWaitingForUnloadACK()); 730351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger} 731351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 732ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger} // namespace content 733351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger