render_frame_message_filter.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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* message_was_ok) {
44  bool handled = true;
45  IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameMessageFilter, message, *message_was_ok)
46    IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame)
47    IPC_MESSAGE_UNHANDLED(handled = false)
48  IPC_END_MESSAGE_MAP_EX()
49
50  return handled;
51}
52
53void RenderFrameMessageFilter::OnCreateChildFrame(
54    int parent_routing_id,
55    const std::string& frame_name,
56    int* new_routing_id) {
57  *new_routing_id = render_widget_helper_->GetNextRoutingID();
58  BrowserThread::PostTask(
59      BrowserThread::UI, FROM_HERE,
60      base::Bind(&CreateChildFrameOnUI, render_process_id_,
61                 parent_routing_id, frame_name, *new_routing_id));
62}
63
64}  // namespace content
65