WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
186344
font-synthesis inline/computed style in non-canonical
https://bugs.webkit.org/show_bug.cgi?id=186344
Summary
font-synthesis inline/computed style in non-canonical
Eric Willigers
Reported
2018-06-06 04:08:48 PDT
Test case:
https://jsfiddle.net/ericwilligers/2q9cmrha/
Spec:
https://drafts.csswg.org/css-fonts-3/#propdef-font-synthesis
none | [ weight || style ] If the values 'weight style' or 'style weight' are assigned, the computed style should be 'weight style', but WebKit gives 'style weight'.
Attachments
Patch
(7.17 KB, patch)
2021-11-02 17:59 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Patch
(44.41 KB, patch)
2021-11-02 22:23 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Patch
(69.44 KB, patch)
2021-11-03 06:07 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Update layout test results for ios and common
(98.48 KB, patch)
2021-11-04 00:39 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Canonicalize CSSValueList at parsing stage in consumeFontSynthesis
(98.64 KB, patch)
2021-11-05 21:51 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Patch for landing
(98.15 KB, patch)
2021-11-06 05:00 PDT
,
Joonghun Park
no flags
Details
Formatted Diff
Diff
Show Obsolete
(5)
View All
Add attachment
proposed patch, testcase, etc.
Myles C. Maxfield
Comment 1
2018-06-18 15:59:45 PDT
I thought the spec was in the process of changing the syntax fairly dramatically? I mean, we can flip the order super easily, but if we're going to be changing our implementation substantially, we may want to wait.
Sam Sneddon [:gsnedders]
Comment 2
2021-10-20 08:34:58 PDT
Looks like we're gaining interoperability on that ordering, so I guess we should:
https://wpt.fyi/results/css/css-fonts/parsing/font-synthesis-valid.html?label=master&label=experimental&product=chrome&product=firefox&product=webkitgtk&product=safari&aligned
Joonghun Park
Comment 3
2021-11-02 17:59:21 PDT
Created
attachment 443153
[details]
Patch
Joonghun Park
Comment 4
2021-11-02 18:54:30 PDT
Comment on
attachment 443153
[details]
Patch Layout test results will be updated with the next patchset.
Myles C. Maxfield
Comment 5
2021-11-02 19:08:07 PDT
Comment on
attachment 443153
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=443153&action=review
r=mews
> Source/WebCore/css/StyleProperties.cpp:173 > + case CSSPropertyFontSynthesis: > + return fontSynthesisPropertyValue(*value);
This is a surprising place for this code. Why is this here and not below (or maybe even in another function?)
Simon Fraser (smfr)
Comment 6
2021-11-02 20:04:30 PDT
Comment on
attachment 443153
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=443153&action=review
>> Source/WebCore/css/StyleProperties.cpp:173 >> + return fontSynthesisPropertyValue(*value); > > This is a surprising place for this code. Why is this here and not below (or maybe even in another function?)
Falling through from CSSPropertyStrokeOpacity and returning a fontSynthesisPropertyValue() doesn't seem right.
Joonghun Park
Comment 7
2021-11-02 21:05:05 PDT
Comment on
attachment 443153
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=443153&action=review
>>> Source/WebCore/css/StyleProperties.cpp:173 >>> + return fontSynthesisPropertyValue(*value); >> >> This is a surprising place for this code. Why is this here and not below (or maybe even in another function?) > > Falling through from CSSPropertyStrokeOpacity and returning a fontSynthesisPropertyValue() doesn't seem right.
I moved this callsite to above. Originally I placed this here because it was right before default switch but I didn't see the FALLTHROUGH. And it seems that below place is for shorthand properties, so I will place this call as below. if (auto value = getPropertyCSSValue(propertyID)) { switch (propertyID) { case CSSPropertyFontSynthesis: return fontSynthesisPropertyValue(*value); case CSSPropertyFillOpacity: case CSSPropertyFloodOpacity: ...
Joonghun Park
Comment 8
2021-11-02 22:23:50 PDT
Created
attachment 443174
[details]
Patch
Joonghun Park
Comment 9
2021-11-02 22:59:56 PDT
I updated layout test result on Ubuntu 21.10 and will update layout test result on macOS 12.0.1 too in the next patchset.
Joonghun Park
Comment 10
2021-11-03 06:07:11 PDT
Created
attachment 443195
[details]
Patch
Joonghun Park
Comment 11
2021-11-03 06:19:48 PDT
Could you please review this patch again? I think this patch is ready for review now.
Joonghun Park
Comment 12
2021-11-04 00:39:26 PDT
Created
attachment 443281
[details]
Update layout test results for ios and common
Joonghun Park
Comment 13
2021-11-04 13:55:14 PDT
Hi, please review this patch when you are available. It seems that ews has passed.
Myles C. Maxfield
Comment 14
2021-11-05 17:23:47 PDT
Comment on
attachment 443281
[details]
Update layout test results for ios and common View in context:
https://bugs.webkit.org/attachment.cgi?id=443281&action=review
> Source/WebCore/css/StyleProperties.cpp:505 > +String StyleProperties::fontSynthesisPropertyValue(CSSValue& value) const > +{ > + String valueStr = value.cssText(); > + if (isCSSWideValueKeyword(valueStr) || is<CSSPrimitiveValue>(value)) > + return valueStr; > + > + if (is<CSSValueList>(value)) { > + bool hasWeight = false; > + bool hasStyle = false; > + if (downcast<CSSValueList>(value).hasValue(CSSValuePool::singleton().createIdentifierValue(CSSValueWeight).ptr())) > + hasWeight = true; > + if (downcast<CSSValueList>(value).hasValue(CSSValuePool::singleton().createIdentifierValue(CSSValueStyle).ptr())) > + hasStyle = true; > + return makeString(hasWeight ? "weight" : "", (hasWeight && hasStyle) ? " " : "", hasStyle ? "style" : ""); > + } > + > + return String(); > +}
I think, instead of writing this function, we should change consumeFontSynthesis() in CSSPropertyParser.cpp to just canonicalize the list at parsing time. Canonicalizing at parse time would be a simpler solution, and there would not have to be another special case here - StyleProperties::getPropertyValue() would be entirely unmodified. Maybe something like this: bool foundWeight = false; bool foundStyle = false; bool foundSmallCaps = false; while (true) { auto ident = consumeIdent<CSSValueWeight, CSSValueStyle, CSSValueSmallCaps>(range); if (!ident) break; switch (ident->valueID()) { case CSSValueWeight: if (foundWeight) return nullptr; foundWeight = true; case CSSValueStyle: if (foundStyle) return nullptr; foundStyle = true; case CSSValueSmallCaps: if (foundSmallCaps) return nullptr; foundSmallCaps = true; } } RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); if (foundWeight) list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueWeight)); if (foundStyle) list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueStyle)); if (foundSmallCaps) list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueSmallCaps)); if (!list->length()) return nullptr; return list; It's probably even possible to make this more concise by using lambdas.
Joonghun Park
Comment 15
2021-11-05 20:39:37 PDT
Comment on
attachment 443281
[details]
Update layout test results for ios and common View in context:
https://bugs.webkit.org/attachment.cgi?id=443281&action=review
>> Source/WebCore/css/StyleProperties.cpp:505 >> +} > > I think, instead of writing this function, we should change consumeFontSynthesis() in CSSPropertyParser.cpp to just canonicalize the list at parsing time. Canonicalizing at parse time would be a simpler solution, and there would not have to be another special case here - StyleProperties::getPropertyValue() would be entirely unmodified. > > Maybe something like this: > > bool foundWeight = false; > bool foundStyle = false; > bool foundSmallCaps = false; > while (true) { > auto ident = consumeIdent<CSSValueWeight, CSSValueStyle, CSSValueSmallCaps>(range); > if (!ident) > break; > switch (ident->valueID()) { > case CSSValueWeight: > if (foundWeight) > return nullptr; > foundWeight = true; > case CSSValueStyle: > if (foundStyle) > return nullptr; > foundStyle = true; > case CSSValueSmallCaps: > if (foundSmallCaps) > return nullptr; > foundSmallCaps = true; > } > } > > RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); > if (foundWeight) > list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueWeight)); > if (foundStyle) > list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueStyle)); > if (foundSmallCaps) > list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueSmallCaps)); > > if (!list->length()) > return nullptr; > return list; > > It's probably even possible to make this more concise by using lambdas.
Thank you for your review, Myles:) I applied your comment in the next patchset and will upload it soon.
Joonghun Park
Comment 16
2021-11-05 21:51:33 PDT
Created
attachment 443477
[details]
Canonicalize CSSValueList at parsing stage in consumeFontSynthesis
Myles C. Maxfield
Comment 17
2021-11-06 00:45:04 PDT
Comment on
attachment 443477
[details]
Canonicalize CSSValueList at parsing stage in consumeFontSynthesis View in context:
https://bugs.webkit.org/attachment.cgi?id=443477&action=review
> Source/WebCore/css/parser/CSSPropertyParser.cpp:995 > + auto makeCanonicalizedList = [](CSSParserTokenRange& range) -> RefPtr<CSSValueList> {
The fact that this code is in a lambda doesn't seem to be useful. When I mentioned "lambda" I was suggesting using it as a tool to reduce (nearly-)duplicated code. If it's not possible to reduce (nearly-)duplicated code, I suggest we promote this code to no longer be within a lambda.
Joonghun Park
Comment 18
2021-11-06 04:57:58 PDT
Comment on
attachment 443477
[details]
Canonicalize CSSValueList at parsing stage in consumeFontSynthesis View in context:
https://bugs.webkit.org/attachment.cgi?id=443477&action=review
>> Source/WebCore/css/parser/CSSPropertyParser.cpp:995 >> + auto makeCanonicalizedList = [](CSSParserTokenRange& range) -> RefPtr<CSSValueList> { > > The fact that this code is in a lambda doesn't seem to be useful. When I mentioned "lambda" I was suggesting using it as a tool to reduce (nearly-)duplicated code. > > If it's not possible to reduce (nearly-)duplicated code, I suggest we promote this code to no longer be within a lambda.
I added a small tiny lambda below, except that I promoted all the codes to no longer be within a lambda in the next patchset. Thank you for your review. auto checkAndMarkExistence = [](bool* found) { if (*found) return false; return *found = true; };
Joonghun Park
Comment 19
2021-11-06 05:00:30 PDT
Created
attachment 443482
[details]
Patch for landing
EWS
Comment 20
2021-11-06 16:07:32 PDT
Committed
r285383
(
243940@main
): <
https://commits.webkit.org/243940@main
> All reviewed patches have been landed. Closing bug and clearing flags on
attachment 443482
[details]
.
Radar WebKit Bug Importer
Comment 21
2021-11-06 16:08:17 PDT
<
rdar://problem/85105405
>
Myles C. Maxfield
Comment 22
2021-11-06 16:18:00 PDT
Committed
r285384
(
243941@main
): <
https://commits.webkit.org/243941@main
>
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug