diff options
author | win7-7 <win7-7@users.noreply.github.com> | 2022-04-18 13:15:28 +0300 |
---|---|---|
committer | win7-7 <win7-7@users.noreply.github.com> | 2022-04-18 13:15:28 +0300 |
commit | 5b84c3e982140280c00ab697d7fcad519a7a71a1 (patch) | |
tree | 85d184a9cd3747af702d75ec60c23f1d19b459da /layout | |
parent | d347a1e0c6f921f88ddb596379aea26bf1bf5144 (diff) | |
parent | 3abcec5d8bc1e4b420ef4b8a2e4b96433d67e2c7 (diff) | |
download | uxp-5b84c3e982140280c00ab697d7fcad519a7a71a1.tar.gz |
Merge branch 'master' into pr-1860
Diffstat (limited to 'layout')
-rw-r--r-- | layout/base/nsGenConList.cpp | 11 | ||||
-rw-r--r-- | layout/base/nsGenConList.h | 6 | ||||
-rw-r--r-- | layout/generic/nsFrame.cpp | 9 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html | 64 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-2.html | 73 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html | 66 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-3.html | 75 | ||||
-rw-r--r-- | layout/reftests/flexbox/reftest.list | 2 | ||||
-rw-r--r-- | layout/style/Declaration.cpp | 12 | ||||
-rw-r--r-- | layout/style/nsCSSParser.cpp | 46 |
10 files changed, 331 insertions, 33 deletions
diff --git a/layout/base/nsGenConList.cpp b/layout/base/nsGenConList.cpp index bdb47e1838..fb0733f2e7 100644 --- a/layout/base/nsGenConList.cpp +++ b/layout/base/nsGenConList.cpp @@ -19,6 +19,7 @@ nsGenConList::Clear() delete node; } mSize = 0; + mLastInserted = nullptr; } bool @@ -41,6 +42,9 @@ nsGenConList::DestroyNodesFor(nsIFrame* aFrame) node = nextNode; } + // Modification of the list invalidates the cached pointer. + mLastInserted = nullptr; + return true; } @@ -108,6 +112,11 @@ nsGenConList::Insert(nsGenConNode* aNode) // Check for append. if (mList.isEmpty() || NodeAfter(aNode, mList.getLast())) { mList.insertBack(aNode); + } else if (mLastInserted && mLastInserted != mList.getLast() && + NodeAfter(aNode, mLastInserted) && + NodeAfter(Next(mLastInserted), aNode)) { + // Fast path for inserting many consecutive nodes in one place + mLastInserted->setNext(aNode); } else { // Binary search. @@ -142,6 +151,8 @@ nsGenConList::Insert(nsGenConNode* aNode) } ++mSize; + mLastInserted = aNode; + // Set the mapping only if it is the first node of the frame. // The DEBUG blocks below are for ensuring the invariant required by // nsGenConList::DestroyNodesFor. See comment there. diff --git a/layout/base/nsGenConList.h b/layout/base/nsGenConList.h index 55bf6bc32e..58421d4301 100644 --- a/layout/base/nsGenConList.h +++ b/layout/base/nsGenConList.h @@ -86,7 +86,7 @@ protected: uint32_t mSize; public: - nsGenConList() : mSize(0) {} + nsGenConList() : mSize(0), mLastInserted(nullptr) {} ~nsGenConList() { Clear(); } void Clear(); static nsGenConNode* Next(nsGenConNode* aNode) { @@ -127,6 +127,10 @@ private: // Map from frame to the first nsGenConNode of it in the list. nsDataHashtable<nsPtrHashKey<nsIFrame>, nsGenConNode*> mNodes; + + // A weak pointer to the node most recently inserted, used to avoid repeated + // list traversals in Insert(). + nsGenConNode* mLastInserted; }; #endif /* nsGenConList_h___ */ diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 458b18abd9..af3d2f9457 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -4645,6 +4645,13 @@ nsFrame::SetCoordToFlexBasis(bool aIsInlineFlexItem, auto mainAxisCoord = aIsInlineFlexItem ? aInlineStyle : aBlockStyle; + // NOTE: If we're a table-wrapper frame, we skip this clause and just stick + // with 'main-size:auto' behavior (which -- unlike 'content' + // i.e. 'max-content' -- will give us the ability to honor percent sizes on + // our table-box child when resolving the flex base size). The flexbox spec + // doesn't call for this special case, but webcompat & regression-avoidance + // seems to require it, for the time being... Tables sure are special. + bool isTableWrapperFrame = GetType() == nsGkAtoms::tableWrapperFrame; // We have a used flex-basis of 'content' if flex-basis explicitly has that // value, OR if flex-basis is 'auto' (deferring to the main-size property) // and the main-size property is also 'auto'. @@ -4665,7 +4672,7 @@ nsFrame::SetCoordToFlexBasis(bool aIsInlineFlexItem, // which substep we fall into) by using the 'auto' keyword for our // main-axis coordinate here. (This makes sense, because the spec is // effectively trying to produce the 'auto' sizing behavior). - if (aIntrinsic) { + if (aIntrinsic || MOZ_LIKELY(isTableWrapperFrame)) { static const nsStyleCoord autoStyleCoord(eStyleUnit_Auto); *mainAxisCoord = &autoStyleCoord; } else { diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html b/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html new file mode 100644 index 0000000000..98a93716a5 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title>CSS Reftest Reference</title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <style> + .container { + display: flex; + width: 100px; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="width: 30px"><ib></ib></div> + <div class="block" style="width: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="width: 30%"><ib></ib></div> + <div class="block" style="width: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="width: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="width: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-2.html b/layout/reftests/flexbox/flexbox-table-flex-items-2.html new file mode 100644 index 0000000000..c11ce70802 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-2.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + </title> + <!-- XXXdholbert NOTE: This probably eventually should move to our + upstreamed reftest directory. But for now, this is just asserting + backwards-compatible/interoperable (but not necessary spec-compliant) + behavior, per https://github.com/w3c/csswg-drafts/issues/2604 --> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <link rel="match" href="flexbox-table-flex-items-2.html"> + <style> + .container { + display: flex; + width: 100px; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + display: table; + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="width: 30px"><ib></ib></div> + <div class="block" style="width: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="width: 30%"><ib></ib></div> + <div class="block" style="width: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="width: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="width: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html b/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html new file mode 100644 index 0000000000..568495f341 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title>CSS Reftest Reference</title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <style> + .container { + display: flex; + flex-direction: column; + height: 100px; + float: left; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="height: 30px"><ib></ib></div> + <div class="block" style="height: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="height: 30%"><ib></ib></div> + <div class="block" style="height: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="height: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="height: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-3.html b/layout/reftests/flexbox/flexbox-table-flex-items-3.html new file mode 100644 index 0000000000..c68152856f --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-3.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + </title> + <!-- XXXdholbert NOTE: This probably eventually should move to our + upstreamed reftest directory. But for now, this is just asserting + backwards-compatible/interoperable (but not necessary spec-compliant) + behavior, per https://github.com/w3c/csswg-drafts/issues/2604 --> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <link rel="match" href="flexbox-table-flex-items-3.html"> + <style> + .container { + display: flex; + flex-direction: column; + height: 100px; + float: left; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + display: table; + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="height: 30px"><ib></ib></div> + <div class="block" style="height: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="height: 30%"><ib></ib></div> + <div class="block" style="height: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="height: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="height: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> diff --git a/layout/reftests/flexbox/reftest.list b/layout/reftests/flexbox/reftest.list index be156100e8..075b789026 100644 --- a/layout/reftests/flexbox/reftest.list +++ b/layout/reftests/flexbox/reftest.list @@ -116,3 +116,5 @@ fuzzy-if(gtkWidget,1,31) == flexbox-widget-flex-items-4.html flexbox-widget-flex # Tests for table flex items == flexbox-table-flex-items-1-ref.html flexbox-table-flex-items-1-ref.html +== flexbox-table-flex-items-2.html flexbox-table-flex-items-2-ref.html +== flexbox-table-flex-items-3.html flexbox-table-flex-items-3-ref.html diff --git a/layout/style/Declaration.cpp b/layout/style/Declaration.cpp index 9e7a01aff5..29cae7a3b6 100644 --- a/layout/style/Declaration.cpp +++ b/layout/style/Declaration.cpp @@ -1248,18 +1248,6 @@ Declaration::GetPropertyValueInternal( // #2 <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? // #3 [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'> case eCSSProperty_grid: { - const nsCSSValue& columnGapValue = - *data->ValueFor(eCSSProperty_column_gap); - if (columnGapValue.GetUnit() != eCSSUnit_Pixel || - columnGapValue.GetFloatValue() != 0.0f) { - return; // Not serializable, bail. - } - const nsCSSValue& rowGapValue = - *data->ValueFor(eCSSProperty_row_gap); - if (rowGapValue.GetUnit() != eCSSUnit_Pixel || - rowGapValue.GetFloatValue() != 0.0f) { - return; // Not serializable, bail. - } const nsCSSValue& areasValue = *data->ValueFor(eCSSProperty_grid_template_areas); const nsCSSValue& columnsValue = diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index b409bfed7e..2ba1e9b7f3 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -9710,13 +9710,6 @@ CSSParserImpl::ParseGrid() return true; } - // https://drafts.csswg.org/css-grid/#grid-shorthand - // "Also, the gutter properties are reset by this shorthand, - // even though they can't be set by it." - value.SetFloatValue(0.0f, eCSSUnit_Pixel); - AppendValue(eCSSProperty_row_gap, value); - AppendValue(eCSSProperty_column_gap, value); - // [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'> auto res = ParseGridShorthandAutoProps(NS_STYLE_GRID_AUTO_FLOW_ROW); if (res == CSSParseResult::Error) { @@ -9843,7 +9836,22 @@ CSSParserImpl::ParseGridLine(nsCSSValue& aValue) // Make the contained value be defined even though we really want a // Nothing here. This works around an otherwise difficult to avoid // Memcheck false positive when this is compiled by gcc-5.3 -O2. - // See bug 1301856. + // The problem is that gcc 5.4 and later, when using high + // optimization, inline Maybe::{isSome,ref} here + // + // if (integer.isSome() && integer.ref() < 0) { + // + // and then proceed to evaluate the expression right-to-left, as if it + // had been written + // + // integer.ref() < 0 && integer.isSome() + // + // This is a legitimate transformation because gcc presumably can prove + // via dataflow analysis that integer.isSome() is false whenever integer.ref() + // is undefined, so the overall expression result is still defined. + // Valgrind/Memcheck assumes that all conditional branches in the program + // are important, and that assumption is deeply wired in, so there is no + // easy way to avoid the warning apart from to force-initialise |integer|. integer.emplace(0); integer.reset(); #endif @@ -15314,17 +15322,17 @@ CSSParserImpl::ParseFontFeatureSettings(nsCSSValue& aValue) return true; } -bool
-CSSParserImpl::ParseFontVariationSettings(nsCSSValue& aValue)
-{
- // TODO: Actually implement this.
-
- // This stub is here because websites insist on considering this
- // very hardware-dependent and O.S.-variable low-level font-control
- // as a "critical feature" which it isn't as there is 0 guarantee
- // that font variation settings are supported or honored by any
- // operating system used by the client.
- return true;
+bool +CSSParserImpl::ParseFontVariationSettings(nsCSSValue& aValue) +{ + // TODO: Actually implement this. + + // This stub is here because websites insist on considering this + // very hardware-dependent and O.S.-variable low-level font-control + // as a "critical feature" which it isn't as there is 0 guarantee + // that font variation settings are supported or honored by any + // operating system used by the client. + return true; } bool |