Bug 1513039 - part5 : log warning when autoplay is blocked. r=cpearce,karlt

Wrap 'nsContentUtils::ReportToConsole()' to reduce necessary input parameters and call it when we need to log error or warning message. Show the warning when autoplay is blocked.

For web audio, this restores the console messages removed in part4 and also reports the same message when the AudioContext is blocked in the constructor.

Differential Revision: https://phabricator.services.mozilla.com/D14330

--HG--
extra : moz-landing-system : lando
This commit is contained in:
alwu 2019-01-07 19:57:48 +00:00
parent 28a21fe0ad
commit 2e3f453263
4 changed files with 39 additions and 13 deletions

View File

@ -757,9 +757,15 @@ HTMLMediaElement::MediaLoadListener::GetInterface(const nsIID& aIID,
void HTMLMediaElement::ReportLoadError(const char* aMsg,
const char16_t** aParams,
uint32_t aParamCount) {
nsContentUtils::ReportToConsole(
nsIScriptError::warningFlag, NS_LITERAL_CSTRING("Media"), OwnerDoc(),
nsContentUtils::eDOM_PROPERTIES, aMsg, aParams, aParamCount);
ReportToConsole(nsIScriptError::warningFlag, aMsg, aParams, aParamCount);
}
void HTMLMediaElement::ReportToConsole(uint32_t aErrorFlags, const char* aMsg,
const char16_t** aParams,
uint32_t aParamCount) const {
nsContentUtils::ReportToConsole(aErrorFlags, NS_LITERAL_CSTRING("Media"),
OwnerDoc(), nsContentUtils::eDOM_PROPERTIES,
aMsg, aParams, aParamCount);
}
class HTMLMediaElement::AudioChannelAgentCallback final
@ -3114,10 +3120,8 @@ already_AddRefed<DOMMediaStream> HTMLMediaElement::CaptureStreamInternal(
if (mSrcStream) {
// We don't support applying volume and mute to the captured stream, when
// capturing a MediaStream.
nsContentUtils::ReportToConsole(
nsIScriptError::errorFlag, NS_LITERAL_CSTRING("Media"), OwnerDoc(),
nsContentUtils::eDOM_PROPERTIES,
"MediaElementAudioCaptureOfMediaStreamError");
ReportToConsole(nsIScriptError::errorFlag,
"MediaElementAudioCaptureOfMediaStreamError");
return nullptr;
}
@ -3650,6 +3654,7 @@ void HTMLMediaElement::DispatchEventsWhenPlayWasNotAllowed() {
asyncDispatcher->PostDOMEvent();
#endif
OwnerDoc()->MaybeNotifyAutoplayBlocked();
ReportToConsole(nsIScriptError::warningFlag, "BlockAutoplayError");
}
void HTMLMediaElement::PlayInternal(bool aHandlingUserInput) {

View File

@ -788,6 +788,13 @@ class HTMLMediaElement : public nsGenericHTMLElement,
void ReportLoadError(const char* aMsg, const char16_t** aParams = nullptr,
uint32_t aParamCount = 0);
/**
* Log message to web console.
*/
void ReportToConsole(uint32_t aErrorFlags, const char* aMsg,
const char16_t** aParams = nullptr,
uint32_t aParamCount = 0) const;
/**
* Changes mHasPlayedOrSeeked to aValue. If mHasPlayedOrSeeked changes
* we'll force a reflow so that the video frame gets reflowed to reflect

View File

@ -173,7 +173,7 @@ AudioContext::AudioContext(nsPIDOMWindowInner* aWindow, bool aIsOffline,
AUTOPLAY_LOG("AudioContext %p is not allowed to start", this);
mWasAllowedToStart = false;
SuspendInternal(nullptr);
DispatchBlockedEvent();
ReportBlocked();
}
FFTBlock::MainThreadInit();
@ -192,7 +192,7 @@ void AudioContext::NotifyScheduledSourceNodeStarted() {
if (isAllowedToPlay) {
ResumeInternal();
} else {
DispatchBlockedEvent();
ReportBlocked();
}
}
@ -943,7 +943,7 @@ already_AddRefed<Promise> AudioContext::Resume(ErrorResult& aRv) {
mWasAllowedToStart = true;
ResumeInternal();
} else {
DispatchBlockedEvent();
ReportBlocked();
}
return promise.forget();
@ -966,7 +966,9 @@ void AudioContext::ResumeInternal() {
mSuspendCalled = false;
}
void AudioContext::DispatchBlockedEvent() {
void AudioContext::ReportBlocked() {
ReportToConsole(nsIScriptError::warningFlag, "BlockAutoplayError");
if (!StaticPrefs::MediaBlockEventEnabled()) {
return;
}
@ -1144,6 +1146,15 @@ BasicWaveFormCache* AudioContext::GetBasicWaveFormCache() {
return mBasicWaveFormCache;
}
void AudioContext::ReportToConsole(uint32_t aErrorFlags,
const char* aMsg) const {
MOZ_ASSERT(aMsg);
Document* doc =
GetParentObject() ? GetParentObject()->GetExtantDoc() : nullptr;
nsContentUtils::ReportToConsole(aErrorFlags, NS_LITERAL_CSTRING("Media"), doc,
nsContentUtils::eDOM_PROPERTIES, aMsg);
}
BasicWaveFormCache::BasicWaveFormCache(uint32_t aSampleRate)
: mSampleRate(aSampleRate) {
MOZ_ASSERT(NS_IsMainThread());

View File

@ -322,8 +322,11 @@ class AudioContext final : public DOMEventTargetHelper,
void ResumeInternal();
void SuspendInternal(void* aPromise);
// This event is used for testing only.
void DispatchBlockedEvent();
// Will report error message to console and dispatch testing event if needed
// when AudioContext is blocked by autoplay policy.
void ReportBlocked();
void ReportToConsole(uint32_t aErrorFlags, const char* aMsg) const;
private:
// Each AudioContext has an id, that is passed down the MediaStreams that