Bug 1013392 - Put APZ scrollbar annotations on the scrollbar thumb. r=roc

This commit is contained in:
Markus Stange 2014-05-28 16:14:43 +02:00
Родитель 75e2e674b2
Коммит 43a4cda619
3 изменённых файлов: 66 добавлений и 20 удалений

Просмотреть файл

@ -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));
}
}