Closed Bug 281972 Opened 20 years ago Closed 20 years ago

A couple of -moz-outline-offset problems

Categories

(Core :: CSS Parsing and Computation, defect)

defect
Not set
minor

Tracking

()

RESOLVED FIXED

People

(Reporter: MatsPalmgren_bugz, Assigned: MatsPalmgren_bugz)

References

Details

(Keywords: testcase)

Attachments

(5 files, 3 obsolete files)

1. When using DOMI to inspect computed values I frequently see: WARNING: Double check the unit, file nsComputedDOMStyle.cpp, line 1411 on the console. http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/content/html/style/src/nsComputedDOMStyle.cpp&rev=1.134&root=/cvsroot&mark=1403#1376 2. CSS3 UI, http://www.w3.org/TR/css3-ui/#outline-offset says: Name: outline-offset Value: <length> | inherit but Mozilla accepts '-moz-outline-offset:medium' for example. Is this intentional? I have a fix for 1 but can fix 2 at the same time if you confirm it's a bug.
Attached file Testcase (deleted) —
I guess outline-offset will going to be like the properties are defined in CSS 2.1. So as <border-width>: <http://w3.org/TR/CSS21/box.html#value-def-border-width>.
That does not seem appropriate to me, given that this is an *offset* and not a *width*.
I also would prefer NS_ASSERTION instead of NS_WARNING in all the places where we get an unexpected unit in this file, because that should not happen for any input/operation.
Unless Robert and Aaron had really good reasons for doing outline-offset this way (and I don't see any in bug 251498), it looks like the patch for bug 251498 was just wrong; it implemented nothing remotely resembling the spec it linked to... See also bug 251498 comment 12 for the list of things that'd need fixing if we fix this to follow the spec.
Attached file Testcase #2 (deleted) —
There are more bugs I'm afraid... There is code to handle border-width and -moz-outline-width values of type eStyleUnit_Integer, eStyleUnit_Proportional and eStyleUnit_Chars. Integer/Proportional cannot occur but for eStyleUnit_Chars it does not seem correct to interpret it as an enum value. http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/content/html/style/src/nsComputedDOMStyle.cpp&rev=1.134&root=/cvsroot&mark=3355,3376-3377,3379#3355 Can someone explain why we have this non-CSS unit? It seems like it's just a synonym for 'em'? http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/content/html/style/src/nsRuleNode.cpp&rev=3.24&root=/cvsroot&mark=156,168,169#156 (It's accepted by the parser for *all* <length> type properties AFAICT) I would appreciate any guidance on how to handle this unit. Regarding '-moz-outline-style' the spec also says that 'auto' should be accepted (unlike 'border-style'): http://www.w3.org/TR/css3-ui/#outline-style We don't do that... Also, we should not accept 'hidden', which we currently do. Regarding '-moz-outline-width' we currently accept negative values, this does not seem right (it triggers warnings during reflow). Also, I wonder if the computed value should be zero when the '-moz-outline-style' is 'none' - like computed 'border-width'? (The spec does not say anything regarding this difference so I wonder if it is an oversight in the spec?) And there are bugs in '-moz-outline-radius' also... more on that later or perhaps in a different bug...
AAs long as outline-offset still accepts negative values. That's extremely useful.
It accepts whatever the spec says it accepts. If you don't like that, bring it up on the appropriate mailing list, not here.
Do you have a preference on how '-moz-outline-style:auto' should be rendered? This is what the spec says: "The 'auto' value permits the user agent to render a custom outline style, typically a style which is either a user interface default for the platform, or perhaps a style that is richer than can be described in detail in CSS, e.g. a rounded edge outline with semi-translucent outer pixels that appears to glow. As such, this specification does not define how the 'outline-color' is incorporated or used (if at all) when rendering 'auto' style outlines. User agents may treat 'auto' as 'solid'."
> Can someone explain why we have this non-CSS unit? I was just wondering that, the other day.. it's not supported for anything but widths in HTML, really... File a separate bug on that? The outline-style bugs sound like they need fixing (more broken copy-paste). > Regarding '-moz-outline-width' we currently accept negative values I don't see any exclusions of those in the spec, but that seems like a bug in the spec. Let's fix that in Gecko and raise the issue in www-style@w3.org? > Also, I wonder if the computed value should be zero Again, www-style issue. > Do you have a preference on how '-moz-outline-style:auto' should be rendered? I'd render as 'solid' for now unless we have strong reasons not to (eg on Mac? I recall that coming up).
> > Regarding '-moz-outline-width' we currently accept negative values > > I don't see any exclusions of those in the spec, but that seems like a bug in > the spec. Let's fix that in Gecko and raise the issue in www-style@w3.org? I think it's clear that negative values are not accepted: http://www.w3.org/TR/css3-ui/#outline-width says "Value: <border-width> | inherit" where <border-width> is a link to CSS2.1 definition which says: http://www.w3.org/TR/CSS21/box.html#value-def-border-width "<length> The border's thickness has an explicit value. Explicit border widths cannot be negative." And for '-moz-outline-offset' the definition is: http://www.w3.org/TR/css3-ui/#outline-offset "Value: <length> | inherit" and there is no text to exclude negative values there.
Ah, I missed it saying <border-width>. Yes, we should exclude negative values there; in fact, we should just parse it just like we do borde-width, sounds like.
(In reply to comment #11) > > Can someone explain why we have this non-CSS unit? > > ... it's not supported for anything but > widths in HTML, really... File a separate bug on that? Filed bug 282126
Attached patch fix (obsolete) (deleted) — Splinter Review
Fixes the outline-specific issues raised here (so far)
Attachment #174256 - Flags: superreview?(bzbarsky)
Attachment #174256 - Flags: review?(bzbarsky)
He, I was just about to attach a patch for this...
Attached patch Another fix (obsolete) (deleted) — Splinter Review
I like my patch better ;-) I think your patch will still assert on the 'ch' unit. Also, I tried hard to avoid adding 'auto' into the enum values. I think it makes a difference but maybe not...
I have asked www-style@w3.org what the computed value for 'offset-width' should be when 'offset-style' is 'none'. In my patch I assumed the answer is zero...
(In reply to comment #18) > I think your patch will still assert on the 'ch' unit. Yeah, I was hoping you'd fix all those in your other bug :-). > Also, I tried hard to avoid adding 'auto' into the enum values. I think it > makes a difference but maybe not... I don't see the point of avoiding adding 'auto' to kOutlineStyleKTable. Actually I would like to have NS_STYLE_BORDER_STYLE_AUTO, because then we can work towards making it draw a native focus ring on Mac and elsewhere, like Safari does.
Comment on attachment 174256 [details] [diff] [review] fix We generally avoid "auto" in the tables because it'd bloat a whole bunch of them. Just parse the outline style as VARIANT_HOK | VARIANT_AUTO as you do. Note that if you do that, having "auto" in the keyword table won't do you a bit of good, since the VARIANT_AUTO check causes "auto" to SetAutoValue() on the CSSValue and return. Then in the rulenode you need to deal with "auto" (map it into the desired value in the style struct). >Index: layout/style/nsRuleNode.cpp >+ } else { >+ outline->mOutlineOffset = 0; >+ } That seems wrong... What if the outline offset is just not specified in this rule? Should we really be nuking the value in the computed style then? Mats and Robert, sort out between the two of you who'll fix whihc part, ok? ;)
Attachment #174256 - Flags: superreview?(bzbarsky)
Attachment #174256 - Flags: superreview-
Attachment #174256 - Flags: review?(bzbarsky)
Attachment #174256 - Flags: review-
Since Mats likes his patch better, I'll let him do it :-) As long as he turns 'auto' into NS_STYLE_BORDER_STYLE_AUTO the way my patch does.
(In reply to comment #11) > > Do you have a preference on how '-moz-outline-style:auto' should be rendered? > > I'd render as 'solid' for now unless we have strong reasons not to (eg on Mac? I > recall that coming up). I'm confused, does outline-style:auto apply to the 'style' part only (e.g. solid) or to outline* (e.g. solid 1px red)?
What's the status of this? It would be good to fix these for 1.8, and if the support is good enough, maybe even remove the -moz-.
Comment on attachment 174261 [details] [diff] [review] Another fix I'll add a new patch tomorrow.
Attachment #174261 - Attachment is obsolete: true
Attachment #174256 - Attachment is obsolete: true
Attached patch Patch rev. 2 (obsolete) (deleted) — Splinter Review
I got no respons from www-style regarding the computed outline-width. Meanwhile, a new CSS3 "Backgrounds and Borders" draft was published, which changes the computed value for 'border-width', it says: http://www.w3.org/TR/2005/WD-css3-background-20050216/#the-border-width "Computed value: specified value" without an exception for 'border-style:none' as CSS2.1 have: http://www.w3.org/TR/CSS21/box.html#value-def-border-width "Computed value: absolute length; '0' if the border style is 'none' or 'hidden'" So I changed both 'border-width' and 'outline-width' to use the CSS3 definition. 'auto' is now mapped into NS_STYLE_BORDER_STYLE_AUTO as per roc's request, but without adding it to 'kOutlineStyleKTable'. AFAICT, -moz-outline-color/style/width/offset are now implemented according to spec so I dropped the -moz- prefix. (I kept the prefix for outline-radius). I added aliases though for backward compat, the same for DOM. (IMO, we can drop the aliases post-1.8) Changed files: editor/composer/src/res/EditorOverride.css toolkit/themes/qute/communicator/formatting.css toolkit/themes/qute/global/formatting.css toolkit/themes/qute/global/tabbox.css toolkit/themes/qute/mozapps/extensions/extensions.css toolkit/themes/winstripe/global/formatting.css toolkit/themes/winstripe/global/tabbox.css toolkit/themes/winstripe/mozapps/extensions/extensions.css toolkit/themes/pinstripe/global/formatting.css toolkit/themes/pinstripe/mozapps/extensions/extensions.css layout/forms/resources/content/xbl-forms.css layout/mathml/tests/various.xml themes/modern/communicator/formatting.css themes/classic/communicator/formatting.css themes/classic/global/win/tabbox.css mail/themes/qute/mail/messageBody.css mail/themes/pinstripe/mail/messageBody.css layout/style/ua.css layout/style/forms.css layout/style/html.css the above is just -moz-outline* => outline* property changes dom/public/idl/css/nsIDOMCSS2Properties.idl layout/base/nsCSSRendering.cpp layout/base/nsPresShell.cpp layout/base/nsStyleConsts.h layout/style/nsCSSDeclaration.cpp layout/style/nsCSSParser.cpp layout/style/nsCSSPropList.h layout/style/nsCSSProps.cpp layout/style/nsCSSProps.h layout/style/nsCSSStruct.cpp layout/style/nsComputedDOMStyle.cpp layout/style/nsDOMCSSDeclaration.cpp layout/style/nsRuleNode.cpp layout/style/nsStyleStruct.cpp layout/style/nsStyleStruct.h
Attachment #178676 - Flags: superreview?(dbaron)
Attachment #178676 - Flags: review?(dbaron)
Comment on attachment 178676 [details] [diff] [review] Patch rev. 2 Assume CSS2.1 is correct and css3 is wrong unless told otherwise. CSS2.1 has had much more careful review.
Attachment #178676 - Flags: superreview?(dbaron)
Attachment #178676 - Flags: superreview-
Attachment #178676 - Flags: review?(dbaron)
Attachment #178676 - Flags: review-
That said, what nsComputedDOMStyle should be using is the CSS2.1 "used value", which corresponds to the CSS2.0 "computed value". See http://www.w3.org/TR/2004/CR-CSS21-20040225/cascade.html#used-value . It's important for interface compatibility, since people rely on layout-dependent lengths to be converted to absolute lengths in getComputedStyle. However, that's not relevant to 'border-width' or 'outline-width' -- they should definitely compute to zero when the relevant '*-style' is 'none'.
Attached patch Patch rev. 3 (deleted) — Splinter Review
Ok, I reverted that particular change for 'border-width' and made 'outline-width' behave the same. >That said, what nsComputedDOMStyle should be using is the CSS2.1 "used value", >which corresponds to the CSS2.0 "computed value". Hmm, so the nsComputedDOMStyle methods returning enum widths are wrong then?
Attachment #178676 - Attachment is obsolete: true
Attachment #178681 - Flags: superreview?(dbaron)
Attachment #178681 - Flags: review?(dbaron)
Blocks: 287837
*** Bug 6647 has been marked as a duplicate of this bug. ***
Comment on attachment 178681 [details] [diff] [review] Patch rev. 3 >Index: dom/public/idl/css/nsIDOMCSS2Properties.idl >@@ -271,16 +271,19 @@ interface nsIDOMCSS2Properties : nsISupp Don't add to nsIDOMCSS2Properties. That's a frozen DOM interface. Add to nsIDOMNSCSS2Properties (in the CSS3 properties section), and rev its IID.
Comment on attachment 178681 [details] [diff] [review] Patch rev. 3 >Index: layout/base/nsCSSRendering.cpp Put a case (with an assertion) at the end of DrawTableBorderSegment as well. >Index: layout/style/nsCSSParser.cpp >-#define ENABLE_OUTLINE // un-comment this to enable the outline properties (bug 9816) >- // XXX un-commenting for temporary fix for nsbeta3+ Bug 48973 >- // so we can use "mozoutline >+#define ENABLE_OUTLINE_RADIUS // comment this to disable the -moz-outline-radius properties Don't bother. Just remove the ifdefs. >Index: layout/style/nsCSSProps.cpp >+// Note that 'auto' is also a valid value and is handled in nsRuleNode.cpp. Don't say that, since it's true for tons of other properties. If somebody wants to find that out, they look in nsCSSParser.cpp or nsRuleNode.cpp. (And so is 'none', which you didn't mention.) >Index: layout/style/nsCSSStruct.cpp up to here
Comment on attachment 178681 [details] [diff] [review] Patch rev. 3 >Index: layout/style/nsStyleStruct.cpp >@@ -298,16 +299,19 @@ static nscoord CalcCoord(const nsStyleCo >+ case eStyleUnit_Chars: >+ // XXX we need a frame and a rendering context to calculate this, bug 281972, bug 282126. >+ return 0; > default: > NS_ERROR("bad unit type"); > break; This should probably still assert (NS_NOTYETIMPLEMENTED), no?
Comment on attachment 178681 [details] [diff] [review] Patch rev. 3 r+sr=dbaron given the changes in comment 31, comment 32, and comment 33
Attachment #178681 - Flags: superreview?(dbaron)
Attachment #178681 - Flags: superreview+
Attachment #178681 - Flags: review?(dbaron)
Attachment #178681 - Flags: review+
comment 31, 32: Fixed comment 33: Yes, added NS_NOTYETIMPLEMENTED here and in nsStyleOutline::GetOutlineOffset().
Checked in 2005-03-27 03:36 PDT -> FIXED
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Blocks: 137285
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: