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 : #ifndef mozilla_dom_HTMLLinkElement_h
8 : #define mozilla_dom_HTMLLinkElement_h
9 :
10 : #include "mozilla/Attributes.h"
11 : #include "mozilla/dom/Link.h"
12 : #include "nsGenericHTMLElement.h"
13 : #include "nsIDOMHTMLLinkElement.h"
14 : #include "nsStyleLinkElement.h"
15 :
16 : namespace mozilla {
17 : class EventChainPostVisitor;
18 : class EventChainPreVisitor;
19 : namespace dom {
20 :
21 : class HTMLLinkElement final : public nsGenericHTMLElement,
22 : public nsIDOMHTMLLinkElement,
23 : public nsStyleLinkElement,
24 : public Link
25 : {
26 : public:
27 : explicit HTMLLinkElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
28 :
29 : // nsISupports
30 : NS_DECL_ISUPPORTS_INHERITED
31 :
32 : // CC
33 0 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLLinkElement,
34 : nsGenericHTMLElement)
35 :
36 : // nsIDOMHTMLLinkElement
37 : NS_DECL_NSIDOMHTMLLINKELEMENT
38 :
39 : // DOM memory reporter participant
40 : NS_DECL_SIZEOF_EXCLUDING_THIS
41 :
42 : void LinkAdded();
43 : void LinkRemoved();
44 :
45 : // nsIDOMEventTarget
46 : virtual nsresult GetEventTargetParent(
47 : EventChainPreVisitor& aVisitor) override;
48 : virtual nsresult PostHandleEvent(
49 : EventChainPostVisitor& aVisitor) override;
50 :
51 : // nsINode
52 : virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult,
53 : bool aPreallocateChildren) const override;
54 : virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
55 :
56 : // nsIContent
57 : virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
58 : nsIContent* aBindingParent,
59 : bool aCompileEventHandlers) override;
60 : virtual void UnbindFromTree(bool aDeep = true,
61 : bool aNullParent = true) override;
62 : virtual nsresult BeforeSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
63 : const nsAttrValueOrString* aValue,
64 : bool aNotify) override;
65 : virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
66 : const nsAttrValue* aValue,
67 : const nsAttrValue* aOldValue,
68 : bool aNotify) override;
69 : virtual bool IsLink(nsIURI** aURI) const override;
70 : virtual already_AddRefed<nsIURI> GetHrefURI() const override;
71 :
72 : // Element
73 : virtual bool ParseAttribute(int32_t aNamespaceID,
74 : nsIAtom* aAttribute,
75 : const nsAString& aValue,
76 : nsAttrValue& aResult) override;
77 : virtual void GetLinkTarget(nsAString& aTarget) override;
78 : virtual EventStates IntrinsicState() const override;
79 :
80 : void CreateAndDispatchEvent(nsIDocument* aDoc, const nsAString& aEventName);
81 :
82 : virtual void OnDNSPrefetchDeferred() override;
83 : virtual void OnDNSPrefetchRequested() override;
84 : virtual bool HasDeferredDNSPrefetchRequest() override;
85 :
86 : // WebIDL
87 : bool Disabled();
88 : void SetDisabled(bool aDisabled);
89 : // XPCOM GetHref is fine.
90 0 : void SetHref(const nsAString& aHref, ErrorResult& aRv)
91 : {
92 0 : SetHTMLAttr(nsGkAtoms::href, aHref, aRv);
93 0 : }
94 0 : void GetCrossOrigin(nsAString& aResult)
95 : {
96 : // Null for both missing and invalid defaults is ok, since we
97 : // always parse to an enum value, so we don't need an invalid
98 : // default, and we _want_ the missing default to be null.
99 0 : GetEnumAttr(nsGkAtoms::crossorigin, nullptr, aResult);
100 0 : }
101 0 : void SetCrossOrigin(const nsAString& aCrossOrigin, ErrorResult& aError)
102 : {
103 0 : SetOrRemoveNullableStringAttr(nsGkAtoms::crossorigin, aCrossOrigin, aError);
104 0 : }
105 : // XPCOM GetRel is fine.
106 0 : void SetRel(const nsAString& aRel, ErrorResult& aRv)
107 : {
108 0 : SetHTMLAttr(nsGkAtoms::rel, aRel, aRv);
109 0 : }
110 : nsDOMTokenList* RelList();
111 : // XPCOM GetMedia is fine.
112 0 : void SetMedia(const nsAString& aMedia, ErrorResult& aRv)
113 : {
114 0 : SetHTMLAttr(nsGkAtoms::media, aMedia, aRv);
115 0 : }
116 : // XPCOM GetHreflang is fine.
117 0 : void SetHreflang(const nsAString& aHreflang, ErrorResult& aRv)
118 : {
119 0 : SetHTMLAttr(nsGkAtoms::hreflang, aHreflang, aRv);
120 0 : }
121 : void GetAs(nsAString& aResult);
122 0 : void SetAs(const nsAString& aAs, ErrorResult& aRv)
123 : {
124 0 : SetAttr(nsGkAtoms::as ,aAs, aRv);
125 0 : }
126 0 : nsDOMTokenList* Sizes()
127 : {
128 0 : return GetTokenList(nsGkAtoms::sizes);
129 : }
130 : // XPCOM GetType is fine.
131 0 : void SetType(const nsAString& aType, ErrorResult& aRv)
132 : {
133 0 : SetHTMLAttr(nsGkAtoms::type, aType, aRv);
134 0 : }
135 : // XPCOM GetCharset is fine.
136 0 : void SetCharset(const nsAString& aCharset, ErrorResult& aRv)
137 : {
138 0 : SetHTMLAttr(nsGkAtoms::charset, aCharset, aRv);
139 0 : }
140 : // XPCOM GetRev is fine.
141 0 : void SetRev(const nsAString& aRev, ErrorResult& aRv)
142 : {
143 0 : SetHTMLAttr(nsGkAtoms::rev, aRev, aRv);
144 0 : }
145 : // XPCOM GetTarget is fine.
146 0 : void SetTarget(const nsAString& aTarget, ErrorResult& aRv)
147 : {
148 0 : SetHTMLAttr(nsGkAtoms::target, aTarget, aRv);
149 0 : }
150 0 : void GetIntegrity(nsAString& aIntegrity) const
151 : {
152 0 : GetHTMLAttr(nsGkAtoms::integrity, aIntegrity);
153 0 : }
154 0 : void SetIntegrity(const nsAString& aIntegrity, ErrorResult& aRv)
155 : {
156 0 : SetHTMLAttr(nsGkAtoms::integrity, aIntegrity, aRv);
157 0 : }
158 0 : void SetReferrerPolicy(const nsAString& aReferrer, ErrorResult& aError)
159 : {
160 0 : SetHTMLAttr(nsGkAtoms::referrerpolicy, aReferrer, aError);
161 0 : }
162 0 : void GetReferrerPolicy(nsAString& aReferrer)
163 : {
164 0 : GetEnumAttr(nsGkAtoms::referrerpolicy, EmptyCString().get(), aReferrer);
165 0 : }
166 0 : mozilla::net::ReferrerPolicy GetLinkReferrerPolicy() override
167 : {
168 0 : return GetReferrerPolicyAsEnum();
169 : }
170 :
171 : virtual CORSMode GetCORSMode() const override;
172 :
173 0 : virtual void NodeInfoChanged(nsIDocument* aOldDoc) final override
174 : {
175 0 : ClearHasPendingLinkUpdate();
176 0 : nsGenericHTMLElement::NodeInfoChanged(aOldDoc);
177 0 : }
178 :
179 : protected:
180 : virtual ~HTMLLinkElement();
181 :
182 : // nsStyleLinkElement
183 : virtual already_AddRefed<nsIURI> GetStyleSheetURL(bool* aIsInline) override;
184 : virtual void GetStyleSheetInfo(nsAString& aTitle,
185 : nsAString& aType,
186 : nsAString& aMedia,
187 : bool* aIsScoped,
188 : bool* aIsAlternate) override;
189 : protected:
190 : RefPtr<nsDOMTokenList> mRelList;
191 : };
192 :
193 : } // namespace dom
194 : } // namespace mozilla
195 :
196 : #endif // mozilla_dom_HTMLLinkElement_h
|