| Index: third_party/WebKit/Source/platform/text/BidiResolver.h
|
| diff --git a/third_party/WebKit/Source/platform/text/BidiResolver.h b/third_party/WebKit/Source/platform/text/BidiResolver.h
|
| index 0bc9220a84bf630d3e0cc85110ccff8b3c288f48..4bb3206c41afdbfb21249de8e25e3714bc16d51a 100644
|
| --- a/third_party/WebKit/Source/platform/text/BidiResolver.h
|
| +++ b/third_party/WebKit/Source/platform/text/BidiResolver.h
|
| @@ -178,9 +178,12 @@ enum VisualDirectionOverride {
|
| VisualRightToLeftOverride
|
| };
|
|
|
| +class NoIsolatedRun {
|
| +};
|
| +
|
| // BidiResolver is WebKit's implementation of the Unicode Bidi Algorithm
|
| // http://unicode.org/reports/tr9
|
| -template <class Iterator, class Run> class BidiResolver {
|
| +template <class Iterator, class Run, class IsolatedRun = NoIsolatedRun> class BidiResolver {
|
| WTF_MAKE_NONCOPYABLE(BidiResolver);
|
| public:
|
| BidiResolver()
|
| @@ -243,7 +246,7 @@ public:
|
| // It's unclear if this is still needed.
|
| void markCurrentRunEmpty() { m_emptyRun = true; }
|
|
|
| - Vector<Run*>& isolatedRuns() { return m_isolatedRuns; }
|
| + Vector<IsolatedRun>& isolatedRuns() { return m_isolatedRuns; }
|
|
|
| bool isEndOfLine(const Iterator& end) { return m_current == end || m_current.atEnd(); }
|
|
|
| @@ -258,8 +261,8 @@ public:
|
| return determineDirectionalityInternal(breakOnParagraph, hasStrongDirectionality);
|
| }
|
|
|
| - void setMidpointStateForIsolatedRun(Run*, const MidpointState<Iterator>&);
|
| - MidpointState<Iterator> midpointStateForIsolatedRun(Run*);
|
| + void setMidpointStateForIsolatedRun(Run&, const MidpointState<Iterator>&);
|
| + MidpointState<Iterator> midpointStateForIsolatedRun(Run&);
|
|
|
| Iterator endOfLine() const { return m_endOfLine; }
|
|
|
| @@ -294,7 +297,7 @@ protected:
|
| MidpointState<Iterator> m_midpointState;
|
|
|
| unsigned m_nestedIsolateCount;
|
| - Vector<Run*> m_isolatedRuns;
|
| + Vector<IsolatedRun> m_isolatedRuns;
|
| Run* m_trailingSpaceRun;
|
| TextDirection m_paragraphDirectionality;
|
|
|
| @@ -318,16 +321,16 @@ private:
|
| };
|
|
|
| #if ENABLE(ASSERT)
|
| -template <class Iterator, class Run>
|
| -BidiResolver<Iterator, Run>::~BidiResolver()
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +BidiResolver<Iterator, Run, IsolatedRun>::~BidiResolver()
|
| {
|
| // The owner of this resolver should have handled the isolated runs.
|
| ASSERT(m_isolatedRuns.isEmpty());
|
| }
|
| #endif
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::appendRun(BidiRunList<Run>& runs)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::appendRun(BidiRunList<Run>& runs)
|
| {
|
| if (!m_emptyRun && !m_eor.atEnd()) {
|
| unsigned startOffset = m_sor.offset();
|
| @@ -361,8 +364,8 @@ void BidiResolver<Iterator, Run>::appendRun(BidiRunList<Run>& runs)
|
| m_status.eor = WTF::Unicode::OtherNeutral;
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::embed(WTF::Unicode::Direction dir, BidiEmbeddingSource source)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::embed(WTF::Unicode::Direction dir, BidiEmbeddingSource source)
|
| {
|
| // Isolated spans compute base directionality during their own UBA run.
|
| // Do not insert fake embed characters once we enter an isolated span.
|
| @@ -373,8 +376,8 @@ void BidiResolver<Iterator, Run>::embed(WTF::Unicode::Direction dir, BidiEmbeddi
|
| m_currentExplicitEmbeddingSequence.append(BidiEmbedding(dir, source));
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::checkDirectionInLowerRaiseEmbeddingLevel()
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::checkDirectionInLowerRaiseEmbeddingLevel()
|
| {
|
| using namespace WTF::Unicode;
|
|
|
| @@ -390,8 +393,8 @@ void BidiResolver<Iterator, Run>::checkDirectionInLowerRaiseEmbeddingLevel()
|
| m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::lowerExplicitEmbeddingLevel(BidiRunList<Run>& runs, WTF::Unicode::Direction from)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::lowerExplicitEmbeddingLevel(BidiRunList<Run>& runs, WTF::Unicode::Direction from)
|
| {
|
| using namespace WTF::Unicode;
|
|
|
| @@ -428,8 +431,8 @@ void BidiResolver<Iterator, Run>::lowerExplicitEmbeddingLevel(BidiRunList<Run>&
|
| m_eor = Iterator();
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::raiseExplicitEmbeddingLevel(BidiRunList<Run>& runs, WTF::Unicode::Direction from, WTF::Unicode::Direction to)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::raiseExplicitEmbeddingLevel(BidiRunList<Run>& runs, WTF::Unicode::Direction from, WTF::Unicode::Direction to)
|
| {
|
| using namespace WTF::Unicode;
|
|
|
| @@ -467,8 +470,8 @@ void BidiResolver<Iterator, Run>::raiseExplicitEmbeddingLevel(BidiRunList<Run>&
|
| m_eor = Iterator();
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::applyL1Rule(BidiRunList<Run>& runs)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::applyL1Rule(BidiRunList<Run>& runs)
|
| {
|
| ASSERT(runs.runCount());
|
| if (!needsToApplyL1Rule(runs))
|
| @@ -506,8 +509,8 @@ void BidiResolver<Iterator, Run>::applyL1Rule(BidiRunList<Run>& runs)
|
| m_trailingSpaceRun = trailingSpaceRun;
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -bool BidiResolver<Iterator, Run>::commitExplicitEmbedding(BidiRunList<Run>& runs)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +bool BidiResolver<Iterator, Run, IsolatedRun>::commitExplicitEmbedding(BidiRunList<Run>& runs)
|
| {
|
| // When we're "inIsolate()" we're resolving the parent context which
|
| // ignores (skips over) the isolated content, including embedding levels.
|
| @@ -551,8 +554,8 @@ bool BidiResolver<Iterator, Run>::commitExplicitEmbedding(BidiRunList<Run>& runs
|
| return fromLevel != toLevel;
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -inline void BidiResolver<Iterator, Run>::updateStatusLastFromCurrentDirection(WTF::Unicode::Direction dirCurrent)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +inline void BidiResolver<Iterator, Run, IsolatedRun>::updateStatusLastFromCurrentDirection(WTF::Unicode::Direction dirCurrent)
|
| {
|
| using namespace WTF::Unicode;
|
| switch (dirCurrent) {
|
| @@ -593,8 +596,8 @@ inline void BidiResolver<Iterator, Run>::updateStatusLastFromCurrentDirection(WT
|
| }
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -inline void BidiResolver<Iterator, Run>::reorderRunsFromLevels(BidiRunList<Run>& runs) const
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +inline void BidiResolver<Iterator, Run, IsolatedRun>::reorderRunsFromLevels(BidiRunList<Run>& runs) const
|
| {
|
| unsigned char levelLow = BidiContext::kMaxLevel;
|
| unsigned char levelHigh = 0;
|
| @@ -630,8 +633,8 @@ inline void BidiResolver<Iterator, Run>::reorderRunsFromLevels(BidiRunList<Run>&
|
| }
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -TextDirection BidiResolver<Iterator, Run>::determineDirectionalityInternal(
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +TextDirection BidiResolver<Iterator, Run, IsolatedRun>::determineDirectionalityInternal(
|
| bool breakOnParagraph, bool* hasStrongDirectionality)
|
| {
|
| while (!m_current.atEnd()) {
|
| @@ -682,8 +685,8 @@ inline TextDirection directionForCharacter(UChar32 character)
|
| return LTR;
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, VisualDirectionOverride override, bool hardLineBreak, bool reorderRuns)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::createBidiRunsForLine(const Iterator& end, VisualDirectionOverride override, bool hardLineBreak, bool reorderRuns)
|
| {
|
| using namespace WTF::Unicode;
|
|
|
| @@ -714,7 +717,7 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis
|
|
|
| m_last = m_current;
|
| bool lastLineEnded = false;
|
| - BidiResolver<Iterator, Run> stateAtEnd;
|
| + BidiResolver<Iterator, Run, IsolatedRun> stateAtEnd;
|
|
|
| while (true) {
|
| if (inIsolate() && m_emptyRun) {
|
| @@ -1091,20 +1094,19 @@ void BidiResolver<Iterator, Run>::createBidiRunsForLine(const Iterator& end, Vis
|
| applyL1Rule(m_runs);
|
| }
|
|
|
| -template <class Iterator, class Run>
|
| -void BidiResolver<Iterator, Run>::setMidpointStateForIsolatedRun(Run* run, const MidpointState<Iterator>& midpoint)
|
| +template <class Iterator, class Run, class IsolatedRun>
|
| +void BidiResolver<Iterator, Run, IsolatedRun>::setMidpointStateForIsolatedRun(Run& run, const MidpointState<Iterator>& midpoint)
|
| {
|
| - ASSERT(!m_midpointStateForIsolatedRun.contains(run));
|
| - m_midpointStateForIsolatedRun.add(run, midpoint);
|
| + ASSERT(!m_midpointStateForIsolatedRun.contains(&run));
|
| + m_midpointStateForIsolatedRun.add(&run, midpoint);
|
| }
|
|
|
| -template<class Iterator, class Run>
|
| -MidpointState<Iterator> BidiResolver<Iterator, Run>::midpointStateForIsolatedRun(Run* run)
|
| +template<class Iterator, class Run, class IsolatedRun>
|
| +MidpointState<Iterator> BidiResolver<Iterator, Run, IsolatedRun>::midpointStateForIsolatedRun(Run& run)
|
| {
|
| - return m_midpointStateForIsolatedRun.take(run);
|
| + return m_midpointStateForIsolatedRun.take(&run);
|
| }
|
|
|
| -
|
| } // namespace blink
|
|
|
| #endif // BidiResolver_h
|
|
|