15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/cross_process_frame_connector.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "content/browser/frame_host/render_frame_proxy_host.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/frame_host/render_widget_host_view_child_frame.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/frame_messages.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CrossProcessFrameConnector::CrossProcessFrameConnector(
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RenderFrameProxyHost* frame_proxy_in_parent_renderer)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : frame_proxy_in_parent_renderer_(frame_proxy_in_parent_renderer),
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      view_(NULL),
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      device_scale_factor_(1) {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CrossProcessFrameConnector::~CrossProcessFrameConnector() {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (view_)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->set_cross_process_frame_connector(NULL);
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool CrossProcessFrameConnector::OnMessageReceived(const IPC::Message& msg) {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool handled = true;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(CrossProcessFrameConnector, msg)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_CompositorFrameSwappedACK,
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnCompositorFrameSwappedACK)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_ReclaimCompositorResources,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnReclaimCompositorResources)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_ForwardInputEvent, OnForwardInputEvent)
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPC_MESSAGE_HANDLER(FrameHostMsg_InitializeChildFrame,
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        OnInitializeChildFrame)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return handled;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::set_view(
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RenderWidgetHostViewChildFrame* view) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Detach ourselves from the previous |view_|.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (view_)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->set_cross_process_frame_connector(NULL);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_ = view;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Attach ourselves to the new view and size it appropriately.
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (view_) {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->set_cross_process_frame_connector(this);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetDeviceScaleFactor(device_scale_factor_);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetSize(child_frame_rect_);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::RenderProcessGone() {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frame_proxy_in_parent_renderer_->Send(new FrameMsg_ChildFrameProcessGone(
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      frame_proxy_in_parent_renderer_->GetRoutingID()));
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::ChildFrameCompositorFrameSwapped(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32 output_surface_id,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int host_id,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int route_id,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<cc::CompositorFrame> frame) {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FrameMsg_CompositorFrameSwapped_Params params;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frame->AssignTo(&params.frame);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.output_surface_id = output_surface_id;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.producing_route_id = route_id;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.producing_host_id = host_id;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frame_proxy_in_parent_renderer_->Send(new FrameMsg_CompositorFrameSwapped(
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      frame_proxy_in_parent_renderer_->GetRoutingID(), params));
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::OnCompositorFrameSwappedACK(
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FrameHostMsg_CompositorFrameSwappedACK_Params& params) {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderWidgetHostImpl::SendSwapCompositorFrameAck(params.producing_route_id,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   params.output_surface_id,
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   params.producing_host_id,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   params.ack);
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::OnReclaimCompositorResources(
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FrameHostMsg_ReclaimCompositorResources_Params& params) {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderWidgetHostImpl::SendReclaimCompositorResources(params.route_id,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       params.output_surface_id,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       params.renderer_host_id,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       params.ack);
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void CrossProcessFrameConnector::OnInitializeChildFrame(gfx::Rect frame_rect,
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                        float scale_factor) {
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (scale_factor != device_scale_factor_)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetDeviceScaleFactor(scale_factor);
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!frame_rect.size().IsEmpty())
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetSize(frame_rect);
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect CrossProcessFrameConnector::ChildFrameRect() {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return child_frame_rect_;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CrossProcessFrameConnector::OnForwardInputEvent(
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebInputEvent* event) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!view_)
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderWidgetHostImpl* child_widget =
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderWidgetHostImpl::From(view_->GetRenderWidgetHost());
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderWidgetHostImpl* parent_widget =
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      frame_proxy_in_parent_renderer_->GetRenderViewHost();
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (blink::WebInputEvent::isKeyboardEventType(event->type)) {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!parent_widget->GetLastKeyboardEvent())
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NativeWebKeyboardEvent keyboard_event(
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        *parent_widget->GetLastKeyboardEvent());
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    child_widget->ForwardKeyboardEvent(keyboard_event);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (blink::WebInputEvent::isMouseEventType(event->type)) {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    child_widget->ForwardMouseEvent(
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        *static_cast<const blink::WebMouseEvent*>(event));
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->type == blink::WebInputEvent::MouseWheel) {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    child_widget->ForwardWheelEvent(
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        *static_cast<const blink::WebMouseWheelEvent*>(event));
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CrossProcessFrameConnector::SetDeviceScaleFactor(float scale_factor) {
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  device_scale_factor_ = scale_factor;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (view_) {
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderWidgetHostImpl* child_widget =
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        RenderWidgetHostImpl::From(view_->GetRenderWidgetHost());
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    child_widget->NotifyScreenInfoChanged();
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CrossProcessFrameConnector::SetSize(gfx::Rect frame_rect) {
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  child_frame_rect_ = frame_rect;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (view_)
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view_->SetSize(frame_rect.size());
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace content
158