summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 03:28:50 +0000
committerqinmin@chromium.org <qinmin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 03:28:50 +0000
commitae72d81219fa0a2dc2fc48857160d3117bd56523 (patch)
tree9cf0f18e967a24c817e5769dfa8318633e609a52
parentcfc7821418ec8759df693d7abd2fcb1be1aa24c6 (diff)
downloadchromium_src-ae72d81219fa0a2dc2fc48857160d3117bd56523.zip
chromium_src-ae72d81219fa0a2dc2fc48857160d3117bd56523.tar.gz
chromium_src-ae72d81219fa0a2dc2fc48857160d3117bd56523.tar.bz2
Request video element to enter fullscreen when playing protected content
This CL sends an IPC to the render process to request the video element to enter fullscreen. Compared to the old approach, this is more compatible with the upcoming new fullscreen mode, which webkit uses FS API for fullscreen. Currently we need the disable-gesture-requirement-for-fullscreen-media-playback flag for this to work. May consider making the flag default on android. BUG=262945 Review URL: https://codereview.chromium.org/41123002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234725 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/media/android/browser_media_player_manager.cc18
-rw-r--r--content/common/media/media_player_messages_android.h4
-rw-r--r--content/renderer/media/android/renderer_media_player_manager.cc8
-rw-r--r--content/renderer/media/android/renderer_media_player_manager.h1
-rw-r--r--content/renderer/media/android/webmediaplayer_android.cc4
-rw-r--r--content/renderer/media/android/webmediaplayer_android.h1
6 files changed, 35 insertions, 1 deletions
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc
index e9e36fc..682ef3f 100644
--- a/content/browser/media/android/browser_media_player_manager.cc
+++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -17,6 +17,7 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/content_switches.h"
#include "media/base/android/media_drm_bridge.h"
#include "media/base/android/media_player_bridge.h"
#include "media/base/android/media_source_player.h"
@@ -325,7 +326,18 @@ void BrowserMediaPlayerManager::OnProtectedSurfaceRequested(int player_id) {
return;
}
- OnEnterFullscreen(player_id);
+ // Send an IPC to the render process to request the video element to enter
+ // fullscreen. OnEnterFullscreen() will be called later on success.
+ // This guarantees the fullscreen video will be rendered correctly.
+ // During the process, DisableFullscreenEncryptedMediaPlayback() may get
+ // called before or after OnEnterFullscreen(). If it is called before
+ // OnEnterFullscreen(), the player will not enter fullscreen. And it will
+ // retry the process once the GenerateKeyRequest is allowed to proceed
+ // TODO(qinmin): make this flag default on android.
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableGestureRequirementForMediaFullscreen)) {
+ Send(new MediaPlayerMsg_RequestFullscreen(routing_id(), player_id));
+ }
}
void BrowserMediaPlayerManager::OnKeyAdded(int media_keys_id,
@@ -395,6 +407,10 @@ void BrowserMediaPlayerManager::DisableFullscreenEncryptedMediaPlayback() {
void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) {
DCHECK_EQ(fullscreen_player_id_, -1);
+ if (media_keys_ids_pending_approval_.find(player_id) !=
+ media_keys_ids_pending_approval_.end()) {
+ return;
+ }
if (video_view_.get()) {
fullscreen_player_id_ = player_id;
diff --git a/content/common/media/media_player_messages_android.h b/content/common/media/media_player_messages_android.h
index be13ecc..2c833eb 100644
--- a/content/common/media/media_player_messages_android.h
+++ b/content/common/media/media_player_messages_android.h
@@ -193,6 +193,10 @@ IPC_MESSAGE_ROUTED1(MediaPlayerMsg_ConnectedToRemoteDevice,
IPC_MESSAGE_ROUTED1(MediaPlayerMsg_DisconnectedFromRemoteDevice,
int /* player_id */)
+// Instructs the video element to enter fullscreen.
+IPC_MESSAGE_ROUTED1(MediaPlayerMsg_RequestFullscreen,
+ int /*player_id */)
+
// Messages for controlling the media playback in browser process ----------
// Destroy the media player object.
diff --git a/content/renderer/media/android/renderer_media_player_manager.cc b/content/renderer/media/android/renderer_media_player_manager.cc
index 4750549..5cc92ad 100644
--- a/content/renderer/media/android/renderer_media_player_manager.cc
+++ b/content/renderer/media/android/renderer_media_player_manager.cc
@@ -51,6 +51,8 @@ bool RendererMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
OnConnectedToRemoteDevice)
IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice,
OnDisconnectedFromRemoteDevice)
+ IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen,
+ OnRequestFullscreen)
IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen)
IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen)
IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay)
@@ -206,6 +208,12 @@ void RendererMediaPlayerManager::OnPlayerPause(int player_id) {
player->OnMediaPlayerPause();
}
+void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) {
+ WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
+ if (player)
+ player->OnRequestFullscreen();
+}
+
void RendererMediaPlayerManager::EnterFullscreen(int player_id) {
Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id));
}
diff --git a/content/renderer/media/android/renderer_media_player_manager.h b/content/renderer/media/android/renderer_media_player_manager.h
index 730eac4..d68d03e 100644
--- a/content/renderer/media/android/renderer_media_player_manager.h
+++ b/content/renderer/media/android/renderer_media_player_manager.h
@@ -158,6 +158,7 @@ class RendererMediaPlayerManager : public RenderViewObserver {
void OnDidEnterFullscreen(int player_id);
void OnPlayerPlay(int player_id);
void OnPlayerPause(int player_id);
+ void OnRequestFullscreen(int player_id);
void OnKeyAdded(int media_keys_id, const std::string& session_id);
void OnKeyError(int media_keys_id,
const std::string& session_id,
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc
index c0cc390..9fc4155 100644
--- a/content/renderer/media/android/webmediaplayer_android.cc
+++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -811,6 +811,10 @@ void WebMediaPlayerAndroid::OnMediaPlayerPause() {
client_->playbackStateChanged();
}
+void WebMediaPlayerAndroid::OnRequestFullscreen() {
+ client_->requestFullscreen();
+}
+
void WebMediaPlayerAndroid::OnDurationChanged(const base::TimeDelta& duration) {
DCHECK(main_loop_->BelongsToCurrentThread());
// Only MSE |player_type_| registers this callback.
diff --git a/content/renderer/media/android/webmediaplayer_android.h b/content/renderer/media/android/webmediaplayer_android.h
index 42fe04c..8a08fc1 100644
--- a/content/renderer/media/android/webmediaplayer_android.h
+++ b/content/renderer/media/android/webmediaplayer_android.h
@@ -175,6 +175,7 @@ class WebMediaPlayerAndroid
void OnDidExitFullscreen();
void OnMediaPlayerPlay();
void OnMediaPlayerPause();
+ void OnRequestFullscreen();
// Called when the player is released.
virtual void OnPlayerReleased();