--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -1242,18 +1242,17 @@ void
nsCSSRendering::PaintBoxShadowOuter(nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
nsIFrame* aForFrame,
const nsRect& aFrameArea,
const nsRect& aDirtyRect,
float aOpacity)
{
DrawTarget& aDrawTarget = *aRenderingContext.GetDrawTarget();
- const nsStyleBorder* styleBorder = aForFrame->StyleBorder();
- nsCSSShadowArray* shadows = styleBorder->mBoxShadow;
+ nsCSSShadowArray* shadows = aForFrame->StyleEffects()->mBoxShadow;
if (!shadows)
return;
bool hasBorderRadius;
bool nativeTheme; // mutually exclusive with hasBorderRadius
const nsStyleDisplay* styleDisplay = aForFrame->StyleDisplay();
nsITheme::Transparency transparency;
if (aForFrame->IsThemed(styleDisplay, &transparency)) {
@@ -1479,18 +1478,17 @@ nsCSSRendering::PaintBoxShadowOuter(nsPr
}
void
nsCSSRendering::PaintBoxShadowInner(nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
nsIFrame* aForFrame,
const nsRect& aFrameArea)
{
- const nsStyleBorder* styleBorder = aForFrame->StyleBorder();
- nsCSSShadowArray* shadows = styleBorder->mBoxShadow;
+ nsCSSShadowArray* shadows = aForFrame->StyleEffects()->mBoxShadow;
if (!shadows)
return;
if (aForFrame->IsThemed() && aForFrame->GetContent() &&
!nsContentUtils::IsChromeDoc(aForFrame->GetContent()->GetCurrentDoc())) {
// There's no way of getting hold of a shape corresponding to a
// "padding-box" for native-themed widgets, so just don't draw
// inner box-shadows for them. But we allow chrome to paint inner
// box shadows since chrome can be aware of the platform theme.
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -2414,18 +2414,19 @@ nsDisplayBackgroundImage::AppendBackgrou
if (!nsCSSRendering::IsCanvasFrame(aFrame) && bg) {
bool drawBackgroundImage;
color =
nsCSSRendering::DetermineBackgroundColor(presContext, bgSC, aFrame,
drawBackgroundImage, drawBackgroundColor);
}
const nsStyleBorder* borderStyle = aFrame->StyleBorder();
- bool hasInsetShadow = borderStyle->mBoxShadow &&
- borderStyle->mBoxShadow->HasShadowWithInset(true);
+ const nsStyleEffects* effectsStyle = aFrame->StyleEffects();
+ bool hasInsetShadow = effectsStyle->mBoxShadow &&
+ effectsStyle->mBoxShadow->HasShadowWithInset(true);
bool willPaintBorder = !isThemed && !hasInsetShadow &&
borderStyle->HasBorder();
nsPoint toRef = aBuilder->ToReferenceFrame(aFrame);
// An auxiliary list is necessary in case we have background blending; if that
// is the case, background items need to be wrapped by a blend container to
// isolate blending to the background
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -8036,17 +8036,17 @@ nsLayoutUtils::FontSizeInflationEnabled(
return presShell->FontSizeInflationEnabled();
}
/* static */ nsRect
nsLayoutUtils::GetBoxShadowRectForFrame(nsIFrame* aFrame,
const nsSize& aFrameSize)
{
- nsCSSShadowArray* boxShadows = aFrame->StyleBorder()->mBoxShadow;
+ nsCSSShadowArray* boxShadows = aFrame->StyleEffects()->mBoxShadow;
if (!boxShadows) {
return nsRect();
}
bool nativeTheme;
const nsStyleDisplay* styleDisplay = aFrame->StyleDisplay();
nsITheme::Transparency transparency;
if (aFrame->IsThemed(styleDisplay, &transparency)) {
--- a/layout/forms/nsButtonFrameRenderer.cpp
+++ b/layout/forms/nsButtonFrameRenderer.cpp
@@ -254,17 +254,17 @@ void nsDisplayButtonForeground::Paint(ns
}
}
nsresult
nsButtonFrameRenderer::DisplayButton(nsDisplayListBuilder* aBuilder,
nsDisplayList* aBackground,
nsDisplayList* aForeground)
{
- if (mFrame->StyleBorder()->mBoxShadow) {
+ if (mFrame->StyleEffects()->mBoxShadow) {
aBackground->AppendNewToTop(new (aBuilder)
nsDisplayButtonBoxShadowOuter(aBuilder, this));
}
// Almost all buttons draw some kind of background so there's not much
// point in checking whether we should create this item.
aBackground->AppendNewToTop(new (aBuilder)
nsDisplayButtonBorderBackground(aBuilder, this));
--- a/layout/forms/nsFieldSetFrame.cpp
+++ b/layout/forms/nsFieldSetFrame.cpp
@@ -161,17 +161,17 @@ nsFieldSetFrame::BuildDisplayList(nsDisp
const nsRect& aDirtyRect,
const nsDisplayListSet& aLists) {
// Paint our background and border in a special way.
// REVIEW: We don't really need to check frame emptiness here; if it's empty,
// the background/border display item won't do anything, and if it isn't empty,
// we need to paint the outline
if (!(GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER) &&
IsVisibleForPainting(aBuilder)) {
- if (StyleBorder()->mBoxShadow) {
+ if (StyleEffects()->mBoxShadow) {
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayBoxShadowOuter(aBuilder, this));
}
// don't bother checking to see if we really have a border or background.
// we usually will have a border.
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayFieldSetBorderBackground(aBuilder, this));
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1855,17 +1855,17 @@ nsFrame::DisplayBorderBackgroundOutline(
bool aForceBackground)
{
// The visibility check belongs here since child elements have the
// opportunity to override the visibility property and display even if
// their parent is hidden.
if (!IsVisibleForPainting(aBuilder))
return;
- nsCSSShadowArray* shadows = StyleBorder()->mBoxShadow;
+ nsCSSShadowArray* shadows = StyleEffects()->mBoxShadow;
if (shadows && shadows->HasShadowWithInset(false)) {
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
nsDisplayBoxShadowOuter(aBuilder, this));
}
bool bgIsThemed = DisplayBackgroundUnconditional(aBuilder, aLists,
aForceBackground);
--- a/layout/style/generate-stylestructlist.py
+++ b/layout/style/generate-stylestructlist.py
@@ -43,16 +43,17 @@ STYLE_STRUCTS = [("INHERITED",) + x for
("Table", "nullptr", NORMAL_DEP),
("Margin", "nullptr", NORMAL_DEP + LENGTH_DEP),
("Padding", "nullptr", NORMAL_DEP + LENGTH_DEP),
("Border", "nullptr", NORMAL_DEP + LENGTH_DEP + COLOR_DEP),
("Outline", "nullptr", NORMAL_DEP + LENGTH_DEP + COLOR_DEP),
("XUL", "nullptr", NORMAL_DEP),
("SVGReset", "nullptr", NORMAL_DEP + LENGTH_DEP + COLOR_DEP),
("Column", "nullptr", NORMAL_DEP + LENGTH_DEP + COLOR_DEP),
+ ("Effects", "nullptr", NORMAL_DEP + LENGTH_DEP + COLOR_DEP),
]]
# ---- Generate nsStyleStructList.h ----
count = len(STYLE_STRUCTS)
# Check for problems with style struct dependencies
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -151,16 +151,17 @@
#define CSS_PROP_PADDING(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Padding, stylestructoffset_, animtype_)
#define CSS_PROP_BORDER(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Border, stylestructoffset_, animtype_)
#define CSS_PROP_OUTLINE(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Outline, stylestructoffset_, animtype_)
#define CSS_PROP_XUL(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, XUL, stylestructoffset_, animtype_)
#define CSS_PROP_COLUMN(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Column, stylestructoffset_, animtype_)
#define CSS_PROP_SVG(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, SVG, stylestructoffset_, animtype_)
#define CSS_PROP_SVGRESET(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, SVGReset, stylestructoffset_, animtype_)
#define CSS_PROP_VARIABLES(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Variables, stylestructoffset_, animtype_)
+#define CSS_PROP_EFFECTS(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, Effects, stylestructoffset_, animtype_)
// And similarly for logical properties. An includer can define
// CSS_PROP_LOGICAL to capture all logical properties, but otherwise they
// are included in CSS_PROP (as long as CSS_PROP_LIST_INCLUDE_LOGICAL is
// defined).
#if defined(CSS_PROP_LOGICAL) && defined(CSS_PROP_LIST_EXCLUDE_LOGICAL) || defined(CSS_PROP_LOGICAL) && defined(CSS_PROP_LIST_INCLUDE_LOGICAL) || defined(CSS_PROP_LIST_EXCLUDE_LOGICAL) && defined(CSS_PROP_LIST_INCLUDE_LOGICAL)
#error Do not define more than one of CSS_PROP_LOGICAL, CSS_PROP_LIST_EXCLUDE_LOGICAL and CSS_PROP_LIST_INCLUDE_LOGICAL when capturing properties using CSS_PROP.
#endif
@@ -274,16 +275,20 @@
#ifndef CSS_PROP_SVGRESET
#define CSS_PROP_SVGRESET(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) /* nothing */
#define DEFINED_CSS_PROP_SVGRESET
#endif
#ifndef CSS_PROP_VARIABLES
#define CSS_PROP_VARIABLES(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) /* nothing */
#define DEFINED_CSS_PROP_VARIABLES
#endif
+#ifndef CSS_PROP_EFFECTS
+#define CSS_PROP_EFFECTS(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, stylestructoffset_, animtype_) /* nothing */
+#define DEFINED_CSS_PROP_EFFECTS
+#endif
#ifndef CSS_PROP_LOGICAL
#define CSS_PROP_LOGICAL(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, group_, struct_, stylestructoffset_, animtype_) /* nothing */
#define DEFINED_CSS_PROP_LOGICAL
#endif
#endif /* !defined(CSS_PROP) */
@@ -1309,29 +1314,29 @@ CSS_PROP_BORDER(
box_decoration_break,
BoxDecorationBreak,
CSS_PROPERTY_PARSE_VALUE,
"layout.css.box-decoration-break.enabled",
VARIANT_HK,
kBoxDecorationBreakKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_None)
-CSS_PROP_BORDER(
+CSS_PROP_EFFECTS(
box-shadow,
box_shadow,
BoxShadow,
CSS_PROPERTY_PARSE_FUNCTION |
CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
CSS_PROPERTY_VALUE_LIST_USES_COMMAS |
CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
// NOTE: some components must be nonnegative
"",
0,
kBoxShadowTypeKTable,
- offsetof(nsStyleBorder, mBoxShadow),
+ offsetof(nsStyleEffects, mBoxShadow),
eStyleAnimType_Shadow)
CSS_PROP_POSITION(
box-sizing,
box_sizing,
BoxSizing,
CSS_PROPERTY_PARSE_VALUE,
"",
VARIANT_HK,
@@ -4458,16 +4463,17 @@ CSS_PROP_FONT(
#undef CSS_PROP_PADDING
#undef CSS_PROP_BORDER
#undef CSS_PROP_OUTLINE
#undef CSS_PROP_XUL
#undef CSS_PROP_COLUMN
#undef CSS_PROP_SVG
#undef CSS_PROP_SVGRESET
#undef CSS_PROP_VARIABLES
+#undef CSS_PROP_EFFECTS
#else /* !defined(USED_CSS_PROP) */
#ifdef DEFINED_CSS_PROP_FONT
#undef CSS_PROP_FONT
#undef DEFINED_CSS_PROP_FONT
#endif
#ifdef DEFINED_CSS_PROP_COLOR
@@ -4553,16 +4559,20 @@ CSS_PROP_FONT(
#ifdef DEFINED_CSS_PROP_SVGRESET
#undef CSS_PROP_SVGRESET
#undef DEFINED_CSS_PROP_SVGRESET
#endif
#ifdef DEFINED_CSS_PROP_VARIABLES
#undef CSS_PROP_VARIABLES
#undef DEFINED_CSS_PROP_VARIABLES
#endif
+#ifdef DEFINED_CSS_PROP_EFFECTS
+#undef CSS_PROP_EFFECTS
+#undef DEFINED_CSS_PROP_EFFECTS
+#endif
#endif /* !defined(USED_CSS_PROP) */
#ifdef DEFINED_CSS_PROP_SHORTHAND
#undef CSS_PROP_SHORTHAND
#undef DEFINED_CSS_PROP_SHORTHAND
#endif
#ifdef DEFINED_CSS_PROP_LOGICAL
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -3203,16 +3203,23 @@ enum ColumnCheckCounter {
enum VariablesCheckCounter {
#define CSS_PROP_VARIABLES ENUM_DATA_FOR_PROPERTY
#include "nsCSSPropList.h"
#undef CSS_PROP_VARIABLES
ePropertyCount_for_Variables
};
+enum EffectsCheckCounter {
+ #define CSS_PROP_EFFECTS ENUM_DATA_FOR_PROPERTY
+ #include "nsCSSPropList.h"
+ #undef CSS_PROP_EFFECTS
+ ePropertyCount_for_Effects
+};
+
#undef ENUM_DATA_FOR_PROPERTY
/* static */ const size_t
nsCSSProps::gPropertyCountInStruct[nsStyleStructID_Length] = {
#define STYLE_STRUCT(name, checkdata_cb) \
ePropertyCount_for_##name,
#include "nsStyleStructList.h"
#undef STYLE_STRUCT
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -3375,17 +3375,17 @@ nsComputedDOMStyle::DoGetBoxDecorationBr
nsCSSProps::ValueToKeywordEnum(StyleBorder()->mBoxDecorationBreak,
nsCSSProps::kBoxDecorationBreakKTable));
return val.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBoxShadow()
{
- return GetCSSShadowArray(StyleBorder()->mBoxShadow,
+ return GetCSSShadowArray(StyleEffects()->mBoxShadow,
StyleColor()->mColor,
true);
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetZIndex()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -1971,16 +1971,22 @@ static const uint32_t gVariablesFlags[]
#define CSS_PROP_VARIABLES FLAG_DATA_FOR_PROPERTY
#include "nsCSSPropList.h"
#undef CSS_PROP_VARIABLES
};
static_assert(sizeof(gVariablesFlags) == sizeof(uint32_t),
"if nsStyleVariables has properties now you can remove the dummy "
"gVariablesFlags entry");
+static const uint32_t gEffectsFlags[] = {
+#define CSS_PROP_EFFECTS FLAG_DATA_FOR_PROPERTY
+#include "nsCSSPropList.h"
+#undef CSS_PROP_EFFECTS
+};
+
#undef FLAG_DATA_FOR_PROPERTY
static const uint32_t* gFlagsByStruct[] = {
#define STYLE_STRUCT(name, checkdata_cb) \
g##name##Flags,
#include "nsStyleStructList.h"
#undef STYLE_STRUCT
@@ -2570,16 +2576,22 @@ nsRuleNode::SetDefaultOnRoot(const nsSty
return svgReset;
}
case eStyleStruct_Variables:
{
nsStyleVariables* vars = new (mPresContext) nsStyleVariables(mPresContext);
aContext->SetStyle(eStyleStruct_Variables, vars);
return vars;
}
+ case eStyleStruct_Effects:
+ {
+ nsStyleEffects* effects = new (mPresContext) nsStyleEffects(mPresContext);
+ aContext->SetStyle(eStyleStruct_Effects, effects);
+ return effects;
+ }
default:
/*
* unhandled case: nsStyleStructID_Length.
* last item of nsStyleStructID, to know its length.
*/
MOZ_ASSERT(false, "unexpected SID");
return nullptr;
}
@@ -7212,43 +7224,16 @@ nsRuleNode::ComputeBorderData(void* aSta
// box-decoration-break: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForBoxDecorationBreak(),
border->mBoxDecorationBreak, conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INITIAL,
parentBorder->mBoxDecorationBreak,
NS_STYLE_BOX_DECORATION_BREAK_SLICE, 0, 0, 0, 0);
- // box-shadow: none, list, inherit, initial
- const nsCSSValue* boxShadowValue = aRuleData->ValueForBoxShadow();
- switch (boxShadowValue->GetUnit()) {
- case eCSSUnit_Null:
- break;
-
- case eCSSUnit_Initial:
- case eCSSUnit_Unset:
- case eCSSUnit_None:
- border->mBoxShadow = nullptr;
- break;
-
- case eCSSUnit_Inherit:
- border->mBoxShadow = parentBorder->mBoxShadow;
- conditions.SetUncacheable();
- break;
-
- case eCSSUnit_List:
- case eCSSUnit_ListDep:
- border->mBoxShadow = GetShadowData(boxShadowValue->GetListValue(),
- aContext, true, conditions);
- break;
-
- default:
- MOZ_ASSERT(false, "unrecognized shadow unit");
- }
-
// border-width, border-*-width: length, enum, inherit
nsStyleCoord coord;
{
const nsCSSProperty* subprops =
nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_width);
NS_FOR_CSS_SIDES(side) {
const nsCSSValue& value = *aRuleData->ValueFor(subprops[side]);
NS_ASSERTION(eCSSUnit_Percent != value.GetUnit(),
@@ -10012,16 +9997,56 @@ nsRuleNode::ComputeVariablesData(void* a
resolver.Resolve(&parentVariables->mVariables,
aRuleData->mVariables);
conditions.SetUncacheable();
COMPUTE_END_INHERITED(Variables, variables)
}
const void*
+nsRuleNode::ComputeEffectsData(void* aStartStruct,
+ const nsRuleData* aRuleData,
+ nsStyleContext* aContext,
+ nsRuleNode* aHighestNode,
+ const RuleDetail aRuleDetail,
+ const RuleNodeCacheConditions aConditions)
+{
+ COMPUTE_START_RESET(Effects, effects, parentEffects)
+
+ // box-shadow: none, list, inherit, initial
+ const nsCSSValue* boxShadowValue = aRuleData->ValueForBoxShadow();
+ switch (boxShadowValue->GetUnit()) {
+ case eCSSUnit_Null:
+ break;
+
+ case eCSSUnit_Initial:
+ case eCSSUnit_Unset:
+ case eCSSUnit_None:
+ effects->mBoxShadow = nullptr;
+ break;
+
+ case eCSSUnit_Inherit:
+ effects->mBoxShadow = parentEffects->mBoxShadow;
+ conditions.SetUncacheable();
+ break;
+
+ case eCSSUnit_List:
+ case eCSSUnit_ListDep:
+ effects->mBoxShadow = GetShadowData(boxShadowValue->GetListValue(),
+ aContext, true, conditions);
+ break;
+
+ default:
+ MOZ_ASSERT(false, "unrecognized shadow unit");
+ }
+
+ COMPUTE_END_RESET(Effects, effects)
+}
+
+const void*
nsRuleNode::GetStyleData(nsStyleStructID aSID,
nsStyleContext* aContext,
bool aComputeData)
{
NS_ASSERTION(IsUsedDirectly(),
"if we ever call this on rule nodes that aren't used "
"directly, we should adjust handling of mDependentBits "
"in some way.");
--- a/layout/style/nsRuleNode.h
+++ b/layout/style/nsRuleNode.h
@@ -741,16 +741,23 @@ protected:
const void*
ComputeVariablesData(void* aStartStruct,
const nsRuleData* aRuleData,
nsStyleContext* aContext, nsRuleNode* aHighestNode,
RuleDetail aRuleDetail,
const mozilla::RuleNodeCacheConditions aConditions);
+ const void*
+ ComputeEffectsData(void* aStartStruct,
+ const nsRuleData* aRuleData,
+ nsStyleContext* aContext, nsRuleNode* aHighestNode,
+ RuleDetail aRuleDetail,
+ const mozilla::RuleNodeCacheConditions aConditions);
+
// helpers for |ComputeFontData| that need access to |mNoneBits|:
static void SetFontSize(nsPresContext* aPresContext,
const nsRuleData* aRuleData,
const nsStyleFont* aFont,
const nsStyleFont* aParentFont,
nscoord* aSize,
const nsFont& aSystemFont,
nscoord aParentSize,
--- a/layout/style/nsStyleContext.cpp
+++ b/layout/style/nsStyleContext.cpp
@@ -967,16 +967,17 @@ nsStyleContext::CalcStyleDifference(nsSt
DO_STRUCT_DIFFERENCE(Position);
#undef EXTRA_DIFF_ARGS
#define EXTRA_DIFF_ARGS /* nothing */
DO_STRUCT_DIFFERENCE(Font);
DO_STRUCT_DIFFERENCE(Margin);
DO_STRUCT_DIFFERENCE(Padding);
DO_STRUCT_DIFFERENCE(Border);
DO_STRUCT_DIFFERENCE(TextReset);
+ DO_STRUCT_DIFFERENCE(Effects);
DO_STRUCT_DIFFERENCE(Background);
DO_STRUCT_DIFFERENCE(Color);
#undef EXTRA_DIFF_ARGS
#undef DO_STRUCT_DIFFERENCE
MOZ_ASSERT(styleStructCount == nsStyleStructID_Length,
"missing a call to DO_STRUCT_DIFFERENCE");
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -370,17 +370,16 @@ nsChangeHint nsStylePadding::CalcDiffere
// offsets are from our frame bounds but our content rect's position within
// those bounds is moving.
return NS_SubtractHint(NS_STYLE_HINT_REFLOW,
nsChangeHint_ClearDescendantIntrinsics);
}
nsStyleBorder::nsStyleBorder(StyleStructContext aContext)
: mBorderColors(nullptr),
- mBoxShadow(nullptr),
mBorderImageFill(NS_STYLE_BORDER_IMAGE_SLICE_NOFILL),
mBorderImageRepeatH(NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH),
mBorderImageRepeatV(NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH),
mFloatEdge(NS_STYLE_FLOAT_EDGE_CONTENT),
mBoxDecorationBreak(NS_STYLE_BOX_DECORATION_BREAK_SLICE),
mComputedBorder(0, 0, 0, 0)
{
MOZ_COUNT_CTOR(nsStyleBorder);
@@ -417,17 +416,16 @@ nsBorderColors::Clone(bool aDeep) const
return result;
if (aDeep)
NS_CSS_CLONE_LIST_MEMBER(nsBorderColors, this, mNext, result, (false));
return result;
}
nsStyleBorder::nsStyleBorder(const nsStyleBorder& aSrc)
: mBorderColors(nullptr),
- mBoxShadow(aSrc.mBoxShadow),
mBorderRadius(aSrc.mBorderRadius),
mBorderImageSource(aSrc.mBorderImageSource),
mBorderImageSlice(aSrc.mBorderImageSlice),
mBorderImageWidth(aSrc.mBorderImageWidth),
mBorderImageOutset(aSrc.mBorderImageOutset),
mBorderImageFill(aSrc.mBorderImageFill),
mBorderImageRepeatH(aSrc.mBorderImageRepeatH),
mBorderImageRepeatV(aSrc.mBorderImageRepeatV),
@@ -504,48 +502,28 @@ nsChangeHint nsStyleBorder::CalcDifferen
// at least GetComputedBorder() differences...
if (mTwipsPerPixel != aOther.mTwipsPerPixel ||
GetComputedBorder() != aOther.GetComputedBorder() ||
mFloatEdge != aOther.mFloatEdge ||
mBorderImageOutset != aOther.mBorderImageOutset ||
mBoxDecorationBreak != aOther.mBoxDecorationBreak)
return NS_STYLE_HINT_REFLOW;
- nsChangeHint boxShadowHint = nsChangeHint(0);
- if (!AreShadowArraysEqual(mBoxShadow, aOther.mBoxShadow)) {
- // Update overflow regions & trigger DLBI to be sure it's noticed:
- NS_UpdateHint(boxShadowHint, nsChangeHint_UpdateOverflow);
- NS_UpdateHint(boxShadowHint, nsChangeHint_SchedulePaint);
- // Also request a repaint, since it's possible that only the color
- // of the shadow is changing (and UpdateOverflow/SchedulePaint won't
- // repaint for that, since they won't know what needs invalidating.)
- NS_UpdateHint(boxShadowHint, nsChangeHint_RepaintFrame);
- // Don't return yet; we may also need nsChangeHint_BorderStyleNoneChange.
- }
-
NS_FOR_CSS_SIDES(ix) {
// See the explanation in nsChangeHint.h of
// nsChangeHint_BorderStyleNoneChange .
// Furthermore, even though we know *this* side is 0 width, just
// assume a repaint hint for some other change rather than bother
// tracking this result through the rest of the function.
if (HasVisibleStyle(ix) != aOther.HasVisibleStyle(ix)) {
- return NS_CombineHint(boxShadowHint,
- nsChangeHint_RepaintFrame |
- nsChangeHint_BorderStyleNoneChange);
+ return nsChangeHint_RepaintFrame |
+ nsChangeHint_BorderStyleNoneChange;
}
}
- if (boxShadowHint) {
- // NOTE: This hint (UpdateOverflow + SchedulePaint + RepaintFrame) is
- // expected to subsume all hints returned after this point. (Hence, we're
- // OK to return early.)
- return boxShadowHint;
- }
-
// Note that mBorderStyle stores not only the border style but also
// color-related flags. Given that we've already done an mComputedBorder
// comparison, border-style differences can only lead to a repaint hint. So
// it's OK to just compare the values directly -- if either the actual
// style or the color flags differ we want to repaint.
NS_FOR_CSS_SIDES(ix) {
if (mBorderStyle[ix] != aOther.mBorderStyle[ix] ||
mBorderColor[ix] != aOther.mBorderColor[ix])
@@ -4010,8 +3988,47 @@ nsStyleVariables::~nsStyleVariables(void
MOZ_COUNT_DTOR(nsStyleVariables);
}
nsChangeHint
nsStyleVariables::CalcDifference(const nsStyleVariables& aOther) const
{
return nsChangeHint(0);
}
+
+//-----------------------
+// nsStyleEffects
+//
+
+nsStyleEffects::nsStyleEffects(StyleStructContext aContext)
+ : mBoxShadow(nullptr)
+{
+ MOZ_COUNT_CTOR(nsStyleEffects);
+}
+
+nsStyleEffects::nsStyleEffects(const nsStyleEffects& aSource)
+ : mBoxShadow(aSource.mBoxShadow)
+{
+ MOZ_COUNT_CTOR(nsStyleEffects);
+}
+
+nsStyleEffects::~nsStyleEffects()
+{
+ MOZ_COUNT_DTOR(nsStyleEffects);
+}
+
+nsChangeHint
+nsStyleEffects::CalcDifference(const nsStyleEffects& aOther) const
+{
+ nsChangeHint hint = nsChangeHint(0);
+
+ if (!AreShadowArraysEqual(mBoxShadow, aOther.mBoxShadow)) {
+ // Update overflow regions & trigger DLBI to be sure it's noticed.
+ // Also request a repaint, since it's possible that only the color
+ // of the shadow is changing (and UpdateOverflow/SchedulePaint won't
+ // repaint for that, since they won't know what needs invalidating.)
+ hint |= nsChangeHint_UpdateOverflow |
+ nsChangeHint_SchedulePaint |
+ nsChangeHint_RepaintFrame;
+ }
+
+ return hint;
+}
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -43,28 +43,27 @@ class nsTextFrame;
class imgIContainer;
struct nsStyleVisibility;
// Includes nsStyleStructID.
#include "nsStyleStructFwd.h"
// Bits for each struct.
// NS_STYLE_INHERIT_BIT defined in nsStyleStructFwd.h
-#define NS_STYLE_INHERIT_MASK 0x0007fffff
+#define NS_STYLE_INHERIT_MASK 0x000ffffff
// Bits for inherited structs.
#define NS_STYLE_INHERITED_STRUCT_MASK \
((nsStyleStructID_size_t(1) << nsStyleStructID_Inherited_Count) - 1)
// Bits for reset structs.
#define NS_STYLE_RESET_STRUCT_MASK \
(((nsStyleStructID_size_t(1) << nsStyleStructID_Reset_Count) - 1) \
<< nsStyleStructID_Inherited_Count)
// Additional bits for nsStyleContext's mBits:
-// Free bit 0x000800000
// See nsStyleContext::HasTextDecorationLines
#define NS_STYLE_HAS_TEXT_DECORATION_LINES 0x001000000
// See nsStyleContext::HasPseudoElementData.
#define NS_STYLE_HAS_PSEUDO_ELEMENT_DATA 0x002000000
// See nsStyleContext::RelevantLinkIsVisited
#define NS_STYLE_RELEVANT_LINK_VISITED 0x004000000
// See nsStyleContext::IsStyleIfVisited
#define NS_STYLE_IS_STYLE_IF_VISITED 0x008000000
@@ -82,17 +81,16 @@ struct nsStyleVisibility;
// See nsStyleContext::FindChildWithRules
#define NS_STYLE_INELIGIBLE_FOR_SHARING 0x200000000
// See nsStyleContext::HasChildThatUsesResetStyle
#define NS_STYLE_HAS_CHILD_THAT_USES_RESET_STYLE 0x400000000
// See nsStyleContext::GetPseudoEnum
#define NS_STYLE_CONTEXT_TYPE_SHIFT 35
// Additional bits for nsRuleNode's mDependentBits:
-// Free bit 0x00800000
#define NS_RULE_NODE_IS_ANIMATION_RULE 0x01000000
// Free bit 0x02000000
#define NS_RULE_NODE_USED_DIRECTLY 0x04000000
#define NS_RULE_NODE_IS_IMPORTANT 0x08000000
#define NS_RULE_NODE_LEVEL_MASK 0xf0000000
#define NS_RULE_NODE_LEVEL_SHIFT 28
// Additional bits for nsRuleNode's mNoneBits:
@@ -1202,17 +1200,16 @@ struct nsStyleBorder
if (mBorderImageSource.GetType() == eStyleImageType_Image) {
return mBorderImageSource.GetImageData();
}
return nullptr;
}
public:
nsBorderColors** mBorderColors; // [reset] composite (stripe) colors
- RefPtr<nsCSSShadowArray> mBoxShadow; // [reset] nullptr for 'none'
public:
nsStyleCorners mBorderRadius; // [reset] coord, percent
nsStyleImage mBorderImageSource; // [reset]
nsStyleSides mBorderImageSlice; // [reset] factor, percent
nsStyleSides mBorderImageWidth; // [reset] length, factor, percent, auto
nsStyleSides mBorderImageOutset; // [reset] length, factor
@@ -3561,9 +3558,41 @@ struct nsStyleVariables
// CalcDifference never returns nsChangeHint_NeedReflow or
// nsChangeHint_ClearAncestorIntrinsics at all.
return nsChangeHint(0);
}
mozilla::CSSVariableValues mVariables;
};
+struct nsStyleEffects
+{
+ explicit nsStyleEffects(StyleStructContext aContext);
+ nsStyleEffects(const nsStyleEffects& aSource);
+ ~nsStyleEffects();
+
+ void* operator new(size_t sz, nsStyleEffects* aSelf) CPP_THROW_NEW { return aSelf; }
+ void* operator new(size_t sz, nsPresContext* aContext) CPP_THROW_NEW {
+ return aContext->PresShell()->
+ AllocateByObjectID(mozilla::eArenaObjectID_nsStyleEffects, sz);
+ }
+ void Destroy(nsPresContext* aContext) {
+ this->~nsStyleEffects();
+ aContext->PresShell()->
+ FreeByObjectID(mozilla::eArenaObjectID_nsStyleEffects, this);
+ }
+
+ nsChangeHint CalcDifference(const nsStyleEffects& aOther) const;
+ static nsChangeHint MaxDifference() {
+ return nsChangeHint_UpdateOverflow |
+ nsChangeHint_SchedulePaint |
+ nsChangeHint_RepaintFrame;
+ }
+ static nsChangeHint DifferenceAlwaysHandledForDescendants() {
+ // CalcDifference never returns the reflow hints that are sometimes
+ // handled for descendants as hints not handled for descendants.
+ return nsChangeHint(0);
+ }
+
+ RefPtr<nsCSSShadowArray> mBoxShadow; // [reset] nullptr for 'none'
+};
+
#endif /* nsStyleStruct_h___ */
--- a/layout/tables/nsTableCellFrame.cpp
+++ b/layout/tables/nsTableCellFrame.cpp
@@ -484,18 +484,17 @@ nsTableCellFrame::BuildDisplayList(nsDis
nsTableFrame* tableFrame = GetTableFrame();
int32_t emptyCellStyle = GetContentEmpty() && !tableFrame->IsBorderCollapse() ?
StyleTableBorder()->mEmptyCells
: NS_STYLE_TABLE_EMPTY_CELLS_SHOW;
// take account of 'empty-cells'
if (StyleVisibility()->IsVisible() &&
(NS_STYLE_TABLE_EMPTY_CELLS_HIDE != emptyCellStyle)) {
// display outset box-shadows if we need to.
- const nsStyleBorder* borderStyle = StyleBorder();
- bool hasBoxShadow = !!borderStyle->mBoxShadow;
+ bool hasBoxShadow = !!StyleEffects()->mBoxShadow;
if (hasBoxShadow) {
aLists.BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, this));
}
// display background if we need to.
if (aBuilder->IsForEventDelivery() ||
!StyleBackground()->IsTransparent() || StyleDisplay()->mAppearance) {
--- a/layout/tables/nsTableFrame.cpp
+++ b/layout/tables/nsTableFrame.cpp
@@ -1237,17 +1237,17 @@ nsTableFrame::DisplayGenericTablePart(ns
nsDisplayTableItem* currentItem = aBuilder->GetCurrentTableItem();
// currentItem may be null, when none of the table parts have a
// background or border
if (currentItem) {
currentItem->UpdateForFrameBackground(aFrame);
}
// Paint the outset box-shadows for the table frames
- bool hasBoxShadow = aFrame->StyleBorder()->mBoxShadow != nullptr;
+ bool hasBoxShadow = aFrame->StyleEffects()->mBoxShadow != nullptr;
if (hasBoxShadow) {
lists->BorderBackground()->AppendNewToTop(
new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, aFrame));
}
// Create dedicated background display items per-frame when we're
// handling events.
// XXX how to handle collapsed borders?