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_HTMLAnchorElement_h 8 #define mozilla_dom_HTMLAnchorElement_h 9 10 #include "mozilla/Attributes.h" 11 #include "mozilla/dom/Link.h" 12 #include "nsGenericHTMLElement.h" 13 #include "nsDOMTokenList.h" 14 15 namespace mozilla { 16 class EventChainPostVisitor; 17 class EventChainPreVisitor; 18 namespace dom { 19 20 class HTMLAnchorElement final : public nsGenericHTMLElement, public Link { 21 public: 22 using Element::GetText; 23 HTMLAnchorElement(already_AddRefed<mozilla::dom::NodeInfo> && aNodeInfo)24 explicit HTMLAnchorElement( 25 already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo) 26 : nsGenericHTMLElement(std::move(aNodeInfo)), Link(this) {} 27 28 // nsISupports 29 NS_DECL_ISUPPORTS_INHERITED 30 31 // CC 32 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLAnchorElement, 33 nsGenericHTMLElement) 34 35 NS_IMPL_FROMNODE_HTML_WITH_TAG(HTMLAnchorElement, a); 36 37 virtual int32_t TabIndexDefault() override; 38 virtual bool Draggable() const override; 39 40 // Element 41 virtual bool IsInteractiveHTMLContent() const override; 42 43 // DOM memory reporter participant 44 NS_DECL_ADDSIZEOFEXCLUDINGTHIS 45 46 virtual nsresult BindToTree(BindContext&, nsINode& aParent) override; 47 virtual void UnbindFromTree(bool aNullParent = true) override; 48 virtual bool IsHTMLFocusable(bool aWithMouse, bool* aIsFocusable, 49 int32_t* aTabIndex) override; 50 51 void GetEventTargetParent(EventChainPreVisitor& aVisitor) override; 52 MOZ_CAN_RUN_SCRIPT 53 nsresult PostHandleEvent(EventChainPostVisitor& aVisitor) override; 54 virtual bool IsLink(nsIURI** aURI) const override; 55 virtual void GetLinkTarget(nsAString& aTarget) override; 56 virtual already_AddRefed<nsIURI> GetHrefURI() const override; 57 58 virtual nsresult BeforeSetAttr(int32_t aNamespaceID, nsAtom* aName, 59 const nsAttrValueOrString* aValue, 60 bool aNotify) override; 61 virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsAtom* aName, 62 const nsAttrValue* aValue, 63 const nsAttrValue* aOldValue, 64 nsIPrincipal* aSubjectPrincipal, 65 bool aNotify) override; 66 67 virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override; 68 69 virtual EventStates IntrinsicState() const override; 70 71 virtual void OnDNSPrefetchDeferred() override; 72 virtual void OnDNSPrefetchRequested() override; 73 virtual bool HasDeferredDNSPrefetchRequest() override; 74 75 // WebIDL API 76 GetHref(nsAString & aValue)77 void GetHref(nsAString& aValue) { 78 GetURIAttr(nsGkAtoms::href, nullptr, aValue); 79 } SetHref(const nsAString & aValue,mozilla::ErrorResult & rv)80 void SetHref(const nsAString& aValue, mozilla::ErrorResult& rv) { 81 SetHTMLAttr(nsGkAtoms::href, aValue, rv); 82 } 83 void GetTarget(nsAString& aValue); SetTarget(const nsAString & aValue,mozilla::ErrorResult & rv)84 void SetTarget(const nsAString& aValue, mozilla::ErrorResult& rv) { 85 SetHTMLAttr(nsGkAtoms::target, aValue, rv); 86 } GetDownload(DOMString & aValue)87 void GetDownload(DOMString& aValue) { 88 GetHTMLAttr(nsGkAtoms::download, aValue); 89 } SetDownload(const nsAString & aValue,mozilla::ErrorResult & rv)90 void SetDownload(const nsAString& aValue, mozilla::ErrorResult& rv) { 91 SetHTMLAttr(nsGkAtoms::download, aValue, rv); 92 } GetPing(DOMString & aValue)93 void GetPing(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::ping, aValue); } SetPing(const nsAString & aValue,mozilla::ErrorResult & rv)94 void SetPing(const nsAString& aValue, mozilla::ErrorResult& rv) { 95 SetHTMLAttr(nsGkAtoms::ping, aValue, rv); 96 } GetRel(DOMString & aValue)97 void GetRel(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::rel, aValue); } SetRel(const nsAString & aValue,mozilla::ErrorResult & rv)98 void SetRel(const nsAString& aValue, mozilla::ErrorResult& rv) { 99 SetHTMLAttr(nsGkAtoms::rel, aValue, rv); 100 } SetReferrerPolicy(const nsAString & aValue,mozilla::ErrorResult & rv)101 void SetReferrerPolicy(const nsAString& aValue, mozilla::ErrorResult& rv) { 102 SetHTMLAttr(nsGkAtoms::referrerpolicy, aValue, rv); 103 } GetReferrerPolicy(DOMString & aPolicy)104 void GetReferrerPolicy(DOMString& aPolicy) { 105 GetEnumAttr(nsGkAtoms::referrerpolicy, EmptyCString().get(), aPolicy); 106 } 107 nsDOMTokenList* RelList(); GetHreflang(DOMString & aValue)108 void GetHreflang(DOMString& aValue) { 109 GetHTMLAttr(nsGkAtoms::hreflang, aValue); 110 } SetHreflang(const nsAString & aValue,mozilla::ErrorResult & rv)111 void SetHreflang(const nsAString& aValue, mozilla::ErrorResult& rv) { 112 SetHTMLAttr(nsGkAtoms::hreflang, aValue, rv); 113 } 114 // Needed for docshell GetType(nsAString & aValue)115 void GetType(nsAString& aValue) { GetHTMLAttr(nsGkAtoms::type, aValue); } GetType(DOMString & aValue)116 void GetType(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::type, aValue); } SetType(const nsAString & aValue,mozilla::ErrorResult & rv)117 void SetType(const nsAString& aValue, mozilla::ErrorResult& rv) { 118 SetHTMLAttr(nsGkAtoms::type, aValue, rv); 119 } 120 void GetText(nsAString& aValue, mozilla::ErrorResult& rv); 121 void SetText(const nsAString& aValue, mozilla::ErrorResult& rv); 122 123 // Link::GetOrigin is OK for us 124 125 // Link::GetProtocol is OK for us 126 // Link::SetProtocol is OK for us 127 128 // Link::GetUsername is OK for us 129 // Link::SetUsername is OK for us 130 131 // Link::GetPassword is OK for us 132 // Link::SetPassword is OK for us 133 134 // Link::Link::GetHost is OK for us 135 // Link::Link::SetHost is OK for us 136 137 // Link::Link::GetHostname is OK for us 138 // Link::Link::SetHostname is OK for us 139 140 // Link::Link::GetPort is OK for us 141 // Link::Link::SetPort is OK for us 142 143 // Link::Link::GetPathname is OK for us 144 // Link::Link::SetPathname is OK for us 145 146 // Link::Link::GetSearch is OK for us 147 // Link::Link::SetSearch is OK for us 148 149 // Link::Link::GetHash is OK for us 150 // Link::Link::SetHash is OK for us 151 GetCoords(DOMString & aValue)152 void GetCoords(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::coords, aValue); } SetCoords(const nsAString & aValue,mozilla::ErrorResult & rv)153 void SetCoords(const nsAString& aValue, mozilla::ErrorResult& rv) { 154 SetHTMLAttr(nsGkAtoms::coords, aValue, rv); 155 } GetCharset(DOMString & aValue)156 void GetCharset(DOMString& aValue) { 157 GetHTMLAttr(nsGkAtoms::charset, aValue); 158 } SetCharset(const nsAString & aValue,mozilla::ErrorResult & rv)159 void SetCharset(const nsAString& aValue, mozilla::ErrorResult& rv) { 160 SetHTMLAttr(nsGkAtoms::charset, aValue, rv); 161 } GetName(DOMString & aValue)162 void GetName(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::name, aValue); } GetName(nsAString & aValue)163 void GetName(nsAString& aValue) { GetHTMLAttr(nsGkAtoms::name, aValue); } SetName(const nsAString & aValue,mozilla::ErrorResult & rv)164 void SetName(const nsAString& aValue, mozilla::ErrorResult& rv) { 165 SetHTMLAttr(nsGkAtoms::name, aValue, rv); 166 } GetRev(DOMString & aValue)167 void GetRev(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::rev, aValue); } SetRev(const nsAString & aValue,mozilla::ErrorResult & rv)168 void SetRev(const nsAString& aValue, mozilla::ErrorResult& rv) { 169 SetHTMLAttr(nsGkAtoms::rev, aValue, rv); 170 } GetShape(DOMString & aValue)171 void GetShape(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::shape, aValue); } SetShape(const nsAString & aValue,mozilla::ErrorResult & rv)172 void SetShape(const nsAString& aValue, mozilla::ErrorResult& rv) { 173 SetHTMLAttr(nsGkAtoms::shape, aValue, rv); 174 } Stringify(nsAString & aResult)175 void Stringify(nsAString& aResult) { GetHref(aResult); } 176 void ToString(nsAString& aSource); 177 NodeInfoChanged(Document * aOldDoc)178 void NodeInfoChanged(Document* aOldDoc) final { 179 ClearHasPendingLinkUpdate(); 180 nsGenericHTMLElement::NodeInfoChanged(aOldDoc); 181 } 182 183 static DOMTokenListSupportedToken sSupportedRelValues[]; 184 185 protected: 186 virtual ~HTMLAnchorElement(); 187 188 virtual JSObject* WrapNode(JSContext* aCx, 189 JS::Handle<JSObject*> aGivenProto) override; 190 RefPtr<nsDOMTokenList> mRelList; 191 }; 192 193 } // namespace dom 194 } // namespace mozilla 195 196 #endif // mozilla_dom_HTMLAnchorElement_h 197