Bug 450939 - Add -moz-window-shadow CSS property, r+sr=dbaron

This commit is contained in:
Markus Stange 2008-10-14 16:44:25 +02:00
parent 44f284fa35
commit 85e0b205be
14 changed files with 74 additions and 9 deletions

View File

@ -406,7 +406,7 @@ interface nsIDOMCSS2Properties : nsISupports
// raises(DOMException) on setting
};
[scriptable, uuid(06b9eb9a-a845-4cb7-a941-fa87305ded4b)]
[scriptable, uuid(e7245a21-3f46-4e67-82bf-a9b326fe74ee)]
interface nsIDOMNSCSS2Properties : nsIDOMCSS2Properties
{
/* Non-DOM 2 extensions */
@ -620,5 +620,8 @@ interface nsIDOMNSCSS2Properties : nsIDOMCSS2Properties
attribute DOMString MozTransformOrigin;
// raises(DOMException) on setting
attribute DOMString MozWindowShadow;
// raises(DOMException) on setting
};

View File

@ -710,6 +710,10 @@
#define NS_STYLE_IME_MODE_DISABLED 3
#define NS_STYLE_IME_MODE_INACTIVE 4
// See nsStyleUIReset
#define NS_STYLE_WINDOW_SHADOW_NONE 0
#define NS_STYLE_WINDOW_SHADOW_DEFAULT 1
#ifdef MOZ_SVG
// See nsStyleSVG

View File

@ -5623,6 +5623,9 @@ CSSParserImpl::ParseSingleValueProperty(nsCSSValue& aValue,
case eCSSProperty_white_space:
return ParseVariant(aValue, VARIANT_HMK,
nsCSSProps::kWhitespaceKTable);
case eCSSProperty__moz_window_shadow:
return ParseVariant(aValue, VARIANT_HOK,
nsCSSProps::kWindowShadowKTable);
case eCSSProperty_word_wrap:
return ParseVariant(aValue, VARIANT_HMK,
nsCSSProps::kWordwrapKTable);

View File

@ -517,6 +517,7 @@ CSS_PROP_BACKENDONLY(volume, volume, Volume, 0, Aural, mVolume, eCSSType_Value,
CSS_PROP_TEXT(white-space, white_space, WhiteSpace, 0, Text, mWhiteSpace, eCSSType_Value, kWhitespaceKTable)
CSS_PROP_BACKENDONLY(widows, widows, Widows, 0, Breaks, mWidows, eCSSType_Value, nsnull)
CSS_PROP_POSITION(width, width, Width, 0, Position, mWidth, eCSSType_Value, kWidthKTable)
CSS_PROP_UIRESET(-moz-window-shadow, _moz_window_shadow, MozWindowShadow, 0, UserInterface, mWindowShadow, eCSSType_Value, kWindowShadowKTable)
CSS_PROP_TEXT(word-spacing, word_spacing, WordSpacing, 0, Text, mWordSpacing, eCSSType_Value, nsnull)
CSS_PROP_TEXT(word-wrap, word_wrap, WordWrap, 0, Text, mWordWrap, eCSSType_Value, kWordwrapKTable)
CSS_PROP_POSITION(z-index, z_index, ZIndex, 0, Position, mZIndex, eCSSType_Value, nsnull)

View File

@ -1047,6 +1047,11 @@ const PRInt32 nsCSSProps::kWidthKTable[] = {
eCSSKeyword_UNKNOWN,-1
};
const PRInt32 nsCSSProps::kWindowShadowKTable[] = {
eCSSKeyword_default, NS_STYLE_WINDOW_SHADOW_DEFAULT,
eCSSKeyword_UNKNOWN,-1
};
const PRInt32 nsCSSProps::kWordwrapKTable[] = {
eCSSKeyword_normal, NS_STYLE_WORDWRAP_NORMAL,
eCSSKeyword_break_word, NS_STYLE_WORDWRAP_BREAK_WORD,

View File

@ -204,6 +204,7 @@ public:
static const PRInt32 kVolumeKTable[];
static const PRInt32 kWhitespaceKTable[];
static const PRInt32 kWidthKTable[]; // also min-width, max-width
static const PRInt32 kWindowShadowKTable[];
static const PRInt32 kWordwrapKTable[];
};

View File

@ -560,6 +560,7 @@ struct nsCSSUserInterface : public nsCSSStruct { // NEW
nsCSSValueList* mCursor;
nsCSSValue mForceBrokenImageIcon;
nsCSSValue mIMEMode;
nsCSSValue mWindowShadow;
private:
nsCSSUserInterface(const nsCSSUserInterface& aOther); // NOT IMPLEMENTED
};

View File

@ -2148,6 +2148,27 @@ nsComputedDOMStyle::GetWhiteSpace(nsIDOMCSSValue** aValue)
return CallQueryInterface(val, aValue);
}
nsresult
nsComputedDOMStyle::GetWindowShadow(nsIDOMCSSValue** aValue)
{
nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue();
NS_ENSURE_TRUE(val, NS_ERROR_OUT_OF_MEMORY);
const nsStyleUIReset *uiData = GetStyleUIReset();
if (uiData->mWindowShadow != NS_STYLE_WINDOW_SHADOW_NONE) {
const nsAFlatCString& windowShadow =
nsCSSProps::ValueToKeyword(uiData->mWindowShadow,
nsCSSProps::kWindowShadowKTable);
val->SetIdent(windowShadow);
} else {
val->SetIdent(nsGkAtoms::none);
}
return CallQueryInterface(val, aValue);
}
nsresult
nsComputedDOMStyle::GetWordWrap(nsIDOMCSSValue** aValue)
{
@ -4200,6 +4221,7 @@ nsComputedDOMStyle::GetQueryablePropertyMap(PRUint32* aLength)
COMPUTED_STYLE_MAP_ENTRY(user_input, UserInput),
COMPUTED_STYLE_MAP_ENTRY(user_modify, UserModify),
COMPUTED_STYLE_MAP_ENTRY(user_select, UserSelect),
COMPUTED_STYLE_MAP_ENTRY(_moz_window_shadow, WindowShadow),
COMPUTED_STYLE_MAP_ENTRY(word_wrap, WordWrap)
#ifdef MOZ_SVG

View File

@ -203,6 +203,9 @@ private:
/* Box Shadow */
nsresult GetBoxShadow(nsIDOMCSSValue** aValue);
/* Window Shadow */
nsresult GetWindowShadow(nsIDOMCSSValue** aValue);
/* Margin Properties */
nsresult GetMarginWidth(nsIDOMCSSValue** aValue);
nsresult GetMarginTopWidth(nsIDOMCSSValue** aValue);

View File

@ -3120,6 +3120,12 @@ nsRuleNode::ComputeUIResetData(void* aStartStruct,
parentUI->mForceBrokenImageIcon,
0, 0, 0, 0, 0);
// -moz-window-shadow: enum, none, inherit, initial
SetDiscrete(uiData.mWindowShadow, ui->mWindowShadow, inherited,
SETDSC_ENUMERATED | SETDSC_NONE, parentUI->mWindowShadow,
NS_STYLE_WINDOW_SHADOW_DEFAULT, 0,
NS_STYLE_WINDOW_SHADOW_NONE, 0, 0);
COMPUTE_END_RESET(UIReset, ui)
}

View File

@ -805,9 +805,10 @@ void nsStyleContext::DumpRegressionData(nsPresContext* aPresContext, FILE* out,
// UIReset
IndentBy(out,aIndent);
const nsStyleUIReset* uiReset = GetStyleUIReset();
fprintf(out, "<uireset data=\"%d %d\" />\n",
fprintf(out, "<uireset data=\"%d %d %d\" />\n",
(int)uiReset->mUserSelect,
(int)uiReset->mIMEMode);
(int)uiReset->mIMEMode,
(int)uiReset->mWindowShadow);
// Column
IndentBy(out,aIndent);

View File

@ -1901,6 +1901,7 @@ nsStyleUIReset::nsStyleUIReset(void)
mUserSelect = NS_STYLE_USER_SELECT_AUTO;
mForceBrokenImageIcon = 0;
mIMEMode = NS_STYLE_IME_MODE_AUTO;
mWindowShadow = NS_STYLE_WINDOW_SHADOW_DEFAULT;
}
nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
@ -1908,6 +1909,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
mUserSelect = aSource.mUserSelect;
mForceBrokenImageIcon = aSource.mForceBrokenImageIcon;
mIMEMode = aSource.mIMEMode;
mWindowShadow = aSource.mWindowShadow;
}
nsStyleUIReset::~nsStyleUIReset(void)
@ -1917,13 +1919,17 @@ nsStyleUIReset::~nsStyleUIReset(void)
nsChangeHint nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const
{
// ignore mIMEMode
if (mForceBrokenImageIcon == aOther.mForceBrokenImageIcon) {
if (mUserSelect == aOther.mUserSelect) {
return NS_STYLE_HINT_NONE;
}
return NS_STYLE_HINT_VISUAL;
if (mForceBrokenImageIcon != aOther.mForceBrokenImageIcon)
return NS_STYLE_HINT_FRAMECHANGE;
if (mWindowShadow != aOther.mWindowShadow) {
// We really need just an nsChangeHint_SyncFrameView, except
// on an ancestor of the frame, so we get that by doing a
// reflow.
return NS_STYLE_HINT_REFLOW;
}
return NS_STYLE_HINT_FRAMECHANGE;
if (mUserSelect != aOther.mUserSelect)
return NS_STYLE_HINT_VISUAL;
return NS_STYLE_HINT_NONE;
}
#ifdef DEBUG

View File

@ -1241,6 +1241,7 @@ struct nsStyleUIReset {
PRUint8 mUserSelect; // [reset] (selection-style)
PRUint8 mForceBrokenImageIcon; // [reset] (0 if not forcing, otherwise forcing)
PRUint8 mIMEMode; // [reset]
PRUint8 mWindowShadow; // [reset]
};
struct nsCursorImage {

View File

@ -589,6 +589,14 @@ var gCSSProperties = {
other_values: [ "none", "text", "element", "elements", "all", "toggle", "tri-state", "-moz-all", "-moz-none" ],
invalid_values: []
},
"-moz-window-shadow": {
domProp: "MozWindowShadow",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "default" ],
other_values: [ "none" ],
invalid_values: []
},
"azimuth": {
domProp: "azimuth",
inherited: true,