diff options
author | win7-7 <win7-7@users.noreply.github.com> | 2020-05-08 00:52:23 +0300 |
---|---|---|
committer | win7-7 <win7-7@users.noreply.github.com> | 2020-05-08 15:24:02 +0300 |
commit | 58219fc214e7d20b2062e99b8007c087ed5b11a5 (patch) | |
tree | 909894d86b92250a23caf2e390262ab7f0094fb5 /layout/base | |
parent | 130df5da4ff47d546f8e2eecd7c388b78a587930 (diff) | |
download | uxp-58219fc214e7d20b2062e99b8007c087ed5b11a5.tar.gz |
Issue #1355 - Avoid unnecessary work in nsIFrame::BuildDisplayListForStackingContext() and nsIFrame::BuildDisplayListForChild() and Cleanup DescendIntoChild
Bug 1441796 - Part 1: Optimize the (pseudo)-stacking context conditions
Bug 1441796 - Part 3: Reuse the results in nsIFrame::BuildDisplayListForStackingContext() for ChildrenHavePerspective(), IsTransformed(), and Combines3DTransformWithAncestors()
Bug 1512244 - Part 1: Cleanup DescendIntoChild
Diffstat (limited to 'layout/base')
-rw-r--r-- | layout/base/nsDisplayList.cpp | 23 | ||||
-rw-r--r-- | layout/base/nsDisplayList.h | 14 |
2 files changed, 27 insertions, 10 deletions
diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index b08fe4219a..a869564a4f 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -1009,8 +1009,22 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame, } state->mInsidePointerEventsNoneDoc = pointerEventsNone; - if (!buildCaret) + state->mPresShellIgnoreScrollFrame = + state->mPresShell->IgnoringViewportScrolling() + ? state->mPresShell->GetRootScrollFrame() + : nullptr; + + nsPresContext* pc = aReferenceFrame->PresContext(); + nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell(); + if (docShell) { + docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); + } + + mIsInChromePresContext = pc->IsChrome(); + + if (!buildCaret) { return; + } RefPtr<nsCaret> caret = state->mPresShell->GetCaret(); state->mCaretFrame = caret->GetPaintGeometry(&state->mCaretRect); @@ -1018,13 +1032,6 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame, mFramesMarkedForDisplay.AppendElement(state->mCaretFrame); MarkFrameForDisplay(state->mCaretFrame, nullptr); } - - nsPresContext* pc = aReferenceFrame->PresContext(); - nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell(); - if (docShell) { - docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); - } - mIsInChromePresContext = pc->IsChrome(); } // A non-blank paint is a paint that does not just contain the canvas background. diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 1b2010d339..3aeb20d196 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -520,6 +520,14 @@ public: * Get the caret associated with the current presshell. */ nsCaret* GetCaret(); + + /** + * Returns the root scroll frame for the current PresShell, if the PresShell + * is ignoring viewport scrolling. + */ + nsIFrame* GetPresShellIgnoreScrollFrame() { + return CurrentPresShellState()->mPresShellIgnoreScrollFrame; + } /** * Notify the display list builder that we're entering a presshell. * aReferenceFrame should be a frame in the new presshell. @@ -805,10 +813,11 @@ public: friend class AutoSaveRestorePerspectiveIndex; class AutoSaveRestorePerspectiveIndex { public: - AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) + AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, + const bool aChildrenHavePerspective) : mBuilder(nullptr) { - if (aFrame->ChildrenHavePerspective()) { + if (aChildrenHavePerspective) { mBuilder = aBuilder; mCachedItemIndex = aBuilder->mPerspectiveItemIndex; aBuilder->mPerspectiveItemIndex = 0; @@ -1175,6 +1184,7 @@ private: nsRect mCaretRect; uint32_t mFirstFrameMarkedForDisplay; bool mIsBackgroundOnly; + nsIFrame* mPresShellIgnoreScrollFrame; // This is a per-document flag turning off event handling for all content // in the document, and is set when we enter a subdocument for a pointer- // events:none frame. |