Commit b9289ab6 authored by Boris Chiou's avatar Boris Chiou
Browse files

Bug 1676782 - Part 3: Add CSSScrollTimelineRule for CSSOM. r=emilio

Implement CSSScrollTimelineRule CSSOM API.
https://drafts.csswg.org/scroll-animations-1/#the-css-scroll-timeline-rule-interface

We rely on the CSSOM API for testing. However, the wpt doesn't match the
current spec and it has some errors. We update the wpt and enable the
preference for testing in the next patch.

Differential Revision: https://phabricator.services.mozilla.com/D125766
parent 63df6026
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * The origin of this IDL file is
 * https://drafts.csswg.org/scroll-animations-1/#scrolltimeline-interface
 */

[Exposed=Window, Pref="layout.css.scroll-linked-animations.enabled"]
interface CSSScrollTimelineRule : CSSRule {
  readonly attribute DOMString name;
  readonly attribute DOMString source;
  readonly attribute DOMString orientation;
  readonly attribute DOMString scrollOffsets;
};
+1 −0
Original line number Diff line number Diff line
@@ -485,6 +485,7 @@ WEBIDL_FILES = [
    "CSSPseudoElement.webidl",
    "CSSRule.webidl",
    "CSSRuleList.webidl",
    "CSSScrollTimelineRule.webidl",
    "CSSStyleDeclaration.webidl",
    "CSSStyleRule.webidl",
    "CSSStyleSheet.webidl",
+2 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ void ServoStyleRuleMap::RuleRemoved(StyleSheet& aStyleSheet,
    case StyleCssRuleType::CounterStyle:
    case StyleCssRuleType::FontFeatureValues:
    case StyleCssRuleType::Viewport:
    case StyleCssRuleType::ScrollTimeline:
      break;
  }
}
@@ -141,6 +142,7 @@ void ServoStyleRuleMap::FillTableFromRule(css::Rule& aRule) {
    case StyleCssRuleType::CounterStyle:
    case StyleCssRuleType::FontFeatureValues:
    case StyleCssRuleType::Viewport:
    case StyleCssRuleType::ScrollTimeline:
      break;
  }
}
+70 −0
Original line number Diff line number Diff line
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/dom/CSSScrollTimelineRule.h"
#include "mozilla/dom/CSSScrollTimelineRuleBinding.h"
#include "mozilla/ServoBindings.h"

namespace mozilla::dom {

void CSSScrollTimelineRule::SetRawAfterClone(
    RefPtr<RawServoScrollTimelineRule> aRaw) {
  mRawRule = std::move(aRaw);
}

StyleCssRuleType CSSScrollTimelineRule::Type() const {
  return StyleCssRuleType::ScrollTimeline;
}

/* virtual */
void CSSScrollTimelineRule::GetCssText(nsACString& aCssText) const {
  Servo_ScrollTimelineRule_GetCssText(mRawRule, &aCssText);
}

void CSSScrollTimelineRule::GetName(nsAString& aName) const {
  nsAtom* name = Servo_ScrollTimelineRule_GetName(mRawRule);
  name->ToString(aName);
}

void CSSScrollTimelineRule::GetSource(nsString& aSource) const {
  Servo_ScrollTimelineRule_GetSource(mRawRule, &aSource);
}

void CSSScrollTimelineRule::GetOrientation(nsString& aOrientation) const {
  Servo_ScrollTimelineRule_GetOrientation(mRawRule, &aOrientation);
}

void CSSScrollTimelineRule::GetScrollOffsets(nsString& aScrollOffsets) const {
  Servo_ScrollTimelineRule_GetScrollOffsets(mRawRule, &aScrollOffsets);
}

bool CSSScrollTimelineRule::IsCCLeaf() const { return Rule::IsCCLeaf(); }

/* virtual */
size_t CSSScrollTimelineRule::SizeOfIncludingThis(
    MallocSizeOf aMallocSizeOf) const {
  return aMallocSizeOf(this);
}

/* virtual */
JSObject* CSSScrollTimelineRule::WrapObject(JSContext* aCx,
                                            JS::Handle<JSObject*> aGivenProto) {
  return CSSScrollTimelineRule_Binding::Wrap(aCx, this, aGivenProto);
}

#ifdef DEBUG
/* virtual */
void CSSScrollTimelineRule::List(FILE* out, int32_t aIndent) const {
  nsAutoCString str;
  for (int32_t i = 0; i < aIndent; i++) {
    str.AppendLiteral("  ");
  }
  Servo_ScrollTimelineRule_Debug(mRawRule, &str);
  fprintf_stderr(out, "%s\n", str.get());
}
#endif

}  // namespace mozilla::dom
+54 −0
Original line number Diff line number Diff line
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_CSSScrollTimelineRule_h
#define mozilla_dom_CSSScrollTimelineRule_h

#include "mozilla/css/Rule.h"

namespace mozilla::dom {

class CSSScrollTimelineRule final : public css::Rule {
 public:
  CSSScrollTimelineRule(RefPtr<RawServoScrollTimelineRule> aRawRule,
                        StyleSheet* aSheet, css::Rule* aParentRule,
                        uint32_t aLine, uint32_t aColumn)
      : css::Rule(aSheet, aParentRule, aLine, aColumn),
        mRawRule(std::move(aRawRule)) {}

  const RawServoScrollTimelineRule* Raw() const { return mRawRule; }
  void SetRawAfterClone(RefPtr<RawServoScrollTimelineRule> aRaw);

  StyleCssRuleType Type() const final;
  // WebIDL interface: CSSRule
  void GetCssText(nsACString& aCssText) const final;

  // WebIDL interface: CSSScrollTimelineRule
  void GetName(nsAString& aName) const;
  void GetSource(nsString& aSource) const;
  void GetOrientation(nsString& aOrientation) const;
  void GetScrollOffsets(nsString& aScrollOffsets) const;

  // Methods of mozilla::css::Rule
  bool IsCCLeaf() const final;
  size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const final;

  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) final;

#ifdef DEBUG
  void List(FILE* out = stdout, int32_t aIndent = 0) const final;
#endif

 private:
  virtual ~CSSScrollTimelineRule() = default;
  CSSScrollTimelineRule(const CSSScrollTimelineRule&) = delete;

  RefPtr<RawServoScrollTimelineRule> mRawRule;
};

}  // namespace mozilla::dom

#endif  // mozilla_dom_CSSScrollTimelineRule_h
Loading