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

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

Issue 851933003: WebVTT: Support 'auto' text position (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix test nits. 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') | Source/core/html/track/vtt/VTTCue.idl » ('j') | 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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 { 217 {
218 visitor->trace(m_cue); 218 visitor->trace(m_cue);
219 HTMLDivElement::trace(visitor); 219 HTMLDivElement::trace(visitor);
220 } 220 }
221 221
222 VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin g& text) 222 VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin g& text)
223 : TextTrackCue(startTime, endTime) 223 : TextTrackCue(startTime, endTime)
224 , m_text(text) 224 , m_text(text)
225 , m_linePosition(std::numeric_limits<float>::quiet_NaN()) 225 , m_linePosition(std::numeric_limits<float>::quiet_NaN())
226 , m_computedLinePosition(std::numeric_limits<float>::quiet_NaN()) 226 , m_computedLinePosition(std::numeric_limits<float>::quiet_NaN())
227 , m_textPosition(50) 227 , m_textPosition(std::numeric_limits<float>::quiet_NaN())
228 , m_cueSize(100) 228 , m_cueSize(100)
229 , m_writingDirection(Horizontal) 229 , m_writingDirection(Horizontal)
230 , m_cueAlignment(Middle) 230 , m_cueAlignment(Middle)
231 , m_vttNodeTree(nullptr) 231 , m_vttNodeTree(nullptr)
232 , m_cueBackgroundBox(HTMLDivElement::create(document)) 232 , m_cueBackgroundBox(HTMLDivElement::create(document))
233 , m_displayDirection(CSSValueLtr) 233 , m_displayDirection(CSSValueLtr)
234 , m_displaySize(undefinedSize) 234 , m_displaySize(undefinedSize)
235 , m_snapToLines(true) 235 , m_snapToLines(true)
236 , m_displayTreeShouldChange(true) 236 , m_displayTreeShouldChange(true)
237 , m_notifyRegion(true) 237 , m_notifyRegion(true)
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 if (m_linePosition == floatPosition) 354 if (m_linePosition == floatPosition)
355 return; 355 return;
356 } 356 }
357 357
358 cueWillChange(); 358 cueWillChange();
359 m_linePosition = floatPosition; 359 m_linePosition = floatPosition;
360 m_computedLinePosition = calculateComputedLinePosition(); 360 m_computedLinePosition = calculateComputedLinePosition();
361 cueDidChange(); 361 cueDidChange();
362 } 362 }
363 363
364 void VTTCue::setPosition(double position, ExceptionState& exceptionState) 364 bool VTTCue::textPositionIsAuto() const
365 { 365 {
366 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-ele ment.html#dom-texttrackcue-position 366 return std::isnan(m_textPosition);
367 // On setting, if the new value is negative or greater than 100, then throw an IndexSizeError exception. 367 }
368 // Otherwise, set the text track cue text position to the new value. 368
369 if (isInvalidPercentage(position, exceptionState)) 369 void VTTCue::position(DoubleOrAutoKeyword& result) const
370 {
371 if (textPositionIsAuto())
372 result.setAutoKeyword(autoKeyword());
373 else
374 result.setDouble(m_textPosition);
375 }
376
377 void VTTCue::setPosition(const DoubleOrAutoKeyword& position, ExceptionState& ex ceptionState)
378 {
379 // FIXME: Expecting bindings code to handle this case: https://crbug.com/450 252.
380 if (position.isDouble() && !std::isfinite(position.getAsDouble())) {
381 exceptionState.throwTypeError("The provided double value is non-finite." );
370 return; 382 return;
383 }
371 384
372 // Otherwise, set the text track cue line position to the new value. 385 // http://dev.w3.org/html5/webvtt/#dfn-vttcue-position
373 float floatPosition = narrowPrecisionToFloat(position); 386 // On setting, if the new value is negative or greater than 100, then an
374 if (m_textPosition == floatPosition) 387 // IndexSizeError exception must be thrown. Otherwise, the text track cue
375 return; 388 // text position must be set to the new value; if the new value is the
389 // string "auto", then it must be interpreted as the special value auto.
390 float floatPosition;
391 if (position.isAutoKeyword()) {
392 if (textPositionIsAuto())
393 return;
394 floatPosition = std::numeric_limits<float>::quiet_NaN();
395 } else {
396 ASSERT(position.isDouble());
397 if (isInvalidPercentage(position.getAsDouble(), exceptionState))
398 return;
399 floatPosition = narrowPrecisionToFloat(position.getAsDouble());
400 if (m_textPosition == floatPosition)
401 return;
402 }
376 403
377 cueWillChange(); 404 cueWillChange();
378 m_textPosition = floatPosition; 405 m_textPosition = floatPosition;
379 cueDidChange(); 406 cueDidChange();
380 } 407 }
381 408
382 void VTTCue::setSize(double size, ExceptionState& exceptionState) 409 void VTTCue::setSize(double size, ExceptionState& exceptionState)
383 { 410 {
384 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-ele ment.html#dom-texttrackcue-size 411 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-ele ment.html#dom-texttrackcue-size
385 // On setting, if the new value is negative or greater than 100, then throw an IndexSizeError 412 // On setting, if the new value is negative or greater than 100, then throw an IndexSizeError
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 node = NodeTraversal::nextSkippingChildren(*node); 624 node = NodeTraversal::nextSkippingChildren(*node);
598 continue; 625 continue;
599 } 626 }
600 } 627 }
601 628
602 node = NodeTraversal::next(*node); 629 node = NodeTraversal::next(*node);
603 } 630 }
604 return isLeftToRightDirection(textDirection) ? CSSValueLtr : CSSValueRtl; 631 return isLeftToRightDirection(textDirection) ? CSSValueLtr : CSSValueRtl;
605 } 632 }
606 633
634 float VTTCue::calculateComputedTextPosition() const
635 {
636 // http://dev.w3.org/html5/webvtt/#dfn-text-track-cue-computed-text-position
637
638 // 1. If the text track cue text position is numeric, then return the value
639 // of the text track cue text position and abort these steps. (Otherwise,
640 // the text track cue text position is the special value auto.)
641 if (!textPositionIsAuto())
642 return m_textPosition;
643
644 switch (m_cueAlignment) {
645 // 2. If the text track cue text alignment is start or left, return 0 and ab ort these steps.
646 case Start:
647 case Left:
648 return 0;
649 // 3. If the text track cue text alignment is end or right, return 100 and a bort these steps.
650 case End:
651 case Right:
652 return 100;
653 // 4. If the text track cue text alignment is middle, return 50 and abort th ese steps.
654 case Middle:
655 return 50;
656 default:
657 ASSERT_NOT_REACHED();
658 return 0;
659 }
660 }
661
607 static inline VTTCue::CueAlignment resolveCueAlignment(VTTCue::CueAlignment spec ifiedCueAlignment, CSSValueID direction) 662 static inline VTTCue::CueAlignment resolveCueAlignment(VTTCue::CueAlignment spec ifiedCueAlignment, CSSValueID direction)
608 { 663 {
609 ASSERT(direction == CSSValueLtr || direction == CSSValueRtl); 664 ASSERT(direction == CSSValueLtr || direction == CSSValueRtl);
610 switch (specifiedCueAlignment) { 665 switch (specifiedCueAlignment) {
611 case VTTCue::Start: 666 case VTTCue::Start:
612 return direction == CSSValueLtr ? VTTCue::Left : VTTCue::Right; 667 return direction == CSSValueLtr ? VTTCue::Left : VTTCue::Right;
613 case VTTCue::End: 668 case VTTCue::End:
614 return direction == CSSValueLtr ? VTTCue::Right : VTTCue::Left; 669 return direction == CSSValueLtr ? VTTCue::Right : VTTCue::Left;
615 default: 670 default:
616 return specifiedCueAlignment; 671 return specifiedCueAlignment;
(...skipping 13 matching lines...) Expand all
630 // 10.4 If the text track cue writing direction is horizontal, then let 685 // 10.4 If the text track cue writing direction is horizontal, then let
631 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is 686 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is
632 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text 687 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text
633 // track cue writing direction is vertical growing right; let block-flow be 688 // track cue writing direction is vertical growing right; let block-flow be
634 // 'rl'. 689 // 'rl'.
635 690
636 // The above step is done through the writing direction static map. 691 // The above step is done through the writing direction static map.
637 692
638 // 10.5 Determine the value of maximum size for cue as per the appropriate 693 // 10.5 Determine the value of maximum size for cue as per the appropriate
639 // rules from the following list: 694 // rules from the following list:
640 float maximumSize = m_textPosition; 695 float computedTextPosition = calculateComputedTextPosition();
696 float maximumSize = computedTextPosition;
641 if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displa yDirection == CSSValueLtr) 697 if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displa yDirection == CSSValueLtr)
642 || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displ ayDirection == CSSValueRtl) 698 || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displ ayDirection == CSSValueRtl)
643 || (m_writingDirection == Horizontal && m_cueAlignment == Left) 699 || (m_writingDirection == Horizontal && m_cueAlignment == Left)
644 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == Star t || m_cueAlignment == Left)) 700 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == Star t || m_cueAlignment == Left))
645 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == Sta rt || m_cueAlignment == Left))) { 701 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == Sta rt || m_cueAlignment == Left))) {
646 maximumSize = 100 - m_textPosition; 702 maximumSize = 100 - computedTextPosition;
647 } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_d isplayDirection == CSSValueLtr) 703 } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_d isplayDirection == CSSValueLtr)
648 || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_dis playDirection == CSSValueRtl) 704 || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_dis playDirection == CSSValueRtl)
649 || (m_writingDirection == Horizontal && m_cueAlignment == Right) 705 || (m_writingDirection == Horizontal && m_cueAlignment == Right)
650 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == End || m_cueAlignment == Right)) 706 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == End || m_cueAlignment == Right))
651 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == End || m_cueAlignment == Right))) { 707 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == End || m_cueAlignment == Right))) {
652 maximumSize = m_textPosition; 708 maximumSize = computedTextPosition;
653 } else if (m_cueAlignment == Middle) { 709 } else if (m_cueAlignment == Middle) {
654 maximumSize = m_textPosition <= 50 ? m_textPosition : (100 - m_textPosit ion); 710 maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition);
655 maximumSize = maximumSize * 2; 711 maximumSize = maximumSize * 2;
656 } else { 712 } else {
657 ASSERT_NOT_REACHED(); 713 ASSERT_NOT_REACHED();
658 } 714 }
659 715
660 // 10.6 If the text track cue size is less than maximum size, then let size 716 // 10.6 If the text track cue size is less than maximum size, then let size
661 // be text track cue size. Otherwise, let size be maximum size. 717 // be text track cue size. Otherwise, let size be maximum size.
662 m_displaySize = std::min(m_cueSize, maximumSize); 718 m_displaySize = std::min(m_cueSize, maximumSize);
663 719
664 // FIXME: Understand why step 10.7 is missing (just a copy/paste error?) 720 // FIXME: Understand why step 10.7 is missing (just a copy/paste error?)
665 // Could be done within a spec implementation check - http://crbug.com/30158 0 721 // Could be done within a spec implementation check - http://crbug.com/30158 0
666 722
667 // 10.8 Determine the value of x-position or y-position for cue as per the 723 // 10.8 Determine the value of x-position or y-position for cue as per the
668 // appropriate rules from the following list: 724 // appropriate rules from the following list:
669 if (m_writingDirection == Horizontal) { 725 if (m_writingDirection == Horizontal) {
670 float visualTextPosition = m_displayDirection == CSSValueLtr ? m_textPos ition : 100 - m_textPosition; 726 float visualTextPosition = m_displayDirection == CSSValueLtr ? computedT extPosition : 100 - computedTextPosition;
671 727
672 switch (resolveCueAlignment(m_cueAlignment, m_displayDirection)) { 728 switch (resolveCueAlignment(m_cueAlignment, m_displayDirection)) {
673 case Left: 729 case Left:
674 m_displayPosition.setX(visualTextPosition); 730 m_displayPosition.setX(visualTextPosition);
675 break; 731 break;
676 case Right: 732 case Right:
677 m_displayPosition.setX(visualTextPosition - m_displaySize); 733 m_displayPosition.setX(visualTextPosition - m_displaySize);
678 break; 734 break;
679 case Middle: 735 case Middle:
680 m_displayPosition.setX(visualTextPosition - m_displaySize / 2); 736 m_displayPosition.setX(visualTextPosition - m_displaySize / 2);
681 break; 737 break;
682 default: 738 default:
683 ASSERT_NOT_REACHED(); 739 ASSERT_NOT_REACHED();
684 } 740 }
685 } else { 741 } else {
686 // Cases for m_writingDirection being VerticalGrowing{Left|Right} 742 // Cases for m_writingDirection being VerticalGrowing{Left|Right}
687 switch (m_cueAlignment) { 743 switch (m_cueAlignment) {
688 case Start: 744 case Start:
689 case Left: 745 case Left:
690 m_displayPosition.setY(m_textPosition); 746 m_displayPosition.setY(computedTextPosition);
691 break; 747 break;
692 case End: 748 case End:
693 case Right: 749 case Right:
694 m_displayPosition.setY(m_textPosition - m_displaySize); 750 m_displayPosition.setY(computedTextPosition - m_displaySize);
695 break; 751 break;
696 case Middle: 752 case Middle:
697 m_displayPosition.setY(m_textPosition - m_displaySize / 2); 753 m_displayPosition.setY(computedTextPosition - m_displaySize / 2);
698 break; 754 break;
699 default: 755 default:
700 ASSERT_NOT_REACHED(); 756 ASSERT_NOT_REACHED();
701 } 757 }
702 } 758 }
703 759
704 // A text track cue has a text track cue computed line position whose value 760 // A text track cue has a text track cue computed line position whose value
705 // is defined in terms of the other aspects of the cue. 761 // is defined in terms of the other aspects of the cue.
706 m_computedLinePosition = calculateComputedLinePosition(); 762 m_computedLinePosition = calculateComputedLinePosition();
707 763
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 885
830 if (m_writingDirection != Horizontal) 886 if (m_writingDirection != Horizontal)
831 UseCounter::count(document(), UseCounter::VTTCueRenderVertical); 887 UseCounter::count(document(), UseCounter::VTTCueRenderVertical);
832 888
833 if (!m_snapToLines) 889 if (!m_snapToLines)
834 UseCounter::count(document(), UseCounter::VTTCueRenderSnapToLinesFalse); 890 UseCounter::count(document(), UseCounter::VTTCueRenderSnapToLinesFalse);
835 891
836 if (!lineIsAuto()) 892 if (!lineIsAuto())
837 UseCounter::count(document(), UseCounter::VTTCueRenderLineNotAuto); 893 UseCounter::count(document(), UseCounter::VTTCueRenderLineNotAuto);
838 894
839 if (m_textPosition != 50) 895 if (textPositionIsAuto())
840 UseCounter::count(document(), UseCounter::VTTCueRenderPositionNot50); 896 UseCounter::count(document(), UseCounter::VTTCueRenderPositionNot50);
841 897
842 if (m_cueSize != 100) 898 if (m_cueSize != 100)
843 UseCounter::count(document(), UseCounter::VTTCueRenderSizeNot100); 899 UseCounter::count(document(), UseCounter::VTTCueRenderSizeNot100);
844 900
845 if (m_cueAlignment != Middle) 901 if (m_cueAlignment != Middle)
846 UseCounter::count(document(), UseCounter::VTTCueRenderAlignNotMiddle); 902 UseCounter::count(document(), UseCounter::VTTCueRenderAlignNotMiddle);
847 903
848 RefPtrWillBeRawPtr<VTTCueBox> displayBox = getDisplayTree(videoSize); 904 RefPtrWillBeRawPtr<VTTCueBox> displayBox = getDisplayTree(videoSize);
849 VTTRegion* region = 0; 905 VTTRegion* region = 0;
(...skipping 18 matching lines...) Expand all
868 container.appendChild(regionNode); 924 container.appendChild(regionNode);
869 925
870 region->appendVTTCueBox(displayBox); 926 region->appendVTTCueBox(displayBox);
871 } 927 }
872 } 928 }
873 929
874 FloatPoint VTTCue::getPositionCoordinates() const 930 FloatPoint VTTCue::getPositionCoordinates() const
875 { 931 {
876 // This method is used for setting x and y when snap to lines is not set. 932 // This method is used for setting x and y when snap to lines is not set.
877 ASSERT(std::isfinite(m_computedLinePosition)); 933 ASSERT(std::isfinite(m_computedLinePosition));
934 float computedTextPosition = calculateComputedTextPosition();
878 935
879 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueLtr) 936 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueLtr)
880 return FloatPoint(m_textPosition, m_computedLinePosition); 937 return FloatPoint(computedTextPosition, m_computedLinePosition);
881 938
882 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueRtl) 939 if (m_writingDirection == Horizontal && m_displayDirection == CSSValueRtl)
883 return FloatPoint(100 - m_textPosition, m_computedLinePosition); 940 return FloatPoint(100 - computedTextPosition, m_computedLinePosition);
884 941
885 if (m_writingDirection == VerticalGrowingLeft) 942 if (m_writingDirection == VerticalGrowingLeft)
886 return FloatPoint(100 - m_computedLinePosition, m_textPosition); 943 return FloatPoint(100 - m_computedLinePosition, computedTextPosition);
887 944
888 if (m_writingDirection == VerticalGrowingRight) 945 if (m_writingDirection == VerticalGrowingRight)
889 return FloatPoint(m_computedLinePosition, m_textPosition); 946 return FloatPoint(m_computedLinePosition, computedTextPosition);
890 947
891 ASSERT_NOT_REACHED(); 948 ASSERT_NOT_REACHED();
892 return FloatPoint(); 949 return FloatPoint();
893 } 950 }
894 951
895 VTTCue::CueSetting VTTCue::settingName(VTTScanner& input) 952 VTTCue::CueSetting VTTCue::settingName(VTTScanner& input)
896 { 953 {
897 CueSetting parsedSetting = None; 954 CueSetting parsedSetting = None;
898 if (input.scan("vertical")) 955 if (input.scan("vertical"))
899 parsedSetting = Vertical; 956 parsedSetting = Vertical;
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 1188
1132 void VTTCue::trace(Visitor* visitor) 1189 void VTTCue::trace(Visitor* visitor)
1133 { 1190 {
1134 visitor->trace(m_vttNodeTree); 1191 visitor->trace(m_vttNodeTree);
1135 visitor->trace(m_cueBackgroundBox); 1192 visitor->trace(m_cueBackgroundBox);
1136 visitor->trace(m_displayTree); 1193 visitor->trace(m_displayTree);
1137 TextTrackCue::trace(visitor); 1194 TextTrackCue::trace(visitor);
1138 } 1195 }
1139 1196
1140 } // namespace blink 1197 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/html/track/vtt/VTTCue.h ('k') | Source/core/html/track/vtt/VTTCue.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698