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
CreateChildFrameOnUI(int process_id,int parent_routing_id,const std::string & frame_name,int new_routing_id)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
RenderFrameMessageFilter(int render_process_id,RenderWidgetHelper * render_widget_helper)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
~RenderFrameMessageFilter()39 RenderFrameMessageFilter::~RenderFrameMessageFilter() {
40 }
41
OnMessageReceived(const IPC::Message & message)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
OnCreateChildFrame(int parent_routing_id,const std::string & frame_name,int * new_routing_id)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