render_frame_host_impl.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/frame_tree.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "url/gurl.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// The (process id, routing id) pair that identifies one RenderFrame. 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef std::pair<int32, int32> RenderFrameHostID; 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap; 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// static 26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)RenderFrameHostImpl* RenderFrameHostImpl::FromID( 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int process_id, int routing_id) { 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RoutingIDFrameMap::iterator it = frames->find( 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(process_id, routing_id)); 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return it == frames->end() ? NULL : it->second; 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameHostImpl::RenderFrameHostImpl( 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RenderViewHostImpl* render_view_host, 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTree* frame_tree, 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int routing_id, 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool is_swapped_out) 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : render_view_host_(render_view_host), 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_(frame_tree), 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_(routing_id), 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_swapped_out_(is_swapped_out) { 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->AddRoute(routing_id_, this); 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().insert(std::make_pair( 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_), 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) this)); 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameHostImpl::~RenderFrameHostImpl() { 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->RemoveRoute(routing_id_); 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_routing_id_frame_map.Get().erase( 52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::Send(IPC::Message* message) { 57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return GetProcess()->Send(message); 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool handled = true; 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool msg_is_ok = true; 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameHostImpl, msg, msg_is_ok) 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach) 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IPC_MESSAGE_HANDLER(FrameHostMsg_DidStartProvisionalLoadForFrame, 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) OnDidStartProvisionalLoadForFrame) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IPC_END_MESSAGE_MAP_EX() 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return handled; 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RenderFrameHostImpl::Init() { 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetProcess()->ResumeRequestsForView(routing_id()); 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)RenderProcessHost* RenderFrameHostImpl::GetProcess() const { 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(nasko): This should return its own process, once we have working 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // cross-process navigation for subframes. 79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return render_view_host_->GetProcess(); 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameHostImpl::OnCreateChildFrame(int new_frame_routing_id, 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 parent_frame_id, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 frame_id, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& frame_name) { 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_->AddFrame(new_frame_routing_id, parent_frame_id, frame_id, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_name); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameHostImpl::OnDetach(int64 parent_frame_id, int64 frame_id) { 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_tree_->RemoveFrame(parent_frame_id, frame_id); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void RenderFrameHostImpl::OnDidStartProvisionalLoadForFrame( 958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int64 frame_id, 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int64 parent_frame_id, 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool is_main_frame, 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& url) { 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) render_view_host_->OnDidStartProvisionalLoadForFrame( 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_id, parent_frame_id, is_main_frame, url); 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 104