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(¶ms.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