summaryrefslogtreecommitdiffstats
path: root/dom/html/TextTrackManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/TextTrackManager.h')
-rw-r--r--dom/html/TextTrackManager.h194
1 files changed, 194 insertions, 0 deletions
diff --git a/dom/html/TextTrackManager.h b/dom/html/TextTrackManager.h
new file mode 100644
index 0000000000..6ce19963d5
--- /dev/null
+++ b/dom/html/TextTrackManager.h
@@ -0,0 +1,194 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrackManager_h
+#define mozilla_dom_TextTrackManager_h
+
+#include "mozilla/dom/TextTrack.h"
+#include "mozilla/dom/TextTrackList.h"
+#include "mozilla/dom/TextTrackCueList.h"
+#include "mozilla/StaticPtr.h"
+#include "nsContentUtils.h"
+#include "nsIDOMEventListener.h"
+#include "TimeUnits.h"
+
+class nsIWebVTTParserWrapper;
+
+namespace mozilla {
+template <typename T>
+class Maybe;
+namespace dom {
+
+class HTMLMediaElement;
+
+class CompareTextTracks {
+ private:
+ HTMLMediaElement* mMediaElement;
+ Maybe<uint32_t> TrackChildPosition(TextTrack* aTrack) const;
+
+ public:
+ explicit CompareTextTracks(HTMLMediaElement* aMediaElement);
+ bool Equals(TextTrack* aOne, TextTrack* aTwo) const;
+ bool LessThan(TextTrack* aOne, TextTrack* aTwo) const;
+};
+
+class TextTrack;
+class TextTrackCue;
+
+class TextTrackManager final : public nsIDOMEventListener {
+ ~TextTrackManager();
+
+ public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(TextTrackManager)
+
+ NS_DECL_NSIDOMEVENTLISTENER
+
+ explicit TextTrackManager(HTMLMediaElement* aMediaElement);
+
+ TextTrackList* GetTextTracks() const;
+ already_AddRefed<TextTrack> AddTextTrack(TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource);
+ void AddTextTrack(TextTrack* aTextTrack);
+ void RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly);
+ void DidSeek();
+
+ void NotifyCueAdded(TextTrackCue& aCue);
+ void AddCues(TextTrack* aTextTrack);
+ void NotifyCueRemoved(TextTrackCue& aCue);
+ /**
+ * Overview of WebVTT cuetext and anonymous content setup.
+ *
+ * WebVTT nodes are the parsed version of WebVTT cuetext. WebVTT cuetext is
+ * the portion of a WebVTT cue that specifies what the caption will actually
+ * show up as on screen.
+ *
+ * WebVTT cuetext can contain markup that loosely relates to HTML markup. It
+ * can contain tags like <b>, <u>, <i>, <c>, <v>, <ruby>, <rt>, <lang>,
+ * including timestamp tags.
+ *
+ * When the caption is ready to be displayed the WebVTT nodes are converted
+ * over to anonymous DOM content. <i>, <u>, <b>, <ruby>, and <rt> all become
+ * HTMLElements of their corresponding HTML markup tags. <c> and <v> are
+ * converted to <span> tags. Timestamp tags are converted to XML processing
+ * instructions. Additionally, all cuetext tags support specifying of classes.
+ * This takes the form of <foo.class.subclass>. These classes are then parsed
+ * and set as the anonymous content's class attribute.
+ *
+ * Rules on constructing DOM objects from WebVTT nodes can be found here
+ * http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules.
+ * Current rules are taken from revision on April 15, 2013.
+ */
+
+ void PopulatePendingList();
+
+ void AddListeners();
+
+ // The HTMLMediaElement that this TextTrackManager manages the TextTracks of.
+ RefPtr<HTMLMediaElement> mMediaElement;
+
+ void DispatchTimeMarchesOn();
+ void TimeMarchesOn();
+ void DispatchUpdateCueDisplay();
+
+ void NotifyShutdown() { mShutdown = true; }
+
+ void NotifyCueUpdated(TextTrackCue* aCue);
+
+ void NotifyReset();
+
+ bool IsLoaded();
+
+ private:
+ /**
+ * Converts the TextTrackCue's cuetext into a tree of DOM objects
+ * and attaches it to a div on its owning TrackElement's
+ * MediaElement's caption overlay.
+ */
+ void UpdateCueDisplay();
+
+ // List of the TextTrackManager's owning HTMLMediaElement's TextTracks.
+ RefPtr<TextTrackList> mTextTracks;
+ // List of text track objects awaiting loading.
+ RefPtr<TextTrackList> mPendingTextTracks;
+ // List of newly introduced Text Track cues.
+
+ // Contain all cues for a MediaElement. Not sorted.
+ RefPtr<TextTrackCueList> mNewCues;
+
+ // True if the media player playback changed due to seeking prior to and
+ // during running the "Time Marches On" algorithm.
+ bool mHasSeeked;
+ // Playback position at the time of last "Time Marches On" call
+ media::TimeUnit mLastTimeMarchesOnCalled;
+
+ bool mTimeMarchesOnDispatched;
+ bool mUpdateCueDisplayDispatched;
+
+ static StaticRefPtr<nsIWebVTTParserWrapper> sParserWrapper;
+
+ bool performedTrackSelection;
+
+ // Runs the algorithm for performing automatic track selection.
+ void HonorUserPreferencesForTrackSelection();
+ // Performs track selection for a single TextTrackKind.
+ void PerformTrackSelection(TextTrackKind aTextTrackKind);
+ // Performs track selection for a set of TextTrackKinds, for example,
+ // 'subtitles' and 'captions' should be selected together.
+ void PerformTrackSelection(TextTrackKind aTextTrackKinds[], uint32_t size);
+ void GetTextTracksOfKinds(TextTrackKind aTextTrackKinds[], uint32_t size,
+ nsTArray<TextTrack*>& aTextTracks);
+ void GetTextTracksOfKind(TextTrackKind aTextTrackKind,
+ nsTArray<TextTrack*>& aTextTracks);
+ bool TrackIsDefault(TextTrack* aTextTrack);
+
+ bool IsShutdown() const;
+
+ // This function will check media element's show poster flag to decide whether
+ // we need to run `TimeMarchesOn`.
+ void MaybeRunTimeMarchesOn();
+
+ class ShutdownObserverProxy final : public nsIObserver {
+ NS_DECL_ISUPPORTS
+
+ public:
+ explicit ShutdownObserverProxy(TextTrackManager* aManager)
+ : mManager(aManager) {
+ nsContentUtils::RegisterShutdownObserver(this);
+ }
+
+ NS_IMETHODIMP Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData) override {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) {
+ if (mManager) {
+ mManager->NotifyShutdown();
+ }
+ Unregister();
+ }
+ return NS_OK;
+ }
+
+ void Unregister();
+
+ private:
+ ~ShutdownObserverProxy() = default;
+
+ TextTrackManager* mManager;
+ };
+
+ RefPtr<ShutdownObserverProxy> mShutdownProxy;
+ bool mShutdown;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TextTrackManager_h