Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / render_widget_host_view_mac.h
index da16bc2..8e6ab23 100644 (file)
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "content/browser/accessibility/browser_accessibility_delegate_mac.h"
+#include "content/browser/renderer_host/display_link_mac.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/software_frame_manager.h"
+#include "content/common/cursors/webcursor.h"
 #include "content/common/edit_command.h"
 #import "content/public/browser/render_widget_host_view_mac_base.h"
 #include "ipc/ipc_sender.h"
 #include "third_party/WebKit/public/web/WebCompositionUnderline.h"
 #include "ui/base/cocoa/base_view.h"
-#include "webkit/common/cursors/webcursor.h"
 
 namespace content {
 class CompositingIOSurfaceMac;
 class CompositingIOSurfaceContext;
+class RenderFrameHost;
 class RenderWidgetHostViewMac;
 class RenderWidgetHostViewMacEditCommandHelper;
 }
@@ -53,7 +55,9 @@ class RenderWidgetHostViewMacEditCommandHelper;
                 BrowserAccessibilityDelegateCocoa> {
  @private
   scoped_ptr<content::RenderWidgetHostViewMac> renderWidgetHostView_;
-  NSObject<RenderWidgetHostViewMacDelegate>* delegate_;  // weak
+  // This ivar is the cocoa delegate of the NSResponder.
+  base::scoped_nsobject<NSObject<RenderWidgetHostViewMacDelegate>>
+      responderDelegate_;
   BOOL canBeKeyView_;
   BOOL takesFocusOnlyOnMouseDown_;
   BOOL closeOnDeactivate_;
@@ -108,13 +112,13 @@ class RenderWidgetHostViewMacEditCommandHelper;
   NSRange selectedRange_;
 
   // Text to be inserted which was generated by handling a key down event.
-  string16 textToBeInserted_;
+  base::string16 textToBeInserted_;
 
   // Marked text which was generated by handling a key down event.
-  string16 markedText_;
+  base::string16 markedText_;
 
   // Underline information of the |markedText_|.
-  std::vector<WebKit::WebCompositionUnderline> underlines_;
+  std::vector<blink::WebCompositionUnderline> underlines_;
 
   // Indicates if doCommandBySelector method receives any edit command when
   // handling a key down event.
@@ -177,6 +181,19 @@ class RenderWidgetHostViewMacEditCommandHelper;
                              actualRange:(NSRangePointer)actualRange;
 @end
 
+@interface SoftwareLayer : CALayer {
+ @private
+  content::RenderWidgetHostViewMac* renderWidgetHostView_;
+}
+
+- (id)initWithRenderWidgetHostViewMac:(content::RenderWidgetHostViewMac*)r;
+
+// Invalidate the RenderWidgetHostViewMac because it may be going away. If
+// displayed again, it will draw white.
+- (void)disableRendering;
+
+@end
+
 namespace content {
 class RenderWidgetHostImpl;
 
@@ -204,6 +221,9 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
 
   RenderWidgetHostViewCocoa* cocoa_view() const { return cocoa_view_; }
 
+  // |delegate| is used to separate out the logic from the NSResponder delegate.
+  // |delegate| is retained by this class.
+  // |delegate| should be set at most once.
   CONTENT_EXPORT void SetDelegate(
     NSObject<RenderWidgetHostViewMacDelegate>* delegate);
   void SetAllowOverlappingViews(bool overlapping);
@@ -260,12 +280,12 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
       const gfx::Rect& scroll_rect,
       const gfx::Vector2d& scroll_delta,
       const std::vector<gfx::Rect>& copy_rects,
-      const ui::LatencyInfo& latency_info) OVERRIDE;
+      const std::vector<ui::LatencyInfo>& latency_info) OVERRIDE;
   virtual void RenderProcessGone(base::TerminationStatus status,
                                  int error_code) OVERRIDE;
   virtual void Destroy() OVERRIDE;
-  virtual void SetTooltipText(const string16& tooltip_text) OVERRIDE;
-  virtual void SelectionChanged(const string16& text,
+  virtual void SetTooltipText(const base::string16& tooltip_text) OVERRIDE;
+  virtual void SelectionChanged(const base::string16& text,
                                 size_t offset,
                                 const gfx::Range& range) OVERRIDE;
   virtual void SelectionBoundsChanged(
@@ -275,7 +295,8 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   virtual void CopyFromCompositingSurface(
       const gfx::Rect& src_subrect,
       const gfx::Size& dst_size,
-      const base::Callback<void(bool, const SkBitmap&)>& callback) OVERRIDE;
+      const base::Callback<void(bool, const SkBitmap&)>& callback,
+      SkBitmap::Config config) OVERRIDE;
   virtual void CopyFromCompositingSurfaceToVideoFrame(
       const gfx::Rect& src_subrect,
       const scoped_refptr<media::VideoFrame>& target,
@@ -288,9 +309,9 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   virtual void OnSwapCompositorFrame(
       uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) OVERRIDE;
   virtual void OnAcceleratedCompositingStateChange() OVERRIDE;
-  virtual void OnAccessibilityEvents(
-      const std::vector<AccessibilityHostMsg_EventParams>& params
-      ) OVERRIDE;
+  virtual void AcceleratedSurfaceInitialized(int host_id,
+                                             int route_id) OVERRIDE;
+  virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE;
   virtual bool PostProcessEventForPluginIme(
       const NativeWebKeyboardEvent& event) OVERRIDE;
 
@@ -303,8 +324,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   virtual void AcceleratedSurfaceSuspend() OVERRIDE;
   virtual void AcceleratedSurfaceRelease() OVERRIDE;
   virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE;
-  virtual void AboutToWaitForBackingStoreMsg() OVERRIDE;
-  virtual void GetScreenInfo(WebKit::WebScreenInfo* results) OVERRIDE;
+  virtual void GetScreenInfo(blink::WebScreenInfo* results) OVERRIDE;
   virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE;
   virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE;
 
@@ -315,7 +335,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   virtual bool LockMouse() OVERRIDE;
   virtual void UnlockMouse() OVERRIDE;
   virtual void UnhandledWheelEvent(
-      const WebKit::WebMouseWheelEvent& event) OVERRIDE;
+      const blink::WebMouseWheelEvent& event) OVERRIDE;
 
   // IPC::Sender implementation.
   virtual bool Send(IPC::Message* message) OVERRIDE;
@@ -325,18 +345,17 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
       uint32 output_surface_id, unsigned frame_id) OVERRIDE;
   virtual void ReleaseReferencesToSoftwareFrame() OVERRIDE;
 
+  virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE;
+
   // Forwards the mouse event to the renderer.
-  void ForwardMouseEvent(const WebKit::WebMouseEvent& event);
+  void ForwardMouseEvent(const blink::WebMouseEvent& event);
 
   void KillSelf();
 
   void SetTextInputActive(bool active);
 
-  // Change this view to use CoreAnimation to draw.
-  void EnableCoreAnimation();
-
   // Sends completed plugin IME notification and text back to the renderer.
-  void PluginImeCompositionCompleted(const string16& text, int plugin_id);
+  void PluginImeCompositionCompleted(const base::string16& text, int plugin_id);
 
   const std::string& selected_text() const { return selected_text_; }
 
@@ -345,14 +364,24 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   void CompositorSwapBuffers(uint64 surface_handle,
                              const gfx::Size& size,
                              float scale_factor,
-                             const ui::LatencyInfo& latency_info);
+                             const std::vector<ui::LatencyInfo>& latency_info);
 
   // Draw the IOSurface by making its context current to this view.
-  bool DrawIOSurfaceWithoutCoreAnimation();
+  void DrawIOSurfaceWithoutCoreAnimation();
 
-  // Called when a GPU error is detected. Deletes all compositing state.
+  // Called when a GPU error is detected. Posts a task to destroy all
+  // compositing state.
   void GotAcceleratedCompositingError();
 
+  // Sets the overlay view, which should be drawn in the same IOSurface
+  // atop of this view, if both views are drawing accelerated content.
+  // Overlay is stored as a weak ptr.
+  void SetOverlayView(RenderWidgetHostViewMac* overlay,
+                      const gfx::Point& offset);
+
+  // Removes the previously set overlay view.
+  void RemoveOverlayView();
+
   // Returns true and stores first rectangle for character range if the
   // requested |range| is already cached, otherwise returns false.
   // Exposed for testing.
@@ -377,6 +406,9 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   gfx::Range ConvertCharacterRangeToCompositionRange(
       const gfx::Range& request_range);
 
+  // Returns the focused frame. May return NULL.
+  RenderFrameHost* GetFocusedFrame();
+
   // These member variables should be private, but the associated ObjC class
   // needs access to them and can't be made a friend.
 
@@ -384,23 +416,9 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   // someone (other than superview) has retained |cocoa_view_|.
   RenderWidgetHostImpl* render_widget_host_;
 
-  // This is true when we are currently painting and thus should handle extra
-  // paint requests by expanding the invalid rect rather than actually painting.
-  bool about_to_validate_and_paint_;
-
-  // This is true when we have already scheduled a call to
-  // |-callSetNeedsDisplayInRect:| but it has not been fulfilled yet.  Used to
-  // prevent us from scheduling multiple calls.
-  bool call_set_needs_display_in_rect_pending_;
-
   // Whether last rendered frame was accelerated.
   bool last_frame_was_accelerated_;
 
-  // The invalid rect that needs to be painted by callSetNeedsDisplayInRect.
-  // This value is only meaningful when
-  // |call_set_needs_display_in_rect_pending_| is true.
-  NSRect invalid_rect_;
-
   // The time at which this view started displaying white pixels as a result of
   // not having anything to paint (empty backing store from renderer). This
   // value returns true for is_null() if we are not recording whiteout times.
@@ -413,7 +431,13 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   ui::TextInputType text_input_type_;
   bool can_compose_inline_;
 
-  base::scoped_nsobject<CALayer> software_layer_;
+  // The background CoreAnimation layer which is hosted by |cocoa_view_|.
+  // The compositing or software layers will be added as sublayers to this.
+  base::scoped_nsobject<CALayer> background_layer_;
+
+  // The CoreAnimation layer for software compositing. This should be NULL
+  // when software compositing is not in use.
+  base::scoped_nsobject<SoftwareLayer> software_layer_;
 
   // Accelerated compositing structures. These may be dynamically created and
   // destroyed together in Create/DestroyCompositedIOSurfaceAndLayer.
@@ -421,6 +445,11 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   scoped_ptr<CompositingIOSurfaceMac> compositing_iosurface_;
   scoped_refptr<CompositingIOSurfaceContext> compositing_iosurface_context_;
 
+  // Timer used to dynamically transition the compositing layer in and out of
+  // asynchronous mode.
+  base::DelayTimer<RenderWidgetHostViewMac>
+      compositing_iosurface_layer_async_timer_;
+
   // This holds the current software compositing framebuffer, if any.
   scoped_ptr<SoftwareFrameManager> software_frame_manager_;
 
@@ -430,7 +459,16 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   // Whether to use the CoreAnimation path to draw content.
   bool use_core_animation_;
 
-  ui::LatencyInfo software_latency_info_;
+  // Latency info to send back when the next frame appears on the
+  // screen.
+  std::vector<ui::LatencyInfo> pending_latency_info_;
+
+  // When taking a screenshot when using CoreAnimation, add a delay of
+  // a few frames to ensure that the contents have reached the screen
+  // before reporting latency info.
+  uint32 pending_latency_info_delay_;
+  base::WeakPtrFactory<RenderWidgetHostViewMac>
+      pending_latency_info_delay_weak_ptr_factory_;
 
   NSWindow* pepper_fullscreen_window() const {
     return pepper_fullscreen_window_;
@@ -448,16 +486,49 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
 
   int window_number() const;
 
-  float scale_factor() const;
+  // The scale factor for the screen that the view is currently on.
+  float ViewScaleFactor() const;
+
+  // Update the scale factor for the backing store and for any CALayers.
+  void UpdateBackingStoreScaleFactor();
+
+  // Ensure that the display link is associated with the correct display.
+  void UpdateDisplayLink();
+
+  // The scale factor of the backing store. Note that this is updated based on
+  // ViewScaleFactor with some delay.
+  float backing_store_scale_factor_;
 
-  void FrameSwapped();
+  void AddPendingLatencyInfo(
+      const std::vector<ui::LatencyInfo>& latency_info);
+  void SendPendingLatencyInfoToHost();
+  void TickPendingLatencyInfoDelay();
+
+  void SendPendingSwapAck();
+
+  void PauseForPendingResizeOrRepaintsAndDraw();
+
+  // The geometric arrangement of the layers depends on cocoa_view's size, the
+  // compositing IOSurface's rounded size, and the software frame size. Update
+  // all of them using this function when any of those parameters changes. Also
+  // update the scale factor of the layers.
+  void LayoutLayers();
 
  private:
   friend class RenderWidgetHostView;
   friend class RenderWidgetHostViewMacTest;
 
-  void GetVSyncParameters(
-      base::TimeTicks* timebase, base::TimeDelta* interval);
+  struct PendingSwapAck {
+    PendingSwapAck(int32 route_id, int gpu_host_id, int32 renderer_id)
+        : route_id(route_id),
+          gpu_host_id(gpu_host_id),
+          renderer_id(renderer_id) {}
+    int32 route_id;
+    int gpu_host_id;
+    int32 renderer_id;
+  };
+  scoped_ptr<PendingSwapAck> pending_swap_ack_;
+  void AddPendingSwapAck(int32 route_id, int gpu_host_id, int32 renderer_id);
 
   // The view will associate itself with the given widget. The native view must
   // be hooked up immediately to the view hierarchy, or else when it is
@@ -471,14 +542,25 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   // invoke it from the message loop.
   void ShutdownHost();
 
-  bool CreateCompositedIOSurface();
-  bool CreateCompositedIOSurfaceLayer();
+  void EnsureSoftwareLayer();
+  void DestroySoftwareLayer();
+
+  bool EnsureCompositedIOSurface() WARN_UNUSED_RESULT;
+  void EnsureCompositedIOSurfaceLayer();
+  enum DestroyCompositedIOSurfaceLayerBehavior {
+    kLeaveLayerInHierarchy,
+    kRemoveLayerFromHierarchy,
+  };
+  void DestroyCompositedIOSurfaceLayer(
+      DestroyCompositedIOSurfaceLayerBehavior destroy_layer_behavior);
   enum DestroyContextBehavior {
     kLeaveContextBoundToView,
     kDestroyContext,
   };
-  void DestroyCompositedIOSurfaceAndLayer(DestroyContextBehavior
-      destroy_context_behavior);
+  void DestroyCompositedIOSurfaceAndLayer(
+      DestroyContextBehavior destroy_context_behavior);
+
+  void DestroyCompositingStateOnError();
 
   // Unbind the GL context (if any) that is bound to |cocoa_view_|.
   void ClearBoundContextDrawable();
@@ -489,32 +571,20 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   // Called when a software DIB is received.
   void GotSoftwareFrame();
 
-  // Ack pending SwapBuffers requests, if any, to unblock the GPU process. Has
-  // no effect if there are no pending requests.
-  void AckPendingSwapBuffers();
-
-  // Ack pending SwapBuffers requests, but no more frequently than the vsync
-  // rate if the renderer is not throttling the swap rate.
-  void ThrottledAckPendingSwapBuffers();
+  // Called if it has been a quarter-second since a GPU SwapBuffers has been
+  // received. In this case, switch from polling for frames to pushing them.
+  void TimerSinceGotAcceleratedFrameFired();
 
   void OnPluginFocusChanged(bool focused, int plugin_id);
   void OnStartPluginIme();
-  CONTENT_EXPORT void OnAcceleratedSurfaceSetIOSurface(
-      gfx::PluginWindowHandle window,
-      int32 width,
-      int32 height,
-      uint64 mach_port);
-  void OnAcceleratedSurfaceSetTransportDIB(gfx::PluginWindowHandle window,
-                                           int32 width,
-                                           int32 height,
-                                           TransportDIB::Handle transport_dib);
-  void OnAcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window,
-                                          uint64 surface_handle);
 
   // Convert |rect| from the views coordinate (upper-left origin) into
   // the OpenGL coordinate (lower-left origin) and scale for HiDPI displays.
   gfx::Rect GetScaledOpenGLPixelRect(const gfx::Rect& rect);
 
+  // Send updated vsync parameters to the renderer.
+  void SendVSyncParametersToRenderer();
+
   // The associated view. This is weak and is inserted into the view hierarchy
   // to own this RenderWidgetHostViewMac object. Set to nil at the start of the
   // destructor.
@@ -524,7 +594,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   bool is_loading_;
 
   // The text to be shown in the tooltip, supplied by the renderer.
-  string16 tooltip_text_;
+  base::string16 tooltip_text_;
 
   // Factory used to safely scope delayed calls to ShutdownHost().
   base::WeakPtrFactory<RenderWidgetHostViewMac> weak_factory_;
@@ -541,18 +611,29 @@ class RenderWidgetHostViewMac : public RenderWidgetHostViewBase,
   // Our parent host view, if this is fullscreen.  NULL otherwise.
   RenderWidgetHostViewMac* fullscreen_parent_host_view_;
 
-  // List of pending swaps for deferred acking:
-  //   pairs of (route_id, gpu_host_id).
-  std::list<std::pair<int32, int32> > pending_swap_buffers_acks_;
+  // The overlay view which is rendered above this one in the same
+  // accelerated IOSurface.
+  // Overlay view has |underlay_view_| set to this view.
+  base::WeakPtr<RenderWidgetHostViewMac> overlay_view_;
+
+  // Offset at which overlay view should be rendered.
+  gfx::Point overlay_view_offset_;
+
+  // The underlay view which this view is rendered above in the same
+  // accelerated IOSurface.
+  // Underlay view has |overlay_view_| set to this view.
+  base::WeakPtr<RenderWidgetHostViewMac> underlay_view_;
+
+  // Set to true when |underlay_view_| has drawn this view. After that point,
+  // this view should not draw again until |underlay_view_| is changed.
+  bool underlay_view_has_drawn_;
 
-  // Factory used to cancel outstanding throttled AckPendingSwapBuffers calls.
+  // Factory used to safely reference overlay view set in SetOverlayView.
   base::WeakPtrFactory<RenderWidgetHostViewMac>
-      pending_swap_buffers_acks_weak_factory_;
+      overlay_view_weak_factory_;
 
-  // The earliest time at which the next swap ack may be sent. Only relevant
-  // when swaps are not being throttled by the renderer (when threaded
-  // compositing is off).
-  base::Time next_swap_ack_time_;
+  // Display link for getting vsync info.
+  scoped_refptr<DisplayLinkMac> display_link_;
 
   // The current composition character range and its bounds.
   gfx::Range composition_range_;