Bug 1261754 - Part 7: Move pointer-events from nsStyleVisibility to nsStyleUserInterface. r=dholbert
MozReview-Commit-ID: DgUV10sxvHL
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -1920,17 +1920,17 @@ GetMouseThrough(const nsIFrame* aFrame)
static bool
IsFrameReceivingPointerEvents(nsIFrame* aFrame)
{
nsSubDocumentFrame* frame = do_QueryFrame(aFrame);
if (frame && frame->PassPointerEventsToChildren()) {
return true;
}
return NS_STYLE_POINTER_EVENTS_NONE !=
- aFrame->StyleVisibility()->GetEffectivePointerEvents(aFrame);
+ aFrame->StyleUserInterface()->GetEffectivePointerEvents(aFrame);
}
// A list of frames, and their z depth. Used for sorting
// the results of hit testing.
struct FramesWithDepth
{
explicit FramesWithDepth(float aDepth) :
mDepth(aDepth)
@@ -3458,17 +3458,18 @@ nsDisplayLayerEventRegions::AddFrame(nsD
}
if (!aFrame->GetParent()) {
MOZ_ASSERT(aFrame->GetType() == nsGkAtoms::viewportFrame);
// Viewport frames are never event targets, other frames, like canvas frames,
// are the event targets for any regions viewport frames may cover.
return;
}
- uint8_t pointerEvents = aFrame->StyleVisibility()->GetEffectivePointerEvents(aFrame);
+ uint8_t pointerEvents =
+ aFrame->StyleUserInterface()->GetEffectivePointerEvents(aFrame);
if (pointerEvents == NS_STYLE_POINTER_EVENTS_NONE) {
return;
}
bool simpleRegions = aFrame->HasAnyStateBits(NS_FRAME_SIMPLE_EVENT_REGIONS);
if (!simpleRegions) {
if (!aFrame->StyleVisibility()->IsVisible()) {
return;
}
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -2143,18 +2143,20 @@ nsIFrame::BuildDisplayListForStackingCon
if (IsFrameOfType(eReplaced) && !IsVisibleForPainting(aBuilder))
return;
const nsStyleDisplay* disp = StyleDisplay();
// We can stop right away if this is a zero-opacity stacking context and
// we're painting, and we're not animating opacity. Don't do this
// if we're going to compute plugin geometry, since opacity-0 plugins
// need to have display items built for them.
- bool needEventRegions = aBuilder->IsBuildingLayerEventRegions() &&
- StyleVisibility()->GetEffectivePointerEvents(this) != NS_STYLE_POINTER_EVENTS_NONE;
+ bool needEventRegions =
+ aBuilder->IsBuildingLayerEventRegions() &&
+ StyleUserInterface()->GetEffectivePointerEvents(this) !=
+ NS_STYLE_POINTER_EVENTS_NONE;
bool opacityItemForEventsOnly = false;
if (disp->mOpacity == 0.0 && aBuilder->IsForPainting() &&
!aBuilder->WillComputePluginGeometry() &&
!(disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_OPACITY) &&
!nsLayoutUtils::HasCurrentAnimationOfProperty(this,
eCSSProperty_opacity)) {
if (needEventRegions) {
opacityItemForEventsOnly = true;
--- a/layout/generic/nsSubDocumentFrame.cpp
+++ b/layout/generic/nsSubDocumentFrame.cpp
@@ -347,17 +347,18 @@ nsSubDocumentFrame::BuildDisplayList(nsD
nsFrameLoader* frameLoader = FrameLoader();
RenderFrameParent* rfp = nullptr;
if (frameLoader) {
rfp = frameLoader->GetCurrentRenderFrame();
}
// If we are pointer-events:none then we don't need to HitTest background
- bool pointerEventsNone = StyleVisibility()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE;
+ bool pointerEventsNone =
+ StyleUserInterface()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE;
if (!aBuilder->IsForEventDelivery() || !pointerEventsNone) {
nsDisplayListCollection decorations;
DisplayBorderBackgroundOutline(aBuilder, decorations);
if (rfp) {
// Wrap background colors of <iframe>s with remote subdocuments in their
// own layer so we generate a ColorLayer. This is helpful for optimizing
// compositing; we can skip compositing the ColorLayer when the
// remote content is opaque.
--- a/layout/ipc/RenderFrameParent.cpp
+++ b/layout/ipc/RenderFrameParent.cpp
@@ -333,18 +333,20 @@ RenderFrameParent::RecvTakeFocusForClick
nsDisplayRemote::nsDisplayRemote(nsDisplayListBuilder* aBuilder,
nsSubDocumentFrame* aFrame,
RenderFrameParent* aRemoteFrame)
: nsDisplayItem(aBuilder, aFrame)
, mRemoteFrame(aRemoteFrame)
, mEventRegionsOverride(EventRegionsOverride::NoOverride)
{
if (aBuilder->IsBuildingLayerEventRegions()) {
- bool frameIsPointerEventsNone = !aFrame->PassPointerEventsToChildren()
- && (aFrame->StyleVisibility()->GetEffectivePointerEvents(aFrame) == NS_STYLE_POINTER_EVENTS_NONE);
+ bool frameIsPointerEventsNone =
+ !aFrame->PassPointerEventsToChildren() &&
+ aFrame->StyleUserInterface()->GetEffectivePointerEvents(aFrame) ==
+ NS_STYLE_POINTER_EVENTS_NONE;
if (aBuilder->IsInsidePointerEventsNoneDoc() || frameIsPointerEventsNone) {
mEventRegionsOverride |= EventRegionsOverride::ForceEmptyHitRegion;
}
if (nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(aFrame->PresContext()->PresShell())) {
mEventRegionsOverride |= EventRegionsOverride::ForceDispatchToContent;
}
}
}
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -3031,26 +3031,26 @@ CSS_PROP_SVG(
paint_order,
PaintOrder,
CSS_PROPERTY_PARSE_FUNCTION,
"svg.paint-order.enabled",
0,
nullptr,
CSS_PROP_NO_OFFSET,
eStyleAnimType_None)
-CSS_PROP_VISIBILITY(
+CSS_PROP_USERINTERFACE(
pointer-events,
pointer_events,
PointerEvents,
CSS_PROPERTY_PARSE_VALUE |
CSS_PROPERTY_APPLIES_TO_PLACEHOLDER,
"",
VARIANT_HK,
kPointerEventsKTable,
- offsetof(nsStyleVisibility, mPointerEvents),
+ offsetof(nsStyleUserInterface, mPointerEvents),
eStyleAnimType_EnumU8)
CSS_PROP_DISPLAY(
position,
position,
Position,
CSS_PROPERTY_PARSE_VALUE |
// For position: sticky/fixed
CSS_PROPERTY_CREATES_STACKING_CONTEXT |
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -3932,17 +3932,17 @@ nsComputedDOMStyle::DoGetWebkitTextFillC
return val.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetPointerEvents()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(
- nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mPointerEvents,
+ nsCSSProps::ValueToKeywordEnum(StyleUserInterface()->mPointerEvents,
nsCSSProps::kPointerEventsKTable));
return val.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetVisibility()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -4952,16 +4952,23 @@ nsRuleNode::ComputeUserInterfaceData(voi
// user-focus: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForUserFocus(),
ui->mUserFocus, conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentUI->mUserFocus,
NS_STYLE_USER_FOCUS_NONE, 0, 0, 0, 0);
+ // pointer-events: enum, inherit, initial
+ SetDiscrete(*aRuleData->ValueForPointerEvents(), ui->mPointerEvents,
+ conditions,
+ SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
+ parentUI->mPointerEvents,
+ NS_STYLE_POINTER_EVENTS_AUTO, 0, 0, 0, 0);
+
COMPUTE_END_INHERITED(UserInterface, ui)
}
const void*
nsRuleNode::ComputeUIResetData(void* aStartStruct,
const nsRuleData* aRuleData,
nsStyleContext* aContext,
nsRuleNode* aHighestNode,
@@ -6389,23 +6396,16 @@ nsRuleNode::ComputeVisibilityData(void*
// visibility: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForVisibility(), visibility->mVisible,
conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentVisibility->mVisible,
NS_STYLE_VISIBILITY_VISIBLE, 0, 0, 0, 0);
- // pointer-events: enum, inherit, initial
- SetDiscrete(*aRuleData->ValueForPointerEvents(), visibility->mPointerEvents,
- conditions,
- SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
- parentVisibility->mPointerEvents,
- NS_STYLE_POINTER_EVENTS_AUTO, 0, 0, 0, 0);
-
// image-rendering: enum, inherit
SetDiscrete(*aRuleData->ValueForImageRendering(),
visibility->mImageRendering, conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INHERIT,
parentVisibility->mImageRendering,
NS_STYLE_IMAGE_RENDERING_AUTO, 0, 0, 0, 0);
// writing-mode: enum, inherit, initial
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3250,30 +3250,28 @@ nsStyleVisibility::nsStyleVisibility(Sty
MOZ_COUNT_CTOR(nsStyleVisibility);
uint32_t bidiOptions = aContext.GetBidi();
if (GET_BIDI_OPTION_DIRECTION(bidiOptions) == IBMBIDI_TEXTDIRECTION_RTL)
mDirection = NS_STYLE_DIRECTION_RTL;
else
mDirection = NS_STYLE_DIRECTION_LTR;
mVisible = NS_STYLE_VISIBILITY_VISIBLE;
- mPointerEvents = NS_STYLE_POINTER_EVENTS_AUTO;
mImageRendering = NS_STYLE_IMAGE_RENDERING_AUTO;
mWritingMode = NS_STYLE_WRITING_MODE_HORIZONTAL_TB;
mTextOrientation = NS_STYLE_TEXT_ORIENTATION_MIXED;
mColorAdjust = NS_STYLE_COLOR_ADJUST_ECONOMY;
}
nsStyleVisibility::nsStyleVisibility(const nsStyleVisibility& aSource)
{
MOZ_COUNT_CTOR(nsStyleVisibility);
mImageOrientation = aSource.mImageOrientation;
mDirection = aSource.mDirection;
mVisible = aSource.mVisible;
- mPointerEvents = aSource.mPointerEvents;
mImageRendering = aSource.mImageRendering;
mWritingMode = aSource.mWritingMode;
mTextOrientation = aSource.mTextOrientation;
mColorAdjust = aSource.mColorAdjust;
}
nsChangeHint nsStyleVisibility::CalcDifference(const nsStyleVisibility& aOther) const
{
@@ -3295,23 +3293,16 @@ nsChangeHint nsStyleVisibility::CalcDiff
NS_UpdateHint(hint, NS_STYLE_HINT_REFLOW);
} else {
NS_UpdateHint(hint, NS_STYLE_HINT_VISUAL);
}
}
if (mTextOrientation != aOther.mTextOrientation) {
NS_UpdateHint(hint, NS_STYLE_HINT_REFLOW);
}
- if (mPointerEvents != aOther.mPointerEvents) {
- // nsSVGPathGeometryFrame's mRect depends on stroke _and_ on the value
- // of pointer-events. See nsSVGPathGeometryFrame::ReflowSVG's use of
- // GetHitTestFlags. (Only a reflow, no visual change.)
- NS_UpdateHint(hint, nsChangeHint_NeedReflow);
- NS_UpdateHint(hint, nsChangeHint_NeedDirtyReflow); // XXX remove me: bug 876085
- }
if (mImageRendering != aOther.mImageRendering) {
hint |= nsChangeHint_RepaintFrame;
}
if (mColorAdjust != aOther.mColorAdjust) {
// color-adjust only affects media where dynamic changes can't happen.
NS_UpdateHint(hint, nsChangeHint_NeutralChange);
}
}
@@ -3866,27 +3857,29 @@ nsCursorImage::operator=(const nsCursorI
}
nsStyleUserInterface::nsStyleUserInterface(StyleStructContext aContext)
{
MOZ_COUNT_CTOR(nsStyleUserInterface);
mUserInput = NS_STYLE_USER_INPUT_AUTO;
mUserModify = NS_STYLE_USER_MODIFY_READ_ONLY;
mUserFocus = NS_STYLE_USER_FOCUS_NONE;
+ mPointerEvents = NS_STYLE_POINTER_EVENTS_AUTO;
mCursor = NS_STYLE_CURSOR_AUTO; // fix for bugzilla bug 51113
mCursorArrayLength = 0;
mCursorArray = nullptr;
}
nsStyleUserInterface::nsStyleUserInterface(const nsStyleUserInterface& aSource) :
mUserInput(aSource.mUserInput),
mUserModify(aSource.mUserModify),
mUserFocus(aSource.mUserFocus),
+ mPointerEvents(aSource.mPointerEvents),
mCursor(aSource.mCursor)
{
MOZ_COUNT_CTOR(nsStyleUserInterface);
CopyCursorArrayFrom(aSource);
}
nsStyleUserInterface::~nsStyleUserInterface(void)
{
@@ -3900,16 +3893,24 @@ nsChangeHint nsStyleUserInterface::CalcD
if (mCursor != aOther.mCursor)
NS_UpdateHint(hint, nsChangeHint_UpdateCursor);
// We could do better. But it wouldn't be worth it, URL-specified cursors are
// rare.
if (mCursorArrayLength > 0 || aOther.mCursorArrayLength > 0)
NS_UpdateHint(hint, nsChangeHint_UpdateCursor);
+ if (mPointerEvents != aOther.mPointerEvents) {
+ // nsSVGPathGeometryFrame's mRect depends on stroke _and_ on the value
+ // of pointer-events. See nsSVGPathGeometryFrame::ReflowSVG's use of
+ // GetHitTestFlags. (Only a reflow, no visual change.)
+ hint |= nsChangeHint_NeedReflow |
+ nsChangeHint_NeedDirtyReflow; // XXX remove me: bug 876085
+ }
+
if (mUserModify != aOther.mUserModify)
NS_UpdateHint(hint, NS_STYLE_HINT_VISUAL);
if (mUserInput != aOther.mUserInput) {
if (NS_STYLE_USER_INPUT_NONE == mUserInput ||
NS_STYLE_USER_INPUT_NONE == aOther.mUserInput) {
NS_UpdateHint(hint, NS_STYLE_HINT_FRAMECHANGE);
} else {
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2171,32 +2171,29 @@ struct nsStyleVisibility
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
nsStyleImageOrientation mImageOrientation; // [inherited]
uint8_t mDirection; // [inherited] see nsStyleConsts.h NS_STYLE_DIRECTION_*
uint8_t mVisible; // [inherited]
- uint8_t mPointerEvents; // [inherited] see nsStyleConsts.h
uint8_t mImageRendering; // [inherited] see nsStyleConsts.h
uint8_t mWritingMode; // [inherited] see nsStyleConsts.h
uint8_t mTextOrientation; // [inherited] see nsStyleConsts.h
uint8_t mColorAdjust; // [inherited] see nsStyleConsts.h
bool IsVisible() const {
return (mVisible == NS_STYLE_VISIBILITY_VISIBLE);
}
bool IsVisibleOrCollapsed() const {
return ((mVisible == NS_STYLE_VISIBILITY_VISIBLE) ||
(mVisible == NS_STYLE_VISIBILITY_COLLAPSE));
}
-
- inline uint8_t GetEffectivePointerEvents(nsIFrame* aFrame) const;
};
struct nsTimingFunction
{
enum class Type {
Ease, // ease
Linear, // linear
@@ -3042,28 +3039,31 @@ struct nsStyleUserInterface
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
uint8_t mUserInput; // [inherited]
uint8_t mUserModify; // [inherited] (modify-content)
uint8_t mUserFocus; // [inherited] (auto-select)
+ uint8_t mPointerEvents; // [inherited] see nsStyleConsts.h
uint8_t mCursor; // [inherited] See nsStyleConsts.h
uint32_t mCursorArrayLength;
nsCursorImage *mCursorArray;// [inherited] The specified URL values
// and coordinates. Takes precedence over
// mCursor. Zero-length array is represented
// by null pointer.
// Does not free mCursorArray; the caller is responsible for calling
// |delete [] mCursorArray| first if it is needed.
void CopyCursorArrayFrom(const nsStyleUserInterface& aSource);
+
+ inline uint8_t GetEffectivePointerEvents(nsIFrame* aFrame) const;
};
struct nsStyleXUL
{
explicit nsStyleXUL(StyleStructContext aContext);
nsStyleXUL(const nsStyleXUL& aSource);
~nsStyleXUL();
--- a/layout/style/nsStyleStructInlines.h
+++ b/layout/style/nsStyleStructInlines.h
@@ -171,24 +171,24 @@ nsStyleDisplay::IsRelativelyPositioned(c
bool
nsStyleDisplay::IsAbsolutelyPositioned(const nsIFrame* aContextFrame) const
{
NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame");
return IsAbsolutelyPositionedStyle() && !aContextFrame->IsSVGText();
}
uint8_t
-nsStyleVisibility::GetEffectivePointerEvents(nsIFrame* aFrame) const
+nsStyleUserInterface::GetEffectivePointerEvents(nsIFrame* aFrame) const
{
if (aFrame->GetContent() && !aFrame->GetContent()->GetParent()) {
// The root element has a cluster of frames associated with it
// (root scroll frame, canvas frame, the actual primary frame). Make
// those take their pointer-events value from the root element's primary
// frame.
nsIFrame* f = aFrame->GetContent()->GetPrimaryFrame();
if (f) {
- return f->StyleVisibility()->mPointerEvents;
+ return f->StyleUserInterface()->mPointerEvents;
}
}
return mPointerEvents;
}
#endif /* !defined(nsStyleStructInlines_h_) */
--- a/layout/svg/nsSVGImageFrame.cpp
+++ b/layout/svg/nsSVGImageFrame.cpp
@@ -580,17 +580,17 @@ nsSVGImageFrame::ReflowCallbackCanceled(
mReflowCallbackPosted = false;
}
uint16_t
nsSVGImageFrame::GetHitTestFlags()
{
uint16_t flags = 0;
- switch(StyleVisibility()->mPointerEvents) {
+ switch (StyleUserInterface()->mPointerEvents) {
case NS_STYLE_POINTER_EVENTS_NONE:
break;
case NS_STYLE_POINTER_EVENTS_VISIBLEPAINTED:
case NS_STYLE_POINTER_EVENTS_AUTO:
if (StyleVisibility()->IsVisible()) {
/* XXX: should check pixel transparency */
flags |= SVG_HIT_TEST_FILL;
}
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -1591,17 +1591,17 @@ nsSVGUtils::SetupCairoStrokeGeometry(nsI
}
}
uint16_t
nsSVGUtils::GetGeometryHitTestFlags(nsIFrame* aFrame)
{
uint16_t flags = 0;
- switch(aFrame->StyleVisibility()->mPointerEvents) {
+ switch (aFrame->StyleUserInterface()->mPointerEvents) {
case NS_STYLE_POINTER_EVENTS_NONE:
break;
case NS_STYLE_POINTER_EVENTS_AUTO:
case NS_STYLE_POINTER_EVENTS_VISIBLEPAINTED:
if (aFrame->StyleVisibility()->IsVisible()) {
if (aFrame->StyleSVG()->mFill.mType != eStyleSVGPaintType_None)
flags |= SVG_HIT_TEST_FILL;
if (aFrame->StyleSVG()->mStroke.mType != eStyleSVGPaintType_None)