1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/frame_host/render_frame_message_filter.h" 6 7#include "content/browser/frame_host/render_frame_host_impl.h" 8#include "content/browser/renderer_host/render_widget_helper.h" 9#include "content/common/frame_messages.h" 10#include "content/public/browser/browser_thread.h" 11 12namespace content { 13 14namespace { 15 16void CreateChildFrameOnUI(int process_id, 17 int parent_routing_id, 18 const std::string& frame_name, 19 int new_routing_id) { 20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 21 RenderFrameHostImpl* render_frame_host = 22 RenderFrameHostImpl::FromID(process_id, parent_routing_id); 23 // Handles the RenderFrameHost being deleted on the UI thread while 24 // processing a subframe creation message. 25 if (render_frame_host) 26 render_frame_host->OnCreateChildFrame(new_routing_id, frame_name); 27} 28 29} // namespace 30 31RenderFrameMessageFilter::RenderFrameMessageFilter( 32 int render_process_id, 33 RenderWidgetHelper* render_widget_helper) 34 : BrowserMessageFilter(FrameMsgStart), 35 render_process_id_(render_process_id), 36 render_widget_helper_(render_widget_helper) { 37} 38 39RenderFrameMessageFilter::~RenderFrameMessageFilter() { 40} 41 42bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message) { 43 bool handled = true; 44 IPC_BEGIN_MESSAGE_MAP(RenderFrameMessageFilter, message) 45 IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame) 46 IPC_MESSAGE_UNHANDLED(handled = false) 47 IPC_END_MESSAGE_MAP() 48 49 return handled; 50} 51 52void RenderFrameMessageFilter::OnCreateChildFrame( 53 int parent_routing_id, 54 const std::string& frame_name, 55 int* new_routing_id) { 56 *new_routing_id = render_widget_helper_->GetNextRoutingID(); 57 BrowserThread::PostTask( 58 BrowserThread::UI, FROM_HERE, 59 base::Bind(&CreateChildFrameOnUI, render_process_id_, 60 parent_routing_id, frame_name, *new_routing_id)); 61} 62 63} // namespace content 64