14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/render_frame_message_filter.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_helper.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content {
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CreateChildFrameOnUI(int process_id,
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          int parent_routing_id,
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          const std::string& frame_name,
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          int new_routing_id) {
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderFrameHostImpl* render_frame_host =
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      RenderFrameHostImpl::FromID(process_id, parent_routing_id);
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Handles the RenderFrameHost being deleted on the UI thread while
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // processing a subframe creation message.
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (render_frame_host)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    render_frame_host->OnCreateChildFrame(new_routing_id, frame_name);
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)RenderFrameMessageFilter::RenderFrameMessageFilter(
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int render_process_id,
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RenderWidgetHelper* render_widget_helper)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(FrameMsgStart),
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id_(render_process_id),
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      render_widget_helper_(render_widget_helper) {
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)RenderFrameMessageFilter::~RenderFrameMessageFilter() {
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message) {
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool handled = true;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(RenderFrameMessageFilter, message)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_CreateChildFrame, OnCreateChildFrame)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return handled;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameMessageFilter::OnCreateChildFrame(
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int parent_routing_id,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& frame_name,
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int* new_routing_id) {
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  *new_routing_id = render_widget_helper_->GetNextRoutingID();
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTask(
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&CreateChildFrameOnUI, render_process_id_,
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 parent_routing_id, frame_name, *new_routing_id));
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace content
64