Support for proprietary style property to allow composer to force broken image icons. b=58646 r=karnaze sr=kin a=asa

This commit is contained in:
attinasi%netscape.com 2002-03-26 20:14:05 +00:00
Родитель efc219fb41
Коммит 159525bdf5
23 изменённых файлов: 213 добавлений и 58 удалений

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

@ -940,7 +940,8 @@ static const PropertyCheckData UserInterfaceCheckProperties[] = {
static const PropertyCheckData UIResetCheckProperties[] = { static const PropertyCheckData UIResetCheckProperties[] = {
CHECKDATA_PROP(nsCSSUserInterface, mUserSelect, CHECKDATA_VALUE, PR_FALSE), CHECKDATA_PROP(nsCSSUserInterface, mUserSelect, CHECKDATA_VALUE, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mResizer, CHECKDATA_VALUE, PR_FALSE), CHECKDATA_PROP(nsCSSUserInterface, mResizer, CHECKDATA_VALUE, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mKeyEquivalent, CHECKDATA_VALUELIST, PR_FALSE) CHECKDATA_PROP(nsCSSUserInterface, mKeyEquivalent, CHECKDATA_VALUELIST, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mForceBrokenImageIcon, CHECKDATA_VALUE, PR_FALSE)
}; };
#ifdef INCLUDE_XUL #ifdef INCLUDE_XUL
@ -2760,6 +2761,11 @@ nsRuleNode::ComputeUIResetData(nsStyleStruct* aStartData, const nsCSSStruct& aDa
ui->mResizer = parentUI->mResizer; ui->mResizer = parentUI->mResizer;
} }
// force-broken-image-icons: integer
if (eCSSUnit_Integer == uiData.mForceBrokenImageIcon.GetUnit()) {
ui->mForceBrokenImageIcon = uiData.mForceBrokenImageIcon.GetIntValue();
}
if (inherited) if (inherited)
// We inherited, and therefore can't be cached in the rule node. We have to be put right on the // We inherited, and therefore can't be cached in the rule node. We have to be put right on the
// style context. // style context.

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

@ -946,7 +946,8 @@ nsCSSUserInterface::nsCSSUserInterface(const nsCSSUserInterface& aCopy)
mKeyEquivalent(nsnull), mKeyEquivalent(nsnull),
mUserFocus(aCopy.mUserFocus), mUserFocus(aCopy.mUserFocus),
mResizer(aCopy.mResizer), mResizer(aCopy.mResizer),
mCursor(nsnull) mCursor(nsnull),
mForceBrokenImageIcon(aCopy.mForceBrokenImageIcon)
{ {
MOZ_COUNT_CTOR(nsCSSUserInterface); MOZ_COUNT_CTOR(nsCSSUserInterface);
CSS_IF_COPY(mCursor, nsCSSValueList); CSS_IF_COPY(mCursor, nsCSSValueList);
@ -988,7 +989,9 @@ void nsCSSUserInterface::List(FILE* out, PRInt32 aIndent) const
cursor->mValue.AppendToString(buffer, eCSSProperty_cursor); cursor->mValue.AppendToString(buffer, eCSSProperty_cursor);
cursor = cursor->mNext; cursor = cursor->mNext;
} }
mForceBrokenImageIcon.AppendToString(buffer,eCSSProperty_force_broken_image_icon);
fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out); fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out);
} }
#endif #endif
@ -1894,7 +1897,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_ENSURE(UserInterface) { CSS_ENSURE(UserInterface) {
switch (aProperty) { switch (aProperty) {
case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break; case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break;
@ -1914,7 +1918,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
CSS_IF_DELETE(theUserInterface->mCursor->mNext); CSS_IF_DELETE(theUserInterface->mCursor->mNext);
} }
break; break;
case eCSSProperty_force_broken_image_icon: theUserInterface->mForceBrokenImageIcon = aValue; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }
@ -4567,7 +4572,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_VARONSTACK_GET(UserInterface); CSS_VARONSTACK_GET(UserInterface);
if (nsnull != theUserInterface) { if (nsnull != theUserInterface) {
switch (aProperty) { switch (aProperty) {
@ -4586,7 +4592,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
aValue = theUserInterface->mCursor->mValue; aValue = theUserInterface->mCursor->mValue;
} }
break; break;
case eCSSProperty_force_broken_image_icon: aValue = theUserInterface->mForceBrokenImageIcon; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }

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

@ -240,6 +240,7 @@ struct nsCSSDisplay : public nsCSSStruct {
// in nsCSSDeclaration objects but because it's needed on the // in nsCSSDeclaration objects but because it's needed on the
// stack when the struct is used in WalkRuleTree. // stack when the struct is used in WalkRuleTree.
nsCSSValue mLang; nsCSSValue mLang;
// temp fix for bug 24000 // temp fix for bug 24000
nsCSSValue mBreakBefore; nsCSSValue mBreakBefore;
nsCSSValue mBreakAfter; nsCSSValue mBreakAfter;
@ -420,6 +421,7 @@ struct nsCSSUserInterface : public nsCSSStruct { // NEW
nsCSSValue mResizer; nsCSSValue mResizer;
nsCSSValueList* mCursor; nsCSSValueList* mCursor;
nsCSSValue mForceBrokenImageIcon;
}; };
struct nsCSSAural : public nsCSSStruct { // NEW struct nsCSSAural : public nsCSSStruct { // NEW

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

@ -3760,6 +3760,8 @@ PRBool CSSParserImpl::ParseSingleValueProperty(PRInt32& aErrorCode,
case eCSSProperty_height: case eCSSProperty_height:
case eCSSProperty_width: case eCSSProperty_width:
return ParsePositiveVariant(aErrorCode, aValue, VARIANT_AHLP, nsnull); return ParsePositiveVariant(aErrorCode, aValue, VARIANT_AHLP, nsnull);
case eCSSProperty_force_broken_image_icon:
return ParsePositiveVariant(aErrorCode, aValue, VARIANT_INTEGER, nsnull);
case eCSSProperty_caption_side: case eCSSProperty_caption_side:
return ParseVariant(aErrorCode, aValue, VARIANT_HK, return ParseVariant(aErrorCode, aValue, VARIANT_HK,
nsCSSProps::kCaptionSideKTable); nsCSSProps::kCaptionSideKTable);

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

@ -946,7 +946,8 @@ nsCSSUserInterface::nsCSSUserInterface(const nsCSSUserInterface& aCopy)
mKeyEquivalent(nsnull), mKeyEquivalent(nsnull),
mUserFocus(aCopy.mUserFocus), mUserFocus(aCopy.mUserFocus),
mResizer(aCopy.mResizer), mResizer(aCopy.mResizer),
mCursor(nsnull) mCursor(nsnull),
mForceBrokenImageIcon(aCopy.mForceBrokenImageIcon)
{ {
MOZ_COUNT_CTOR(nsCSSUserInterface); MOZ_COUNT_CTOR(nsCSSUserInterface);
CSS_IF_COPY(mCursor, nsCSSValueList); CSS_IF_COPY(mCursor, nsCSSValueList);
@ -988,7 +989,9 @@ void nsCSSUserInterface::List(FILE* out, PRInt32 aIndent) const
cursor->mValue.AppendToString(buffer, eCSSProperty_cursor); cursor->mValue.AppendToString(buffer, eCSSProperty_cursor);
cursor = cursor->mNext; cursor = cursor->mNext;
} }
mForceBrokenImageIcon.AppendToString(buffer,eCSSProperty_force_broken_image_icon);
fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out); fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out);
} }
#endif #endif
@ -1894,7 +1897,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_ENSURE(UserInterface) { CSS_ENSURE(UserInterface) {
switch (aProperty) { switch (aProperty) {
case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break; case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break;
@ -1914,7 +1918,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
CSS_IF_DELETE(theUserInterface->mCursor->mNext); CSS_IF_DELETE(theUserInterface->mCursor->mNext);
} }
break; break;
case eCSSProperty_force_broken_image_icon: theUserInterface->mForceBrokenImageIcon = aValue; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }
@ -4567,7 +4572,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_VARONSTACK_GET(UserInterface); CSS_VARONSTACK_GET(UserInterface);
if (nsnull != theUserInterface) { if (nsnull != theUserInterface) {
switch (aProperty) { switch (aProperty) {
@ -4586,7 +4592,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
aValue = theUserInterface->mCursor->mValue; aValue = theUserInterface->mCursor->mValue;
} }
break; break;
case eCSSProperty_force_broken_image_icon: aValue = theUserInterface->mForceBrokenImageIcon; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }

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

@ -240,6 +240,7 @@ struct nsCSSDisplay : public nsCSSStruct {
// in nsCSSDeclaration objects but because it's needed on the // in nsCSSDeclaration objects but because it's needed on the
// stack when the struct is used in WalkRuleTree. // stack when the struct is used in WalkRuleTree.
nsCSSValue mLang; nsCSSValue mLang;
// temp fix for bug 24000 // temp fix for bug 24000
nsCSSValue mBreakBefore; nsCSSValue mBreakBefore;
nsCSSValue mBreakAfter; nsCSSValue mBreakAfter;
@ -420,6 +421,7 @@ struct nsCSSUserInterface : public nsCSSStruct { // NEW
nsCSSValue mResizer; nsCSSValue mResizer;
nsCSSValueList* mCursor; nsCSSValueList* mCursor;
nsCSSValue mForceBrokenImageIcon;
}; };
struct nsCSSAural : public nsCSSStruct { // NEW struct nsCSSAural : public nsCSSStruct { // NEW

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

@ -2406,6 +2406,9 @@ MapUIForDeclaration(nsCSSDeclaration* aDecl, const nsStyleStructID& aID, nsCSSUs
if (aUI.mResizer.GetUnit() == eCSSUnit_Null && ourUI->mResizer.GetUnit() != eCSSUnit_Null) if (aUI.mResizer.GetUnit() == eCSSUnit_Null && ourUI->mResizer.GetUnit() != eCSSUnit_Null)
aUI.mResizer = ourUI->mResizer; aUI.mResizer = ourUI->mResizer;
if (aUI.mForceBrokenImageIcon.GetUnit() == eCSSUnit_Null && ourUI->mForceBrokenImageIcon.GetUnit() == eCSSUnit_Integer)
aUI.mForceBrokenImageIcon = ourUI->mForceBrokenImageIcon;
} }
return NS_OK; return NS_OK;

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

@ -163,6 +163,7 @@ CSS_PROP(font-stretch, font_stretch, REFLOW)
CSS_PROP(font-style, font_style, REFLOW) CSS_PROP(font-style, font_style, REFLOW)
CSS_PROP(font-variant, font_variant, REFLOW) CSS_PROP(font-variant, font_variant, REFLOW)
CSS_PROP(font-weight, font_weight, REFLOW) CSS_PROP(font-weight, font_weight, REFLOW)
CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, FRAMECHANGE) // bug 58646
CSS_PROP(height, height, REFLOW) CSS_PROP(height, height, REFLOW)
CSS_PROP(-moz-image-region, image_region, REFLOW) CSS_PROP(-moz-image-region, image_region, REFLOW)
CSS_PROP(-x-image-region-bottom, image_region_bottom, REFLOW) CSS_PROP(-x-image-region-bottom, image_region_bottom, REFLOW)

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

@ -1092,6 +1092,7 @@ struct nsStyleUIReset: public nsStyleStruct {
PRUint8 mUserSelect; // [reset] (selection-style) PRUint8 mUserSelect; // [reset] (selection-style)
PRUnichar mKeyEquivalent; // [reset] XXX what type should this be? PRUnichar mKeyEquivalent; // [reset] XXX what type should this be?
PRUint8 mResizer; // [reset] PRUint8 mResizer; // [reset]
PRUint8 mForceBrokenImageIcon; // [reset] (0 if not forcing, otherwise forcing)
}; };
struct nsStyleUserInterface: public nsStyleStruct { struct nsStyleUserInterface: public nsStyleStruct {

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

@ -1389,6 +1389,7 @@ nsStyleUIReset::nsStyleUIReset(void)
mUserSelect = NS_STYLE_USER_SELECT_AUTO; mUserSelect = NS_STYLE_USER_SELECT_AUTO;
mKeyEquivalent = PRUnichar(0); // XXX what type should this be? mKeyEquivalent = PRUnichar(0); // XXX what type should this be?
mResizer = NS_STYLE_RESIZER_AUTO; mResizer = NS_STYLE_RESIZER_AUTO;
mForceBrokenImageIcon = 0;
} }
nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
@ -1396,6 +1397,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
mUserSelect = aSource.mUserSelect; mUserSelect = aSource.mUserSelect;
mKeyEquivalent = aSource.mKeyEquivalent; mKeyEquivalent = aSource.mKeyEquivalent;
mResizer = aSource.mResizer; mResizer = aSource.mResizer;
mForceBrokenImageIcon = aSource.mForceBrokenImageIcon;
} }
nsStyleUIReset::~nsStyleUIReset(void) nsStyleUIReset::~nsStyleUIReset(void)
@ -1404,8 +1406,9 @@ nsStyleUIReset::~nsStyleUIReset(void)
PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const
{ {
if (mResizer == aOther.mResizer) { if (mForceBrokenImageIcon == aOther.mForceBrokenImageIcon) {
if (mUserSelect == aOther.mUserSelect) { if (mResizer == aOther.mResizer &&
mUserSelect == aOther.mUserSelect) {
if (mKeyEquivalent == aOther.mKeyEquivalent) { if (mKeyEquivalent == aOther.mKeyEquivalent) {
return NS_STYLE_HINT_NONE; return NS_STYLE_HINT_NONE;
} }
@ -1413,6 +1416,5 @@ PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const
} }
return NS_STYLE_HINT_VISUAL; return NS_STYLE_HINT_VISUAL;
} }
return NS_STYLE_HINT_FRAMECHANGE;
return NS_STYLE_HINT_VISUAL;
} }

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

@ -110,3 +110,6 @@ span[-moz-smiley="s7"] {
background-image: url(chrome://editor/content/images/undecided_n.gif); background-image: url(chrome://editor/content/images/undecided_n.gif);
} }
img {
-moz-force-broken-image-icon: 1;
}

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

@ -114,6 +114,12 @@
#define NS_ICON_LOADING_IMAGE (0) #define NS_ICON_LOADING_IMAGE (0)
#define NS_ICON_BROKEN_IMAGE (1) #define NS_ICON_BROKEN_IMAGE (1)
// sizes (pixels) for image icon, padding and border frame
#define ICON_SIZE (16)
#define ICON_PADDING (3)
#define ALT_BORDER_WIDTH (1)
// Default alignment value (so we can tell an unset value from a set value) // Default alignment value (so we can tell an unset value from a set value)
#define ALIGN_UNSET PRUint8(-1) #define ALIGN_UNSET PRUint8(-1)
@ -653,7 +659,7 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext *
mContent->GetAttr(kNameSpaceID_HTML, nsHTMLAtoms::usemap, usemap); mContent->GetAttr(kNameSpaceID_HTML, nsHTMLAtoms::usemap, usemap);
if (usemap.IsEmpty()) { if (usemap.IsEmpty()) {
// check if we want to honor the ALT text in the IMG frame, or let the preShell make it into inline text // check if we want to honor the ALT text in the IMG frame, or let the preShell make it into inline text
// - if QuirksMode, and the IMG has a size, then render the ALT text in the ING frame // - if QuirksMode, and the IMG has a size, then render the ALT text in the IMG frame
// UNLESS there is a pref set to force inline alt text // UNLESS there is a pref set to force inline alt text
PRBool useSizedBox = PR_FALSE; PRBool useSizedBox = PR_FALSE;
PRBool prefForceInlineAltText = mIconLoad ? mIconLoad->mPrefForceInlineAltText : PR_FALSE; PRBool prefForceInlineAltText = mIconLoad ? mIconLoad->mPrefForceInlineAltText : PR_FALSE;
@ -667,11 +673,24 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext *
nsCompatibility mode; nsCompatibility mode;
aPresContext->GetCompatibilityMode(&mode); aPresContext->GetCompatibilityMode(&mode);
// wrap it all up // check for being in Composer: if we are, we always show the size-box
useSizedBox = !prefForceInlineAltText && PRBool forceIcon = PR_FALSE;
HaveFixedSize(*stylePosition) &&
mode == eCompatibility_NavQuirks && // check for style property that indicates the icon should always be shown
!mImageBlocked; const nsStyleUIReset* styleData;
GetStyleData(eStyleStruct_UIReset, (const nsStyleStruct*&) styleData);
if (styleData->mForceBrokenImageIcon) {
forceIcon = PR_TRUE;
}
// wrap it all up: use the size box if
// - in editor
// - not forcing inline alt text, have fixed size, in quirks mode, image not blocked
useSizedBox = forceIcon ||
(!prefForceInlineAltText &&
HaveFixedSize(*stylePosition) &&
mode == eCompatibility_NavQuirks &&
!mImageBlocked);
if (!useSizedBox) { if (!useSizedBox) {
// let the presShell handle converting this into the inline alt text frame // let the presShell handle converting this into the inline alt text frame
@ -745,18 +764,39 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext,
// check to see if the size is already known by the image container. // check to see if the size is already known by the image container.
if (mLoads[0].mIntrinsicSize.width == 0 && if (mLoads[0].mIntrinsicSize.width == 0 &&
mLoads[0].mIntrinsicSize.height == 0) { mLoads[0].mIntrinsicSize.height == 0) {
PRBool needMinIconSizing = PR_FALSE;
float p2t;
aPresContext->GetPixelsToTwips(&p2t);
if (mLoads[0].mRequest) { if (mLoads[0].mRequest) {
nsCOMPtr<imgIContainer> con; nsCOMPtr<imgIContainer> con;
mLoads[0].mRequest->GetImage(getter_AddRefs(con)); mLoads[0].mRequest->GetImage(getter_AddRefs(con));
if (con) { if (con) {
float p2t;
nscoord width, height; nscoord width, height;
aPresContext->GetPixelsToTwips(&p2t);
con->GetWidth(&width); con->GetWidth(&width);
con->GetHeight(&height); con->GetHeight(&height);
mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(width, p2t); mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(width, p2t);
mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(height, p2t); mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(height, p2t);
} else {
// no image container, so we may need to synthesize a minimum size for the image icons
needMinIconSizing = PR_TRUE;
}
} else {
// no request, so we may need to synthesize a minimum size for the image icons
needMinIconSizing = PR_TRUE;
}
if (needMinIconSizing) {
// XXX: we need this in composer, but it is also good for general quirks mode to always
// XXX: have room for the icon
// check for quirks mode
nsCompatibility mode;
aPresContext->GetCompatibilityMode(&mode);
if (mode == eCompatibility_NavQuirks) {
// image request is null or image size not known, probably an invalid image specified
// - make the image big enough for the icon (it may not be used if inline alt expansion is used instead)
mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(ICON_SIZE+(2*(ICON_PADDING+ALT_BORDER_WIDTH)), p2t);
mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(ICON_SIZE+(2*(ICON_PADDING+ALT_BORDER_WIDTH)), p2t);
} }
} }
} }
@ -1088,10 +1128,6 @@ struct nsRecessedBorder : public nsStyleBorder {
} }
}; };
#define ICON_SIZE (16)
#define ICON_PADDING (6)
#define ALT_BORDER_WIDTH (1)
void void
nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext, nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext, nsIRenderingContext& aRenderingContext,
@ -1107,6 +1143,12 @@ nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext,
aPresContext->GetScaledPixelsToTwips(&p2t); aPresContext->GetScaledPixelsToTwips(&p2t);
borderEdgeWidth = NSIntPixelsToTwips(ALT_BORDER_WIDTH, p2t); borderEdgeWidth = NSIntPixelsToTwips(ALT_BORDER_WIDTH, p2t);
// if inner area is empty, then make it big enough for at least the icon
if (inner.IsEmpty()){
inner.SizeBy(2*(NSIntPixelsToTwips(ICON_SIZE+ICON_PADDING+ALT_BORDER_WIDTH,p2t)),
2*(NSIntPixelsToTwips(ICON_SIZE+ICON_PADDING+ALT_BORDER_WIDTH,p2t)));
}
// Make sure we have enough room to actually render the border within // Make sure we have enough room to actually render the border within
// our frame bounds // our frame bounds
if ((inner.width < 2 * borderEdgeWidth) || (inner.height < 2 * borderEdgeWidth)) { if ((inner.width < 2 * borderEdgeWidth) || (inner.height < 2 * borderEdgeWidth)) {
@ -1249,6 +1291,7 @@ nsImageFrame::Paint(nsIPresContext* aPresContext,
if (loadStatus & imgIRequest::STATUS_ERROR || !imgCon) { if (loadStatus & imgIRequest::STATUS_ERROR || !imgCon) {
// No image yet, or image load failed. Draw the alt-text and an icon // No image yet, or image load failed. Draw the alt-text and an icon
// indicating the status (unless image is blocked, in which case we show nothing) // indicating the status (unless image is blocked, in which case we show nothing)
#ifndef SUPPRESS_LOADING_ICON #ifndef SUPPRESS_LOADING_ICON
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer && if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer &&
(!mImageBlocked || mIconLoad->mPrefAllImagesBlocked)) { (!mImageBlocked || mIconLoad->mPrefAllImagesBlocked)) {

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

@ -114,6 +114,12 @@
#define NS_ICON_LOADING_IMAGE (0) #define NS_ICON_LOADING_IMAGE (0)
#define NS_ICON_BROKEN_IMAGE (1) #define NS_ICON_BROKEN_IMAGE (1)
// sizes (pixels) for image icon, padding and border frame
#define ICON_SIZE (16)
#define ICON_PADDING (3)
#define ALT_BORDER_WIDTH (1)
// Default alignment value (so we can tell an unset value from a set value) // Default alignment value (so we can tell an unset value from a set value)
#define ALIGN_UNSET PRUint8(-1) #define ALIGN_UNSET PRUint8(-1)
@ -653,7 +659,7 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext *
mContent->GetAttr(kNameSpaceID_HTML, nsHTMLAtoms::usemap, usemap); mContent->GetAttr(kNameSpaceID_HTML, nsHTMLAtoms::usemap, usemap);
if (usemap.IsEmpty()) { if (usemap.IsEmpty()) {
// check if we want to honor the ALT text in the IMG frame, or let the preShell make it into inline text // check if we want to honor the ALT text in the IMG frame, or let the preShell make it into inline text
// - if QuirksMode, and the IMG has a size, then render the ALT text in the ING frame // - if QuirksMode, and the IMG has a size, then render the ALT text in the IMG frame
// UNLESS there is a pref set to force inline alt text // UNLESS there is a pref set to force inline alt text
PRBool useSizedBox = PR_FALSE; PRBool useSizedBox = PR_FALSE;
PRBool prefForceInlineAltText = mIconLoad ? mIconLoad->mPrefForceInlineAltText : PR_FALSE; PRBool prefForceInlineAltText = mIconLoad ? mIconLoad->mPrefForceInlineAltText : PR_FALSE;
@ -667,11 +673,24 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext *
nsCompatibility mode; nsCompatibility mode;
aPresContext->GetCompatibilityMode(&mode); aPresContext->GetCompatibilityMode(&mode);
// wrap it all up // check for being in Composer: if we are, we always show the size-box
useSizedBox = !prefForceInlineAltText && PRBool forceIcon = PR_FALSE;
HaveFixedSize(*stylePosition) &&
mode == eCompatibility_NavQuirks && // check for style property that indicates the icon should always be shown
!mImageBlocked; const nsStyleUIReset* styleData;
GetStyleData(eStyleStruct_UIReset, (const nsStyleStruct*&) styleData);
if (styleData->mForceBrokenImageIcon) {
forceIcon = PR_TRUE;
}
// wrap it all up: use the size box if
// - in editor
// - not forcing inline alt text, have fixed size, in quirks mode, image not blocked
useSizedBox = forceIcon ||
(!prefForceInlineAltText &&
HaveFixedSize(*stylePosition) &&
mode == eCompatibility_NavQuirks &&
!mImageBlocked);
if (!useSizedBox) { if (!useSizedBox) {
// let the presShell handle converting this into the inline alt text frame // let the presShell handle converting this into the inline alt text frame
@ -745,18 +764,39 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext,
// check to see if the size is already known by the image container. // check to see if the size is already known by the image container.
if (mLoads[0].mIntrinsicSize.width == 0 && if (mLoads[0].mIntrinsicSize.width == 0 &&
mLoads[0].mIntrinsicSize.height == 0) { mLoads[0].mIntrinsicSize.height == 0) {
PRBool needMinIconSizing = PR_FALSE;
float p2t;
aPresContext->GetPixelsToTwips(&p2t);
if (mLoads[0].mRequest) { if (mLoads[0].mRequest) {
nsCOMPtr<imgIContainer> con; nsCOMPtr<imgIContainer> con;
mLoads[0].mRequest->GetImage(getter_AddRefs(con)); mLoads[0].mRequest->GetImage(getter_AddRefs(con));
if (con) { if (con) {
float p2t;
nscoord width, height; nscoord width, height;
aPresContext->GetPixelsToTwips(&p2t);
con->GetWidth(&width); con->GetWidth(&width);
con->GetHeight(&height); con->GetHeight(&height);
mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(width, p2t); mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(width, p2t);
mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(height, p2t); mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(height, p2t);
} else {
// no image container, so we may need to synthesize a minimum size for the image icons
needMinIconSizing = PR_TRUE;
}
} else {
// no request, so we may need to synthesize a minimum size for the image icons
needMinIconSizing = PR_TRUE;
}
if (needMinIconSizing) {
// XXX: we need this in composer, but it is also good for general quirks mode to always
// XXX: have room for the icon
// check for quirks mode
nsCompatibility mode;
aPresContext->GetCompatibilityMode(&mode);
if (mode == eCompatibility_NavQuirks) {
// image request is null or image size not known, probably an invalid image specified
// - make the image big enough for the icon (it may not be used if inline alt expansion is used instead)
mLoads[0].mIntrinsicSize.width = NSIntPixelsToTwips(ICON_SIZE+(2*(ICON_PADDING+ALT_BORDER_WIDTH)), p2t);
mLoads[0].mIntrinsicSize.height = NSIntPixelsToTwips(ICON_SIZE+(2*(ICON_PADDING+ALT_BORDER_WIDTH)), p2t);
} }
} }
} }
@ -1088,10 +1128,6 @@ struct nsRecessedBorder : public nsStyleBorder {
} }
}; };
#define ICON_SIZE (16)
#define ICON_PADDING (6)
#define ALT_BORDER_WIDTH (1)
void void
nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext, nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext, nsIRenderingContext& aRenderingContext,
@ -1107,6 +1143,12 @@ nsImageFrame::DisplayAltFeedback(nsIPresContext* aPresContext,
aPresContext->GetScaledPixelsToTwips(&p2t); aPresContext->GetScaledPixelsToTwips(&p2t);
borderEdgeWidth = NSIntPixelsToTwips(ALT_BORDER_WIDTH, p2t); borderEdgeWidth = NSIntPixelsToTwips(ALT_BORDER_WIDTH, p2t);
// if inner area is empty, then make it big enough for at least the icon
if (inner.IsEmpty()){
inner.SizeBy(2*(NSIntPixelsToTwips(ICON_SIZE+ICON_PADDING+ALT_BORDER_WIDTH,p2t)),
2*(NSIntPixelsToTwips(ICON_SIZE+ICON_PADDING+ALT_BORDER_WIDTH,p2t)));
}
// Make sure we have enough room to actually render the border within // Make sure we have enough room to actually render the border within
// our frame bounds // our frame bounds
if ((inner.width < 2 * borderEdgeWidth) || (inner.height < 2 * borderEdgeWidth)) { if ((inner.width < 2 * borderEdgeWidth) || (inner.height < 2 * borderEdgeWidth)) {
@ -1249,6 +1291,7 @@ nsImageFrame::Paint(nsIPresContext* aPresContext,
if (loadStatus & imgIRequest::STATUS_ERROR || !imgCon) { if (loadStatus & imgIRequest::STATUS_ERROR || !imgCon) {
// No image yet, or image load failed. Draw the alt-text and an icon // No image yet, or image load failed. Draw the alt-text and an icon
// indicating the status (unless image is blocked, in which case we show nothing) // indicating the status (unless image is blocked, in which case we show nothing)
#ifndef SUPPRESS_LOADING_ICON #ifndef SUPPRESS_LOADING_ICON
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer && if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer &&
(!mImageBlocked || mIconLoad->mPrefAllImagesBlocked)) { (!mImageBlocked || mIconLoad->mPrefAllImagesBlocked)) {

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

@ -946,7 +946,8 @@ nsCSSUserInterface::nsCSSUserInterface(const nsCSSUserInterface& aCopy)
mKeyEquivalent(nsnull), mKeyEquivalent(nsnull),
mUserFocus(aCopy.mUserFocus), mUserFocus(aCopy.mUserFocus),
mResizer(aCopy.mResizer), mResizer(aCopy.mResizer),
mCursor(nsnull) mCursor(nsnull),
mForceBrokenImageIcon(aCopy.mForceBrokenImageIcon)
{ {
MOZ_COUNT_CTOR(nsCSSUserInterface); MOZ_COUNT_CTOR(nsCSSUserInterface);
CSS_IF_COPY(mCursor, nsCSSValueList); CSS_IF_COPY(mCursor, nsCSSValueList);
@ -988,7 +989,9 @@ void nsCSSUserInterface::List(FILE* out, PRInt32 aIndent) const
cursor->mValue.AppendToString(buffer, eCSSProperty_cursor); cursor->mValue.AppendToString(buffer, eCSSProperty_cursor);
cursor = cursor->mNext; cursor = cursor->mNext;
} }
mForceBrokenImageIcon.AppendToString(buffer,eCSSProperty_force_broken_image_icon);
fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out); fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out);
} }
#endif #endif
@ -1894,7 +1897,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_ENSURE(UserInterface) { CSS_ENSURE(UserInterface) {
switch (aProperty) { switch (aProperty) {
case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break; case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break;
@ -1914,7 +1918,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
CSS_IF_DELETE(theUserInterface->mCursor->mNext); CSS_IF_DELETE(theUserInterface->mCursor->mNext);
} }
break; break;
case eCSSProperty_force_broken_image_icon: theUserInterface->mForceBrokenImageIcon = aValue; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }
@ -4567,7 +4572,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_VARONSTACK_GET(UserInterface); CSS_VARONSTACK_GET(UserInterface);
if (nsnull != theUserInterface) { if (nsnull != theUserInterface) {
switch (aProperty) { switch (aProperty) {
@ -4586,7 +4592,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
aValue = theUserInterface->mCursor->mValue; aValue = theUserInterface->mCursor->mValue;
} }
break; break;
case eCSSProperty_force_broken_image_icon: aValue = theUserInterface->mForceBrokenImageIcon; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }

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

@ -240,6 +240,7 @@ struct nsCSSDisplay : public nsCSSStruct {
// in nsCSSDeclaration objects but because it's needed on the // in nsCSSDeclaration objects but because it's needed on the
// stack when the struct is used in WalkRuleTree. // stack when the struct is used in WalkRuleTree.
nsCSSValue mLang; nsCSSValue mLang;
// temp fix for bug 24000 // temp fix for bug 24000
nsCSSValue mBreakBefore; nsCSSValue mBreakBefore;
nsCSSValue mBreakAfter; nsCSSValue mBreakAfter;
@ -420,6 +421,7 @@ struct nsCSSUserInterface : public nsCSSStruct { // NEW
nsCSSValue mResizer; nsCSSValue mResizer;
nsCSSValueList* mCursor; nsCSSValueList* mCursor;
nsCSSValue mForceBrokenImageIcon;
}; };
struct nsCSSAural : public nsCSSStruct { // NEW struct nsCSSAural : public nsCSSStruct { // NEW

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

@ -3760,6 +3760,8 @@ PRBool CSSParserImpl::ParseSingleValueProperty(PRInt32& aErrorCode,
case eCSSProperty_height: case eCSSProperty_height:
case eCSSProperty_width: case eCSSProperty_width:
return ParsePositiveVariant(aErrorCode, aValue, VARIANT_AHLP, nsnull); return ParsePositiveVariant(aErrorCode, aValue, VARIANT_AHLP, nsnull);
case eCSSProperty_force_broken_image_icon:
return ParsePositiveVariant(aErrorCode, aValue, VARIANT_INTEGER, nsnull);
case eCSSProperty_caption_side: case eCSSProperty_caption_side:
return ParseVariant(aErrorCode, aValue, VARIANT_HK, return ParseVariant(aErrorCode, aValue, VARIANT_HK,
nsCSSProps::kCaptionSideKTable); nsCSSProps::kCaptionSideKTable);

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

@ -163,6 +163,7 @@ CSS_PROP(font-stretch, font_stretch, REFLOW)
CSS_PROP(font-style, font_style, REFLOW) CSS_PROP(font-style, font_style, REFLOW)
CSS_PROP(font-variant, font_variant, REFLOW) CSS_PROP(font-variant, font_variant, REFLOW)
CSS_PROP(font-weight, font_weight, REFLOW) CSS_PROP(font-weight, font_weight, REFLOW)
CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, FRAMECHANGE) // bug 58646
CSS_PROP(height, height, REFLOW) CSS_PROP(height, height, REFLOW)
CSS_PROP(-moz-image-region, image_region, REFLOW) CSS_PROP(-moz-image-region, image_region, REFLOW)
CSS_PROP(-x-image-region-bottom, image_region_bottom, REFLOW) CSS_PROP(-x-image-region-bottom, image_region_bottom, REFLOW)

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

@ -946,7 +946,8 @@ nsCSSUserInterface::nsCSSUserInterface(const nsCSSUserInterface& aCopy)
mKeyEquivalent(nsnull), mKeyEquivalent(nsnull),
mUserFocus(aCopy.mUserFocus), mUserFocus(aCopy.mUserFocus),
mResizer(aCopy.mResizer), mResizer(aCopy.mResizer),
mCursor(nsnull) mCursor(nsnull),
mForceBrokenImageIcon(aCopy.mForceBrokenImageIcon)
{ {
MOZ_COUNT_CTOR(nsCSSUserInterface); MOZ_COUNT_CTOR(nsCSSUserInterface);
CSS_IF_COPY(mCursor, nsCSSValueList); CSS_IF_COPY(mCursor, nsCSSValueList);
@ -988,7 +989,9 @@ void nsCSSUserInterface::List(FILE* out, PRInt32 aIndent) const
cursor->mValue.AppendToString(buffer, eCSSProperty_cursor); cursor->mValue.AppendToString(buffer, eCSSProperty_cursor);
cursor = cursor->mNext; cursor = cursor->mNext;
} }
mForceBrokenImageIcon.AppendToString(buffer,eCSSProperty_force_broken_image_icon);
fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out); fputs(NS_LossyConvertUCS2toASCII(buffer).get(), out);
} }
#endif #endif
@ -1894,7 +1897,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_ENSURE(UserInterface) { CSS_ENSURE(UserInterface) {
switch (aProperty) { switch (aProperty) {
case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break; case eCSSProperty_user_input: theUserInterface->mUserInput = aValue; break;
@ -1914,7 +1918,8 @@ nsCSSDeclaration::AppendValue(nsCSSProperty aProperty, const nsCSSValue& aValue)
CSS_IF_DELETE(theUserInterface->mCursor->mNext); CSS_IF_DELETE(theUserInterface->mCursor->mNext);
} }
break; break;
case eCSSProperty_force_broken_image_icon: theUserInterface->mForceBrokenImageIcon = aValue; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }
@ -4567,7 +4572,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
case eCSSProperty_key_equivalent: case eCSSProperty_key_equivalent:
case eCSSProperty_user_focus: case eCSSProperty_user_focus:
case eCSSProperty_resizer: case eCSSProperty_resizer:
case eCSSProperty_cursor: { case eCSSProperty_cursor:
case eCSSProperty_force_broken_image_icon: {
CSS_VARONSTACK_GET(UserInterface); CSS_VARONSTACK_GET(UserInterface);
if (nsnull != theUserInterface) { if (nsnull != theUserInterface) {
switch (aProperty) { switch (aProperty) {
@ -4586,7 +4592,8 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, nsCSSValue& aValue)
aValue = theUserInterface->mCursor->mValue; aValue = theUserInterface->mCursor->mValue;
} }
break; break;
case eCSSProperty_force_broken_image_icon: aValue = theUserInterface->mForceBrokenImageIcon; break;
CSS_BOGUS_DEFAULT; // make compiler happy CSS_BOGUS_DEFAULT; // make compiler happy
} }
} }

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

@ -240,6 +240,7 @@ struct nsCSSDisplay : public nsCSSStruct {
// in nsCSSDeclaration objects but because it's needed on the // in nsCSSDeclaration objects but because it's needed on the
// stack when the struct is used in WalkRuleTree. // stack when the struct is used in WalkRuleTree.
nsCSSValue mLang; nsCSSValue mLang;
// temp fix for bug 24000 // temp fix for bug 24000
nsCSSValue mBreakBefore; nsCSSValue mBreakBefore;
nsCSSValue mBreakAfter; nsCSSValue mBreakAfter;
@ -420,6 +421,7 @@ struct nsCSSUserInterface : public nsCSSStruct { // NEW
nsCSSValue mResizer; nsCSSValue mResizer;
nsCSSValueList* mCursor; nsCSSValueList* mCursor;
nsCSSValue mForceBrokenImageIcon;
}; };
struct nsCSSAural : public nsCSSStruct { // NEW struct nsCSSAural : public nsCSSStruct { // NEW

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

@ -2406,6 +2406,9 @@ MapUIForDeclaration(nsCSSDeclaration* aDecl, const nsStyleStructID& aID, nsCSSUs
if (aUI.mResizer.GetUnit() == eCSSUnit_Null && ourUI->mResizer.GetUnit() != eCSSUnit_Null) if (aUI.mResizer.GetUnit() == eCSSUnit_Null && ourUI->mResizer.GetUnit() != eCSSUnit_Null)
aUI.mResizer = ourUI->mResizer; aUI.mResizer = ourUI->mResizer;
if (aUI.mForceBrokenImageIcon.GetUnit() == eCSSUnit_Null && ourUI->mForceBrokenImageIcon.GetUnit() == eCSSUnit_Integer)
aUI.mForceBrokenImageIcon = ourUI->mForceBrokenImageIcon;
} }
return NS_OK; return NS_OK;

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

@ -940,7 +940,8 @@ static const PropertyCheckData UserInterfaceCheckProperties[] = {
static const PropertyCheckData UIResetCheckProperties[] = { static const PropertyCheckData UIResetCheckProperties[] = {
CHECKDATA_PROP(nsCSSUserInterface, mUserSelect, CHECKDATA_VALUE, PR_FALSE), CHECKDATA_PROP(nsCSSUserInterface, mUserSelect, CHECKDATA_VALUE, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mResizer, CHECKDATA_VALUE, PR_FALSE), CHECKDATA_PROP(nsCSSUserInterface, mResizer, CHECKDATA_VALUE, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mKeyEquivalent, CHECKDATA_VALUELIST, PR_FALSE) CHECKDATA_PROP(nsCSSUserInterface, mKeyEquivalent, CHECKDATA_VALUELIST, PR_FALSE),
CHECKDATA_PROP(nsCSSUserInterface, mForceBrokenImageIcon, CHECKDATA_VALUE, PR_FALSE)
}; };
#ifdef INCLUDE_XUL #ifdef INCLUDE_XUL
@ -2760,6 +2761,11 @@ nsRuleNode::ComputeUIResetData(nsStyleStruct* aStartData, const nsCSSStruct& aDa
ui->mResizer = parentUI->mResizer; ui->mResizer = parentUI->mResizer;
} }
// force-broken-image-icons: integer
if (eCSSUnit_Integer == uiData.mForceBrokenImageIcon.GetUnit()) {
ui->mForceBrokenImageIcon = uiData.mForceBrokenImageIcon.GetIntValue();
}
if (inherited) if (inherited)
// We inherited, and therefore can't be cached in the rule node. We have to be put right on the // We inherited, and therefore can't be cached in the rule node. We have to be put right on the
// style context. // style context.

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

@ -1389,6 +1389,7 @@ nsStyleUIReset::nsStyleUIReset(void)
mUserSelect = NS_STYLE_USER_SELECT_AUTO; mUserSelect = NS_STYLE_USER_SELECT_AUTO;
mKeyEquivalent = PRUnichar(0); // XXX what type should this be? mKeyEquivalent = PRUnichar(0); // XXX what type should this be?
mResizer = NS_STYLE_RESIZER_AUTO; mResizer = NS_STYLE_RESIZER_AUTO;
mForceBrokenImageIcon = 0;
} }
nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
@ -1396,6 +1397,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
mUserSelect = aSource.mUserSelect; mUserSelect = aSource.mUserSelect;
mKeyEquivalent = aSource.mKeyEquivalent; mKeyEquivalent = aSource.mKeyEquivalent;
mResizer = aSource.mResizer; mResizer = aSource.mResizer;
mForceBrokenImageIcon = aSource.mForceBrokenImageIcon;
} }
nsStyleUIReset::~nsStyleUIReset(void) nsStyleUIReset::~nsStyleUIReset(void)
@ -1404,8 +1406,9 @@ nsStyleUIReset::~nsStyleUIReset(void)
PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const
{ {
if (mResizer == aOther.mResizer) { if (mForceBrokenImageIcon == aOther.mForceBrokenImageIcon) {
if (mUserSelect == aOther.mUserSelect) { if (mResizer == aOther.mResizer &&
mUserSelect == aOther.mUserSelect) {
if (mKeyEquivalent == aOther.mKeyEquivalent) { if (mKeyEquivalent == aOther.mKeyEquivalent) {
return NS_STYLE_HINT_NONE; return NS_STYLE_HINT_NONE;
} }
@ -1413,6 +1416,5 @@ PRInt32 nsStyleUIReset::CalcDifference(const nsStyleUIReset& aOther) const
} }
return NS_STYLE_HINT_VISUAL; return NS_STYLE_HINT_VISUAL;
} }
return NS_STYLE_HINT_FRAMECHANGE;
return NS_STYLE_HINT_VISUAL;
} }

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

@ -1092,6 +1092,7 @@ struct nsStyleUIReset: public nsStyleStruct {
PRUint8 mUserSelect; // [reset] (selection-style) PRUint8 mUserSelect; // [reset] (selection-style)
PRUnichar mKeyEquivalent; // [reset] XXX what type should this be? PRUnichar mKeyEquivalent; // [reset] XXX what type should this be?
PRUint8 mResizer; // [reset] PRUint8 mResizer; // [reset]
PRUint8 mForceBrokenImageIcon; // [reset] (0 if not forcing, otherwise forcing)
}; };
struct nsStyleUserInterface: public nsStyleStruct { struct nsStyleUserInterface: public nsStyleStruct {