Closed Bug 542361 Opened 15 years ago Closed 15 years ago

Fix and remove the GetUsedX assertions

Categories

(Core :: Layout, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla1.9.3a1

People

(Reporter: ventnor.bugzilla, Assigned: ventnor.bugzilla)

References

(Depends on 1 open bug)

Details

Attachments

(1 file, 6 obsolete files)

Attached patch Patch (obsolete) (deleted) β€” β€” Splinter Review
      No description provided.
Attachment #423670 - Flags: review?(roc)
This looks like the right idea.

I think the GetUsed* methods should check for NS_FRAME_FIRST_REFLOW and not NS_FRAME_IN_REFLOW --- in that case, the frame hasn't been reflowed yet and we should return 0,0,0,0 no matter what the style says (because frames are always completely empty until they get reflowed).

We can get rid of nsLayoutUtils::sDisableGetUsedXAssertions and everything that uses it.

I wonder if we should use a frame state bit (we have a free one!) to indicate that there is at least one usedBorderProperty/usedPaddingProperty/usedMarginProperty, so we can skip getting or deleting the properties in the common case when we know there can't be one.

I'm curious about what dbaron and bz think about this approach.
(In reply to comment #1)
> I wonder if we should use a frame state bit (we have a free one!) to indicate
> that there is at least one
> usedBorderProperty/usedPaddingProperty/usedMarginProperty, so we can skip
> getting or deleting the properties in the common case when we know there can't
> be one.

I don't know if this is necessary considering these operations are O(1) on a hashtable and are handled reasonably well in the most common cases (AFAICT).
I think the DidSetStyleContext code should only store properties if properties aren't already there.  Otherwise it could cause problems if we get a sequence of style context changes.  We still want the value to reflect the padding/border/margin used the last time we did a reflow.

Also, code inside NS_ASSERTION doesn't get run in non-debug builds, so you need to fix nsIFrame::GetUsedMargin and GetUsedPadding.

One other issue is that in theory nsCSSOffsetState can be constructed in cases where we don't actually do a reflow.  I'm not sure if that matters in practice, but you might want to restrict deleting (and also setting?) the properties to cases where the nsCSSOffsetState is an nsHTMLReflowState.  It probably requires a brief code audit to see if that matters (and, if it doesn't, code comments warning that the code assumes that it doesn't).


But the general approach looks good.
Attached patch Patch 2 (obsolete) (deleted) β€” β€” Splinter Review
This addresses the review comments. I am able to differentiate between nsCSSOffsetState and nsHTMLReflowState because they call InitOffsets in different locations.
Attachment #423670 - Attachment is obsolete: true
Attachment #423705 - Flags: review?(roc)
Attachment #423670 - Flags: review?(roc)
dbaron, feel free to chime in with more comments if any.
+    if (!GetProperty(nsGkAtoms::usedMarginProperty) &&
+        aOldStyleContext->GetStyleMargin()->GetMargin(oldValue)) {
+      if (!GetStyleMargin()->GetMargin(newValue) ||
+          oldValue != newValue) {
+        // margin most definitely changed, store it
+        SetProperty(nsGkAtoms::usedMarginProperty,
+                    new nsMargin(oldValue),
+                    nsCSSOffsetState::DestroyMarginFunc);

I think you should do the GetProperty check just before you do SetProperty, because it's more expensive than the other checks you're doing here.

To answer my question about whether a state bit is worth having, I think you should make an opt build and create a testcase that does a tight loop of border changes on a lot of small DIVs in the page, and then profile that testcase with your patch, and see if we spend significant time in GetProperty/SetProperty/DeleteProperty.
Attached patch Patch 3 (obsolete) (deleted) β€” β€” Splinter Review
We decided IRL that using our last state bit for this case is not worth it.
Other comments are addressed.
Attachment #423705 - Attachment is obsolete: true
Attachment #423734 - Flags: review?(roc)
Attachment #423705 - Flags: review?(roc)
More precisely, we can't tell if it's worth it, so on the principle of avoiding premature optimization, we're not going to do it (yet).
+  if (GetStateBits() & NS_FRAME_FIRST_REFLOW)
+    return margin;

I think you should not take this early exit if NS_FRAME_IN_REFLOW is set. Calling GetUsedMargin during the first reflow should be able to return something nonzero. Ditto for the other properties.
Do we need the calls on aOldStyleContext to be Gets, or can they be Peeks?  If we can avoid style data when it's not actually needed, that might be nice...
Attached patch Patch 4 (obsolete) (deleted) β€” β€” Splinter Review
Attachment #423734 - Attachment is obsolete: true
Attachment #423737 - Flags: review?(roc)
Attachment #423734 - Flags: review?(roc)
(In reply to comment #10)
> Do we need the calls on aOldStyleContext to be Gets, or can they be Peeks?  If
> we can avoid style data when it's not actually needed, that might be nice...

I don't think there are calls on style contexts that do peeks, are there? In any case, we still need the old style data to do the comparison.
nsIFrame says
  // Attention: the old style context is the one we're forgetting,
  // and hence possibly completely bogus for GetStyle* purposes.
  // Use PeekStyleData instead.
  virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) = 0;

OK, so we should use PeekStyleData. I presume that if that returns null, then the frame hasn't been reflowed with that old style context yet, so we shouldn't store the old value.
Hmm. I guess there's a hole in this approach, namely that we get the wrong results in a sequence like this:

-- reflow the frame
-- DidSetStyleContext(contextA)
-- get some style structs from contextA
-- DidSetStyleContext(contextB)
-- we save contextA's border/padding/margin as the usedBorder/Padding/Margin, even though we haven't actually done a reflow with contextA

To avoid this, I guess we need to use a frame state bit after all :-). We need to detect whether a reflow has happened since the last DidSetStyleContext. If it hasn't, and we get a DidSetStyleContext again, then we need to skip saving the border/padding/margin to properties.
(In reply to comment #14)
> Hmm. I guess there's a hole in this approach, namely that we get the wrong
> results in a sequence like this:
> 
> -- reflow the frame
> -- DidSetStyleContext(contextA)
> -- get some style structs from contextA
> -- DidSetStyleContext(contextB)
> -- we save contextA's border/padding/margin as the usedBorder/Padding/Margin,
> even though we haven't actually done a reflow with contextA
> 
> To avoid this, I guess we need to use a frame state bit after all :-). We need
> to detect whether a reflow has happened since the last DidSetStyleContext. If
> it hasn't, and we get a DidSetStyleContext again, then we need to skip saving
> the border/padding/margin to properties.

This was precisely what dbaron was concerned about, which was why I added the GetProperty checks. We don't overwrite the property if it exists in any case.
(In reply to comment #13)
> nsIFrame says
>   // Attention: the old style context is the one we're forgetting,
>   // and hence possibly completely bogus for GetStyle* purposes.
>   // Use PeekStyleData instead.
>   virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) = 0;
> 
> OK, so we should use PeekStyleData. I presume that if that returns null, then
> the frame hasn't been reflowed with that old style context yet, so we shouldn't
> store the old value.

There are quite a few existing lines in this function that ignore this rule...
Should I fix those as part of this patch?
No,

I guess you're right in comment #15.
The comment about GetStyleData returning incorrect data are no longer applicable (or might stop being so once dbaron lands some stuff; I'm not sure what the state of that code is).  The reason to peek instead of get would be purely as an optimization.
Attached patch Patch 5 (obsolete) (deleted) β€” β€” Splinter Review
Attachment #423737 - Attachment is obsolete: true
Attachment #423742 - Flags: review?(roc)
Attachment #423737 - Flags: review?(roc)
Comment on attachment 423742 [details] [diff] [review]
Patch 5

Looks good to me.
Attachment #423742 - Flags: review?(roc)
Attachment #423742 - Flags: review?(bzbarsky)
Attachment #423742 - Flags: review+
I'm not a good review choice here unless this can wait at least 1-2 weeks...
Comment on attachment 423742 [details] [diff] [review]
Patch 5

OK, let's try dbaron.
Attachment #423742 - Flags: review?(bzbarsky) → review?(dbaron)
For what it's worth, all the PeekStyleData gets you in this case is basically the NS_FRAME_FIRST_REFLOW optimization, but done right (so it doesn't affect within-reflow).  In other cases, the Peek->Get should chain across each style context change.  (If it didn't chain across consecutive style context changes, i.e., if there were cases where when Peek* was non-null on the old context we didn't call Get* on the new context, then using Peek would be an incorrect optimization.)
Comment on attachment 423742 [details] [diff] [review]
Patch 5

>+        // margin most definitely changed, store it

I'd drop this comment.

>+    NS_ASSERTION(hasMargin, "We should have a margin here!");

>+    NS_ASSERTION(hasPadding, "We should have padding here!");

Could you add back the "(out of memory?)" to both of these?


You need to fix a bunch of comments in nsIFrame.h.  For GetUsedMargin, 
GetUsedPadding, and GetUsedBorder, you should replace:
  Can only be called after Reflow for the frame has at least *started*.
with:
  Like GetRect(), returns the dimensions as of the most recent reflow.

r=dbaron with that
Attachment #423742 - Flags: review?(dbaron) → review+
This is really great, finally we can paint, handle events, etc in dirty frame trees without feeling guilty!
Attached patch For checkin (obsolete) (deleted) β€” β€” Splinter Review
Fixes dbaron's comments.
Attachment #423742 - Attachment is obsolete: true
Keywords: checkin-needed
http://hg.mozilla.org/mozilla-central/rev/8c2e7ae5cceb
Status: NEW → RESOLVED
Closed: 15 years ago
Keywords: checkin-needed
Resolution: --- → FIXED
Target Milestone: --- → mozilla1.9.3a1
Backed out because of this failure on Linux:

http://tinderbox.mozilla.org/showlog.cgi?log=Firefox/1265296841.1265299980.17408.gz

>TEST-UNEXPECTED-FAIL | chrome://mochikit/content/chrome/content/xul/content/test/test_bug398289.html | persistent attribute in tab box broken, expected:
>data:image/png;base64,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
>got:
>data:image/png;base64,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
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
I bet the problem is that we don't use nsHTMLReflowState for XUL Layout, so you need an equivalent to the change in nsHTMLReflowState::InitConstraints for XUL.  

(That still wouldn't fix percentage padding and margin being broken in XUL, but that's already broken, I *think*.  Would probably be good to fix, though, but probably not in this bug.)
(And it might also be good to add a reftest that would more directly catch the regression.)
Attached patch New patch (deleted) β€” β€” Splinter Review
The only change is in nsBox at the bottom of the patch.
Attachment #423844 - Attachment is obsolete: true
Attachment #427659 - Flags: review?(roc)
http://hg.mozilla.org/mozilla-central/rev/11c0a0745d39
Status: REOPENED → RESOLVED
Closed: 15 years ago15 years ago
Resolution: --- → FIXED
Depends on: 550325
Depends on: 586628
Depends on: 603043
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: