зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1013392 - Put APZ scrollbar annotations on the scrollbar thumb. r=roc
This commit is contained in:
Родитель
75e2e674b2
Коммит
43a4cda619
|
@ -118,6 +118,7 @@ public:
|
|||
typedef mozilla::DisplayListClipState DisplayListClipState;
|
||||
typedef nsIWidget::ThemeGeometry ThemeGeometry;
|
||||
typedef mozilla::layers::Layer Layer;
|
||||
typedef mozilla::layers::FrameMetrics FrameMetrics;
|
||||
typedef mozilla::layers::FrameMetrics::ViewID ViewID;
|
||||
|
||||
/**
|
||||
|
@ -257,6 +258,15 @@ public:
|
|||
* Get the ViewID of the nearest scrolling ancestor frame.
|
||||
*/
|
||||
ViewID GetCurrentScrollParentId() const { return mCurrentScrollParentId; }
|
||||
/**
|
||||
* Get the ViewID and the scrollbar flags corresponding to the scrollbar for
|
||||
* which we are building display items at the moment.
|
||||
*/
|
||||
void GetScrollbarInfo(ViewID* aOutScrollbarTarget, uint32_t* aOutScrollbarFlags)
|
||||
{
|
||||
*aOutScrollbarTarget = mCurrentScrollbarTarget;
|
||||
*aOutScrollbarFlags = mCurrentScrollbarFlags;
|
||||
}
|
||||
/**
|
||||
* Calling this setter makes us include all out-of-flow descendant
|
||||
* frames in the display list, wherever they may be positioned (even
|
||||
|
@ -630,6 +640,29 @@ public:
|
|||
ViewID mOldValue;
|
||||
};
|
||||
|
||||
/**
|
||||
* A helper class to temporarily set the value of mCurrentScrollbarTarget
|
||||
* and mCurrentScrollbarFlags.
|
||||
*/
|
||||
class AutoCurrentScrollbarInfoSetter;
|
||||
friend class AutoCurrentScrollbarInfoSetter;
|
||||
class AutoCurrentScrollbarInfoSetter {
|
||||
public:
|
||||
AutoCurrentScrollbarInfoSetter(nsDisplayListBuilder* aBuilder, ViewID aScrollTargetID,
|
||||
uint32_t aScrollbarFlags)
|
||||
: mBuilder(aBuilder) {
|
||||
aBuilder->mCurrentScrollbarTarget = aScrollTargetID;
|
||||
aBuilder->mCurrentScrollbarFlags = aScrollbarFlags;
|
||||
}
|
||||
~AutoCurrentScrollbarInfoSetter() {
|
||||
// No need to restore old values because scrollbars cannot be nested.
|
||||
mBuilder->mCurrentScrollbarTarget = FrameMetrics::NULL_SCROLL_ID;
|
||||
mBuilder->mCurrentScrollbarFlags = 0;
|
||||
}
|
||||
private:
|
||||
nsDisplayListBuilder* mBuilder;
|
||||
};
|
||||
|
||||
// Helpers for tables
|
||||
nsDisplayTableItem* GetCurrentTableItem() { return mCurrentTableItem; }
|
||||
void SetCurrentTableItem(nsDisplayTableItem* aTableItem) { mCurrentTableItem = aTableItem; }
|
||||
|
@ -741,6 +774,8 @@ private:
|
|||
nsTArray<DisplayItemClip*> mDisplayItemClipsToDestroy;
|
||||
Mode mMode;
|
||||
ViewID mCurrentScrollParentId;
|
||||
ViewID mCurrentScrollbarTarget;
|
||||
uint32_t mCurrentScrollbarFlags;
|
||||
BlendModeSet mContainedBlendModes;
|
||||
bool mBuildCaret;
|
||||
bool mIgnoreSuppression;
|
||||
|
|
|
@ -2134,15 +2134,13 @@ MaxZIndexInList(nsDisplayList* aList, nsDisplayListBuilder* aBuilder)
|
|||
static void
|
||||
AppendToTop(nsDisplayListBuilder* aBuilder, const nsDisplayListSet& aLists,
|
||||
nsDisplayList* aSource, nsIFrame* aSourceFrame, bool aOwnLayer,
|
||||
uint32_t aFlags, mozilla::layers::FrameMetrics::ViewID aScrollTargetId,
|
||||
bool aPositioned)
|
||||
{
|
||||
if (aSource->IsEmpty())
|
||||
return;
|
||||
|
||||
nsDisplayWrapList* newItem = aOwnLayer?
|
||||
new (aBuilder) nsDisplayOwnLayer(aBuilder, aSourceFrame, aSource,
|
||||
aFlags, aScrollTargetId) :
|
||||
new (aBuilder) nsDisplayOwnLayer(aBuilder, aSourceFrame, aSource) :
|
||||
new (aBuilder) nsDisplayWrapList(aBuilder, aSourceFrame, aSource);
|
||||
|
||||
if (aPositioned) {
|
||||
|
@ -2211,11 +2209,6 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
|
|||
scrollParts.Sort(HoveredStateComparator());
|
||||
|
||||
for (uint32_t i = 0; i < scrollParts.Length(); ++i) {
|
||||
nsDisplayListCollection partList;
|
||||
mOuter->BuildDisplayListForChild(
|
||||
aBuilder, scrollParts[i], aDirtyRect, partList,
|
||||
nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
|
||||
|
||||
uint32_t flags = 0;
|
||||
if (scrollParts[i] == mVScrollbarBox) {
|
||||
flags |= nsDisplayOwnLayer::VERTICAL_SCROLLBAR;
|
||||
|
@ -2224,11 +2217,18 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
|
|||
flags |= nsDisplayOwnLayer::HORIZONTAL_SCROLLBAR;
|
||||
}
|
||||
|
||||
nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter
|
||||
infoSetter(aBuilder, scrollTargetId, flags);
|
||||
nsDisplayListCollection partList;
|
||||
mOuter->BuildDisplayListForChild(
|
||||
aBuilder, scrollParts[i], aDirtyRect, partList,
|
||||
nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT);
|
||||
|
||||
// DISPLAY_CHILD_FORCE_STACKING_CONTEXT put everything into
|
||||
// partList.PositionedDescendants().
|
||||
::AppendToTop(aBuilder, aLists,
|
||||
partList.PositionedDescendants(), scrollParts[i],
|
||||
aCreateLayer, flags, scrollTargetId, aPositioned);
|
||||
aCreateLayer, aPositioned);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1308,14 +1308,24 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|||
const nsRect& aDirtyRect,
|
||||
const nsDisplayListSet& aLists)
|
||||
{
|
||||
// forcelayer is only supported on XUL elements with box layout
|
||||
bool forceLayer =
|
||||
GetContent()->HasAttr(kNameSpaceID_None, nsGkAtoms::layer) &&
|
||||
GetContent()->IsXUL();
|
||||
bool forceLayer = false;
|
||||
uint32_t flags = 0;
|
||||
mozilla::layers::FrameMetrics::ViewID scrollTargetId =
|
||||
mozilla::layers::FrameMetrics::NULL_SCROLL_ID;
|
||||
|
||||
if (GetContent()->IsXUL()) {
|
||||
// forcelayer is only supported on XUL elements with box layout
|
||||
if (GetContent()->HasAttr(kNameSpaceID_None, nsGkAtoms::layer)) {
|
||||
forceLayer = true;
|
||||
} else {
|
||||
nsIFrame* parent = GetParentBox(this);
|
||||
if (parent && parent->GetType() == nsGkAtoms::sliderFrame) {
|
||||
forceLayer = true;
|
||||
aBuilder->GetScrollbarInfo(&scrollTargetId, &flags);
|
||||
}
|
||||
}
|
||||
// Check for frames that are marked as a part of the region used
|
||||
// in calculating glass margins on Windows.
|
||||
if (GetContent()->IsXUL()) {
|
||||
const nsStyleDisplay* styles = StyleDisplay();
|
||||
if (styles && styles->mAppearance == NS_THEME_WIN_EXCLUDE_GLASS) {
|
||||
nsRect rect = nsRect(aBuilder->ToReferenceFrame(this), GetSize());
|
||||
|
@ -1355,9 +1365,10 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|||
masterList.AppendToTop(tempLists.Content());
|
||||
masterList.AppendToTop(tempLists.PositionedDescendants());
|
||||
masterList.AppendToTop(tempLists.Outlines());
|
||||
|
||||
// Wrap the list to make it its own layer
|
||||
aLists.Content()->AppendNewToTop(new (aBuilder)
|
||||
nsDisplayOwnLayer(aBuilder, this, &masterList));
|
||||
nsDisplayOwnLayer(aBuilder, this, &masterList, flags, scrollTargetId));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче