render_frame_message_filter.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_render_frame_id,
18                          int64 parent_frame_id,
19                          int64 frame_id,
20                          const std::string& frame_name,
21                          int new_render_frame_id) {
22  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
23  RenderFrameHostImpl* render_frame_host =
24      RenderFrameHostImpl::FromID(process_id, parent_render_frame_id);
25  // Handles the RenderFrameHost being deleted on the UI thread while
26  // processing a subframe creation message.
27  if (render_frame_host) {
28    render_frame_host->OnCreateChildFrame(new_render_frame_id,
29                                          parent_frame_id, frame_id,
30                                          frame_name);
31  }
32}
33
34}  // namespace
35
36RenderFrameMessageFilter::RenderFrameMessageFilter(
37    int render_process_id,
38    RenderWidgetHelper* render_widget_helper)
39    : BrowserMessageFilter(FrameMsgStart),
40      render_process_id_(render_process_id),
41      render_widget_helper_(render_widget_helper) {
42}
43
44RenderFrameMessageFilter::~RenderFrameMessageFilter() {
45}
46
47bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message,
48                                                 bool* message_was_ok) {
49  bool handled = true;
50  IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameMessageFilter, message, *message_was_ok)
51    IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame)
52    IPC_MESSAGE_UNHANDLED(handled = false)
53  IPC_END_MESSAGE_MAP_EX()
54
55  return handled;
56}
57
58void RenderFrameMessageFilter::OnCreateChildFrame(
59    int parent_render_frame_id,
60    int64 parent_frame_id,
61    int64 frame_id,
62    const std::string& frame_name,
63    int* new_render_frame_id) {
64  *new_render_frame_id = render_widget_helper_->GetNextRoutingID();
65  BrowserThread::PostTask(
66      BrowserThread::UI, FROM_HERE,
67      base::Bind(&CreateChildFrameOnUI, render_process_id_,
68                 parent_render_frame_id, parent_frame_id, frame_id, frame_name,
69                 *new_render_frame_id));
70}
71
72}  // namespace content
73