author | David Anderson <dvander@alliedmods.net> |
Wed, 19 Nov 2014 20:24:15 -0800 | |
changeset 216567 | 19b303e7e7f262f0a8ee925770981499b3632e5f |
parent 216566 | 88315012b6cc251a867c36941d5296a29b77ca83 |
child 216568 | 3909450514b4b686f79c869e8c4d1f89c9180e16 |
child 216632 | 6ce1b906c690fd60abfbf4c7dea60d9e405f0ad8 |
push id | 52091 |
push user | danderson@mozilla.com |
push date | Thu, 20 Nov 2014 06:12:13 +0000 |
treeherder | mozilla-inbound@19b303e7e7f2 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | tn, kats |
bugs | 1082594 |
milestone | 36.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -397,29 +397,16 @@ APZCTreeManager::PrepareAPZCForLayer(con apzc->AddHitTestRegions(EventRegions(unobscured)); APZCTM_LOG("Adding region %s to visible region of APZC %p\n", Stringify(unobscured).c_str(), apzc); } } return apzc; } -static EventRegions -EventRegionsFor(const LayerMetricsWrapper& aLayer) -{ - // This is a workaround for bug 1082594. We should be able to replace this - // with just a call to aLayer.GetEventRegions() once that bug is fixed. - if (aLayer.IsScrollInfoLayer()) { - EventRegions regions(ParentLayerIntRect::ToUntyped(RoundedIn(aLayer.Metrics().mCompositionBounds))); - regions.mDispatchToContentHitRegion = regions.mHitRegion; - return regions; - } - return aLayer.GetEventRegions(); -} - AsyncPanZoomController* APZCTreeManager::UpdatePanZoomControllerTree(TreeBuildingState& aState, const LayerMetricsWrapper& aLayer, uint64_t aLayersId, const gfx::Matrix4x4& aAncestorTransform, AsyncPanZoomController* aParent, AsyncPanZoomController* aNextSibling, const nsIntRegion& aObscured) @@ -492,17 +479,17 @@ APZCTreeManager::UpdatePanZoomController next = UpdatePanZoomControllerTree(aState, child, childLayersId, ancestorTransform, aParent, next, obscured); // Each layer obscures its previous siblings, so we augment the obscured // region as we loop backwards through the children. nsIntRegion childRegion; if (gfxPrefs::LayoutEventRegionsEnabled()) { - childRegion = EventRegionsFor(child).mHitRegion; + childRegion = child.GetEventRegions().mHitRegion; } else { childRegion = child.GetVisibleRegion(); } childRegion.Transform(gfx::To3DMatrix(child.GetTransform())); if (child.GetClipRect()) { childRegion.AndWith(*child.GetClipRect()); } @@ -526,17 +513,17 @@ APZCTreeManager::UpdatePanZoomController // When we compute the unobscured regions below, we subtract off the // |obscured| region, but it would also be ok to do this before the above // loop. At that point |obscured| would only have the uncles' hit regions // and not the children. The reason this is ok is again because of the way // we do hit-testing (where the deepest APZC is used) it doesn't matter if // we count the children as obscuring the parent or not. EventRegions unobscured; - unobscured.Sub(EventRegionsFor(aLayer), obscured); + unobscured.Sub(aLayer.GetEventRegions(), obscured); APZCTM_LOG("Picking up unobscured hit region %s from layer %p\n", Stringify(unobscured).c_str(), aLayer.GetLayer()); // Take the hit region of the |aLayer|'s subtree (which has already been // transformed into the coordinate space of |aLayer|) and... EventRegions subtreeEventRegions = aState.mEventRegions.LastElement(); aState.mEventRegions.RemoveElementAt(aState.mEventRegions.Length() - 1); // ... combine it with the hit region for this layer, and then ... subtreeEventRegions.OrWith(unobscured);
--- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -2885,16 +2885,22 @@ nsDisplayLayerEventRegions::AddFrame(nsD } else { mHitRegion.Or(mHitRegion, borderBox); } if (aBuilder->GetAncestorHasTouchEventHandler()) { mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, borderBox); } } +void +nsDisplayLayerEventRegions::AddInactiveScrollPort(const nsRect& aRect) +{ + mDispatchToContentHitRegion.Or(mDispatchToContentHitRegion, aRect); +} + nsDisplayCaret::nsDisplayCaret(nsDisplayListBuilder* aBuilder, nsIFrame* aCaretFrame) : nsDisplayItem(aBuilder, aCaretFrame) , mCaret(aBuilder->GetCaret()) , mBounds(aBuilder->GetCaretRect() + ToReferenceFrame()) { MOZ_COUNT_CTOR(nsDisplayCaret); }
--- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -2578,16 +2578,21 @@ public: } NS_DISPLAY_DECL_NAME("LayerEventRegions", TYPE_LAYER_EVENT_REGIONS) // Indicate that aFrame's border-box contributes to the event regions for // this layer. aFrame must have the same reference frame as mFrame. void AddFrame(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame); + // Indicate that an inactive scrollframe's scrollport should be added to the + // dispatch-to-content region, to ensure that APZ lets content create a + // displayport. + void AddInactiveScrollPort(const nsRect& aRect); + const nsRegion& HitRegion() { return mHitRegion; } const nsRegion& MaybeHitRegion() { return mMaybeHitRegion; } const nsRegion& DispatchToContentHitRegion() { return mDispatchToContentHitRegion; } private: // Relative to aFrame's reference frame. // These are the points that are definitely in the hit region. nsRegion mHitRegion;
--- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -2947,16 +2947,27 @@ ScrollFrameHelper::BuildDisplayList(nsDi nsLayoutUtils::WantSubAPZC() && WantAsyncScroll() && // If we are the root scroll frame for the display root then we don't need a scroll // info layer to make a ComputeFrameMetrics call for us as // nsDisplayList::PaintForFrame already calls ComputeFrameMetrics for us. (!mIsRoot || aBuilder->RootReferenceFrame()->PresContext() != mOuter->PresContext()); } + if (aBuilder->IsPaintingToWindow() && + !mShouldBuildScrollableLayer && + shouldBuildLayer) + { + if (nsDisplayLayerEventRegions *eventRegions = aBuilder->GetLayerEventRegions()) { + // Make sure that APZ will dispatch events back to content so we can + // create a displayport for this frame. + eventRegions->AddInactiveScrollPort(mScrollPort + aBuilder->ToReferenceFrame(mOuter)); + } + } + mScrollParentID = aBuilder->GetCurrentScrollParentId(); nsDisplayListCollection scrolledContent; { // Note that setting the current scroll parent id here means that positioned children // of this scroll info layer will pick up the scroll info layer as their scroll handoff // parent. This is intentional because that is what happens for positioned children // of scroll layers, and we want to maintain consistent behaviour between scroll layers