HTMLTrackElement.h (4599B)
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_HTMLTrackElement_h 8 #define mozilla_dom_HTMLTrackElement_h 9 10 #include "mozilla/dom/HTMLMediaElement.h" 11 #include "mozilla/dom/TextTrack.h" 12 #include "nsCycleCollectionParticipant.h" 13 #include "nsGenericHTMLElement.h" 14 #include "nsGkAtoms.h" 15 16 class nsIContent; 17 18 namespace mozilla::dom { 19 20 class WebVTTListener; 21 class WindowDestroyObserver; 22 enum class TextTrackReadyState : uint8_t; 23 24 class HTMLTrackElement final : public nsGenericHTMLElement { 25 public: 26 explicit HTMLTrackElement( 27 already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo); 28 29 // nsISupports 30 NS_DECL_ISUPPORTS_INHERITED 31 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLTrackElement, 32 nsGenericHTMLElement) 33 34 // HTMLTrackElement WebIDL 35 void GetKind(DOMString& aKind) const; 36 void SetKind(const nsAString& aKind, ErrorResult& aError) { 37 SetHTMLAttr(nsGkAtoms::kind, aKind, aError); 38 } 39 40 void GetSrc(DOMString& aSrc) const { GetHTMLURIAttr(nsGkAtoms::src, aSrc); } 41 42 void SetSrc(const nsAString& aSrc, ErrorResult& aError); 43 44 void GetSrclang(DOMString& aSrclang) const { 45 GetHTMLAttr(nsGkAtoms::srclang, aSrclang); 46 } 47 void GetSrclang(nsAString& aSrclang) const { 48 GetHTMLAttr(nsGkAtoms::srclang, aSrclang); 49 } 50 void SetSrclang(const nsAString& aSrclang, ErrorResult& aError) { 51 SetHTMLAttr(nsGkAtoms::srclang, aSrclang, aError); 52 } 53 54 void GetLabel(DOMString& aLabel) const { 55 GetHTMLAttr(nsGkAtoms::label, aLabel); 56 } 57 void GetLabel(nsAString& aLabel) const { 58 GetHTMLAttr(nsGkAtoms::label, aLabel); 59 } 60 void SetLabel(const nsAString& aLabel, ErrorResult& aError) { 61 SetHTMLAttr(nsGkAtoms::label, aLabel, aError); 62 } 63 64 bool Default() const { return GetBoolAttr(nsGkAtoms::_default); } 65 void SetDefault(bool aDefault, ErrorResult& aError) { 66 SetHTMLBoolAttr(nsGkAtoms::_default, aDefault, aError); 67 } 68 69 TextTrackReadyState ReadyState() const; 70 uint16_t ReadyStateForBindings() const { 71 return static_cast<uint16_t>(ReadyState()); 72 } 73 void SetReadyState(TextTrackReadyState); 74 75 TextTrack* GetTrack(); 76 77 virtual nsresult Clone(dom::NodeInfo*, nsINode** aResult) const override; 78 79 // Override ParseAttribute() to convert kind strings to enum values. 80 virtual bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute, 81 const nsAString& aValue, 82 nsIPrincipal* aMaybeScriptedPrincipal, 83 nsAttrValue& aResult) override; 84 85 // Override BindToTree() so that we can trigger a load when we become 86 // the child of a media element. 87 virtual nsresult BindToTree(BindContext&, nsINode& aParent) override; 88 virtual void UnbindFromTree(UnbindContext&) override; 89 90 virtual void AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName, 91 const nsAttrValue* aValue, 92 const nsAttrValue* aOldValue, 93 nsIPrincipal* aMaybeScriptedPrincipal, 94 bool aNotify) override; 95 96 void DispatchTrackRunnable(const nsString& aEventName); 97 void DispatchTrustedEvent(const nsAString& aName); 98 void DispatchTestEvent(const nsAString& aName); 99 100 void CancelChannelAndListener(bool aCheckRFP); 101 102 bool ShouldResistFingerprinting(RFPTarget aRfpTarget); 103 104 // Only load resource for the non-disabled track with media parent. 105 void MaybeDispatchLoadResource(); 106 107 protected: 108 virtual ~HTMLTrackElement(); 109 110 virtual JSObject* WrapNode(JSContext* aCx, 111 JS::Handle<JSObject*> aGivenProto) override; 112 void OnChannelRedirect(nsIChannel* aChannel, nsIChannel* aNewChannel, 113 uint32_t aFlags); 114 115 friend class TextTrackCue; 116 friend class WebVTTListener; 117 118 RefPtr<TextTrack> mTrack; 119 nsCOMPtr<nsIChannel> mChannel; 120 RefPtr<HTMLMediaElement> mMediaParent; 121 RefPtr<WebVTTListener> mListener; 122 123 void CreateTextTrack(); 124 125 private: 126 // Open a new channel to the HTMLTrackElement's src attribute and call 127 // mListener's LoadResource(). 128 void LoadResource(RefPtr<WebVTTListener>&& aWebVTTListener); 129 bool mLoadResourceDispatched; 130 131 void MaybeClearAllCues(); 132 133 RefPtr<WindowDestroyObserver> mWindowDestroyObserver; 134 }; 135 136 } // namespace mozilla::dom 137 138 #endif // mozilla_dom_HTMLTrackElement_h