summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLMediaElement.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-11-07 11:22:47 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-07 11:22:47 +0100
commitcfd86b747d32ac22246a1aa908eaa720c63a88c1 (patch)
tree24d68c6f61c464ecba1e05670b80390ea3b0e50c /Source/WebCore/html/HTMLMediaElement.cpp
parent69d7c744c9de19d152dbe2d8e46eb7dfd4511d1a (diff)
downloadqtwebkit-cfd86b747d32ac22246a1aa908eaa720c63a88c1.tar.gz
Imported WebKit commit 20271caf2e2c016d5cef40184cddeefeac4f1876 (http://svn.webkit.org/repository/webkit/trunk@133733)
New snapshot that contains all previous fixes as well as build fix for latest QtMultimedia API changes.
Diffstat (limited to 'Source/WebCore/html/HTMLMediaElement.cpp')
-rw-r--r--Source/WebCore/html/HTMLMediaElement.cpp154
1 files changed, 116 insertions, 38 deletions
diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp
index 753242110..b0655cdf7 100644
--- a/Source/WebCore/html/HTMLMediaElement.cpp
+++ b/Source/WebCore/html/HTMLMediaElement.cpp
@@ -69,6 +69,7 @@
#include "MIMETypeRegistry.h"
#include "NodeRenderingContext.h"
#include "Page.h"
+#include "PageGroup.h"
#include "RenderVideo.h"
#include "RenderView.h"
#include "ScriptController.h"
@@ -281,6 +282,14 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* docum
setHasCustomCallbacks();
addElementToDocumentMap(this, document);
+
+#if ENABLE(VIDEO_TRACK)
+ if (document->page()) {
+ PageGroup& group = document->page()->group();
+ if (group.userHasCaptionPreferences())
+ m_disableCaptions = !group.userPrefersCaptions();
+ }
+#endif
}
HTMLMediaElement::~HTMLMediaElement()
@@ -354,8 +363,10 @@ void HTMLMediaElement::parseAttribute(const Attribute& attribute)
{
if (attribute.name() == srcAttr) {
// Trigger a reload, as long as the 'src' attribute is present.
- if (fastHasAttribute(srcAttr))
+ if (fastHasAttribute(srcAttr)) {
+ clearMediaPlayer(MediaResource);
scheduleLoad(MediaResource);
+ }
} else if (attribute.name() == controlsAttr)
configureMediaControls();
#if PLATFORM(MAC)
@@ -541,6 +552,20 @@ void HTMLMediaElement::attach()
frame->loader()->client()->hideMediaPlayerProxyPlugin(m_proxyWidget.get());
}
#endif
+
+#if ENABLE(VIDEO_TRACK)
+ if (document()->page())
+ document()->page()->group().registerForCaptionPreferencesChangedCallbacks(this);
+#endif
+}
+
+void HTMLMediaElement::detach()
+{
+#if ENABLE(VIDEO_TRACK)
+ if (document()->page())
+ document()->page()->group().unregisterForCaptionPreferencesChangedCallbacks(this);
+#endif
+ HTMLElement::detach();
}
void HTMLMediaElement::didRecalcStyle(StyleChange)
@@ -893,8 +918,7 @@ static KURL createFileURLForApplicationCacheResource(const String& path)
// app cache media files are always created with encodeForFileName(createCanonicalUUIDString()).
#if USE(CF) && PLATFORM(WIN)
- RetainPtr<CFStringRef> cfPath(AdoptCF, path.createCFString());
- RetainPtr<CFURLRef> cfURL(AdoptCF, CFURLCreateWithFileSystemPath(0, cfPath.get(), kCFURLWindowsPathStyle, false));
+ RetainPtr<CFURLRef> cfURL(AdoptCF, CFURLCreateWithFileSystemPath(0, path.createCFString().get(), kCFURLWindowsPathStyle, false));
KURL url(cfURL.get());
#else
KURL url;
@@ -925,10 +949,9 @@ void HTMLMediaElement::loadResource(const KURL& initialURL, ContentType& content
}
#if ENABLE(MEDIA_SOURCE)
- if (url.protocolIs(mediaSourceBlobProtocol)) {
- if (m_mediaSource)
- m_mediaSource->setReadyState(MediaSource::closedKeyword());
+ ASSERT(!m_mediaSource);
+ if (url.protocolIs(mediaSourceBlobProtocol)) {
m_mediaSource = MediaSourceRegistry::registry().lookupMediaSource(url.string());
if (m_mediaSource) {
@@ -2396,6 +2419,8 @@ void HTMLMediaElement::setSourceState(const String& state)
return;
m_mediaSource->setReadyState(state);
+ if (state == MediaSource::closedKeyword())
+ m_mediaSource = 0;
}
#endif
@@ -2806,33 +2831,43 @@ void HTMLMediaElement::willRemoveTrack(HTMLTrackElement* trackElement)
// then the user agent must remove the track element's corresponding text track from the
// media element's list of text tracks.
m_textTracks->remove(textTrack.get());
+ if (textTrack->cues()) {
+ TextTrackCueList* cues = textTrack->cues();
+ beginIgnoringTrackDisplayUpdateRequests();
+ for (size_t i = 0; i < cues->length(); ++i)
+ textTrackRemoveCue(cues->item(i)->track(), cues->item(i));
+ endIgnoringTrackDisplayUpdateRequests();
+ }
+
size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack.get());
if (index != notFound)
m_textTracksWhenResourceSelectionBegan.remove(index);
}
-bool HTMLMediaElement::userIsInterestedInThisLanguage(const String&) const
+bool HTMLMediaElement::userPrefersCaptions() const
{
- // FIXME: check the user's language preference - bugs.webkit.org/show_bug.cgi?id=74121
- return true;
+ Page* page = document()->page();
+ if (!page)
+ return false;
+
+ PageGroup& group = page->group();
+ return group.userHasCaptionPreferences() && group.userPrefersCaptions();
}
bool HTMLMediaElement::userIsInterestedInThisTrackKind(String kind) const
{
- // If ... the user has indicated an interest in having a track with this text track kind, text track language, ...
if (m_disableCaptions)
return false;
Settings* settings = document()->settings();
- if (!settings)
- return false;
+ bool userPrefersCaptionsOrSubtitles = m_closedCaptionsVisible || userPrefersCaptions();
if (kind == TextTrack::subtitlesKeyword())
- return settings->shouldDisplaySubtitles() || m_closedCaptionsVisible;
+ return (settings && settings->shouldDisplaySubtitles()) || userPrefersCaptionsOrSubtitles;
if (kind == TextTrack::captionsKeyword())
- return settings->shouldDisplayCaptions() || m_closedCaptionsVisible;
+ return (settings && settings->shouldDisplayCaptions()) || userPrefersCaptionsOrSubtitles;
if (kind == TextTrack::descriptionsKeyword())
- return settings->shouldDisplayTextDescriptions() || m_closedCaptionsVisible;
+ return settings && settings->shouldDisplayTextDescriptions();
return false;
}
@@ -3644,13 +3679,7 @@ void HTMLMediaElement::userCancelledLoad()
// If the media data fetching process is aborted by the user:
// 1 - The user agent should cancel the fetching process.
-#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
- m_player.clear();
-#endif
- stopPeriodicTimers();
- m_loadTimer.stop();
- m_loadState = WaitingForSource;
- m_pendingLoadFlags = 0;
+ clearMediaPlayer(-1);
// 2 - Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORTED.
m_error = MediaError::create(MediaError::MEDIA_ERR_ABORTED);
@@ -3688,6 +3717,18 @@ void HTMLMediaElement::userCancelledLoad()
#endif
}
+void HTMLMediaElement::clearMediaPlayer(signed flags)
+{
+#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+ m_player.clear();
+#endif
+ stopPeriodicTimers();
+ m_loadTimer.stop();
+
+ m_pendingLoadFlags &= ~flags;
+ m_loadState = WaitingForSource;
+}
+
bool HTMLMediaElement::canSuspend() const
{
return true;
@@ -3997,22 +4038,8 @@ void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible)
#if ENABLE(VIDEO_TRACK)
if (RuntimeEnabledFeatures::webkitVideoTrackEnabled()) {
m_disableCaptions = !m_closedCaptionsVisible;
-
- // Mark all track elements as not "configured" so that configureTextTracks()
- // will reconsider which tracks to display in light of new user preferences
- // (e.g. default tracks should not be displayed if the user has turned off
- // captions and non-default tracks should be displayed based on language
- // preferences if the user has turned captions on).
- for (Node* node = firstChild(); node; node = node->nextSibling()) {
- if (!node->hasTagName(trackTag))
- continue;
- HTMLTrackElement* trackElement = static_cast<HTMLTrackElement*>(node);
- if (trackElement->kind() == TextTrack::captionsKeyword()
- || trackElement->kind() == TextTrack::subtitlesKeyword())
- trackElement->setHasBeenConfigured(false);
- }
- configureTextTracks();
+ markCaptionAndSubtitleTracksAsUnconfigured();
}
#else
if (hasMediaControls())
@@ -4160,6 +4187,9 @@ void HTMLMediaElement::configureMediaControls()
mediaControls()->show();
#else
+ if (!hasMediaControls())
+ createMediaControls();
+
if (m_player)
m_player->setControls(controls());
#endif
@@ -4200,6 +4230,39 @@ void HTMLMediaElement::updateClosedCaptionsControls()
mediaControls()->updateTextTrackDisplay();
}
}
+
+void HTMLMediaElement::captionPreferencesChanged()
+{
+ if (!isVideo())
+ return;
+
+ markCaptionAndSubtitleTracksAsUnconfigured();
+}
+
+void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured()
+{
+ // Mark all track elements as not "configured" so that configureTextTracks()
+ // will reconsider which tracks to display in light of new user preferences
+ // (e.g. default tracks should not be displayed if the user has turned off
+ // captions and non-default tracks should be displayed based on language
+ // preferences if the user has turned captions on).
+ for (RefPtr<Node> node = firstChild(); node; node = node->nextSibling()) {
+ if (!node->hasTagName(trackTag))
+ continue;
+
+ HTMLTrackElement* trackElement = static_cast<HTMLTrackElement*>(node.get());
+ RefPtr<TextTrack> textTrack = trackElement->track();
+ if (!textTrack)
+ continue;
+
+ String kind = textTrack->kind();
+
+ if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword())
+ trackElement->setHasBeenConfigured(false);
+ }
+ configureTextTracks();
+}
+
#endif
void* HTMLMediaElement::preDispatchEventHandler(Event* event)
@@ -4216,7 +4279,7 @@ void HTMLMediaElement::createMediaPlayer()
if (m_audioSourceNode)
m_audioSourceNode->lock();
#endif
-
+
m_player = MediaPlayer::create(this);
#if ENABLE(MEDIA_SOURCE)
@@ -4468,11 +4531,26 @@ String HTMLMediaElement::mediaPlayerDocumentHost() const
return document()->url().host();
}
+void HTMLMediaElement::mediaPlayerEnterFullscreen()
+{
+ enterFullscreen();
+}
+
void HTMLMediaElement::mediaPlayerExitFullscreen()
{
exitFullscreen();
}
+bool HTMLMediaElement::mediaPlayerIsFullscreen() const
+{
+ return isFullscreen();
+}
+
+bool HTMLMediaElement::mediaPlayerIsFullscreenPermitted() const
+{
+ return !userGestureRequiredForFullscreen() || ScriptController::processingUserGesture();
+}
+
bool HTMLMediaElement::mediaPlayerIsVideo() const
{
return isVideo();