1// Copyright (c) 2012 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#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 6#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 7 8#if defined(OS_MACOSX) 9#include <OpenGL/OpenGL.h> 10#endif 11 12#if defined(TOOLKIT_GTK) 13#include <gdk/gdk.h> 14#endif 15 16#include <string> 17#include <vector> 18 19#include "base/memory/scoped_ptr.h" 20#include "base/callback_forward.h" 21#include "base/timer/timer.h" 22#include "content/common/content_export.h" 23#include "content/port/browser/render_widget_host_view_port.h" 24#include "ui/gfx/native_widget_types.h" 25#include "ui/gfx/range/range.h" 26#include "ui/gfx/rect.h" 27 28namespace content { 29 30class RenderWidgetHostImpl; 31 32// Basic implementation shared by concrete RenderWidgetHostView 33// subclasses. 34// 35// Note that nothing should use this class, except concrete subclasses 36// that are deriving from it, and code that is written specifically to 37// use one of these concrete subclasses (i.e. platform-specific code). 38// 39// To enable embedders that add ports, everything else in content/ 40// should use the RenderWidgetHostViewPort interface. 41// 42// RenderWidgetHostView class hierarchy described in render_widget_host_view.h. 43class CONTENT_EXPORT RenderWidgetHostViewBase 44 : public RenderWidgetHostViewPort { 45 public: 46 virtual ~RenderWidgetHostViewBase(); 47 48 // RenderWidgetHostViewPort implementation. 49 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 50 virtual void SelectionChanged(const base::string16& text, 51 size_t offset, 52 const gfx::Range& range) OVERRIDE; 53 virtual void SetBackground(const SkBitmap& background) OVERRIDE; 54 virtual const SkBitmap& GetBackground() OVERRIDE; 55 virtual gfx::Size GetPhysicalBackingSize() const OVERRIDE; 56 virtual float GetOverdrawBottomHeight() const OVERRIDE; 57 virtual bool IsShowingContextMenu() const OVERRIDE; 58 virtual void SetShowingContextMenu(bool showing_menu) OVERRIDE; 59 virtual base::string16 GetSelectedText() const OVERRIDE; 60 virtual bool IsMouseLocked() OVERRIDE; 61 virtual void UnhandledWheelEvent( 62 const blink::WebMouseWheelEvent& event) OVERRIDE; 63 virtual InputEventAckState FilterInputEvent( 64 const blink::WebInputEvent& input_event) OVERRIDE; 65 virtual void OnSetNeedsFlushInput() OVERRIDE; 66 virtual void OnDidFlushInput() OVERRIDE; 67 virtual void GestureEventAck(int gesture_event_type, 68 InputEventAckState ack_result) OVERRIDE; 69 virtual void SetPopupType(blink::WebPopupType popup_type) OVERRIDE; 70 virtual blink::WebPopupType GetPopupType() OVERRIDE; 71 virtual BrowserAccessibilityManager* 72 GetBrowserAccessibilityManager() const OVERRIDE; 73 virtual void ProcessAckedTouchEvent(const TouchEventWithLatencyInfo& touch, 74 InputEventAckState ack_result) OVERRIDE; 75 virtual scoped_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget() 76 OVERRIDE; 77 virtual bool CanSubscribeFrame() const OVERRIDE; 78 virtual void BeginFrameSubscription( 79 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) OVERRIDE; 80 virtual void EndFrameSubscription() OVERRIDE; 81 virtual void OnSwapCompositorFrame( 82 uint32 output_surface_id, 83 scoped_ptr<cc::CompositorFrame> frame) OVERRIDE {} 84 virtual void ResizeCompositingSurface(const gfx::Size&) OVERRIDE {} 85 virtual void OnOverscrolled(gfx::Vector2dF accumulated_overscroll, 86 gfx::Vector2dF current_fling_velocity) OVERRIDE; 87 virtual uint32 RendererFrameNumber() OVERRIDE; 88 virtual void DidReceiveRendererFrame() OVERRIDE; 89 90 void SetBrowserAccessibilityManager(BrowserAccessibilityManager* manager); 91 92 // Notification that a resize or move session ended on the native widget. 93 void UpdateScreenInfo(gfx::NativeView view); 94 95 // Tells if the display property (work area/scale factor) has 96 // changed since the last time. 97 bool HasDisplayPropertyChanged(gfx::NativeView view); 98 99#if defined(OS_WIN) 100 // The callback that DetachPluginsHelper calls for each child window. Call 101 // this directly if you want to do custom filtering on plugin windows first. 102 static void DetachPluginWindowsCallback(HWND window); 103#endif 104 105 protected: 106 // Interface class only, do not construct. 107 RenderWidgetHostViewBase(); 108 109#if defined(OS_WIN) 110 // Shared implementation of MovePluginWindows for use by win and aura/wina. 111 static void MovePluginWindowsHelper( 112 HWND parent, 113 const std::vector<WebPluginGeometry>& moves); 114 115 static void PaintPluginWindowsHelper( 116 HWND parent, 117 const gfx::Rect& damaged_screen_rect); 118 119 // Needs to be called before the HWND backing the view goes away to avoid 120 // crashes in Windowed plugins. 121 static void DetachPluginsHelper(HWND parent); 122#endif 123 124 // Whether this view is a popup and what kind of popup it is (select, 125 // autofill...). 126 blink::WebPopupType popup_type_; 127 128 // A custom background to paint behind the web content. This will be tiled 129 // horizontally. Can be null, in which case we fall back to painting white. 130 SkBitmap background_; 131 132 // While the mouse is locked, the cursor is hidden from the user. Mouse events 133 // are still generated. However, the position they report is the last known 134 // mouse position just as mouse lock was entered; the movement they report 135 // indicates what the change in position of the mouse would be had it not been 136 // locked. 137 bool mouse_locked_; 138 139 // Whether we are showing a context menu. 140 bool showing_context_menu_; 141 142 // A buffer containing the text inside and around the current selection range. 143 base::string16 selection_text_; 144 145 // The offset of the text stored in |selection_text_| relative to the start of 146 // the web page. 147 size_t selection_text_offset_; 148 149 // The current selection range relative to the start of the web page. 150 gfx::Range selection_range_; 151 152protected: 153 // The scale factor of the display the renderer is currently on. 154 float current_device_scale_factor_; 155 156 private: 157 void FlushInput(); 158 159 // Manager of the tree representation of the WebKit render tree. 160 scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; 161 162 gfx::Rect current_display_area_; 163 164 uint32 renderer_frame_number_; 165 166 base::OneShotTimer<RenderWidgetHostViewBase> flush_input_timer_; 167 168 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewBase); 169}; 170 171} // namespace content 172 173#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_BASE_H_ 174