WebKit Bugzilla
Attachment 372197 Details for
Bug 198888
: [LFC] Add Layout::Box::isContainingBlockDescendantOf
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198888-20190615123247.patch (text/plain), 7.32 KB, created by
zalan
on 2019-06-15 12:32:48 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-15 12:32:48 PDT
Size:
7.32 KB
patch
obsolete
>Subversion Revision: 246468 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5c19611fdbdb840c871f874ae474657a0f2fd5a2..52d386e418b722d84edb41ae945659ffaa7b00cd 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,26 @@ >+2019-06-15 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC] Add Layout::Box::isContainingBlockDescendantOf >+ https://bugs.webkit.org/show_bug.cgi?id=198888 >+ <rdar://problem/51776466> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Box::isDescendantOf indicates simple ancestor - descendant relationship, while >+ isContainingBlockDescendantOf checks the containing block chain. >+ >+ * layout/FormattingContext.cpp: >+ (WebCore::Layout::mapHorizontalPositionToAncestor): >+ (WebCore::Layout::FormattingContext::mapBoxToAncestor): >+ (WebCore::Layout::FormattingContext::mapTopToAncestor): >+ (WebCore::Layout::FormattingContext::mapPointToAncestor): >+ * layout/floats/FloatingState.h: >+ (WebCore::Layout::FloatingState::FloatItem::isDescendantOfFormattingRoot const): >+ * layout/layouttree/LayoutBox.cpp: >+ (WebCore::Layout::Box::isDescendantOf const): >+ (WebCore::Layout::Box::isContainingBlockDescendantOf const): >+ * layout/layouttree/LayoutBox.h: >+ > 2019-06-15 Zalan Bujtas <zalan@apple.com> > > [LFC][BFC] Fix available width for non-floating positioned float avoiders. >diff --git a/Source/WebCore/layout/FormattingContext.cpp b/Source/WebCore/layout/FormattingContext.cpp >index 9453fcbabf548e42ed96a0bed8a9691c0f88aa63..9d5f878f4ff3385e6dec0f0bdf6aed1c26a4dba8 100644 >--- a/Source/WebCore/layout/FormattingContext.cpp >+++ b/Source/WebCore/layout/FormattingContext.cpp >@@ -170,7 +170,7 @@ static LayoutUnit mapHorizontalPositionToAncestor(const LayoutState& layoutState > // "horizontalPosition" is in the coordinate system of the "containingBlock". -> map from containingBlock to ancestor. > if (&containingBlock == &ancestor) > return horizontalPosition; >- ASSERT(containingBlock.isDescendantOf(ancestor)); >+ ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor)); > for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock()) > horizontalPosition += layoutState.displayBoxForLayoutBox(*container).left(); > return horizontalPosition; >@@ -191,20 +191,12 @@ LayoutUnit FormattingContext::mapRightToAncestor(const LayoutState& layoutState, > > Display::Box FormattingContext::mapBoxToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor) > { >- ASSERT(layoutBox.isDescendantOf(ancestor)); >- >+ ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor)); > auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox); > auto topLeft = displayBox.topLeft(); >- >- auto* containingBlock = layoutBox.containingBlock(); >- for (; containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock()) >+ for (auto* containingBlock = layoutBox.containingBlock(); containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock()) > topLeft.moveBy(layoutState.displayBoxForLayoutBox(*containingBlock).topLeft()); > >- if (!containingBlock) { >- ASSERT_NOT_REACHED(); >- return Display::Box(displayBox); >- } >- > auto mappedDisplayBox = Display::Box(displayBox); > mappedDisplayBox.setTopLeft(topLeft); > return mappedDisplayBox; >@@ -212,26 +204,21 @@ Display::Box FormattingContext::mapBoxToAncestor(const LayoutState& layoutState, > > LayoutUnit FormattingContext::mapTopToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor) > { >- ASSERT(layoutBox.isDescendantOf(ancestor)); >+ ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor)); > auto top = layoutState.displayBoxForLayoutBox(layoutBox).top(); >- auto* container = layoutBox.containingBlock(); >- for (; container && container != &ancestor; container = container->containingBlock()) >+ for (auto* container = layoutBox.containingBlock(); container && container != &ancestor; container = container->containingBlock()) > top += layoutState.displayBoxForLayoutBox(*container).top(); > return top; > } > > Point FormattingContext::mapPointToAncestor(const LayoutState& layoutState, Point position, const Container& containingBlock, const Container& ancestor) > { >+ if (&containingBlock == &ancestor) >+ return position; >+ ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor)); > auto mappedPosition = position; >- auto* container = &containingBlock; >- for (; container && container != &ancestor; container = container->containingBlock()) >+ for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock()) > mappedPosition.moveBy(layoutState.displayBoxForLayoutBox(*container).topLeft()); >- >- if (!container) { >- ASSERT_NOT_REACHED(); >- return position; >- } >- > return mappedPosition; > } > >diff --git a/Source/WebCore/layout/floats/FloatingState.h b/Source/WebCore/layout/floats/FloatingState.h >index e1cb8d20f8579e759706e1e912ac3b75e4b29d66..f253f2c3e4d8dece6a52e8c0a563e6a2a4d87f41 100644 >--- a/Source/WebCore/layout/floats/FloatingState.h >+++ b/Source/WebCore/layout/floats/FloatingState.h >@@ -121,7 +121,7 @@ inline bool FloatingState::FloatItem::isDescendantOfFormattingRoot(const Box& fo > ASSERT(formattingContextRoot.establishesFormattingContext()); > if (!is<Container>(formattingContextRoot)) > return false; >- return m_layoutBox->isDescendantOf(downcast<Container>(formattingContextRoot)); >+ return m_layoutBox->isContainingBlockDescendantOf(downcast<Container>(formattingContextRoot)); > } > > } >diff --git a/Source/WebCore/layout/layouttree/LayoutBox.cpp b/Source/WebCore/layout/layouttree/LayoutBox.cpp >index 01198314b711a8b55a84d0948c5e5fbc42d02827..7ea4c6ceb172aff50dbaabff7a7f020ad7db2c0f 100644 >--- a/Source/WebCore/layout/layouttree/LayoutBox.cpp >+++ b/Source/WebCore/layout/layouttree/LayoutBox.cpp >@@ -197,10 +197,19 @@ const Container& Box::initialContainingBlock() const > return *parent; > } > >-bool Box::isDescendantOf(const Container& container) const >+bool Box::isDescendantOf(const Container& ancestorCandidate) const >+{ >+ for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) { >+ if (ancestor == &ancestorCandidate) >+ return true; >+ } >+ return false; >+} >+ >+bool Box::isContainingBlockDescendantOf(const Container& ancestorCandidate) const > { > for (auto* ancestor = containingBlock(); ancestor; ancestor = ancestor->containingBlock()) { >- if (ancestor == &container) >+ if (ancestor == &ancestorCandidate) > return true; > } > return false; >diff --git a/Source/WebCore/layout/layouttree/LayoutBox.h b/Source/WebCore/layout/layouttree/LayoutBox.h >index 5606e21a39d6acf737bd329b8559c96835066b89..7aea082e64e3e31a6aee5ffe35a3cf904c243ef9 100644 >--- a/Source/WebCore/layout/layouttree/LayoutBox.h >+++ b/Source/WebCore/layout/layouttree/LayoutBox.h >@@ -101,6 +101,7 @@ public: > const Container& initialContainingBlock() const; > > bool isDescendantOf(const Container&) const; >+ bool isContainingBlockDescendantOf(const Container&) const; > > bool isAnonymous() const { return !m_elementAttributes; } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198888
:
372191
| 372197