Changeset 152489 in webkit


Ignore:
Timestamp:
Jul 9, 2013 2:59:33 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Update Exception handling in WebAudio.
https://bugs.webkit.org/show_bug.cgi?id=118405.

Patch by Praveen R Jadhav <praveen.j@samsung.com> on 2013-07-09
Reviewed by Chris Rogers.

Source/WebCore:

AudioBufferSourceNode, OscillatorNode and AnalyserNode don't
propagate exception mentioned in WebAudio spec.
Code updated to throw DOM exception as expected.

Tests: webaudio/analyser-exception.html

webaudio/audiobuffersource-exception.html

  • Modules/webaudio/AnalyserNode.cpp:

(WebCore::AnalyserNode::setFftSize):
(WebCore::AnalyserNode::setMinDecibels):
(WebCore::AnalyserNode::setMaxDecibels):
(WebCore::AnalyserNode::setSmoothingTimeConstant):

  • Modules/webaudio/AnalyserNode.h:
  • Modules/webaudio/AnalyserNode.idl:
  • Modules/webaudio/AudioBufferSourceNode.cpp:

(WebCore::AudioBufferSourceNode::startGrain):
(WebCore::AudioBufferSourceNode::noteGrainOn):

  • Modules/webaudio/AudioBufferSourceNode.h:
  • Modules/webaudio/AudioBufferSourceNode.idl:
  • Modules/webaudio/AudioContext.cpp:

(WebCore::AudioContext::createBuffer):
(WebCore::AudioContext::createScriptProcessor):
(WebCore::AudioContext::createPeriodicWave):

  • Modules/webaudio/AudioScheduledSourceNode.cpp:

(WebCore::AudioScheduledSourceNode::start):
(WebCore::AudioScheduledSourceNode::stop):
(WebCore::AudioScheduledSourceNode::noteOn):
(WebCore::AudioScheduledSourceNode::noteOff):

  • Modules/webaudio/AudioScheduledSourceNode.h:
  • Modules/webaudio/OscillatorNode.idl:

LayoutTests:

New test cases to check exception handling in AnalyserNode and
AudioBufferSourceNode.

  • webaudio/analyser-exception-expected.txt: Added.
  • webaudio/analyser-exception.html: Added.
  • webaudio/audiobuffersource-exception-expected.txt: Added.
  • webaudio/audiobuffersource-exception.html: Added.
Location:
trunk
Files:
4 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r152488 r152489  
     12013-07-09  Praveen R Jadhav  <praveen.j@samsung.com>
     2
     3        Update Exception handling in WebAudio.
     4        https://bugs.webkit.org/show_bug.cgi?id=118405.
     5
     6        Reviewed by Chris Rogers.
     7
     8        New test cases to check exception handling in AnalyserNode and
     9        AudioBufferSourceNode.
     10
     11        * webaudio/analyser-exception-expected.txt: Added.
     12        * webaudio/analyser-exception.html: Added.
     13        * webaudio/audiobuffersource-exception-expected.txt: Added.
     14        * webaudio/audiobuffersource-exception.html: Added.
     15
    1162013-07-09  Zoltan Arvai  <zarvai@inf.u-szeged.hu>
    217
  • trunk/Source/WebCore/ChangeLog

    r152479 r152489  
     12013-07-09  Praveen R Jadhav  <praveen.j@samsung.com>
     2
     3        Update Exception handling in WebAudio.
     4        https://bugs.webkit.org/show_bug.cgi?id=118405.
     5
     6        Reviewed by Chris Rogers.
     7
     8        AudioBufferSourceNode, OscillatorNode and AnalyserNode don't
     9        propagate exception mentioned in WebAudio spec.
     10        Code updated to throw DOM exception as expected.
     11
     12        Tests: webaudio/analyser-exception.html
     13               webaudio/audiobuffersource-exception.html
     14
     15        * Modules/webaudio/AnalyserNode.cpp:
     16        (WebCore::AnalyserNode::setFftSize):
     17        (WebCore::AnalyserNode::setMinDecibels):
     18        (WebCore::AnalyserNode::setMaxDecibels):
     19        (WebCore::AnalyserNode::setSmoothingTimeConstant):
     20        * Modules/webaudio/AnalyserNode.h:
     21        * Modules/webaudio/AnalyserNode.idl:
     22        * Modules/webaudio/AudioBufferSourceNode.cpp:
     23        (WebCore::AudioBufferSourceNode::startGrain):
     24        (WebCore::AudioBufferSourceNode::noteGrainOn):
     25        * Modules/webaudio/AudioBufferSourceNode.h:
     26        * Modules/webaudio/AudioBufferSourceNode.idl:
     27        * Modules/webaudio/AudioContext.cpp:
     28        (WebCore::AudioContext::createBuffer):
     29        (WebCore::AudioContext::createScriptProcessor):
     30        (WebCore::AudioContext::createPeriodicWave):
     31        * Modules/webaudio/AudioScheduledSourceNode.cpp:
     32        (WebCore::AudioScheduledSourceNode::start):
     33        (WebCore::AudioScheduledSourceNode::stop):
     34        (WebCore::AudioScheduledSourceNode::noteOn):
     35        (WebCore::AudioScheduledSourceNode::noteOff):
     36        * Modules/webaudio/AudioScheduledSourceNode.h:
     37        * Modules/webaudio/OscillatorNode.idl:
     38
    1392013-07-08  Martin Robinson  <mrobinson@igalia.com>
    240
  • trunk/Source/WebCore/Modules/webaudio/AnalyserNode.cpp

    r149175 r152489  
    7676{
    7777    if (!m_analyser.setFftSize(size))
    78         ec = NOT_SUPPORTED_ERR;
     78        ec = INDEX_SIZE_ERR;
     79}
     80
     81void AnalyserNode::setMinDecibels(float k, ExceptionCode& ec)
     82{
     83    if (k > maxDecibels()) {
     84        ec = INDEX_SIZE_ERR;
     85        return;
     86    }
     87
     88    m_analyser.setMinDecibels(k);
     89}
     90
     91void AnalyserNode::setMaxDecibels(float k, ExceptionCode& ec)
     92{
     93    if (k < minDecibels()) {
     94        ec = INDEX_SIZE_ERR;
     95        return;
     96    }
     97
     98    m_analyser.setMaxDecibels(k);
     99}
     100
     101void AnalyserNode::setSmoothingTimeConstant(float k, ExceptionCode& ec)
     102{
     103    if (k < 0 || k > 1) {
     104        ec = INDEX_SIZE_ERR;
     105        return;
     106    }
     107
     108    m_analyser.setSmoothingTimeConstant(k);
    79109}
    80110
  • trunk/Source/WebCore/Modules/webaudio/AnalyserNode.h

    r131486 r152489  
    5151    unsigned frequencyBinCount() const { return m_analyser.frequencyBinCount(); }
    5252
    53     void setMinDecibels(float k) { m_analyser.setMinDecibels(k); }
     53    void setMinDecibels(float k, ExceptionCode&);
    5454    float minDecibels() const { return m_analyser.minDecibels(); }
    5555
    56     void setMaxDecibels(float k) { m_analyser.setMaxDecibels(k); }
     56    void setMaxDecibels(float k, ExceptionCode&);
    5757    float maxDecibels() const { return m_analyser.maxDecibels(); }
    5858
    59     void setSmoothingTimeConstant(float k) { m_analyser.setSmoothingTimeConstant(k); }
     59    void setSmoothingTimeConstant(float k, ExceptionCode&);
    6060    float smoothingTimeConstant() const { return m_analyser.smoothingTimeConstant(); }
    6161
  • trunk/Source/WebCore/Modules/webaudio/AnalyserNode.idl

    r151321 r152489  
    3131
    3232    // minDecibels / maxDecibels represent the range to scale the FFT analysis data for conversion to unsigned byte values.
    33     attribute float minDecibels;
    34     attribute float maxDecibels;
     33    [SetterRaisesException] attribute float minDecibels;
     34    [SetterRaisesException] attribute float maxDecibels;
    3535
    3636    // A value from 0.0 -> 1.0 where 0.0 represents no time averaging with the last analysis frame.
    37     attribute float smoothingTimeConstant;
     37    [SetterRaisesException] attribute float smoothingTimeConstant;
    3838
    3939    // Copies the current frequency data into the passed array.
  • trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp

    r151301 r152489  
    374374}
    375375
    376 void AudioBufferSourceNode::startGrain(double when, double grainOffset)
     376void AudioBufferSourceNode::startGrain(double when, double grainOffset, ExceptionCode& ec)
    377377{
    378378    // Duration of 0 has special value, meaning calculate based on the entire buffer's duration.
    379     startGrain(when, grainOffset, 0);
    380 }
    381 
    382 void AudioBufferSourceNode::startGrain(double when, double grainOffset, double grainDuration)
     379    startGrain(when, grainOffset, 0, ec);
     380}
     381
     382void AudioBufferSourceNode::startGrain(double when, double grainOffset, double grainDuration, ExceptionCode& ec)
    383383{
    384384    ASSERT(isMainThread());
     
    387387        context()->removeBehaviorRestriction(AudioContext::RequireUserGestureForAudioStartRestriction);
    388388
    389     if (m_playbackState != UNSCHEDULED_STATE)
     389    if (m_playbackState != UNSCHEDULED_STATE) {
     390        ec = INVALID_STATE_ERR;
    390391        return;
     392    }
    391393
    392394    if (!buffer())
     
    422424
    423425#if ENABLE(LEGACY_WEB_AUDIO)
    424 void AudioBufferSourceNode::noteGrainOn(double when, double grainOffset, double grainDuration)
    425 {
    426     startGrain(when, grainOffset, grainDuration);
     426void AudioBufferSourceNode::noteGrainOn(double when, double grainOffset, double grainDuration, ExceptionCode& ec)
     427{
     428    startGrain(when, grainOffset, grainDuration, ec);
    427429}
    428430#endif
  • trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.h

    r150924 r152489  
    3030#include "AudioParam.h"
    3131#include "AudioScheduledSourceNode.h"
     32#include "ExceptionCode.h"
    3233#include "PannerNode.h"
    3334#include <wtf/OwnArrayPtr.h>
     
    6364
    6465    // Play-state
    65     void startGrain(double when, double grainOffset);
    66     void startGrain(double when, double grainOffset, double grainDuration);
     66    void startGrain(double when, double grainOffset, ExceptionCode&);
     67    void startGrain(double when, double grainOffset, double grainDuration, ExceptionCode&);
    6768
    6869#if ENABLE(LEGACY_WEB_AUDIO)
    69     void noteGrainOn(double when, double grainOffset, double grainDuration);
     70    void noteGrainOn(double when, double grainOffset, double grainDuration, ExceptionCode&);
    7071#endif
    7172
  • trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.idl

    r151321 r152489  
    4545    attribute double loopEnd;
    4646
    47     void start(double when);
    48     [ImplementedAs=startGrain] void start(double when, double grainOffset);
    49     [ImplementedAs=startGrain] void start(double when, double grainOffset, double grainDuration);
    50     void stop(double when);
     47    [RaisesException] void start(double when);
     48    [ImplementedAs=startGrain, RaisesException] void start(double when, double grainOffset);
     49    [ImplementedAs=startGrain, RaisesException] void start(double when, double grainOffset, double grainDuration);
     50    [RaisesException] void stop(double when);
    5151
    5252    [Conditional=LEGACY_WEB_AUDIO] attribute boolean looping; // This is an alias for the .loop attribute for backwards compatibility.
    5353
    54     [Conditional=LEGACY_WEB_AUDIO] void noteOn(double when);
    55     [Conditional=LEGACY_WEB_AUDIO] void noteGrainOn(double when, double grainOffset, double grainDuration);
    56     [Conditional=LEGACY_WEB_AUDIO] void noteOff(double when);
     54    [Conditional=LEGACY_WEB_AUDIO, RaisesException] void noteOn(double when);
     55    [Conditional=LEGACY_WEB_AUDIO, RaisesException] void noteGrainOn(double when, double grainOffset, double grainDuration);
     56    [Conditional=LEGACY_WEB_AUDIO, RaisesException] void noteOff(double when);
    5757   
    5858    attribute EventListener onended;
  • trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp

    r151914 r152489  
    9292
    9393const unsigned MaxNodesToDeletePerQuantum = 10;
     94const unsigned MaxPeriodicWaveLength = 4096;
    9495
    9596namespace WebCore {
     
    329330    RefPtr<AudioBuffer> audioBuffer = AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate);
    330331    if (!audioBuffer.get()) {
    331         ec = SYNTAX_ERR;
     332        ec = NOT_SUPPORTED_ERR;
    332333        return 0;
    333334    }
     
    465466
    466467    if (!node.get()) {
    467         ec = SYNTAX_ERR;
     468        ec = INDEX_SIZE_ERR;
    468469        return 0;
    469470    }
     
    598599    ASSERT(isMainThread());
    599600   
    600     if (!real || !imag || (real->length() != imag->length())) {
     601    if (!real || !imag || (real->length() != imag->length() || (real->length() > MaxPeriodicWaveLength) || (real->length() <= 0))) {
    601602        ec = SYNTAX_ERR;
    602603        return 0;
  • trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp

    r151301 r152489  
    136136}
    137137
    138 void AudioScheduledSourceNode::start(double when)
     138void AudioScheduledSourceNode::start(double when, ExceptionCode& ec)
    139139{
    140140    ASSERT(isMainThread());
     
    143143        context()->removeBehaviorRestriction(AudioContext::RequireUserGestureForAudioStartRestriction);
    144144
    145     if (m_playbackState != UNSCHEDULED_STATE)
    146         return;
     145    if (m_playbackState != UNSCHEDULED_STATE) {
     146        ec = INVALID_STATE_ERR;
     147        return;
     148    }
    147149
    148150    m_startTime = when;
     
    150152}
    151153
    152 void AudioScheduledSourceNode::stop(double when)
     154void AudioScheduledSourceNode::stop(double when, ExceptionCode& ec)
    153155{
    154156    ASSERT(isMainThread());
    155     if (!(m_playbackState == SCHEDULED_STATE || m_playbackState == PLAYING_STATE))
    156         return;
     157    if (!(m_playbackState == SCHEDULED_STATE || m_playbackState == PLAYING_STATE)) {
     158        ec = INVALID_STATE_ERR;
     159        return;
     160    }
    157161   
    158162    when = max(0.0, when);
     
    161165
    162166#if ENABLE(LEGACY_WEB_AUDIO)
    163 void AudioScheduledSourceNode::noteOn(double when)
    164 {
    165     start(when);
    166 }
    167 
    168 void AudioScheduledSourceNode::noteOff(double when)
    169 {
    170     stop(when);
     167void AudioScheduledSourceNode::noteOn(double when, ExceptionCode& ec)
     168{
     169    start(when, ec);
     170}
     171
     172void AudioScheduledSourceNode::noteOff(double when, ExceptionCode& ec)
     173{
     174    stop(when, ec);
    171175}
    172176#endif
  • trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h

    r150924 r152489  
    3131
    3232#include "AudioNode.h"
     33#include "ExceptionCode.h"
    3334
    3435namespace WebCore {
     
    5859
    5960    // Scheduling.
    60     void start(double when);
    61     void stop(double when);
     61    void start(double when, ExceptionCode&);
     62    void stop(double when, ExceptionCode&);
    6263
    6364#if ENABLE(LEGACY_WEB_AUDIO)
    64     void noteOn(double when);
    65     void noteOff(double when);
     65    void noteOn(double when, ExceptionCode&);
     66    void noteOff(double when, ExceptionCode&);
    6667#endif
    6768
  • trunk/Source/WebCore/Modules/webaudio/OscillatorNode.idl

    r151914 r152489  
    4949    readonly attribute AudioParam detune; // in Cents
    5050
    51     void start(double when);
    52     void stop(double when);
     51    [RaisesException] void start(double when);
     52    [RaisesException] void stop(double when);
    5353
    54     [Conditional=LEGACY_WEB_AUDIO] void noteOn(double when);
    55     [Conditional=LEGACY_WEB_AUDIO] void noteOff(double when);
     54    [Conditional=LEGACY_WEB_AUDIO, RaisesException] void noteOn(double when);
     55    [Conditional=LEGACY_WEB_AUDIO, RaisesException] void noteOff(double when);
    5656
    5757    void setPeriodicWave(PeriodicWave wave);
Note: See TracChangeset for help on using the changeset viewer.