render_frame_message_filter.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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    : render_process_id_(render_process_id),
40      render_widget_helper_(render_widget_helper) {
41}
42
43RenderFrameMessageFilter::~RenderFrameMessageFilter() {
44}
45
46bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message,
47                                                 bool* message_was_ok) {
48  bool handled = true;
49  IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameMessageFilter, message, *message_was_ok)
50    IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame)
51    IPC_MESSAGE_UNHANDLED(handled = false)
52  IPC_END_MESSAGE_MAP_EX()
53
54  return handled;
55}
56
57void RenderFrameMessageFilter::OnCreateChildFrame(
58    int parent_render_frame_id,
59    int64 parent_frame_id,
60    int64 frame_id,
61    const std::string& frame_name,
62    int* new_render_frame_id) {
63  *new_render_frame_id = render_widget_helper_->GetNextRoutingID();
64  BrowserThread::PostTask(
65      BrowserThread::UI, FROM_HERE,
66      base::Bind(&CreateChildFrameOnUI, render_process_id_,
67                 parent_render_frame_id, parent_frame_id, frame_id, frame_name,
68                 *new_render_frame_id));
69}
70
71}  // namespace content
72