Bug 1363596 part 2 - Add support for symbols() function. r=heycam draft
authorXidorn Quan <me@upsuper.org>
Thu, 25 May 2017 19:52:55 +1000
changeset 585622 7eccc8ee6a73c9756c58989dd1e408361dedf74f
parent 585621 f8256885e1be8bc2523d705b10fe1796c64c4ccd
child 585623 63bcc72798a08d33e47dc359212a4dba82a39475
push id61148
push userxquan@mozilla.com
push dateSat, 27 May 2017 10:48:14 +0000
reviewersheycam
bugs1363596
milestone55.0a1
Bug 1363596 part 2 - Add support for symbols() function. r=heycam MozReview-Commit-ID: IuFnhkdWG3C
js/src/devtools/rootAnalysis/analyzeHeapWrites.js
layout/reftests/counter-style/reftest.list
layout/style/CounterStyleManager.cpp
layout/style/CounterStyleManager.h
layout/style/ServoBindings.cpp
layout/style/ServoBindings.h
layout/style/test/stylo-failures.md
--- a/js/src/devtools/rootAnalysis/analyzeHeapWrites.js
+++ b/js/src/devtools/rootAnalysis/analyzeHeapWrites.js
@@ -142,16 +142,17 @@ function treatAsSafeArgument(entry, varN
         ["Gecko_SetNodeFlags", "aNode", null],
         ["Gecko_UnsetNodeFlags", "aNode", null],
 
         // Various Servo binding out parameters. This is a mess and there needs
         // to be a way to indicate which params are out parameters, either using
         // an attribute or a naming convention.
         ["Gecko_CopyFontFamilyFrom", "dst", null],
         ["Gecko_SetCounterStyleToName", "aPtr", null],
+        ["Gecko_SetCounterStyleToSymbols", "aPtr", null],
         ["Gecko_CopyCounterStyle", "aDst", null],
         ["Gecko_SetMozBinding", "aDisplay", null],
         [/ClassOrClassList/, /aClass/, null],
         ["Gecko_GetAtomAsUTF16", "aLength", null],
         ["Gecko_CopyMozBindingFrom", "aDest", null],
         ["Gecko_SetNullImageValue", "aImage", null],
         ["Gecko_SetGradientImageValue", "aImage", null],
         ["Gecko_SetImageOrientation", "aVisibility", null],
--- a/layout/reftests/counter-style/reftest.list
+++ b/layout/reftests/counter-style/reftest.list
@@ -26,10 +26,10 @@ fails-if(webrender) == descriptor-range-
 fails-if(webrender) == descriptor-pad-invalid.html      descriptor-pad-invalid-ref.html
 fails-if(webrender) == descriptor-fallback.html         descriptor-fallback-ref.html
 fails-if(webrender) == descriptor-symbols-invalid.html  descriptor-symbols-invalid-ref.html
 == name-case-sensitivity.html       name-case-sensitivity-ref.html
 fails-if(webrender) == dependent-builtin.html           dependent-builtin-ref.html
 == redefine-builtin.html            redefine-builtin-ref.html
 == redefine-attr-mapping.html       redefine-attr-mapping-ref.html
 == disclosure-styles.html           disclosure-styles-ref.html
-fails-if(styloVsGecko) == symbols-function.html            symbols-function-ref.html
+== symbols-function.html            symbols-function-ref.html
 == symbols-function-invalid.html    symbols-function-invalid-ref.html
--- a/layout/style/CounterStyleManager.cpp
+++ b/layout/style/CounterStyleManager.cpp
@@ -1696,26 +1696,41 @@ AnonymousCounterStyle::AnonymousCounterS
   : CounterStyle(NS_STYLE_LIST_STYLE_CUSTOM)
   , mSingleString(true)
   , mSystem(NS_STYLE_COUNTER_SYSTEM_CYCLIC)
 {
   mSymbols.SetCapacity(1);
   mSymbols.AppendElement(aContent);
 }
 
+static nsTArray<nsString>
+CollectSymbolsFromCSSValueList(const nsCSSValueList* aList)
+{
+  nsTArray<nsString> symbols;
+  for (const nsCSSValueList* item = aList; item; item = item->mNext) {
+    item->mValue.GetStringValue(*symbols.AppendElement());
+  }
+  symbols.Compact();
+  return symbols;
+}
+
 AnonymousCounterStyle::AnonymousCounterStyle(const nsCSSValue::Array* aParams)
+  : AnonymousCounterStyle(
+      aParams->Item(0).GetIntValue(),
+      CollectSymbolsFromCSSValueList(aParams->Item(1).GetListValue()))
+{
+}
+
+AnonymousCounterStyle::AnonymousCounterStyle(uint8_t aSystem,
+                                             nsTArray<nsString> aSymbols)
   : CounterStyle(NS_STYLE_LIST_STYLE_CUSTOM)
   , mSingleString(false)
-  , mSystem(aParams->Item(0).GetIntValue())
+  , mSystem(aSystem)
+  , mSymbols(Move(aSymbols))
 {
-  for (const nsCSSValueList* item = aParams->Item(1).GetListValue();
-       item; item = item->mNext) {
-    item->mValue.GetStringValue(*mSymbols.AppendElement());
-  }
-  mSymbols.Compact();
 }
 
 /* virtual */ void
 AnonymousCounterStyle::GetStyleName(nsAString& aResult)
 {
   aResult.Truncate();
 }
 
--- a/layout/style/CounterStyleManager.h
+++ b/layout/style/CounterStyleManager.h
@@ -99,16 +99,17 @@ public:
 protected:
   int32_t mStyle;
 };
 
 class AnonymousCounterStyle final : public CounterStyle
 {
 public:
   explicit AnonymousCounterStyle(const nsSubstring& aContent);
+  AnonymousCounterStyle(uint8_t aSystem, nsTArray<nsString> aSymbols);
   explicit AnonymousCounterStyle(const nsCSSValue::Array* aValue);
 
   virtual void GetStyleName(nsAString& aResult) override;
   virtual void GetPrefix(nsAString& aResult) override;
   virtual void GetSuffix(nsAString& aResult) override;
   virtual bool IsBullet() override;
 
   virtual void GetNegative(NegativeType& aResult) override;
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -1160,16 +1160,28 @@ Gecko_CopyImageOrientationFrom(nsStyleVi
 
 void
 Gecko_SetCounterStyleToName(CounterStylePtr* aPtr, nsIAtom* aName)
 {
   *aPtr = already_AddRefed<nsIAtom>(aName);
 }
 
 void
+Gecko_SetCounterStyleToSymbols(CounterStylePtr* aPtr, uint8_t aSymbolsType,
+                               nsACString const* const* aSymbols,
+                               uint32_t aSymbolsCount)
+{
+  nsTArray<nsString> symbols(aSymbolsCount);
+  for (uint32_t i = 0; i < aSymbolsCount; i++) {
+    symbols.AppendElement(NS_ConvertUTF8toUTF16(*aSymbols[i]));
+  }
+  *aPtr = new AnonymousCounterStyle(aSymbolsType, Move(symbols));
+}
+
+void
 Gecko_CopyCounterStyle(CounterStylePtr* aDst, const CounterStylePtr* aSrc)
 {
   *aDst = *aSrc;
 }
 
 already_AddRefed<css::URLValue>
 ServoBundledURI::IntoCssUrl()
 {
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -271,16 +271,20 @@ void Gecko_SetImageOrientation(nsStyleVi
                                bool aFlip);
 void Gecko_SetImageOrientationAsFromImage(nsStyleVisibility* aVisibility);
 void Gecko_CopyImageOrientationFrom(nsStyleVisibility* aDst,
                                     const nsStyleVisibility* aSrc);
 
 // Counter style.
 // This function takes an already addrefed nsIAtom
 void Gecko_SetCounterStyleToName(mozilla::CounterStylePtr* ptr, nsIAtom* name);
+void Gecko_SetCounterStyleToSymbols(mozilla::CounterStylePtr* ptr,
+                                    uint8_t symbols_type,
+                                    nsACString const* const* symbols,
+                                    uint32_t symbols_count);
 void Gecko_CopyCounterStyle(mozilla::CounterStylePtr* dst,
                             const mozilla::CounterStylePtr* src);
 
 // background-image style.
 void Gecko_SetNullImageValue(nsStyleImage* image);
 void Gecko_SetGradientImageValue(nsStyleImage* image, nsStyleGradient* gradient);
 NS_DECL_THREADSAFE_FFI_REFCOUNTING(mozilla::css::ImageValue, ImageValue);
 mozilla::css::ImageValue* Gecko_ImageValue_Create(ServoBundledURI aURI);
--- a/layout/style/test/stylo-failures.md
+++ b/layout/style/test/stylo-failures.md
@@ -48,19 +48,18 @@ to mochitest command.
 * console support bug 1352669
   * test_bug413958.html `monitorConsole` [3]
   * test_parser_diagnostics_unprintables.html [550]
 * Transition support:
   * test_transitions.html: pseudo elements [4]
   * test_transitions_and_reframes.html `pseudo-element`: bug 1366422 [4]
   * Events:
     * test_animations_event_order.html [2]
-* symbols() function and string value on list-style-type bug 1363596
-  * test_value_storage.html `symbols(` [30]
-  * ... `list-style-type` [8]
+* string value on list-style-type bug 1363596
+  * test_value_storage.html `list-style-type` [8]
   * ... `'list-style'` [18]
 * Unimplemented \@font-face descriptors:
   * test_font_face_parser.html `font-language-override`: bug 1355364 [8]
 * keyword values should be preserved in \@font-face bug 1355368
   * test_font_face_parser.html `font-weight` [4]
   * test_font_loading_api.html `weight` [1]
 * @namespace support:
   * test_namespace_rule.html: bug 1355715 [6]