Index: android_webview/browser/browser_view_renderer.h |
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h |
index 5b2056d17b26b68284c4f31caa42305fcbd8e70c..1fcc54ffbecf56d96dd2fef48cdc65ab7522488d 100644 |
--- a/android_webview/browser/browser_view_renderer.h |
+++ b/android_webview/browser/browser_view_renderer.h |
@@ -7,6 +7,8 @@ |
#include "base/android/scoped_java_ref.h" |
#include "base/callback.h" |
+#include "base/cancelable_callback.h" |
+#include "content/public/browser/android/synchronous_compositor_client.h" |
#include "skia/ext/refptr.h" |
#include "ui/gfx/point.h" |
#include "ui/gfx/rect.h" |
@@ -19,128 +21,227 @@ struct AwDrawSWFunctionTable; |
namespace content { |
class ContentViewCore; |
+class SynchronousCompositor; |
+class WebContents; |
} |
namespace android_webview { |
-// Interface for all the WebView-specific content rendering operations. |
-// Provides software and hardware rendering and the Capture Picture API. |
-class BrowserViewRenderer { |
- public: |
- class Client { |
- public: |
- // Request DrawGL be called. Passing null canvas implies the request |
- // will be of AwDrawGLInfo::kModeProcess type. The callback |
- // may never be made, and the mode may be promoted to kModeDraw. |
- virtual bool RequestDrawGL(jobject canvas) = 0; |
+class HardwareRenderer; |
- // Called when a new Picture is available. Needs to be enabled |
- // via the EnableOnNewPicture method. |
- virtual void OnNewPicture() = 0; |
- |
- // Called to trigger view invalidations. |
- virtual void PostInvalidate() = 0; |
+class BrowserViewRendererClient { |
+ public: |
+ // Request DrawGL be called. Passing null |canvas| implies the request |
+ // will be of AwDrawGLInfo::kModeProcess type. The callback |
+ // may never be made, and the mode may be promoted to kModeDraw. |
+ virtual bool RequestDrawGL(jobject canvas) = 0; |
- // Synchronously call back to SetGlobalVisibleRect with current value. |
- virtual void UpdateGlobalVisibleRect() = 0; |
+ // Called when a new Picture is available. Needs to be enabled |
+ // via the EnableOnNewPicture method. |
+ virtual void OnNewPicture() = 0; |
- // Called to get view's absolute location on the screen. |
- virtual gfx::Point GetLocationOnScreen() = 0; |
+ // Called to trigger view invalidations. |
+ virtual void PostInvalidate() = 0; |
- // Try to set the view's scroll offset to |new_value|. |
- virtual void ScrollContainerViewTo(gfx::Vector2d new_value) = 0; |
+ // Synchronously call back to SetGlobalVisibleRect with current value. |
+ virtual void UpdateGlobalVisibleRect() = 0; |
- // Set the view's scroll offset cap to |new_value|. |
- virtual void SetMaxContainerViewScrollOffset(gfx::Vector2d new_value) = 0; |
+ // Called to get view's absolute location on the screen. |
+ virtual gfx::Point GetLocationOnScreen() = 0; |
- // Is a WebView-managed fling in progress? |
- virtual bool IsFlingActive() const = 0; |
+ // Try to set the view's scroll offset to |new_value|. |
+ virtual void ScrollContainerViewTo(gfx::Vector2d new_value) = 0; |
- // Set the current page scale to |page_scale_factor| and page scale limits |
- // to |min_page_scale_factor|..|max_page_scale_factor|. |
- virtual void SetPageScaleFactorAndLimits(float page_scale_factor, |
- float min_page_scale_factor, |
- float max_page_scale_factor) = 0; |
+ // Set the view's scroll offset cap to |new_value|. |
+ virtual void SetMaxContainerViewScrollOffset(gfx::Vector2d new_value) = 0; |
- // Set the current contents_size to |contents_size_dip|. |
- virtual void SetContentsSize(gfx::SizeF contents_size_dip) = 0; |
+ // Is a Android view system managed fling in progress? |
+ virtual bool IsFlingActive() const = 0; |
- // Handle overscroll. |
- virtual void DidOverscroll(gfx::Vector2d overscroll_delta) = 0; |
+ // Set the current page scale to |page_scale_factor| and page scale limits |
+ // to |min_page_scale_factor|..|max_page_scale_factor|. |
+ virtual void SetPageScaleFactorAndLimits(float page_scale_factor, |
+ float min_page_scale_factor, |
+ float max_page_scale_factor) = 0; |
- protected: |
- virtual ~Client() {} |
- }; |
+ // Set the current contents_size to |contents_size_dip|. |
+ virtual void SetContentsSize(gfx::SizeF contents_size_dip) = 0; |
- // Delegate to perform rendering actions involving Java objects. |
- class JavaHelper { |
- public: |
- static JavaHelper* GetInstance(); |
+ // Handle overscroll. |
+ virtual void DidOverscroll(gfx::Vector2d overscroll_delta) = 0; |
- typedef base::Callback<bool(SkCanvas*)> RenderMethod; |
- virtual bool RenderViaAuxilaryBitmapIfNeeded( |
- jobject java_canvas, |
- const gfx::Vector2d& scroll_correction, |
- const gfx::Rect& clip, |
- RenderMethod render_source) = 0; |
+ protected: |
+ virtual ~BrowserViewRendererClient() {} |
+}; |
- protected: |
- virtual ~JavaHelper() {} |
- }; |
+// Delegate to perform rendering actions involving Java objects. |
+class BrowserViewRendererJavaHelper { |
+ public: |
+ static BrowserViewRendererJavaHelper* GetInstance(); |
+ |
+ typedef base::Callback<bool(SkCanvas*)> RenderMethod; |
+ |
+ // Try obtaining the native SkCanvas from |java_canvas| and call |
+ // |render_source| with it. If that fails, allocate an auxilary bitmap |
+ // for |render_source| to render into, then copy the bitmap into |
+ // |java_canvas|. |
+ virtual bool RenderViaAuxilaryBitmapIfNeeded( |
+ jobject java_canvas, |
+ const gfx::Vector2d& scroll_correction, |
+ const gfx::Rect& clip, |
+ RenderMethod render_source) = 0; |
+ |
+ protected: |
+ virtual ~BrowserViewRendererJavaHelper() {} |
+}; |
- // Global hookup methods. |
- static void SetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table); |
+// Interface for all the WebView-specific content rendering operations. |
+// Provides software and hardware rendering and the Capture Picture API. |
+class BrowserViewRenderer : public content::SynchronousCompositorClient { |
+ public: |
+ BrowserViewRenderer(BrowserViewRendererClient* client, |
+ content::WebContents* web_contents); |
- // Rendering methods. |
+ virtual ~BrowserViewRenderer(); |
// Main handler for view drawing: performs a SW draw immediately, or sets up |
- // a subsequent GL Draw (via Client::RequestDrawGL) and returns true. A false |
- // return value indicates nothing was or will be drawn. |
+ // a subsequent GL Draw (via BrowserViewRendererClient::RequestDrawGL) and |
+ // returns true. A false return value indicates nothing was or will be drawn. |
// |java_canvas| is the target of the draw. |is_hardware_canvas| indicates |
// a GL Draw maybe possible on this canvas. |scroll| if the view's current |
// scroll offset. |clip| is the canvas's clip bounds. |visible_rect| is the |
// intersection of the view size and the window in window coordinates. |
- virtual bool OnDraw(jobject java_canvas, |
- bool is_hardware_canvas, |
- const gfx::Vector2d& scroll, |
- const gfx::Rect& clip) = 0; |
+ bool OnDraw(jobject java_canvas, |
+ bool is_hardware_canvas, |
+ const gfx::Vector2d& scroll, |
+ const gfx::Rect& clip); |
- // Called in response to a prior Client::RequestDrawGL() call. See |
- // AwDrawGLInfo documentation for more details of the contract. |
- virtual void DrawGL(AwDrawGLInfo* draw_info) = 0; |
+ // Called in response to a prior BrowserViewRendererClient::RequestDrawGL() |
+ // call. See AwDrawGLInfo documentation for more details of the contract. |
+ void DrawGL(AwDrawGLInfo* draw_info); |
// The global visible rect changed and this is the new value. |
- virtual void SetGlobalVisibleRect(const gfx::Rect& visible_rect) = 0; |
+ void SetGlobalVisibleRect(const gfx::Rect& visible_rect); |
// CapturePicture API methods. |
- virtual skia::RefPtr<SkPicture> CapturePicture(int width, int height) = 0; |
- virtual void EnableOnNewPicture(bool enabled) = 0; |
+ skia::RefPtr<SkPicture> CapturePicture(int width, int height); |
+ void EnableOnNewPicture(bool enabled); |
- virtual void ClearView() = 0; |
+ void ClearView(); |
// View update notifications. |
- virtual void SetIsPaused(bool paused) = 0; |
- virtual void SetViewVisibility(bool visible) = 0; |
- virtual void SetWindowVisibility(bool visible) = 0; |
- virtual void OnSizeChanged(int width, int height) = 0; |
- virtual void OnAttachedToWindow(int width, int height) = 0; |
- virtual void OnDetachedFromWindow() = 0; |
+ void SetIsPaused(bool paused); |
+ void SetViewVisibility(bool visible); |
+ void SetWindowVisibility(bool visible); |
+ void OnSizeChanged(int width, int height); |
+ void OnAttachedToWindow(int width, int height); |
+ void OnDetachedFromWindow(); |
// Sets the scale for logical<->physical pixel conversions. |
- virtual void SetDipScale(float dip_scale) = 0; |
+ void SetDipScale(float dip_scale); |
// Set the root layer scroll offset to |new_value|. |
- virtual void ScrollTo(gfx::Vector2d new_value) = 0; |
+ void ScrollTo(gfx::Vector2d new_value); |
// Android views hierarchy gluing. |
- virtual bool IsAttachedToWindow() = 0; |
- virtual bool IsVisible() = 0; |
- virtual gfx::Rect GetScreenRect() = 0; |
+ bool IsAttachedToWindow() const; |
+ bool IsVisible() const; |
+ gfx::Rect GetScreenRect() const; |
// ComponentCallbacks2.onTrimMemory callback. |
- virtual void TrimMemory(int level) = 0; |
- |
- virtual ~BrowserViewRenderer() {} |
+ void TrimMemory(int level); |
+ |
+ // SynchronousCompositorClient overrides |
+ virtual void DidInitializeCompositor( |
+ content::SynchronousCompositor* compositor) OVERRIDE; |
+ virtual void DidDestroyCompositor(content::SynchronousCompositor* compositor) |
+ OVERRIDE; |
+ virtual void SetContinuousInvalidate(bool invalidate) OVERRIDE; |
+ virtual void SetMaxRootLayerScrollOffset(gfx::Vector2dF new_value) OVERRIDE; |
+ virtual void SetTotalRootLayerScrollOffset(gfx::Vector2dF new_value_css) |
+ OVERRIDE; |
+ virtual void DidUpdateContent() OVERRIDE; |
+ virtual gfx::Vector2dF GetTotalRootLayerScrollOffset() OVERRIDE; |
+ virtual bool IsExternalFlingActive() const OVERRIDE; |
+ virtual void SetRootLayerPageScaleFactorAndLimits(float page_scale_factor, |
+ float min_page_scale_factor, |
+ float max_page_scale_factor) |
+ OVERRIDE; |
+ virtual void SetRootLayerScrollableSize(gfx::SizeF scrollable_size) OVERRIDE; |
+ virtual void DidOverscroll(gfx::Vector2dF accumulated_overscroll, |
+ gfx::Vector2dF latest_overscroll_delta, |
+ gfx::Vector2dF current_fling_velocity) OVERRIDE; |
+ |
+ private: |
+ // Checks the continuous invalidate and block invalidate state, and schedule |
+ // invalidates appropriately. If |invalidate_ignore_compositor| is true, |
+ // then send a view invalidate regardless of compositor expectation. |
+ void EnsureContinuousInvalidation(AwDrawGLInfo* draw_info, |
+ bool invalidate_ignore_compositor); |
+ bool DrawSWInternal(jobject java_canvas, const gfx::Rect& clip_bounds); |
+ bool CompositeSW(SkCanvas* canvas); |
+ |
+ // If we call up view invalidate and OnDraw is not called before a deadline, |
+ // then we keep ticking the SynchronousCompositor so it can make progress. |
+ void FallbackTickFired(); |
+ void ForceFakeCompositeSW(); |
+ |
+ gfx::Vector2d max_scroll_offset() const; |
+ |
+ // For debug tracing or logging. Return the string representation of this |
+ // view renderer's state and the |draw_info| if provided. |
+ std::string ToString(AwDrawGLInfo* draw_info) const; |
+ |
+ BrowserViewRendererClient* client_; |
+ content::WebContents* web_contents_; |
+ content::SynchronousCompositor* compositor_; |
+ |
+ scoped_ptr<HardwareRenderer> hardware_renderer_; |
+ |
+ bool is_paused_; |
+ bool view_visible_; |
+ bool window_visible_; // Only applicable if |attached_to_window_| is true. |
+ bool attached_to_window_; |
+ float dip_scale_; |
+ float page_scale_factor_; |
+ bool on_new_picture_enable_; |
+ bool clear_view_; |
+ |
+ // When true, we should continuously invalidate and keep drawing, for example |
+ // to drive animation. This value is set by the compositor and should always |
+ // reflect the expectation of the compositor and not be reused for other |
+ // states. |
+ bool compositor_needs_continuous_invalidate_; |
+ |
+ // Used to block additional invalidates while one is already pending or before |
+ // compositor draw which may switch continuous_invalidate on and off in the |
+ // process. |
+ bool block_invalidates_; |
+ |
+ // Holds a callback to FallbackTickFired while it is pending. |
+ base::CancelableClosure fallback_tick_; |
+ |
+ int width_; |
+ int height_; |
+ |
+ // Should always call UpdateGlobalVisibleRect before using this. |
+ gfx::Rect cached_global_visible_rect_; |
+ |
+ // Last View scroll when View.onDraw() was called. |
+ gfx::Vector2d scroll_at_start_of_frame_; |
+ |
+ // Current scroll offset in CSS pixels. |
+ gfx::Vector2dF scroll_offset_dip_; |
+ |
+ // Max scroll offset in CSS pixels. |
+ gfx::Vector2dF max_scroll_offset_dip_; |
+ |
+ // Used to prevent rounding errors from accumulating enough to generate |
+ // visible skew (especially noticeable when scrolling up and down in the same |
+ // spot over a period of time). |
+ gfx::Vector2dF overscroll_rounding_error_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserViewRenderer); |
}; |
} // namespace android_webview |