| Index: Source/core/html/track/vtt/VTTCue.cpp
|
| diff --git a/Source/core/html/track/vtt/VTTCue.cpp b/Source/core/html/track/vtt/VTTCue.cpp
|
| index 92f0990b2c1c00dacbd9b35948d0565e71cda1e8..9276b20b40a82ab615f0b251f8b9c73b5a446b1d 100644
|
| --- a/Source/core/html/track/vtt/VTTCue.cpp
|
| +++ b/Source/core/html/track/vtt/VTTCue.cpp
|
| @@ -744,16 +744,30 @@ VTTDisplayParameters VTTCue::calculateDisplayParameters() const
|
| return displayParameters;
|
| }
|
|
|
| -void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestamp, double movieTime)
|
| +void VTTCue::updatePastAndFutureNodes(double movieTime)
|
| {
|
| DEFINE_STATIC_LOCAL(const String, timestampTag, ("timestamp"));
|
|
|
| + ASSERT(isActive());
|
| +
|
| + // An active cue may still not have a display tree, e.g. if its track is
|
| + // hidden or if the track belongs to an audio element.
|
| + if (!m_displayTree)
|
| + return;
|
| +
|
| + // FIXME: Per spec it's possible for neither :past nor :future to match, but
|
| + // as implemented here and in SelectorChecker they are simply each others
|
| + // negations. For a cue with no internal timestamps, :past will match but
|
| + // should not per spec. :future is correct, however. See the spec bug to
|
| + // determine what the correct behavior should be:
|
| + // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28237
|
| +
|
| bool isPastNode = true;
|
| - double currentTimestamp = previousTimestamp;
|
| + double currentTimestamp = startTime();
|
| if (currentTimestamp > movieTime)
|
| isPastNode = false;
|
|
|
| - for (Node& child : NodeTraversal::descendantsOf(*root)) {
|
| + for (Node& child : NodeTraversal::descendantsOf(*m_displayTree)) {
|
| if (child.nodeName() == timestampTag) {
|
| double currentTimestamp;
|
| bool check = VTTParser::collectTimeStamp(child.nodeValue(), currentTimestamp);
|
| @@ -772,25 +786,6 @@ void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestam
|
| }
|
| }
|
|
|
| -void VTTCue::updateDisplayTree(double movieTime)
|
| -{
|
| - // The display tree may contain WebVTT timestamp objects representing
|
| - // timestamps (processing instructions), along with displayable nodes.
|
| -
|
| - if (!track()->isRendered())
|
| - return;
|
| -
|
| - // Clear the contents of the set.
|
| - m_cueBackgroundBox->removeChildren();
|
| -
|
| - // Update the two sets containing past and future WebVTT objects.
|
| - createVTTNodeTree();
|
| - RefPtrWillBeRawPtr<DocumentFragment> referenceTree = DocumentFragment::create(document());
|
| - m_vttNodeTree->cloneChildNodes(referenceTree.get());
|
| - markFutureAndPastNodes(referenceTree.get(), startTime(), movieTime);
|
| - m_cueBackgroundBox->appendChild(referenceTree, ASSERT_NO_EXCEPTION);
|
| -}
|
| -
|
| PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree()
|
| {
|
| ASSERT(track() && track()->isRendered() && isActive());
|
| @@ -802,13 +797,14 @@ PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree()
|
|
|
| ASSERT(m_displayTree->firstChild() == m_cueBackgroundBox);
|
|
|
| - // Note: It is updateDisplayTree() which actually adds the child
|
| - // nodes to m_cueBackgroundBox.
|
| -
|
| if (!m_displayTreeShouldChange)
|
| return m_displayTree;
|
|
|
| createVTTNodeTree();
|
| +
|
| + m_cueBackgroundBox->removeChildren();
|
| + m_vttNodeTree->cloneChildNodes(m_cueBackgroundBox.get());
|
| +
|
| VTTDisplayParameters displayParameters = calculateDisplayParameters();
|
| m_displayTree->applyCSSProperties(displayParameters);
|
|
|
|
|