Bug 996685 - Report an error in the console when a cross-origin media element is used with a Media(ElementAudio|Stream)SourceNode. r=pehrsons
MozReview-Commit-ID: FH7864oGQXp
--- a/dom/locales/en-US/chrome/dom/dom.properties
+++ b/dom/locales/en-US/chrome/dom/dom.properties
@@ -88,16 +88,19 @@ MediaBufferSourceNodeResampleOutOfMemory
# LOCALIZATION NOTE: Do not translate decodeAudioData.
MediaDecodeAudioDataUnknownContentType=The buffer passed to decodeAudioData contains an unknown content type.
# LOCALIZATION NOTE: Do not translate decodeAudioData.
MediaDecodeAudioDataUnknownError=An unknown error occured while processing decodeAudioData.
# LOCALIZATION NOTE: Do not translate decodeAudioData.
MediaDecodeAudioDataInvalidContent=The buffer passed to decodeAudioData contains invalid content which cannot be decoded successfully.
# LOCALIZATION NOTE: Do not translate decodeAudioData.
MediaDecodeAudioDataNoAudio=The buffer passed to decodeAudioData does not contain any audio.
+# LOCALIZATION NOTE: Do not translate HTMLMediaElement and createMediaElementAudioSourceNode.
+MediaElementAudioSourceNodeCrossOrigin=The HTMLMediaElement passed to createMediaElementAudioSourceNode has a cross-origin resource, the node will output silence.
+MediaStreamAudioSourceNodeCrossOrigin=The MediaStream passed to createMediaStreamSource has a cross-origin resource, the node it will output silence.
MediaLoadExhaustedCandidates=All candidate resources failed to load. Media load paused.
MediaLoadSourceMissingSrc=<source> element has no "src" attribute. Media resource load failed.
# LOCALIZATION NOTE: %1$S is the Http error code the server returned (e.g. 404, 500, etc), %2$S is the URL of the media resource which failed to load.
MediaLoadHttpError=HTTP load failed with status %1$S. Load of media resource %2$S failed.
# LOCALIZATION NOTE: %S is the URL of the media resource which failed to load.
MediaLoadInvalidURI=Invalid URI. Load of media resource %S failed.
# LOCALIZATION NOTE: %1$S is the media resource's format/codec type (basically equivalent to the file type, e.g. MP4,AVI,WMV,MOV etc), %2$S is the URL of the media resource which failed to load.
MediaLoadUnsupportedTypeAttribute=Specified "type" attribute of "%1$S" is not supported. Load of media resource %2$S failed.
--- a/dom/media/webaudio/MediaElementAudioSourceNode.h
+++ b/dom/media/webaudio/MediaElementAudioSourceNode.h
@@ -20,16 +20,21 @@ public:
JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
const char* NodeType() const override
{
return "MediaElementAudioSourceNode";
}
+ const char* CrossOriginErrorString() const override
+ {
+ return "MediaElementAudioSourceNodeCrossOrigin";
+ }
+
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
explicit MediaElementAudioSourceNode(AudioContext* aContext);
};
--- a/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
@@ -160,29 +160,39 @@ MediaStreamAudioSourceNode::NotifyTrackR
* change is changing to be the document principal.
*/
void
MediaStreamAudioSourceNode::PrincipalChanged(MediaStreamTrack* aMediaStreamTrack)
{
MOZ_ASSERT(aMediaStreamTrack == mInputTrack);
bool subsumes = false;
+ nsIDocument* doc = nullptr;
if (nsPIDOMWindowInner* parent = Context()->GetParentObject()) {
- nsIDocument* doc = parent->GetExtantDoc();
+ doc = parent->GetExtantDoc();
if (doc) {
nsIPrincipal* docPrincipal = doc->NodePrincipal();
nsIPrincipal* trackPrincipal = aMediaStreamTrack->GetPrincipal();
if (!trackPrincipal || NS_FAILED(docPrincipal->Subsumes(trackPrincipal, &subsumes))) {
subsumes = false;
}
}
}
auto stream = static_cast<AudioNodeExternalInputStream*>(mStream.get());
+ bool enabled = subsumes || aMediaStreamTrack->GetCORSMode() != CORS_NONE;
stream->SetInt32Parameter(MediaStreamAudioSourceNodeEngine::ENABLE,
- subsumes || aMediaStreamTrack->GetCORSMode() != CORS_NONE);
+ enabled);
+
+ if (!enabled && doc) {
+ nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
+ NS_LITERAL_CSTRING("Web Audio"),
+ doc,
+ nsContentUtils::eDOM_PROPERTIES,
+ CrossOriginErrorString());
+ }
}
size_t
MediaStreamAudioSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// Future:
// - mInputStream
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
--- a/dom/media/webaudio/MediaStreamAudioSourceNode.h
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.h
@@ -57,16 +57,21 @@ public:
uint16_t NumberOfInputs() const override { return 0; }
const char* NodeType() const override
{
return "MediaStreamAudioSourceNode";
}
+ virtual const char* CrossOriginErrorString() const
+ {
+ return "MediaStreamAudioSourceNodeCrossOrigin";
+ }
+
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
// Attaches to aTrack so that its audio content will be used as input.
void AttachToTrack(const RefPtr<MediaStreamTrack>& aTrack);
// Detaches from the currently attached track if there is one.
void DetachFromTrack();