Summary: | REGRESSION (r84166): recalcStyle for display:inline to display:none transition has complexity N^2 where N is the number of child Text nodes | ||
---|---|---|---|
Product: | WebKit | Reporter: | Ilya Tikhonovsky <loislo> |
Component: | Layout and Rendering | Assignee: | Ilya Tikhonovsky <loislo> |
Status: | RESOLVED FIXED | ||
Severity: | Normal | CC: | eric, hyatt, mitz, simon.fraser |
Priority: | P1 | Keywords: | InRadar, Regression |
Version: | 528+ (Nightly build) | ||
Hardware: | Unspecified | ||
OS: | Unspecified | ||
Bug Depends on: | |||
Bug Blocks: | 60959 | ||
Attachments: |
Description
Ilya Tikhonovsky
2011-05-26 14:05:28 PDT
Created attachment 95872 [details]
[patch] initial version.
I think a simpler fix would be to revet to using the containing block except in the case r84166 was addressing, by stopping at layer boundaries. Comment on attachment 95872 [details]
[patch] initial version.
Surely this can be fixed without adding a bit to all RenderObjects. Do we even have a free bit? I don't think we do.
Created attachment 96084 [details] [patch] second version. r84166 was reverted. Special case for relative positioned renderer was added. Comment on attachment 96084 [details] [patch] second version. r84166 was reverted. Special case for relative positioned renderer was added. I'm not sure RenderLayer::repaintRect() is reliable. Isn't that the old cached rect and not necessarily current? I think Dan wanted you to do something more like his patch in the one specific case and then more like the original code otherwise, but I'll let him comment. Created attachment 96857 [details] Use the containing block unless it is across a layer boundary No need to change the test. I confirmed that it still fails with TOT minus r84166, and passes with TOT plus this patch. Comment on attachment 96857 [details] Use the containing block unless it is across a layer boundary View in context: https://bugs.webkit.org/attachment.cgi?id=96857&action=review > Source/WebCore/rendering/RenderText.cpp:1361 > + RenderObject* cb = containingBlock(); I would much prefer a word or phrase to the acronym cb here. If “cb” is a good name, then I suggest: RenderObject* containingBlock = this->containingBlock(); But if there is a better name for the local variable, then all the better. > Source/WebCore/rendering/RenderText.cpp:1370 > + // The containing block may be an ancestor of repaintContainer, but we need to do a repaintContainer-relative repaint. > + if (repaintContainer && repaintContainer != cb && !cb->isDescendantOf(repaintContainer)) > + return repaintContainer->clippedOverflowRectForRepaint(repaintContainer); Wrong indentation on the body of this if. Fixed in r88617. <http://trac.webkit.org/changeset/88617> Comment on attachment 96084 [details] [patch] second version. r84166 was reverted. Special case for relative positioned renderer was added. Cleared review? from attachment 96084 [details] so that this bug does not appear in http://webkit.org/pending-review. If you would like this patch reviewed, please attach it to a new bug (or re-open this bug before marking it for review again). |