Commit e1fa6d40 authored by Hwanseung Lee's avatar Hwanseung Lee Committed by Commit Bot

[WebAudio] throw an error when buffer has been already set.

should throw an InvalidStateError when buffer has been already
set in ConvolverNode

Bug: 709656
Change-Id: Ia0826f9ffa2e180da1311f4cded8ff7fe5461147
Reviewed-on: https://chromium-review.googlesource.com/1077713Reviewed-by: default avatarRaymond Toy <rtoy@chromium.org>
Commit-Queue: Hwanseung Lee <hs1217.lee@samsung.com>
Cr-Commit-Position: refs/heads/master@{#570767}
parent 59a3f8c6
<!DOCTYPE html>
<html>
<head>
<title>
convolver-setBuffer-already-has-value.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
audit.define('test', (task, should) => {
let context = new AudioContext();
let audioBuffer = new AudioBuffer(
{numberOfChannels: 1, length: 1, sampleRate: context.sampleRate});
let convolver = context.createConvolver();
should(() => {
convolver.buffer = null;
}, 'Set buffer to null before set non-null').notThrow();
should(() => {
convolver.buffer = audioBuffer;
}, 'Set buffer first normally').notThrow();
should(() => {
convolver.buffer = audioBuffer;
}, 'Set buffer a second time').throw('InvalidStateError');
should(() => {
convolver.buffer = null;
}, 'Set buffer to null').notThrow();
should(() => {
convolver.buffer = null;
}, 'Set buffer to null again, to make sure').notThrow();
should(() => {
convolver.buffer = audioBuffer;
}, 'Set buffer to non-null to verify to throw an error')
.throw('InvalidStateError');
task.done();
});
audit.run();
</script>
</body>
</html>
...@@ -44,7 +44,9 @@ const size_t MaxFFTSize = 32768; ...@@ -44,7 +44,9 @@ const size_t MaxFFTSize = 32768;
namespace blink { namespace blink {
ConvolverHandler::ConvolverHandler(AudioNode& node, float sample_rate) ConvolverHandler::ConvolverHandler(AudioNode& node, float sample_rate)
: AudioHandler(kNodeTypeConvolver, node, sample_rate), normalize_(true) { : AudioHandler(kNodeTypeConvolver, node, sample_rate),
normalize_(true),
buffer_has_been_set_(false) {
AddInput(); AddInput();
AddOutput(1); AddOutput(1);
...@@ -94,9 +96,21 @@ void ConvolverHandler::SetBuffer(AudioBuffer* buffer, ...@@ -94,9 +96,21 @@ void ConvolverHandler::SetBuffer(AudioBuffer* buffer,
ExceptionState& exception_state) { ExceptionState& exception_state) {
DCHECK(IsMainThread()); DCHECK(IsMainThread());
if (!buffer) if (!buffer) {
reverb_.reset();
buffer_ = buffer;
return; return;
}
if (buffer && buffer_has_been_set_) {
exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
"Cannot set buffer to non-null after it "
"has been already been set to a non-null "
"buffer");
return;
}
buffer_has_been_set_ = true;
if (buffer->sampleRate() != Context()->sampleRate()) { if (buffer->sampleRate() != Context()->sampleRate()) {
exception_state.ThrowDOMException( exception_state.ThrowDOMException(
DOMExceptionCode::kNotSupportedError, DOMExceptionCode::kNotSupportedError,
......
...@@ -85,6 +85,10 @@ class MODULES_EXPORT ConvolverHandler final : public AudioHandler { ...@@ -85,6 +85,10 @@ class MODULES_EXPORT ConvolverHandler final : public AudioHandler {
// Normalize the impulse response or not. Must default to true. // Normalize the impulse response or not. Must default to true.
bool normalize_; bool normalize_;
// True if the |buffer| attribute has ever been set to a non-null
// value. Defaults to false.
bool buffer_has_been_set_;
FRIEND_TEST_ALL_PREFIXES(ConvolverNodeTest, ReverbLifetime); FRIEND_TEST_ALL_PREFIXES(ConvolverNodeTest, ReverbLifetime);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment