Bug 1332193 - Fix several properties to return NeutralChange hint. r=heycam
MozReview-Commit-ID: GDNRy6vqmL8
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -484,18 +484,17 @@ nsStyleBorder::CalcDifference(const nsSt
}
if (IsBorderImageLoaded() || aNewData.IsBorderImageLoaded()) {
if (mBorderImageSource != aNewData.mBorderImageSource ||
mBorderImageRepeatH != aNewData.mBorderImageRepeatH ||
mBorderImageRepeatV != aNewData.mBorderImageRepeatV ||
mBorderImageSlice != aNewData.mBorderImageSlice ||
mBorderImageFill != aNewData.mBorderImageFill ||
- mBorderImageWidth != aNewData.mBorderImageWidth ||
- mBorderImageOutset != aNewData.mBorderImageOutset) {
+ mBorderImageWidth != aNewData.mBorderImageWidth) {
return nsChangeHint_RepaintFrame;
}
}
// Note that at this point if mBorderColors is non-null so is
// aNewData.mBorderColors
if (mBorderColors) {
NS_FOR_CSS_SIDES(ix) {
@@ -508,16 +507,28 @@ nsStyleBorder::CalcDifference(const nsSt
// mBorder is the specified border value. Changes to this don't
// need any change processing, since we operate on the computed
// border values instead.
if (mBorder != aNewData.mBorder) {
return nsChangeHint_NeutralChange;
}
+ // mBorderImage* fields are checked only when border image was
+ // actualy loaded. But we need to return neutral change even when
+ // they are not actually used.
+ if (mBorderImageSource != aNewData.mBorderImageSource ||
+ mBorderImageRepeatH != aNewData.mBorderImageRepeatH ||
+ mBorderImageRepeatV != aNewData.mBorderImageRepeatV ||
+ mBorderImageSlice != aNewData.mBorderImageSlice ||
+ mBorderImageFill != aNewData.mBorderImageFill ||
+ mBorderImageWidth != aNewData.mBorderImageWidth) {
+ return nsChangeHint_NeutralChange;
+ }
+
return nsChangeHint(0);
}
nsStyleOutline::nsStyleOutline(const nsPresContext* aContext)
: mOutlineWidth((StaticPresData::Get()
->GetBorderWidthTable())[NS_STYLE_BORDER_WIDTH_MEDIUM])
, mOutlineOffset(0)
, mOutlineColor(StyleComplexColor::CurrentColor())
@@ -4130,16 +4141,20 @@ nsStyleUIReset::CalcDifference(const nsS
if (mUserSelect != aNewData.mUserSelect) {
return NS_STYLE_HINT_VISUAL;
}
if (mWindowDragging != aNewData.mWindowDragging) {
return nsChangeHint_SchedulePaint;
}
+ if (mIMEMode != aNewData.mIMEMode) {
+ return nsChangeHint_NeutralChange;
+ }
+
return nsChangeHint(0);
}
//-----------------------
// nsStyleVariables
//
nsStyleVariables::nsStyleVariables()
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -3400,17 +3400,18 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
this->~nsStyleUIReset();
aContext->PresShell()->
FreeByObjectID(mozilla::eArenaObjectID_nsStyleUIReset, this);
}
nsChangeHint CalcDifference(const nsStyleUIReset& aNewData) const;
static nsChangeHint MaxDifference() {
return nsChangeHint_ReconstructFrame |
- NS_STYLE_HINT_REFLOW;
+ NS_STYLE_HINT_REFLOW |
+ nsChangeHint_NeutralChange;
}
static nsChangeHint DifferenceAlwaysHandledForDescendants() {
// CalcDifference never returns the reflow hints that are sometimes
// handled for descendants as hints not handled for descendants.
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}