RESOLVED FIXED 259538
Potential Optimization - Avoid multiple recursions through the tree when calculating percent height
https://bugs.webkit.org/show_bug.cgi?id=259538
Summary Potential Optimization - Avoid multiple recursions through the tree when calc...
Ahmad Saleem
Reported 2023-07-26 16:56:41 PDT
HI Team, Based on discussion with Alan (on Slack 1-1), I am exploring whether we can do this merge: Blink Merge: https://chromium.googlesource.com/chromium/src.git/+/74e95b29247f21620cb94fdf72e7e1051fff80c2 WebKit Source: https://searchfox.org/wubkat/source/Source/WebCore/rendering/RenderBox.cpp#731 Performance Test: https://jsfiddle.net/stwre9j6/show _____ Safari Technology Preview 174: Description: Measures performance of nested divs with percent values for height and max-height. Time: values 2.1645021645021645, 2.1645021645021636, 2.1668472372697734, 2.1691973969631246, 2.1810250817884405, 2.185792349726774, 2.183406113537118, 2.185792349726776, 2.185792349726776, 2.18579234972678, 2.1857923497267717, 2.183406113537118, 2.181025081788445, 2.178649237472767, 2.1834061135371137, 2.1739130434782696, 2.183406113537118, 2.183406113537118, 2.178649237472767, 2.1739130434782608 runs/s avg 2.178910800251782 runs/s median 2.182215597662779 runs/s stdev 0.007440810283025579 runs/s min 2.1645021645021636 runs/s max 2.18579234972678 runs/s and Chrome Canary 117 Description: Measures performance of nested divs with percent values for height and max-height. Time: values 11472.47119099994, 11770.888071650446, 11833.069202510645, 11837.759282350935, 11977.542108546475, 12051.21767520943, 11902.231668720548, 11945.073990466863, 11837.759280952629, 11671.225739175741, 11867.549668639947, 11853.419764191982, 11746.198217140805, 11733.892090649078, 11733.8920904201, 11643.924626380767, 11462.197774693923, 11594.202897924757, 11478.349986619643, 11466.598413454549 runs/s avg 11743.97318703496 runs/s median 11758.543144395626 runs/s stdev 178.66304514479208 runs/s min 11462.197774693923 runs/s max 12051.21767520943 runs/s and Firefox Nightly 117 is similar ballpark to Chrome. _________ Alan raised concern along the lines that the code can raise potential regressions, so I think I will continue to explore this locally but if someone has better and faster way to do it. Go ahead and knock it out of the park. Thanks!
Attachments
Ahmad Saleem
Comment 1 2023-07-26 17:36:26 PDT
LayoutUnit RenderBox::constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight, std::optional<LayoutUnit> intrinsicContentHeight) const { const RenderStyle& styleToUse = style(); if (!styleToUse.logicalMaxHeight().isUndefined()) { if (styleToUse.logicalMaxHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { LayoutUnit availableLogicalHeight = Layout::toLayoutUnit(logicalHeight / (styleToUse.logicalHeight().value() * 100)); logicalHeight = std::min<LayoutUnit>(logicalHeight, valueForLength(styleToUse.logicalMaxHeight(), availableLogicalHeight)); } else { std::optional<LayoutUnit> maxHeight = computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), -1); if (maxHeight != -1) LayoutUnit logicalHeight = std::min<LayoutUnit>(logicalHeight, maxHeight); } } if (styleToUse.logicalMinHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { LayoutUnit availableLogicalHeight = Layout::toLayoutUnit(logicalHeight / (styleToUse.logicalHeight().value() * 100)); logicalHeight = std::max<LayoutUnit>(logicalHeight, valueForLength(styleToUse.logicalMinHeight(), availableLogicalHeight)); } else { logicalHeight = std::max<LayoutUnit>(logicalHeight, computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), intrinsicContentHeight)); } return logicalHeight; } ____________ ^ Something along these lines (not compile and give error on std::min and std::max). no matching function for call to 'max'..
Radar WebKit Bug Importer
Comment 2 2023-08-02 16:57:18 PDT
Ahmad Saleem
Comment 3 2024-01-24 16:08:03 PST
This compiles: LayoutUnit RenderBox::constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight, std::optional<LayoutUnit> intrinsicContentHeight) const { // If the min/max height and logical height are both percentages we take advantage of already knowing the current resolved percentage height // to avoid recursing up through our containing blocks again to determine it. const RenderStyle& styleToUse = style(); if (!styleToUse.logicalMaxHeight().isUndefined()) { if (styleToUse.logicalMaxHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { auto availableLogicalHeight = logicalHeight / (styleToUse.logicalHeight().value() * 100); logicalHeight = std::min(logicalHeight, valueForLength(styleToUse.logicalMaxHeight(), availableLogicalHeight)); } else { std::optional<LayoutUnit> maxH = computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), intrinsicContentHeight); logicalHeight = std::min(logicalHeight, maxH.value()); } } if (styleToUse.logicalMinHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { auto availableLogicalHeight = logicalHeight / (styleToUse.logicalHeight().value() * 100); logicalHeight = std::max(logicalHeight, valueForLength(styleToUse.logicalMinHeight(), availableLogicalHeight)); } else { if (std::optional<LayoutUnit> computedContentLogicalHeight = computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), intrinsicContentHeight)) return std::max(logicalHeight, computedContentLogicalHeight.value()); } return logicalHeight; } __ Plus with this I get following in JSFiddle: Running 20 times Ignoring warm-up run (4405.269761606022 runs/s) 4416.562107904646 runs/s 4416.56210790464 runs/s 4400.000000000003 runs/s 4433.249370277081 runs/s 4383.561643835616 runs/s 4422.110552763819 runs/s 4444.44444444445 runs/s 4438.839848675909 runs/s 4416.562107904652 runs/s 4405.506883604496 runs/s 4422.110552763819 runs/s 4438.839848675914 runs/s 4394.5068664169785 runs/s 4433.249370277088 runs/s 4416.562107904622 runs/s 4433.249370277088 runs/s 4438.839848675914 runs/s 4422.110552763819 runs/s 4427.672955974843 runs/s 4405.506883604486 runs/s Description: Measures performance of nested divs with percent values for height and max-height. Time: values 4416.562107904646, 4416.56210790464, 4400.000000000003, 4433.249370277081, 4383.561643835616, 4422.110552763819, 4444.44444444445, 4438.839848675909, 4416.562107904652, 4405.506883604496, 4422.110552763819, 4438.839848675914, 4394.5068664169785, 4433.249370277088, 4416.562107904622, 4433.249370277088, 4438.839848675914, 4422.110552763819, 4427.672955974843, 4405.506883604486 runs/s avg 4420.502371232495 runs/s median 4422.110552763819 runs/s stdev 16.38550213770903 runs/s min 4383.561643835616 runs/s max 4444.44444444445 runs/s
Ahmad Saleem
Comment 4 2024-01-26 07:20:57 PST
(In reply to Ahmad Saleem from comment #3) > This compiles: > > LayoutUnit RenderBox::constrainContentBoxLogicalHeightByMinMax(LayoutUnit > logicalHeight, std::optional<LayoutUnit> intrinsicContentHeight) const > { > // If the min/max height and logical height are both percentages we take > advantage of already knowing the current resolved percentage height > // to avoid recursing up through our containing blocks again to > determine it. > const RenderStyle& styleToUse = style(); > if (!styleToUse.logicalMaxHeight().isUndefined()) { > if (styleToUse.logicalMaxHeight().isPercent() && > styleToUse.logicalHeight().isPercent()) { > auto availableLogicalHeight = logicalHeight / > (styleToUse.logicalHeight().value() * 100); > logicalHeight = std::min(logicalHeight, > valueForLength(styleToUse.logicalMaxHeight(), availableLogicalHeight)); > } else { > std::optional<LayoutUnit> maxH = > computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), > intrinsicContentHeight); > logicalHeight = std::min(logicalHeight, maxH.value()); > } > } > > if (styleToUse.logicalMinHeight().isPercent() && > styleToUse.logicalHeight().isPercent()) { > auto availableLogicalHeight = logicalHeight / > (styleToUse.logicalHeight().value() * 100); > logicalHeight = std::max(logicalHeight, > valueForLength(styleToUse.logicalMinHeight(), availableLogicalHeight)); > } else { > if (std::optional<LayoutUnit> computedContentLogicalHeight = > computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), > intrinsicContentHeight)) > return std::max(logicalHeight, > computedContentLogicalHeight.value()); > } > > return logicalHeight; > } > > __ > > Plus with this I get following in JSFiddle: > > Running 20 times > Ignoring warm-up run (4405.269761606022 runs/s) > 4416.562107904646 runs/s > 4416.56210790464 runs/s > 4400.000000000003 runs/s > 4433.249370277081 runs/s > 4383.561643835616 runs/s > 4422.110552763819 runs/s > 4444.44444444445 runs/s > 4438.839848675909 runs/s > 4416.562107904652 runs/s > 4405.506883604496 runs/s > 4422.110552763819 runs/s > 4438.839848675914 runs/s > 4394.5068664169785 runs/s > 4433.249370277088 runs/s > 4416.562107904622 runs/s > 4433.249370277088 runs/s > 4438.839848675914 runs/s > 4422.110552763819 runs/s > 4427.672955974843 runs/s > 4405.506883604486 runs/s > Description: Measures performance of nested divs with percent values for > height and max-height. > > Time: > values 4416.562107904646, 4416.56210790464, 4400.000000000003, > 4433.249370277081, 4383.561643835616, 4422.110552763819, 4444.44444444445, > 4438.839848675909, 4416.562107904652, 4405.506883604496, 4422.110552763819, > 4438.839848675914, 4394.5068664169785, 4433.249370277088, 4416.562107904622, > 4433.249370277088, 4438.839848675914, 4422.110552763819, 4427.672955974843, > 4405.506883604486 runs/s > avg 4420.502371232495 runs/s > median 4422.110552763819 runs/s > stdev 16.38550213770903 runs/s > min 4383.561643835616 runs/s > max 4444.44444444445 runs/s This will lead to crashes on https://pakgamers.com/index.php while 'run-mini browser --release' (Partial Output): Translated Report (Full Report Below) ------------------------------------- Process: com.apple.WebKit.WebContent.Development [17645] Path: /Users/USER/Documents/*/com.apple.WebKit.WebContent.Development Identifier: com.apple.WebKit.WebContent Version: 619+ (619.1.1+) Code Type: ARM-64 (Native) Parent Process: launchd [1] Responsible: MiniBrowser [17530] User ID: 501 Date/Time: 2024-01-26 14:20:23.8730 +0000 OS Version: macOS 14.3 (23D56) Report Version: 12 Anonymous UUID: 0DA56C0F-DBEC-AF95-3B04-AC72B10B438B Sleep/Wake UUID: 51EEEA82-157D-4342-892A-6D2868A13E8C Time Awake Since Boot: 160000 seconds Time Since Wake: 1343 seconds System Integrity Protection: enabled Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Termination Reason: Namespace SIGNAL, Code 6 Abort trap: 6 Terminating Process: com.apple.WebKit.WebContent.Deve [17645] Application Specific Information: abort() called Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libsystem_kernel.dylib 0x181a360dc __pthread_kill + 8 1 libsystem_pthread.dylib 0x181a6dcc0 pthread_kill + 288 2 libsystem_c.dylib 0x181979a40 abort + 180 3 WebCore 0x115b72f28 std::__1::__throw_bad_optional_access[abi:v160006]() + 12 (optional:214) 4 WebCore 0x1179182ec std::__1::optional<WebCore::LayoutUnit>::value[abi:v160006]() & + 4 (optional:1004) [inlined] 5 WebCore 0x1179182ec WebCore::RenderBox::constrainContentBoxLogicalHeightByMinMax(WebCore::LayoutUnit, std::__1::optional<WebCore::LayoutUnit>) const + 608 (RenderBox.cpp:766) 6 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 7 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 8 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 9 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 10 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 11 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 12 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 13 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 14 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 15 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 16 WebCore 0x117948058 WebCore::RenderBox::availableLogicalHeightUsing(WebCore::Length const&, WebCore::AvailableLogicalHeightType) const + 1452 (RenderBox.cpp:3826) 17 WebCore 0x117947a94 WebCore::RenderBox::availableLogicalHeight(WebCore::AvailableLogicalHeightType) const + 64 (RenderBox.cpp:3785) 18 WebCore 0x11793da00 WebCore::RenderBox::containingBlockAvailableLineWidthInFragment(WebCore::RenderFragmentContainer*) const + 192 (RenderBox.cpp:2362) 19 WebCore 0x117a1c2a4 WebCore::RenderTable::updateLogicalWidth() + 1712 (RenderTable.cpp:326) 20 WebCore 0x117a1d6fc WebCore::RenderTable::layout() + 348 (RenderTable.cpp:468) 21 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 22 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 23 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 24 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 25 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 26 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 27 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 28 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 29 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 30 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 31 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 32 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 33 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 34 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 35 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 36 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 37 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 38 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 39 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 40 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 41 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 42 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 43 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 44 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 45 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 46 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 47 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 48 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 49 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 50 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 51 WebCore 0x11797b134 WebCore::RenderElement::layoutIfNeeded() + 60 (RenderElement.cpp:2443) [inlined] 52 WebCore 0x11797b134 WebCore::RenderFlexibleBox::layoutAndPlaceChildren(WebCore::LayoutUnit&, WTF::Vector<WebCore::FlexItem, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>&, WebCore::LayoutUnit, bool, WTF::Vector<WebCore::RenderFlexibleBox::LineState, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>&, WebCore::LayoutUnit) + 1756 (RenderFlexibleBox.cpp:2229) 53 WebCore 0x117975050 WebCore::RenderFlexibleBox::layoutFlexItems(bool) + 1084 (RenderFlexibleBox.cpp:1377) 54 WebCore 0x11797464c WebCore::RenderFlexibleBox::layoutBlock(bool, WebCore::LayoutUnit) + 912 (RenderFlexibleBox.cpp:462) 55 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 56 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 57 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 58 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 59 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 60 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 61 WebCore 0x117979694 WebCore::RenderElement::layoutIfNeeded() + 16 (RenderElement.cpp:2443) [inlined] 62 WebCore 0x117979694 WebCore::RenderFlexibleBox::maybeCacheChildMainIntrinsicSize(WebCore::RenderBox&, bool) + 328 (RenderFlexibleBox.cpp:1696) 63 WebCore 0x117979268 WebCore::RenderFlexibleBox::computeFlexBaseSizeForChild(WebCore::RenderBox&, WebCore::LayoutUnit, bool) + 284 (RenderFlexibleBox.cpp:1269) 64 WebCore 0x11797a284 WebCore::RenderFlexibleBox::constructFlexItem(WebCore::RenderBox&, bool) + 324 (RenderFlexibleBox.cpp:1713) 65 WebCore 0x117974cf8 WebCore::RenderFlexibleBox::layoutFlexItems(bool) + 228 (RenderFlexibleBox.cpp:1322) 66 WebCore 0x11797464c WebCore::RenderFlexibleBox::layoutBlock(bool, WebCore::LayoutUnit) + 912 (RenderFlexibleBox.cpp:462) 67 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 68 WebCore 0x11797b134 WebCore::RenderElement::layoutIfNeeded() + 60 (RenderElement.cpp:2443) [inlined] 69 WebCore 0x11797b134 WebCore::RenderFlexibleBox::layoutAndPlaceChildren(WebCore::LayoutUnit&, WTF::Vector<WebCore::FlexItem, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>&, WebCore::LayoutUnit, bool, WTF::Vector<WebCore::RenderFlexibleBox::LineState, 0ul, WTF::CrashOnOverflow, 16ul, WTF::FastMalloc>&, WebCore::LayoutUnit) + 1756 (RenderFlexibleBox.cpp:2229) 70 WebCore 0x117975050 WebCore::RenderFlexibleBox::layoutFlexItems(bool) + 1084 (RenderFlexibleBox.cpp:1377) 71 WebCore 0x11797464c WebCore::RenderFlexibleBox::layoutBlock(bool, WebCore::LayoutUnit) + 912 (RenderFlexibleBox.cpp:462) 72 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 73 WebCore 0x117979694 WebCore::RenderElement::layoutIfNeeded() + 16 (RenderElement.cpp:2443) [inlined] 74 WebCore 0x117979694 WebCore::RenderFlexibleBox::maybeCacheChildMainIntrinsicSize(WebCore::RenderBox&, bool) + 328 (RenderFlexibleBox.cpp:1696) 75 WebCore 0x117979268 WebCore::RenderFlexibleBox::computeFlexBaseSizeForChild(WebCore::RenderBox&, WebCore::LayoutUnit, bool) + 284 (RenderFlexibleBox.cpp:1269) 76 WebCore 0x11797a284 WebCore::RenderFlexibleBox::constructFlexItem(WebCore::RenderBox&, bool) + 324 (RenderFlexibleBox.cpp:1713) 77 WebCore 0x117974cf8 WebCore::RenderFlexibleBox::layoutFlexItems(bool) + 228 (RenderFlexibleBox.cpp:1322) 78 WebCore 0x11797464c WebCore::RenderFlexibleBox::layoutBlock(bool, WebCore::LayoutUnit) + 912 (RenderFlexibleBox.cpp:462) 79 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 80 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 81 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 82 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 83 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 84 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 85 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 86 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 87 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 88 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 89 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 90 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 91 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 92 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 93 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 94 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 95 WebCore 0x117922a24 WebCore::RenderBlockFlow::layoutBlockChild(WebCore::RenderBox&, WebCore::RenderBlockFlow::MarginInfo&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 1044 (RenderBlockFlow.cpp:1116) 96 WebCore 0x117921f2c WebCore::RenderBlockFlow::layoutBlockChildren(bool, WebCore::LayoutUnit&) + 1056 (RenderBlockFlow.cpp:934) 97 WebCore 0x11792064c WebCore::RenderBlockFlow::layoutInFlowChildren(bool, WebCore::LayoutUnit&, WebCore::LayoutUnit&, WebCore::LayoutUnit&) + 116 (RenderBlockFlow.cpp:829) 98 WebCore 0x11791f618 WebCore::RenderBlockFlow::layoutBlock(bool, WebCore::LayoutUnit) + 1340 (RenderBlockFlow.cpp:551) 99 WebCore 0x117905b64 WebCore::RenderBlock::layout() + 56 (RenderBlock.cpp:582) 100 WebCore 0x117a5ee30 WebCore::RenderView::layout() + 700 (RenderView.cpp:199) 101 WebCore 0x11751e848 WebCore::LocalFrameViewLayoutContext::performLayout() + 856 (LocalFrameViewLayoutContext.cpp:236) 102 WebCore 0x117508a90 WebCore::LocalFrameViewLayoutContext::layout() + 40 (LocalFrameViewLayoutContext.cpp:151) 103 WebCore 0x116ec98d0 WebCore::Document::updateLayout(WTF::OptionSet<WebCore::LayoutOptions>, WebCore::Element const*) + 640 (Document.cpp:2710) 104 WebCore 0x116ef1d6c WebCore::Document::hitTest(WebCore::HitTestRequest const&, WebCore::HitTestLocation const&, WebCore::HitTestResult&) + 128 (Document.cpp:9910) 105 WebCore 0x116ed7fc4 WebCore::Document::hitTest(WebCore::HitTestRequest const&, WebCore::HitTestResult&) + 20 (Document.cpp:9893) [inlined] 106 WebCore 0x116ed7fc4 WebCore::Document::prepareMouseEvent(WebCore::HitTestRequest const&, WebCore::LayoutPoint const&, WebCore::PlatformMouseEvent const&) + 160 (Document.cpp:4785) 107 WebCore 0x1174d0bb8 WebCore::EventHandler::prepareMouseEvent(WebCore::HitTestRequest const&, WebCore::PlatformMouseEvent const&) + 316 (EventHandler.cpp:2679) 108 WebCore 0x1174d12e0 WebCore::EventHandler::handleMouseMoveEvent(WebCore::PlatformMouseEvent const&, WebCore::HitTestResult*, bool) + 840 (EventHandler.cpp:2137) 109 WebCore 0x1174d0e5c WebCore::EventHandler::mouseMoved(WebCore::PlatformMouseEvent const&) + 220 (EventHandler.cpp:2033) 110 WebKit 0x108a70894 WebKit::WebFrame::handleMouseEvent(WebKit::WebMouseEvent const&) + 456 (WebFrame.cpp:1269) 111 WebKit 0x108bdc928
Ahmad Saleem
Comment 5 2024-06-01 19:27:29 PDT
This compiles and does not seems to crash: LayoutUnit RenderBox::constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight, std::optional<LayoutUnit> intrinsicContentHeight) const { // If the min/max height and logical height are both percentages we take advantage of already knowing the current resolved percentage height // to avoid recursing up through our containing blocks again to determine it. const RenderStyle& styleToUse = style(); if (!styleToUse.logicalMaxHeight().isUndefined()) { if (styleToUse.logicalMaxHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { auto availableLogicalHeight = logicalHeight / (styleToUse.logicalHeight().value() * 100); logicalHeight = std::min(logicalHeight, valueForLength(styleToUse.logicalMaxHeight(), availableLogicalHeight)); } else { if (std::optional<LayoutUnit> maxH = computeContentLogicalHeight(MaxSize, styleToUse.logicalMaxHeight(), intrinsicContentHeight)) logicalHeight = std::min(logicalHeight, maxH.value()); } } if (styleToUse.logicalMinHeight().isPercent() && styleToUse.logicalHeight().isPercent()) { auto availableLogicalHeight = logicalHeight / (styleToUse.logicalHeight().value() * 100); logicalHeight = std::max(logicalHeight, valueForLength(styleToUse.logicalMinHeight(), availableLogicalHeight)); } else { if (std::optional<LayoutUnit> computedContentLogicalHeight = computeContentLogicalHeight(MinSize, styleToUse.logicalMinHeight(), intrinsicContentHeight)) return std::max(logicalHeight, computedContentLogicalHeight.value()); } return logicalHeight; }
EWS
Comment 6 2024-08-07 04:57:29 PDT
Committed 281938@main (ad938cfa1fbd): <https://commits.webkit.org/281938@main> Reviewed commits have been landed. Closing PR #31542 and removing active labels.
Note You need to log in before you can comment on or make changes to this bug.