Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
index d2bc37147b0301fbbc58907af5f4bbb1cef5ae5f..8fb536635630804908b240569e364c7eb7b11c28 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
@@ -23,6 +23,7 @@ import org.chromium.base.Log; |
import org.chromium.base.TraceEvent; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
+import org.chromium.base.annotations.UsedByReflection; |
import org.chromium.chrome.browser.ChromeSwitches; |
import org.chromium.chrome.browser.compositor.layouts.Layout; |
import org.chromium.chrome.browser.compositor.layouts.LayoutProvider; |
@@ -39,11 +40,14 @@ import org.chromium.ui.base.WindowAndroid; |
import org.chromium.ui.resources.AndroidResourceType; |
import org.chromium.ui.resources.ResourceManager; |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
/** |
* The is the {@link View} displaying the ui compositor results; including webpages and tabswitcher. |
*/ |
@JNINamespace("android") |
-public class CompositorView extends SurfaceView implements SurfaceHolder.Callback { |
+public class CompositorView extends SurfaceView implements SurfaceHolder.Callback2 { |
private static final String TAG = "CompositorView"; |
private static final long NANOSECONDS_PER_MILLISECOND = 1000000; |
@@ -72,6 +76,7 @@ public class CompositorView extends SurfaceView implements SurfaceHolder.Callbac |
private int mSurfaceWidth; |
private int mSurfaceHeight; |
private boolean mPreloadedResources; |
+ private List<Runnable> mDrawingFinishedCallbacks; |
// The current SurfaceView pixel format. Defaults to OPAQUE. |
private int mCurrentPixelFormat = PixelFormat.OPAQUE; |
@@ -199,6 +204,9 @@ public class CompositorView extends SurfaceView implements SurfaceHolder.Callbac |
// Grab the Resource Manager |
mResourceManager = nativeGetResourceManager(mNativeCompositorView); |
+ |
+ // Redraw in case there are callbacks pending |mDrawingFinishedCallbacks|. |
+ nativeSetNeedsComposite(mNativeCompositorView); |
} |
@Override |
@@ -217,6 +225,19 @@ public class CompositorView extends SurfaceView implements SurfaceHolder.Callbac |
} |
@Override |
+ public void surfaceRedrawNeeded(SurfaceHolder holder) { |
+ // Intentionally not implemented. |
+ } |
+ |
+ // TODO(boliu): Mark this override instead. |
+ @UsedByReflection("Android") |
+ public void surfaceRedrawNeededAsync(SurfaceHolder holder, Runnable drawingFinished) { |
+ if (mDrawingFinishedCallbacks == null) mDrawingFinishedCallbacks = new ArrayList<>(); |
+ mDrawingFinishedCallbacks.add(drawingFinished); |
+ if (mNativeCompositorView != 0) nativeSetNeedsComposite(mNativeCompositorView); |
+ } |
+ |
+ @Override |
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
if (mNativeCompositorView == 0) return; |
nativeSurfaceChanged(mNativeCompositorView, format, width, height, holder.getSurface()); |
@@ -310,6 +331,16 @@ public class CompositorView extends SurfaceView implements SurfaceHolder.Callbac |
mRenderHost.didSwapFrame(pendingFrameCount); |
} |
+ @CalledByNative |
+ private void didSwapBuffers() { |
+ List<Runnable> runnables = mDrawingFinishedCallbacks; |
+ mDrawingFinishedCallbacks = null; |
+ if (runnables == null) return; |
+ for (Runnable r : runnables) { |
+ r.run(); |
+ } |
+ } |
+ |
/** |
* Converts the layout into compositor layers. This is to be called on every frame the layout |
* is changing. |