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 12 namespace content { 13 14 namespace { 15 16 void 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 31 RenderFrameMessageFilter::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 39 RenderFrameMessageFilter::~RenderFrameMessageFilter() { 40 } 41 42 bool 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 52 void 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