Home | History | Annotate | Download | only in renderer_host
      1 // Copyright (c) 2011 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 CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_VIEWS_H_
      6 #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_VIEWS_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <string>
     11 #include <vector>
     12 
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/time.h"
     15 #include "content/browser/renderer_host/render_widget_host_view.h"
     16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
     17 #include "ui/gfx/native_widget_types.h"
     18 #include "views/controls/native/native_view_host.h"
     19 #include "views/events/event.h"
     20 #include "views/ime/text_input_client.h"
     21 #include "views/view.h"
     22 #include "webkit/glue/webcursor.h"
     23 
     24 class RenderWidgetHost;
     25 struct NativeWebKeyboardEvent;
     26 
     27 // -----------------------------------------------------------------------------
     28 // See comments in render_widget_host_view.h about this class and its members.
     29 // -----------------------------------------------------------------------------
     30 class RenderWidgetHostViewViews : public RenderWidgetHostView,
     31                                   public views::View,
     32                                   public views::TextInputClient {
     33  public:
     34   // Internal class name.
     35   static const char kViewClassName[];
     36 
     37   explicit RenderWidgetHostViewViews(RenderWidgetHost* widget);
     38   virtual ~RenderWidgetHostViewViews();
     39 
     40   // Initialize this object for use as a drawing area.
     41   void InitAsChild();
     42 
     43   // RenderWidgetHostView implementation.
     44   virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
     45                            const gfx::Rect& pos) OVERRIDE;
     46   virtual void InitAsFullscreen() OVERRIDE;
     47   virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE;
     48   virtual void DidBecomeSelected() OVERRIDE;
     49   virtual void WasHidden() OVERRIDE;
     50   virtual void SetSize(const gfx::Size& size) OVERRIDE;
     51   virtual void SetBounds(const gfx::Rect& rect) OVERRIDE;
     52   virtual gfx::NativeView GetNativeView() OVERRIDE;
     53   virtual void MovePluginWindows(
     54       const std::vector<webkit::npapi::WebPluginGeometry>& moves) OVERRIDE;
     55   virtual bool HasFocus() OVERRIDE;
     56   virtual void Show() OVERRIDE;
     57   virtual void Hide() OVERRIDE;
     58   virtual bool IsShowing() OVERRIDE;
     59   virtual gfx::Rect GetViewBounds() const OVERRIDE;
     60   virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE;
     61   virtual void SetIsLoading(bool is_loading) OVERRIDE;
     62   virtual void ImeUpdateTextInputState(WebKit::WebTextInputType type,
     63                                        const gfx::Rect& caret_rect) OVERRIDE;
     64   virtual void ImeCancelComposition() OVERRIDE;
     65   virtual void DidUpdateBackingStore(
     66       const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
     67       const std::vector<gfx::Rect>& copy_rects) OVERRIDE;
     68   virtual void RenderViewGone(base::TerminationStatus status,
     69                               int error_code) OVERRIDE;
     70   virtual void Destroy() OVERRIDE;
     71   virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) OVERRIDE {}
     72   virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE;
     73   virtual void SelectionChanged(const std::string& text) OVERRIDE;
     74   virtual void ShowingContextMenu(bool showing) OVERRIDE;
     75   virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE;
     76   virtual void SetBackground(const SkBitmap& background) OVERRIDE;
     77   virtual void CreatePluginContainer(gfx::PluginWindowHandle id) OVERRIDE;
     78   virtual void DestroyPluginContainer(gfx::PluginWindowHandle id) OVERRIDE;
     79   virtual void SetVisuallyDeemphasized(const SkColor* color,
     80                                        bool animate) OVERRIDE;
     81   virtual bool ContainsNativeView(gfx::NativeView native_view) const OVERRIDE;
     82   virtual void AcceleratedCompositingActivated(bool activated) OVERRIDE;
     83   virtual gfx::PluginWindowHandle GetCompositingSurface() OVERRIDE;
     84 
     85   // On some systems, there can be two native views, where an outer native view
     86   // contains the inner native view (e.g. when using GTK+). This returns the
     87   // inner view. This can return NULL when it's not attached to a view.
     88   gfx::NativeView GetInnerNativeView() const;
     89 
     90   // Overridden from views::View.
     91   virtual std::string GetClassName() const OVERRIDE;
     92   virtual gfx::NativeCursor GetCursorForPoint(ui::EventType type,
     93                                               const gfx::Point& point) OVERRIDE;
     94   virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
     95   virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
     96   virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE;
     97   virtual void OnMouseMoved(const views::MouseEvent& event) OVERRIDE;
     98   virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE;
     99   virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE;
    100   virtual View::TouchStatus OnTouchEvent(
    101       const views::TouchEvent& event) OVERRIDE;
    102   virtual bool OnKeyPressed(const views::KeyEvent& event) OVERRIDE;
    103   virtual bool OnKeyReleased(const views::KeyEvent& event) OVERRIDE;
    104   virtual bool OnMouseWheel(const views::MouseWheelEvent& event) OVERRIDE;
    105   virtual views::TextInputClient* GetTextInputClient() OVERRIDE;
    106 
    107   // Overridden from TextInputClient:
    108   virtual void SetCompositionText(
    109       const ui::CompositionText& composition) OVERRIDE;
    110   virtual void ConfirmCompositionText() OVERRIDE;
    111   virtual void ClearCompositionText() OVERRIDE;
    112   virtual void InsertText(const string16& text) OVERRIDE;
    113   virtual void InsertChar(char16 ch, int flags) OVERRIDE;
    114   virtual ui::TextInputType GetTextInputType() OVERRIDE;
    115   virtual gfx::Rect GetCaretBounds() OVERRIDE;
    116   virtual bool HasCompositionText() OVERRIDE;
    117   virtual bool GetTextRange(ui::Range* range) OVERRIDE;
    118   virtual bool GetCompositionTextRange(ui::Range* range) OVERRIDE;
    119   virtual bool GetSelectionRange(ui::Range* range) OVERRIDE;
    120   virtual bool SetSelectionRange(const ui::Range& range) OVERRIDE;
    121   virtual bool DeleteRange(const ui::Range& range) OVERRIDE;
    122   virtual bool GetTextFromRange(
    123       const ui::Range& range,
    124       const base::Callback<void(const string16&)>& callback) OVERRIDE;
    125   virtual void OnInputMethodChanged() OVERRIDE;
    126   virtual bool ChangeTextDirectionAndLayoutAlignment(
    127       base::i18n::TextDirection direction) OVERRIDE;
    128   virtual views::View* GetOwnerViewOfTextInputClient() OVERRIDE;
    129 
    130  protected:
    131   // Overridden from RenderWidgetHostView / views::View.
    132   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
    133   virtual void Focus() OVERRIDE;
    134   virtual void Blur() OVERRIDE;
    135   virtual void OnFocus() OVERRIDE;
    136   virtual void OnBlur() OVERRIDE;
    137 
    138  private:
    139   friend class RenderWidgetHostViewViewsWidget;
    140 
    141   // Returns whether the widget needs an input grab to work
    142   // properly.
    143   bool NeedsInputGrab();
    144 
    145   // Returns whether this render view is a popup (<select> dropdown or
    146   // autocomplete window).
    147   bool IsPopup();
    148 
    149   // Update the display cursor for the render view.
    150   void ShowCurrentCursor();
    151 
    152   // Translate a views::MouseEvent into a WebKit::WebMouseEvent.
    153   WebKit::WebMouseEvent WebMouseEventFromViewsEvent(
    154       const views::MouseEvent& event);
    155 
    156   // Confirm existing composition text in the webpage and ask the input method
    157   // to cancel its ongoing composition sesstion.
    158   void FinishImeCompositionSession();
    159 
    160   // The model object.
    161   RenderWidgetHost* host_;
    162 
    163   // This is true when we are currently painting and thus should handle extra
    164   // paint requests by expanding the invalid rect rather than actually
    165   // painting.
    166   bool about_to_validate_and_paint_;
    167 
    168   // This is the rectangle which we'll paint.
    169   gfx::Rect invalid_rect_;
    170 
    171   // Whether or not this widget is hidden.
    172   bool is_hidden_;
    173 
    174   // Whether we are currently loading.
    175   bool is_loading_;
    176 
    177   // The cursor for the page. This is passed up from the renderer.
    178   WebCursor current_cursor_;
    179 
    180   // The native cursor.
    181   gfx::NativeCursor native_cursor_;
    182 
    183   // Whether we are showing a context menu.
    184   bool is_showing_context_menu_;
    185 
    186   // The time at which this view started displaying white pixels as a result of
    187   // not having anything to paint (empty backing store from renderer). This
    188   // value returns true for is_null() if we are not recording whiteout times.
    189   base::TimeTicks whiteout_start_time_;
    190 
    191   // The time it took after this view was selected for it to be fully painted.
    192   base::TimeTicks tab_switch_paint_time_;
    193 
    194   // If true, fade the render widget when painting it.
    195   bool visually_deemphasized_;
    196 
    197   // The size that we want the renderer to be.
    198   gfx::Size requested_size_;
    199 
    200   // The touch-event. Its touch-points are updated as necessary. A new
    201   // touch-point is added from an ET_TOUCH_PRESSED event, and a touch-point is
    202   // removed from the list on an ET_TOUCH_RELEASED event.
    203   WebKit::WebTouchEvent touch_event_;
    204 
    205   // The current text input type.
    206   ui::TextInputType text_input_type_;
    207 
    208   // The current caret bounds.
    209   gfx::Rect caret_bounds_;
    210 
    211   // Indicates if there is onging composition text.
    212   bool has_composition_text_;
    213 
    214   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewViews);
    215 };
    216 
    217 #endif  // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_VIEWS_H_
    218