Commit 77f844eb authored by boliu's avatar boliu Committed by Commit bot

Convert force video overlay to preference

This is a long lived command line switch that chromecast uses. Convert
it to a RendererPreference instead.

BUG=469343

Review URL: https://codereview.chromium.org/1025933002

Cr-Commit-Position: refs/heads/master@{#321923}
parent 7135be17
...@@ -93,6 +93,7 @@ public class AwSettings { ...@@ -93,6 +93,7 @@ public class AwSettings {
private boolean mEnableSupportedHardwareAcceleratedFeatures = false; private boolean mEnableSupportedHardwareAcceleratedFeatures = false;
private int mMixedContentMode = MIXED_CONTENT_NEVER_ALLOW; private int mMixedContentMode = MIXED_CONTENT_NEVER_ALLOW;
private boolean mVideoOverlayForEmbeddedVideoEnabled = false; private boolean mVideoOverlayForEmbeddedVideoEnabled = false;
private boolean mForceVideoOverlayForTests = false;
private boolean mOffscreenPreRaster = false; private boolean mOffscreenPreRaster = false;
// Although this bit is stored on AwSettings it is actually controlled via the CookieManager. // Although this bit is stored on AwSettings it is actually controlled via the CookieManager.
...@@ -1703,6 +1704,29 @@ public class AwSettings { ...@@ -1703,6 +1704,29 @@ public class AwSettings {
return mVideoOverlayForEmbeddedVideoEnabled; return mVideoOverlayForEmbeddedVideoEnabled;
} }
@VisibleForTesting
public void setForceVideoOverlayForTests(final boolean enabled) {
synchronized (mAwSettingsLock) {
if (mForceVideoOverlayForTests != enabled) {
mForceVideoOverlayForTests = enabled;
mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
@Override
public void run() {
if (mNativeAwSettings != 0) {
nativeUpdateRendererPreferencesLocked(mNativeAwSettings);
}
}
});
}
}
}
@CalledByNative
private boolean getForceVideoOverlayForTests() {
assert Thread.holdsLock(mAwSettingsLock);
return mForceVideoOverlayForTests;
}
@CalledByNative @CalledByNative
private boolean supportsDoubleTapZoomLocked() { private boolean supportsDoubleTapZoomLocked() {
assert Thread.holdsLock(mAwSettingsLock); assert Thread.holdsLock(mAwSettingsLock);
......
...@@ -216,7 +216,12 @@ public class AwContentsClientFullScreenTest extends AwTestBase { ...@@ -216,7 +216,12 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
@Feature({"AndroidWebView"}) @Feature({"AndroidWebView"})
public void testOnShowCustomViewTransfersHolePunchingSurfaceForVideoInsideDiv() public void testOnShowCustomViewTransfersHolePunchingSurfaceForVideoInsideDiv()
throws Throwable { throws Throwable {
VideoSurfaceViewUtils.forceUseVideoHoleSurfaceView(); getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mTestContainerView.getAwContents().getSettings().setForceVideoOverlayForTests(true);
}
});
loadTestPage(VIDEO_INSIDE_DIV_TEST_URL); loadTestPage(VIDEO_INSIDE_DIV_TEST_URL);
assertFalse(DOMUtils.isFullscreen(getWebContentsOnUiThread())); assertFalse(DOMUtils.isFullscreen(getWebContentsOnUiThread()));
...@@ -245,7 +250,12 @@ public class AwContentsClientFullScreenTest extends AwTestBase { ...@@ -245,7 +250,12 @@ public class AwContentsClientFullScreenTest extends AwTestBase {
@Feature({"AndroidWebView"}) @Feature({"AndroidWebView"})
public void testOnShowCustomViewRemovesHolePunchingSurfaceForVideo() public void testOnShowCustomViewRemovesHolePunchingSurfaceForVideo()
throws Throwable { throws Throwable {
VideoSurfaceViewUtils.forceUseVideoHoleSurfaceView(); getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mTestContainerView.getAwContents().getSettings().setForceVideoOverlayForTests(true);
}
});
loadTestPage(VIDEO_TEST_URL); loadTestPage(VIDEO_TEST_URL);
assertFalse(DOMUtils.isFullscreen(getWebContentsOnUiThread())); assertFalse(DOMUtils.isFullscreen(getWebContentsOnUiThread()));
......
...@@ -2723,7 +2723,7 @@ public class AwSettingsTest extends AwTestBase { ...@@ -2723,7 +2723,7 @@ public class AwSettingsTest extends AwTestBase {
*/ */
@DisabledTest @DisabledTest
public void testMediaPlaybackWithoutUserGesture() throws Throwable { public void testMediaPlaybackWithoutUserGesture() throws Throwable {
assertTrue(VideoTestUtil.runVideoTest(this, false, WAIT_TIMEOUT_MS)); assertTrue(VideoTestUtil.runVideoTest(this, false, false, WAIT_TIMEOUT_MS));
} }
@DisableHardwareAccelerationForTest @DisableHardwareAccelerationForTest
...@@ -2731,7 +2731,7 @@ public class AwSettingsTest extends AwTestBase { ...@@ -2731,7 +2731,7 @@ public class AwSettingsTest extends AwTestBase {
@Feature({"AndroidWebView", "Preferences"}) @Feature({"AndroidWebView", "Preferences"})
public void testMediaPlaybackWithUserGesture() throws Throwable { public void testMediaPlaybackWithUserGesture() throws Throwable {
// Wait for 5 second to see if video played. // Wait for 5 second to see if video played.
assertFalse(VideoTestUtil.runVideoTest(this, true, scaleTimeout(5000))); assertFalse(VideoTestUtil.runVideoTest(this, true, false, scaleTimeout(5000)));
} }
@SmallTest @SmallTest
......
...@@ -10,7 +10,6 @@ import android.test.suitebuilder.annotation.SmallTest; ...@@ -10,7 +10,6 @@ import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.android_webview.ExternalVideoSurfaceContainer; import org.chromium.android_webview.ExternalVideoSurfaceContainer;
import org.chromium.android_webview.test.util.VideoTestUtil; import org.chromium.android_webview.test.util.VideoTestUtil;
import org.chromium.base.CommandLine;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.content.browser.ContentViewCore; import org.chromium.content.browser.ContentViewCore;
...@@ -106,12 +105,10 @@ public class ExternalVideoSurfaceContainerTest extends AwTestBase { ...@@ -106,12 +105,10 @@ public class ExternalVideoSurfaceContainerTest extends AwTestBase {
public void testEnableVideoOverlayForEmbeddedVideo() throws Throwable { public void testEnableVideoOverlayForEmbeddedVideo() throws Throwable {
setUpMockExternalVideoSurfaceContainer(); setUpMockExternalVideoSurfaceContainer();
CommandLine.getInstance().appendSwitch("force-use-overlay-embedded-video");
int onRequestCallCount = mOnRequestExternalVideoSurface.getCallCount(); int onRequestCallCount = mOnRequestExternalVideoSurface.getCallCount();
int onPositionChangedCallCount = mOnExternalVideoSurfacePositionChanged.getCallCount(); int onPositionChangedCallCount = mOnExternalVideoSurfacePositionChanged.getCallCount();
assertTrue(VideoTestUtil.runVideoTest(this, false, WAIT_TIMEOUT_MS)); assertTrue(VideoTestUtil.runVideoTest(this, false, true, WAIT_TIMEOUT_MS));
mOnRequestExternalVideoSurface.waitForCallback(onRequestCallCount); mOnRequestExternalVideoSurface.waitForCallback(onRequestCallCount);
waitForVideoSizeChangeTo(mOnExternalVideoSurfacePositionChanged, waitForVideoSizeChangeTo(mOnExternalVideoSurfacePositionChanged,
...@@ -124,7 +121,7 @@ public class ExternalVideoSurfaceContainerTest extends AwTestBase { ...@@ -124,7 +121,7 @@ public class ExternalVideoSurfaceContainerTest extends AwTestBase {
public void testDisableVideoOverlayForEmbeddedVideo() throws Throwable { public void testDisableVideoOverlayForEmbeddedVideo() throws Throwable {
setUpMockExternalVideoSurfaceContainer(); setUpMockExternalVideoSurfaceContainer();
assertTrue(VideoTestUtil.runVideoTest(this, false, WAIT_TIMEOUT_MS)); assertTrue(VideoTestUtil.runVideoTest(this, false, false, WAIT_TIMEOUT_MS));
assertEquals(0, mOnRequestExternalVideoSurface.getCallCount()); assertEquals(0, mOnRequestExternalVideoSurface.getCallCount());
assertEquals(0, mOnExternalVideoSurfacePositionChanged.getCallCount()); assertEquals(0, mOnExternalVideoSurfacePositionChanged.getCallCount());
......
...@@ -42,8 +42,14 @@ public class MultipleVideosTest extends AwTestBase { ...@@ -42,8 +42,14 @@ public class MultipleVideosTest extends AwTestBase {
@Feature({"AndroidWebView"}) @Feature({"AndroidWebView"})
public void testFirstVideoPausesWhenSecondVideoStarts() public void testFirstVideoPausesWhenSecondVideoStarts()
throws Throwable { throws Throwable {
// To test video hole surfaces we must set force-flag before loading page. // To test video hole surfaces we must force video overlay before loading page.
VideoSurfaceViewUtils.forceUseVideoHoleSurfaceView(); getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mTestContainerView.getAwContents().getSettings().setForceVideoOverlayForTests(true);
}
});
loadTestPage(); loadTestPage();
// Play the first video. // Play the first video.
......
...@@ -11,7 +11,6 @@ import android.view.ViewGroup; ...@@ -11,7 +11,6 @@ import android.view.ViewGroup;
import org.chromium.android_webview.ExternalVideoSurfaceContainer.NoPunchingSurfaceView; import org.chromium.android_webview.ExternalVideoSurfaceContainer.NoPunchingSurfaceView;
import org.chromium.android_webview.test.AwTestBase; import org.chromium.android_webview.test.AwTestBase;
import org.chromium.base.CommandLine;
import org.chromium.content.browser.ContentVideoView; import org.chromium.content.browser.ContentVideoView;
import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.CriteriaHelper;
...@@ -28,15 +27,6 @@ public class VideoSurfaceViewUtils { ...@@ -28,15 +27,6 @@ public class VideoSurfaceViewUtils {
*/ */
private static final long MAX_WAIT_FOR_HOLE_PUNCHING_SURFACE_ATTACHED = scaleTimeout(100); private static final long MAX_WAIT_FOR_HOLE_PUNCHING_SURFACE_ATTACHED = scaleTimeout(100);
/**
* Force the use of video hole surfaces (see VIDEO_HOLE). If this method is
* called video hole surfaces will also be created for clear video and not just for
* encrypted video.
*/
public static void forceUseVideoHoleSurfaceView() {
CommandLine.getInstance().appendSwitch("force-use-overlay-embedded-video");
}
/** /**
* Asserts that the given ViewGroup contains exactly one ContentVideoView. * Asserts that the given ViewGroup contains exactly one ContentVideoView.
* @param test Test doing the assert. * @param test Test doing the assert.
......
...@@ -21,7 +21,7 @@ public class VideoTestUtil { ...@@ -21,7 +21,7 @@ public class VideoTestUtil {
* @throws Throwable throw exception if timeout. * @throws Throwable throw exception if timeout.
*/ */
public static boolean runVideoTest(final AwTestBase testCase, final boolean requiredUserGesture, public static boolean runVideoTest(final AwTestBase testCase, final boolean requiredUserGesture,
long waitTime) throws Throwable { final boolean forceVideoOverlay, long waitTime) throws Throwable {
final JavascriptEventObserver observer = new JavascriptEventObserver(); final JavascriptEventObserver observer = new JavascriptEventObserver();
TestAwContentsClient client = new TestAwContentsClient(); TestAwContentsClient client = new TestAwContentsClient();
final AwContents awContents = final AwContents awContents =
...@@ -32,6 +32,7 @@ public class VideoTestUtil { ...@@ -32,6 +32,7 @@ public class VideoTestUtil {
AwSettings awSettings = awContents.getSettings(); AwSettings awSettings = awContents.getSettings();
awSettings.setJavaScriptEnabled(true); awSettings.setJavaScriptEnabled(true);
awSettings.setMediaPlaybackRequiresUserGesture(requiredUserGesture); awSettings.setMediaPlaybackRequiresUserGesture(requiredUserGesture);
awSettings.setForceVideoOverlayForTests(forceVideoOverlay);
observer.register(awContents.getContentViewCore(), "javaObserver"); observer.register(awContents.getContentViewCore(), "javaObserver");
} }
}); });
......
...@@ -200,8 +200,13 @@ void AwSettings::UpdateRendererPreferencesLocked(JNIEnv* env, jobject obj) { ...@@ -200,8 +200,13 @@ void AwSettings::UpdateRendererPreferencesLocked(JNIEnv* env, jobject obj) {
bool video_overlay = bool video_overlay =
Java_AwSettings_getVideoOverlayForEmbeddedVideoEnabledLocked(env, obj); Java_AwSettings_getVideoOverlayForEmbeddedVideoEnabledLocked(env, obj);
if (video_overlay != prefs->use_video_overlay_for_embedded_encrypted_video) { bool force_video_overlay =
Java_AwSettings_getForceVideoOverlayForTests(env, obj);
if (video_overlay !=
prefs->use_video_overlay_for_embedded_encrypted_video ||
force_video_overlay != prefs->use_view_overlay_for_all_video) {
prefs->use_video_overlay_for_embedded_encrypted_video = video_overlay; prefs->use_video_overlay_for_embedded_encrypted_video = video_overlay;
prefs->use_view_overlay_for_all_video = force_video_overlay;
update_prefs = true; update_prefs = true;
} }
......
...@@ -72,8 +72,10 @@ void CastWindowAndroid::Initialize() { ...@@ -72,8 +72,10 @@ void CastWindowAndroid::Initialize() {
web_contents_->GetRenderProcessHost()->GetID()); web_contents_->GetRenderProcessHost()->GetID());
// Enabling hole-punching also requires runtime renderer preference // Enabling hole-punching also requires runtime renderer preference
web_contents_->GetMutableRendererPrefs()-> content::RendererPreferences* prefs =
use_video_overlay_for_embedded_encrypted_video = true; web_contents_->GetMutableRendererPrefs();
prefs->use_video_overlay_for_embedded_encrypted_video = true;
prefs->use_view_overlay_for_all_video = true;
web_contents_->GetRenderViewHost()->SyncRendererPrefs(); web_contents_->GetRenderViewHost()->SyncRendererPrefs();
} }
......
...@@ -107,7 +107,6 @@ DefaultCommandLineSwitch g_default_switches[] = { ...@@ -107,7 +107,6 @@ DefaultCommandLineSwitch g_default_switches[] = {
{ switches::kEnableOverlayFullscreenVideo, ""}, { switches::kEnableOverlayFullscreenVideo, ""},
{ switches::kDisableInfobarForProtectedMediaIdentifier, ""}, { switches::kDisableInfobarForProtectedMediaIdentifier, ""},
{ switches::kDisableGestureRequirementForMediaPlayback, ""}, { switches::kDisableGestureRequirementForMediaPlayback, ""},
{ switches::kForceUseOverlayEmbeddedVideo, ""},
#endif #endif
// Always enable HTMLMediaElement logs. // Always enable HTMLMediaElement logs.
{ switches::kBlinkPlatformLogChannels, "Media"}, { switches::kBlinkPlatformLogChannels, "Media"},
......
...@@ -139,9 +139,6 @@ void CastContentBrowserClient::AppendExtraCommandLineSwitches( ...@@ -139,9 +139,6 @@ void CastContentBrowserClient::AppendExtraCommandLineSwitches(
if (process_type == switches::kRendererProcess) { if (process_type == switches::kRendererProcess) {
// Any browser command-line switches that should be propagated to // Any browser command-line switches that should be propagated to
// the renderer go here. // the renderer go here.
#if defined(OS_ANDROID)
command_line->AppendSwitch(switches::kForceUseOverlayEmbeddedVideo);
#endif // defined(OS_ANDROID)
if (browser_command_line->HasSwitch(switches::kEnableCmaMediaPipeline)) if (browser_command_line->HasSwitch(switches::kEnableCmaMediaPipeline))
command_line->AppendSwitch(switches::kEnableCmaMediaPipeline); command_line->AppendSwitch(switches::kEnableCmaMediaPipeline);
......
...@@ -251,6 +251,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::RendererPreferences) ...@@ -251,6 +251,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::RendererPreferences)
IPC_STRUCT_TRAITS_MEMBER(disable_client_blocked_error_page) IPC_STRUCT_TRAITS_MEMBER(disable_client_blocked_error_page)
IPC_STRUCT_TRAITS_MEMBER(plugin_fullscreen_allowed) IPC_STRUCT_TRAITS_MEMBER(plugin_fullscreen_allowed)
IPC_STRUCT_TRAITS_MEMBER(use_video_overlay_for_embedded_encrypted_video) IPC_STRUCT_TRAITS_MEMBER(use_video_overlay_for_embedded_encrypted_video)
IPC_STRUCT_TRAITS_MEMBER(use_view_overlay_for_all_video)
IPC_STRUCT_TRAITS_MEMBER(caption_font_family_name) IPC_STRUCT_TRAITS_MEMBER(caption_font_family_name)
IPC_STRUCT_TRAITS_MEMBER(caption_font_height) IPC_STRUCT_TRAITS_MEMBER(caption_font_height)
IPC_STRUCT_TRAITS_MEMBER(small_caption_font_family_name) IPC_STRUCT_TRAITS_MEMBER(small_caption_font_family_name)
......
...@@ -919,10 +919,6 @@ const char kDisablePullToRefreshEffect[] = "disable-pull-to-refresh-effect"; ...@@ -919,10 +919,6 @@ const char kDisablePullToRefreshEffect[] = "disable-pull-to-refresh-effect";
// WebRTC is enabled by default on Android. // WebRTC is enabled by default on Android.
const char kDisableWebRTC[] = "disable-webrtc"; const char kDisableWebRTC[] = "disable-webrtc";
// Always use the video overlay for the embedded video.
// This switch is intended only for tests.
const char kForceUseOverlayEmbeddedVideo[] = "force-use-overlay-embedded-video";
// The telephony region (ISO country code) to use in phone number detection. // The telephony region (ISO country code) to use in phone number detection.
const char kNetworkCountryIso[] = "network-country-iso"; const char kNetworkCountryIso[] = "network-country-iso";
......
...@@ -260,7 +260,6 @@ CONTENT_EXPORT extern const char kDisableClickDelay[]; ...@@ -260,7 +260,6 @@ CONTENT_EXPORT extern const char kDisableClickDelay[];
CONTENT_EXPORT extern const char kDisableOverscrollEdgeEffect[]; CONTENT_EXPORT extern const char kDisableOverscrollEdgeEffect[];
CONTENT_EXPORT extern const char kDisablePullToRefreshEffect[]; CONTENT_EXPORT extern const char kDisablePullToRefreshEffect[];
CONTENT_EXPORT extern const char kDisableWebRTC[]; CONTENT_EXPORT extern const char kDisableWebRTC[];
CONTENT_EXPORT extern const char kForceUseOverlayEmbeddedVideo[];
CONTENT_EXPORT extern const char kHideScrollbars[]; CONTENT_EXPORT extern const char kHideScrollbars[];
extern const char kNetworkCountryIso[]; extern const char kNetworkCountryIso[];
CONTENT_EXPORT extern const char kRemoteDebuggingSocketName[]; CONTENT_EXPORT extern const char kRemoteDebuggingSocketName[];
......
...@@ -38,6 +38,7 @@ RendererPreferences::RendererPreferences() ...@@ -38,6 +38,7 @@ RendererPreferences::RendererPreferences()
disable_client_blocked_error_page(false), disable_client_blocked_error_page(false),
plugin_fullscreen_allowed(true), plugin_fullscreen_allowed(true),
use_video_overlay_for_embedded_encrypted_video(false), use_video_overlay_for_embedded_encrypted_video(false),
use_view_overlay_for_all_video(false),
caption_font_height(0), caption_font_height(0),
small_caption_font_height(0), small_caption_font_height(0),
menu_font_height(0), menu_font_height(0),
......
...@@ -131,6 +131,10 @@ struct CONTENT_EXPORT RendererPreferences { ...@@ -131,6 +131,10 @@ struct CONTENT_EXPORT RendererPreferences {
// encrypted video. Currently only used by Android. // encrypted video. Currently only used by Android.
bool use_video_overlay_for_embedded_encrypted_video; bool use_video_overlay_for_embedded_encrypted_video;
// Use video-overlay (hole-punching) should be used for all video, not just
// encrypted video. Currently only used by Android.
bool use_view_overlay_for_all_video;
// The default system font settings for caption, small caption, menu and // The default system font settings for caption, small caption, menu and
// status messages. Used only by Windows. // status messages. Used only by Windows.
base::string16 caption_font_family_name; base::string16 caption_font_family_name;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "cc/layers/video_layer.h" #include "cc/layers/video_layer.h"
#include "content/public/common/content_client.h" #include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/common/renderer_preferences.h"
#include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame.h"
#include "content/renderer/media/android/renderer_demuxer_android.h" #include "content/renderer/media/android/renderer_demuxer_android.h"
#include "content/renderer/media/android/renderer_media_player_manager.h" #include "content/renderer/media/android/renderer_media_player_manager.h"
...@@ -27,6 +28,7 @@ ...@@ -27,6 +28,7 @@
#include "content/renderer/media/crypto/renderer_cdm_manager.h" #include "content/renderer/media/crypto/renderer_cdm_manager.h"
#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_frame_impl.h"
#include "content/renderer/render_thread_impl.h" #include "content/renderer/render_thread_impl.h"
#include "content/renderer/render_view_impl.h"
#include "gpu/GLES2/gl2extchromium.h" #include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/mailbox_holder.h" #include "gpu/command_buffer/common/mailbox_holder.h"
...@@ -212,9 +214,11 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( ...@@ -212,9 +214,11 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
player_id_ = player_manager_->RegisterMediaPlayer(this); player_id_ = player_manager_->RegisterMediaPlayer(this);
#if defined(VIDEO_HOLE) #if defined(VIDEO_HOLE)
force_use_overlay_embedded_video_ = const RendererPreferences& prefs =
base::CommandLine::ForCurrentProcess()->HasSwitch( static_cast<RenderFrameImpl*>(render_frame())
switches::kForceUseOverlayEmbeddedVideo); ->render_view()
->renderer_preferences();
force_use_overlay_embedded_video_ = prefs.use_view_overlay_for_all_video;
if (force_use_overlay_embedded_video_ || if (force_use_overlay_embedded_video_ ||
player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) {
// Defer stream texture creation until we are sure it's necessary. // Defer stream texture creation until we are sure it's necessary.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment