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 0a273bc84e4205bb80cd4b0201837f74c97dfa15..65111427675869134b04467afa3276760599e2c0 100644 |
--- a/Source/core/html/track/vtt/VTTCue.cpp |
+++ b/Source/core/html/track/vtt/VTTCue.cpp |
@@ -145,22 +145,18 @@ static void setInlineStylePropertyIfNotEmpty(Element& element, |
element.setInlineStyleProperty(propertyID, value); |
} |
-VTTCueBox::VTTCueBox(Document& document, VTTCue* cue) |
+VTTCueBox::VTTCueBox(Document& document) |
: HTMLDivElement(document) |
- , m_cue(cue) |
+ , m_snapToLinesPosition(std::numeric_limits<float>::quiet_NaN()) |
{ |
setShadowPseudoId(AtomicString("-webkit-media-text-track-display", AtomicString::ConstructFromLiteral)); |
} |
void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters) |
{ |
- // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916 |
- if (!m_cue->regionId().isEmpty()) { |
- setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative); |
- return; |
- } |
+ // http://dev.w3.org/html5/webvtt/#applying-css-properties-to-webvtt-node-objects |
- // 3.5.1 On the (root) List of WebVTT Node Objects: |
+ // Initialize the (root) list of WebVTT Node Objects with the following CSS settings: |
// the 'position' property must be set to 'absolute' |
setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); |
@@ -183,7 +179,7 @@ void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters |
setInlineStyleProperty(CSSPropertyLeft, position.x(), CSSPrimitiveValue::CSS_PERCENTAGE); |
// the 'width' property must be set to width, and the 'height' property must be set to height |
- if (m_cue->vertical() == horizontalKeyword()) { |
+ if (displayParameters.writingMode == CSSValueHorizontalTb) { |
setInlineStyleProperty(CSSPropertyWidth, displayParameters.size, CSSPrimitiveValue::CSS_PERCENTAGE); |
setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); |
} else { |
@@ -195,9 +191,12 @@ void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters |
// be set to the value in the second cell of the row of the table below |
// whose first cell is the value of the corresponding cue's text track cue |
// alignment: |
- setInlineStyleProperty(CSSPropertyTextAlign, displayAlignmentMap[m_cue->cueAlignment()]); |
+ setInlineStyleProperty(CSSPropertyTextAlign, displayParameters.textAlign); |
- if (!m_cue->snapToLines()) { |
+ // TODO(philipj): The position adjustment for non-snap-to-lines cues has |
+ // been removed from the spec: |
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=19178 |
+ if (std::isnan(displayParameters.snapToLinesPosition)) { |
// 10.13.1 Set up x and y: |
// Note: x and y are set through the CSS left and top above. |
@@ -213,17 +212,21 @@ void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters |
setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); |
} |
-} |
-LayoutObject* VTTCueBox::createLayoutObject(const ComputedStyle&) |
-{ |
- return new LayoutVTTCue(this); |
+ // The snap-to-lines position is propagated to LayoutVTTCue. |
+ m_snapToLinesPosition = displayParameters.snapToLinesPosition; |
} |
-DEFINE_TRACE(VTTCueBox) |
+LayoutObject* VTTCueBox::createLayoutObject(const ComputedStyle& style) |
{ |
- visitor->trace(m_cue); |
- HTMLDivElement::trace(visitor); |
+ // If WebVTT Regions are used, the regular WebVTT layout algorithm is no |
+ // longer necessary, since cues having the region parameter set do not have |
+ // any positioning parameters. Also, in this case, the regions themselves |
+ // have positioning information. |
+ if (style.position() == RelativePosition) |
+ return HTMLDivElement::createLayoutObject(style); |
+ |
+ return new LayoutVTTCue(this, m_snapToLinesPosition); |
} |
VTTCue::VTTCue(Document& document, double startTime, double endTime, const String& text) |
@@ -245,15 +248,6 @@ VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin |
VTTCue::~VTTCue() |
{ |
- // Using oilpan, if m_displayTree is in the document it will strongly keep |
- // the cue alive. Thus, if the cue is dead, either m_displayTree is not in |
- // the document or the entire document is dead too. |
-#if !ENABLE(OILPAN) |
- // FIXME: This is scary, we should make the life cycle smarter so the destructor |
- // doesn't need to do DOM mutations. |
- if (m_displayTree) |
- m_displayTree->remove(ASSERT_NO_EXCEPTION); |
-#endif |
} |
#ifndef NDEBUG |
@@ -645,19 +639,26 @@ VTTCue::CueAlignment VTTCue::calculateComputedCueAlignment() const |
VTTDisplayParameters::VTTDisplayParameters() |
: size(std::numeric_limits<float>::quiet_NaN()) |
, direction(CSSValueNone) |
- , writingMode(CSSValueNone) { } |
+ , textAlign(CSSValueNone) |
+ , writingMode(CSSValueNone) |
+ , snapToLinesPosition(std::numeric_limits<float>::quiet_NaN()) { } |
VTTDisplayParameters VTTCue::calculateDisplayParameters() const |
{ |
// http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings |
VTTDisplayParameters displayParameters; |
+ |
// Steps 1 and 2. |
displayParameters.direction = determineTextDirection(m_vttNodeTree.get()); |
if (displayParameters.direction == CSSValueRtl) |
UseCounter::count(document(), UseCounter::VTTCueRenderRtl); |
+ // Note: The 'text-align' property is also determined here so that |
+ // VTTCueBox::applyCSSProperties need not have access to a VTTCue. |
+ displayParameters.textAlign = displayAlignmentMap[cueAlignment()]; |
+ |
// 3. If the text track cue writing direction is horizontal, then let |
// block-flow be 'tb'. Otherwise, if the text track cue writing direction is |
// vertical growing left, then let block-flow be 'lr'. Otherwise, the text |
@@ -747,6 +748,11 @@ VTTDisplayParameters VTTCue::calculateDisplayParameters() const |
// Step 9 not implemented (margin == 0). |
+ // The snap-to-lines position is propagated to LayoutVTTCue. |
+ displayParameters.snapToLinesPosition = m_snapToLines |
+ ? computedLinePosition |
+ : std::numeric_limits<float>::quiet_NaN(); |
+ |
ASSERT(std::isfinite(displayParameters.size)); |
ASSERT(displayParameters.direction != CSSValueNone); |
ASSERT(displayParameters.writingMode != CSSValueNone); |
@@ -800,7 +806,7 @@ PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree() |
ASSERT(track() && track()->isRendered() && isActive()); |
if (!m_displayTree) { |
- m_displayTree = VTTCueBox::create(document(), this); |
+ m_displayTree = VTTCueBox::create(document()); |
m_displayTree->appendChild(m_cueBackgroundBox); |
} |
@@ -819,8 +825,15 @@ PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree() |
m_cueBackgroundBox->removeChildren(); |
m_vttNodeTree->cloneChildNodes(m_cueBackgroundBox.get()); |
- VTTDisplayParameters displayParameters = calculateDisplayParameters(); |
- m_displayTree->applyCSSProperties(displayParameters); |
+ // TODO(philipj): The region identifier may be non-empty without there being |
+ // a corresponding region, in which case this VTTCueBox will be added |
+ // directly to the text track container in updateDisplay(). |
+ if (regionId().isEmpty()) { |
+ VTTDisplayParameters displayParameters = calculateDisplayParameters(); |
+ m_displayTree->applyCSSProperties(displayParameters); |
+ } else { |
+ m_displayTree->setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative); |
+ } |
// Apply user override settings for text tracks |
applyUserOverrideCSSProperties(); |