Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(714)

Unified Diff: Source/core/html/HTMLMediaElement.cpp

Issue 949203002: Separate the text track container from the media controls (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: same size as media controls Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/html/HTMLMediaElement.cpp
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp
index 40724c9baed9ea85a09f19d4290dd712eaedd73b..19a8711cb13db8aa352fc2e5e31003602bfc78e4 100644
--- a/Source/core/html/HTMLMediaElement.cpp
+++ b/Source/core/html/HTMLMediaElement.cpp
@@ -55,6 +55,7 @@
#include "core/html/track/AutomaticTrackSelection.h"
#include "core/html/track/CueTimeline.h"
#include "core/html/track/InbandTextTrack.h"
+#include "core/html/track/TextTrackContainer.h"
#include "core/html/track/TextTrackList.h"
#include "core/html/track/VideoTrack.h"
#include "core/html/track/VideoTrackList.h"
@@ -3184,12 +3185,52 @@ bool HTMLMediaElement::closedCaptionsVisible() const
return m_closedCaptionsVisible;
}
+static void assertShadowRootChildren(ShadowRoot& shadowRoot)
philipj_slow 2015/02/26 09:51:52 I don't know if this seems pedantic. I failed to g
+{
+#if ENABLE(ASSERT)
+ // There can be up to two children, either or both of the text
+ // track container and media controls. If both are present, the
+ // text track container must be the first child.
+ unsigned numberOfChildren = shadowRoot.countChildren();
+ ASSERT(numberOfChildren <= 2);
+ Node* firstChild = shadowRoot.firstChild();
+ Node* lastChild = shadowRoot.lastChild();
+ if (numberOfChildren == 1) {
+ ASSERT(firstChild->isTextTrackContainer() || firstChild->isMediaControls());
+ } else if (numberOfChildren == 2) {
+ ASSERT(firstChild->isTextTrackContainer());
+ ASSERT(lastChild->isMediaControls());
+ }
+#endif
+}
+
+TextTrackContainer& HTMLMediaElement::ensureTextTrackContainer()
+{
+ ShadowRoot& shadowRoot = ensureClosedShadowRoot();
+ assertShadowRootChildren(shadowRoot);
+
+ Node* firstChild = shadowRoot.firstChild();
+ if (firstChild && firstChild->isTextTrackContainer())
+ return toTextTrackContainer(*firstChild);
+
+ RefPtrWillBeRawPtr<TextTrackContainer> textTrackContainer = TextTrackContainer::create(document());
+
+ // The text track container should be inserted before the media controls,
+ // so that they are rendered behind them.
+ shadowRoot.insertBefore(textTrackContainer, firstChild);
+
+ assertShadowRootChildren(shadowRoot);
+
+ return *textTrackContainer;
+}
+
void HTMLMediaElement::updateTextTrackDisplay()
{
WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay(%p)", this);
- ensureMediaControls();
- mediaControls()->updateTextTrackDisplay();
+ // FIXME: this probably doesn't hold
philipj_slow 2015/02/26 09:51:52 Um, right. fs, I think we can get here for audio e
fs 2015/02/26 12:30:51 My (loose) plan so far wrt this has been to not ev
philipj_slow 2015/02/27 07:13:51 Not creating the container for audio sounds like a
fs 2015/02/27 09:50:31 Acknowledged.
+ ASSERT(isHTMLVideoElement());
+ ensureTextTrackContainer().updateDisplay(*this);
}
void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible)
@@ -3262,12 +3303,12 @@ void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay)
document().decrementLoadEventDelayCount();
}
-
MediaControls* HTMLMediaElement::mediaControls() const
{
if (ShadowRoot* shadowRoot = closedShadowRoot()) {
- // Note that |shadowRoot->firstChild()| may be null.
- return toMediaControls(shadowRoot->firstChild());
+ Node* lastChild = shadowRoot->lastChild();
+ if (lastChild && lastChild->isMediaControls())
+ return toMediaControls(lastChild);
}
return nullptr;
@@ -3284,7 +3325,14 @@ void HTMLMediaElement::ensureMediaControls()
if (isFullscreen())
mediaControls->enteredFullscreen();
- ensureClosedShadowRoot().appendChild(mediaControls);
+ ShadowRoot& shadowRoot = ensureClosedShadowRoot();
+ assertShadowRootChildren(shadowRoot);
+
+ // The media controls should be inserted after the text track container,
+ // so that they are rendered in front of captions and subtitles.
+ shadowRoot.appendChild(mediaControls);
+
+ assertShadowRootChildren(shadowRoot);
if (!shouldShowControls() || !inDocument())
mediaControls->hide();
@@ -3340,8 +3388,8 @@ void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu
if (!m_haveVisibleTextTrack && !mediaControls())
return;
- ensureMediaControls();
- mediaControls()->changedClosedCaptionsVisibility();
+ if (mediaControls())
+ mediaControls()->changedClosedCaptionsVisibility();
cueTimeline().updateActiveCues(currentTime());
updateTextTrackDisplay();

Powered by Google App Engine
This is Rietveld 408576698