summaryrefslogtreecommitdiffstats
path: root/dom/svg/SVGStringList.h
blob: cedf42aa60599c5769a19526efe32921dcd892cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* -*- 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 DOM_SVG_SVGSTRINGLIST_H_
#define DOM_SVG_SVGSTRINGLIST_H_

#include "nsDebug.h"
#include "nsTArray.h"
#include "nsString.h"  // IWYU pragma: keep

namespace mozilla {

namespace dom {
class DOMSVGStringList;
}

/**
 *
 * The DOM wrapper class for this class is DOMSVGStringList.
 */
class SVGStringList {
  friend class dom::DOMSVGStringList;

 public:
  SVGStringList() : mIsSet(false), mIsCommaSeparated(false) {}
  ~SVGStringList() = default;

  void SetIsCommaSeparated(bool aIsCommaSeparated) {
    mIsCommaSeparated = aIsCommaSeparated;
  }
  nsresult SetValue(const nsAString& aValue);

  void Clear() {
    mStrings.Clear();
    mIsSet = false;
  }

  /// This may return an incomplete string on OOM, but that's acceptable.
  void GetValue(nsAString& aValue) const;

  bool IsEmpty() const { return mStrings.IsEmpty(); }

  uint32_t Length() const { return mStrings.Length(); }

  const nsAString& operator[](uint32_t aIndex) const {
    return mStrings[aIndex];
  }

  bool operator==(const SVGStringList& rhs) const {
    return mStrings == rhs.mStrings;
  }

  bool SetCapacity(uint32_t size) {
    return mStrings.SetCapacity(size, fallible);
  }

  void Compact() { mStrings.Compact(); }

  // Returns true if the value of this stringlist has been explicitly
  // set by markup or a DOM call, false otherwise.
  bool IsExplicitlySet() const { return mIsSet; }

  // Access to methods that can modify objects of this type is deliberately
  // limited. This is to reduce the chances of someone modifying objects of
  // this type without taking the necessary steps to keep DOM wrappers in sync.
  // If you need wider access to these methods, consider adding a method to
  // DOMSVGAnimatedStringList and having that class act as an intermediary so it
  // can take care of keeping DOM wrappers in sync.

 protected:
  /**
   * This may fail on OOM if the internal capacity needs to be increased, in
   * which case the list will be left unmodified.
   */
  nsresult CopyFrom(const SVGStringList& rhs);

  nsAString& operator[](uint32_t aIndex) { return mStrings[aIndex]; }

  /**
   * This may fail (return false) on OOM if the internal capacity is being
   * increased, in which case the list will be left unmodified.
   */
  bool SetLength(uint32_t aStringOfItems) {
    return mStrings.SetLength(aStringOfItems, fallible);
  }

 private:
  // Marking the following private only serves to show which methods are only
  // used by our friend classes (as opposed to our subclasses) - it doesn't
  // really provide additional safety.

  bool InsertItem(uint32_t aIndex, const nsAString& aString) {
    if (aIndex >= mStrings.Length()) {
      aIndex = mStrings.Length();
    }
    if (mStrings.InsertElementAt(aIndex, aString, fallible)) {
      mIsSet = true;
      return true;
    }
    return false;
  }

  void ReplaceItem(uint32_t aIndex, const nsAString& aString) {
    MOZ_ASSERT(aIndex < mStrings.Length(),
               "DOM wrapper caller should have raised INDEX_SIZE_ERR");
    mStrings[aIndex] = aString;
  }

  void RemoveItem(uint32_t aIndex) {
    MOZ_ASSERT(aIndex < mStrings.Length(),
               "DOM wrapper caller should have raised INDEX_SIZE_ERR");
    mStrings.RemoveElementAt(aIndex);
  }

  bool AppendItem(const nsAString& aString) {
    if (mStrings.AppendElement(aString, fallible)) {
      mIsSet = true;
      return true;
    }
    return false;
  }

 protected:
  /* See SVGLengthList for the rationale for using FallibleTArray<float> instead
   * of FallibleTArray<float, 1>.
   */
  FallibleTArray<nsString> mStrings;
  bool mIsSet;
  bool mIsCommaSeparated;
};

}  // namespace mozilla

#endif  // DOM_SVG_SVGSTRINGLIST_H_