Closed Bug 21890 Opened 25 years ago Closed 24 years ago

Documents can style their scrollbars!

Categories

(Core :: XUL, defect, P3)

defect

Tracking

()

VERIFIED FIXED

People

(Reporter: ian, Assigned: hyatt)

References

()

Details

(Keywords: css-moz, css2, Whiteboard: [nsbeta3+])

Documents are able to style their scrollbars. As amusing as this is, I do not believe it is a good idea. :-) I can just imagine web authors the world over 'customising' the scrollbars for their site. Ouch. Anyway, a rather dramatic test case can be seen here: http://www.bath.ac.uk/%7Epy8ieh/m/widgets/15.html The problem is simply, I believe, that the scrollbars appear in the DOM. They should not. Currently the universal selector '*' selects them, this is clearly a Bad Thing.
Let me stress here that this is a Very Bad Thing because style rules that are not intended to do anything to scrollbars can instead make them invisible. (If this were a case of being able to *intentionally* style scrollbars, it wouldn't be *so* bad.)
In particular, for example: * { background: transparent; border: none; list-style: none; } ...will make a document's scrollbars vanish. The above rule is a perfectly legitimate rule for authors to include in their stylesheets.
assigning to evaughan for triage. Eric - your creation...It's ALIVE!!! cc hyatt and myself. BTW, my wife and I really like the scrollbars on the linked page :-)
They aren't in the DOM. They're in the frame tree (and thus pick up style). Also, this is exactly what you want for XUL... to be able to style even anonymous content. I'm not sure how to fix this. I can see cases where a Web page SHOULD be allowed to style the scrollbars that occur within its borders (maybe not the outermost one. For example, I think it's reasonable for a doc to be allowed to style the scrollbars on any <select> elements that it contains. One possible solution would be to assume that rules in style sheets loaded from HTML automatically get namespace to HTML if no namespace is explicitly specified. This would solve the problem and still allow someone to deliberately style the XUL scrollbars.
I believe Hyatt's suggested solution contradicts the css3-namespace draft - if not for HTML, then certainly for XHTML. See http://www.w3.org/TR/css3-namespace IMO, the style system needs to know not to apply universal selectors to scrollbar frames. (It knows not to apply them to generated content frames, so it shouldn't be too hard...)
Then I'm at a loss as to what to suggest.
trudelle wrote: > BTW, my wife and I really like the scrollbars on the linked page :-) Thanks. :-) I was quite pleased with them myself... hyatt: At the moment, only the _document_ scrollbars get styled. The scrollbars in, for example, the textarea at the end of that page are *not* styled. Why is that the case? I can see why letting the author style the scrollbars is a cool idea -- but it should *certainly* not be possible to do so accidentally by using the universal selector ('*'), and should also not be possible to style it without explicitly asking for them to be styled. If an XML document uses a 'thumb' element, and tries to style it, for example, the thumb of the scrollbar will get styled. This should not happen. An example of such a document: <doc> <images xmlns="some-thumbnail-namespace"> <thumb src="abc"/> <thumb src="def"/> <thumb src="ghi"/> </images> <imagelist xmlns="some-other-thumbnail-namespace"> <thumb href="abc"/> <thumb href="def"/> <thumb href="ghi"/> </imagelist> </doc> ...with this stylesheet: /* no namespace declarations so this rule applies to the <thumb> elements in both namespaces in the document. */ thumb { display: inline; border: thick teal solid; } ...would make the thumbnail scrollbars have big thick borders! Having said all that, I *do* support the idea that pages should be able to style their widgets, and that includes the scrollbars. How that is done without polluting the namespaces and things, I don't know. Any ideas David?
I just realized a good solution to this would be to make the scrollbar a pseudo-element (or set of pseudo-elements). Then xul.css could have selectors like :-moz-scrollbar :-moz-scrollbar-thumb etc... (where -moz- is the seemingly accepted (by the WG) way of indicating a proprietary extension to CSS.) This is something that could eventually be proposed for inclusion into CSS. It would also solve the problem of scrollbars being selected by the universal selector, and it would also allow document authors to style the scrollbars (even on a per-element basis). (Logically, I don't think scrollbars really belong as elements in an XUL namespace, anyway, since they occur on any element that has certain values for the 'overflow' property.)
Yep, that would be a very good way of doing it. Good thinking David! ;-)
trudelle - Did you mean to assign this to evaughan?
*** Bug 20734 has been marked as a duplicate of this bug. ***
Assignee: trudelle → evaughan
yup, thanks!
Status: NEW → ASSIGNED
Target Milestone: M15
Hmm this is a tough one. I have a little trouble with making them pseudo elements because I would like in the future to have their implementation be written entirely in javascript. So they would have a tag. You also need to be able to just instantiate scrollbars and slider and hook them up in XUL so you must have a tag. As soon as you do that you are back to sqare 1. So again don't universal selectors apply to widgets already? What if you go * { background: black; } doesn't that set the background of the widget black? If someone wants to play the "lets hide everthing" game the can already do that. What we should guarentee is that the main chrome used for navigation should never be styleable from the the page. If someone hides all the scrollbars then no one will use their page. Its as simple as that. You can't prevent someone from shooting themselfs in the foot. Scrollar will eventually be defined as follows: scrollbar { content: url(scrollbar.xul) behavior: url(scrollbar.htc) } The scrollbar can be completely implemented by a user in javascript or any other language we support. The default implementation would have a slider, scrollbar buttons, and a thumb. But someone may do something completely different if they wanted to. If don't want to build in assumptions about their structure only the XPCom interface. It would standarized.
The problem is that many of the style rules that can style scrollbars are desirable rules (in CSS2-conformant implementations, i.e., not the current implementation in Mozilla). If the scrollbars are stylable by the universal selector, it means the universal selector is permanently destroyed as a feature of CSS as long as Gecko exists. I don't think that's Gecko's mission. (The universal selector is a very important feature of CSS with respect to accessibility - it helps greatly in designing user stylesheets that can help make pages more accessible to users with poor vision.)
I actually don't think there's even a bug here.
Summary: Documents can style their scrollbars!!! → {css2}Documents can style their scrollbars!!!
Are you saying the behavior is changed? There most certainly was a bug a few days ago.
*** Bug 22870 has been marked as a duplicate of this bug. ***
Keywords: css2
Migrating from {css2} to css2 keyword. The {css1}, {css2}, {css3} and {css-moz} radars should now be considered deprecated in favour of keywords. I am *really* sorry about the spam...
> Dave, can you give an XBL example of how you would bind say a BEOS > created scrollbar (horizontal and vertical) to say a particular > <browser> tag. > <browser class="fubar" type="content-primary" id="content" > src="http://www.mozilla.org" flex="100%"/> > > browser.fubar{ > > overflow: auto; > behavior: url("chrome://global/content/htmlBindings.xml#beos"); > > } I doubt this works, since I think the scrollbar may actually be "inside" the window, which means it's actually styled by the src of the browser and not by the parent XUL itself. I think this is something we need to address, since that outermost scrollbar in a browser window is chrome and shouldn't really be stylable by the HTML document inside. In other words, weirdly enough, you'd probably put the behavior rule for scrollbar in a style sheet loaded by the HTML web page. :) This doesn't sound very correct, does it. ;) I believe evaughan has a bug on this issue "Documents can style their scrollbars". You might want to add my comments in this news post to that bug. Dave (hyatt@netscape.com)
BULK MOVE: Changing component from XUL to XP Toolkit/Widgets: XUL. XUL component will be deleted.
Component: XUL → XP Toolkit/Widgets: XUL
Summary: {css2}Documents can style their scrollbars!!! → Documents can style their scrollbars!!!
Summary: Documents can style their scrollbars!!! → Documents can style their scrollbars!
Removing some exclamation points from summary so notifications don't get snagged by spam filters!!!
I was going to report this as a bug. But found this bug report instead. I dont understand all of what is reported below. But I do thing it is a *bug* not a `feature'. Using mathml and its standard stylesheet, the scroll bars turn white, and are hard to see.
I agree with evaughan here. It's not the scrollbar's fault that makes "the universal selector permanently destroyed as a feature of CSS". Any style rule with the universal selector that makes the scrollbar invisible, will also make all <input>s and <textarea>s invisible, or at least completely unrecognisable as widgets. The problem is the lack of difference between widgets and text in CSS. I guess the universal selector is pretty unusable, because you'll never know what the heck you may change with it in the future. (the color of a NG iMac or "I did '* {display:none}' and my whole CSS-stylable house was gone!") Maybe ther needs to be a separate bug, but I think it must be possible to style scrollbars in textareas etc. which isn't possible right now. The same goes for framesets, frames and iframes. PS. [offtopic] door { border: 2cm oak inset; behavior: url(star-trek-slide.bhv); }
CSS is very clear that the universal selector matches all elements in the document tree. The scrollbars are not elements in the document tree (they are created when something has 'overflow: auto'.) If you want some of the properties on textareas, etc., to effect their scrollbars, then that could be OK (but I think it's a bad idea). If you want body { background: red; } to change the background color of both the body and the scrollbar, then that's OK (but it's a bad idea). If you want the scrollbar for an element to be matched by a pseudo-element, then that's OK (and perhaps a good idea). However, it is horribly against the idea of CSS to allow something to be matched by a universal selector that cannot be matched by a type selector for an element that exists in the document. This is a BUG. Period.
I have an idea. What if we say that - for all stylesheets loaded by HTML - that all rules are implicitly namespaced to HTML. It would be as if a @namespace appeared at the top of the stylesheets setting the default stylesheet namespace to HTML. Then you would STILL be able to style scrollbars, but only by explicitly defining the XUL namespace. Any rules used by normal Web developers would have no risk of impacting the scrollbars themselves.
That disagrees with the working draft http://www.w3.org/TR/css3-namespace/#tag-selector It also wouldn't help XHTML. I really think pseudo-elements are the logical way to go here, especially since such a solution would have a chance of being accepted by the CSS WG as part of CSS (minus the -moz- prefix). Scrollbars are a perfect example of what pseudo-elements are designed to do.
Pseudoelements are insufficient to style the scrollbars.
the problem with pseudo-elements and the scrollbar is that scrollbars are XBL, so they can have any XUL inside them. The only solution I can think of is a pseudo-element-function, but only as a last resort. Like this: :-moz-scrollbar(<selector>) examples: BODY:-moz-scrollbar(thumb) {/* style for the thumb */} BODY:-moz-scrollbar(box image) { /* style for an image inside a box, if this is the way someone makes the scrollbar */ } "However, it is horribly against the idea of CSS to allow something to be matched by a universal selector that cannot be matched by a type selector for an element that exists in the document. This is a BUG. Period." This is a problem with any XBL, not only the scrollbar. So maybe we need a general solution. I see a future for XBL. Anonymous content is a very cool way to style XML. Currently Mozilla wil style any anonymous content directly. Maybe this is not a good idea on the long run. Would :anonymous(<selector>) {} be a good idea?
I expect there are also issues with DOM compliance here. I tried to write a test case, but it crashed in JS code. I'll file a bug...
There are DOM problems that seem related to scrollbars. Should I add them to this bug or file a new one?
Never mind... I've only found some repaint bugs...
I've also been thinking about this bug recently, and the only solution I can see is the one suggested by sjoerd@heeten.nl. Basically, content that is _not_ present in the document and that was not created by the document interacting with its DOM should absolutely not be matched by any selectors that are valid W3C recommended CSS. What we need is a pseudo-element which will match XBL-created nodes. Such as: :-moz-xbl(scrollbar thumb) ...which will match what is _currently_ matched by scrollbar thumb This will probably require some not insignificant changes to the rule matching code so cc'ing Pierre.
Severity: minor → normal
Keywords: css2css1
OS: Windows 98 → All
Hardware: PC → All
The only problem is that there's no scrollbar element anywhere. Maybe we should not bind an imaginairy scrollbar element, but bind all scrollable boxes. This would also allow for different scrollingmethods, like a big scrollbarbutton at the full top and bottom of a box, like with menupopups. CSS would then be: box[overflowx=false]:-moz-xbl(scrollbar.vertical) {display:none} box[overflowy=false]:-moz-xbl(scrollbar.horizontal) {display:none} What do we do with frames? both frame:-moz-xbl(scrollbar) and body:-moz-xbl(scrollbar) should style the same scrollbar. (just like they share the marginwidth attribute f.e.) In some cases it would be very usefull if styles would be inherited, like with the file upload widget, which is in fact a collection of 2 widgets. It could be an extra atrribute for the content element in XBL, which would default to false/off.
A solution could be to extend the namespace spec and define namespaces that don't inherit from the universal selector (eg. "@namespace !required <name> <url>"). It would be relatively easy to implement but we need to thoroughly think about the consequences.
Namespaces might work, but it's a very crude hack, because the problem has nothing to do with namespaces. There is a problem with namespaces though, because the xul namespace is only introduced inside XBL, invisible for the main document and stylesheets. We could just reserve the 'xul' namespace for ourselves, in a Microsoftish way.
Hyatt, Do you have a fix for this?
Assignee: evaughan → hyatt
Status: ASSIGNED → NEW
*** Bug 28291 has been marked as a duplicate of this bug. ***
Status: NEW → ASSIGNED
Target Milestone: M15 → M17
Mass moving M17 bugs to M18
Target Milestone: M17 → M18
spam, open xptoolkit qa contact moving over to jrgm
QA Contact: paulmac → jrgm
I see nothing particularly wrong with either the pseudo-element idea or the namespaces-that-don't-match-the-universe-selector idea. The second is really just the first with a different, non-pure-CSS-like, and cleaner, syntax, though, isn't it? BTW, the following very useful and sensible rule shows even more clearly why it is vital that we fix this. Just add it to any complex page's stylesheet... *:hover { border: solid thick lime; background: #FFE; }
Keywords: css1css-moz, css2
So scrollbar elements should be in an undefined namespace that defaults to !required, because it also needs to work in current html only documents.
?? I don't understand your logic. I would just make the XUL namespace declaration in xul.css read: @namespace ! required (http://www. .... .is.only.xul); /* set default namespace to XUL and prevent it from matching the universal selector */ I don't see what you mean by "undefined" or "which defaults to". All of this idea is _designed_ to work with legacy documents.
If xul.css gets included in the UA default style sheet for HTML and XML, then it's fine.
mass-moving all bugs to m21 that are not dofood+, or nsbeta2+
Target Milestone: M18 → M21
Nominating nsbeta3, since serious standards-compliance issue.
Keywords: nsbeta3
How hard is it to add scrolling methods to the DOM? Letting people define their own scrollbars using dhtml and use these scrolling methods to apply them onto the frame, text area or DIV. This wouldnt be a bad idea. I do not know why the scroll methods for frames are removed from the Mozilla which broke down many NN 4.x supported dhtml enhanced sites, but putting those back can give users a chance to apply some neat visual effects. That way you do not need to worry all the implementation details. How many people really will care about the style of their web applications? not too many. By the way what happened to the layer tag. Will mozilla ever be backward compatible?
Never mind, I checked the test site of Ian. It looks abosuletly perfect. If we can do all this, nobody really needs those scroll methods. regards, Bora
If the scrollbar elements aren't in the DOM, then how are they picking up the style in the document? Style is normally determined before frame construction, since it determines which frames are created. So when the scrollbar frames are created, what tells them to use the stylesheet of the document?
As per meeting with ChrisD yesterday, taking QA.
Keywords: correctness
QA Contact: jrgm → py8ieh=bugzilla
nsbeta3-, future
Whiteboard: nsbeta3-
Target Milestone: M21 → Future
Eek! nsbeta3-??? This bug is currently affecting some existing content and more importantly is going to completely ruin the ability to use the universal selector in CSS. Simply adding the quite sensible rule: * { color: black; background: white; } ...kills our scrollbars. Worse: It makes creating new XML vocabularies a dangerous game! For example, while this bug exists in a shipping browser, no-one will be able to use and style an element called "thumb" without risking the sanity of the scrollbars in Mozilla. Even worse!! The incredibly simple rule: BODY DIV { position: absolute; top: 0; left: 0; } ...which can make perfect sense in an HTML document, makes all the text widgets of a document useless, by moving them to the upper left hand corner! (bug 46505) Assuming we are going to implement the change in the universal selector so that we can specify namespaces which do not match unless explicitly selected, then this will also help to fix bug 46505, where the anonymous content that is introduced in an INPUT element is matching an unrelated rule in the stylesheet. Reassigning to Pierre to implement our hack. The safest syntax we could use without endagering forwards-compatability with future standards is probably a new @rule that adds namespaces to a special list of black-listed namespaces that are not allowed to match the left hand side of the universal selector *|*. @-moz-hide-namespace url(namespace); We would then add this to ua.css or xul.css, like this: /* Prevent our internal namespaces from matching universal selector */ @-moz-hide-namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul); @-moz-hide-namespace url(http://www.mozilla.org/xbl); ...followed by the existing @namespace rules. Any comments? This should go in ASAP because QA will need to have the time to ensure this does not cause any regressions. Clearing nsbeta3- to trigger re-evaluation in light of the above descriptions.
Assignee: pierre
Blocks: 46505
Status: ASSIGNED → NEW
Keywords: 4xp
Whiteboard: nsbeta3-
Ian is right. This problem makes the universal selector unusable in [user]/chrome/user.css and it causes big accessibility issues.
Status: NEW → ASSIGNED
Target Milestone: Future → M18
I investigated both ways to implement the hack ([Pierre Saslawsky 2000-03-15 01:06] and [Ian Hickson 2000-07-27 16:50]) but it is not very satisfying. I'm beginning to believe that [David Hyatt 1999-12-15 22:19] was correct. HTMLContentSink::ProcessStyleLink() and HTMLContentSink::ProcessSTYLETag() both load the stylesheet with kNameSpaceID_HTML and I think we should do the same thing in CSSLoaderImpl::LoadAgentSheet(). This raises two questions: - Why doesn't the default name space work? I somewhat suspect a problem in CSSStyleSheetInner::RebuildNameSpaces()... - Per [David Baron 1999-12-16 06:43], this method contradicts the spec. Why?
At one point I was wondering whether this could be solved by changing the parent style context used when constructing the scrollbars. I never got around to finishing my investigation. Pierre, are you saying something is wrong with our implementation of the namespaces draft? I haven't tested it much, so I'm not sure...
The implementation is correct from an external standpoint. The problem seems to be that default namespace (an internal feature) doesn't work. We currently set the default namespace to HTML - at no avail then - for linked and embedded stylesheets in HTML documents. The idea was to fix it, of course, and set the default namespace when loading agent sheets too. But I'm realizing as I'm writing this that it may not work very well for XML... I'll sleep on it.
I don't think Ians suggestion of hiding namespaces is the right way to go. That would only solve the problem of XUL getting style when link into a document though XBL. Theoretically HTML can be used in scollbars as well. I think the RightThing to do is to be able in the XBL file to tell how the linked content should be styled. The three basic alternatives are 1. Linked content isn't be affected at all by the original document style 2. Linked content will only inherit styles from it's "parent element" 3. Linked content is styled as if it belonged to the original document where 3 is how it behaves today. Actually it would be really cool if you could in the XBL file control exactly which CSS proerties get which of the above treatments. Guess it would be a fourth child of <binding>. For normal authors to be able to style their scrollbars we could have some special CSS syntax for styling linked content. Maybe something like: xul.scrollbar|thumb {background: gray;} I guess much of this requires very much coding but it could be something to aim for...
Jonas is right. We can't use namespace tricks to hide the generated elements. I therefore propose we fall back to the suggestion originally given by David and Sjoerd. Basically, content that is _not_ present in the document and that was not created by the document interacting with its DOM should absolutely not be matched by any selectors that are valid W3C recommended CSS. What we need is a pseudo-element which will match XBL-created nodes. Such as: :-moz-xbl(scrollbar thumb) ...which will match what is _currently_ matched by scrollbar thumb And similarly for elements that are created by, e.g., by <input>: input:-moz-xbl(div) ...which will match the <div> created inside <input> elements (see bug 46505).
We need a reasonable solution given the lack of time we have left before shipping. Every solution I've heard so far is too involved and too risky to contemplate right now. I cannot allow fundamental changes to the way XBL elements are matched or to the XBL syntax itself until after ship. It's just too risky.
Also, a point I think people are missing is that the scrollbars are not created using XBL. The content of the scrollbars themselves is XBL, but the creation of scrollbars is hardcoded in C++, and XBL doesn't get involved at all. You would have to patch the C++ anonymous content if you wanted to implement such a solution, as well as XBL.
David, I agree that what Jonas and Ian have proposed is unrealistic but you can't say that "every solution is too involved and too risky". I'll continue to look into making the default namespaces work (that should take care of most problems), and otherwise a hack to hide some namespaces from the universal selector.
If we need a quick solution, any hack in the C++ code of the scrollbar would solve this bug. The code should only accept style rules that explicitly uses 'scrollbar' in the selector. This would make things 'work as expected' for the first release (Mozilla or Netscape or both?). Also, preventing some namespaces to be selected by the universal selector, would probably be usefull for other purposes as well. (XML data islands f.e.) After 'shipping' work should be started on :-moz-xbl() IMHO, because elements that do not appear in the DOM tree should not be styled through normal element selectors, ever. For completeness the solution of Microsoft: "Viewlink provides the capability to encapsulate the CSS style settings in the document fragment. Generally, the CSS properties in the primary document and the document fragment are independent of one another, but it is also possible to control the inheritance of style settings from the primary document to the document fragment. The default setting for a viewlink is that CSS properties set at the master element are inherited by elements in the document fragment. The component author can override any CSS styles in the primary document by setting the corresponding styles explicitly in the HTC file; styles in the component file take precedence over any styles applied to the master element in the primary document. The ViewLink CSS Inheritance page provides detailed information on the inheritance of specific CSS properties. CSS inheritance is controlled by the Boolean viewInheritStyle property. If viewInheritStyle is set to TRUE, then inheritable CSS styles set in the primary document are inherited by the corresponding elements in the document fragment." After reading this 10 times, I've decided that I'll have to try some code to see what this really means. I don't think it'll help solve this bug.
[nsbeta3+].
Whiteboard: [nsbeta3+]
Sjgoerd, ViewLink's solution will only work with XBL when the anonymous content is self-contained. In Microsoft's world, there is no notion of interleaving the anonymous and explicit content, i.e., the ViewLink content is essentially a lightweight document in its own lightweight iframe. XBL is more flexible than this, since it actually allows explicit content to be placed within the anonymous content. Also, hacking of the scrollbar code needs to be specific to HTML, since someone using XUL can and should be allowed to style all scrollbars for example, even if they are anonymous content. I don't really agree with the use of a special selector just for XBL. The document can and should be allowed to apply styles to anonymous content without using a special selector, although we could perhaps have the XBL decide whether it will accept styles that come from parent documents (as viewlink does). Unfortunately this is also a pretty complicated problem. The best hack I can think of for HTML still is to just make sure all stylesheets loaded from HTML default to the HTML namespace. Doesn't solve XHTML, but IMO that can wait until 6.1.
Ok, so the ViewLink solution could conceivably be applied to XBL, although you'd run into the following problems. (1) All bindings would have to have their own style trees. They could not be held in the same style tree as everyone else. (2) XBL files would have to be capable of loading stylesheets and using them to resolve styles for their own little style trees. (3) A binding could specify, "Inherit my parent's stylesheets," in which case the sheets could be loaded into the binding's style tree and used along with the binding file's own stylesheets. Now you don't ever need an XBL selector and you can retain all the current functionality, so yes, I like Microsoft's solution to this problem and do think it's applicable to XBL. However, ideal though it might be, it's probably a week's worth of coding that I know I don't have time to do. :(
The interleaving especially would be tricky to do, since I just made a change to help attinasi keep the style tree and frame tree in sync. With this viewlink change, the style tree and frame tree would once more be out of sync (with frames in the same tree even pointing to different style trees).
Ok, guys. I've been studying the way styles are resolved using rules processors. I think I can implement the ViewLink solution in a way that will solve our problem. This will involve hacking on the style set. I'm going to go for it since this looks like fun and XBL really needs this anyway for other reasons. I will produce a patch in this bug when I've got something to show.
Assignee: pierre → hyatt
Status: ASSIGNED → NEW
Please don't take bugs off my list without checking me first. I was working on that one. Reassigned to myself.
Assignee: hyatt → pierre
Status: NEW → ASSIGNED
$#%&*@!#! silly textarea crashers #@$%!&*!@#! So anyway, David Hyatt, Ben Goodger and I were bouncing ideas last night and David suggested a slight change to the :-moz-xbl(...) idea. Instead of having the whole pseudo-element at the end of the selector containing the XBL selector to match, just have all the XBL's (anonymous) generated content be 'pseudo- elements' that match :-moz-xbl or :-moz-xbl-content or somesuch. Thus, to style the scrollbar thumb: thumb:-moz-xbl-content {...} or, assuming the thumb element used has a particular class instead of a particular GI: .thumb:-moz-xbl-content { } To match a thumb inside a scrollbar inside a particular div: div#id .scrollbar:-moz-xbl-contnet .thumb:-moz-xbl-content (Note that this stretches the rule about 'only one pseudo-element per selector.) To match the DIV in the INPUT element (which is in the HTML namespace): INPUT > html|DIV:-moz-xbl-content { ... } This has the advantage over the namespace hack that it does not prevent XUL content from containing stuff from other namespaces (e.g. SVG or HTML).
Right, although that could probably be futured if we can't get to it in time. The complete proposed solution goes something like this. (1) Enable XBL to include CSS files and expose those to the style set dynamically for a given content node. The style set has been really cleanly designed, and so this looks quite easy to do. (2) Add an attribute to XBL bindings that says whether or not they inherit styles from the nearest containing scope or not. By default they will, since most of the time you use XBL that's what you want. For scrollbars, we'll turn the inheritance off. That's it! Basically I'm proposing that the style set have a WalkRuleProcessors function that would talk to the nsIBindingManager to obtain any additional rule processors for a given content node. The binding manager would also indicate whether the normal author sheet rule processors should be used. I'm really advocating this solution because (a) I don't think it's nearly as hard as I thought it was going to be, mostly because the style set is designed really well for this already, and (b) it's a feature that people are clamoring for in XBL that Microsoft's HTCs already support.
And (3) would be to do the :moz-xbl thing for the case where the binding didn't inherit by default. This would give you a way of defining rules that would apply to the binding content only. Note that (3) could technically be futured, although it will mean that documents can't style their scrollbars at all.
If unknown CSS properties are available through the .style object, the scrollbar style-properties from IE5.5 could be implemented with XBL. about :-moz-xbl-content > (Note that this stretches the rule about 'only one pseudo-element per selector.) Ehm, :-moz-xbl-content is a very good idea, and is a pseudo-class, not a pseudo- element, so no problem here. > div#id .scrollbar:-moz-xbl-contnet .thumb:-moz-xbl-content I disagree. :-moz-xbl-content should be needed once to pierce into the anonymouse content. So div#id .scrollbar:-moz-xbl-content .thumb would match the thumb, but here: div#id .scrollbar:-moz-xbl-content .thumb-box:-moz-xbl-content :-moz-xbl-content is needed twice, because the .thumb-box is anonymous content of the .thumb. This: box:-moz-xbl-content would match any anonymous box and :-moz-xbl-content box would match ant anonymous box that's not a child of unanonymous content.
I really start to like the way this is heading :-) However I have another proposal for selectors to match binded content: scrollbar$thumb { ... } would match any thumb elemente binded though a scrollbar binding. Or combinded with namespaces: scollbar$xul|thumb { ... } match any thumb element in the xul namespace binded though a scrollbar binding. And last: textbox$* { ... } *$box { ... } *$* { ... } All elements within a textbox binding, all binded boxes and all binded elements. This could also be used together with microsofts HTC or w3c's BECSS bindings. (some other character could be used instead of a $) In other words a great (IMHO :) ) addition for CSS3 selectors. However, I see three problems with this for mozilla: 1. Matching a thumb element within a box element in a scrollbar binding would look something like this (according to CSS2 combinators): scrollbar$box scrollbar$thumb { ... } which could become quite lengthy after a while. 2. what happens to bindings within bindings. Does button$box match all button-bounded boxes or just buttonbindings from the original document? Do we have to use calender$button$box Which would further worsen point 1. 3. w3c might want to use the $ (or whatever we choose) to do something else (i.e. we might not be forwards compatible). We could use something like thumb:-moz- bind(scrollbar) but that would too add to point 1. I think that any solution to problem 1 would require a even bigger overhaul of selectors syntax. Maybe something like scrollbar$( box thumb ) { ... } and calender$ (button$ (box title) ) { ... } Which when I think about it dosn't neccesarily have to rule out my original '$ proposal'. Ofcource none of this is needed to fix this bug but would be cool :-) Don't know how hard any of this would be, just wanted to bounce my ideas. Also I still think we need my originally proposed three modes for inheritence 1. Linked content isn't be affected at all by the original document style. (scrollbars) 2. Linked content will only inherit styles from it's "parent element". (textboxes) 3. Linked content is styled as if it belonged to the original document. (most chrome) 2 is needed for beeing able to style background and fontfamily of textboxes (I think). As a last question. What should happen to the <children/> of the binding? Wouldn't all this affect the <button> html element?
I have this bug fixed on my machine. Awaiting final review and approval from pierre and attinasi.
Yeehaa! Back to hyatt.
Assignee: pierre → hyatt
Status: ASSIGNED → NEW
Fixed. Hallelujah!
Status: NEW → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
VERIFIED Win2K and Linux Comm M18 trunk builds 2000090609. If there are new bugs please file them separately.
Status: RESOLVED → VERIFIED
I see no patch here, so I can't guess how this bug was fixed, and whether any new bugs were filed separately (they must have been filed enough separately not to appear in "this bug blocks" list!), and what selectors should be used nowadays to style the scrollbars. So I'm stalled with bug 77790, without any starting point to fix it from. Give me some clue. Please.
The bug was that scrollbars *could* be styled. This was a bad thing mostly becase of the way thay were styled. A lot of things would affect the scrollbar even though the author had no intention of doing so. And even if you did it intentionally it could change from version to version how they were styled.
You're right. The problem here was that scrollbar could (in year 2000 and earlier days) be styled unintentionally, by applying perfectly legitimate rules in stylesheets of web documents. However, it seems to me that this bug is overfixed, now there's no enough obvious way to style the scrollbar even when there's a real intention. This blocks bug 77790, and I've just added a dependency. However, I am not sure that it can change from version to version how they were styled. Internally it may change; but once bug 77790 is fixed, there'll always be an intermediate chrome layer of some XPI extension that will lay in between and translate external scrollbar-*-color CSS properties to internal way of styling scrollbars.
Component: XP Toolkit/Widgets: XUL → XUL
QA Contact: ian → xptoolkit.widgets
You need to log in before you can comment on or make changes to this bug.