# HG changeset patch # User Mina Almasry # Date 1372917495 14400 # Node ID c6581b662933cfa79e455e4565f7a2c9679a2f56 # Parent b9d56a1e0a6166f373b95f0deca5997c3158814f [mq]: bug-877690 diff -r b9d56a1e0a61 -r c6581b662933 gfx/src/nsColor.cpp --- a/gfx/src/nsColor.cpp Thu Apr 11 17:14:38 2013 +0200 +++ b/gfx/src/nsColor.cpp Thu Jul 04 01:58:15 2013 -0400 @@ -217,6 +217,19 @@ return false; } +// Sets *aPcolorNameArray to an array of all possible color names, and +// *aSizeArray to the size of that array +NS_GFX_(bool) NS_AllColorNames(const char * const ** aPColorNameArray, + size_t *aSizeArray) { + if (kColorNames) { + *aPColorNameArray = kColorNames; + *aSizeArray = ArrayLength(kColorNames); + return true; + } else { + return false; + } +} + // Macro to blend two colors // // equivalent to target = (bg*(255-fgalpha) + fg*fgalpha)/255 diff -r b9d56a1e0a61 -r c6581b662933 gfx/src/nsColor.h --- a/gfx/src/nsColor.h Thu Apr 11 17:14:38 2013 +0200 +++ b/gfx/src/nsColor.h Thu Jul 04 01:58:15 2013 -0400 @@ -66,6 +66,11 @@ // otherwise return false. NS_GFX_(bool) NS_ColorNameToRGB(const nsAString& aBuf, nscolor* aResult); +// Sets *aPcolorNameArray to an array of all possible color names, and +// *aSizeArray to the size of that array +NS_GFX_(bool) NS_AllColorNames(const char * const ** aPColorNameArray, + size_t *aSizeArray); + // function to convert from HSL color space to RGB color space // the float parameters are all expected to be in the range 0-1 NS_GFX_(nscolor) NS_HSL2RGB(float h, float s, float l); diff -r b9d56a1e0a61 -r c6581b662933 layout/inspector/public/inIDOMUtils.idl --- a/layout/inspector/public/inIDOMUtils.idl Thu Apr 11 17:14:38 2013 +0200 +++ b/layout/inspector/public/inIDOMUtils.idl Thu Jul 04 01:58:15 2013 -0400 @@ -55,6 +55,10 @@ [optional] out unsigned long aCount, [retval, array, size_is(aCount)] out wstring aProps); + void getCSSValuesForProperty(in AString aProperty, + [optional] out unsigned long aLength, + [array, size_is(aLength), retval] out wstring aValues); + // Utilities for working with CSS colors [implicit_jscontext] jsval colorNameToRGB(in DOMString aColorName); diff -r b9d56a1e0a61 -r c6581b662933 layout/inspector/src/inDOMUtils.cpp --- a/layout/inspector/src/inDOMUtils.cpp Thu Apr 11 17:14:38 2013 +0200 +++ b/layout/inspector/src/inDOMUtils.cpp Thu Jul 04 01:58:15 2013 -0400 @@ -32,6 +32,8 @@ #include "nsRuleProcessorData.h" #include "nsCSSRuleProcessor.h" #include "mozilla/dom/InspectorUtilsBinding.h" +#include "nsCSSProps.h" +#include "nsColor.h" using namespace mozilla; using namespace mozilla::css; @@ -427,6 +429,85 @@ return NS_OK; } +static void GetKeywordsForProperty(const nsCSSProperty aProperty, + nsTArray& aArray) +{ + if (nsCSSProps::IsShorthand(aProperty)) { + // shorthand props have no keywords + return; + } + const int32_t *keywordTable = nsCSSProps::kKeywordTableTable[aProperty]; + if (keywordTable) { + size_t i = 0; + while (nsCSSKeyword(keywordTable[i]) != eCSSKeyword_UNKNOWN) { + nsCSSKeyword word = nsCSSKeyword(keywordTable[i]); + CopyASCIItoUTF16(nsCSSKeywords::GetStringValue(word), + *aArray.AppendElement()); + // increment counter by 2, because in this table every second + // element is a nsCSSKeyword + i += 2; + } + } +} +static void GetColorsForProperty(const nsCSSProperty propertyID, + nsTArray& aArray) +{ + uint32_t propertyParserVariant = nsCSSProps::ParserVariant(propertyID); + if (propertyParserVariant & VARIANT_COLOR) { + const char * const *allColorNames; + size_t size; + NS_AllColorNames(&allColorNames, &size); + for (size_t i = 0; i < size; i++) { + CopyASCIItoUTF16(allColorNames[i], *aArray.AppendElement()); + } + } else { + return; + } +} + +NS_IMETHODIMP +inDOMUtils::GetCSSValuesForProperty(const nsAString& aProperty, + uint32_t* aLength, + PRUnichar*** aValues) +{ + nsCSSProperty propertyID = nsCSSProps::LookupProperty(aProperty, + nsCSSProps::eEnabled); + if (propertyID == eCSSProperty_UNKNOWN) { + return NS_ERROR_FAILURE; + } + + nsTArray array; + + // all CSS properties take initial and inherit + array.AppendElement(NS_LITERAL_STRING("-moz-initial")); + array.AppendElement(NS_LITERAL_STRING("inherit")); + + if (!nsCSSProps::IsShorthand(propertyID)) { + // property is longhand + GetKeywordsForProperty(propertyID, array); + GetColorsForProperty(propertyID, array); + } else { + // property is shorthand + CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(subproperty, propertyID) { + GetKeywordsForProperty(*subproperty, array); + GetColorsForProperty(*subproperty, array); + } + } + + *aLength = array.Length(); + PRUnichar** ret = + static_cast(NS_Alloc(*aLength * sizeof(PRUnichar*))); + + for (uint32_t i = 0; i < *aLength; ++i) { + ret[i] = ToNewUnicode(array[i]); + } + + *aValues = ret; + + return NS_OK; +} + + NS_IMETHODIMP inDOMUtils::ColorNameToRGB(const nsAString& aColorName, JSContext* aCx, JS::Value* aValue) diff -r b9d56a1e0a61 -r c6581b662933 layout/inspector/tests/Makefile.in --- a/layout/inspector/tests/Makefile.in Thu Apr 11 17:14:38 2013 +0200 +++ b/layout/inspector/tests/Makefile.in Thu Jul 04 01:58:15 2013 -0400 @@ -23,6 +23,7 @@ test_bug856317.html \ bug856317.css \ test_isinheritableproperty.html \ + test_bug877690.html \ $(NULL) include $(topsrcdir)/config/rules.mk diff -r b9d56a1e0a61 -r c6581b662933 layout/inspector/tests/test_bug877690.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/inspector/tests/test_bug877690.html Thu Jul 04 01:58:15 2013 -0400 @@ -0,0 +1,454 @@ + + + + + + Test for Bug 877690 + + + + + +Mozilla Bug 877690 +

+ +
+
+ + diff -r b9d56a1e0a61 -r c6581b662933 layout/style/nsCSSParser.cpp --- a/layout/style/nsCSSParser.cpp Thu Apr 11 17:14:38 2013 +0200 +++ b/layout/style/nsCSSParser.cpp Thu Jul 04 01:58:15 2013 -0400 @@ -45,85 +45,6 @@ using namespace mozilla; -// Flags for ParseVariant method -#define VARIANT_KEYWORD 0x000001 // K -#define VARIANT_LENGTH 0x000002 // L -#define VARIANT_PERCENT 0x000004 // P -#define VARIANT_COLOR 0x000008 // C eCSSUnit_Color, eCSSUnit_Ident (e.g. "red") -#define VARIANT_URL 0x000010 // U -#define VARIANT_NUMBER 0x000020 // N -#define VARIANT_INTEGER 0x000040 // I -#define VARIANT_ANGLE 0x000080 // G -#define VARIANT_FREQUENCY 0x000100 // F -#define VARIANT_TIME 0x000200 // T -#define VARIANT_STRING 0x000400 // S -#define VARIANT_COUNTER 0x000800 // -#define VARIANT_ATTR 0x001000 // -#define VARIANT_IDENTIFIER 0x002000 // D -#define VARIANT_IDENTIFIER_NO_INHERIT 0x004000 // like above, but excluding - // 'inherit' and 'initial' -#define VARIANT_AUTO 0x010000 // A -#define VARIANT_INHERIT 0x020000 // H eCSSUnit_Initial, eCSSUnit_Inherit -#define VARIANT_NONE 0x040000 // O -#define VARIANT_NORMAL 0x080000 // M -#define VARIANT_SYSFONT 0x100000 // eCSSUnit_System_Font -#define VARIANT_GRADIENT 0x200000 // eCSSUnit_Gradient -#define VARIANT_TIMING_FUNCTION 0x400000 // cubic-bezier() and steps() -#define VARIANT_ALL 0x800000 // -#define VARIANT_IMAGE_RECT 0x01000000 // eCSSUnit_Function -// This is an extra bit that says that a VARIANT_ANGLE allows unitless zero: -#define VARIANT_ZERO_ANGLE 0x02000000 // unitless zero for angles -#define VARIANT_CALC 0x04000000 // eCSSUnit_Calc -#define VARIANT_ELEMENT 0x08000000 // eCSSUnit_Element -#define VARIANT_POSITIVE_DIMENSION 0x10000000 // Only lengths greater than 0.0 -#define VARIANT_NONNEGATIVE_DIMENSION 0x20000000 // Only lengths greater than or equal to 0.0 - -// Common combinations of variants -#define VARIANT_AL (VARIANT_AUTO | VARIANT_LENGTH) -#define VARIANT_LP (VARIANT_LENGTH | VARIANT_PERCENT) -#define VARIANT_LN (VARIANT_LENGTH | VARIANT_NUMBER) -#define VARIANT_AH (VARIANT_AUTO | VARIANT_INHERIT) -#define VARIANT_AHLP (VARIANT_AH | VARIANT_LP) -#define VARIANT_AHI (VARIANT_AH | VARIANT_INTEGER) -#define VARIANT_AHK (VARIANT_AH | VARIANT_KEYWORD) -#define VARIANT_AHKLP (VARIANT_AHLP | VARIANT_KEYWORD) -#define VARIANT_AHL (VARIANT_AH | VARIANT_LENGTH) -#define VARIANT_AHKL (VARIANT_AHK | VARIANT_LENGTH) -#define VARIANT_HK (VARIANT_INHERIT | VARIANT_KEYWORD) -#define VARIANT_HKF (VARIANT_HK | VARIANT_FREQUENCY) -#define VARIANT_HKI (VARIANT_HK | VARIANT_INTEGER) -#define VARIANT_HKL (VARIANT_HK | VARIANT_LENGTH) -#define VARIANT_HKLP (VARIANT_HK | VARIANT_LP) -#define VARIANT_HKLPO (VARIANT_HKLP | VARIANT_NONE) -#define VARIANT_HL (VARIANT_INHERIT | VARIANT_LENGTH) -#define VARIANT_HI (VARIANT_INHERIT | VARIANT_INTEGER) -#define VARIANT_HLP (VARIANT_HL | VARIANT_PERCENT) -#define VARIANT_HLPN (VARIANT_HLP | VARIANT_NUMBER) -#define VARIANT_HLPO (VARIANT_HLP | VARIANT_NONE) -#define VARIANT_HTP (VARIANT_INHERIT | VARIANT_TIME | VARIANT_PERCENT) -#define VARIANT_HMK (VARIANT_HK | VARIANT_NORMAL) -#define VARIANT_HC (VARIANT_INHERIT | VARIANT_COLOR) -#define VARIANT_HCK (VARIANT_HK | VARIANT_COLOR) -#define VARIANT_HUK (VARIANT_HK | VARIANT_URL) -#define VARIANT_HUO (VARIANT_INHERIT | VARIANT_URL | VARIANT_NONE) -#define VARIANT_AHUO (VARIANT_AUTO | VARIANT_HUO) -#define VARIANT_HPN (VARIANT_INHERIT | VARIANT_PERCENT | VARIANT_NUMBER) -#define VARIANT_PN (VARIANT_PERCENT | VARIANT_NUMBER) -#define VARIANT_ALPN (VARIANT_AL | VARIANT_PN) -#define VARIANT_HN (VARIANT_INHERIT | VARIANT_NUMBER) -#define VARIANT_HON (VARIANT_HN | VARIANT_NONE) -#define VARIANT_HOS (VARIANT_INHERIT | VARIANT_NONE | VARIANT_STRING) -#define VARIANT_LPN (VARIANT_LP | VARIANT_NUMBER) -#define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD) -#define VARIANT_UO (VARIANT_URL | VARIANT_NONE) -#define VARIANT_ANGLE_OR_ZERO (VARIANT_ANGLE | VARIANT_ZERO_ANGLE) -#define VARIANT_LPCALC (VARIANT_LENGTH | VARIANT_CALC | VARIANT_PERCENT) -#define VARIANT_LNCALC (VARIANT_LENGTH | VARIANT_CALC | VARIANT_NUMBER) -#define VARIANT_LPNCALC (VARIANT_LNCALC | VARIANT_PERCENT) -#define VARIANT_IMAGE (VARIANT_URL | VARIANT_NONE | VARIANT_GRADIENT | \ - VARIANT_IMAGE_RECT | VARIANT_ELEMENT) - -// This lives here because it depends on the above macros. const uint32_t nsCSSProps::kParserVariantTable[eCSSProperty_COUNT_no_shorthands] = { #define CSS_PROP(name_, id_, method_, flags_, pref_, parsevariant_, kwtable_, \ @@ -133,8 +54,6 @@ #undef CSS_PROP }; -//---------------------------------------------------------------------- - namespace { // Rule processing function diff -r b9d56a1e0a61 -r c6581b662933 layout/style/nsCSSProps.h --- a/layout/style/nsCSSProps.h Thu Apr 11 17:14:38 2013 +0200 +++ b/layout/style/nsCSSProps.h Thu Jul 04 01:58:15 2013 -0400 @@ -17,6 +17,85 @@ #include "nsStyleStruct.h" #include "nsCSSKeywords.h" +// Flags for ParseVariant method +#define VARIANT_KEYWORD 0x000001 // K +#define VARIANT_LENGTH 0x000002 // L +#define VARIANT_PERCENT 0x000004 // P +#define VARIANT_COLOR 0x000008 // C eCSSUnit_Color, eCSSUnit_Ident (e.g. "red") +#define VARIANT_URL 0x000010 // U +#define VARIANT_NUMBER 0x000020 // N +#define VARIANT_INTEGER 0x000040 // I +#define VARIANT_ANGLE 0x000080 // G +#define VARIANT_FREQUENCY 0x000100 // F +#define VARIANT_TIME 0x000200 // T +#define VARIANT_STRING 0x000400 // S +#define VARIANT_COUNTER 0x000800 // +#define VARIANT_ATTR 0x001000 // +#define VARIANT_IDENTIFIER 0x002000 // D +#define VARIANT_IDENTIFIER_NO_INHERIT 0x004000 // like above, but excluding +// 'inherit' and 'initial' +#define VARIANT_AUTO 0x010000 // A +#define VARIANT_INHERIT 0x020000 // H eCSSUnit_Initial, eCSSUnit_Inherit +#define VARIANT_NONE 0x040000 // O +#define VARIANT_NORMAL 0x080000 // M +#define VARIANT_SYSFONT 0x100000 // eCSSUnit_System_Font +#define VARIANT_GRADIENT 0x200000 // eCSSUnit_Gradient +#define VARIANT_TIMING_FUNCTION 0x400000 // cubic-bezier() and steps() +#define VARIANT_ALL 0x800000 // +#define VARIANT_IMAGE_RECT 0x01000000 // eCSSUnit_Function +// This is an extra bit that says that a VARIANT_ANGLE allows unitless zero: +#define VARIANT_ZERO_ANGLE 0x02000000 // unitless zero for angles +#define VARIANT_CALC 0x04000000 // eCSSUnit_Calc +#define VARIANT_ELEMENT 0x08000000 // eCSSUnit_Element +#define VARIANT_POSITIVE_DIMENSION 0x10000000 // Only lengths greater than 0.0 +#define VARIANT_NONNEGATIVE_DIMENSION 0x20000000 // Only lengths greater than or equal to 0.0 + +// Common combinations of variants +#define VARIANT_AL (VARIANT_AUTO | VARIANT_LENGTH) +#define VARIANT_LP (VARIANT_LENGTH | VARIANT_PERCENT) +#define VARIANT_LN (VARIANT_LENGTH | VARIANT_NUMBER) +#define VARIANT_AH (VARIANT_AUTO | VARIANT_INHERIT) +#define VARIANT_AHLP (VARIANT_AH | VARIANT_LP) +#define VARIANT_AHI (VARIANT_AH | VARIANT_INTEGER) +#define VARIANT_AHK (VARIANT_AH | VARIANT_KEYWORD) +#define VARIANT_AHKLP (VARIANT_AHLP | VARIANT_KEYWORD) +#define VARIANT_AHL (VARIANT_AH | VARIANT_LENGTH) +#define VARIANT_AHKL (VARIANT_AHK | VARIANT_LENGTH) +#define VARIANT_HK (VARIANT_INHERIT | VARIANT_KEYWORD) +#define VARIANT_HKF (VARIANT_HK | VARIANT_FREQUENCY) +#define VARIANT_HKI (VARIANT_HK | VARIANT_INTEGER) +#define VARIANT_HKL (VARIANT_HK | VARIANT_LENGTH) +#define VARIANT_HKLP (VARIANT_HK | VARIANT_LP) +#define VARIANT_HKLPO (VARIANT_HKLP | VARIANT_NONE) +#define VARIANT_HL (VARIANT_INHERIT | VARIANT_LENGTH) +#define VARIANT_HI (VARIANT_INHERIT | VARIANT_INTEGER) +#define VARIANT_HLP (VARIANT_HL | VARIANT_PERCENT) +#define VARIANT_HLPN (VARIANT_HLP | VARIANT_NUMBER) +#define VARIANT_HLPO (VARIANT_HLP | VARIANT_NONE) +#define VARIANT_HTP (VARIANT_INHERIT | VARIANT_TIME | VARIANT_PERCENT) +#define VARIANT_HMK (VARIANT_HK | VARIANT_NORMAL) +#define VARIANT_HC (VARIANT_INHERIT | VARIANT_COLOR) +#define VARIANT_HCK (VARIANT_HK | VARIANT_COLOR) +#define VARIANT_HUK (VARIANT_HK | VARIANT_URL) +#define VARIANT_HUO (VARIANT_INHERIT | VARIANT_URL | VARIANT_NONE) +#define VARIANT_AHUO (VARIANT_AUTO | VARIANT_HUO) +#define VARIANT_HPN (VARIANT_INHERIT | VARIANT_PERCENT | VARIANT_NUMBER) +#define VARIANT_PN (VARIANT_PERCENT | VARIANT_NUMBER) +#define VARIANT_ALPN (VARIANT_AL | VARIANT_PN) +#define VARIANT_HN (VARIANT_INHERIT | VARIANT_NUMBER) +#define VARIANT_HON (VARIANT_HN | VARIANT_NONE) +#define VARIANT_HOS (VARIANT_INHERIT | VARIANT_NONE | VARIANT_STRING) +#define VARIANT_LPN (VARIANT_LP | VARIANT_NUMBER) +#define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD) +#define VARIANT_UO (VARIANT_URL | VARIANT_NONE) +#define VARIANT_ANGLE_OR_ZERO (VARIANT_ANGLE | VARIANT_ZERO_ANGLE) +#define VARIANT_LPCALC (VARIANT_LENGTH | VARIANT_CALC | VARIANT_PERCENT) +#define VARIANT_LNCALC (VARIANT_LENGTH | VARIANT_CALC | VARIANT_NUMBER) +#define VARIANT_LPNCALC (VARIANT_LNCALC | VARIANT_PERCENT) +#define VARIANT_IMAGE (VARIANT_URL | VARIANT_NONE | VARIANT_GRADIENT | \ + VARIANT_IMAGE_RECT | VARIANT_ELEMENT) + + // Flags for the kFlagsTable bitfield (flags_ in nsCSSPropList.h) // A property that is a *-ltr-source or *-rtl-source property for one of