tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DOMSVGAngle.cpp (4036B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "DOMSVGAngle.h"
      8 
      9 #include "SVGAnimatedOrient.h"
     10 #include "mozilla/dom/SVGAngleBinding.h"
     11 #include "mozilla/dom/SVGSVGElement.h"
     12 
     13 namespace mozilla::dom {
     14 
     15 NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(DOMSVGAngle, mSVGElement)
     16 
     17 DOMSVGAngle::DOMSVGAngle(SVGSVGElement* aSVGElement)
     18    : mSVGElement(aSVGElement), mType(AngleType::CreatedValue) {
     19  mVal = new SVGAnimatedOrient();
     20  mVal->Init();
     21 }
     22 
     23 JSObject* DOMSVGAngle::WrapObject(JSContext* aCx,
     24                                  JS::Handle<JSObject*> aGivenProto) {
     25  return SVGAngle_Binding::Wrap(aCx, this, aGivenProto);
     26 }
     27 
     28 uint16_t DOMSVGAngle::UnitType() const {
     29  uint16_t unitType;
     30  if (mType == AngleType::AnimValue) {
     31    mSVGElement->FlushAnimations();
     32    unitType = mVal->mAnimValUnit;
     33  } else {
     34    unitType = mVal->mBaseValUnit;
     35  }
     36  return SVGAnimatedOrient::IsValidUnitType(unitType)
     37             ? unitType
     38             : SVGAngle_Binding::SVG_ANGLETYPE_UNKNOWN;
     39 }
     40 
     41 float DOMSVGAngle::Value() const {
     42  if (mType == AngleType::AnimValue) {
     43    mSVGElement->FlushAnimations();
     44    return mVal->GetAnimValue();
     45  }
     46  return mVal->GetBaseValue();
     47 }
     48 
     49 void DOMSVGAngle::SetValue(float aValue, ErrorResult& aRv) {
     50  if (mType == AngleType::AnimValue) {
     51    aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
     52    return;
     53  }
     54  bool isBaseVal = mType == AngleType::BaseValue;
     55  mVal->SetBaseValue(aValue, mVal->mBaseValUnit,
     56                     isBaseVal ? mSVGElement.get() : nullptr, isBaseVal);
     57 }
     58 
     59 float DOMSVGAngle::ValueInSpecifiedUnits() const {
     60  if (mType == AngleType::AnimValue) {
     61    return mVal->mAnimVal;
     62  }
     63  return mVal->mBaseVal;
     64 }
     65 
     66 void DOMSVGAngle::SetValueInSpecifiedUnits(float aValue, ErrorResult& aRv) {
     67  if (mType == AngleType::AnimValue) {
     68    aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
     69    return;
     70  }
     71  if (mType == AngleType::BaseValue) {
     72    mVal->SetBaseValueInSpecifiedUnits(aValue, mSVGElement);
     73  } else {
     74    mVal->mBaseVal = aValue;
     75  }
     76 }
     77 
     78 void DOMSVGAngle::NewValueSpecifiedUnits(uint16_t aUnitType,
     79                                         float aValueInSpecifiedUnits,
     80                                         ErrorResult& aRv) {
     81  if (mType == AngleType::AnimValue) {
     82    aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
     83    return;
     84  }
     85  if (!SVGAnimatedOrient::IsValidUnitType(aUnitType)) {
     86    aRv.ThrowNotSupportedError("Unknown unit type");
     87    return;
     88  }
     89  mVal->NewValueSpecifiedUnits(
     90      aUnitType, aValueInSpecifiedUnits,
     91      mType == AngleType::BaseValue ? mSVGElement.get() : nullptr);
     92 }
     93 
     94 void DOMSVGAngle::ConvertToSpecifiedUnits(uint16_t aUnitType,
     95                                          ErrorResult& aRv) {
     96  if (mType == AngleType::AnimValue) {
     97    aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
     98    return;
     99  }
    100  if (!SVGAnimatedOrient::IsValidUnitType(aUnitType)) {
    101    aRv.ThrowNotSupportedError("Unknown unit type");
    102    return;
    103  }
    104  mVal->ConvertToSpecifiedUnits(
    105      aUnitType, mType == AngleType::BaseValue ? mSVGElement.get() : nullptr);
    106 }
    107 
    108 void DOMSVGAngle::SetValueAsString(const nsAString& aValue, ErrorResult& aRv) {
    109  if (mType == AngleType::AnimValue) {
    110    aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
    111    return;
    112  }
    113  bool isBaseVal = mType == AngleType::BaseValue;
    114  aRv = mVal->SetBaseValueString(
    115      aValue, isBaseVal ? mSVGElement.get() : nullptr, isBaseVal);
    116 }
    117 
    118 void DOMSVGAngle::GetValueAsString(nsAString& aValue) {
    119  if (mType == AngleType::AnimValue) {
    120    mSVGElement->FlushAnimations();
    121    mVal->GetAnimAngleValueString(aValue);
    122  } else {
    123    mVal->GetBaseAngleValueString(aValue);
    124  }
    125 }
    126 
    127 }  // namespace mozilla::dom