blob: 762cd47e08bab5d59aabd62fd0449003423276be [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test;
import android.graphics.RectF;
import android.os.Build;
import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.android_webview.ExternalVideoSurfaceContainer;
import org.chromium.android_webview.test.util.VideoTestUtil;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content.browser.test.util.CallbackHelper;
/**
* A test suite for ExternalVideoSurfaceContainerTest.
*/
@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT)
public class ExternalVideoSurfaceContainerTest extends AwTestBase {
// Callback helper to track the position/size of the external surface.
private static class OnExternalVideoSurfacePositionChanged extends CallbackHelper {
private RectF mRect;
public RectF getRectF() {
return mRect;
}
public void notifyCalled(RectF rect) {
mRect = rect;
notifyCalled();
}
}
private OnExternalVideoSurfacePositionChanged mOnExternalVideoSurfacePositionChanged =
new OnExternalVideoSurfacePositionChanged();
private CallbackHelper mOnRequestExternalVideoSurface = new CallbackHelper();
private static void waitForVideoSizeChangeTo(OnExternalVideoSurfacePositionChanged helper,
int callCount, float widthCss, float heightCss) throws Exception {
final int maxSizeChangeNotificationToWaitFor = 5;
final float epsilon = 0.000001f;
for (int i = 1; i <= maxSizeChangeNotificationToWaitFor; ++i) {
helper.waitForCallback(callCount, i);
RectF rect = helper.getRectF();
if (Math.abs(rect.width() - widthCss) < epsilon
&& Math.abs(rect.height() - heightCss) < epsilon) {
break;
}
assertTrue(i < maxSizeChangeNotificationToWaitFor);
}
}
private class MockExternalVideoSurfaceContainer extends ExternalVideoSurfaceContainer {
private int mPlayerId = INVALID_PLAYER_ID;
public MockExternalVideoSurfaceContainer(
long nativeExternalVideoSurfaceContainer, ContentViewCore contentViewCore) {
super(nativeExternalVideoSurfaceContainer, contentViewCore);
}
@Override
protected void requestExternalVideoSurface(int playerId) {
mPlayerId = playerId;
mOnRequestExternalVideoSurface.notifyCalled();
}
@Override
protected void releaseExternalVideoSurface(int playerId) {
mPlayerId = INVALID_PLAYER_ID;
}
@Override
protected void destroy() {}
@Override
protected void onExternalVideoSurfacePositionChanged(
int playerId, float left, float top, float right, float bottom) {
if (mPlayerId != playerId) {
return;
}
mOnExternalVideoSurfacePositionChanged.notifyCalled(
new RectF(left, top, right, bottom));
}
@Override
protected void onFrameInfoUpdated() {}
}
private void setUpMockExternalVideoSurfaceContainer() {
ExternalVideoSurfaceContainer.setFactory(new ExternalVideoSurfaceContainer.Factory() {
@Override
public ExternalVideoSurfaceContainer create(
long nativeContainer, ContentViewCore contentViewCore) {
return new MockExternalVideoSurfaceContainer(nativeContainer, contentViewCore);
}
});
}
@DisableHardwareAccelerationForTest
@SmallTest
@Feature({"AndroidWebView"})
public void testEnableVideoOverlayForEmbeddedVideo() throws Throwable {
setUpMockExternalVideoSurfaceContainer();
int onRequestCallCount = mOnRequestExternalVideoSurface.getCallCount();
int onPositionChangedCallCount = mOnExternalVideoSurfacePositionChanged.getCallCount();
assertTrue(VideoTestUtil.runVideoTest(this, false, true, WAIT_TIMEOUT_MS));
mOnRequestExternalVideoSurface.waitForCallback(onRequestCallCount);
waitForVideoSizeChangeTo(mOnExternalVideoSurfacePositionChanged,
onPositionChangedCallCount, 150.0f, 150.0f);
}
@DisableHardwareAccelerationForTest
@SmallTest
@Feature({"AndroidWebView"})
public void testDisableVideoOverlayForEmbeddedVideo() throws Throwable {
setUpMockExternalVideoSurfaceContainer();
assertTrue(VideoTestUtil.runVideoTest(this, false, false, WAIT_TIMEOUT_MS));
assertEquals(0, mOnRequestExternalVideoSurface.getCallCount());
assertEquals(0, mOnExternalVideoSurfacePositionChanged.getCallCount());
}
}