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

Side by Side Diff: Source/core/html/track/vtt/VTTCue.cpp

Issue 869623002: VTTCue: Refactor display parameter handling (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/html/track/vtt/VTTCue.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013, Opera Software ASA. All rights reserved. 2 * Copyright (c) 2013, Opera Software ASA. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 return false; 136 return false;
137 } 137 }
138 138
139 VTTCueBox::VTTCueBox(Document& document, VTTCue* cue) 139 VTTCueBox::VTTCueBox(Document& document, VTTCue* cue)
140 : HTMLDivElement(document) 140 : HTMLDivElement(document)
141 , m_cue(cue) 141 , m_cue(cue)
142 { 142 {
143 setShadowPseudoId(AtomicString("-webkit-media-text-track-display", AtomicStr ing::ConstructFromLiteral)); 143 setShadowPseudoId(AtomicString("-webkit-media-text-track-display", AtomicStr ing::ConstructFromLiteral));
144 } 144 }
145 145
146 void VTTCueBox::applyCSSProperties(const IntSize&) 146 void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters )
147 { 147 {
148 // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79 916 148 // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79 916
149 if (!m_cue->regionId().isEmpty()) { 149 if (!m_cue->regionId().isEmpty()) {
150 setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative); 150 setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative);
151 return; 151 return;
152 } 152 }
153 153
154 // 3.5.1 On the (root) List of WebVTT Node Objects: 154 // 3.5.1 On the (root) List of WebVTT Node Objects:
155 155
156 // the 'position' property must be set to 'absolute' 156 // the 'position' property must be set to 'absolute'
157 setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); 157 setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute);
158 158
159 // the 'unicode-bidi' property must be set to 'plaintext' 159 // the 'unicode-bidi' property must be set to 'plaintext'
160 setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); 160 setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext);
161 161
162 // the 'direction' property must be set to direction 162 // the 'direction' property must be set to direction
163 setInlineStyleProperty(CSSPropertyDirection, m_cue->getCSSWritingDirection() ); 163 setInlineStyleProperty(CSSPropertyDirection, displayParameters.direction);
164 164
165 // the 'writing-mode' property must be set to writing-mode 165 // the 'writing-mode' property must be set to writing-mode
166 setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue->getCSSWritingMod e()); 166 setInlineStyleProperty(CSSPropertyWebkitWritingMode, displayParameters.writi ngMode);
167 167
168 FloatPoint position = m_cue->getCSSPosition(); 168 const FloatPoint& position = displayParameters.position;
169 169
170 // the 'top' property must be set to top, 170 // the 'top' property must be set to top,
171 setInlineStyleProperty(CSSPropertyTop, position.y(), CSSPrimitiveValue::CSS_ PERCENTAGE); 171 setInlineStyleProperty(CSSPropertyTop, position.y(), CSSPrimitiveValue::CSS_ PERCENTAGE);
172 172
173 // the 'left' property must be set to left 173 // the 'left' property must be set to left
174 setInlineStyleProperty(CSSPropertyLeft, position.x(), CSSPrimitiveValue::CSS _PERCENTAGE); 174 setInlineStyleProperty(CSSPropertyLeft, position.x(), CSSPrimitiveValue::CSS _PERCENTAGE);
175 175
176 // the 'width' property must be set to width, and the 'height' property mus t be set to height 176 // the 'width' property must be set to width, and the 'height' property mus t be set to height
177 if (m_cue->vertical() == horizontalKeyword()) { 177 if (m_cue->vertical() == horizontalKeyword()) {
178 setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue->getC SSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); 178 setInlineStyleProperty(CSSPropertyWidth, displayParameters.size, CSSPrim itiveValue::CSS_PERCENTAGE);
179 setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); 179 setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto);
180 } else { 180 } else {
181 setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); 181 setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto);
182 setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue->get CSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); 182 setInlineStyleProperty(CSSPropertyHeight, displayParameters.size, CSSPr imitiveValue::CSS_PERCENTAGE);
183 } 183 }
184 184
185 // The 'text-align' property on the (root) List of WebVTT Node Objects must 185 // The 'text-align' property on the (root) List of WebVTT Node Objects must
186 // be set to the value in the second cell of the row of the table below 186 // be set to the value in the second cell of the row of the table below
187 // whose first cell is the value of the corresponding cue's text track cue 187 // whose first cell is the value of the corresponding cue's text track cue
188 // alignment: 188 // alignment:
189 setInlineStyleProperty(CSSPropertyTextAlign, m_cue->getCSSAlignment()); 189 setInlineStyleProperty(CSSPropertyTextAlign, displayAlignmentMap[m_cue->cueA lignment()]);
190 190
191 if (!m_cue->snapToLines()) { 191 if (!m_cue->snapToLines()) {
192 // 10.13.1 Set up x and y: 192 // 10.13.1 Set up x and y:
193 // Note: x and y are set through the CSS left and top above. 193 // Note: x and y are set through the CSS left and top above.
194 194
195 // 10.13.2 Position the boxes in boxes such that the point x% along the 195 // 10.13.2 Position the boxes in boxes such that the point x% along the
196 // width of the bounding box of the boxes in boxes is x% of the way 196 // width of the bounding box of the boxes in boxes is x% of the way
197 // across the width of the video's rendering area, and the point y% 197 // across the width of the video's rendering area, and the point y%
198 // along the height of the bounding box of the boxes in boxes is y% 198 // along the height of the bounding box of the boxes in boxes is y%
199 // of the way across the height of the video's rendering area, while 199 // of the way across the height of the video's rendering area, while
(...skipping 14 matching lines...) Expand all
214 void VTTCueBox::trace(Visitor* visitor) 214 void VTTCueBox::trace(Visitor* visitor)
215 { 215 {
216 visitor->trace(m_cue); 216 visitor->trace(m_cue);
217 HTMLDivElement::trace(visitor); 217 HTMLDivElement::trace(visitor);
218 } 218 }
219 219
220 VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin g& text) 220 VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin g& text)
221 : TextTrackCue(startTime, endTime) 221 : TextTrackCue(startTime, endTime)
222 , m_text(text) 222 , m_text(text)
223 , m_linePosition(std::numeric_limits<float>::quiet_NaN()) 223 , m_linePosition(std::numeric_limits<float>::quiet_NaN())
224 , m_computedLinePosition(std::numeric_limits<float>::quiet_NaN())
225 , m_textPosition(std::numeric_limits<float>::quiet_NaN()) 224 , m_textPosition(std::numeric_limits<float>::quiet_NaN())
226 , m_cueSize(100) 225 , m_cueSize(100)
227 , m_writingDirection(Horizontal) 226 , m_writingDirection(Horizontal)
228 , m_cueAlignment(Middle) 227 , m_cueAlignment(Middle)
229 , m_vttNodeTree(nullptr) 228 , m_vttNodeTree(nullptr)
230 , m_cueBackgroundBox(HTMLDivElement::create(document)) 229 , m_cueBackgroundBox(HTMLDivElement::create(document))
231 , m_displayDirection(CSSValueLtr)
232 , m_displaySize(std::numeric_limits<float>::quiet_NaN())
233 , m_snapToLines(true) 230 , m_snapToLines(true)
234 , m_displayTreeShouldChange(true) 231 , m_displayTreeShouldChange(true)
235 , m_notifyRegion(true) 232 , m_notifyRegion(true)
236 { 233 {
237 UseCounter::count(document, UseCounter::VTTCue); 234 UseCounter::count(document, UseCounter::VTTCue);
238 } 235 }
239 236
240 VTTCue::~VTTCue() 237 VTTCue::~VTTCue()
241 { 238 {
242 // Using oilpan, if m_displayTree is in the document it will strongly keep 239 // Using oilpan, if m_displayTree is in the document it will strongly keep
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 floatPosition = std::numeric_limits<float>::quiet_NaN(); 345 floatPosition = std::numeric_limits<float>::quiet_NaN();
349 } else { 346 } else {
350 ASSERT(position.isDouble()); 347 ASSERT(position.isDouble());
351 floatPosition = narrowPrecisionToFloat(position.getAsDouble()); 348 floatPosition = narrowPrecisionToFloat(position.getAsDouble());
352 if (m_linePosition == floatPosition) 349 if (m_linePosition == floatPosition)
353 return; 350 return;
354 } 351 }
355 352
356 cueWillChange(); 353 cueWillChange();
357 m_linePosition = floatPosition; 354 m_linePosition = floatPosition;
358 m_computedLinePosition = calculateComputedLinePosition();
359 cueDidChange(); 355 cueDidChange();
360 } 356 }
361 357
362 bool VTTCue::textPositionIsAuto() const 358 bool VTTCue::textPositionIsAuto() const
363 { 359 {
364 return std::isnan(m_textPosition); 360 return std::isnan(m_textPosition);
365 } 361 }
366 362
367 void VTTCue::position(DoubleOrAutoKeyword& result) const 363 void VTTCue::position(DoubleOrAutoKeyword& result) const
368 { 364 {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 cueWillChange(); 518 cueWillChange();
523 m_regionId = regionId; 519 m_regionId = regionId;
524 cueDidChange(); 520 cueDidChange();
525 } 521 }
526 522
527 void VTTCue::notifyRegionWhenRemovingDisplayTree(bool notifyRegion) 523 void VTTCue::notifyRegionWhenRemovingDisplayTree(bool notifyRegion)
528 { 524 {
529 m_notifyRegion = notifyRegion; 525 m_notifyRegion = notifyRegion;
530 } 526 }
531 527
532 float VTTCue::calculateComputedLinePosition() 528 float VTTCue::calculateComputedLinePosition() const
533 { 529 {
534 // http://dev.w3.org/html5/webvtt/#dfn-text-track-cue-computed-line-position 530 // http://dev.w3.org/html5/webvtt/#dfn-text-track-cue-computed-line-position
535 // A text track cue has a text track cue computed line position whose value 531 // A text track cue has a text track cue computed line position whose value
536 // is that returned by the following algorithm, which is defined in terms 532 // is that returned by the following algorithm, which is defined in terms
537 // of the other aspects of the cue: 533 // of the other aspects of the cue:
538 534
539 // 1. If the text track cue line position is numeric, the text track cue 535 // 1. If the text track cue line position is numeric, the text track cue
540 // snap-to-lines flag of the text track cue is not set, and the text 536 // snap-to-lines flag of the text track cue is not set, and the text
541 // track cue line position is negative or greater than 100, then return 537 // track cue line position is negative or greater than 100, then return
542 // 100 and abort these steps. 538 // 100 and abort these steps.
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 switch (m_cueAlignment) { 658 switch (m_cueAlignment) {
663 case VTTCue::Left: 659 case VTTCue::Left:
664 return VTTCue::Start; 660 return VTTCue::Start;
665 case VTTCue::Right: 661 case VTTCue::Right:
666 return VTTCue::End; 662 return VTTCue::End;
667 default: 663 default:
668 return m_cueAlignment; 664 return m_cueAlignment;
669 } 665 }
670 } 666 }
671 667
672 void VTTCue::calculateDisplayParameters() 668 VTTDisplayParameters::VTTDisplayParameters()
669 : size(std::numeric_limits<float>::quiet_NaN())
670 , direction(CSSValueNone)
671 , writingMode(CSSValueNone) { }
672
673 VTTDisplayParameters VTTCue::calculateDisplayParameters() const
673 { 674 {
674 createVTTNodeTree();
675
676 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings 675 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
677 676
677 VTTDisplayParameters displayParameters;
678 // Steps 1 and 2. 678 // Steps 1 and 2.
679 m_displayDirection = determineTextDirection(m_vttNodeTree.get()); 679 displayParameters.direction = determineTextDirection(m_vttNodeTree.get());
680 680
681 if (m_displayDirection == CSSValueRtl) 681 if (displayParameters.direction == CSSValueRtl)
682 UseCounter::count(document(), UseCounter::VTTCueRenderRtl); 682 UseCounter::count(document(), UseCounter::VTTCueRenderRtl);
683 683
684 // 3. If the text track cue writing direction is horizontal, then let 684 // 3. If the text track cue writing direction is horizontal, then let
685 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is 685 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is
686 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text 686 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text
687 // track cue writing direction is vertical growing right; let block-flow be 687 // track cue writing direction is vertical growing right; let block-flow be
688 // 'rl'. 688 // 'rl'.
689 689 displayParameters.writingMode = displayWritingModeMap[m_writingDirection];
690 // The above step is done through the writing direction static map.
691 690
692 // Resolve the cue alignment to one of the values {start, end, middle}. 691 // Resolve the cue alignment to one of the values {start, end, middle}.
693 CueAlignment computedCueAlignment = calculateComputedCueAlignment(); 692 CueAlignment computedCueAlignment = calculateComputedCueAlignment();
694 693
695 // 4. Determine the value of maximum size for cue as per the appropriate 694 // 4. Determine the value of maximum size for cue as per the appropriate
696 // rules from the following list: 695 // rules from the following list:
697 float computedTextPosition = calculateComputedTextPosition(); 696 float computedTextPosition = calculateComputedTextPosition();
698 float maximumSize = computedTextPosition; 697 float maximumSize = computedTextPosition;
699 if (computedCueAlignment == Start) { 698 if (computedCueAlignment == Start) {
700 maximumSize = 100 - computedTextPosition; 699 maximumSize = 100 - computedTextPosition;
701 } else if (computedCueAlignment == End) { 700 } else if (computedCueAlignment == End) {
702 maximumSize = computedTextPosition; 701 maximumSize = computedTextPosition;
703 } else if (computedCueAlignment == Middle) { 702 } else if (computedCueAlignment == Middle) {
704 maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition); 703 maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition);
705 maximumSize = maximumSize * 2; 704 maximumSize = maximumSize * 2;
706 } else { 705 } else {
707 ASSERT_NOT_REACHED(); 706 ASSERT_NOT_REACHED();
708 } 707 }
709 708
710 // 5. If the text track cue size is less than maximum size, then let size 709 // 5. If the text track cue size is less than maximum size, then let size
711 // be text track cue size. Otherwise, let size be maximum size. 710 // be text track cue size. Otherwise, let size be maximum size.
712 m_displaySize = std::min(m_cueSize, maximumSize); 711 displayParameters.size = std::min(m_cueSize, maximumSize);
713 712
714 // 6. If the text track cue writing direction is horizontal, then let width 713 // 6. If the text track cue writing direction is horizontal, then let width
715 // be 'size vw' and height be 'auto'. Otherwise, let width be 'auto' and 714 // be 'size vw' and height be 'auto'. Otherwise, let width be 'auto' and
716 // height be 'size vh'. (These are CSS values used by the next section to 715 // height be 'size vh'. (These are CSS values used by the next section to
717 // set CSS properties for the rendering; 'vw' and 'vh' are CSS units.) 716 // set CSS properties for the rendering; 'vw' and 'vh' are CSS units.)
718 // (Emulated in VTTCueBox::applyCSSProperties.) 717 // (Emulated in VTTCueBox::applyCSSProperties.)
719 718
720 // 7. Determine the value of x-position or y-position for cue as per the 719 // 7. Determine the value of x-position or y-position for cue as per the
721 // appropriate rules from the following list: 720 // appropriate rules from the following list:
722 if (m_writingDirection == Horizontal) { 721 if (m_writingDirection == Horizontal) {
723 switch (computedCueAlignment) { 722 switch (computedCueAlignment) {
724 case Start: 723 case Start:
725 m_displayPosition.setX(computedTextPosition); 724 displayParameters.position.setX(computedTextPosition);
726 break; 725 break;
727 case End: 726 case End:
728 m_displayPosition.setX(computedTextPosition - m_displaySize); 727 displayParameters.position.setX(computedTextPosition - displayParame ters.size);
729 break; 728 break;
730 case Middle: 729 case Middle:
731 m_displayPosition.setX(computedTextPosition - m_displaySize / 2); 730 displayParameters.position.setX(computedTextPosition - displayParame ters.size / 2);
732 break; 731 break;
733 default: 732 default:
734 ASSERT_NOT_REACHED(); 733 ASSERT_NOT_REACHED();
735 } 734 }
736 } else { 735 } else {
737 // Cases for m_writingDirection being VerticalGrowing{Left|Right} 736 // Cases for m_writingDirection being VerticalGrowing{Left|Right}
738 switch (computedCueAlignment) { 737 switch (computedCueAlignment) {
739 case Start: 738 case Start:
740 m_displayPosition.setY(computedTextPosition); 739 displayParameters.position.setY(computedTextPosition);
741 break; 740 break;
742 case End: 741 case End:
743 m_displayPosition.setY(computedTextPosition - m_displaySize); 742 displayParameters.position.setY(computedTextPosition - displayParame ters.size);
744 break; 743 break;
745 case Middle: 744 case Middle:
746 m_displayPosition.setY(computedTextPosition - m_displaySize / 2); 745 displayParameters.position.setY(computedTextPosition - displayParame ters.size / 2);
747 break; 746 break;
748 default: 747 default:
749 ASSERT_NOT_REACHED(); 748 ASSERT_NOT_REACHED();
750 } 749 }
751 } 750 }
752 751
753 // A text track cue has a text track cue computed line position whose value 752 // A text track cue has a text track cue computed line position whose value
754 // is defined in terms of the other aspects of the cue. 753 // is defined in terms of the other aspects of the cue.
755 m_computedLinePosition = calculateComputedLinePosition(); 754 float computedLinePosition = calculateComputedLinePosition();
756 755
757 // 8. Determine the value of whichever of x-position or y-position is not 756 // 8. Determine the value of whichever of x-position or y-position is not
758 // yet calculated for cue as per the appropriate rules from the following 757 // yet calculated for cue as per the appropriate rules from the following
759 // list: 758 // list:
760 if (!m_snapToLines) { 759 if (!m_snapToLines) {
761 if (m_writingDirection == Horizontal) 760 if (m_writingDirection == Horizontal)
762 m_displayPosition.setY(m_computedLinePosition); 761 displayParameters.position.setY(computedLinePosition);
763 else 762 else
764 m_displayPosition.setX(m_computedLinePosition); 763 displayParameters.position.setX(computedLinePosition);
765 } else { 764 } else {
766 if (m_writingDirection == Horizontal) 765 if (m_writingDirection == Horizontal)
767 m_displayPosition.setY(0); 766 displayParameters.position.setY(0);
768 else 767 else
769 m_displayPosition.setX(0); 768 displayParameters.position.setX(0);
770 } 769 }
770
771 // FIXME: Remove this block.
fs 2015/01/22 17:43:21 Kept this block (from getPositionCoordinates) arou
philipj_slow 2015/01/26 03:00:16 Acknowledged.
772 if (!m_snapToLines) {
773 if (m_writingDirection == Horizontal && displayParameters.direction == C SSValueLtr)
774 displayParameters.position.setX(computedTextPosition);
775
776 if (m_writingDirection == Horizontal && displayParameters.direction == C SSValueRtl)
777 displayParameters.position.setX(100 - computedTextPosition);
778
779 if (m_writingDirection == VerticalGrowingLeft)
780 displayParameters.position = FloatPoint(100 - computedLinePosition, computedTextPosition);
781
782 if (m_writingDirection == VerticalGrowingRight)
783 displayParameters.position.setY(computedTextPosition);
784 }
785
786 // Step 9 not implemented (margin == 0).
787
788 ASSERT(std::isfinite(displayParameters.size));
789 ASSERT(displayParameters.direction != CSSValueNone);
790 ASSERT(displayParameters.writingMode != CSSValueNone);
791 return displayParameters;
771 } 792 }
772 793
773 void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestam p, double movieTime) 794 void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestam p, double movieTime)
774 { 795 {
775 DEFINE_STATIC_LOCAL(const String, timestampTag, ("timestamp")); 796 DEFINE_STATIC_LOCAL(const String, timestampTag, ("timestamp"));
776 797
777 bool isPastNode = true; 798 bool isPastNode = true;
778 double currentTimestamp = previousTimestamp; 799 double currentTimestamp = previousTimestamp;
779 if (currentTimestamp > movieTime) 800 if (currentTimestamp > movieTime)
780 isPastNode = false; 801 isPastNode = false;
(...skipping 27 matching lines...) Expand all
808 829
809 // Clear the contents of the set. 830 // Clear the contents of the set.
810 m_cueBackgroundBox->removeChildren(); 831 m_cueBackgroundBox->removeChildren();
811 832
812 // Update the two sets containing past and future WebVTT objects. 833 // Update the two sets containing past and future WebVTT objects.
813 RefPtrWillBeRawPtr<DocumentFragment> referenceTree = createCueRenderingTree( ); 834 RefPtrWillBeRawPtr<DocumentFragment> referenceTree = createCueRenderingTree( );
814 markFutureAndPastNodes(referenceTree.get(), startTime(), movieTime); 835 markFutureAndPastNodes(referenceTree.get(), startTime(), movieTime);
815 m_cueBackgroundBox->appendChild(referenceTree, ASSERT_NO_EXCEPTION); 836 m_cueBackgroundBox->appendChild(referenceTree, ASSERT_NO_EXCEPTION);
816 } 837 }
817 838
818 PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree(const IntSize& videoSiz e) 839 PassRefPtrWillBeRawPtr<VTTCueBox> VTTCue::getDisplayTree()
819 { 840 {
820 RefPtrWillBeRawPtr<VTTCueBox> displayTree(ensureDisplayTree()); 841 RefPtrWillBeRawPtr<VTTCueBox> displayTree(ensureDisplayTree());
821 if (!m_displayTreeShouldChange || !track()->isRendered()) 842 if (!m_displayTreeShouldChange || !track()->isRendered())
822 return displayTree.release(); 843 return displayTree.release();
823 844
845 createVTTNodeTree();
846
824 // 10.1 - 10.10 847 // 10.1 - 10.10
825 calculateDisplayParameters(); 848 VTTDisplayParameters displayParameters = calculateDisplayParameters();
826 849
827 // 10.11. Apply the terms of the CSS specifications to nodes within the 850 // 10.11. Apply the terms of the CSS specifications to nodes within the
828 // following constraints, thus obtaining a set of CSS boxes positioned 851 // following constraints, thus obtaining a set of CSS boxes positioned
829 // relative to an initial containing block: 852 // relative to an initial containing block:
830 displayTree->removeChildren(); 853 displayTree->removeChildren();
831 854
832 // The document tree is the tree of WebVTT Node Objects rooted at nodes. 855 // The document tree is the tree of WebVTT Node Objects rooted at nodes.
833 856
834 // The children of the nodes must be wrapped in an anonymous box whose 857 // The children of the nodes must be wrapped in an anonymous box whose
835 // 'display' property has the value 'inline'. This is the WebVTT cue 858 // 'display' property has the value 'inline'. This is the WebVTT cue
836 // background box. 859 // background box.
837 860
838 // Note: This is contained by default in m_cueBackgroundBox. 861 // Note: This is contained by default in m_cueBackgroundBox.
839 m_cueBackgroundBox->setShadowPseudoId(cueShadowPseudoId()); 862 m_cueBackgroundBox->setShadowPseudoId(cueShadowPseudoId());
840 displayTree->appendChild(m_cueBackgroundBox); 863 displayTree->appendChild(m_cueBackgroundBox);
841 864
842 // FIXME(BUG 79916): Runs of children of WebVTT Ruby Objects that are not 865 // FIXME(BUG 79916): Runs of children of WebVTT Ruby Objects that are not
843 // WebVTT Ruby Text Objects must be wrapped in anonymous boxes whose 866 // WebVTT Ruby Text Objects must be wrapped in anonymous boxes whose
844 // 'display' property has the value 'ruby-base'. 867 // 'display' property has the value 'ruby-base'.
845 868
846 // FIXME(BUG 79916): Text runs must be wrapped according to the CSS 869 // FIXME(BUG 79916): Text runs must be wrapped according to the CSS
847 // line-wrapping rules, except that additionally, regardless of the value of 870 // line-wrapping rules, except that additionally, regardless of the value of
848 // the 'white-space' property, lines must be wrapped at the edge of their 871 // the 'white-space' property, lines must be wrapped at the edge of their
849 // containing blocks, even if doing so requires splitting a word where there 872 // containing blocks, even if doing so requires splitting a word where there
850 // is no line breaking opportunity. (Thus, normally text wraps as needed, 873 // is no line breaking opportunity. (Thus, normally text wraps as needed,
851 // but if there is a particularly long word, it does not overflow as it 874 // but if there is a particularly long word, it does not overflow as it
852 // normally would in CSS, it is instead forcibly wrapped at the box's edge.) 875 // normally would in CSS, it is instead forcibly wrapped at the box's edge.)
853 displayTree->applyCSSProperties(videoSize); 876 displayTree->applyCSSProperties(displayParameters);
854 877
855 m_displayTreeShouldChange = false; 878 m_displayTreeShouldChange = false;
856 879
857 // 10.15. Let cue's text track cue display state have the CSS boxes in 880 // 10.15. Let cue's text track cue display state have the CSS boxes in
858 // boxes. 881 // boxes.
859 return displayTree.release(); 882 return displayTree.release();
860 } 883 }
861 884
862 void VTTCue::removeDisplayTree() 885 void VTTCue::removeDisplayTree()
863 { 886 {
864 if (m_notifyRegion && track()->regions()) { 887 if (m_notifyRegion && track()->regions()) {
865 // The region needs to be informed about the cue removal. 888 // The region needs to be informed about the cue removal.
866 VTTRegion* region = track()->regions()->getRegionById(m_regionId); 889 VTTRegion* region = track()->regions()->getRegionById(m_regionId);
867 if (region) 890 if (region)
868 region->willRemoveVTTCueBox(m_displayTree.get()); 891 region->willRemoveVTTCueBox(m_displayTree.get());
869 } 892 }
870 893
871 if (m_displayTree) 894 if (m_displayTree)
872 m_displayTree->remove(ASSERT_NO_EXCEPTION); 895 m_displayTree->remove(ASSERT_NO_EXCEPTION);
873 } 896 }
874 897
875 void VTTCue::updateDisplay(const IntSize& videoSize, HTMLDivElement& container) 898 void VTTCue::updateDisplay(HTMLDivElement& container)
876 { 899 {
877 UseCounter::count(document(), UseCounter::VTTCueRender); 900 UseCounter::count(document(), UseCounter::VTTCueRender);
878 901
879 if (m_writingDirection != Horizontal) 902 if (m_writingDirection != Horizontal)
880 UseCounter::count(document(), UseCounter::VTTCueRenderVertical); 903 UseCounter::count(document(), UseCounter::VTTCueRenderVertical);
881 904
882 if (!m_snapToLines) 905 if (!m_snapToLines)
883 UseCounter::count(document(), UseCounter::VTTCueRenderSnapToLinesFalse); 906 UseCounter::count(document(), UseCounter::VTTCueRenderSnapToLinesFalse);
884 907
885 if (!lineIsAuto()) 908 if (!lineIsAuto())
886 UseCounter::count(document(), UseCounter::VTTCueRenderLineNotAuto); 909 UseCounter::count(document(), UseCounter::VTTCueRenderLineNotAuto);
887 910
888 if (textPositionIsAuto()) 911 if (textPositionIsAuto())
889 UseCounter::count(document(), UseCounter::VTTCueRenderPositionNot50); 912 UseCounter::count(document(), UseCounter::VTTCueRenderPositionNot50);
890 913
891 if (m_cueSize != 100) 914 if (m_cueSize != 100)
892 UseCounter::count(document(), UseCounter::VTTCueRenderSizeNot100); 915 UseCounter::count(document(), UseCounter::VTTCueRenderSizeNot100);
893 916
894 if (m_cueAlignment != Middle) 917 if (m_cueAlignment != Middle)
895 UseCounter::count(document(), UseCounter::VTTCueRenderAlignNotMiddle); 918 UseCounter::count(document(), UseCounter::VTTCueRenderAlignNotMiddle);
896 919
897 RefPtrWillBeRawPtr<VTTCueBox> displayBox = getDisplayTree(videoSize); 920 RefPtrWillBeRawPtr<VTTCueBox> displayBox = getDisplayTree();
898 VTTRegion* region = 0; 921 VTTRegion* region = 0;
899 if (track()->regions()) 922 if (track()->regions())
900 region = track()->regions()->getRegionById(regionId()); 923 region = track()->regions()->getRegionById(regionId());
901 924
902 if (!region) { 925 if (!region) {
903 // If cue has an empty text track cue region identifier or there is no 926 // If cue has an empty text track cue region identifier or there is no
904 // WebVTT region whose region identifier is identical to cue's text 927 // WebVTT region whose region identifier is identical to cue's text
905 // track cue region identifier, run the following substeps: 928 // track cue region identifier, run the following substeps:
906 if (displayBox->hasChildren() && !container.contains(displayBox.get())) { 929 if (displayBox->hasChildren() && !container.contains(displayBox.get())) {
907 // Note: the display tree of a cue is removed when the active flag o f the cue is unset. 930 // Note: the display tree of a cue is removed when the active flag o f the cue is unset.
908 container.appendChild(displayBox); 931 container.appendChild(displayBox);
909 } 932 }
910 } else { 933 } else {
911 // Let region be the WebVTT region whose region identifier 934 // Let region be the WebVTT region whose region identifier
912 // matches the text track cue region identifier of cue. 935 // matches the text track cue region identifier of cue.
913 RefPtrWillBeRawPtr<HTMLDivElement> regionNode = region->getDisplayTree(d ocument()); 936 RefPtrWillBeRawPtr<HTMLDivElement> regionNode = region->getDisplayTree(d ocument());
914 937
915 // Append the region to the viewport, if it was not already. 938 // Append the region to the viewport, if it was not already.
916 if (!container.contains(regionNode.get())) 939 if (!container.contains(regionNode.get()))
917 container.appendChild(regionNode); 940 container.appendChild(regionNode);
918 941
919 region->appendVTTCueBox(displayBox); 942 region->appendVTTCueBox(displayBox);
920 } 943 }
921 } 944 }
922 945
923 FloatPoint VTTCue::getPositionCoordinates() const 946 VTTCue::CueSetting VTTCue::settingName(VTTScanner& input) const
924 {
925 // This method is used for setting x and y when snap to lines is not set.
926 ASSERT(std::isfinite(m_computedLinePosition));
927 float computedTextPosition = calculateComputedTextPosition();
928
929 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueLtr)
930 return FloatPoint(computedTextPosition, m_computedLinePosition);
931
932 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueRtl)
933 return FloatPoint(100 - computedTextPosition, m_computedLinePosition);
934
935 if (m_writingDirection == VerticalGrowingLeft)
936 return FloatPoint(100 - m_computedLinePosition, computedTextPosition);
937
938 if (m_writingDirection == VerticalGrowingRight)
939 return FloatPoint(m_computedLinePosition, computedTextPosition);
940
941 ASSERT_NOT_REACHED();
942 return FloatPoint();
943 }
944
945 VTTCue::CueSetting VTTCue::settingName(VTTScanner& input)
946 { 947 {
947 CueSetting parsedSetting = None; 948 CueSetting parsedSetting = None;
948 if (input.scan("vertical")) 949 if (input.scan("vertical"))
949 parsedSetting = Vertical; 950 parsedSetting = Vertical;
950 else if (input.scan("line")) 951 else if (input.scan("line"))
951 parsedSetting = Line; 952 parsedSetting = Line;
952 else if (input.scan("position")) 953 else if (input.scan("position"))
953 parsedSetting = Position; 954 parsedSetting = Position;
954 else if (input.scan("size")) 955 else if (input.scan("size"))
955 parsedSetting = Size; 956 parsedSetting = Size;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 // If cue's line position is not auto or cue's size is not 100 or cue's 1140 // If cue's line position is not auto or cue's size is not 100 or cue's
1140 // writing direction is not horizontal, but cue's region identifier is not 1141 // writing direction is not horizontal, but cue's region identifier is not
1141 // the empty string, let cue's region identifier be the empty string. 1142 // the empty string, let cue's region identifier be the empty string.
1142 if (m_regionId.isEmpty()) 1143 if (m_regionId.isEmpty())
1143 return; 1144 return;
1144 1145
1145 if (!lineIsAuto() || m_cueSize != 100 || m_writingDirection != Horizontal) 1146 if (!lineIsAuto() || m_cueSize != 100 || m_writingDirection != Horizontal)
1146 m_regionId = emptyString(); 1147 m_regionId = emptyString();
1147 } 1148 }
1148 1149
1149 CSSValueID VTTCue::getCSSAlignment() const
1150 {
1151 return displayAlignmentMap[m_cueAlignment];
1152 }
1153
1154 CSSValueID VTTCue::getCSSWritingDirection() const
1155 {
1156 return m_displayDirection;
1157 }
1158
1159 CSSValueID VTTCue::getCSSWritingMode() const
1160 {
1161 return displayWritingModeMap[m_writingDirection];
1162 }
1163
1164 float VTTCue::getCSSSize() const
1165 {
1166 ASSERT(std::isfinite(m_displaySize));
1167 return m_displaySize;
1168 }
1169
1170 FloatPoint VTTCue::getCSSPosition() const
1171 {
1172 if (!m_snapToLines)
1173 return getPositionCoordinates();
1174
1175 return m_displayPosition;
1176 }
1177
1178 ExecutionContext* VTTCue::executionContext() const 1150 ExecutionContext* VTTCue::executionContext() const
1179 { 1151 {
1180 ASSERT(m_cueBackgroundBox); 1152 ASSERT(m_cueBackgroundBox);
1181 return m_cueBackgroundBox->executionContext(); 1153 return m_cueBackgroundBox->executionContext();
1182 } 1154 }
1183 1155
1184 Document& VTTCue::document() const 1156 Document& VTTCue::document() const
1185 { 1157 {
1186 ASSERT(m_cueBackgroundBox); 1158 ASSERT(m_cueBackgroundBox);
1187 return m_cueBackgroundBox->document(); 1159 return m_cueBackgroundBox->document();
1188 } 1160 }
1189 1161
1190 void VTTCue::trace(Visitor* visitor) 1162 void VTTCue::trace(Visitor* visitor)
1191 { 1163 {
1192 visitor->trace(m_vttNodeTree); 1164 visitor->trace(m_vttNodeTree);
1193 visitor->trace(m_cueBackgroundBox); 1165 visitor->trace(m_cueBackgroundBox);
1194 visitor->trace(m_displayTree); 1166 visitor->trace(m_displayTree);
1195 TextTrackCue::trace(visitor); 1167 TextTrackCue::trace(visitor);
1196 } 1168 }
1197 1169
1198 } // namespace blink 1170 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/html/track/vtt/VTTCue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698