Closed Bug 252578 Opened 20 years ago Closed 20 years ago

only allow one rule processor per level of the cascade

Categories

(Core :: CSS Parsing and Computation, defect, P3)

defect

Tracking

()

RESOLVED FIXED
mozilla1.8alpha3

People

(Reporter: dbaron, Assigned: dbaron)

References

Details

(Whiteboard: [patch])

Attachments

(1 file, 5 obsolete files)

nsStyleSet currently has some cases where there are multiple rule processors per
level of the cascade.  This doesn't really make sense, since when there are
multiple rule processors they act like separate levels of the cascade.  It would
make the code clearer and simpler to only allow one.  (It would be clearer since
we'd have to make all the levels explicit.)  It would remove over-generality --
i.e., where the code looks somewhat general but really will only ever work in
the specific case we use.  It would also make it easier to de-COM-taminate the
CSS stylesheet classes.
Attached patch work in progress (obsolete) — Splinter Review
I'm most of the way through compiling, but it's untested.

I ended up making more changes to nsDocument-ish stylesheet code than I
expected to.
I didn't notice that the style set went through the sheets backwards.  So I
changed the style set to store the sheets in the same order than everyone else
uses -- that's always been odd.
Attached patch patch (obsolete) — Splinter Review
This seems to work at first glance.
Attachment #153980 - Attachment is obsolete: true
Status: NEW → ASSIGNED
Priority: -- → P3
Whiteboard: [patch]
Target Milestone: --- → mozilla1.8alpha3
Attached patch patch (obsolete) — Splinter Review
Attachment #153982 - Attachment is obsolete: true
Attachment #154043 - Flags: superreview?(bzbarsky)
Attachment #154043 - Flags: review?(bzbarsky)
Comment on attachment 154043 [details] [diff] [review]
patch

Actually, this isn't ready yet.  I just had a quick discussion with jst, and we
both agree that the catalog sheets stuff should probably be on nsIDocument /
nsDocument.
Attachment #154043 - Flags: superreview?(bzbarsky)
Attachment #154043 - Flags: review?(bzbarsky)
Agreed on that, and three cheers for moving the attr and inline style sheets the
heck out of the document sheet array!

As long as I'm here, this part:

+  if (useRuleProcessors) {
+    if (mRuleProcessors[eDocSheet])
+      (*aCollectorFunc)(mRuleProcessors[eDocSheet], aData);
+    if (mRuleProcessors[eStyleAttrSheet])
+      (*aCollectorFunc)(mRuleProcessors[eStyleAttrSheet], aData);
   }

should probably allow the inline style sheet to apply even if useRuleProcessors
is false. Then the hack at
http://lxr.mozilla.org/seamonkey/source/content/xbl/src/nsBindingManager.cpp#1274
can be removed.... 
Attached patch patch (obsolete) — Splinter Review
Attachment #154043 - Attachment is obsolete: true
Attachment #154048 - Flags: superreview?(bzbarsky)
Attachment #154048 - Flags: review?(bzbarsky)
Comment on attachment 154048 [details] [diff] [review]
patch

Hrm, why don't I read the comments on the bug before requesting reviews...
Attachment #154048 - Flags: superreview?(bzbarsky)
Attachment #154048 - Flags: review?(bzbarsky)
Attached patch patch (obsolete) — Splinter Review
Attachment #154048 - Attachment is obsolete: true
Attachment #154049 - Flags: superreview?(bzbarsky)
Attachment #154049 - Flags: review?(bzbarsky)
Comment on attachment 154049 [details] [diff] [review]
patch

>Index: content/base/src/nsDocument.cpp
>@@ -787,61 +795,81 @@ nsDocument::ResetStylesheetsToURI(nsIURI

>   // Release all the sheets
>   mStyleSheets.Clear();

I assume that you're not clearing mCatalogSheets because those are just a way
to lazily load part of ua.css?	If so, it may be worth a comment here.

> nsDocument::FillStyleSet(nsStyleSet* aStyleSet)

>   // First, place the attribute style sheet in the style set.  Prepend it,
>   // since it should be the most significant sheet in its level.

Either remove that comment altogether or change "prepend" to "append".

>+// These three functions a lot like the implementation of the

"are a lot like"

>+nsDocument::AddCatalogStyleSheet(nsIStyleSheet* aSheet)

>+  if (applicable) {
>+    AddStyleSheetToStyleSets(aSheet);
>+  }

This puts the catalog sheet in the document level, no?	That's wrong.

>+    observer->StyleSheetAdded(this, aSheet);

The documentation in nsIDocumentObserver may need to be updated to say that
this function gets called for both document sheets and catalog sheets.... (And
observers should be checked to see that they handle this correctly.  For
example, it looks like nsDOMStyleSheetList::StyleSheetAdded will count catalog
sheets, which it shouldn't do.)

>Index: content/html/style/src/nsCSSRuleProcessor.h

>+ * is told when the rule processor is going away (via
>+ * DropRuleProcessorReference).

Didn't you rename this to DropRuleProcessor()?

r+sr=bzbarsky with those issues addressed (especially the issue with catalog
sheets ending up in the document cascade level).
Attachment #154049 - Flags: superreview?(bzbarsky)
Attachment #154049 - Flags: superreview+
Attachment #154049 - Flags: review?(bzbarsky)
Attachment #154049 - Flags: review+
(In reply to comment #10)
> >   // Release all the sheets
> >   mStyleSheets.Clear();
> 
> I assume that you're not clearing mCatalogSheets because those are just a way
> to lazily load part of ua.css?	If so, it may be worth a comment here.

It was intentional, but now I'm not so sure.  Any thoughts?
Well... To be _really_ frank, right now that reset stuff is only used by
document.write (and initial document setup) and catalog sheets are only used by
XML.  So it's a non-issue.

If we ever end up with a reason to gut an XML document like this, I'd say keep
the catalog sheets, for the reason I said.  Not having them loaded all the time
is just an optimization, and if the original document needed them there's a good
chance the post-gutting document will too.
(In reply to comment #10)
> The documentation in nsIDocumentObserver may need to be updated to say that
> this function gets called for both document sheets and catalog sheets.... (And
> observers should be checked to see that they handle this correctly.  For
> example, it looks like nsDOMStyleSheetList::StyleSheetAdded will count catalog
> sheets, which it shouldn't do.)

Do you think it should be called for catalog sheets?  I tend to think it
probably shouldn't.  Then again, it has been recently...
> Do you think it should be called for catalog sheets?  I tend to think it
> probably shouldn't.

I tend to think it probably shouldn't, but we need to trigger a restyle
_somehow_ when catalog sheets are added, no?

Perhaps we simply want to add a CatalogSheetAdded notification or another arg to
StyleSheetAdded?
Maybe a boolean arg to StyleSheetAdded indicating whether or not it's a document
sheet?
Sounds good to me.  Then we can use that api for user sheets too, if needed.
Attached patch patchSplinter Review
revised per comments
Attachment #154049 - Attachment is obsolete: true
Fix checked in to trunk, 2004-07-28 00:05/08/52 -0700.
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
> mCatalogSheets are just a way to lazily load part of ua.css

bz, are these lazy catalog sheets in the UA level of the cascade now?
Yes, they're in the UA level now.

Also, this led to about a 1% pageload time improvement on btek and a 1.1K
codesize reduction on luna.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: