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 {