tor-browser

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

HTMLLinkElement.h (8098B)


      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/WeakPtr.h"
     11 #include "mozilla/dom/HTMLDNSPrefetch.h"
     12 #include "mozilla/dom/Link.h"
     13 #include "mozilla/dom/LinkStyle.h"
     14 #include "nsDOMTokenList.h"
     15 #include "nsGenericHTMLElement.h"
     16 
     17 namespace mozilla {
     18 class EventChainPostVisitor;
     19 class EventChainPreVisitor;
     20 class PreloaderBase;
     21 
     22 namespace dom {
     23 
     24 class HTMLLinkElement final : public nsGenericHTMLElement,
     25                              public LinkStyle,
     26                              public SupportsDNSPrefetch {
     27 public:
     28  explicit HTMLLinkElement(
     29      already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
     30 
     31  // nsISupports
     32  NS_DECL_ISUPPORTS_INHERITED
     33 
     34  // CC
     35  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLLinkElement,
     36                                           nsGenericHTMLElement)
     37 
     38  NS_IMPL_FROMNODE_HTML_WITH_TAG(HTMLLinkElement, link);
     39  NS_DECL_ADDSIZEOFEXCLUDINGTHIS
     40 
     41  void LinkAdded();
     42 
     43  // nsINode
     44  nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override;
     45  JSObject* WrapNode(JSContext* aCx,
     46                     JS::Handle<JSObject*> aGivenProto) override;
     47 
     48  // nsIContent
     49  nsresult BindToTree(BindContext&, nsINode& aParent) override;
     50  void UnbindFromTree(UnbindContext&) override;
     51  void BeforeSetAttr(int32_t aNameSpaceID, nsAtom* aName,
     52                     const nsAttrValue* aValue, bool aNotify) override;
     53  void AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
     54                    const nsAttrValue* aValue, const nsAttrValue* aOldValue,
     55                    nsIPrincipal* aSubjectPrincipal, bool aNotify) override;
     56  // Element
     57  bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
     58                      const nsAString& aValue,
     59                      nsIPrincipal* aMaybeScriptedPrincipal,
     60                      nsAttrValue& aResult) override;
     61 
     62  void CreateAndDispatchEvent(const nsAString& aEventName);
     63 
     64  // WebIDL
     65  bool Disabled() const;
     66  void SetDisabled(bool aDisabled, ErrorResult& aRv);
     67 
     68  nsIURI* GetURI() {
     69    if (!mCachedURI) {
     70      GetURIAttr(nsGkAtoms::href, nullptr, getter_AddRefs(mCachedURI));
     71    }
     72    return mCachedURI.get();
     73  }
     74 
     75  void GetHref(nsAString& aValue) {
     76    GetURIAttr(nsGkAtoms::href, nullptr, aValue);
     77  }
     78  void SetHref(const nsAString& aHref, nsIPrincipal* aTriggeringPrincipal,
     79               ErrorResult& aRv) {
     80    SetHTMLAttr(nsGkAtoms::href, aHref, aTriggeringPrincipal, aRv);
     81  }
     82  void SetHref(const nsAString& aHref, ErrorResult& aRv) {
     83    SetHTMLAttr(nsGkAtoms::href, aHref, aRv);
     84  }
     85  void GetCrossOrigin(nsAString& aResult) {
     86    // Null for both missing and invalid defaults is ok, since we
     87    // always parse to an enum value, so we don't need an invalid
     88    // default, and we _want_ the missing default to be null.
     89    GetEnumAttr(nsGkAtoms::crossorigin, nullptr, aResult);
     90  }
     91  void SetCrossOrigin(const nsAString& aCrossOrigin, ErrorResult& aError) {
     92    SetOrRemoveNullableStringAttr(nsGkAtoms::crossorigin, aCrossOrigin, aError);
     93  }
     94  // nsAString for WebBrowserPersistLocalDocument
     95  void GetRel(nsAString& aValue) { GetHTMLAttr(nsGkAtoms::rel, aValue); }
     96  void SetRel(const nsAString& aRel, ErrorResult& aRv) {
     97    SetHTMLAttr(nsGkAtoms::rel, aRel, aRv);
     98  }
     99  nsDOMTokenList* RelList();
    100  void GetMedia(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::media, aValue); }
    101  void SetMedia(const nsAString& aMedia, ErrorResult& aRv) {
    102    SetHTMLAttr(nsGkAtoms::media, aMedia, aRv);
    103  }
    104  void GetHreflang(DOMString& aValue) {
    105    GetHTMLAttr(nsGkAtoms::hreflang, aValue);
    106  }
    107  void SetHreflang(const nsAString& aHreflang, ErrorResult& aRv) {
    108    SetHTMLAttr(nsGkAtoms::hreflang, aHreflang, aRv);
    109  }
    110  void GetAs(nsAString& aResult);
    111  void SetAs(const nsAString& aAs, ErrorResult& aRv) {
    112    SetAttr(nsGkAtoms::as, aAs, aRv);
    113  }
    114 
    115  nsDOMTokenList* Sizes() {
    116    if (!mSizes) {
    117      mSizes = new nsDOMTokenList(this, nsGkAtoms::sizes);
    118    }
    119    return mSizes;
    120  }
    121  void GetType(nsAString& aValue) { GetHTMLAttr(nsGkAtoms::type, aValue); }
    122  void SetType(const nsAString& aType, ErrorResult& aRv) {
    123    SetHTMLAttr(nsGkAtoms::type, aType, aRv);
    124  }
    125  void GetCharset(nsAString& aValue) override {
    126    GetHTMLAttr(nsGkAtoms::charset, aValue);
    127  }
    128  void SetCharset(const nsAString& aCharset, ErrorResult& aRv) {
    129    SetHTMLAttr(nsGkAtoms::charset, aCharset, aRv);
    130  }
    131  void GetRev(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::rev, aValue); }
    132  void SetRev(const nsAString& aRev, ErrorResult& aRv) {
    133    SetHTMLAttr(nsGkAtoms::rev, aRev, aRv);
    134  }
    135  void GetTarget(DOMString& aValue) { GetHTMLAttr(nsGkAtoms::target, aValue); }
    136  void SetTarget(const nsAString& aTarget, ErrorResult& aRv) {
    137    SetHTMLAttr(nsGkAtoms::target, aTarget, aRv);
    138  }
    139  void GetIntegrity(nsAString& aIntegrity) const {
    140    GetHTMLAttr(nsGkAtoms::integrity, aIntegrity);
    141  }
    142  void SetIntegrity(const nsAString& aIntegrity, ErrorResult& aRv) {
    143    SetHTMLAttr(nsGkAtoms::integrity, aIntegrity, aRv);
    144  }
    145  void SetReferrerPolicy(const nsAString& aReferrer, ErrorResult& aError) {
    146    SetHTMLAttr(nsGkAtoms::referrerpolicy, aReferrer, aError);
    147  }
    148  void GetReferrerPolicy(nsAString& aReferrer) {
    149    GetEnumAttr(nsGkAtoms::referrerpolicy, "", aReferrer);
    150  }
    151  void GetImageSrcset(nsAString& aImageSrcset) {
    152    GetHTMLAttr(nsGkAtoms::imagesrcset, aImageSrcset);
    153  }
    154  void SetImageSrcset(const nsAString& aImageSrcset, ErrorResult& aError) {
    155    SetHTMLAttr(nsGkAtoms::imagesrcset, aImageSrcset, aError);
    156  }
    157  void GetImageSizes(nsAString& aImageSizes) {
    158    GetHTMLAttr(nsGkAtoms::imagesizes, aImageSizes);
    159  }
    160  void SetImageSizes(const nsAString& aImageSizes, ErrorResult& aError) {
    161    SetHTMLAttr(nsGkAtoms::imagesizes, aImageSizes, aError);
    162  }
    163 
    164  CORSMode GetCORSMode() const {
    165    return AttrValueToCORSMode(GetParsedAttr(nsGkAtoms::crossorigin));
    166  }
    167 
    168  nsDOMTokenList* Blocking();
    169  bool IsPotentiallyRenderBlocking() override;
    170 
    171  void NodeInfoChanged(Document* aOldDoc) final {
    172    mCachedURI = nullptr;
    173    nsGenericHTMLElement::NodeInfoChanged(aOldDoc);
    174  }
    175 
    176 protected:
    177  virtual ~HTMLLinkElement();
    178 
    179  void GetContentPolicyMimeTypeMedia(nsAttrValue& aAsAttr,
    180                                     nsContentPolicyType& aPolicyType,
    181                                     nsString& aMimeType, nsAString& aMedia);
    182  void TryDNSPrefetchOrPreconnectOrPrefetchOrPreloadOrPrerender();
    183  void UpdatePreload(nsAtom* aName, const nsAttrValue* aValue,
    184                     const nsAttrValue* aOldValue);
    185  void CancelPrefetchOrPreload();
    186 
    187  void StartPreload(nsContentPolicyType policyType);
    188  void CancelPreload();
    189 
    190  // Returns whether the type attribute specifies the text/css mime type for
    191  // link elements.
    192  static bool IsCSSMimeTypeAttributeForLinkElement(
    193      const mozilla::dom::Element&);
    194 
    195  // LinkStyle
    196  nsIContent& AsContent() final { return *this; }
    197  const LinkStyle* AsLinkStyle() const final { return this; }
    198  Maybe<SheetInfo> GetStyleSheetInfo() final;
    199  nsresult CopyInnerTo(HTMLLinkElement* aDest);
    200 
    201  RefPtr<nsDOMTokenList> mRelList;
    202  RefPtr<nsDOMTokenList> mSizes;
    203  RefPtr<nsDOMTokenList> mBlocking;
    204 
    205  // A weak reference to our preload is held only to cancel the preload when
    206  // this node updates or unbounds from the tree.  We want to prevent cycles,
    207  // the preload is held alive by other means.
    208  WeakPtr<PreloaderBase> mPreload;
    209 
    210  // The cached href attribute value.
    211  nsCOMPtr<nsIURI> mCachedURI;
    212 
    213  // The "explicitly enabled" flag. This flag is set whenever the `disabled`
    214  // attribute is explicitly unset, and makes alternate stylesheets not be
    215  // disabled by default anymore.
    216  //
    217  // See https://github.com/whatwg/html/issues/3840#issuecomment-481034206.
    218  bool mExplicitlyEnabled = false;
    219 };
    220 
    221 }  // namespace dom
    222 }  // namespace mozilla
    223 
    224 #endif  // mozilla_dom_HTMLLinkElement_h