Changeset 126233 in webkit
- Timestamp:
- Aug 21, 2012 5:19:48 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 15 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r126229 r126233 1 2012-08-21 Victor Carbune <victor@rosedu.org> 2 3 Display a TextTrackCue when snap-to-lines flag is set 4 https://bugs.webkit.org/show_bug.cgi?id=79751 5 6 Reviewed by Tony Chang. 7 8 Test cases covering snap-to-lines horizontal and vertical positioning of cues. 9 10 * media/track/captions-webvtt/captions-snap-to-lines-set.vtt: Added. 11 * media/track/track-cue-rendering-horizontal.html: Added. 12 * media/track/track-cue-rendering-snap-to-lines-not-set-expected.txt: Updated. 13 * media/track/track-cue-rendering-vertical.html: Added. 14 * media/video-test.js: Updated to support pixel test dumps. 15 * platform/chromium-linux/media/track/track-cue-rendering-horizontal-expected.png: Added. 16 * platform/chromium-linux/media/track/track-cue-rendering-horizontal-expected.txt: Added. 17 * platform/chromium-linux/media/track/track-cue-rendering-vertical-expected.png: Added. 18 * platform/chromium-linux/media/track/track-cue-rendering-vertical-expected.txt: Added. 19 * platform/chromium/TestExpectations: Marking these temporarily as IMAGE fail, as they will 20 anyway require new baselines. 21 * platform/mac/media/track/track-cue-rendering-horizontal-expected.png: Added. 22 * platform/mac/media/track/track-cue-rendering-horizontal-expected.txt: Added. 23 * platform/mac/media/track/track-cue-rendering-vertical-expected.png: Added. 24 * platform/mac/media/track/track-cue-rendering-vertical-expected.txt: Added. 25 1 26 2012-08-21 Zan Dobersek <zandobersek@gmail.com> 2 27 -
trunk/LayoutTests/media/track/track-cue-rendering-snap-to-lines-not-set-expected.txt
r114640 r126233 13 13 EXPECTED (cueDisplayElement.innerText == 'This is a demo track to illustrate positioning features of cues.') OK 14 14 Cue left position (percentage): 0 15 Cue top position (percentage): 10015 Cue top position (percentage): 81 16 16 17 17 ** Center ** -
trunk/LayoutTests/media/video-test.js
r120416 r126233 15 15 16 16 if (window.testRunner) { 17 testRunner.dumpAsText(); 17 // Some track element rendering tests require text pixel dump. 18 if (typeof requirePixelDump == "undefined") 19 testRunner.dumpAsText(); 20 18 21 testRunner.waitUntilDone(); 19 22 } -
trunk/LayoutTests/platform/chromium/TestExpectations
r126192 r126233 3453 3453 BUGWK93488 SKIP : fast/notifications/notifications-permission.html = TEXT 3454 3454 3455 BUGWK79751 : media/track/track-cue-rendering-horizontal.html = IMAGE 3456 BUGWK79751 : media/track/track-cue-rendering-vertical.html = IMAGE 3457 3455 3458 // Flaky 3456 3459 BUGWK93799 MAC : fast/dom/HTMLMeterElement/meter-element-repaint-on-update-value.html = PASS IMAGE -
trunk/Source/WebCore/CMakeLists.txt
r125866 r126233 2083 2083 rendering/RenderTextControlSingleLine.cpp 2084 2084 rendering/RenderTextFragment.cpp 2085 rendering/RenderTextTrackCue.cpp 2085 2086 rendering/RenderTheme.cpp 2086 2087 rendering/RenderTreeAsText.cpp -
trunk/Source/WebCore/ChangeLog
r126230 r126233 1 2012-08-21 Victor Carbune <victor@rosedu.org> 2 3 Display a TextTrackCue when snap-to-lines flag is set 4 https://bugs.webkit.org/show_bug.cgi?id=79751 5 6 Reviewed by Tony Chang. 7 8 This patch implements rendering functionality for a given text track, 9 following closer the exact WebVTT specification. There are two new classes 10 which have been added in order to succesfully cover rendering when of a text 11 track cue. 12 13 RenderTextTrackCue handles the specific rendering algorithm required, 14 by checking for overlaps with other boxes that are in the same 15 container (these can be any other boxes, not necessarily other cues, 16 the video controls, for example). 17 18 TextTrackCueBox extends HTMLDivElement and is an intermediate layer 19 between the renderer class and the actual cue object. Its purpose is 20 to instantiate the particular renderer and cover all the default CSS 21 styling that needs to be applied to the cue. 22 23 The layout is done in two steps: 24 - Step 1: Layout the TextTrackCue with default CSS properties set (this is 25 the TextTrackCueBox decorated with the respective CSS elements) 26 - Step 2: RenderTextTrackCue adjusts the box position depending on the 27 parameters of the TextTrackCue object and the overlaps that may occur with 28 previously positioned cues. 29 30 Tests: media/track/track-cue-rendering-horizontal.html 31 media/track/track-cue-rendering-vertical.html 32 33 * CMakeLists.txt: Updated to include RenderTextTrackCue. 34 * GNUmakefile.list.am: Updated to include RenderTextTrackCue. 35 * Target.pri: Updated to include RenderTextTrackCue. 36 * WebCore.gypi: Updated to include RenderTextTrackCue. 37 * WebCore.vcproj/WebCore.vcproj: Updated to include RenderTextTrackCue. 38 * WebCore.xcodeproj/project.pbxproj: Updated to include RenderTextTrackCue. 39 * css/mediaControls.css: Removed unreliable CSS. 40 (video::-webkit-media-text-track-display): Removed properties. 41 * html/shadow/MediaControlElements.cpp: Updated to not use the new class. 42 (RenderTextTrackContainerElement): 43 (WebCore::MediaControlTextTrackContainerElement::updateDisplay): Simplified 44 the function by moving the check if track is rendered in TextTrack and used 45 the TextTrackCueBox for cues. 46 * html/track/TextTrack.cpp: Added a new method. 47 (WebCore::TextTrack::isRendered): Method that returns whether the track should 48 be rendered or not. 49 (WebCore): 50 * html/track/TextTrack.h: Added the isRendered method. 51 (TextTrack): 52 * html/track/TextTrackCue.cpp: Added several helper methods and 53 the TextTrackCueBox. 54 (WebCore): 55 (WebCore::TextTrackCueBox::TextTrackCueBox): The TextTrackCueBox extends 56 the HTMLDivElement and represents a bridge class between RenderTextTrackCue 57 and TextTrackCue. This is required as the layout is done in two steps, as 58 explained on top of the ChangeLog entry. 59 (WebCore::TextTrackCueBox::getCue): Returns the associated TextTrackCue object. 60 (WebCore::TextTrackCueBox::applyCSSProperties): Applies a part of the default CSS 61 properties, as defined by section 3.5.1 of the WebVTT specification. 62 (WebCore::TextTrackCueBox::shadowPseudoId): Moved the shadow pseudo id. 63 (WebCore::TextTrackCueBox::createRenderer): Creates the particular renderer. 64 (WebCore::TextTrackCue::TextTrackCue): Corrected the internal writing mode map. 65 (WebCore::TextTrackCue::calculateComputedLinePosition): Updated the compute line 66 position algorithm. This requires, however, a method to consider only rendered 67 tracks (and therefore will be addressed completely in subsequent changeset). 68 (WebCore::TextTrackCue::calculateDisplayParameters): Updated and corrected the 69 computed display parameters to match the current specification. 70 (WebCore::TextTrackCue::getDisplayTree): Update to use the TextTrackCueBox class 71 and moved CSS application to the respective class. 72 (WebCore::TextTrackCue::getPositionCoordinates): Added comment to specify in which 73 situation this method is used and change visibility to private. 74 (WebCore::TextTrackCue::getCSSWritingMode): Returns the CSS writing mode corresponding 75 to the cue writing mode. 76 (WebCore::TextTrackCue::getCSSSize): Returns the cue width / height (depending on the 77 writing direction. 78 (WebCore::TextTrackCue::getCSSPosition): Returns the default display position, that is 79 used in the first layout step. 80 * html/track/TextTrackCue.h: 81 (WebCore): 82 (TextTrackCueBox): 83 (WebCore::TextTrackCueBox::create): Initialization method. 84 (TextTrackCue): 85 (WebCore::TextTrackCue::getWritingDirection): Helper method to return the internal 86 values used to represent the writing direction. 87 * rendering/RenderTextTrackCue.cpp: Added. 88 (WebCore): 89 (WebCore::RenderTextTrackCue::RenderTextTrackCue): 90 (WebCore::RenderTextTrackCue::layout): The rendering steps, as mentioned in 91 the WebVTT rendering rules. Currently, this treats only the snap-to-lines set 92 case. It is implemented following closely the spec, and might be subject to 93 change as discussions on various bugs evolve. 94 (WebCore::RenderTextTrackCue::initializeLayoutParameters): Steps 1 - 7. 95 (WebCore::RenderTextTrackCue::placeBoxInDefaultPosition): Steps 8 - 10. 96 (WebCore::RenderTextTrackCue::isOutside): Inline method to check if the cue is outside. 97 (WebCore::RenderTextTrackCue::isOverlapping): Inline method to check if the cue overlaps other boxes. 98 (WebCore::RenderTextTrackCue::shouldSwitchDirection): Step 12. 99 (WebCore::RenderTextTrackCue::moveBoxesByStep): Step 13. 100 (WebCore::RenderTextTrackCue::switchDirection): Steps 15 - 18. 101 (WebCore::RenderTextTrackCue::repositionCueSnapToLinesSet): Cue repositioning 102 for text track cue when the snap to lines flag is set. 103 (WebCore::RenderTextTrackCue::repositionCueSnapToLinesNotSet): Cue repositioning 104 for text track cue when the snap to lines flag is not set. Not implemented yet. 105 * rendering/RenderTextTrackCue.h: Added. 106 (WebCore): 107 (RenderTextTrackCue): Rendering class, handling the display of cues. 108 1 109 2012-08-21 Lianghui Chen <liachen@rim.com> 2 110 -
trunk/Source/WebCore/GNUmakefile.list.am
r126182 r126233 4982 4982 Source/WebCore/rendering/RenderTextControlSingleLine.h \ 4983 4983 Source/WebCore/rendering/RenderText.cpp \ 4984 Source/WebCore/rendering/RenderTextTrackCue.cpp \ 4985 Source/WebCore/rendering/RenderTextTrackCue.h \ 4984 4986 Source/WebCore/rendering/RenderTextFragment.cpp \ 4985 4987 Source/WebCore/rendering/RenderTextFragment.h \ -
trunk/Source/WebCore/Target.pri
r125894 r126233 1174 1174 rendering/RenderTextControlSingleLine.cpp \ 1175 1175 rendering/RenderTextFragment.cpp \ 1176 rendering/RenderTextTrackCue.cpp \ 1176 1177 rendering/RenderTheme.cpp \ 1177 1178 rendering/RenderTreeAsText.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r126222 r126233 4818 4818 'rendering/RenderTextFragment.cpp', 4819 4819 'rendering/RenderTextFragment.h', 4820 'rendering/RenderTextTrackCue.cpp', 4821 'rendering/RenderTextTrackCue.h', 4820 4822 'rendering/RenderTheme.cpp', 4821 4823 'rendering/RenderTheme.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r126193 r126233 43764 43764 </File> 43765 43765 <File 43766 RelativePath="..\rendering\RenderTextTrackCue.cpp" 43767 > 43768 <FileConfiguration 43769 Name="Debug|Win32" 43770 ExcludedFromBuild="true" 43771 > 43772 <Tool 43773 Name="VCCLCompilerTool" 43774 /> 43775 </FileConfiguration> 43776 <FileConfiguration 43777 Name="Release|Win32" 43778 ExcludedFromBuild="true" 43779 > 43780 <Tool 43781 Name="VCCLCompilerTool" 43782 /> 43783 </FileConfiguration> 43784 <FileConfiguration 43785 Name="Debug_Cairo_CFLite|Win32" 43786 ExcludedFromBuild="true" 43787 > 43788 <Tool 43789 Name="VCCLCompilerTool" 43790 /> 43791 </FileConfiguration> 43792 <FileConfiguration 43793 Name="Release_Cairo_CFLite|Win32" 43794 ExcludedFromBuild="true" 43795 > 43796 <Tool 43797 Name="VCCLCompilerTool" 43798 /> 43799 </FileConfiguration> 43800 <FileConfiguration 43801 Name="Debug_All|Win32" 43802 ExcludedFromBuild="true" 43803 > 43804 <Tool 43805 Name="VCCLCompilerTool" 43806 /> 43807 </FileConfiguration> 43808 <FileConfiguration 43809 Name="Production|Win32" 43810 ExcludedFromBuild="true" 43811 > 43812 <Tool 43813 Name="VCCLCompilerTool" 43814 /> 43815 </FileConfiguration> 43816 </File> 43817 <File 43818 RelativePath="..\rendering\RenderTextTrackCue.h" 43819 > 43820 </File> 43821 <File 43766 43822 RelativePath="..\rendering\RenderTheme.cpp" 43767 43823 > -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r126012 r126233 2943 2943 86BE340415058CB200CE0FD8 /* PerformanceEntryList.h in Headers */ = {isa = PBXBuildFile; fileRef = 86BE33FE15058CB200CE0FD8 /* PerformanceEntryList.h */; }; 2944 2944 86D982F7125C154000AD9E3D /* DocumentTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D982F6125C154000AD9E3D /* DocumentTiming.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2945 86FF886115DE3D0700BD6B28 /* RenderTextTrackCue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86FF885E15DE3B8200BD6B28 /* RenderTextTrackCue.cpp */; }; 2946 86FF886215DE3D0700BD6B28 /* RenderTextTrackCue.h in Headers */ = {isa = PBXBuildFile; fileRef = 86FF885F15DE3B8200BD6B28 /* RenderTextTrackCue.h */; }; 2945 2947 890AE0E11256A07900F5968C /* DirectoryReaderBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 890AE0E01256A07900F5968C /* DirectoryReaderBase.h */; }; 2946 2948 8931DE5B14C44C44000DC9D2 /* JSBlobCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8931DE5A14C44C44000DC9D2 /* JSBlobCustom.cpp */; }; … … 10077 10079 86BE33FF15058CB200CE0FD8 /* PerformanceEntryList.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PerformanceEntryList.idl; sourceTree = "<group>"; }; 10078 10080 86D982F6125C154000AD9E3D /* DocumentTiming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentTiming.h; sourceTree = "<group>"; }; 10081 86FF885E15DE3B8200BD6B28 /* RenderTextTrackCue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTextTrackCue.cpp; sourceTree = "<group>"; }; 10082 86FF885F15DE3B8200BD6B28 /* RenderTextTrackCue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTextTrackCue.h; sourceTree = "<group>"; }; 10079 10083 890AE0E01256A07900F5968C /* DirectoryReaderBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryReaderBase.h; path = Modules/filesystem/DirectoryReaderBase.h; sourceTree = "<group>"; }; 10080 10084 8931DE5A14C44C44000DC9D2 /* JSBlobCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSBlobCustom.cpp; sourceTree = "<group>"; }; … … 21417 21421 BCEA484E097D93020094C9E4 /* RenderTextFragment.cpp */, 21418 21422 BCEA484F097D93020094C9E4 /* RenderTextFragment.h */, 21423 86FF885E15DE3B8200BD6B28 /* RenderTextTrackCue.cpp */, 21424 86FF885F15DE3B8200BD6B28 /* RenderTextTrackCue.h */, 21419 21425 BCEA484A097D93020094C9E4 /* RenderTheme.cpp */, 21420 21426 BCEA484B097D93020094C9E4 /* RenderTheme.h */, … … 24659 24665 083DAEA90F01A7FB00342754 /* RenderTextControlSingleLine.h in Headers */, 24660 24666 BCEA488E097D93020094C9E4 /* RenderTextFragment.h in Headers */, 24667 86FF886215DE3D0700BD6B28 /* RenderTextTrackCue.h in Headers */, 24661 24668 BCEA488A097D93020094C9E4 /* RenderTheme.h in Headers */, 24662 24669 BCEA4887097D93020094C9E4 /* RenderThemeMac.h in Headers */, … … 27861 27868 083DAEA80F01A7FB00342754 /* RenderTextControlSingleLine.cpp in Sources */, 27862 27869 BCEA488D097D93020094C9E4 /* RenderTextFragment.cpp in Sources */, 27870 86FF886115DE3D0700BD6B28 /* RenderTextTrackCue.cpp in Sources */, 27863 27871 BCEA4889097D93020094C9E4 /* RenderTheme.cpp in Sources */, 27864 27872 BCEA4888097D93020094C9E4 /* RenderThemeMac.mm in Sources */, -
trunk/Source/WebCore/css/mediaControls.css
r123969 r126233 254 254 position: absolute; 255 255 color: rgba(255, 255, 255, 1); 256 257 top: 100%; 258 -webkit-transform: translate(0%, -100%); 259 } 256 } -
trunk/Source/WebCore/html/shadow/MediaControlElements.cpp
r124022 r126233 33 33 #include "MediaControlElements.h" 34 34 35 #include "CSSStyleDeclaration.h" 35 36 #include "CSSValueKeywords.h" 36 37 #include "DOMTokenList.h" 37 38 #include "EventNames.h" 38 39 #include "FloatConversion.h" 40 #include "FloatPoint.h" 39 41 #include "Frame.h" 42 #include "HTMLDivElement.h" 40 43 #include "HTMLMediaElement.h" 41 44 #include "HTMLNames.h" 42 45 #include "HTMLVideoElement.h" 46 #include "LayoutRepainter.h" 43 47 #include "LocalizedStrings.h" 44 48 #include "MediaControls.h" … … 46 50 #include "Page.h" 47 51 #include "RenderDeprecatedFlexibleBox.h" 52 #include "RenderInline.h" 48 53 #include "RenderMedia.h" 49 54 #include "RenderSlider.h" 55 #include "RenderText.h" 50 56 #include "RenderTheme.h" 51 57 #include "RenderVideo.h" … … 1259 1265 public: 1260 1266 RenderTextTrackContainerElement(Node*); 1261 1267 1262 1268 private: 1263 1269 virtual void layout(); … … 1353 1359 // corresponding CSS boxes added to output, in text track cue order, run the 1354 1360 // following substeps: 1355 1356 // Simple renderer for now.1357 1361 for (size_t i = 0; i < activeCues.size(); ++i) { 1358 1362 TextTrackCue* cue = activeCues[i].data(); 1359 1363 1360 1364 ASSERT(cue->isActive()); 1361 if ( cue->track()->kind() != TextTrack::captionsKeyword() && cue->track()->kind() != TextTrack::subtitlesKeyword())1365 if (!cue->track() || !cue->track()->isRendered()) 1362 1366 continue; 1363 1367 1364 if (!cue->track() || cue->track()->mode() != TextTrack::SHOWING) 1365 continue; 1366 1367 RefPtr<HTMLDivElement> displayTree = cue->getDisplayTree(); 1368 1369 // Append only new display trees. 1370 if (displayTree->hasChildNodes() && !contains(displayTree.get())) 1371 appendChild(displayTree, ASSERT_NO_EXCEPTION, true); 1372 1373 // Note: the display tree of a cue is removed when the active flag of the cue is unset. 1374 1375 // FIXME(BUG 79751): Render the TextTrackCue when snap-to-lines is set. 1376 1377 // FIXME(BUG 84296): Implement overlapping detection for cue boxes when snap-to-lines is not set. 1368 RefPtr<TextTrackCueBox> displayBox = cue->getDisplayTree(); 1369 1370 if (displayBox->hasChildNodes() && !contains(static_cast<Node*>(displayBox.get()))) 1371 // Note: the display tree of a cue is removed when the active flag of the cue is unset. 1372 appendChild(displayBox, ASSERT_NO_EXCEPTION, false); 1378 1373 } 1379 1374 -
trunk/Source/WebCore/html/track/TextTrack.cpp
r124645 r126233 295 295 } 296 296 297 bool TextTrack::isRendered() 298 { 299 if (m_kind != captionsKeyword() && m_kind != subtitlesKeyword()) 300 return false; 301 302 if (m_mode != SHOWING && !m_showingByDefault) 303 return false; 304 305 return true; 306 } 307 297 308 TextTrackCueList* TextTrack::ensureTextTrackCueList() 298 309 { -
trunk/Source/WebCore/html/track/TextTrack.h
r114171 r126233 111 111 void invalidateTrackIndex(); 112 112 113 bool isRendered(); 114 113 115 protected: 114 116 TextTrack(ScriptExecutionContext*, TextTrackClient*, const String& kind, const String& label, const String& language, TextTrackType); -
trunk/Source/WebCore/html/track/TextTrackCue.cpp
r124645 r126233 42 42 #include "HTMLDivElement.h" 43 43 #include "HTMLMediaElement.h" 44 #include "RenderTextTrackCue.h" 44 45 #include "Text.h" 45 46 #include "TextTrack.h" … … 88 89 return verticallr; 89 90 } 91 92 // ---------------------------- 93 94 TextTrackCueBox::TextTrackCueBox(Document* document, TextTrackCue* cue) 95 : HTMLElement(divTag, document) 96 , m_cue(cue) 97 { 98 } 99 100 TextTrackCue* TextTrackCueBox::getCue() const 101 { 102 return m_cue; 103 } 104 105 void TextTrackCueBox::applyCSSProperties() 106 { 107 // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916 108 109 // 3.5.1 On the (root) List of WebVTT Node Objects: 110 111 // the 'position' property must be set to 'absolute' 112 setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); 113 114 // the 'unicode-bidi' property must be set to 'plaintext' 115 setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); 116 117 // FIXME: Determine the text direction using the BIDI algorithm. http://wkb.ug/79749 118 // the 'direction' property must be set to direction 119 setInlineStyleProperty(CSSPropertyDirection, CSSValueLtr); 120 121 // the 'writing-mode' property must be set to writing-mode 122 setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue->getCSSWritingMode(), false); 123 124 std::pair<float, float> position = m_cue->getCSSPosition(); 125 126 // the 'top' property must be set to top, 127 setInlineStyleProperty(CSSPropertyTop, static_cast<double>(position.second), CSSPrimitiveValue::CSS_PERCENTAGE); 128 129 // the 'left' property must be set to left 130 setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(position.first), CSSPrimitiveValue::CSS_PERCENTAGE); 131 132 // the 'width' property must be set to width, and the 'height' property must be set to height 133 if (m_cue->vertical() == horizontalKeyword()) { 134 setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); 135 setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); 136 } else { 137 setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); 138 setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); 139 } 140 141 // The 'text-align' property on the (root) List of WebVTT Node Objects must 142 // be set to the value in the second cell of the row of the table below 143 // whose first cell is the value of the corresponding cue's text track cue 144 // alignment: 145 if (m_cue->align() == startKeyword()) 146 setInlineStyleProperty(CSSPropertyTextAlign, CSSValueStart); 147 else if (m_cue->align() == endKeyword()) 148 setInlineStyleProperty(CSSPropertyTextAlign, CSSValueEnd); 149 else 150 setInlineStyleProperty(CSSPropertyTextAlign, CSSValueCenter); 151 152 if (!m_cue->snapToLines()) { 153 // 10.13.1 Set up x and y: 154 // Note: x and y are set through the CSS left and top above. 155 156 // 10.13.2 Position the boxes in boxes such that the point x% along the 157 // width of the bounding box of the boxes in boxes is x% of the way 158 // across the width of the video's rendering area, and the point y% 159 // along the height of the bounding box of the boxes in boxes is y% 160 // of the way across the height of the video's rendering area, while 161 // maintaining the relative positions of the boxes in boxes to each 162 // other. 163 setInlineStyleProperty(CSSPropertyWebkitTransform, 164 String::format("translate(-%.2f%%, -%.2f%%)", position.first, position.second)); 165 166 setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); 167 } 168 } 169 170 const AtomicString& TextTrackCueBox::shadowPseudoId() const 171 { 172 DEFINE_STATIC_LOCAL(const AtomicString, trackDisplayBoxShadowPseudoId, ("-webkit-media-text-track-display")); 173 return trackDisplayBoxShadowPseudoId; 174 } 175 176 RenderObject* TextTrackCueBox::createRenderer(RenderArena* arena, RenderStyle*) 177 { 178 return new (arena) RenderTextTrackCue(this); 179 } 180 181 // ---------------------------- 90 182 91 183 TextTrackCue::TextTrackCue(ScriptExecutionContext* context, const String& id, double start, double end, const String& content, const String& settings, bool pauseOnExit) … … 110 202 , m_futureDocumentNodes(HTMLDivElement::create(static_cast<Document*>(context))) 111 203 , m_displayTreeShouldChange(true) 112 , m_displayTree(HTMLDivElement::create(static_cast<Document*>(context))) 113 , m_displayXPosition(undefinedPosition) 114 , m_displayYPosition(undefinedPosition) 204 , m_displayTree(TextTrackCueBox::create(static_cast<Document*>(m_scriptExecutionContext), this)) 115 205 { 116 206 ASSERT(m_scriptExecutionContext->isDocument()); 117 207 118 // The text track cue writing directions are directly relatd to the 119 // block-flow element, which can be set through the CSS writing modes. 208 // 4. If the text track cue writing direction is horizontal, then let 209 // writing-mode be 'horizontal-tb'. Otherwise, if the text track cue writing 210 // direction is vertical growing left, then let writing-mode be 211 // 'vertical-rl'. Otherwise, the text track cue writing direction is 212 // vertical growing right; let writing-mode be 'vertical-lr'. 120 213 m_displayWritingModeMap[Horizontal] = CSSValueHorizontalTb; 121 m_displayWritingModeMap[VerticalGrowingLeft] = CSSValueVertical Lr;122 m_displayWritingModeMap[VerticalGrowingRight] = CSSValueVertical Rl;214 m_displayWritingModeMap[VerticalGrowingLeft] = CSSValueVerticalRl; 215 m_displayWritingModeMap[VerticalGrowingRight] = CSSValueVerticalLr; 123 216 124 217 parseSettings(settings); … … 444 537 // Otherwise, it is the value returned by the following algorithm: 445 538 446 // FIXME(BUG 79751): Complete determination algorithm when it is actually 447 // used - when displaying a TextTrackCue having snap-to-lines flag set. 448 449 return 100; 539 // If cue is not associated with a text track, return -1 and abort these 540 // steps. 541 if (!track()) 542 return -1; 543 544 // Let n be the number of text tracks whose text track mode is showing or 545 // showing by default and that are in the media element's list of text 546 // tracks before track. 547 548 // FIXME: Add a method to cache the track index considering only 549 // rendered tracks (that have showing or showing by default mode set). 550 // http://wkb.ug/93779 551 int n = track()->trackIndex(); 552 553 // Increment n by one. 554 n++; 555 556 // Negate n. 557 n = -n; 558 559 return n; 450 560 } 451 561 … … 461 571 // track cue writing direction is vertical growing right; let block-flow be 462 572 // 'rl'. 463 464 573 m_displayWritingMode = m_displayWritingModeMap[m_writingDirection]; 465 574 … … 470 579 || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueRtl) 471 580 || (m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Start) 472 || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == End)) {581 || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Start)) { 473 582 maximumSize = 100 - m_textPosition; 474 583 } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueLtr) … … 486 595 m_displaySize = std::min(m_cueSize, maximumSize); 487 596 488 // 10.7 If the text track cue writing direction is horizontal, then let489 // width be 'size vw' and height be 'auto'. Otherwise, let width be 'auto'490 // and height be 'size vh'. (These are CSS values used by the next section491 // to set CSS properties for the rendering; 'vw' and 'vh' are CSS units.)492 m_displayWidth = m_writingDirection == Horizontal ? m_displaySize : autoSize;493 m_displayHeight = m_writingDirection == Horizontal ? autoSize : m_displaySize;494 495 597 // 10.8 Determine the value of x-position or y-position for cue as per the 496 598 // appropriate rules from the following list: 497 if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueLtr) 498 || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueRtl)) { 499 m_displayXPosition = m_textPosition; 500 } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueLtr) 501 || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueRtl)) { 502 m_displayXPosition = 100 - m_textPosition; 599 if (m_writingDirection == Horizontal) { 600 if (m_cueAlignment == Start) { 601 if (m_displayDirection == CSSValueLtr) 602 m_displayPosition.first = m_textPosition; 603 else 604 m_displayPosition.first = 100 - m_textPosition - m_displaySize; 605 } else if (m_cueAlignment == End) { 606 if (m_displayDirection == CSSValueRtl) 607 m_displayPosition.first = 100 - m_textPosition; 608 else 609 m_displayPosition.first = m_textPosition - m_displaySize; 610 } 503 611 } 504 612 505 613 if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Start) 506 614 || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Start)) { 507 m_display YPosition= m_textPosition;615 m_displayPosition.second = m_textPosition; 508 616 } else if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == End) 509 617 || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == End)) { 510 m_display YPosition= 100 - m_textPosition;618 m_displayPosition.second = 100 - m_textPosition; 511 619 } 512 620 513 621 if (m_writingDirection == Horizontal && m_cueAlignment == Middle) { 514 m_displayXPosition = m_textPosition - m_displaySize / 2;515 516 if (m_displayDirection == CSSValueRtl)517 m_display XPosition = 100 - m_displayXPosition;622 if (m_displayDirection == CSSValueLtr) 623 m_displayPosition.first = m_textPosition - m_displaySize / 2; 624 else 625 m_displayPosition.first = 100 - m_textPosition - m_displaySize / 2; 518 626 } 519 627 520 628 if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Middle) 521 629 || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Middle)) 522 m_display YPosition= m_textPosition - m_displaySize / 2;630 m_displayPosition.second = m_textPosition - m_displaySize / 2; 523 631 524 632 // 10.9 Determine the value of whichever of x-position or y-position is not 525 633 // yet calculated for cue as per the appropriate rules from the following 526 634 // list: 527 if (m_snapToLines && m_display YPosition== undefinedPosition && m_writingDirection == Horizontal)528 m_display YPosition= 0;529 530 if (!m_snapToLines && m_ writingDirection == Horizontal)531 m_display YPosition= m_computedLinePosition;532 533 if (m_snapToLines && m_display XPosition== undefinedPosition635 if (m_snapToLines && m_displayPosition.second == undefinedPosition && m_writingDirection == Horizontal) 636 m_displayPosition.second = 0; 637 638 if (!m_snapToLines && m_displayPosition.second == undefinedPosition && m_writingDirection == Horizontal) 639 m_displayPosition.second = m_computedLinePosition; 640 641 if (m_snapToLines && m_displayPosition.first == undefinedPosition 534 642 && (m_writingDirection == VerticalGrowingLeft || m_writingDirection == VerticalGrowingRight)) 535 m_display XPosition= 0;643 m_displayPosition.first = 0; 536 644 537 645 if (!m_snapToLines && (m_writingDirection == VerticalGrowingLeft || m_writingDirection == VerticalGrowingRight)) 538 m_displayXPosition = m_computedLinePosition; 539 540 // 10.10 Let left be 'x-position vw' and top be 'y-position vh'. 541 542 // FIXME(Bug 79916): CSS top and left properties need to be applied. 646 m_displayPosition.first = m_computedLinePosition; 543 647 } 544 648 … … 588 692 } 589 693 590 PassRefPtr<HTMLDivElement> TextTrackCue::getDisplayTree() 591 { 592 DEFINE_STATIC_LOCAL(const AtomicString, trackDisplayBoxShadowPseudoId, ("-webkit-media-text-track-display")); 593 694 PassRefPtr<TextTrackCueBox> TextTrackCue::getDisplayTree() 695 { 594 696 if (!m_displayTreeShouldChange) 595 697 return m_displayTree; … … 601 703 // following constraints, thus obtaining a set of CSS boxes positioned 602 704 // relative to an initial containing block: 603 m_displayTree->setShadowPseudoId(trackDisplayBoxShadowPseudoId, ASSERT_NO_EXCEPTION);604 705 m_displayTree->removeChildren(); 605 706 … … 625 726 // but if there is a particularly long word, it does not overflow as it 626 727 // normally would in CSS, it is instead forcibly wrapped at the box's edge.) 627 628 // FIXME(BUG 79916): CSS width property should be set to 'size vw', when the 629 // maximum cue size computation is corrected in the specification. 630 if (m_snapToLines) 631 m_displayTree->setInlineStyleProperty(CSSPropertyWidth, (double) m_cueSize, CSSPrimitiveValue::CSS_PERCENTAGE); 632 633 // FIXME(BUG 79750, 79751): Steps 10.12 - 10.14 634 635 if (!m_snapToLines) { 636 std::pair<double, double> position = getPositionCoordinates(); 637 638 // 10.13.1 Set up x and y: 639 m_displayTree->setInlineStyleProperty(CSSPropertyLeft, position.first, CSSPrimitiveValue::CSS_PERCENTAGE); 640 m_displayTree->setInlineStyleProperty(CSSPropertyTop, position.second, CSSPrimitiveValue::CSS_PERCENTAGE); 641 642 // 10.13.2 Position the boxes in boxes such that the point x% along the 643 // width of the bounding box of the boxes in boxes is x% of the way 644 // across the width of the video's rendering area, and the point y% 645 // along the height of the bounding box of the boxes in boxes is y% 646 // of the way across the height of the video's rendering area, while 647 // maintaining the relative positions of the boxes in boxes to each 648 // other. 649 String translateX = "-" + String::number(position.first) + "%"; 650 String translateY = "-" + String::number(position.second) + "%"; 651 String webkitTransformTranslateValue = "translate(" + translateX + "," + translateY + ")"; 652 653 m_displayTree->setInlineStyleProperty(CSSPropertyWebkitTransform, 654 webkitTransformTranslateValue); 655 656 m_displayTree->setInlineStyleProperty(CSSPropertyWhiteSpace, 657 CSSValuePre); 658 } 728 m_displayTree->applyCSSProperties(); 659 729 660 730 if (m_hasInnerTimestamps) … … 674 744 } 675 745 676 std::pair<double, double> TextTrackCue::getPositionCoordinates() 677 { 746 std::pair<double, double> TextTrackCue::getPositionCoordinates() const 747 { 748 // This method is used for setting x and y when snap to lines is not set. 678 749 std::pair<double, double> coordinates; 679 750 … … 930 1001 } 931 1002 1003 int TextTrackCue::getCSSWritingMode() const 1004 { 1005 return m_displayWritingMode; 1006 } 1007 1008 int TextTrackCue::getCSSSize() const 1009 { 1010 return m_displaySize; 1011 } 1012 1013 std::pair<double, double> TextTrackCue::getCSSPosition() const 1014 { 1015 if (!m_snapToLines) 1016 return getPositionCoordinates(); 1017 1018 return m_displayPosition; 1019 } 1020 932 1021 const AtomicString& TextTrackCue::interfaceName() const 933 1022 { -
trunk/Source/WebCore/html/track/TextTrackCue.h
r119907 r126233 35 35 36 36 #include "EventTarget.h" 37 #include "HTMLElement.h" 37 38 #include "TextTrack.h" 38 39 #include <wtf/PassOwnPtr.h> … … 42 43 43 44 class DocumentFragment; 45 class HTMLDivElement; 44 46 class ScriptExecutionContext; 45 47 class TextTrack; 46 class HTMLDivElement; 48 class TextTrackCue; 49 50 // ---------------------------- 51 52 class TextTrackCueBox : public HTMLElement { 53 public: 54 static PassRefPtr<TextTrackCueBox> create(Document* document, TextTrackCue* cue) 55 { 56 return adoptRef(new TextTrackCueBox(document, cue)); 57 } 58 59 TextTrackCue* getCue() const; 60 void applyCSSProperties(); 61 62 virtual const AtomicString& shadowPseudoId() const OVERRIDE; 63 64 private: 65 TextTrackCueBox(Document*, TextTrackCue*); 66 67 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE; 68 69 TextTrackCue* m_cue; 70 }; 71 72 // ---------------------------- 47 73 48 74 class TextTrackCue : public RefCounted<TextTrackCue>, public EventTarget { … … 102 128 void setIsActive(bool); 103 129 104 PassRefPtr< HTMLDivElement> getDisplayTree();130 PassRefPtr<TextTrackCueBox> getDisplayTree(); 105 131 void updateDisplayTree(float); 106 132 void removeDisplayTree(); 107 133 134 int calculateComputedLinePosition(); 135 108 136 virtual const AtomicString& interfaceName() const; 109 137 virtual ScriptExecutionContext* scriptExecutionContext() const; 138 139 std::pair<double, double> getCSSPosition() const; 140 int getCSSSize() const; 141 int getCSSWritingMode() const; 142 143 enum WritingDirection { 144 Horizontal, 145 VerticalGrowingLeft, 146 VerticalGrowingRight, 147 NumberOfWritingDirections 148 }; 149 WritingDirection getWritingDirection() const { return m_writingDirection; } 110 150 111 151 DEFINE_ATTRIBUTE_EVENT_LISTENER(enter); … … 122 162 TextTrackCue(ScriptExecutionContext*, const String& id, double start, double end, const String& content, const String& settings, bool pauseOnExit); 123 163 164 std::pair<double, double> getPositionCoordinates() const; 124 165 void parseSettings(const String&); 125 166 126 int calculateComputedLinePosition();127 167 void calculateDisplayParameters(); 128 129 std::pair<double, double> getPositionCoordinates();130 168 131 169 void cueWillChange(); … … 148 186 int m_cueIndex; 149 187 150 enum WritingDirection {151 Horizontal,152 VerticalGrowingLeft,153 VerticalGrowingRight,154 NumberOfWritingDirections155 };156 188 WritingDirection m_writingDirection; 157 189 … … 174 206 175 207 bool m_displayTreeShouldChange; 176 RefPtr< HTMLDivElement> m_displayTree;208 RefPtr<TextTrackCueBox> m_displayTree; 177 209 178 210 int m_displayDirection; … … 185 217 int m_displayWidth; 186 218 187 double m_displayXPosition; 188 double m_displayYPosition; 219 std::pair<float, float> m_displayPosition; 189 220 }; 190 221
Note: See TracChangeset
for help on using the changeset viewer.