diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2012-06-18 16:36:33 -0700 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2012-06-27 15:53:05 -0700 |
commit | 0675e22b46a05cdd3f6e20133a94bb8448231dfa (patch) | |
tree | 46ef3d75d403aa5ed07dede8a356193c8415267e /Source | |
parent | 4601e20f7d14b20a1063cae8cc1e87fc85baee39 (diff) | |
download | external_webkit-0675e22b46a05cdd3f6e20133a94bb8448231dfa.zip external_webkit-0675e22b46a05cdd3f6e20133a94bb8448231dfa.tar.gz external_webkit-0675e22b46a05cdd3f6e20133a94bb8448231dfa.tar.bz2 |
Support fullscreen to inline video transition.
Basically, player is responsible to enter fullscreen mode such that we have
the proper proxy updated on the Java side.
bug:5710646
framework change:
https://android-git.corp.google.com/g/#/c/202139/
Change-Id: Ie7adf620f2e9889142ef153e12d676a5f288bc0a
Diffstat (limited to 'Source')
9 files changed, 68 insertions, 33 deletions
diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp index 96be3fb..063b8a2 100644 --- a/Source/WebCore/dom/Document.cpp +++ b/Source/WebCore/dom/Document.cpp @@ -4877,11 +4877,6 @@ void Document::webkitCancelFullScreen() return; page()->chrome()->client()->exitFullScreenForElement(m_fullScreenElement.get()); -#if PLATFORM(ANDROID) - // The next time we try to enter full screen, we need this change to know - // we are not in full screen any more. - m_fullScreenElement = 0; -#endif } void Document::webkitWillEnterFullScreenForElement(Element* element) diff --git a/Source/WebCore/platform/graphics/MediaPlayer.cpp b/Source/WebCore/platform/graphics/MediaPlayer.cpp index a7e4b90..4e00382 100644 --- a/Source/WebCore/platform/graphics/MediaPlayer.cpp +++ b/Source/WebCore/platform/graphics/MediaPlayer.cpp @@ -689,6 +689,14 @@ void MediaPlayer::exitFullscreen() } #endif +#if PLATFORM(ANDROID) +void MediaPlayer::enterFullscreenMode() +{ + // Tell the player to enter full screen mode. + m_private->enterFullscreenMode(); +} +#endif + #if USE(ACCELERATED_COMPOSITING) void MediaPlayer::acceleratedRenderingStateChanged() { diff --git a/Source/WebCore/platform/graphics/MediaPlayer.h b/Source/WebCore/platform/graphics/MediaPlayer.h index 41cb6d2..884f915 100644 --- a/Source/WebCore/platform/graphics/MediaPlayer.h +++ b/Source/WebCore/platform/graphics/MediaPlayer.h @@ -190,6 +190,7 @@ public: enum MediaElementType { Video, Audio }; void setMediaElementType(MediaElementType type) { m_mediaElementType = type; } MediaElementType mediaElementType() { return m_mediaElementType; } + void enterFullscreenMode(); #endif void setFrameView(FrameView* frameView) { m_frameView = frameView; } diff --git a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h index b4490bc..fa92e06 100644 --- a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h +++ b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h @@ -113,7 +113,9 @@ public: virtual void enterFullscreen() { } virtual void exitFullscreen() { } #endif - +#if PLATFORM(ANDROID) + virtual void enterFullscreenMode() { } +#endif #if USE(ACCELERATED_COMPOSITING) // whether accelerated rendering is supported by the media engine for the current media. virtual bool supportsAcceleratedRendering() const { return false; } diff --git a/Source/WebCore/platform/graphics/android/layers/MediaPlayerPrivateAndroid.h b/Source/WebCore/platform/graphics/android/layers/MediaPlayerPrivateAndroid.h index 17fd4d8..3b4f630 100644 --- a/Source/WebCore/platform/graphics/android/layers/MediaPlayerPrivateAndroid.h +++ b/Source/WebCore/platform/graphics/android/layers/MediaPlayerPrivateAndroid.h @@ -104,8 +104,8 @@ public: { return m_videoLayer; } - void onStopFullscreen(); - + void onStopFullscreen(bool stillPlaying); + virtual void enterFullscreenMode() { } protected: // Android-specific methods and fields. static MediaPlayerPrivateInterface* create(MediaPlayer* player); diff --git a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp index e00b77b..9094732 100644 --- a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp +++ b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp @@ -584,16 +584,23 @@ void ChromeClientAndroid::enterFullscreenForNode(Node* node) return; HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(node); - String url = videoElement->currentSrc(); - LayerAndroid* layer = videoElement->platformLayer(); - if (!layer) - return; FrameView* frameView = m_webFrame->page()->mainFrame()->view(); android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView); - m_webFrame->page()->mainFrame()->document()->webkitWillEnterFullScreenForElement(videoElement); if (core) - core->enterFullscreenForVideoLayer(layer->uniqueId(), url); + core->enterFullscreenForVideoLayer(); + + MediaPlayer* player = videoElement->player(); + if (player) { + // We need to use the same document object as the + // MediaPlayerPrivateAndroid::onStopFullscreen(). + Document* doc = player->mediaPlayerClient()->mediaPlayerOwningDocument(); + if (doc) + doc->webkitWillEnterFullScreenForElement(videoElement); + // Now the player is responsible to trigger to the java side for + // entering full screen mode. + player->enterFullscreenMode(); + } } void ChromeClientAndroid::exitFullscreenForNode(Node* node) diff --git a/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp b/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp index 1607b0e..c01d916 100644 --- a/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp +++ b/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp @@ -30,6 +30,7 @@ #include "BaseLayerAndroid.h" #include "GraphicsContext.h" +#include "HTMLMediaElement.h" #include "SkiaUtils.h" #include "TilesManager.h" #include "VideoLayerAndroid.h" @@ -55,6 +56,7 @@ static const char* g_ProxyJavaClassAudio = "android/webkit/HTML5Audio"; struct MediaPlayerPrivate::JavaGlue { jobject m_javaProxy; jmethodID m_play; + jmethodID m_enterFullscreenForVideoLayer; jmethodID m_teardown; jmethodID m_seek; jmethodID m_pause; @@ -191,11 +193,19 @@ void MediaPlayerPrivate::onTimeupdate(int position) m_player->timeChanged(); } -void MediaPlayerPrivate::onStopFullscreen() +void MediaPlayerPrivate::onStopFullscreen(bool stillPlaying) { - if (m_player && m_player->mediaPlayerClient() - && m_player->mediaPlayerClient()->mediaPlayerOwningDocument()) { - m_player->mediaPlayerClient()->mediaPlayerOwningDocument()->webkitCancelFullScreen(); + if (m_player && m_player->mediaPlayerClient()) { + Document* doc = m_player->mediaPlayerClient()->mediaPlayerOwningDocument(); + if (doc) { + HTMLMediaElement* element = + static_cast<HTMLMediaElement*>(doc->webkitCurrentFullScreenElement()); + element->exitFullscreen(); + doc->webkitDidExitFullScreenForElement(element); + + if (stillPlaying) + element->play(true); + } } } @@ -234,6 +244,22 @@ public: checkException(env); } + + void enterFullscreenMode() + { + JNIEnv* env = JSC::Bindings::getJNIEnv(); + if (!env || !m_url.length() || !m_glue->m_javaProxy) + return; + + jstring jUrl = wtfStringToJstring(env, m_url); + env->CallVoidMethod(m_glue->m_javaProxy, + m_glue->m_enterFullscreenForVideoLayer, jUrl, + m_videoLayer->uniqueId()); + env->DeleteLocalRef(jUrl); + + checkException(env); + } + bool canLoadPoster() const { return true; } void setPoster(const String& url) { @@ -319,9 +345,13 @@ public: return; m_glue = new JavaGlue; - m_glue->m_getInstance = env->GetStaticMethodID(clazz, "getInstance", "(Landroid/webkit/WebViewCore;I)Landroid/webkit/HTML5VideoViewProxy;"); + m_glue->m_getInstance = + env->GetStaticMethodID(clazz, "getInstance", + "(Landroid/webkit/WebViewCore;I)Landroid/webkit/HTML5VideoViewProxy;"); m_glue->m_loadPoster = env->GetMethodID(clazz, "loadPoster", "(Ljava/lang/String;)V"); m_glue->m_play = env->GetMethodID(clazz, "play", "(Ljava/lang/String;II)V"); + m_glue->m_enterFullscreenForVideoLayer = + env->GetMethodID(clazz, "enterFullscreenForVideoLayer", "(Ljava/lang/String;I)V"); m_glue->m_teardown = env->GetMethodID(clazz, "teardown", "()V"); m_glue->m_seek = env->GetMethodID(clazz, "seek", "(I)V"); @@ -628,12 +658,12 @@ static bool SendSurfaceTexture(JNIEnv* env, jobject obj, jobject surfTex, return true; } -static void OnStopFullscreen(JNIEnv* env, jobject obj, int pointer) +static void OnStopFullscreen(JNIEnv* env, jobject obj, int stillPlaying, int pointer) { if (pointer) { WebCore::MediaPlayerPrivate* player = reinterpret_cast<WebCore::MediaPlayerPrivate*>(pointer); - player->onStopFullscreen(); + player->onStopFullscreen(stillPlaying); } } @@ -645,7 +675,7 @@ static JNINativeMethod g_MediaPlayerMethods[] = { (void*) OnPrepared }, { "nativeOnEnded", "(I)V", (void*) OnEnded }, - { "nativeOnStopFullscreen", "(I)V", + { "nativeOnStopFullscreen", "(II)V", (void*) OnStopFullscreen }, { "nativeOnPaused", "(I)V", (void*) OnPaused }, diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index 41f706f..88e3635 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -367,7 +367,6 @@ struct WebViewCore::JavaGlue { jmethodID m_showRect; jmethodID m_centerFitRect; jmethodID m_setScrollbarModes; - jmethodID m_enterFullscreenForVideoLayer; jmethodID m_exitFullscreenVideo; jmethodID m_setWebTextViewAutoFillable; jmethodID m_selectAt; @@ -498,7 +497,6 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m m_javaGlue->m_centerFitRect = GetJMethod(env, clazz, "centerFitRect", "(IIII)V"); m_javaGlue->m_setScrollbarModes = GetJMethod(env, clazz, "setScrollbarModes", "(II)V"); #if ENABLE(VIDEO) - m_javaGlue->m_enterFullscreenForVideoLayer = GetJMethod(env, clazz, "enterFullscreenForVideoLayer", "(ILjava/lang/String;)V"); m_javaGlue->m_exitFullscreenVideo = GetJMethod(env, clazz, "exitFullscreenVideo", "()V"); #endif m_javaGlue->m_setWebTextViewAutoFillable = GetJMethod(env, clazz, "setWebTextViewAutoFillable", "(ILjava/lang/String;)V"); @@ -4097,16 +4095,10 @@ void WebViewCore::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode } #if ENABLE(VIDEO) -void WebViewCore::enterFullscreenForVideoLayer(int layerId, const WTF::String& url) +void WebViewCore::enterFullscreenForVideoLayer() { - JNIEnv* env = JSC::Bindings::getJNIEnv(); - AutoJObject javaObject = m_javaGlue->object(env); - if (!javaObject.get()) - return; - jstring jUrlStr = wtfStringToJstring(env, url); - env->CallVoidMethod(javaObject.get(), m_javaGlue->m_enterFullscreenForVideoLayer, layerId, jUrlStr); + // Just need to update the video mode, to avoid multiple exit full screen. m_fullscreenVideoMode = true; - checkException(env); } void WebViewCore::exitFullscreenVideo() diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h index dc58023..6e3604d 100644 --- a/Source/WebKit/android/jni/WebViewCore.h +++ b/Source/WebKit/android/jni/WebViewCore.h @@ -532,7 +532,7 @@ namespace android { void updateMatchCount() const; #if ENABLE(VIDEO) - void enterFullscreenForVideoLayer(int layerId, const WTF::String& url); + void enterFullscreenForVideoLayer(); void exitFullscreenVideo(); #endif |