Line data Source code
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 : /*
8 : * Implementation of DOMTokenList specified by HTML5.
9 : */
10 :
11 : #ifndef nsDOMTokenList_h___
12 : #define nsDOMTokenList_h___
13 :
14 : #include "nsCOMPtr.h"
15 : #include "nsContentUtils.h"
16 : #include "nsDOMString.h"
17 : #include "nsWhitespaceTokenizer.h"
18 : #include "nsWrapperCache.h"
19 : #include "mozilla/dom/Element.h"
20 : #include "mozilla/dom/BindingDeclarations.h"
21 : #include "mozilla/dom/DOMTokenListSupportedTokens.h"
22 :
23 : namespace mozilla {
24 : class ErrorResult;
25 :
26 : } // namespace mozilla
27 :
28 : class nsAttrValue;
29 : class nsIAtom;
30 :
31 : // nsISupports must be on the primary inheritance chain
32 :
33 : class nsDOMTokenList : public nsISupports,
34 : public nsWrapperCache
35 : {
36 : protected:
37 : typedef mozilla::dom::Element Element;
38 : typedef nsWhitespaceTokenizerTemplate<nsContentUtils::IsHTMLWhitespace>
39 : WhitespaceTokenizer;
40 :
41 : public:
42 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
43 144 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsDOMTokenList)
44 :
45 : nsDOMTokenList(Element* aElement, nsIAtom* aAttrAtom,
46 : const mozilla::dom::DOMTokenListSupportedTokenArray = nullptr);
47 :
48 : virtual JSObject* WrapObject(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;
49 :
50 8 : Element* GetParentObject()
51 : {
52 8 : return mElement;
53 : }
54 :
55 : void RemoveDuplicates(const nsAttrValue* aAttr);
56 : uint32_t Length();
57 0 : void Item(uint32_t aIndex, nsAString& aResult)
58 : {
59 : bool found;
60 0 : IndexedGetter(aIndex, found, aResult);
61 0 : if (!found) {
62 0 : SetDOMStringToNull(aResult);
63 : }
64 0 : }
65 : void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aResult);
66 : bool Contains(const nsAString& aToken);
67 : void Add(const nsAString& aToken, mozilla::ErrorResult& aError);
68 : void Add(const nsTArray<nsString>& aTokens,
69 : mozilla::ErrorResult& aError);
70 : void Remove(const nsAString& aToken, mozilla::ErrorResult& aError);
71 : void Remove(const nsTArray<nsString>& aTokens,
72 : mozilla::ErrorResult& aError);
73 : void Replace(const nsAString& aToken,
74 : const nsAString& aNewToken,
75 : mozilla::ErrorResult& aError);
76 : bool Toggle(const nsAString& aToken,
77 : const mozilla::dom::Optional<bool>& force,
78 : mozilla::ErrorResult& aError);
79 : bool Supports(const nsAString& aToken,
80 : mozilla::ErrorResult& aError);
81 :
82 0 : void GetValue(nsAString& aResult) { Stringify(aResult); }
83 : void SetValue(const nsAString& aValue, mozilla::ErrorResult& rv);
84 : void Stringify(nsAString& aResult);
85 :
86 : protected:
87 : virtual ~nsDOMTokenList();
88 :
89 : nsresult CheckToken(const nsAString& aStr);
90 : nsresult CheckTokens(const nsTArray<nsString>& aStr);
91 : void RemoveDuplicatesInternal(nsTArray<nsCOMPtr<nsIAtom>>* aArray,
92 : uint32_t aStart);
93 : void AddInternal(const nsAttrValue* aAttr,
94 : const nsTArray<nsString>& aTokens);
95 : void RemoveInternal(const nsAttrValue* aAttr,
96 : const nsTArray<nsString>& aTokens);
97 : void ReplaceInternal(const nsAttrValue* aAttr,
98 : const nsAString& aToken,
99 : const nsAString& aNewToken);
100 : inline const nsAttrValue* GetParsedAttr();
101 :
102 : nsCOMPtr<Element> mElement;
103 : nsCOMPtr<nsIAtom> mAttrAtom;
104 : const mozilla::dom::DOMTokenListSupportedTokenArray mSupportedTokens;
105 : };
106 :
107 : #endif // nsDOMTokenList_h___
|