TextTrack* HTMLTrackElement::GetTrack() { if (!mTrack) { CreateTextTrack(); } return mTrack; }
void HTMLTrackElement::LoadResource() { // Find our 'src' url nsAutoString src; if (!GetAttr(kNameSpaceID_None, nsGkAtoms::src, src)) { return; } nsCOMPtr<nsIURI> uri; nsresult rv = NewURIFromString(src, getter_AddRefs(uri)); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); LOG(LogLevel::Info, ("%p Trying to load from src=%s", this, NS_ConvertUTF16toUTF8(src).get())); if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); mChannel = nullptr; } // We may already have a TextTrack at this point if GetTrack() has already // been called. This happens, for instance, if script tries to get the // TextTrack before its mTrackElement has been bound to the DOM tree. if (!mTrack) { CreateTextTrack(); } nsCOMPtr<nsIChannel> channel; nsCOMPtr<nsILoadGroup> loadGroup = OwnerDoc()->GetDocumentLoadGroup(); rv = NS_NewChannel(getter_AddRefs(channel), uri, static_cast<Element*>(this), nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS, nsIContentPolicy::TYPE_INTERNAL_TRACK, loadGroup); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mListener = new WebVTTListener(this); rv = mListener->LoadResource(); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); channel->SetNotificationCallbacks(mListener); LOG(LogLevel::Debug, ("opening webvtt channel")); rv = channel->AsyncOpen2(mListener); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mChannel = channel; }
nsresult HTMLTrackElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent, bool aCompileEventHandlers) { nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent, aBindingParent, aCompileEventHandlers); NS_ENSURE_SUCCESS(rv, rv); if (!aDocument) { return NS_OK; } LOG(LogLevel::Debug, ("Track Element bound to tree.")); if (!aParent || !aParent->IsNodeOfType(nsINode::eMEDIA)) { return NS_OK; } // Store our parent so we can look up its frame for display. if (!mMediaParent) { mMediaParent = static_cast<HTMLMediaElement*>(aParent); // TODO: separate notification for 'alternate' tracks? mMediaParent->NotifyAddedSource(); LOG(LogLevel::Debug, ("Track element sent notification to parent.")); // We may already have a TextTrack at this point if GetTrack() has already // been called. This happens, for instance, if script tries to get the // TextTrack before its mTrackElement has been bound to the DOM tree. if (!mTrack) { CreateTextTrack(); } RefPtr<Runnable> r = NewRunnableMethod(this, &HTMLTrackElement::LoadResource); mMediaParent->RunInStableState(r); } return NS_OK; }
void HTMLTrackElement::SetSrc(const nsAString& aSrc, ErrorResult& aError) { SetHTMLAttr(nsGkAtoms::src, aSrc, aError); uint16_t oldReadyState = ReadyState(); SetReadyState(TextTrackReadyState::NotLoaded); if (!mMediaParent) { return; } if (mTrack && (oldReadyState != TextTrackReadyState::NotLoaded)) { // Remove all the cues in MediaElement. mMediaParent->RemoveTextTrack(mTrack); // Recreate mTrack. CreateTextTrack(); } // Stop WebVTTListener. mListener = nullptr; if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); mChannel = nullptr; } DispatchLoadResource(); }
void HTMLTrackElement::LoadResource() { // Find our 'src' url nsAutoString src; if (!GetAttr(kNameSpaceID_None, nsGkAtoms::src, src)) { return; } nsCOMPtr<nsIURI> uri; nsresult rv = NewURIFromString(src, getter_AddRefs(uri)); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); LOG(PR_LOG_ALWAYS, ("%p Trying to load from src=%s", this, NS_ConvertUTF16toUTF8(src).get())); if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); mChannel = nullptr; } rv = nsContentUtils::GetSecurityManager()-> CheckLoadURIWithPrincipal(NodePrincipal(), uri, nsIScriptSecurityManager::STANDARD); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); int16_t shouldLoad = nsIContentPolicy::ACCEPT; rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_MEDIA, uri, NodePrincipal(), static_cast<Element*>(this), NS_LITERAL_CSTRING("text/vtt"), // mime type nullptr, // extra &shouldLoad, nsContentUtils::GetContentPolicy(), nsContentUtils::GetSecurityManager()); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); if (NS_CP_REJECTED(shouldLoad)) { return; } CreateTextTrack(); // Check for a Content Security Policy to pass down to the channel // created to load the media content. nsCOMPtr<nsIChannelPolicy> channelPolicy; nsCOMPtr<nsIContentSecurityPolicy> csp; rv = NodePrincipal()->GetCsp(getter_AddRefs(csp)); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); if (csp) { channelPolicy = do_CreateInstance("@mozilla.org/nschannelpolicy;1"); if (!channelPolicy) { return; } channelPolicy->SetContentSecurityPolicy(csp); channelPolicy->SetLoadType(nsIContentPolicy::TYPE_MEDIA); } nsCOMPtr<nsIChannel> channel; nsCOMPtr<nsILoadGroup> loadGroup = OwnerDoc()->GetDocumentLoadGroup(); rv = NS_NewChannel(getter_AddRefs(channel), uri, nullptr, loadGroup, nullptr, nsIRequest::LOAD_NORMAL, channelPolicy); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mLoadListener = new WebVTTLoadListener(this); rv = mLoadListener->LoadResource(); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); channel->SetNotificationCallbacks(mLoadListener); LOG(PR_LOG_DEBUG, ("opening webvtt channel")); rv = channel->AsyncOpen(mLoadListener, nullptr); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mChannel = channel; }
void HTMLTrackElement::LoadResource() { // Find our 'src' url nsAutoString src; if (!GetAttr(kNameSpaceID_None, nsGkAtoms::src, src)) { return; } nsCOMPtr<nsIURI> uri; nsresult rv = NewURIFromString(src, getter_AddRefs(uri)); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); LOG(LogLevel::Info, ("%p Trying to load from src=%s", this, NS_ConvertUTF16toUTF8(src).get())); if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); mChannel = nullptr; } rv = nsContentUtils::GetSecurityManager()-> CheckLoadURIWithPrincipal(NodePrincipal(), uri, nsIScriptSecurityManager::STANDARD); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); int16_t shouldLoad = nsIContentPolicy::ACCEPT; rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_MEDIA, uri, NodePrincipal(), static_cast<Element*>(this), NS_LITERAL_CSTRING("text/vtt"), // mime type nullptr, // extra &shouldLoad, nsContentUtils::GetContentPolicy(), nsContentUtils::GetSecurityManager()); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); if (NS_CP_REJECTED(shouldLoad)) { return; } // We may already have a TextTrack at this point if GetTrack() has already // been called. This happens, for instance, if script tries to get the // TextTrack before its mTrackElement has been bound to the DOM tree. if (!mTrack) { CreateTextTrack(); } nsCOMPtr<nsIChannel> channel; nsCOMPtr<nsILoadGroup> loadGroup = OwnerDoc()->GetDocumentLoadGroup(); rv = NS_NewChannel(getter_AddRefs(channel), uri, static_cast<Element*>(this), nsILoadInfo::SEC_NORMAL, nsIContentPolicy::TYPE_MEDIA, loadGroup); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mListener = new WebVTTListener(this); rv = mListener->LoadResource(); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); channel->SetNotificationCallbacks(mListener); LOG(LogLevel::Debug, ("opening webvtt channel")); rv = channel->AsyncOpen(mListener, nullptr); NS_ENSURE_TRUE_VOID(NS_SUCCEEDED(rv)); mChannel = channel; }