15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <OpenGL/OpenGL.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gdk/gdk.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/timer/timer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostImpl; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Basic implementation shared by concrete RenderWidgetHostView 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subclasses. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that nothing should use this class, except concrete subclasses 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are deriving from it, and code that is written specifically to 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use one of these concrete subclasses (i.e. platform-specific code). 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To enable embedders that add ports, everything else in content/ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should use the RenderWidgetHostViewPort interface. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostView class hierarchy described in render_widget_host_view.h. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT RenderWidgetHostViewBase 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public RenderWidgetHostViewPort { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RenderWidgetHostViewBase(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderWidgetHostViewPort implementation. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SelectionChanged(const base::string16& text, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t offset, 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range& range) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetBackground(const SkBitmap& background) OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const SkBitmap& GetBackground() OVERRIDE; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPhysicalBackingSize() const OVERRIDE; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual float GetOverdrawBottomHeight() const OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsShowingContextMenu() const OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetShowingContextMenu(bool showing_menu) OVERRIDE; 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetSelectedText() const OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsMouseLocked() OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UnhandledWheelEvent( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseWheelEvent& event) OVERRIDE; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual InputEventAckState FilterInputEvent( 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebInputEvent& input_event) OVERRIDE; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnSetNeedsFlushInput() OVERRIDE; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnDidFlushInput() OVERRIDE; 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void GestureEventAck(int gesture_event_type, 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) InputEventAckState ack_result) OVERRIDE; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetPopupType(blink::WebPopupType popup_type) OVERRIDE; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebPopupType GetPopupType() OVERRIDE; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual BrowserAccessibilityManager* 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBrowserAccessibilityManager() const OVERRIDE; 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void ProcessAckedTouchEvent(const TouchEventWithLatencyInfo& touch, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InputEventAckState ack_result) OVERRIDE; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget() 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OVERRIDE; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanSubscribeFrame() const OVERRIDE; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginFrameSubscription( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) OVERRIDE; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EndFrameSubscription() OVERRIDE; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSwapCompositorFrame( 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint32 output_surface_id, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::CompositorFrame> frame) OVERRIDE {} 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void ResizeCompositingSurface(const gfx::Size&) OVERRIDE {} 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnOverscrolled(gfx::Vector2dF accumulated_overscroll, 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Vector2dF current_fling_velocity) OVERRIDE; 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual uint32 RendererFrameNumber() OVERRIDE; 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidReceiveRendererFrame() OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetBrowserAccessibilityManager(BrowserAccessibilityManager* manager); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notification that a resize or move session ended on the native widget. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateScreenInfo(gfx::NativeView view); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Tells if the display property (work area/scale factor) has 96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // changed since the last time. 97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool HasDisplayPropertyChanged(gfx::NativeView view); 98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback that DetachPluginsHelper calls for each child window. Call 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this directly if you want to do custom filtering on plugin windows first. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DetachPluginWindowsCallback(HWND window); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Interface class only, do not construct. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostViewBase(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shared implementation of MovePluginWindows for use by win and aura/wina. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MovePluginWindowsHelper( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND parent, 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<WebPluginGeometry>& moves); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void PaintPluginWindowsHelper( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND parent, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& damaged_screen_rect); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needs to be called before the HWND backing the view goes away to avoid 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crashes in Windowed plugins. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DetachPluginsHelper(HWND parent); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether this view is a popup and what kind of popup it is (select, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // autofill...). 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPopupType popup_type_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A custom background to paint behind the web content. This will be tiled 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // horizontally. Can be null, in which case we fall back to painting white. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap background_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // While the mouse is locked, the cursor is hidden from the user. Mouse events 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are still generated. However, the position they report is the last known 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse position just as mouse lock was entered; the movement they report 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates what the change in position of the mouse would be had it not been 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // locked. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mouse_locked_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we are showing a context menu. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool showing_context_menu_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A buffer containing the text inside and around the current selection range. 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 selection_text_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The offset of the text stored in |selection_text_| relative to the start of 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the web page. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t selection_text_offset_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current selection range relative to the start of the web page. 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range selection_range_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The scale factor of the display the renderer is currently on. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float current_device_scale_factor_; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void FlushInput(); 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Manager of the tree representation of the WebKit render tree. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect current_display_area_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 renderer_frame_number_; 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::OneShotTimer<RenderWidgetHostViewBase> flush_input_timer_; 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewBase); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 174