Backed out 2 changesets (bug 1479270) for android lint on a CLOSED TREE
Backed out changeset 1676f895a710 (bug 1479270) Backed out changeset 643ef11ea720 (bug 1479270)
This commit is contained in:
@@ -1377,6 +1377,7 @@ class HTMLMediaElement::ErrorSink
|
||||
public:
|
||||
explicit ErrorSink(HTMLMediaElement* aOwner)
|
||||
: mOwner(aOwner)
|
||||
, mSrcIsUnsupportedTypeMedia(false)
|
||||
{
|
||||
MOZ_ASSERT(mOwner);
|
||||
}
|
||||
@@ -1395,29 +1396,59 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
mError = new MediaError(mOwner, aErrorCode, aErrorDetails);
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("error"));
|
||||
if (mOwner->ReadyState() == HAVE_NOTHING &&
|
||||
aErrorCode == MEDIA_ERR_ABORTED) {
|
||||
// https://html.spec.whatwg.org/multipage/embedded-content.html#media-data-processing-steps-list
|
||||
// "If the media data fetching process is aborted by the user"
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("abort"));
|
||||
mOwner->ChangeNetworkState(NETWORK_EMPTY);
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("emptied"));
|
||||
if (mOwner->mDecoder) {
|
||||
mOwner->ShutdownDecoder();
|
||||
}
|
||||
} else if (aErrorCode == MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
||||
// TODO : remove unsupported type related codes after finishing native
|
||||
// support for HLS, see bug 1350842.
|
||||
if (CanOwnerPlayUnsupportedTypeMedia() &&
|
||||
aErrorCode == MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
||||
// On Fennec, we do some hack for unsupported type media, we don't set
|
||||
// its error state in order to open it with external app.
|
||||
mSrcIsUnsupportedTypeMedia = true;
|
||||
mOwner->ChangeNetworkState(NETWORK_NO_SOURCE);
|
||||
MaybeOpenUnsupportedMediaForOwner();
|
||||
} else {
|
||||
mOwner->ChangeNetworkState(NETWORK_IDLE);
|
||||
mError = new MediaError(mOwner, aErrorCode, aErrorDetails);
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("error"));
|
||||
if (mOwner->ReadyState() == HAVE_NOTHING &&
|
||||
aErrorCode == MEDIA_ERR_ABORTED) {
|
||||
// https://html.spec.whatwg.org/multipage/embedded-content.html#media-data-processing-steps-list
|
||||
// "If the media data fetching process is aborted by the user"
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("abort"));
|
||||
mOwner->ChangeNetworkState(NETWORK_EMPTY);
|
||||
mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("emptied"));
|
||||
if (mOwner->mDecoder) {
|
||||
mOwner->ShutdownDecoder();
|
||||
}
|
||||
} else if (aErrorCode == MEDIA_ERR_SRC_NOT_SUPPORTED) {
|
||||
mOwner->ChangeNetworkState(NETWORK_NO_SOURCE);
|
||||
} else {
|
||||
mOwner->ChangeNetworkState(NETWORK_IDLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ResetError()
|
||||
{
|
||||
mError = nullptr;
|
||||
mSrcIsUnsupportedTypeMedia = false;
|
||||
}
|
||||
|
||||
void MaybeOpenUnsupportedMediaForOwner() const
|
||||
{
|
||||
// Src is supported type or we don't open the pref for external app.
|
||||
if (!mSrcIsUnsupportedTypeMedia || !CanOwnerPlayUnsupportedTypeMedia()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If media doesn't start playing, we don't need to open it.
|
||||
if (mOwner->Paused()) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsContentUtils::DispatchTrustedEvent(
|
||||
mOwner->OwnerDoc(),
|
||||
static_cast<nsIContent*>(mOwner),
|
||||
NS_LITERAL_STRING("OpenMediaWithExternalApp"),
|
||||
CanBubble::eYes, Cancelable::eYes);
|
||||
}
|
||||
|
||||
RefPtr<MediaError> mError;
|
||||
@@ -1430,9 +1461,19 @@ private:
|
||||
aErrorCode == MEDIA_ERR_SRC_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
bool CanOwnerPlayUnsupportedTypeMedia() const
|
||||
{
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
// On Fennec, we will use an external app to open unsupported media types.
|
||||
return Preferences::GetBool("media.openUnsupportedTypeWithExternalApp");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
// Media elememt's life cycle would be longer than error sink, so we use the
|
||||
// raw pointer and this class would only be referenced by media element.
|
||||
HTMLMediaElement* mOwner;
|
||||
bool mSrcIsUnsupportedTypeMedia;
|
||||
};
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(HTMLMediaElement)
|
||||
@@ -6976,6 +7017,12 @@ HTMLMediaElement::GetError() const
|
||||
return mErrorSink->mError;
|
||||
}
|
||||
|
||||
void
|
||||
HTMLMediaElement::OpenUnsupportedMediaWithExternalAppIfNeeded() const
|
||||
{
|
||||
mErrorSink->MaybeOpenUnsupportedMediaForOwner();
|
||||
}
|
||||
|
||||
void
|
||||
HTMLMediaElement::GetCurrentSpec(nsCString& aString)
|
||||
{
|
||||
@@ -7920,6 +7967,7 @@ HTMLMediaElement::MarkAsContentSource(CallerAPI aAPI)
|
||||
void
|
||||
HTMLMediaElement::UpdateCustomPolicyAfterPlayed()
|
||||
{
|
||||
OpenUnsupportedMediaWithExternalAppIfNeeded();
|
||||
if (mAudioChannelWrapper) {
|
||||
mAudioChannelWrapper->NotifyPlayStateChanged();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user