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