Bug 1541311 add support for AudioWorkletNode.numberOfInputs/Outputs r=padenot

There is no specified limit on the number of inputs or outputs, except that
the webidl parameter is unsigned long, but Gecko has an implementation-defined
limit.

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Karl Tomlinson 2019-04-03 13:38:10 +00:00
Родитель b03aa4ed38
Коммит fe0b4da7b5
3 изменённых файлов: 26 добавлений и 17 удалений

Просмотреть файл

@ -16,10 +16,13 @@ namespace dom {
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(AudioWorkletNode, AudioNode) NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(AudioWorkletNode, AudioNode)
AudioWorkletNode::AudioWorkletNode(AudioContext* aAudioContext, AudioWorkletNode::AudioWorkletNode(AudioContext* aAudioContext,
const nsAString& aName) const nsAString& aName,
const AudioWorkletNodeOptions& aOptions)
: AudioNode(aAudioContext, 2, ChannelCountMode::Max, : AudioNode(aAudioContext, 2, ChannelCountMode::Max,
ChannelInterpretation::Speakers), ChannelInterpretation::Speakers),
mNodeName(aName) {} mNodeName(aName),
mInputCount(aOptions.mNumberOfInputs),
mOutputCount(aOptions.mNumberOfOutputs) {}
/* static */ /* static */
already_AddRefed<AudioWorkletNode> AudioWorkletNode::Constructor( already_AddRefed<AudioWorkletNode> AudioWorkletNode::Constructor(
@ -57,8 +60,20 @@ already_AddRefed<AudioWorkletNode> AudioWorkletNode::Constructor(
return nullptr; return nullptr;
} }
// MSG does not support more than UINT16_MAX inputs or outputs.
if (aOptions.mNumberOfInputs > UINT16_MAX) {
aRv.ThrowRangeError<MSG_VALUE_OUT_OF_RANGE>(
NS_LITERAL_STRING("numberOfInputs"));
return nullptr;
}
if (aOptions.mNumberOfOutputs > UINT16_MAX) {
aRv.ThrowRangeError<MSG_VALUE_OUT_OF_RANGE>(
NS_LITERAL_STRING("numberOfOutputs"));
return nullptr;
}
RefPtr<AudioWorkletNode> audioWorkletNode = RefPtr<AudioWorkletNode> audioWorkletNode =
new AudioWorkletNode(&aAudioContext, aName); new AudioWorkletNode(&aAudioContext, aName, aOptions);
audioWorkletNode->Initialize(aOptions, aRv); audioWorkletNode->Initialize(aOptions, aRv);
if (NS_WARN_IF(aRv.Failed())) { if (NS_WARN_IF(aRv.Failed())) {

Просмотреть файл

@ -34,16 +34,22 @@ class AudioWorkletNode : public AudioNode {
JSObject* WrapObject(JSContext* aCx, JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override; JS::Handle<JSObject*> aGivenProto) override;
// AudioNode methods
uint16_t NumberOfInputs() const override { return mInputCount; }
uint16_t NumberOfOutputs() const override { return mOutputCount; }
const char* NodeType() const override { return "AudioWorkletNode"; } const char* NodeType() const override { return "AudioWorkletNode"; }
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override; size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override; size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
private: private:
AudioWorkletNode(AudioContext* aAudioContext, const nsAString& aName); AudioWorkletNode(AudioContext* aAudioContext, const nsAString& aName,
const AudioWorkletNodeOptions& aOptions);
~AudioWorkletNode() = default; ~AudioWorkletNode() = default;
nsString mNodeName; nsString mNodeName;
uint16_t mInputCount;
uint16_t mOutputCount;
}; };
} // namespace dom } // namespace dom

Просмотреть файл

@ -1,15 +1,3 @@
[audioworkletnode-constructor-options.https.html] [audioworkletnode-constructor-options.https.html]
expected: expected:
if release_or_beta: ERROR if release_or_beta: ERROR
[X testNode.numberOfOutputs is not equal to 18. Got 1.]
expected: FAIL
[# AUDIT TASK RUNNER FINISHED: 1 out of 6 tasks were failed.]
expected: FAIL
[< [audio-node-options\] 2 out of 6 assertions were failed.]
expected: FAIL
[X testNode.numberOfInputs is not equal to 7. Got 1.]
expected: FAIL