The bounds of the scroll port match what will actually be drawn on the screen.
The bounds of the contained content (sized to the display port) are still accessible via mList.GetBounds, and similarly the visible rect of the contained content is mList.GetVisibleRect. The external bounds/visible rect are GetBounds and GetVisibleRect on the nsDisplayScrollLayer object itself.
We implement nsDisplayScrollInfoLayer::GetBounds solely so that it continues to return an empty rect because we expect active empty layers to have empty visible rects.
We no longer have to set our mVisibleRect in nsDisplayScrollLayer::ComputeVisibility because nsDisplayList::ComputeVisibilityForSublist now does it correctly for us (like other items).
We also have to teach ContainerState::ProcessDisplayItems to not set the visible region for scroll layers because it has the external visible region, not the larger internal display port sized visible region. We instead let BuildContainerLayer set the visible region of the layer.
APZC information is associated with layers, and having those layers suddenly
disappear because they became occluded, or their displayports are off-screen
has undesired effects.
This adds a new eCSSUnit_SharedList type for nsCSSValue, which is a
reference counted object that contains an nsCSSValueList. We need this
so that nsStyleDisplay::mSpecifiedTransform can hold a strong reference
to a specified transform list value. When 'transform' is specified
using a variable reference, the resulting nsCSSValue does not stick
around in the Declaration object, so we wouldn't be guaranteed that
it lives long enough for nsStyleDisplay to keep referencing it.
The scroll layer item has the clip induced by the scroll frame, but the scrolled items are only clipped to the (larger) display port so we can async scroll the display port area. But if we can't merge all the scroll layer items then we can't render the expanded display port content so we have to clip the scrolled items to the scroll frame by propagating the clip on the scroll layer item to its children.
Previously the code would only set the resolution on the FrameMetrics when
the scroll ID was equal to ROOT_SCROLL_ID. This only happens on the root
scrollable frame for a layer tree. However, with bug 732971 fixed, any presShell
can have a resolution associated with it, so we need to populate the mResolution
for any layer that is the root scrollable layer for a presShell.
On platforms like Fennec and Metro the content presShell is a sub-presShell
of the root presShell. The resolution is set on the content presShell, but would
not get populated on the FrameMetrics correctly because of this condition. The #ifdef
ANDROID hack a few lines below was used to work around this on Fennec but it
was broken on Metro. This change corrects the behaviour on both of these platforms.
The new nsDisplayResolution layer type is created for any subdocument whose
presShell specifies a non-1.0 resolution. This is specifically needed for
platforms such as Android and Metro, where the presShells corresponding to
the tabs (which have non-1.0 resolutions) are not the root presShell.
This is to avoid having to #include FrameLayerBuilder.h in nsLayoutUtils.h in the next patch.
--HG--
extra : rebase_source : 5f3c3ae2785267949766ae094414781133d4ce44
I never liked nsDisplayListBuilder::IsFixedItem anyway, its behavior and
naming was confusing. Also, it assumed there's only one viewport displayport,
on the rootmost document, and that's a bad assumption in general.
We're able to remove calls to ForceVisiblityForFixedItem because FrameLayerBuilder
is now responsible for inflating the visible region of the fixed-pos layers.
--HG--
extra : rebase_source : e93d8e25d2f5c7f3e167e47203d961e6b4293b81