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