Home | History | Annotate | Download | only in frame_host
      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 
     12 namespace content {
     13 
     14 namespace {
     15 
     16 void 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 
     31 RenderFrameMessageFilter::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 
     39 RenderFrameMessageFilter::~RenderFrameMessageFilter() {
     40 }
     41 
     42 bool 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 
     52 void 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