nsresult ChannelMediaResource::OnChannelRedirect(nsIChannel* aOld, nsIChannel* aNew, uint32_t aFlags) { mChannel = aNew; SetupChannelHeaders(); return NS_OK; }
nsresult ChannelMediaResource::OnChannelRedirect(nsIChannel* aOld, nsIChannel* aNew, uint32_t aFlags) { mChannel = new nsMainThreadPtrHolder<nsIChannel>(aNew); SetupChannelHeaders(); return NS_OK; }
nsresult ChannelMediaResource::OpenChannel(nsIStreamListener** aStreamListener) { NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); NS_ENSURE_TRUE(mChannel, NS_ERROR_NULL_POINTER); NS_ASSERTION(!mListener, "Listener should have been removed by now"); if (aStreamListener) { *aStreamListener = nullptr; } if (mByteRange.IsNull()) { // We're not making a byte range request, so set the content length, // if it's available as an HTTP header. This ensures that MediaResource // wrapping objects for platform libraries that expect to know // the length of a resource can get it before OnStartRequest() fires. nsCOMPtr<nsIHttpChannel> hc = do_QueryInterface(mChannel); if (hc) { int64_t cl = -1; if (NS_SUCCEEDED(hc->GetContentLength(&cl)) && cl != -1) { mCacheStream.NotifyDataLength(cl); } } } mListener = new Listener(this); NS_ENSURE_TRUE(mListener, NS_ERROR_OUT_OF_MEMORY); if (aStreamListener) { *aStreamListener = mListener; NS_ADDREF(*aStreamListener); } else { mChannel->SetNotificationCallbacks(mListener.get()); nsCOMPtr<nsIStreamListener> listener = mListener.get(); // Ensure that if we're loading cross domain, that the server is sending // an authorizing Access-Control header. MediaDecoderOwner* owner = mDecoder->GetMediaOwner(); NS_ENSURE_TRUE(owner, NS_ERROR_FAILURE); dom::HTMLMediaElement* element = owner->GetMediaElement(); NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); if (element->ShouldCheckAllowOrigin()) { nsRefPtr<nsCORSListenerProxy> crossSiteListener = new nsCORSListenerProxy(mListener, element->NodePrincipal(), false); nsresult rv = crossSiteListener->Init(mChannel); listener = crossSiteListener; NS_ENSURE_TRUE(crossSiteListener, NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_SUCCESS(rv, rv); } else { nsresult rv = nsContentUtils::GetSecurityManager()-> CheckLoadURIWithPrincipal(element->NodePrincipal(), mURI, nsIScriptSecurityManager::STANDARD); NS_ENSURE_SUCCESS(rv, rv); } SetupChannelHeaders(); nsresult rv = mChannel->AsyncOpen(listener, nullptr); NS_ENSURE_SUCCESS(rv, rv); // Tell the media element that we are fetching data from a channel. element->DownloadResumed(true); } return NS_OK; }