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); |