Closed
Bug 542361
Opened 15 years ago
Closed 15 years ago
Fix and remove the GetUsedX assertions
Categories
(Core :: Layout, defect)
Core
Layout
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)
(deleted),
patch
|
roc
:
review+
|
Details | Diff | Splinter Review |
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.
Assignee | ||
Comment 2•15 years ago
|
||
(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).
Comment 3•15 years ago
|
||
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.
Assignee | ||
Comment 4•15 years ago
|
||
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)
+ 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.
Assignee | ||
Comment 7•15 years ago
|
||
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.
![]() |
||
Comment 10•15 years ago
|
||
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...
Assignee | ||
Comment 11•15 years ago
|
||
Attachment #423734 -
Attachment is obsolete: true
Attachment #423737 -
Flags: review?(roc)
Attachment #423734 -
Flags: review?(roc)
Assignee | ||
Comment 12•15 years ago
|
||
(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.
Assignee | ||
Comment 15•15 years ago
|
||
(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.
Assignee | ||
Comment 16•15 years ago
|
||
(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.
![]() |
||
Comment 18•15 years ago
|
||
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.
Assignee | ||
Comment 19•15 years ago
|
||
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+
![]() |
||
Comment 21•15 years ago
|
||
I'm not a good review choice here unless this can wait at least 1-2 weeks...
Assignee | ||
Comment 22•15 years ago
|
||
Comment on attachment 423742 [details] [diff] [review] Patch 5 OK, let's try dbaron.
Attachment #423742 -
Flags: review?(bzbarsky) → review?(dbaron)
Comment 23•15 years ago
|
||
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 24•15 years ago
|
||
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!
Assignee | ||
Comment 26•15 years ago
|
||
Fixes dbaron's comments.
Attachment #423742 -
Attachment is obsolete: true
Assignee | ||
Updated•15 years ago
|
Keywords: checkin-needed
Comment 27•15 years ago
|
||
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
Comment 28•15 years ago
|
||
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,iVBORw0KGgoAAAANSUhEUgAAAfQAAACWCAYAAAAonXpvAAAgAElEQVR4nO3de1yUVeI/8IPMDXBVUFDIO6CmKWiKWZm5petuW9vW2sXKSldd76KGl7TWbKtVAxFDQ0RNwAsqQnjB1FBDLiKIlIgitwFx0MlLdvn+/vn8/nCZGJjLMzAy8Pg5r9f7Dx/nOec855yHz8wzz8wIsLCwsLCwsLT6IhzdARYWFhYWFpamFwY6CwsLCwuLDAoDnYWFhYWFRQaFgc7CwsLCwiKDwkBnYWFhYWGRQWGgs7CwsLCwyKAw0FlYWFhYWGRQrAb6s88+S0RERC3IkiVLGOhERESt2ZIlS5CYmNj4QNfrtERERORgiYmJDHQiIqLWjoFOREQkAwx0IiIiGWCgExERyQADnYiISAYY6ERERDLAQCciIpKBBz7QD588g9eWbcbjk//rUCOnrsFryzbj8MkzDh8TIiJqfR7oQD+ZlYexc7/AP8JO462Yy5i49YrDvBVzGf8IO42xc7/Ayaw8h48NERG1Ls0S6LlZafhy7UdYuXhai/DJ+zPx5dqP8NqyaIwPz3RokNc3PjwTb3ywxeELg4iIWpf7Hujf551G+CeLkJtxHNXaYtRUlTpctbYYuRnHMWraaty9+xN+/fkOfrl7y+Hu3rmJG9d1GDVtjcMXBhERtS73PdA3rVuJ/OyTKP4+q8VZuXga/t///Yqff7rVYtzU12Dl4mkOXxhERNS63PdA/+T9majWFjs8vC0H+s0W4+YNHQOdiIhsdt8DfeXiaaipKnV4eFsK9Lt3brYYP964xkAnIiKbMdB/+wV37/zYYuivVzPQiYjIZg98oP/fb7/g7m19i6GvucpAJyIimzHQf/sFP93WGxFCWFV/H3u5wUAnIqJGcHignziShJf+9hw8O3WEQqFA14e8MfmdN5CXeaz5Av3WDSPFRRcM4rZvhRACeTlZRtvr72MvN3RVDHQiIrKZQwP96IE9cHfvgD8+PRK7Yzfh5DdJ2LopAoMe6Y++/r44n512/wP9158tBuzBlCQIIVBZfgU/3bqBhJ3xaNeuHW7pdfjp1g2kn0qDEAJzZ8807DPp3bfx8kt/x0+3buDmjWt4b+F8POTjA6VSCT8/X3wRsdZse9evVTLQiYjIZg4N9CcfH44nRwThckGm0faCM2no+pAPpk2eaNgWt2UDhBDYuG41fHv3hFKpRMCgATh6YI/RvsuXzEevnt2hVCrRpbMX5sz4J4rOZ1gM9Ds3r5t14Ov9EEJAW1aMOzevo7L8CpydnXHi+De4c/M6/vvpf+Dh4YEhQwYb9vH390NY6GrcuXkdUyZPgpeXJ3bvjMOFgjyEh30OlUqFyPXrTLZXU61loBMRkc0cFug53x2Bk5MTtkatMxm2IfNn4SGfLg0CfXDAQOyNj0Fq8i4EDByAEcOHGh4zZ8Y/4du7J7Z8GY7vjn2NbZsi0PUhb8ycNslsoP/268+4c7PGrANfJ/4v0C8btgUGBuDjj/6NOzdr8Nfn/ozly5ZApVLhqrYEl4u+hxACZ7K+Q2V5MZRKJWKiNxrVOXvWDPj7+5lsr6a6goFOREQ2c1ig742PgRACGWkHTYbt5g1hEEKgMO87o0DfsXWj4THrPv8PnJ2dUZR/GgU5J6BRq7Fv5xajesJWrUSH9u0sBPpd3P6xxqwDyfcCvaL0smHb7Jkz8KexY3BLr4OHhzsy0k8iIGAQ9uzegZjoL+Hl6YnbP9bg2DeHIYTAxQvnjercvTMOQgjUVFc2aE93tZyBTkRENmt1gZ6T/k2DV+15mcewb+cWCCHg4uJiRK1WQQhh8v34lYun4bdf7uL2jzqzfg/0S4Ztu3bEol27dvjuxDF06tQRt/TXMHP6NMybOxvvvjMRL/7tBdz+UYdj3xz6X6DnG9W5e2fs/wJd26C9a1UMdCIisl2LveT+XvBMk5fcczOOmtxW+wQhIS4axw7ubeCSiffRDYGu15llCPSSS4Zt2tLLcHZ2xuuvvoIXnv8rbut1iI/dhqGPDoG/nx8+X/UZbut1qCy7d8l9c9RGozpnz5yOPv7+Jtu7VlXGQCciIps59Ka4J0YEWbwpbuqktyQH+vnsNKjVKoSv+dimu9x/++UubumvmZWSvA9CCJSXFBltDwwYBGdnZ6z67ye4pb+GsitFUCqVEEIgM/2E4XFTJr8LL09P7NoRi+/zz2Jt6GqoVEp8EbHWZHvVlaUMdCIisplDA/1Iym506NAez4weiYS4aJw6moytmyIQMHAA+vj7Ij/rW8mBfu+muCno0KE9Vn/yIU4cScKxg3ux7vP/YO7MqWYD/ddffmpUoM+aOf3eWwbfpRm2PfLIAMMl+Fo3dJVYEDwX3t7e9z625uuLdWs/N9tetbaEgU5ERDZz+BfLpKUm4sXn/4yOHu5QKBR4yKcLJr09ocEXy0gJ9OLvs/Dxh0vQ198XSqUSLi4uCBg4AJ+sWGox0G/eqG4xrmqvMNCJiMhmDg90R1q5eBp+/fkn3LxxtcWoqmCgExGR7RjoP9/BzetXW4yq8mIGOhER2YyB/vMd/Hi9qsWoLLvMQCciIps98IH+y8938GNNVYtRWXaJgU5ERDZjoN+9jR9rKlsMbWkRA52IiGzGQL972+GTUFdFyUUGOhER2YyBzkAnIiIZaJZAb8laaqATERGtXCz9BV6zBPovd2+3SLV9c3SImwp0R48NERE5Vs21qy0z0B0dlERERK2JrW/BMtCJiIhaIAY6ERGRDDDQiYiIZICBTkREJAMMdCIiIhlgoBMREckAA52IiEgGGOhEREQywEAnIiKSAQY6ERGRDDDQbXC9uhxXK4qtPi48bDV6dO+GNm3aQAjhkD7Ul5y4G0IIlFz6weHjSERE9ie7QBdCWNXYuqWE4g/5OXB2dsbKFR+gIC8bhQW5dp2wxgazrftJGcc1qz6Bm5sbdFWlRgtKoVBgeNAwo/oOJO+DEAJZ6WmGbefOZuC1V8fDy8sTSqUC3bt1xczpU1F6+YLDTggiotZKdoFeWJBrsC0mCkIIZJ8+YbS9sXVLCcWv9++BEALFRQVNnpwb1yqMwlJqHxrbd1vHMSs9DUIIpB5MMuy3K/4r+Ph4Q61SobLskmH7kkUL0aVLZ8O/z2ScREcPD4wbOwaHUhKRn5uJvbvjMTgwAP0f7oeKkosOPTGIiFob2QV6XeZC7NOPV8DXtzdUSiV8fLwRsjAYNVfLUHThHDw9O2HZ0hDDY48cSoZSqcCeXXGSXu2be4yuqhTz582Gj483lEoFfH17Izxstcn+RkdFol/fPlAoFEhO3C2p/rycDPxx9Ci0bdsWGo0G48aOQdEPeQ3q3hK9Eb169oCLiwsmvjmhwRMGW8ZRr9Oic2cvLH9/seHfc2ZNx+RJb6NvH3/sS4g3bB/55BMY//LfDf8e/fRTeHrUSNy4VmFUn7a0CD26d8Pc2TMcfnIQEbUmD1yghywMRh9/PyTsjEVBXjb2JcSje7euWBA8B3qdFjvjtkGpVOBY6gFUlFxEr149MW3KZOh1WpOvVOu3ae4xk9+dCE/PToiP3YL83EyErvkMKqUSEWs/b9DfRwb0R0rSXuSeOY0rRd9Lqj8rPQ07YrciPzcTKUl70f/hfnjh+eca1B00bChOfnsESft2wcPdHYtDFjRqHGv946UXMfrppwz/HhwYgC3RGzHpnbcQPHc29DotrmqvQKPRGJ7AXL54Hk5OTtizK85kex8uX4puXbs6/OQgImpNHqhAryy7BI1Gg6OpKUaPi9q4Hu4dOhj+PfndifD17Y3xL/8dD/fra7gJTcpla1OPKb18AUqlAlEb1xs9dub0qfDz822w7+4d222q35TtW6Oh0WgMr4BN1b1saYik4LTU5trQVXB1dYWuqhTlVwqhUChQdOEcoqMiETRsKPS639+GOJudDr3u3lUPIYTZtz92xX8FIQSqK0scfoIQEbUWD1SgH01NgRACrq6uRtRqNYQQhvdtq8ovo2eP7lAqFTj57RGz9UlpU6/7PcB+yM8xeuyO2K0QQuCq9orRvnUvlUupX6/T4viRg3j2mdHw9OwENzc3wzGVXyk02u/i97/XvXvH9nvtW7lr3tJx52SeghAChw/sx864bejbxx963b334FVKJbSlRVgcsgBdH3qowXgw0ImI7OeBCvTaIDl8YD9yMk81cL26HHqdFt+dOAq1Wg1nZ2fEbY8xW5+UNuu2KzXQba2/rLgQ7du3wxsTXkXqwSScyTiJyIgwo8fdr0DX67Tw8fHGsqUhmDVjGia985Zhu69vb+zZFYcnHh+B118bb9hu7ZL7B8uW8JI7EZGNHqhAryi5CLVajeioSLP7VFeW4JEB/fHaq+Ox/P3F6NSpk+EVc0rSXqt3sJsLXHOX3P39/SzuW5+pPhxKSYQQAhfOnzVsW/HhMpOBnrAz1vCY5UsXNfmSu16nxSvjX8bTo0YiMHAQNtcZ24lvTsCMf02BWq1GZESY0T6jnhpp8aa4ObOmO/zkICJqTR6oQNfrtFj03nx4uLsjMiIM585mICfzFDZHRRpuDps1Yxq6d+uKsuJCXK8ux+MjhmPsmGeg12mRn5sJIQTWh4ei6MI5XCrMl9SmXqfF5Elvw9Ozk+HGNUs3xVkKdFN9qP3s+7w5M5GXk4HtW6Ph4+NtMtCHBw3DqbRvkJyYgI4eHghZGNyocawrYu3n0Gg0UCgURlcANkauQ9u2bSGEwPm8LKN9stLT4OHujnF/GoPDB/bjfF4W9u6Ox5DBgXi4X1/DWwVERCTNAxfoep0WoWs+Q/+H+0GlVMLV1RVDBgdibegqJCfuhkKhwIHkfYbH5udmol27P2D1fz+BXqfF4pAF8PLyhJOTk8mPrZlrU1dViuC5s+Ht3cXwsbW1oask7VufqT6sC1uDzp29oFapMOKxIKwNXWUy0Ot+bO3NCa/hWmXTPram1937yJwQwuhqg16nRUFeNoQQ6NWzh8n9cs+cxivjX0anTp2gVCrQrWtXzPjXFH6xDBFRI8g60ImIiB4UDHQiIiIZYKATERHJAAOdiIhIBhjoREREMsBAJyIikgEGOhERkQww0ImIiGSAgU5ERCQDDHQiIiIZYKATERHJgGwDfdF78/HGhFebXI/U71e3t+vV5SZ/1rQ5++OoY3cUc2Peksaludq2Vzu21NOUNd8a1qrU9dXS6nZkW43VUtZDc/dDloFeXFSAdu3+gJys76DXabFm1Sdwc3ODrur3HyKpKLkIhUKB4UHDjPY9kLwPQghkpac5dGGYa5eB7vjjra4sQWFBboOffm1JfWwp7dhST1PWvCPnpCXMHf8utMw+MtDtEOiffPxvjHgsyPDvrPQ0CCGQejDJsG1X/Ffw8fGGWqVCZdklw/YlixaiS5fODl8YDPTm56jjvXGtwujJZkvoY2sL9NaAgW6ZLedBSxqPltQPWQZ6YOAgrPhwmdG2zp29sPz9xYZ/z5k1HZMnvY2+ffyxLyHesH3kk09g/Mt/bzAhe3bF4ZEB/aFSKvHokME4k3HSqP5PP14BX9/eUCmV8PHxRsjCYNRcLWtQT+y2zejj72e2nlpCiAbs2Z/6dFWlmDl9Kjp6eMDFxQXjxo7Bhi/CjRajrqoU8+fNho+Pt+EnYMPDVhvVc726HB8sW4JePXtAoVCgS5fOht+aN7W462+r/fe+hHgEBAyEWqXC4MAAZKWn4cihZAQGDoJapUJAwEBknz5h1zkwN+bWTtIvN0Sgj78fFAoF3NzcMGRwIM6dzbB6kkdHRaJf3z5QKBRITtxt0zHYMid5ORn44+hRaNu2LTQaDcaNHYOiH37/3Xopcy+lb1LrMacpa76pc2Jp3Uod56asr+Zau9WVJZg6ZRI83N3h4uKCv/z5T4jauN6muTbXlr3OA6ljsTFyHbp36woXFxdMfHOC0ZOB+uvB2jlgbf6bY/3bg+wCvfxKIdq0aYPkxASj7f946UWMfvopw78HBwZgS/RGTHrnLQTPnQ29Tour2ivQaDRGJ2rtwggaNhRHDiUj47tvMWRwIEY++YThMSELg9HH3w8JO2NRkJeNfQnx6N6tKxYEz2lQz7Chj5qtp65tMVEQQiD79AkUFuSisCDXrv2pb+qUSejc2Qs747YhPzcTn6/+FB09PIwW4+R3J8LTsxPiY7cgPzcToWs+g0qpRMTazw31zJk1HR7u7tgcFYnzeVk4cigZ68NDTZ5kprbVPb7Ug0nISk9D0LChGDRoIB4fMRyHD+xH9ukTCBo21O5zYG7Mzf0hKrn0A/JzM+Hs7IyQhcE4m52Oc2czELc9Bufzsqz+IXtkQH+kJO1F7pnTuFL0vU3HYMucZKWnYUfsVuTnZiIlaS/6P9wPLzz/nE1zL6VvUuqxpClrvqlzYmndSh3nxq6v5ly77779Fry9u2D3ju3Iz83EurA18PTsZNNcm2rLXufB1CmTbBqLk98eQdK+XfBwdzcK4PrnibVzwNr8N8f6twfZBXrascMQQiAvx/iZ4drQVXB1dYWuqhTlVwqhUChQdOEcoqMiETRsKPQ6Lb7evwdCCJzNTm+wML7ev8ewbXNUJBQKBXRVpagsuwSNRoOjqSlG7UVtXA/3Dh0k12NusZu7/NjU/tRVVlwIlVKJzVGRRttnzZhm6EPp5QtQKhWI2rje6DEzp0+Fn58v9Lp7T6bUKhU2fBFu8QSWEuh1n5DFbNrQ4JhjNm2AQqFAzdUyu82B1MtjdR/3zeGvIYTAsdQDktdo7f67d2w3bLP1GKTOiSnbt0ZDo9HgxrUKSXMvpW9S6pE6Lrau+abOibV1K3WcG7O+mnPtlhUXQqlUYEv0RqPt8+bMtGmuTbVlj/PA1rGoe/4sWxqCbl27Wl1Lps4Ba/PfXOvfHmQX6ClJeyGEwKXCfKPtOZmnIITA4QP7sTNuG/r28Ydep0VhQS5USiW0pUVYHLIAXR96yOSiKy4qaLCt9PIFHE1NgRACrq6uRtRqNYQQqCi5KKkec4vd3B+3pvanrtqT8cL5s0bbd8ZtM/ThyKFkCCHwQ36O0WN2xG6FEAJXtVcM9dR/jKVjMhfopo7vfs9BYwK95moZnhr5JFRKJUY++QTmzZ2FlKS9kvave8nP1mOQOid6nRbHjxzEs8+MhqdnJ7i5uRnqLL9SKGnupfRNSj3Wzt3Grvmmzom1dSt1nBuzvppz7dYeR1Pn2lRb9jgPbB2Li9//fv7s3rH93lz87+77+n2Ucg6Ym//mWv/2ILtA//boIZOv0PU6LXx8vLFsaQhmzZiGSe+8Zdju69sbe3bF4YnHR+D118Zb/SNj6o/q4QP7kZN5qoHr1eWS6jG32KXcINSY/tTVfIGe0KDv+/fuNBno1sbpfsxBYwK9dtvR1BSsXPEBnvvLOKhVKkx4/RWb9m/MMUiZk7LiQrRv3w5vTHgVqQeTcCbjJCIjwhq8mpUy95b61hyBLuWJYGPmxN6Bbsv6as61W9tW/cvxu+K/smmuLbXVlPPA1rGQGuhSzwFr83+/1789yC7Qy68UwsnJyejSVK1Xxr+Mp0eNRGDgIKNLIxPfnIAZ/5oCtVqNyIgwm/6YVJRchFqtRnS9Sy3WFq+5bbVqrzTUfUZuz/7UVXu5KGbTBqPts2f+y+ikMHfZ0d/fzzD2KqXS7KWr2idbOZmnDNs+/XhFkwPdXnNgbsyl1FPXhi/C4eTkZPazuqb2b8wxSJmTQymJDf7QrPhwmVEd1uZeSt+k1GNtHTZ2zTd1TqytWynj3Nj11Zxrt/atg62bvzTaPm/uLJvmWup5Yut5YOtYJOyMNWxbvnSR2Uvu1s4Ba/PfXOvfHmQX6HqdFoMGPoKP/r28wfaItZ9Do9FAoVAYPbvbGLkObdu2hRCiwU0cUv6YLHpvPjzc3REZEYZzZzOQk3kKm6MiLd6kYW5brfzcTAghsD48FEUXzhneQrBXf+r75+R3jG6WWRu6quFNcZPehqdnJ8PNJaZuDJo5fSo83N0Rs2kDzudl4VjqAXyx7t7NJdWVJejo4YFXX/kH8nIykLAzFj26d2tyoNtrDsyNeX119zlxPBWL3puP1INJKMjLxonjqfjbC39Fzx7dzY61uXlvzDFYm5Mf8nPg7OyMeXNmIi8nA9u3RsPHx9uoDilzL6VvUuqxpClrvqlzYmndSl37jV1fzbl23337Lfj4eCNhZyzO52VhfXgovLw8IcTvb19Y64+ptux1HtgyFsODhuFU2jdITkxARw8PhCwMNlm3lHPA2vw3x/q3B1kG+vKli/D4iOENtuflZEAIYfSsWq/ToiAvG0II9OrZQ9KiM7UtdM1n6P9wP6iUSri6umLI4ECsDV1lcz11LQ5ZAC8vTzg5OUEIYdf+1HetshTTp02Bh7s7NBoNnh41EuvDQ43q1VWVInjubHh7dzF8dKd+ndery7F08Xvo1rUrnJ2d4e3dBUsXv2f4/z274tCrZw+olEoMfXQIQtd8ZpdAt9ccmBpzS2vibHY6xo0dAy8vT7Rp0wbt2v0B48aOMXwxkbX96/+frccgZU7Wha1B585eUKtUGPFYENaGrjKqQ8rcS+mblHru15pv6pxYW7dSxrkp66u51m7tx9bcO3QwfLTqi3X35qj2rQMp/anflj3PA6ljEbNpA3p07waNRoM3JryKa5XmP7Zm7RywNv/2Wv/3mywDvejCObi5uRld2iUix1sfHooB/R9u0d/o9qCpf4d4Syf1XpcHkSwDXa/TInjubLt8lzsR2c/f//Y84r6KcXg/HlRZ6Wn4ckMEzmanI/fMacPHeT9YtsThfZOKgW6ebAOdiIiMZaWnYcjgQLi6ukKhUKBXzx5Y/v5ik59+aakY6OYx0ImIiGSAgU5ERCQDDHQiIiIZkGWg2/s9luvV5Sa/HEGO7+WEh61Gj+7d0KZNG7MffWluzT3+psbAHm2ZOw5bH2NKY/s3aNDABl80QkStEwO9CfXJLdBrv4Bh5YoPUJCXbfYXm5pbc46/uTGorixBYUFukz5uJaW/jT2mxu4Xs2kD+vj78WNkRDLAQG9CfXIL9Npfm7P2lY43rlWY/IW4+6U5x1/qGDRmTFpioFdXlqB9+3bYuzu+2dcbEdmXrAN9S/RG9OrZAy4uLpj45gTDH9zFIQvQr2+fBvsNGjQQ8+bOarBdCNFA3Xb27IrDIwP6Q6VU4tEhg3Em46TR/p9+vAK+vr2hUirh4+ONkIXBqLlaZrb/uqpSzJ83Gz4+3oZvpar7G+11247dthl9/P3s0ra144yOikS/vn2gUCiQnLjbpn7uS4hHQMBAqFUqDA4MQFZ6Go4cSkZg4CCoVSoEBAxE9ukTjeqXPcffWlv1v5ms/ph8uSECffz9oFAo4ObmhiGDA3HubIbFuqW0n5eTgT+OHoW2bdtCo9Fg3NgxRr/WZm3NW/LSiy/grTded8gfICKyH1kHetCwoTj57REk7dsFD3d3w/fuFuRlo02bNka/b3vy2yMQQjQIA71Oi20xURBCIPv0CRQW5Bouw9Zt58ihZGR89y2GDA7EyCefMOwbsjAYffz9kLAzFgV52diXEI/u3bpiQfAcs/2f/O5EeHp2QnzsFqvfGz1s6KN2a9vacT4yoD9SkvYi98xpXCn63qZ+Bg0bitSDSchKT0PQsKEYNGggHh8xHIcP7Ef26RMIGjbUqO+OGn9rbdUP9LpjcuJ4KpydnRGyMBhns9Nx7mwG4rbHGH4fwFzdUtrPSk8zfI94StJe9H+4H154/jnJa96Sjz/6AL1793L4HyMiahpZB/ruHdsN2+p/veGzz4w2+gnVf039J0Y8FmSxPnOXfOv+stvmqEgoFAroqkpRWXYJGo3G6ImDXqdF1Mb1cO/QwWRbtb+IZOqXnfz8fO9r29aOs+542trP5MQEw7aYTRsa9D1m0wYoFAqTr5ybc/ylXt43NSa1P6F4LPWATXXb+hi9TovtW6Oh0WgM731LWfPmbIuJgrOzs8WrRkTU8sk60C39Xu5XWzahfft2uFpRjGuVpejo4YH14aEW6zP3R77u+62120ovX8DR1BQIIeDq6mpErVZDCIGKkosN2rL1t5ft2ba146x7idce/TTXd0eOv62BXndMaq6W4amRT0KlVGLkk09g3txZSEnaa7VuKe0fP3IQzz4zGp6eneDm5mY4hvIrhZLXvDn7EuKN6iKi1umBDXRdVSk8PTshauN6bIuJQtu2baEtLbJYn5Sbsupuqw29wwf2IyfzVAOmvm7R1qC0Z9u2HKe9+mmt7eYef1sD3VR/j6amYOWKD/DcX8ZBrVJhwuuvWN3HUvtlxYVo374d3pjwKlIPJuFMxklERoSZ7E9jAn1bTBTatGnDV+hErZysAz1hZ6xh2/KlixpcfpwzazqeHjUSfxrzrMWbglKS9jZ4JVi3HXOBUlFyEWq1GtFRkZL7XlZcaPZSdt2ffb0fbdsSnPbqp7W2m3v87RHodW34IhxOTk64WlFs9jisHeuhlEQIIXDh/FnDthUfLjPZH2tr3pSPP/rA5E8HE1HrIutAHx40DKfSvkFyYgI6enggZGGw0ePOZJyEs7MznJ2dcfjAfrP15edmQgiB9eGhKLpwDpcK843asRRMi96bDw93d0RGhOHc2QzkZJ7C5qhIizcrTZ70Njw9OxlugrJ0s5k927b142H26qelNpp7/JsS6CeOp2LRe/ORejAJBXnZOHE8FX974a/o2aO7xeOwdqy1n42fN2cm8nIysH1rNHx8vE32x9Ka/+bw1/Dz821waf2lF1/gLxMSyYCsA73uR3jenPAarlU2/AjPiMeC0KfOK0pzFocsgJeXJ5ycnCCE+W8PM7UtdM1n6P9wP6iUSri6umLI4ECsDV1lti1dVSmC586Gt3cXw8fB6j/+frRta6Dbs5/WXvE21/g3JdDPZqdj3Ngx8PLyRJs2bdCu3R8wbuwYZKWnWTwOKce6LmwNOnf2glqlwojHgrA2dJXJ/lha86b6XF1Zgg4d2hu9siei1tV25zAAAAFhSURBVEmWgW4LX9/eWPHhModPBJEjbN38Jfz8fPlNcUQy8MAGetGFc1j12X/g4uJi8tIn0YNg0KCBiNm0weH9IKKme2ADXQiBjh4eiIwIc/gkEBERNdUDG+hERERywkAnIiKSAQY6ERGRDDDQiYiIZICBTkREJAMMdCIiIhlgoBMREckAA52IiEgGGOhEREQywEAnIiKSAQY6ERGRDDDQiYiIZICBTkREJAMMdCIiIhlgoBMREckAA52IiEgGGOhEREQywEAnIiKSAQY6ERGRDDDQiYiIZICBTkREJAMMdCIiIhlgoBMREckAA52IiEgGGOhEREQywEAnIiKSAQY6ERGRDLTIQK+5dhUVJReJiIjIBi0u0ImIiKhxWkygExER0f3HQCciIpIBBjoREZEMMNCJiIhkgIFOREQkAwx0IiIiGWCgExERyQADnYiISAYY6ERERDLAQCciIpIBc4H+/wEw6QOjrseBKAAAAABJRU5ErkJggg== >got: >data:image/png;base64,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
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Comment 29•15 years ago
|
||
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.)
Comment 30•15 years ago
|
||
(And it might also be good to add a reftest that would more directly catch the regression.)
Assignee | ||
Comment 31•15 years ago
|
||
The only change is in nsBox at the bottom of the patch.
Attachment #423844 -
Attachment is obsolete: true
Attachment #427659 -
Flags: review?(roc)
Attachment #427659 -
Flags: review?(roc) → review+
Assignee | ||
Comment 32•15 years ago
|
||
http://hg.mozilla.org/mozilla-central/rev/11c0a0745d39
Status: REOPENED → RESOLVED
Closed: 15 years ago → 15 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•