From 42f3737720c40e3b3c06545690786e89ec926424 Mon Sep 17 00:00:00 2001 From: "commit-queue@webkit.org" Date: Mon, 17 Jan 2011 16:00:31 +0000 Subject: [PATCH] 2011-01-17 Yi Shen Reviewed by Andreas Kling. [Qt] Extend the Platform Plugin to support full screen video handler https://bugs.webkit.org/show_bug.cgi?id=51249 Make MediaPlayerPrivateQt support a fullscreen player. No new tests because LayoutTests/media/media-fullscreen-inline.html already exists. However, this test failed for Qt (QtMediaPlayer) due to durationchange event getting fired twice. So, still skip it for Qt. * WebCore.pro: * features.pri: * platform/graphics/qt/MediaPlayerPrivateQt.cpp: (WebCore::MediaPlayerPrivateQt::MediaPlayerPrivateQt): (WebCore::MediaPlayerPrivateQt::removeVideoItem): (WebCore::MediaPlayerPrivateQt::restoreVideoItem): * platform/graphics/qt/MediaPlayerPrivateQt.h: (WebCore::MediaPlayerPrivateQt::supportsFullscreen): (WebCore::MediaPlayerPrivateQt::mediaPlayer): 2011-01-17 Yi Shen Reviewed by Andreas Kling. [Qt] Extend the Platform Plugin to support full screen video handler https://bugs.webkit.org/show_bug.cgi?id=51249 Add a new webkit platform plugin interface to support full screen video handler. * Api/qwebkitplatformplugin.h: (QWebFullScreenVideoHandler::QWebFullScreenVideoHandler): (QWebFullScreenVideoHandler::~QWebFullScreenVideoHandler): * WebCoreSupport/ChromeClientQt.cpp: (WebCore::ChromeClientQt::ChromeClientQt): (WebCore::ChromeClientQt::~ChromeClientQt): (WebCore::ChromeClientQt::fullScreenVideo): (WebCore::ChromeClientQt::supportsFullscreenForNode): (WebCore::ChromeClientQt::requiresFullscreenForVideoPlayback): (WebCore::ChromeClientQt::enterFullscreenForNode): (WebCore::ChromeClientQt::exitFullscreenForNode): * WebCoreSupport/ChromeClientQt.h: * WebCoreSupport/FullScreenVideoQt.cpp: Added. (WebCore::FullScreenVideoQt::FullScreenVideoQt): (WebCore::FullScreenVideoQt::~FullScreenVideoQt): (WebCore::FullScreenVideoQt::enterFullScreenForNode): (WebCore::FullScreenVideoQt::exitFullScreenForNode): (WebCore::FullScreenVideoQt::aboutToClose): (WebCore::FullScreenVideoQt::mediaPlayer): (WebCore::FullScreenVideoQt::mediaPlayerForNode): (WebCore::FullScreenVideoQt::requiresFullScreenForVideoPlayback): * WebCoreSupport/FullScreenVideoQt.h: Added. (WebCore::FullScreenVideoQt::isValid): * WebCoreSupport/QtPlatformPlugin.cpp: (WebCore::QtPlatformPlugin::createFullScreenVideoHandler): * WebCoreSupport/QtPlatformPlugin.h: * examples/platformplugin/WebPlugin.cpp: (FullScreenVideoWidget::FullScreenVideoWidget): (FullScreenVideoWidget::event): (FullScreenVideoWidget::keyPressEvent): (FullScreenVideoHandler::FullScreenVideoHandler): (FullScreenVideoHandler::~FullScreenVideoHandler): (FullScreenVideoHandler::requiresFullScreenForVideoPlayback): (FullScreenVideoHandler::enterFullScreen): (FullScreenVideoHandler::exitFullScreen): (WebPlugin::supportsExtension): (WebPlugin::createExtension): * examples/platformplugin/WebPlugin.h: (FullScreenVideoWidget::~FullScreenVideoWidget): * examples/platformplugin/platformplugin.pro: * examples/platformplugin/qwebkitplatformplugin.h: (QWebFullScreenVideoHandler::QWebFullScreenVideoHandler): (QWebFullScreenVideoHandler::~QWebFullScreenVideoHandler): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@75944 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WebCore/ChangeLog | 23 +++++ Source/WebCore/WebCore.pro | 9 +- Source/WebCore/features.pri | 4 + .../platform/graphics/qt/MediaPlayerPrivateQt.cpp | 18 +++- .../platform/graphics/qt/MediaPlayerPrivateQt.h | 8 +- Source/WebKit/qt/Api/qwebkitplatformplugin.h | 25 ++++- Source/WebKit/qt/ChangeLog | 53 +++++++++++ Source/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp | 63 +++++++++++++ Source/WebKit/qt/WebCoreSupport/ChromeClientQt.h | 15 +++ .../WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp | 104 +++++++++++++++++++++ .../WebKit/qt/WebCoreSupport/FullScreenVideoQt.h | 64 +++++++++++++ .../WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp | 8 ++ Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.h | 6 ++ .../qt/examples/platformplugin/WebPlugin.cpp | 75 +++++++++++++++ .../WebKit/qt/examples/platformplugin/WebPlugin.h | 37 ++++++++ .../qt/examples/platformplugin/platformplugin.pro | 16 ++++ .../platformplugin/qwebkitplatformplugin.h | 25 ++++- 17 files changed, 545 insertions(+), 8 deletions(-) create mode 100644 Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp create mode 100644 Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.h diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 89ee8c0..bffb3d7 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,26 @@ +2011-01-17 Yi Shen + + Reviewed by Andreas Kling. + + [Qt] Extend the Platform Plugin to support full screen video handler + https://bugs.webkit.org/show_bug.cgi?id=51249 + + Make MediaPlayerPrivateQt support a fullscreen player. + + No new tests because LayoutTests/media/media-fullscreen-inline.html already exists. + However, this test failed for Qt (QtMediaPlayer) due to durationchange event getting fired twice. + So, still skip it for Qt. + + * WebCore.pro: + * features.pri: + * platform/graphics/qt/MediaPlayerPrivateQt.cpp: + (WebCore::MediaPlayerPrivateQt::MediaPlayerPrivateQt): + (WebCore::MediaPlayerPrivateQt::removeVideoItem): + (WebCore::MediaPlayerPrivateQt::restoreVideoItem): + * platform/graphics/qt/MediaPlayerPrivateQt.h: + (WebCore::MediaPlayerPrivateQt::supportsFullscreen): + (WebCore::MediaPlayerPrivateQt::mediaPlayer): + 2011-01-17 Anthony Ricaud Reviewed by Kent Tamura. diff --git a/Source/WebCore/WebCore.pro b/Source/WebCore/WebCore.pro index 7af008c..b37bf45 100644 --- a/Source/WebCore/WebCore.pro +++ b/Source/WebCore/WebCore.pro @@ -3257,8 +3257,13 @@ contains(DEFINES, ENABLE_VIDEO=1) { PKGCONFIG += glib-2.0 gio-2.0 gstreamer-0.10 gstreamer-app-0.10 gstreamer-base-0.10 gstreamer-interfaces-0.10 gstreamer-pbutils-0.10 gstreamer-plugins-base-0.10 gstreamer-video-0.10 } else:contains(MOBILITY_CONFIG, multimedia) { - HEADERS += platform/graphics/qt/MediaPlayerPrivateQt.h - SOURCES += platform/graphics/qt/MediaPlayerPrivateQt.cpp + HEADERS += \ + platform/graphics/qt/MediaPlayerPrivateQt.h \ + $$PWD/../../WebKit/qt/WebCoreSupport/FullScreenVideoQt.h + + SOURCES += \ + platform/graphics/qt/MediaPlayerPrivateQt.cpp \ + $$PWD/../../WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp CONFIG *= mobility MOBILITY += multimedia diff --git a/Source/WebCore/features.pri b/Source/WebCore/features.pri index ff54b14..fdf11ed 100644 --- a/Source/WebCore/features.pri +++ b/Source/WebCore/features.pri @@ -152,9 +152,13 @@ contains(MOBILITY_CONFIG, sensors) { contains(MOBILITY_CONFIG, multimedia) { DEFINES -= ENABLE_VIDEO=0 DEFINES += ENABLE_VIDEO=1 + DEFINES -= ENABLE_QT_MULTIMEDIA=0 + DEFINES += ENABLE_QT_MULTIMEDIA=1 } else:contains(QT_CONFIG, phonon) { DEFINES -= ENABLE_VIDEO=0 DEFINES += ENABLE_VIDEO=1 + DEFINES -= ENABLE_QT_MULTIMEDIA=1 + DEFINES += ENABLE_QT_MULTIMEDIA=0 } } diff --git a/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.cpp b/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.cpp index dd4b6e6..be6f732 100644 --- a/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.cpp +++ b/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.cpp @@ -108,7 +108,7 @@ MediaPlayerPrivateQt::MediaPlayerPrivateQt(MediaPlayer* player) , m_queuedSeek(-1) , m_preload(MediaPlayer::Auto) { - m_mediaPlayer->bind(m_videoItem); + m_mediaPlayer->setVideoOutput(m_videoItem); m_videoScene->addItem(m_videoItem); // Signal Handlers @@ -587,6 +587,22 @@ IntSize MediaPlayerPrivateQt::naturalSize() const return m_naturalSize; } +void MediaPlayerPrivateQt::removeVideoItem() +{ + m_oldNaturalSize = m_naturalSize; + m_mediaPlayer->setVideoOutput(static_cast(0)); + m_videoScene->removeItem(m_videoItem); +} + +void MediaPlayerPrivateQt::restoreVideoItem() +{ + m_mediaPlayer->setVideoOutput(m_videoItem); + m_videoScene->addItem(m_videoItem); + // FIXME: a qtmobility bug, need to reset the size when restore the videoitem, otherwise the size is 0 + // http://bugreports.qt.nokia.com/browse/QTMOBILITY-971 + nativeSizeChanged(QSize(m_oldNaturalSize)); +} + void MediaPlayerPrivateQt::paint(GraphicsContext* context, const IntRect& rect) { #if USE(ACCELERATED_COMPOSITING) diff --git a/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.h b/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.h index 93c9d1c..2621432 100644 --- a/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.h +++ b/Source/WebCore/platform/graphics/qt/MediaPlayerPrivateQt.h @@ -90,7 +90,7 @@ public: void paint(GraphicsContext*, const IntRect&); - bool supportsFullscreen() const { return false; } + bool supportsFullscreen() const { return true; } #if USE(ACCELERATED_COMPOSITING) #if USE(TEXTURE_MAPPER) @@ -108,6 +108,11 @@ public: #endif virtual PlatformMedia platformMedia() const; + + QMediaPlayer* mediaPlayer() const { return m_mediaPlayer; } + void removeVideoItem(); + void restoreVideoItem(); + private slots: void mediaStatusChanged(QMediaPlayer::MediaStatus); void handleError(QMediaPlayer::Error); @@ -142,6 +147,7 @@ private: IntSize m_currentSize; IntSize m_naturalSize; + IntSize m_oldNaturalSize; bool m_isVisible; bool m_isSeeking; bool m_composited; diff --git a/Source/WebKit/qt/Api/qwebkitplatformplugin.h b/Source/WebKit/qt/Api/qwebkitplatformplugin.h index b8cc984..2a94e0c 100644 --- a/Source/WebKit/qt/Api/qwebkitplatformplugin.h +++ b/Source/WebKit/qt/Api/qwebkitplatformplugin.h @@ -28,6 +28,9 @@ #include #include +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +#include +#endif class QWebSelectData { @@ -115,6 +118,23 @@ public: virtual unsigned hitTestPaddingForTouch(const PaddingDirection) const = 0; }; +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +class QWebFullScreenVideoHandler : public QObject { + Q_OBJECT +public: + QWebFullScreenVideoHandler() {} + virtual ~QWebFullScreenVideoHandler() {} + virtual bool requiresFullScreenForVideoPlayback() const = 0; + +Q_SIGNALS: + void fullScreenClosed(); + +public Q_SLOTS: + virtual void enterFullScreen(QMediaPlayer*) = 0; + virtual void exitFullScreen() = 0; +}; +#endif + class QWebKitPlatformPlugin { public: @@ -124,7 +144,8 @@ public: MultipleSelections, Notifications, Haptics, - TouchInteraction + TouchInteraction, + FullScreenVideoPlayer }; virtual bool supportsExtension(Extension extension) const = 0; @@ -132,7 +153,7 @@ public: }; QT_BEGIN_NAMESPACE -Q_DECLARE_INTERFACE(QWebKitPlatformPlugin, "com.nokia.Qt.WebKit.PlatformPlugin/1.6"); +Q_DECLARE_INTERFACE(QWebKitPlatformPlugin, "com.nokia.Qt.WebKit.PlatformPlugin/1.7"); QT_END_NAMESPACE #endif // QWEBKITPLATFORMPLUGIN_H diff --git a/Source/WebKit/qt/ChangeLog b/Source/WebKit/qt/ChangeLog index 26394ec..7ccb0d4 100644 --- a/Source/WebKit/qt/ChangeLog +++ b/Source/WebKit/qt/ChangeLog @@ -1,3 +1,56 @@ +2011-01-17 Yi Shen + + Reviewed by Andreas Kling. + + [Qt] Extend the Platform Plugin to support full screen video handler + https://bugs.webkit.org/show_bug.cgi?id=51249 + + Add a new webkit platform plugin interface to support full screen video handler. + + * Api/qwebkitplatformplugin.h: + (QWebFullScreenVideoHandler::QWebFullScreenVideoHandler): + (QWebFullScreenVideoHandler::~QWebFullScreenVideoHandler): + * WebCoreSupport/ChromeClientQt.cpp: + (WebCore::ChromeClientQt::ChromeClientQt): + (WebCore::ChromeClientQt::~ChromeClientQt): + (WebCore::ChromeClientQt::fullScreenVideo): + (WebCore::ChromeClientQt::supportsFullscreenForNode): + (WebCore::ChromeClientQt::requiresFullscreenForVideoPlayback): + (WebCore::ChromeClientQt::enterFullscreenForNode): + (WebCore::ChromeClientQt::exitFullscreenForNode): + * WebCoreSupport/ChromeClientQt.h: + * WebCoreSupport/FullScreenVideoQt.cpp: Added. + (WebCore::FullScreenVideoQt::FullScreenVideoQt): + (WebCore::FullScreenVideoQt::~FullScreenVideoQt): + (WebCore::FullScreenVideoQt::enterFullScreenForNode): + (WebCore::FullScreenVideoQt::exitFullScreenForNode): + (WebCore::FullScreenVideoQt::aboutToClose): + (WebCore::FullScreenVideoQt::mediaPlayer): + (WebCore::FullScreenVideoQt::mediaPlayerForNode): + (WebCore::FullScreenVideoQt::requiresFullScreenForVideoPlayback): + * WebCoreSupport/FullScreenVideoQt.h: Added. + (WebCore::FullScreenVideoQt::isValid): + * WebCoreSupport/QtPlatformPlugin.cpp: + (WebCore::QtPlatformPlugin::createFullScreenVideoHandler): + * WebCoreSupport/QtPlatformPlugin.h: + * examples/platformplugin/WebPlugin.cpp: + (FullScreenVideoWidget::FullScreenVideoWidget): + (FullScreenVideoWidget::event): + (FullScreenVideoWidget::keyPressEvent): + (FullScreenVideoHandler::FullScreenVideoHandler): + (FullScreenVideoHandler::~FullScreenVideoHandler): + (FullScreenVideoHandler::requiresFullScreenForVideoPlayback): + (FullScreenVideoHandler::enterFullScreen): + (FullScreenVideoHandler::exitFullScreen): + (WebPlugin::supportsExtension): + (WebPlugin::createExtension): + * examples/platformplugin/WebPlugin.h: + (FullScreenVideoWidget::~FullScreenVideoWidget): + * examples/platformplugin/platformplugin.pro: + * examples/platformplugin/qwebkitplatformplugin.h: + (QWebFullScreenVideoHandler::QWebFullScreenVideoHandler): + (QWebFullScreenVideoHandler::~QWebFullScreenVideoHandler): + 2011-01-16 Adam Barth Rubber-stamped by Eric Seidel. diff --git a/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp b/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp index 6116ae7..acb136a 100644 --- a/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp +++ b/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp @@ -76,6 +76,14 @@ #include #include +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) +#include "FullScreenVideoQt.h" +#include "HTMLMediaElement.h" +#include "HTMLNames.h" +#include "HTMLVideoElement.h" +#include "MediaPlayerPrivateQt.h" +#endif + namespace WebCore { bool ChromeClientQt::dumpVisitedLinksCallbacks = false; @@ -83,6 +91,9 @@ bool ChromeClientQt::dumpVisitedLinksCallbacks = false; ChromeClientQt::ChromeClientQt(QWebPage* webPage) : m_webPage(webPage) , m_eventLoop(0) +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + , m_fullScreenVideo(0) +#endif { toolBarsVisible = statusBarVisible = menuBarVisible = true; } @@ -91,6 +102,10 @@ ChromeClientQt::~ChromeClientQt() { if (m_eventLoop) m_eventLoop->exit(); + +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + delete m_fullScreenVideo; +#endif } void ChromeClientQt::setWindowRect(const FloatRect& rect) @@ -648,6 +663,54 @@ IntRect ChromeClientQt::visibleRectForTiledBackingStore() const } #endif +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) +FullScreenVideoQt* ChromeClientQt::fullScreenVideo() +{ + if (!m_fullScreenVideo) + m_fullScreenVideo = new FullScreenVideoQt(this); + return m_fullScreenVideo; +} + +bool ChromeClientQt::supportsFullscreenForNode(const Node* node) +{ + ASSERT(node); + return node->hasTagName(HTMLNames::videoTag) && fullScreenVideo()->isValid(); +} + +bool ChromeClientQt::requiresFullscreenForVideoPlayback() +{ + return fullScreenVideo()->requiresFullScreenForVideoPlayback(); +} + +void ChromeClientQt::enterFullscreenForNode(Node* node) +{ + ASSERT(node && node->hasTagName(HTMLNames::videoTag)); + + HTMLVideoElement* videoElement = static_cast(node); + PlatformMedia platformMedia = videoElement->platformMedia(); + + ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType); + if (platformMedia.type != PlatformMedia::QtMediaPlayerType) + return; + + fullScreenVideo()->enterFullScreenForNode(node); +} + +void ChromeClientQt::exitFullscreenForNode(Node* node) +{ + ASSERT(node && node->hasTagName(HTMLNames::videoTag)); + + HTMLVideoElement* videoElement = static_cast(node); + PlatformMedia platformMedia = videoElement->platformMedia(); + + ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType); + if (platformMedia.type != PlatformMedia::QtMediaPlayerType) + return; + + fullScreenVideo()->exitFullScreenForNode(node); +} +#endif + QWebSelectMethod* ChromeClientQt::createSelectPopup() const { QWebSelectMethod* result = m_platformPlugin.createSelectInputMethod(); diff --git a/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.h b/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.h index bcf8975..d8c2f57 100644 --- a/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.h +++ b/Source/WebKit/qt/WebCoreSupport/ChromeClientQt.h @@ -50,6 +50,9 @@ namespace WebCore { struct FrameLoadRequest; class QtAbstractWebPopup; struct ViewportArguments; +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + class FullScreenVideoQt; +#endif class ChromeClientQt : public ChromeClient { @@ -162,6 +165,14 @@ namespace WebCore { #if ENABLE(TOUCH_EVENTS) virtual void needTouchEvents(bool) { } #endif + +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + virtual bool supportsFullscreenForNode(const Node*); + virtual void enterFullscreenForNode(Node*); + virtual void exitFullscreenForNode(Node*); + virtual bool requiresFullscreenForVideoPlayback(); + FullScreenVideoQt* fullScreenVideo(); +#endif virtual void runOpenPanel(Frame*, PassRefPtr); virtual void chooseIconForFiles(const Vector&, FileChooser*); @@ -196,6 +207,10 @@ namespace WebCore { bool menuBarVisible; QEventLoop* m_eventLoop; +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + FullScreenVideoQt* m_fullScreenVideo; +#endif + static bool dumpVisitedLinksCallbacks; mutable QtPlatformPlugin m_platformPlugin; diff --git a/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp b/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp new file mode 100644 index 0000000..bdc22e5 --- /dev/null +++ b/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "FullScreenVideoQt.h" + +#include "ChromeClientQt.h" +#include "HTMLNames.h" +#include "HTMLVideoElement.h" +#include "MediaPlayerPrivateQt.h" +#include "Node.h" +#include "qwebkitplatformplugin.h" + +#include + +namespace WebCore { + +FullScreenVideoQt::FullScreenVideoQt(ChromeClientQt* chromeClient) + : m_chromeClient(chromeClient) + , m_videoElement(0) +{ + Q_ASSERT(m_chromeClient); + m_FullScreenVideoHandler = m_chromeClient->m_platformPlugin.createFullScreenVideoHandler(); + + if (m_FullScreenVideoHandler) + connect(m_FullScreenVideoHandler, SIGNAL(fullScreenClosed()), this, SLOT(aboutToClose())); +} + +FullScreenVideoQt::~FullScreenVideoQt() +{ + delete m_FullScreenVideoHandler; +} + +void FullScreenVideoQt::enterFullScreenForNode(Node* node) +{ + Q_ASSERT(node); + Q_ASSERT(m_FullScreenVideoHandler); + + if (!m_FullScreenVideoHandler) + return; + + MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayerForNode(node); + mediaPlayerQt->removeVideoItem(); + m_FullScreenVideoHandler->enterFullScreen(mediaPlayerQt->mediaPlayer()); +} + +void FullScreenVideoQt::exitFullScreenForNode(Node* node) +{ + Q_ASSERT(node); + Q_ASSERT(m_FullScreenVideoHandler); + + if (!m_FullScreenVideoHandler) + return; + + m_FullScreenVideoHandler->exitFullScreen(); + MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayerForNode(node); + mediaPlayerQt->restoreVideoItem(); +} + +void FullScreenVideoQt::aboutToClose() +{ + Q_ASSERT(m_videoElement); + m_videoElement->exitFullscreen(); +} + +MediaPlayerPrivateQt* FullScreenVideoQt::mediaPlayer() +{ + Q_ASSERT(m_videoElement); + PlatformMedia platformMedia = m_videoElement->platformMedia(); + return static_cast(platformMedia.media.qtMediaPlayer); +} + +MediaPlayerPrivateQt* FullScreenVideoQt::mediaPlayerForNode(Node* node) +{ + Q_ASSERT(node); + if (node) + m_videoElement = static_cast(node); + return mediaPlayer(); +} + +bool FullScreenVideoQt::requiresFullScreenForVideoPlayback() +{ + return m_FullScreenVideoHandler ? m_FullScreenVideoHandler->requiresFullScreenForVideoPlayback() : false; +} + +} + diff --git a/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.h b/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.h new file mode 100644 index 0000000..637da70 --- /dev/null +++ b/Source/WebKit/qt/WebCoreSupport/FullScreenVideoQt.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef FullScreenVideoQt_h +#define FullScreenVideoQt_h + +#include + +QT_BEGIN_NAMESPACE +class QGraphicsVideoItem; +QT_END_NAMESPACE + +class QWebFullScreenVideoHandler; + +namespace WebCore { + +class ChromeClientQt; +class HTMLVideoElement; +class Node; +class MediaPlayerPrivateQt; + +class FullScreenVideoQt : public QObject { + Q_OBJECT +public: + FullScreenVideoQt(ChromeClientQt*); + ~FullScreenVideoQt(); + + virtual void enterFullScreenForNode(Node*); + virtual void exitFullScreenForNode(Node*); + bool requiresFullScreenForVideoPlayback(); + bool isValid() const { return m_FullScreenVideoHandler; } + +private: + MediaPlayerPrivateQt* mediaPlayer(); + MediaPlayerPrivateQt* mediaPlayerForNode(Node* = 0); + +private slots: + void aboutToClose(); + +private: + ChromeClientQt* m_chromeClient; + HTMLVideoElement* m_videoElement; + QWebFullScreenVideoHandler* m_FullScreenVideoHandler; +}; + +} + +#endif // PopupMenuQt_h diff --git a/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp b/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp index e4b89b4..ea56134 100644 --- a/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp +++ b/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.cpp @@ -127,4 +127,12 @@ QWebTouchModifier* QtPlatformPlugin::createTouchModifier() return p ? static_cast(p->createExtension(QWebKitPlatformPlugin::TouchInteraction)) : 0; } +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) +QWebFullScreenVideoHandler* QtPlatformPlugin::createFullScreenVideoHandler() +{ + QWebKitPlatformPlugin* p = plugin(); + return p ? static_cast(p->createExtension(QWebKitPlatformPlugin::FullScreenVideoPlayer)) : 0; +} +#endif + } diff --git a/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.h b/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.h index 365b734..71ee2bb 100644 --- a/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.h +++ b/Source/WebKit/qt/WebCoreSupport/QtPlatformPlugin.h @@ -29,6 +29,9 @@ class QWebNotificationPresenter; class QWebHapticFeedbackPlayer; class QWebSelectData; class QWebTouchModifier; +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) +class QWebFullScreenVideoHandler; +#endif namespace WebCore { @@ -41,6 +44,9 @@ public: QWebNotificationPresenter* createNotificationPresenter(); QWebHapticFeedbackPlayer* createHapticFeedbackPlayer(); QWebTouchModifier* createTouchModifier(); +#if ENABLE(VIDEO) && ENABLE(QT_MULTIMEDIA) + QWebFullScreenVideoHandler* createFullScreenVideoHandler(); +#endif QWebKitPlatformPlugin* plugin(); diff --git a/Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp b/Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp index d029b73..320079f 100644 --- a/Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp +++ b/Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp @@ -19,7 +19,9 @@ */ #include "WebPlugin.h" +#include #include +#include #include #include #include @@ -208,6 +210,71 @@ MultipleSelectionPopup::MultipleSelectionPopup(const QWebSelectData& data) resize(size().width(), visibleItemCount * gMaemoListItemSize); } +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +FullScreenVideoWidget::FullScreenVideoWidget(QMediaPlayer* player) + : QVideoWidget() + , m_mediaPlayer(player) +{ + Q_ASSERT(m_mediaPlayer); + + setFullScreen(true); + m_mediaPlayer->setVideoOutput(this); +} + +bool FullScreenVideoWidget::event(QEvent* ev) +{ + if (ev->type() == QEvent::MouseButtonDblClick) { + emit fullScreenClosed(); + ev->accept(); + return true; + } + return QWidget::event(ev); +} + +void FullScreenVideoWidget::keyPressEvent(QKeyEvent* ev) +{ + if (ev->key() == Qt::Key_Space) { + if (m_mediaPlayer->state() == QMediaPlayer::PlayingState) + m_mediaPlayer->pause(); + else + m_mediaPlayer->play(); + ev->accept(); + return; + } +} + +FullScreenVideoHandler::FullScreenVideoHandler() + : m_mediaWidget(0) +{ +} + +FullScreenVideoHandler::~FullScreenVideoHandler() +{ + delete m_mediaWidget; +} + +bool FullScreenVideoHandler::requiresFullScreenForVideoPlayback() const +{ + return true; +} + +void FullScreenVideoHandler::enterFullScreen(QMediaPlayer* player) +{ + Q_ASSERT(player); + + m_mediaWidget = new FullScreenVideoWidget(player); + connect(m_mediaWidget, SIGNAL(fullScreenClosed()), this, SIGNAL(fullScreenClosed())); + m_mediaWidget->showFullScreen(); +} + +void FullScreenVideoHandler::exitFullScreen() +{ + m_mediaWidget->hide(); + delete m_mediaWidget; + m_mediaWidget = 0; +} +#endif + bool WebPlugin::supportsExtension(Extension extension) const { switch (extension) { @@ -219,6 +286,10 @@ bool WebPlugin::supportsExtension(Extension extension) const #endif case TouchInteraction: return true; +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA + case FullScreenVideoPlayer: + return true; +#endif default: return false; } @@ -235,6 +306,10 @@ QObject* WebPlugin::createExtension(Extension extension) const #endif case TouchInteraction: return new TouchModifier(); +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA + case FullScreenVideoPlayer: + return new FullScreenVideoHandler(); +#endif default: return 0; } diff --git a/Source/WebKit/qt/examples/platformplugin/WebPlugin.h b/Source/WebKit/qt/examples/platformplugin/WebPlugin.h index 0243f57..4994669 100644 --- a/Source/WebKit/qt/examples/platformplugin/WebPlugin.h +++ b/Source/WebKit/qt/examples/platformplugin/WebPlugin.h @@ -24,6 +24,9 @@ #include "WebNotificationPresenter.h" #include +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +#include +#endif class QListWidgetItem; class QListWidget; @@ -94,6 +97,40 @@ public: } }; +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +class FullScreenVideoWidget : public QVideoWidget { + Q_OBJECT +public: + FullScreenVideoWidget(QMediaPlayer*); + virtual ~FullScreenVideoWidget() {} + +Q_SIGNALS: + void fullScreenClosed(); + +protected: + bool event(QEvent*); + void keyPressEvent(QKeyEvent*); + +private: + QMediaPlayer* m_mediaPlayer; // not owned +}; + +class FullScreenVideoHandler : public QWebFullScreenVideoHandler { + Q_OBJECT +public: + FullScreenVideoHandler(); + virtual ~FullScreenVideoHandler(); + bool requiresFullScreenForVideoPlayback() const; + +public Q_SLOTS: + void enterFullScreen(QMediaPlayer*); + void exitFullScreen(); + +private: + FullScreenVideoWidget* m_mediaWidget; // owned +}; +#endif + class WebPlugin : public QObject, public QWebKitPlatformPlugin { Q_OBJECT diff --git a/Source/WebKit/qt/examples/platformplugin/platformplugin.pro b/Source/WebKit/qt/examples/platformplugin/platformplugin.pro index 9275665..ccc0b3a 100644 --- a/Source/WebKit/qt/examples/platformplugin/platformplugin.pro +++ b/Source/WebKit/qt/examples/platformplugin/platformplugin.pro @@ -3,6 +3,22 @@ TARGET = $$qtLibraryTarget(platformplugin) TEMPLATE = lib CONFIG += plugin +## load mobilityconfig if mobility is available +load(mobilityconfig, true) + +# HTML5 Media Support +# We require QtMultimedia +!contains(DEFINES, ENABLE_VIDEO=.) { + contains(MOBILITY_CONFIG, multimedia) { + CONFIG += mobility + MOBILITY += multimedia + DEFINES -= ENABLE_VIDEO=0 + DEFINES += ENABLE_VIDEO=1 + DEFINES -= ENABLE_QT_MULTIMEDIA=0 + DEFINES += ENABLE_QT_MULTIMEDIA=1 + } +} + DESTDIR = $$[QT_INSTALL_PLUGINS]/webkit SOURCES += \ diff --git a/Source/WebKit/qt/examples/platformplugin/qwebkitplatformplugin.h b/Source/WebKit/qt/examples/platformplugin/qwebkitplatformplugin.h index b8cc984..2a94e0c 100644 --- a/Source/WebKit/qt/examples/platformplugin/qwebkitplatformplugin.h +++ b/Source/WebKit/qt/examples/platformplugin/qwebkitplatformplugin.h @@ -28,6 +28,9 @@ #include #include +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +#include +#endif class QWebSelectData { @@ -115,6 +118,23 @@ public: virtual unsigned hitTestPaddingForTouch(const PaddingDirection) const = 0; }; +#if defined(ENABLE_QT_MULTIMEDIA) && ENABLE_QT_MULTIMEDIA +class QWebFullScreenVideoHandler : public QObject { + Q_OBJECT +public: + QWebFullScreenVideoHandler() {} + virtual ~QWebFullScreenVideoHandler() {} + virtual bool requiresFullScreenForVideoPlayback() const = 0; + +Q_SIGNALS: + void fullScreenClosed(); + +public Q_SLOTS: + virtual void enterFullScreen(QMediaPlayer*) = 0; + virtual void exitFullScreen() = 0; +}; +#endif + class QWebKitPlatformPlugin { public: @@ -124,7 +144,8 @@ public: MultipleSelections, Notifications, Haptics, - TouchInteraction + TouchInteraction, + FullScreenVideoPlayer }; virtual bool supportsExtension(Extension extension) const = 0; @@ -132,7 +153,7 @@ public: }; QT_BEGIN_NAMESPACE -Q_DECLARE_INTERFACE(QWebKitPlatformPlugin, "com.nokia.Qt.WebKit.PlatformPlugin/1.6"); +Q_DECLARE_INTERFACE(QWebKitPlatformPlugin, "com.nokia.Qt.WebKit.PlatformPlugin/1.7"); QT_END_NAMESPACE #endif // QWEBKITPLATFORMPLUGIN_H -- 1.8.3.1