diff --git a/mozilla/content/base/src/nsRuleNode.cpp b/mozilla/content/base/src/nsRuleNode.cpp index ccb28d4acfd..bcdd22b9440 100644 --- a/mozilla/content/base/src/nsRuleNode.cpp +++ b/mozilla/content/base/src/nsRuleNode.cpp @@ -2236,20 +2236,24 @@ nsRuleNode::ComputeUserInterfaceData(nsStyleStruct* aStartData, // cursor: enum, auto, url, inherit nsCSSValueList* list = uiData.mCursor; if (nsnull != list) { - // XXX need to deal with multiple URL values - if (eCSSUnit_Enumerated == list->mValue.GetUnit()) { - ui->mCursor = list->mValue.GetIntValue(); - } - else if (eCSSUnit_Auto == list->mValue.GetUnit()) { - ui->mCursor = NS_STYLE_CURSOR_AUTO; - } - else if (eCSSUnit_URL == list->mValue.GetUnit()) { - ui->mCursorImage = list->mValue.GetURLValue(); - } - else if (eCSSUnit_Inherit == list->mValue.GetUnit()) { + if (eCSSUnit_Inherit == list->mValue.GetUnit()) { inherited = PR_TRUE; ui->mCursor = parentUI->mCursor; } + else { + // Since we don't support URL values, just skip them. + // The parser will never create a list that is *all* URL values -- + // that's invalid. + while (list->mValue.GetUnit() == eCSSUnit_URL) + list = list->mNext; + + if (eCSSUnit_Enumerated == list->mValue.GetUnit()) { + ui->mCursor = list->mValue.GetIntValue(); + } + else if (eCSSUnit_Auto == list->mValue.GetUnit()) { + ui->mCursor = NS_STYLE_CURSOR_AUTO; + } + } } // user-input: auto, none, enum, inherit diff --git a/mozilla/content/base/src/nsStyleContext.cpp b/mozilla/content/base/src/nsStyleContext.cpp index 50869b22eeb..bdf22bac0e1 100644 --- a/mozilla/content/base/src/nsStyleContext.cpp +++ b/mozilla/content/base/src/nsStyleContext.cpp @@ -782,12 +782,11 @@ void nsStyleContext::DumpRegressionData(nsIPresContext* aPresContext, FILE* out, // UI IndentBy(out,aIndent); const nsStyleUserInterface* ui = GetStyleUserInterface(); - fprintf(out, "\n", + fprintf(out, "\n", (int)ui->mUserInput, (int)ui->mUserModify, (int)ui->mUserFocus, - (int)ui->mCursor, - URICString(ui->mCursorImage).get()); + (int)ui->mCursor); // UIReset IndentBy(out,aIndent); diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index aa20237c1ac..e6133628d20 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -3158,6 +3158,7 @@ CSSParserImpl::DoTransferTempData(nsCSSDeclaration* aDeclaration, #define VARIANT_AHLP (VARIANT_AH | VARIANT_LP) #define VARIANT_AHI (VARIANT_AH | VARIANT_INTEGER) #define VARIANT_AHK (VARIANT_AH | VARIANT_KEYWORD) +#define VARIANT_AUK (VARIANT_AUTO | VARIANT_URL | VARIANT_KEYWORD) #define VARIANT_AHUK (VARIANT_AH | VARIANT_URL | VARIANT_KEYWORD) #define VARIANT_AHL (VARIANT_AH | VARIANT_LENGTH) #define VARIANT_AHKL (VARIANT_AHK | VARIANT_LENGTH) @@ -4983,53 +4984,35 @@ PRBool CSSParserImpl::ParseCue(nsresult& aErrorCode) PRBool CSSParserImpl::ParseCursor(nsresult& aErrorCode) { - nsCSSValue value; - if (ParseVariant(aErrorCode, value, VARIANT_AHUK, nsCSSProps::kCursorKTable)) { - nsCSSValueList* listHead = new nsCSSValueList(); - nsCSSValueList* list = listHead; - if (nsnull == list) { + nsCSSValueList *list = nsnull; + for (nsCSSValueList **curp = &list, *cur; ; curp = &cur->mNext) { + cur = *curp = new nsCSSValueList(); + if (!cur) { aErrorCode = NS_ERROR_OUT_OF_MEMORY; + delete list; return PR_FALSE; } - list->mValue = value; - if (eCSSUnit_URL == value.GetUnit()) { - while (nsnull != list) { - if (eCSSUnit_URL != value.GetUnit()) { - if (PR_FALSE == ExpectEndProperty(aErrorCode, PR_TRUE)) { - return PR_FALSE; - } - } - if (ExpectEndProperty(aErrorCode, PR_TRUE)) { - mTempData.SetPropertyBit(eCSSProperty_cursor); - mTempData.mUserInterface.mCursor = listHead; - aErrorCode = NS_OK; - return PR_TRUE; - } - if (ParseVariant(aErrorCode, value, VARIANT_AHUK, nsCSSProps::kCursorKTable)) { - list->mNext = new nsCSSValueList(); - list = list->mNext; - if (nsnull != list) { - list->mValue = value; - } - else { - aErrorCode = NS_ERROR_OUT_OF_MEMORY; - } - } - else { - break; - } - } - delete listHead; + if (!ParseVariant(aErrorCode, cur->mValue, + (cur == list) ? VARIANT_AHUK : VARIANT_AUK, + nsCSSProps::kCursorKTable)) { + delete list; return PR_FALSE; } - if (ExpectEndProperty(aErrorCode, PR_TRUE)) { - mTempData.SetPropertyBit(eCSSProperty_cursor); - mTempData.mUserInterface.mCursor = listHead; - aErrorCode = NS_OK; - return PR_TRUE; + if (cur->mValue.GetUnit() != eCSSUnit_URL) + break; + if (!ExpectSymbol(aErrorCode, ',', PR_TRUE)) { + delete list; + return PR_FALSE; } } - return PR_FALSE; + if (!ExpectEndProperty(aErrorCode, PR_TRUE)) { + delete list; + return PR_FALSE; + } + mTempData.SetPropertyBit(eCSSProperty_cursor); + mTempData.mUserInterface.mCursor = list; + aErrorCode = NS_OK; + return PR_TRUE; } diff --git a/mozilla/content/html/style/src/nsComputedDOMStyle.cpp b/mozilla/content/html/style/src/nsComputedDOMStyle.cpp index 97977cb60ff..baa5ca8623c 100644 --- a/mozilla/content/html/style/src/nsComputedDOMStyle.cpp +++ b/mozilla/content/html/style/src/nsComputedDOMStyle.cpp @@ -1812,17 +1812,13 @@ nsComputedDOMStyle::GetCursor(nsIFrame *aFrame, GetStyleData(eStyleStruct_UserInterface, (const nsStyleStruct*&)ui, aFrame); if (ui) { - if (ui->mCursorImage) { - val->SetURI(ui->mCursorImage); + if (ui->mCursor == NS_STYLE_CURSOR_AUTO) { + val->SetIdent(NS_LITERAL_STRING("auto")); } else { - if (ui->mCursor == NS_STYLE_CURSOR_AUTO) { - val->SetIdent(NS_LITERAL_STRING("auto")); - } else { - const nsAFlatCString& cursor = - nsCSSProps::SearchKeywordTable(ui->mCursor, - nsCSSProps::kCursorKTable); - val->SetIdent(cursor); - } + const nsAFlatCString& cursor = + nsCSSProps::SearchKeywordTable(ui->mCursor, + nsCSSProps::kCursorKTable); + val->SetIdent(cursor); } } else { val->SetIdent(NS_LITERAL_STRING("auto")); diff --git a/mozilla/content/shared/public/nsStyleStruct.h b/mozilla/content/shared/public/nsStyleStruct.h index bac4ff25058..a9130f3b11c 100644 --- a/mozilla/content/shared/public/nsStyleStruct.h +++ b/mozilla/content/shared/public/nsStyleStruct.h @@ -1124,8 +1124,7 @@ struct nsStyleUserInterface: public nsStyleStruct { PRUint8 mUserModify; // [inherited] (modify-content) PRUint8 mUserFocus; // [inherited] (auto-select) - PRUint8 mCursor; // [inherited] See nsStyleConsts.h NS_STYLE_CURSOR_* - nsCOMPtr mCursorImage; // [inherited] url string + PRUint8 mCursor; // [inherited] See nsStyleConsts.h }; struct nsStyleXUL : public nsStyleStruct { diff --git a/mozilla/content/shared/src/nsStyleStruct.cpp b/mozilla/content/shared/src/nsStyleStruct.cpp index 4def18b555f..a209a1fb363 100644 --- a/mozilla/content/shared/src/nsStyleStruct.cpp +++ b/mozilla/content/shared/src/nsStyleStruct.cpp @@ -63,6 +63,7 @@ inline PRBool IsFixedUnit(nsStyleUnit aUnit, PRBool aEnumOK) } // XXX this is here to support deprecated calc spacing methods only +// XXXldb Probably shouldn't be inline. inline nscoord CalcSideFor(const nsIFrame* aFrame, const nsStyleCoord& aCoord, PRUint8 aSpacing, PRUint8 aSide, const nscoord* aEnumTable, PRInt32 aNumEnums) @@ -134,6 +135,7 @@ inline nscoord CalcSideFor(const nsIFrame* aFrame, const nsStyleCoord& aCoord, return result; } +// XXXldb Probably shouldn't be inline. inline void CalcSidesFor(const nsIFrame* aFrame, const nsStyleSides& aSides, PRUint8 aSpacing, const nscoord* aEnumTable, PRInt32 aNumEnums, @@ -1347,7 +1349,6 @@ nsStyleUserInterface::nsStyleUserInterface(const nsStyleUserInterface& aSource) mUserFocus = aSource.mUserFocus; mCursor = aSource.mCursor; - mCursorImage = aSource.mCursorImage; } nsStyleUserInterface::~nsStyleUserInterface(void) @@ -1356,8 +1357,7 @@ nsStyleUserInterface::~nsStyleUserInterface(void) nsChangeHint nsStyleUserInterface::CalcDifference(const nsStyleUserInterface& aOther) const { - if ((mCursor != aOther.mCursor) || - !EqualURIs(mCursorImage, aOther.mCursorImage)) + if (mCursor != aOther.mCursor) return NS_STYLE_HINT_VISUAL; if (mUserInput == aOther.mUserInput) { diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index aa20237c1ac..e6133628d20 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -3158,6 +3158,7 @@ CSSParserImpl::DoTransferTempData(nsCSSDeclaration* aDeclaration, #define VARIANT_AHLP (VARIANT_AH | VARIANT_LP) #define VARIANT_AHI (VARIANT_AH | VARIANT_INTEGER) #define VARIANT_AHK (VARIANT_AH | VARIANT_KEYWORD) +#define VARIANT_AUK (VARIANT_AUTO | VARIANT_URL | VARIANT_KEYWORD) #define VARIANT_AHUK (VARIANT_AH | VARIANT_URL | VARIANT_KEYWORD) #define VARIANT_AHL (VARIANT_AH | VARIANT_LENGTH) #define VARIANT_AHKL (VARIANT_AHK | VARIANT_LENGTH) @@ -4983,53 +4984,35 @@ PRBool CSSParserImpl::ParseCue(nsresult& aErrorCode) PRBool CSSParserImpl::ParseCursor(nsresult& aErrorCode) { - nsCSSValue value; - if (ParseVariant(aErrorCode, value, VARIANT_AHUK, nsCSSProps::kCursorKTable)) { - nsCSSValueList* listHead = new nsCSSValueList(); - nsCSSValueList* list = listHead; - if (nsnull == list) { + nsCSSValueList *list = nsnull; + for (nsCSSValueList **curp = &list, *cur; ; curp = &cur->mNext) { + cur = *curp = new nsCSSValueList(); + if (!cur) { aErrorCode = NS_ERROR_OUT_OF_MEMORY; + delete list; return PR_FALSE; } - list->mValue = value; - if (eCSSUnit_URL == value.GetUnit()) { - while (nsnull != list) { - if (eCSSUnit_URL != value.GetUnit()) { - if (PR_FALSE == ExpectEndProperty(aErrorCode, PR_TRUE)) { - return PR_FALSE; - } - } - if (ExpectEndProperty(aErrorCode, PR_TRUE)) { - mTempData.SetPropertyBit(eCSSProperty_cursor); - mTempData.mUserInterface.mCursor = listHead; - aErrorCode = NS_OK; - return PR_TRUE; - } - if (ParseVariant(aErrorCode, value, VARIANT_AHUK, nsCSSProps::kCursorKTable)) { - list->mNext = new nsCSSValueList(); - list = list->mNext; - if (nsnull != list) { - list->mValue = value; - } - else { - aErrorCode = NS_ERROR_OUT_OF_MEMORY; - } - } - else { - break; - } - } - delete listHead; + if (!ParseVariant(aErrorCode, cur->mValue, + (cur == list) ? VARIANT_AHUK : VARIANT_AUK, + nsCSSProps::kCursorKTable)) { + delete list; return PR_FALSE; } - if (ExpectEndProperty(aErrorCode, PR_TRUE)) { - mTempData.SetPropertyBit(eCSSProperty_cursor); - mTempData.mUserInterface.mCursor = listHead; - aErrorCode = NS_OK; - return PR_TRUE; + if (cur->mValue.GetUnit() != eCSSUnit_URL) + break; + if (!ExpectSymbol(aErrorCode, ',', PR_TRUE)) { + delete list; + return PR_FALSE; } } - return PR_FALSE; + if (!ExpectEndProperty(aErrorCode, PR_TRUE)) { + delete list; + return PR_FALSE; + } + mTempData.SetPropertyBit(eCSSProperty_cursor); + mTempData.mUserInterface.mCursor = list; + aErrorCode = NS_OK; + return PR_TRUE; } diff --git a/mozilla/layout/style/nsComputedDOMStyle.cpp b/mozilla/layout/style/nsComputedDOMStyle.cpp index 97977cb60ff..baa5ca8623c 100644 --- a/mozilla/layout/style/nsComputedDOMStyle.cpp +++ b/mozilla/layout/style/nsComputedDOMStyle.cpp @@ -1812,17 +1812,13 @@ nsComputedDOMStyle::GetCursor(nsIFrame *aFrame, GetStyleData(eStyleStruct_UserInterface, (const nsStyleStruct*&)ui, aFrame); if (ui) { - if (ui->mCursorImage) { - val->SetURI(ui->mCursorImage); + if (ui->mCursor == NS_STYLE_CURSOR_AUTO) { + val->SetIdent(NS_LITERAL_STRING("auto")); } else { - if (ui->mCursor == NS_STYLE_CURSOR_AUTO) { - val->SetIdent(NS_LITERAL_STRING("auto")); - } else { - const nsAFlatCString& cursor = - nsCSSProps::SearchKeywordTable(ui->mCursor, - nsCSSProps::kCursorKTable); - val->SetIdent(cursor); - } + const nsAFlatCString& cursor = + nsCSSProps::SearchKeywordTable(ui->mCursor, + nsCSSProps::kCursorKTable); + val->SetIdent(cursor); } } else { val->SetIdent(NS_LITERAL_STRING("auto")); diff --git a/mozilla/layout/style/nsRuleNode.cpp b/mozilla/layout/style/nsRuleNode.cpp index ccb28d4acfd..bcdd22b9440 100644 --- a/mozilla/layout/style/nsRuleNode.cpp +++ b/mozilla/layout/style/nsRuleNode.cpp @@ -2236,20 +2236,24 @@ nsRuleNode::ComputeUserInterfaceData(nsStyleStruct* aStartData, // cursor: enum, auto, url, inherit nsCSSValueList* list = uiData.mCursor; if (nsnull != list) { - // XXX need to deal with multiple URL values - if (eCSSUnit_Enumerated == list->mValue.GetUnit()) { - ui->mCursor = list->mValue.GetIntValue(); - } - else if (eCSSUnit_Auto == list->mValue.GetUnit()) { - ui->mCursor = NS_STYLE_CURSOR_AUTO; - } - else if (eCSSUnit_URL == list->mValue.GetUnit()) { - ui->mCursorImage = list->mValue.GetURLValue(); - } - else if (eCSSUnit_Inherit == list->mValue.GetUnit()) { + if (eCSSUnit_Inherit == list->mValue.GetUnit()) { inherited = PR_TRUE; ui->mCursor = parentUI->mCursor; } + else { + // Since we don't support URL values, just skip them. + // The parser will never create a list that is *all* URL values -- + // that's invalid. + while (list->mValue.GetUnit() == eCSSUnit_URL) + list = list->mNext; + + if (eCSSUnit_Enumerated == list->mValue.GetUnit()) { + ui->mCursor = list->mValue.GetIntValue(); + } + else if (eCSSUnit_Auto == list->mValue.GetUnit()) { + ui->mCursor = NS_STYLE_CURSOR_AUTO; + } + } } // user-input: auto, none, enum, inherit diff --git a/mozilla/layout/style/nsStyleContext.cpp b/mozilla/layout/style/nsStyleContext.cpp index 50869b22eeb..bdf22bac0e1 100644 --- a/mozilla/layout/style/nsStyleContext.cpp +++ b/mozilla/layout/style/nsStyleContext.cpp @@ -782,12 +782,11 @@ void nsStyleContext::DumpRegressionData(nsIPresContext* aPresContext, FILE* out, // UI IndentBy(out,aIndent); const nsStyleUserInterface* ui = GetStyleUserInterface(); - fprintf(out, "\n", + fprintf(out, "\n", (int)ui->mUserInput, (int)ui->mUserModify, (int)ui->mUserFocus, - (int)ui->mCursor, - URICString(ui->mCursorImage).get()); + (int)ui->mCursor); // UIReset IndentBy(out,aIndent); diff --git a/mozilla/layout/style/nsStyleStruct.cpp b/mozilla/layout/style/nsStyleStruct.cpp index 4def18b555f..a209a1fb363 100644 --- a/mozilla/layout/style/nsStyleStruct.cpp +++ b/mozilla/layout/style/nsStyleStruct.cpp @@ -63,6 +63,7 @@ inline PRBool IsFixedUnit(nsStyleUnit aUnit, PRBool aEnumOK) } // XXX this is here to support deprecated calc spacing methods only +// XXXldb Probably shouldn't be inline. inline nscoord CalcSideFor(const nsIFrame* aFrame, const nsStyleCoord& aCoord, PRUint8 aSpacing, PRUint8 aSide, const nscoord* aEnumTable, PRInt32 aNumEnums) @@ -134,6 +135,7 @@ inline nscoord CalcSideFor(const nsIFrame* aFrame, const nsStyleCoord& aCoord, return result; } +// XXXldb Probably shouldn't be inline. inline void CalcSidesFor(const nsIFrame* aFrame, const nsStyleSides& aSides, PRUint8 aSpacing, const nscoord* aEnumTable, PRInt32 aNumEnums, @@ -1347,7 +1349,6 @@ nsStyleUserInterface::nsStyleUserInterface(const nsStyleUserInterface& aSource) mUserFocus = aSource.mUserFocus; mCursor = aSource.mCursor; - mCursorImage = aSource.mCursorImage; } nsStyleUserInterface::~nsStyleUserInterface(void) @@ -1356,8 +1357,7 @@ nsStyleUserInterface::~nsStyleUserInterface(void) nsChangeHint nsStyleUserInterface::CalcDifference(const nsStyleUserInterface& aOther) const { - if ((mCursor != aOther.mCursor) || - !EqualURIs(mCursorImage, aOther.mCursorImage)) + if (mCursor != aOther.mCursor) return NS_STYLE_HINT_VISUAL; if (mUserInput == aOther.mUserInput) { diff --git a/mozilla/layout/style/nsStyleStruct.h b/mozilla/layout/style/nsStyleStruct.h index bac4ff25058..a9130f3b11c 100644 --- a/mozilla/layout/style/nsStyleStruct.h +++ b/mozilla/layout/style/nsStyleStruct.h @@ -1124,8 +1124,7 @@ struct nsStyleUserInterface: public nsStyleStruct { PRUint8 mUserModify; // [inherited] (modify-content) PRUint8 mUserFocus; // [inherited] (auto-select) - PRUint8 mCursor; // [inherited] See nsStyleConsts.h NS_STYLE_CURSOR_* - nsCOMPtr mCursorImage; // [inherited] url string + PRUint8 mCursor; // [inherited] See nsStyleConsts.h }; struct nsStyleXUL : public nsStyleStruct {