Index: Source/core/html/track/vtt/VTTCue.cpp |
diff --git a/Source/core/html/track/vtt/VTTCue.cpp b/Source/core/html/track/vtt/VTTCue.cpp |
index 14c2e7ef4399da516eb093a15f8040322b7abf08..dd9f6e84b738c66249ff4bcd4aac7c5cf79515bc 100644 |
--- a/Source/core/html/track/vtt/VTTCue.cpp |
+++ b/Source/core/html/track/vtt/VTTCue.cpp |
@@ -45,6 +45,8 @@ |
#include "core/html/track/vtt/VTTParser.h" |
#include "core/html/track/vtt/VTTRegionList.h" |
#include "core/rendering/RenderVTTCue.h" |
+#include "platform/graphics/TextRunIterator.h" |
+#include "platform/text/BidiResolver.h" |
#include "wtf/MathExtras.h" |
#include "wtf/text/StringBuilder.h" |
@@ -497,58 +499,58 @@ int VTTCue::calculateComputedLinePosition() |
return n; |
} |
-static bool isCueParagraphSeparator(UChar character) |
+class VTTTextRunIterator : public TextRunIterator { |
+public: |
+ VTTTextRunIterator() { } |
+ VTTTextRunIterator(const TextRun* textRun, unsigned offset) : TextRunIterator(textRun, offset) { } |
+ |
+ bool atParagraphSeparator() const |
+ { |
+ // Within a cue, paragraph boundaries are only denoted by Type B characters, |
+ // such as U+000A LINE FEED (LF), U+0085 NEXT LINE (NEL), and U+2029 PARAGRAPH SEPARATOR. |
+ return WTF::Unicode::category(current()) & WTF::Unicode::Separator_Paragraph; |
+ } |
+}; |
+ |
+// Almost the same as determineDirectionality in core/html/HTMLElement.cpp, but |
+// that one uses a "plain" TextRunIterator (which only checks for '\n'). |
+static TextDirection determineDirectionality(const String& value, bool& hasStrongDirectionality) |
{ |
- // Within a cue, paragraph boundaries are only denoted by Type B characters, |
- // such as U+000A LINE FEED (LF), U+0085 NEXT LINE (NEL), and U+2029 PARAGRAPH SEPARATOR. |
- return WTF::Unicode::category(character) & WTF::Unicode::Separator_Paragraph; |
+ TextRun run(value); |
+ BidiResolver<VTTTextRunIterator, BidiCharacterRun> bidiResolver; |
+ bidiResolver.setStatus(BidiStatus(LTR, false)); |
+ bidiResolver.setPositionIgnoringNestedIsolates(VTTTextRunIterator(&run, 0)); |
+ return bidiResolver.determineParagraphDirectionality(&hasStrongDirectionality); |
} |
-void VTTCue::determineTextDirection() |
+static CSSValueID determineTextDirection(DocumentFragment* vttRoot) |
{ |
DEFINE_STATIC_LOCAL(const String, rtTag, ("rt")); |
- createVTTNodeTree(); |
+ ASSERT(vttRoot); |
// Apply the Unicode Bidirectional Algorithm's Paragraph Level steps to the |
// concatenation of the values of each WebVTT Text Object in nodes, in a |
// pre-order, depth-first traversal, excluding WebVTT Ruby Text Objects and |
// their descendants. |
- StringBuilder paragraphBuilder; |
- for (Node* node = m_vttNodeTree->firstChild(); node; node = NodeTraversal::next(*node, m_vttNodeTree.get())) { |
+ TextDirection textDirection = LTR; |
+ for (Node* node = vttRoot->firstChild(); node; node = NodeTraversal::next(*node, vttRoot)) { |
if (!node->isTextNode() || node->localName() == rtTag) |
continue; |
- paragraphBuilder.append(node->nodeValue()); |
- } |
- |
- String paragraph = paragraphBuilder.toString(); |
- if (!paragraph.length()) |
- return; |
- |
- for (size_t i = 0; i < paragraph.length(); ++i) { |
- UChar current = paragraph[i]; |
- if (!current || isCueParagraphSeparator(current)) |
- return; |
- |
- if (UChar current = paragraph[i]) { |
- WTF::Unicode::Direction charDirection = WTF::Unicode::direction(current); |
- if (charDirection == WTF::Unicode::LeftToRight) { |
- m_displayDirection = CSSValueLtr; |
- return; |
- } |
- if (charDirection == WTF::Unicode::RightToLeft |
- || charDirection == WTF::Unicode::RightToLeftArabic) { |
- m_displayDirection = CSSValueRtl; |
- return; |
- } |
- } |
+ bool hasStrongDirectionality; |
+ textDirection = determineDirectionality(node->nodeValue(), hasStrongDirectionality); |
+ if (hasStrongDirectionality) |
+ break; |
} |
+ return isLeftToRightDirection(textDirection) ? CSSValueLtr : CSSValueRtl; |
} |
void VTTCue::calculateDisplayParameters() |
{ |
+ createVTTNodeTree(); |
+ |
// Steps 10.2, 10.3 |
- determineTextDirection(); |
+ m_displayDirection = determineTextDirection(m_vttNodeTree.get()); |
// 10.4 If the text track cue writing direction is horizontal, then let |
// block-flow be 'tb'. Otherwise, if the text track cue writing direction is |