Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
index 6c3c83cc98dae18c8a6df7a703544e0412f28254..fae813da49daec13a0842cce560e10e2a67fe904 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
@@ -229,6 +229,8 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { |
@Override |
public void onVSync(long frameTimeMicros) { |
+ animateIfNecessary(frameTimeMicros); |
+ |
if (mDidSignalVSyncUsingInputEvent) { |
TraceEvent.instant("ContentViewCore::onVSync ignored"); |
mDidSignalVSyncUsingInputEvent = false; |
@@ -273,12 +275,21 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { |
while (isVSyncNotificationEnabled()) setVSyncNotificationEnabled(false); |
mVSyncSubscriberCount = 0; |
mVSyncListenerRegistered = false; |
+ mNeedAnimate = false; |
} |
private boolean isVSyncNotificationEnabled() { |
return mVSyncProvider != null && mVSyncListenerRegistered; |
} |
+ @CalledByNative |
+ private void setNeedsAnimate() { |
+ if (!mNeedAnimate) { |
+ mNeedAnimate = true; |
+ setVSyncNotificationEnabled(true); |
+ } |
+ } |
+ |
private final Context mContext; |
private ViewGroup mContainerView; |
private InternalAccessDelegate mContainerViewInternals; |
@@ -358,6 +369,9 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { |
// Whether we received a new frame since consumePendingRendererFrame() was last called. |
private boolean mPendingRendererFrame = false; |
+ // Whether we should animate at the next vsync tick. |
+ private boolean mNeedAnimate = false; |
+ |
private ViewAndroid mViewAndroid; |
/** |
@@ -2747,6 +2761,18 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { |
} |
} |
+ public boolean animate(long frameTimeMicros) { |
+ if (mNativeContentViewCore == 0) return false; |
+ return nativeAnimate(mNativeContentViewCore, frameTimeMicros); |
+ } |
+ |
+ private void animateIfNecessary(long frameTimeMicros) { |
+ if (mNeedAnimate) { |
+ mNeedAnimate = animate(frameTimeMicros); |
+ if (!mNeedAnimate) setVSyncNotificationEnabled(false); |
+ } |
+ } |
+ |
@CalledByNative |
private void notifyExternalSurface( |
int playerId, boolean isRequest, float x, float y, float width, float height) { |
@@ -2917,6 +2943,8 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient { |
private native void nativeOnVSync(int nativeContentViewCoreImpl, long frameTimeMicros); |
+ private native boolean nativeAnimate(int nativeContentViewCoreImpl, long frameTimeMicros); |
+ |
private native boolean nativePopulateBitmapFromCompositor(int nativeContentViewCoreImpl, |
Bitmap bitmap); |