Closed Bug 1380590 Opened 7 years ago Closed 7 years ago

stylo: the fill color should be transparent when `svg.context-properties.content.enabled=false` and no fallback color given

Categories

(Core :: CSS Parsing and Computation, enhancement, P2)

enhancement

Tracking

()

RESOLVED FIXED
mozilla57
Tracking Status
firefox57 --- fixed

People

(Reporter: tommykuo, Assigned: tommykuo)

References

Details

Attachments

(1 file, 2 obsolete files)

I'm working on Bug 1377158 to enable stylo for SVG-as-an-image. I found the test case "context-fill-02.html"[1] would be failed if stylo applied. The color expected is transparent, but we got black. [1]: http://searchfox.org/mozilla-central/rev/cef8389c687203085dc6b52de2fbd0260d7495bf/layout/reftests/svg/as-image/context-fill-02.html
Priority: -- → P1
Priority: P1 → --
Priority: -- → P3
svg.context-properties.content.enabled is disabled by default, so this probably should be P2 as it can affect content.
Priority: P3 → P2
Summary: stylo: the fill color should be transparent when `svg.context-properties.content.enabled` and no fallback color given → stylo: the fill color should be transparent when `svg.context-properties.content.enabled=false` and no fallback color given
I found `style->mFill.GetFallbackType()` should be `eStyleSVGFallbackType_None` at [1], but we got `eStyleSVGFallbackType_NotSet` on stylo. [1]: https://searchfox.org/mozilla-central/rev/51b3d67a5ec1758bd2fe7d7b6e75ad6b6b5da223/layout/svg/nsSVGUtils.cpp#1526
Attachment #8903511 - Flags: review?(xidorn+moz)
Attachment #8903512 - Flags: review?(xidorn+moz)
Comment on attachment 8903512 [details] Bug 1380590 - Support None and NotSet for the fallback of SVGPaint. https://reviewboard.mozilla.org/r/175346/#review180444 So it seems to me that Gecko actually distinguish between cases like `context-value none` and `context-value`. With the former, `mFallbackType` would be `eStyleSVGFallbackType_None`, and with the latter, it would be `eStyleSVGFallbackType_NotSet`. Have you done a try push and confirm that this wouldn't regress anything else? The spec seems to distinguish between these two cases, too, although the result seems to be effectively identical (both `none` and nothing leads to a fallback which renders nothing). [1] It does affect computed value, though. Ideally, we should probably change `SVGPaint` to take `Option<Option<ColorType>>` as fallback... Could you do that so that we match the spec's description as well as Gecko's impl? [1] https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint
Attachment #8903512 - Flags: review?(xidorn+moz)
Attachment #8903511 - Flags: review?(xidorn+moz) → review+
(In reply to Xidorn Quan [:xidorn] UTC+10 from comment #5) > Have you done a try push and confirm that this wouldn't regress anything > else? After the try finished, you're right. There are lots of regression with this patch. It seems to make lots of colors be transparent. > The spec seems to distinguish between these two cases, too, although the > result seems to be effectively identical (both `none` and nothing leads to a > fallback which renders nothing). [1] It does affect computed value, though. > > Ideally, we should probably change `SVGPaint` to take > `Option<Option<ColorType>>` as fallback... Could you do that so that we > match the spec's description as well as Gecko's impl? > > > [1] https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint I'll try your suggestion next week! Thx.
Comment on attachment 8903512 [details] Bug 1380590 - Support None and NotSet for the fallback of SVGPaint. https://reviewboard.mozilla.org/r/175346/#review180980 ::: servo/components/style/properties/gecko.mako.rs:746 (Diff revision 2) > if let Some(fallback) = fallback { > + if let Some(color) = fallback { > - paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_Color; > + paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_Color; > - paint.mFallbackColor = convert_rgba_to_nscolor(&fallback); > + paint.mFallbackColor = convert_rgba_to_nscolor(&color); > + } else { > + paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_None; > + } > + } else { > + paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_NotSet; > } It may be shorter if you use match like ```rust paint.mFallbackType = match fallback { Some(Some(color)) => { paint.mFallbackColor = convert_rgba_to_nscolor(&color); nsStyleSVGFallbackType::eStyleSVGFallbackType_Color } Some(None) => nsStyleSVGFallbackType::eStyleSVGFallbackType_None None => nsStyleSVGFallbackType::eStyleSVGFallbackType_NotSet }; ``` ::: servo/components/style/values/generics/svg.rs:24 (Diff revision 2) > /// The fallback color > - pub fallback: Option<ColorType>, > + pub fallback: Option<Option<ColorType>>, Please add comment here for the meaning of possible values. ::: servo/components/style/values/generics/svg.rs:68 (Diff revision 2) > /// https://svgwg.org/svg2-draft/painting.html#SpecifyingPaint > fn parse_fallback<'i, 't, ColorType: Parse>(context: &ParserContext, > input: &mut Parser<'i, 't>) > - -> Option<ColorType> { > + -> Option<Option<ColorType>> { > if input.try(|i| i.expect_ident_matching("none")).is_ok() { > - None > + // eStyleSVGFallbackType_None Please avoid mentioning Gecko constants in code which is not Gecko specific. Describing the meaning of each value in the comment of field should be enough.
Attachment #8903512 - Flags: review?(xidorn+moz)
Comment on attachment 8904195 [details] Pushed via 'mach try fuzzy' with query: linux64stylodevtool https://reviewboard.mozilla.org/r/175972/#review180982 Please do not include try fuzzy commit in mozreview push. I suppose 'mach try fuzzy' should remove this kind of commits automatically, so this could be a bug of that. You may want to report a bug for this.
(In reply to Xidorn Quan [:xidorn] UTC+10 from comment #11) > Comment on attachment 8904195 [details] > Pushed via 'mach try fuzzy' with query: linux64stylodevtool > > https://reviewboard.mozilla.org/r/175972/#review180982 > > Please do not include try fuzzy commit in mozreview push. I suppose 'mach > try fuzzy' should remove this kind of commits automatically, so this could > be a bug of that. You may want to report a bug for this. I think maybe that's caused by me... It is possibe that I used `git mozview push` when `mach try fuzzy` haven't finished.
Attachment #8904195 - Attachment is obsolete: true
Comment on attachment 8903512 [details] Bug 1380590 - Support None and NotSet for the fallback of SVGPaint. https://reviewboard.mozilla.org/r/175346/#review181024 ::: servo/components/style/values/generics/svg.rs:29 (Diff revision 3) > /// The fallback color > - pub fallback: Option<ColorType>, > + /// The possible value would be None, Some(None) or Some(Some(ColorType)). > + /// - None: empty > + /// - Some(None): the keyword `none` > + /// - Some(Some(ColorType)): color type > + pub fallback: Option<Option<ColorType>>, Ok, so I just realized that it doesn't work, because the derived `ToCss` would generate nothing for `Some(None)` just like `None`. Talked with :nox on IRC, the suggestion is to `Option<Either<ColorType, None_>>` here rather than a nested `Option`. This would allow the derived `ToCss` to serialize as expected.
Attachment #8903512 - Flags: review?(xidorn+moz)
Comment on attachment 8903512 [details] Bug 1380590 - Support None and NotSet for the fallback of SVGPaint. https://reviewboard.mozilla.org/r/175346/#review181130 ::: servo/components/style/properties/gecko.mako.rs:746 (Diff revision 4) > - if let Some(fallback) = fallback { > - paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_Color; > - paint.mFallbackColor = convert_rgba_to_nscolor(&fallback); > + paint.mFallbackType = match fallback { > + Some(fallback) => { > + match fallback { > + Either::First(color) => { > + paint.mFallbackColor = convert_rgba_to_nscolor(&color); > + nsStyleSVGFallbackType::eStyleSVGFallbackType_Color > + }, > + Either::Second(_) => { > + nsStyleSVGFallbackType::eStyleSVGFallbackType_None > + } > - } > + } You can still use just one level of `match`, actually. It may not matter a lot, though.
Attachment #8903512 - Flags: review?(xidorn+moz) → review+
(In reply to Xidorn Quan [:xidorn] UTC+10 from comment #16) > You can still use just one level of `match`, actually. It may not matter a > lot, though. Updated, I also prefer the one level version. Thx.
Attachment #8903512 - Attachment is obsolete: true
Status: NEW → RESOLVED
Closed: 7 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla57
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: