mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-06 17:16:12 +00:00
ad7ccba84d
Backed out changeset d3e7f6392670 (bug 865407) Backed out changeset 7ba94f08b7a5 (bug 865407) Backed out changeset 3de6e32a4346 (bug 865407) Backed out changeset 5c0572c6727b (bug 865407) Backed out changeset 5db43cac79f5 (bug 865407)
159 lines
4.1 KiB
C++
159 lines
4.1 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* 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/. */
|
|
|
|
#include "mozilla/dom/TextTrackList.h"
|
|
#include "mozilla/dom/TextTrackListBinding.h"
|
|
#include "mozilla/dom/TrackEvent.h"
|
|
#include "nsThreadUtils.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_INHERITED_2(TextTrackList,
|
|
nsDOMEventTargetHelper,
|
|
mGlobal,
|
|
mTextTracks)
|
|
|
|
NS_IMPL_ADDREF_INHERITED(TextTrackList, nsDOMEventTargetHelper)
|
|
NS_IMPL_RELEASE_INHERITED(TextTrackList, nsDOMEventTargetHelper)
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackList)
|
|
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
|
|
|
|
TextTrackList::TextTrackList(nsISupports* aGlobal) : mGlobal(aGlobal)
|
|
{
|
|
SetIsDOMBinding();
|
|
}
|
|
|
|
void
|
|
TextTrackList::Update(double aTime)
|
|
{
|
|
uint32_t length = Length(), i;
|
|
for (i = 0; i < length; i++) {
|
|
mTextTracks[i]->Update(aTime);
|
|
}
|
|
}
|
|
|
|
JSObject*
|
|
TextTrackList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
|
|
{
|
|
return TextTrackListBinding::Wrap(aCx, aScope, this);
|
|
}
|
|
|
|
TextTrack*
|
|
TextTrackList::IndexedGetter(uint32_t aIndex, bool& aFound)
|
|
{
|
|
aFound = aIndex < mTextTracks.Length();
|
|
return aFound ? mTextTracks[aIndex] : nullptr;
|
|
}
|
|
|
|
already_AddRefed<TextTrack>
|
|
TextTrackList::AddTextTrack(HTMLMediaElement* aMediaElement,
|
|
TextTrackKind aKind,
|
|
const nsAString& aLabel,
|
|
const nsAString& aLanguage)
|
|
{
|
|
nsRefPtr<TextTrack> track = new TextTrack(mGlobal, aMediaElement, aKind,
|
|
aLabel, aLanguage);
|
|
if (mTextTracks.AppendElement(track)) {
|
|
CreateAndDispatchTrackEventRunner(track, NS_LITERAL_STRING("addtrack"));
|
|
}
|
|
|
|
return track.forget();
|
|
}
|
|
|
|
TextTrack*
|
|
TextTrackList::GetTrackById(const nsAString& aId)
|
|
{
|
|
nsAutoString id;
|
|
for (uint32_t i = 0; i < Length(); i++) {
|
|
mTextTracks[i]->GetId(id);
|
|
if (aId.Equals(id)) {
|
|
return mTextTracks[i];
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
void
|
|
TextTrackList::RemoveTextTrack(TextTrack* aTrack)
|
|
{
|
|
if (mTextTracks.RemoveElement(aTrack)) {
|
|
CreateAndDispatchTrackEventRunner(aTrack, NS_LITERAL_STRING("removetrack"));
|
|
}
|
|
}
|
|
|
|
void
|
|
TextTrackList::DidSeek()
|
|
{
|
|
for (uint32_t i = 0; i < mTextTracks.Length(); i++) {
|
|
mTextTracks[i]->SetDirty();
|
|
}
|
|
}
|
|
|
|
class TrackEventRunner MOZ_FINAL: public nsRunnable
|
|
{
|
|
public:
|
|
TrackEventRunner(TextTrackList* aList, nsIDOMEvent* aEvent)
|
|
: mList(aList)
|
|
, mEvent(aEvent)
|
|
{}
|
|
|
|
NS_IMETHOD Run() MOZ_OVERRIDE
|
|
{
|
|
return mList->DispatchTrackEvent(mEvent);
|
|
}
|
|
|
|
private:
|
|
nsRefPtr<TextTrackList> mList;
|
|
nsRefPtr<nsIDOMEvent> mEvent;
|
|
};
|
|
|
|
nsresult
|
|
TextTrackList::DispatchTrackEvent(nsIDOMEvent* aEvent)
|
|
{
|
|
return DispatchTrustedEvent(aEvent);
|
|
}
|
|
|
|
void
|
|
TextTrackList::CreateAndDispatchChangeEvent()
|
|
{
|
|
nsCOMPtr<nsIDOMEvent> event;
|
|
nsresult rv = NS_NewDOMEvent(getter_AddRefs(event), this, nullptr, nullptr);
|
|
if (NS_FAILED(rv)) {
|
|
NS_WARNING("Failed to create the error event!");
|
|
return;
|
|
}
|
|
|
|
rv = event->InitEvent(NS_LITERAL_STRING("change"), false, false);
|
|
if (NS_FAILED(rv)) {
|
|
NS_WARNING("Failed to init the change event!");
|
|
return;
|
|
}
|
|
|
|
event->SetTrusted(true);
|
|
|
|
nsCOMPtr<nsIRunnable> eventRunner = new TrackEventRunner(this, event);
|
|
NS_DispatchToMainThread(eventRunner, NS_DISPATCH_NORMAL);
|
|
}
|
|
|
|
void
|
|
TextTrackList::CreateAndDispatchTrackEventRunner(TextTrack* aTrack,
|
|
const nsAString& aEventName)
|
|
{
|
|
TrackEventInit eventInit;
|
|
eventInit.mBubbles = false;
|
|
eventInit.mCancelable = false;
|
|
eventInit.mTrack = aTrack;
|
|
nsRefPtr<TrackEvent> event =
|
|
TrackEvent::Constructor(this, aEventName, eventInit);
|
|
|
|
// Dispatch the TrackEvent asynchronously.
|
|
nsCOMPtr<nsIRunnable> eventRunner = new TrackEventRunner(this, event);
|
|
NS_DispatchToMainThread(eventRunner, NS_DISPATCH_NORMAL);
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|