Home | History | Annotate | Download | only in browser_plugin
      1 // Copyright 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_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_
      6 #define  CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_
      7 
      8 #include "third_party/WebKit/public/web/WebPlugin.h"
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/memory/weak_ptr.h"
     12 #include "base/sequenced_task_runner_helpers.h"
     13 #include "content/renderer/mouse_lock_dispatcher.h"
     14 #include "content/renderer/render_view_impl.h"
     15 #include "third_party/WebKit/public/web/WebCompositionUnderline.h"
     16 #include "third_party/WebKit/public/web/WebDragStatus.h"
     17 #include "third_party/WebKit/public/web/WebNode.h"
     18 #include "third_party/WebKit/public/web/WebWidget.h"
     19 
     20 struct BrowserPluginHostMsg_ResizeGuest_Params;
     21 struct FrameMsg_BuffersSwapped_Params;
     22 
     23 namespace content {
     24 
     25 class BrowserPluginDelegate;
     26 class ChildFrameCompositingHelper;
     27 class BrowserPluginManager;
     28 class MockBrowserPlugin;
     29 
     30 class CONTENT_EXPORT BrowserPlugin :
     31     NON_EXPORTED_BASE(public blink::WebPlugin),
     32     public MouseLockDispatcher::LockTarget {
     33  public:
     34   static BrowserPlugin* GetFromNode(blink::WebNode& node);
     35 
     36   RenderViewImpl* render_view() const { return render_view_.get(); }
     37   int render_view_routing_id() const { return render_view_routing_id_; }
     38   int browser_plugin_instance_id() const { return browser_plugin_instance_id_; }
     39   bool attached() const { return attached_; }
     40   bool ready() const { return attached_ || attach_pending_; }
     41   BrowserPluginManager* browser_plugin_manager() const {
     42     return browser_plugin_manager_.get();
     43   }
     44 
     45   bool OnMessageReceived(const IPC::Message& msg);
     46 
     47   // Update Browser Plugin's DOM Node attribute |attribute_name| with the value
     48   // |attribute_value|.
     49   void UpdateDOMAttribute(const std::string& attribute_name,
     50                           const std::string& attribute_value);
     51 
     52   // Returns whether the guest process has crashed.
     53   bool guest_crashed() const { return guest_crashed_; }
     54 
     55   // Informs the guest of an updated focus state.
     56   void UpdateGuestFocusState();
     57 
     58   // Indicates whether the guest should be focused.
     59   bool ShouldGuestBeFocused() const;
     60 
     61   // Embedder's device scale factor changed, we need to update the guest
     62   // renderer.
     63   void UpdateDeviceScaleFactor();
     64 
     65   // A request to enable hardware compositing.
     66   void EnableCompositing(bool enable);
     67 
     68   // Provided that a guest instance ID has been allocated, this method attaches
     69   // this BrowserPlugin instance to that guest.
     70   void Attach();
     71 
     72   // Notify the plugin about a compositor commit so that frame ACKs could be
     73   // sent, if needed.
     74   void DidCommitCompositorFrame();
     75 
     76   // Returns whether a message should be forwarded to BrowserPlugin.
     77   static bool ShouldForwardToBrowserPlugin(const IPC::Message& message);
     78 
     79   // blink::WebPlugin implementation.
     80   virtual blink::WebPluginContainer* container() const OVERRIDE;
     81   virtual bool initialize(blink::WebPluginContainer* container) OVERRIDE;
     82   virtual void destroy() OVERRIDE;
     83   virtual bool supportsKeyboardFocus() const OVERRIDE;
     84   virtual bool supportsEditCommands() const OVERRIDE;
     85   virtual bool supportsInputMethod() const OVERRIDE;
     86   virtual bool canProcessDrag() const OVERRIDE;
     87   virtual void paint(
     88       blink::WebCanvas* canvas,
     89       const blink::WebRect& rect) OVERRIDE;
     90   virtual void updateGeometry(
     91       const blink::WebRect& frame_rect,
     92       const blink::WebRect& clip_rect,
     93       const blink::WebVector<blink::WebRect>& cut_outs_rects,
     94       bool is_visible) OVERRIDE;
     95   virtual void updateFocus(bool focused) OVERRIDE;
     96   virtual void updateVisibility(bool visible) OVERRIDE;
     97   virtual bool acceptsInputEvents() OVERRIDE;
     98   virtual bool handleInputEvent(
     99       const blink::WebInputEvent& event,
    100       blink::WebCursorInfo& cursor_info) OVERRIDE;
    101   virtual bool handleDragStatusUpdate(blink::WebDragStatus drag_status,
    102                                       const blink::WebDragData& drag_data,
    103                                       blink::WebDragOperationsMask mask,
    104                                       const blink::WebPoint& position,
    105                                       const blink::WebPoint& screen) OVERRIDE;
    106   virtual void didReceiveResponse(
    107       const blink::WebURLResponse& response) OVERRIDE;
    108   virtual void didReceiveData(const char* data, int data_length) OVERRIDE;
    109   virtual void didFinishLoading() OVERRIDE;
    110   virtual void didFailLoading(const blink::WebURLError& error) OVERRIDE;
    111   virtual void didFinishLoadingFrameRequest(
    112       const blink::WebURL& url,
    113       void* notify_data) OVERRIDE;
    114   virtual void didFailLoadingFrameRequest(
    115       const blink::WebURL& url,
    116       void* notify_data,
    117       const blink::WebURLError& error) OVERRIDE;
    118   virtual bool executeEditCommand(const blink::WebString& name) OVERRIDE;
    119   virtual bool executeEditCommand(const blink::WebString& name,
    120                                   const blink::WebString& value) OVERRIDE;
    121   virtual bool setComposition(
    122       const blink::WebString& text,
    123       const blink::WebVector<blink::WebCompositionUnderline>& underlines,
    124       int selectionStart,
    125       int selectionEnd) OVERRIDE;
    126   virtual bool confirmComposition(
    127       const blink::WebString& text,
    128       blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) OVERRIDE;
    129   virtual void extendSelectionAndDelete(int before, int after) OVERRIDE;
    130 
    131   // MouseLockDispatcher::LockTarget implementation.
    132   virtual void OnLockMouseACK(bool succeeded) OVERRIDE;
    133   virtual void OnMouseLockLost() OVERRIDE;
    134   virtual bool HandleMouseLockedInputEvent(
    135           const blink::WebMouseEvent& event) OVERRIDE;
    136 
    137  private:
    138   friend class base::DeleteHelper<BrowserPlugin>;
    139   // Only the manager is allowed to create a BrowserPlugin.
    140   friend class BrowserPluginManagerImpl;
    141   friend class MockBrowserPluginManager;
    142 
    143   // For unit/integration tests.
    144   friend class MockBrowserPlugin;
    145 
    146   // A BrowserPlugin object is a controller that represents an instance of a
    147   // browser plugin within the embedder renderer process. Once a BrowserPlugin
    148   // does an initial navigation or is attached to a newly created guest, it
    149   // acquires a browser_plugin_instance_id as well. The guest instance ID
    150   // uniquely identifies a guest WebContents that's hosted by this
    151   // BrowserPlugin.
    152   BrowserPlugin(RenderViewImpl* render_view,
    153                 blink::WebFrame* frame,
    154                 scoped_ptr<BrowserPluginDelegate> delegate);
    155 
    156   virtual ~BrowserPlugin();
    157 
    158   int width() const { return plugin_rect_.width(); }
    159   int height() const { return plugin_rect_.height(); }
    160   gfx::Size plugin_size() const { return plugin_rect_.size(); }
    161   gfx::Rect plugin_rect() const { return plugin_rect_; }
    162 
    163   float GetDeviceScaleFactor() const;
    164 
    165   void ShowSadGraphic();
    166 
    167   // Populates BrowserPluginHostMsg_ResizeGuest_Params with resize state.
    168   void PopulateResizeGuestParameters(
    169       const gfx::Size& view_size,
    170       BrowserPluginHostMsg_ResizeGuest_Params* params);
    171 
    172   // IPC message handlers.
    173   // Please keep in alphabetical order.
    174   void OnAdvanceFocus(int instance_id, bool reverse);
    175   void OnAttachACK(int browser_plugin_instance_id);
    176   void OnCompositorFrameSwapped(const IPC::Message& message);
    177   void OnCopyFromCompositingSurface(int instance_id,
    178                                     int request_id,
    179                                     gfx::Rect source_rect,
    180                                     gfx::Size dest_size);
    181   void OnGuestGone(int instance_id);
    182   void OnSetContentsOpaque(int instance_id, bool opaque);
    183   void OnSetCursor(int instance_id, const WebCursor& cursor);
    184   void OnSetMouseLock(int instance_id, bool enable);
    185   void OnShouldAcceptTouchEvents(int instance_id, bool accept);
    186 
    187   // This indicates whether this BrowserPlugin has been attached to a
    188   // WebContents.
    189   bool attached_;
    190   bool attach_pending_;
    191   const base::WeakPtr<RenderViewImpl> render_view_;
    192   // We cache the |render_view_|'s routing ID because we need it on destruction.
    193   // If the |render_view_| is destroyed before the BrowserPlugin is destroyed
    194   // then we will attempt to access a NULL pointer.
    195   const int render_view_routing_id_;
    196   blink::WebPluginContainer* container_;
    197   gfx::Rect plugin_rect_;
    198   float last_device_scale_factor_;
    199   // Bitmap for crashed plugin. Lazily initialized, non-owning pointer.
    200   SkBitmap* sad_guest_;
    201   bool guest_crashed_;
    202   bool plugin_focused_;
    203   // Tracks the visibility of the browser plugin regardless of the whole
    204   // embedder RenderView's visibility.
    205   bool visible_;
    206 
    207   WebCursor cursor_;
    208 
    209   bool mouse_locked_;
    210 
    211   // BrowserPlugin outlives RenderViewImpl in Chrome Apps and so we need to
    212   // store the BrowserPlugin's BrowserPluginManager in a member variable to
    213   // avoid accessing the RenderViewImpl.
    214   const scoped_refptr<BrowserPluginManager> browser_plugin_manager_;
    215 
    216   // Used for HW compositing.
    217   scoped_refptr<ChildFrameCompositingHelper> compositing_helper_;
    218 
    219   // URL for the embedder frame.
    220   int browser_plugin_instance_id_;
    221 
    222   // Indicates whether the guest content is opaque.
    223   bool contents_opaque_;
    224 
    225   std::vector<EditCommand> edit_commands_;
    226 
    227   scoped_ptr<BrowserPluginDelegate> delegate_;
    228 
    229   // Weak factory used in v8 |MakeWeak| callback, since the v8 callback might
    230   // get called after BrowserPlugin has been destroyed.
    231   base::WeakPtrFactory<BrowserPlugin> weak_ptr_factory_;
    232 
    233   DISALLOW_COPY_AND_ASSIGN(BrowserPlugin);
    234 };
    235 
    236 }  // namespace content
    237 
    238 #endif  // CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_
    239