| Index: Source/core/layout/line/InlineIterator.h
|
| diff --git a/Source/core/layout/line/InlineIterator.h b/Source/core/layout/line/InlineIterator.h
|
| index c1ac1669354237899a338634a85c375c7bea0e2b..c15e2245bdfc514ba8c800e7e933e38a9ce7e993 100644
|
| --- a/Source/core/layout/line/InlineIterator.h
|
| +++ b/Source/core/layout/line/InlineIterator.h
|
| @@ -27,6 +27,9 @@
|
| #include "core/layout/LayoutBlockFlow.h"
|
| #include "core/layout/LayoutInline.h"
|
| #include "core/layout/LayoutText.h"
|
| +#include "core/layout/api/LineLayoutBlockFlow.h"
|
| +#include "core/layout/api/LineLayoutInline.h"
|
| +#include "core/layout/api/LineLayoutText.h"
|
|
|
| #include "wtf/StdLibExtras.h"
|
|
|
| @@ -50,7 +53,7 @@ public:
|
| {
|
| }
|
|
|
| - InlineIterator(LayoutObject* root, LayoutObject* o, unsigned p)
|
| + InlineIterator(LineLayoutItem root, LineLayoutItem o, unsigned p)
|
| : m_root(root)
|
| , m_obj(o)
|
| , m_nextBreakablePosition(-1)
|
| @@ -60,27 +63,27 @@ public:
|
|
|
| void clear() { moveTo(0, 0); }
|
|
|
| - void moveToStartOf(LayoutObject* object)
|
| + void moveToStartOf(LineLayoutItem object)
|
| {
|
| moveTo(object, 0);
|
| }
|
|
|
| - void moveTo(LayoutObject* object, unsigned offset, int nextBreak = -1)
|
| + void moveTo(LineLayoutItem object, unsigned offset, int nextBreak = -1)
|
| {
|
| m_obj = object;
|
| m_pos = offset;
|
| m_nextBreakablePosition = nextBreak;
|
| }
|
|
|
| - LayoutObject* object() const { return m_obj; }
|
| - void setObject(LayoutObject* object) { m_obj = object; }
|
| + LineLayoutItem object() const { return m_obj; }
|
| + void setObject(LineLayoutItem object) { m_obj = object; }
|
|
|
| int nextBreakablePosition() const { return m_nextBreakablePosition; }
|
| void setNextBreakablePosition(int position) { m_nextBreakablePosition = position; }
|
|
|
| unsigned offset() const { return m_pos; }
|
| void setOffset(unsigned position) { m_pos = position; }
|
| - LayoutObject* root() const { return m_root; }
|
| + LineLayoutItem root() const { return m_root; }
|
|
|
| void fastIncrementInTextNode();
|
| void increment(InlineBidiResolver* = nullptr, IncrementRule = FastIncrementInTextNode);
|
| @@ -88,13 +91,13 @@ public:
|
|
|
| inline bool atTextParagraphSeparator() const
|
| {
|
| - return m_obj && m_obj->preservesNewline() && m_obj->isText() && toLayoutText(m_obj)->textLength()
|
| - && !toLayoutText(m_obj)->isWordBreak() && toLayoutText(m_obj)->characterAt(m_pos) == '\n';
|
| + return m_obj && m_obj.preservesNewline() && m_obj.isText() && LineLayoutText(m_obj).textLength()
|
| + && !LineLayoutText(m_obj).isWordBreak() && LineLayoutText(m_obj).characterAt(m_pos) == '\n';
|
| }
|
|
|
| inline bool atParagraphSeparator() const
|
| {
|
| - return (m_obj && m_obj->isBR()) || atTextParagraphSeparator();
|
| + return (m_obj && m_obj.isBR()) || atTextParagraphSeparator();
|
| }
|
|
|
| UChar characterAt(unsigned) const;
|
| @@ -103,8 +106,8 @@ public:
|
| ALWAYS_INLINE WTF::Unicode::Direction direction() const;
|
|
|
| private:
|
| - LayoutObject* m_root;
|
| - LayoutObject* m_obj;
|
| + LineLayoutItem m_root;
|
| + LineLayoutItem m_obj;
|
|
|
| int m_nextBreakablePosition;
|
| unsigned m_pos;
|
| @@ -129,7 +132,7 @@ static inline WTF::Unicode::Direction embedCharFromDirection(TextDirection dir,
|
| }
|
|
|
| template <class Observer>
|
| -static inline void notifyObserverEnteredObject(Observer* observer, LayoutObject* object)
|
| +static inline void notifyObserverEnteredObject(Observer* observer, LineLayoutItem object)
|
| {
|
| if (!observer || !object || !object->isLayoutInline())
|
| return;
|
| @@ -156,7 +159,7 @@ static inline void notifyObserverEnteredObject(Observer* observer, LayoutObject*
|
| }
|
|
|
| template <class Observer>
|
| -static inline void notifyObserverWillExitObject(Observer* observer, LayoutObject* object)
|
| +static inline void notifyObserverWillExitObject(Observer* observer, LineLayoutItem object)
|
| {
|
| if (!observer || !object || !object->isLayoutInline())
|
| return;
|
| @@ -174,7 +177,7 @@ static inline void notifyObserverWillExitObject(Observer* observer, LayoutObject
|
| observer->embed(WTF::Unicode::PopDirectionalFormat, FromStyleOrDOM);
|
| }
|
|
|
| -static inline bool isIteratorTarget(LayoutObject* object)
|
| +static inline bool isIteratorTarget(LineLayoutItem object)
|
| {
|
| ASSERT(object); // The iterator will of course return 0, but its not an expected argument to this function.
|
| return object->isText() || object->isFloating() || object->isOutOfFlowPositioned() || object->isReplaced();
|
| @@ -186,15 +189,15 @@ enum EmptyInlineBehavior {
|
| IncludeEmptyInlines,
|
| };
|
|
|
| -static bool isEmptyInline(LayoutObject* object)
|
| +static bool isEmptyInline(LineLayoutItem object)
|
| {
|
| if (!object->isLayoutInline())
|
| return false;
|
|
|
| - for (LayoutObject* curr = toLayoutInline(object)->firstChild(); curr; curr = curr->nextSibling()) {
|
| + for (LineLayoutItem curr = LineLayoutInline(object).firstChild(); curr; curr = curr->nextSibling()) {
|
| if (curr->isFloatingOrOutOfFlowPositioned())
|
| continue;
|
| - if (curr->isText() && toLayoutText(curr)->isAllCollapsibleWhitespace())
|
| + if (curr->isText() && LineLayoutText(curr).isAllCollapsibleWhitespace())
|
| continue;
|
|
|
| if (!isEmptyInline(curr))
|
| @@ -207,9 +210,9 @@ static bool isEmptyInline(LayoutObject* object)
|
| // This function will iterate over inlines within a block, optionally notifying
|
| // a bidi resolver as it enters/exits inlines (so it can push/pop embedding levels).
|
| template <class Observer>
|
| -static inline LayoutObject* bidiNextShared(LayoutObject* root, LayoutObject* current, Observer* observer = 0, EmptyInlineBehavior emptyInlineBehavior = SkipEmptyInlines, bool* endOfInlinePtr = nullptr)
|
| +static inline LineLayoutItem bidiNextShared(LineLayoutItem root, LineLayoutItem current, Observer* observer = 0, EmptyInlineBehavior emptyInlineBehavior = SkipEmptyInlines, bool* endOfInlinePtr = nullptr)
|
| {
|
| - LayoutObject* next = nullptr;
|
| + LineLayoutItem next = nullptr;
|
| // oldEndOfInline denotes if when we last stopped iterating if we were at the end of an inline.
|
| bool oldEndOfInline = endOfInlinePtr ? *endOfInlinePtr : false;
|
| bool endOfInline = false;
|
| @@ -265,28 +268,28 @@ static inline LayoutObject* bidiNextShared(LayoutObject* root, LayoutObject* cur
|
| }
|
|
|
| template <class Observer>
|
| -static inline LayoutObject* bidiNextSkippingEmptyInlines(LayoutObject* root, LayoutObject* current, Observer* observer)
|
| +static inline LineLayoutItem bidiNextSkippingEmptyInlines(LineLayoutItem root, LineLayoutItem current, Observer* observer)
|
| {
|
| // The SkipEmptyInlines callers never care about endOfInlinePtr.
|
| return bidiNextShared(root, current, observer, SkipEmptyInlines);
|
| }
|
|
|
| // This makes callers cleaner as they don't have to specify a type for the observer when not providing one.
|
| -static inline LayoutObject* bidiNextSkippingEmptyInlines(LayoutObject* root, LayoutObject* current)
|
| +static inline LineLayoutItem bidiNextSkippingEmptyInlines(LineLayoutItem root, LineLayoutItem current)
|
| {
|
| InlineBidiResolver* observer = nullptr;
|
| return bidiNextSkippingEmptyInlines(root, current, observer);
|
| }
|
|
|
| -static inline LayoutObject* bidiNextIncludingEmptyInlines(LayoutObject* root, LayoutObject* current, bool* endOfInlinePtr = nullptr)
|
| +static inline LineLayoutItem bidiNextIncludingEmptyInlines(LineLayoutItem root, LineLayoutItem current, bool* endOfInlinePtr = nullptr)
|
| {
|
| InlineBidiResolver* observer = nullptr; // Callers who include empty inlines, never use an observer.
|
| return bidiNextShared(root, current, observer, IncludeEmptyInlines, endOfInlinePtr);
|
| }
|
|
|
| -static inline LayoutObject* bidiFirstSkippingEmptyInlines(LayoutBlockFlow* root, BidiRunList<BidiRun>& runs, InlineBidiResolver* resolver = nullptr)
|
| +static inline LineLayoutItem bidiFirstSkippingEmptyInlines(LineLayoutBlockFlow root, BidiRunList<BidiRun>& runs, InlineBidiResolver* resolver = nullptr)
|
| {
|
| - LayoutObject* o = root->firstChild();
|
| + LineLayoutItem o = root.firstChild();
|
| if (!o)
|
| return nullptr;
|
|
|
| @@ -312,9 +315,9 @@ static inline LayoutObject* bidiFirstSkippingEmptyInlines(LayoutBlockFlow* root,
|
| }
|
|
|
| // FIXME: This method needs to be renamed when bidiNext finds a good name.
|
| -static inline LayoutObject* bidiFirstIncludingEmptyInlines(LayoutBlock* root)
|
| +static inline LineLayoutItem bidiFirstIncludingEmptyInlines(LineLayoutBlockFlow root)
|
| {
|
| - LayoutObject* o = root->firstChild();
|
| + LineLayoutItem o = root.firstChild();
|
| // If either there are no children to walk, or the first one is correct
|
| // then just return it.
|
| if (!o || o->isLayoutInline() || isIteratorTarget(o))
|
| @@ -326,8 +329,8 @@ static inline LayoutObject* bidiFirstIncludingEmptyInlines(LayoutBlock* root)
|
| inline void InlineIterator::fastIncrementInTextNode()
|
| {
|
| ASSERT(m_obj);
|
| - ASSERT(m_obj->isText());
|
| - ASSERT(m_pos <= toLayoutText(m_obj)->textLength());
|
| + ASSERT(m_obj.isText());
|
| + ASSERT(m_pos <= LineLayoutText(m_obj).textLength());
|
| if (m_pos < INT_MAX)
|
| m_pos++;
|
| }
|
| @@ -345,21 +348,21 @@ public:
|
| m_current = bidiFirstIncludingEmptyInlines(m_root);
|
| }
|
|
|
| - LayoutBlock* root() { return m_root; }
|
| - LayoutObject* current() { return m_current; }
|
| + LineLayoutBlockFlow root() { return m_root; }
|
| + LineLayoutItem current() { return m_current; }
|
|
|
| bool atEndOfInline() { return m_atEndOfInline; }
|
| bool atEnd() const { return !m_current; }
|
|
|
| - LayoutObject* advance()
|
| + LineLayoutItem advance()
|
| {
|
| // FIXME: Support SkipEmptyInlines and observer parameters.
|
| m_current = bidiNextIncludingEmptyInlines(m_root, m_current, &m_atEndOfInline);
|
| return m_current;
|
| }
|
| private:
|
| - LayoutBlock* m_root;
|
| - LayoutObject* m_current;
|
| + LineLayoutBlockFlow m_root;
|
| + LineLayoutItem m_current;
|
| bool m_atEndOfInline;
|
| };
|
|
|
| @@ -368,7 +371,7 @@ static inline bool endOfLineHasIsolatedObjectAncestor(const InlineIterator& isol
|
| if (!isolatedIterator.object() || !isIsolated(isolatedIterator.object()->style()->unicodeBidi()))
|
| return false;
|
|
|
| - LayoutObject* innerIsolatedObject = isolatedIterator.object();
|
| + LineLayoutItem innerIsolatedObject = isolatedIterator.object();
|
| while (innerIsolatedObject && innerIsolatedObject != isolatedIterator.root()) {
|
| if (innerIsolatedObject == ancestorItertor.object())
|
| return true;
|
| @@ -389,9 +392,9 @@ inline void InlineIterator::increment(InlineBidiResolver* resolver, IncrementRul
|
| return;
|
| }
|
|
|
| - if (m_obj->isText()) {
|
| + if (m_obj.isText()) {
|
| fastIncrementInTextNode();
|
| - if (m_pos < toLayoutText(m_obj)->textLength())
|
| + if (m_pos < LineLayoutText(m_obj).textLength())
|
| return;
|
| }
|
| // bidiNext can return 0, so use moveTo instead of moveToStartOf
|
| @@ -405,10 +408,10 @@ inline bool InlineIterator::atEnd() const
|
|
|
| inline UChar InlineIterator::characterAt(unsigned index) const
|
| {
|
| - if (!m_obj || !m_obj->isText())
|
| + if (!m_obj || !m_obj.isText())
|
| return 0;
|
|
|
| - return toLayoutText(m_obj)->characterAt(index);
|
| + return LineLayoutText(m_obj).characterAt(index);
|
| }
|
|
|
| inline UChar InlineIterator::current() const
|
| @@ -429,8 +432,8 @@ ALWAYS_INLINE WTF::Unicode::Direction InlineIterator::direction() const
|
| if (UChar c = current())
|
| return WTF::Unicode::direction(c);
|
|
|
| - if (m_obj && m_obj->isListMarker())
|
| - return m_obj->style()->isLeftToRightDirection() ? WTF::Unicode::LeftToRight : WTF::Unicode::RightToLeft;
|
| + if (m_obj && m_obj.isListMarker())
|
| + return m_obj.style()->isLeftToRightDirection() ? WTF::Unicode::LeftToRight : WTF::Unicode::RightToLeft;
|
|
|
| return WTF::Unicode::OtherNeutral;
|
| }
|
| @@ -480,7 +483,7 @@ template <>
|
| inline int InlineBidiResolver::findFirstTrailingSpaceAtRun(BidiRun* run)
|
| {
|
| ASSERT(run);
|
| - LayoutObject* lastObject = run->m_object;
|
| + LineLayoutItem lastObject = run->m_object;
|
| if (!lastObject->isText())
|
| return run->m_stop;
|
|
|
| @@ -514,16 +517,16 @@ inline bool InlineBidiResolver::needsToApplyL1Rule(BidiRunList<BidiRun>& runs)
|
| return true;
|
| }
|
|
|
| -static inline bool isIsolatedInline(LayoutObject* object)
|
| +static inline bool isIsolatedInline(LineLayoutItem object)
|
| {
|
| ASSERT(object);
|
| return object->isLayoutInline() && isIsolated(object->style()->unicodeBidi());
|
| }
|
|
|
| -static inline LayoutObject* highestContainingIsolateWithinRoot(LayoutObject* object, LayoutObject* root)
|
| +static inline LineLayoutItem highestContainingIsolateWithinRoot(LineLayoutItem object, LineLayoutItem root)
|
| {
|
| ASSERT(object);
|
| - LayoutObject* containingIsolateObj = 0;
|
| + LineLayoutItem containingIsolateObj = 0;
|
| while (object && object != root) {
|
| if (isIsolatedInline(object))
|
| containingIsolateObj = object;
|
| @@ -535,7 +538,7 @@ static inline LayoutObject* highestContainingIsolateWithinRoot(LayoutObject* obj
|
|
|
| static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter)
|
| {
|
| - LayoutObject* object = iter.object();
|
| + LineLayoutItem object = iter.object();
|
| if (!object)
|
| return 0;
|
| unsigned count = 0;
|
| @@ -549,7 +552,7 @@ static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter)
|
|
|
| // FIXME: This belongs on InlineBidiResolver, except it's a template specialization
|
| // of BidiResolver which knows nothing about LayoutObjects.
|
| -static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LayoutObject* obj, unsigned pos)
|
| +static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos)
|
| {
|
| ASSERT(obj);
|
| BidiRun* isolatedRun = new BidiRun(pos, pos, obj, resolver.context(), resolver.dir());
|
| @@ -560,7 +563,7 @@ static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& re
|
| return isolatedRun;
|
| }
|
|
|
| -static inline BidiRun* createRun(int start, int end, LayoutObject* obj, InlineBidiResolver& resolver)
|
| +static inline BidiRun* createRun(int start, int end, LineLayoutItem obj, InlineBidiResolver& resolver)
|
| {
|
| return new BidiRun(start, end, obj, resolver.context(), resolver.dir());
|
| }
|
| @@ -599,7 +602,7 @@ public:
|
| void commitExplicitEmbedding(BidiRunList<BidiRun>&) { }
|
| BidiRunList<BidiRun>& runs() { return m_runs; }
|
|
|
| - void addFakeRunIfNecessary(LayoutObject* obj, unsigned pos, unsigned end, InlineBidiResolver& resolver)
|
| + void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, InlineBidiResolver& resolver)
|
| {
|
| // We only need to add a fake run for a given isolated span once during each call to createBidiRunsForLine.
|
| // We'll be called for every span inside the isolated span so we just ignore subsequent calls.
|
| @@ -623,7 +626,7 @@ private:
|
| BidiRunList<BidiRun>& m_runs;
|
| };
|
|
|
| -static void inline appendRunObjectIfNecessary(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
|
| +static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
|
| {
|
| // Trailing space code creates empty BidiRun objects, start == end, so
|
| // that case needs to be handled specifically.
|
| @@ -645,7 +648,7 @@ static void inline appendRunObjectIfNecessary(LayoutObject* obj, unsigned start,
|
| }
|
| }
|
|
|
| -static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
|
| +static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
|
| {
|
| if (start > end || LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj))
|
| return;
|
| @@ -687,7 +690,7 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LayoutObject* obj, uns
|
| }
|
| }
|
|
|
| -static inline void addFakeRunIfNecessary(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker)
|
| +static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker)
|
| {
|
| tracker.setMidpointStateForRootIsolate(resolver.midpointState());
|
| adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj->length(), resolver, AppendingFakeRun, tracker);
|
| @@ -702,7 +705,7 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs)
|
| // FIXME: Could this initialize from this->inIsolate() instead of walking up the layout tree?
|
| IsolateTracker isolateTracker(runs, numberOfIsolateAncestors(m_sor));
|
| int start = m_sor.offset();
|
| - LayoutObject* obj = m_sor.object();
|
| + LineLayoutItem obj = m_sor.object();
|
| while (obj && obj != m_eor.object() && obj != m_endOfRunAtEndOfLine.object()) {
|
| if (isolateTracker.inIsolate())
|
| addFakeRunIfNecessary(obj, start, obj->length(), *this, isolateTracker);
|
|
|