Changeset 94878 in webkit


Ignore:
Timestamp:
Sep 9, 2011 3:15:37 PM (13 years ago)
Author:
crogers@google.com
Message:

AudioBufferSourceNode must validate AudioBuffer in .buffer attribute setter
https://bugs.webkit.org/show_bug.cgi?id=67749

Reviewed by Kenneth Russell.

Source/WebCore:

Test: webaudio/audiobuffersource-channels.html

  • WebCore.gypi:
  • bindings/js/JSAudioBufferSourceNodeCustom.cpp:

(WebCore::JSAudioBufferSourceNode::setBuffer):

  • bindings/v8/custom/V8AudioBufferSourceNodeCustom.cpp: Copied from Source/WebCore/bindings/js/JSAudioBufferSourceNodeCustom.cpp.

(WebCore::V8AudioBufferSourceNode::bufferAccessorSetter):

  • webaudio/AudioBufferSourceNode.cpp:

(WebCore::AudioBufferSourceNode::setBuffer):

  • webaudio/AudioBufferSourceNode.h:
  • webaudio/AudioBufferSourceNode.idl:

LayoutTests:

  • webaudio/audiobuffersource-channels-expected.txt: Added.
  • webaudio/audiobuffersource-channels.html: Added.
Location:
trunk
Files:
2 added
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r94873 r94878  
     12011-09-09  Chris Rogers  <crogers@google.com>
     2
     3        AudioBufferSourceNode must validate AudioBuffer in .buffer attribute setter
     4        https://bugs.webkit.org/show_bug.cgi?id=67749
     5
     6        Reviewed by Kenneth Russell.
     7
     8        * webaudio/audiobuffersource-channels-expected.txt: Added.
     9        * webaudio/audiobuffersource-channels.html: Added.
     10
    1112011-09-09  Ryosuke Niwa  <rniwa@webkit.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r94877 r94878  
     12011-09-09  Chris Rogers  <crogers@google.com>
     2
     3        AudioBufferSourceNode must validate AudioBuffer in .buffer attribute setter
     4        https://bugs.webkit.org/show_bug.cgi?id=67749
     5
     6        Reviewed by Kenneth Russell.
     7
     8        Test: webaudio/audiobuffersource-channels.html
     9
     10        * WebCore.gypi:
     11        * bindings/js/JSAudioBufferSourceNodeCustom.cpp:
     12        (WebCore::JSAudioBufferSourceNode::setBuffer):
     13        * bindings/v8/custom/V8AudioBufferSourceNodeCustom.cpp: Copied from Source/WebCore/bindings/js/JSAudioBufferSourceNodeCustom.cpp.
     14        (WebCore::V8AudioBufferSourceNode::bufferAccessorSetter):
     15        * webaudio/AudioBufferSourceNode.cpp:
     16        (WebCore::AudioBufferSourceNode::setBuffer):
     17        * webaudio/AudioBufferSourceNode.h:
     18        * webaudio/AudioBufferSourceNode.idl:
     19
    1202011-09-09  Dan Bernstein  <mitz@apple.com>
    221
  • trunk/Source/WebCore/WebCore.gypi

    r94855 r94878  
    21182118            'bindings/v8/custom/V8ArrayBufferCustom.cpp',
    21192119            'bindings/v8/custom/V8ArrayBufferViewCustom.h',
     2120            'bindings/v8/custom/V8AudioBufferSourceNodeCustom.cpp',
    21202121            'bindings/v8/custom/V8AudioContextCustom.cpp',
    21212122            'bindings/v8/custom/V8AudioNodeCustom.cpp',
  • trunk/Source/WebCore/bindings/js/JSAudioBufferSourceNodeCustom.cpp

    r72838 r94878  
    2727#if ENABLE(WEB_AUDIO)
    2828
    29 #include "AudioBufferSourceNode.h"
     29#include "JSAudioBufferSourceNode.h"
    3030
    3131#include "AudioBuffer.h"
     32#include "AudioBufferSourceNode.h"
    3233#include "JSAudioBuffer.h"
    33 #include "JSAudioBufferSourceNode.h"
     34#include <runtime/Error.h>
    3435
    3536using namespace JSC;
     
    3738namespace WebCore {
    3839
    39 void JSAudioBufferSourceNode::setBuffer(ExecState*, JSValue value)
     40void JSAudioBufferSourceNode::setBuffer(ExecState* exec, JSValue value)
    4041{
    4142    AudioBufferSourceNode* imp = static_cast<AudioBufferSourceNode*>(impl());
    42     imp->setBuffer(toAudioBuffer(value));
     43    AudioBuffer* buffer = toAudioBuffer(value);
     44    if (!buffer) {
     45        throwError(exec, createSyntaxError(exec, "Value is not of type AudioBuffer"));
     46        return;
     47    }
     48   
     49    if (!imp->setBuffer(buffer))
     50        throwError(exec, createSyntaxError(exec, "AudioBuffer unsupported number of channels"));
    4351}
    4452
  • trunk/Source/WebCore/bindings/v8/custom/V8AudioBufferSourceNodeCustom.cpp

    r94877 r94878  
    11/*
    2  * Copyright (C) 2010, Google Inc. All rights reserved.
     2 * Copyright (C) 2011, Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2727#if ENABLE(WEB_AUDIO)
    2828
    29 #include "AudioBufferSourceNode.h"
     29#include "V8AudioBufferSourceNode.h"
    3030
    3131#include "AudioBuffer.h"
    32 #include "JSAudioBuffer.h"
    33 #include "JSAudioBufferSourceNode.h"
    34 
    35 using namespace JSC;
     32#include "AudioBufferSourceNode.h"
     33#include "ExceptionCode.h"
     34#include "V8AudioBuffer.h"
     35#include "V8Binding.h"
     36#include "V8Proxy.h"
    3637
    3738namespace WebCore {
    3839
    39 void JSAudioBufferSourceNode::setBuffer(ExecState*, JSValue value)
     40void V8AudioBufferSourceNode::bufferAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    4041{
    41     AudioBufferSourceNode* imp = static_cast<AudioBufferSourceNode*>(impl());
    42     imp->setBuffer(toAudioBuffer(value));
     42    INC_STATS("DOM.AudioBufferSourceNode.buffer._set");
     43    v8::Handle<v8::Object> holder = info.Holder();
     44    AudioBufferSourceNode* imp = V8AudioBufferSourceNode::toNative(holder);
     45
     46    AudioBuffer* buffer = 0;
     47    if (V8AudioBuffer::HasInstance(value)) {
     48        buffer = V8AudioBuffer::toNative(value->ToObject());
     49        if (buffer && !imp->setBuffer(buffer)) {
     50            throwError("AudioBuffer unsupported number of channels");
     51            return;
     52        }
     53    }
     54   
     55    if (!buffer) {
     56        throwError("Value is not of type AudioBuffer");
     57        return;
     58    }
    4359}
    4460
  • trunk/Source/WebCore/webaudio/AudioBufferSourceNode.cpp

    r94265 r94878  
    325325}
    326326
    327 void AudioBufferSourceNode::setBuffer(AudioBuffer* buffer)
     327bool AudioBufferSourceNode::setBuffer(AudioBuffer* buffer)
    328328{
    329329    ASSERT(isMainThread());
     
    338338        // Do any necesssary re-configuration to the buffer's number of channels.
    339339        unsigned numberOfChannels = buffer->numberOfChannels();
     340        if (!numberOfChannels || numberOfChannels > 2) {
     341            // FIXME: implement multi-channel greater than stereo.
     342            return false;
     343        }
    340344        output(0)->setNumberOfChannels(numberOfChannels);
    341345    }
     
    343347    m_virtualReadIndex = 0;
    344348    m_buffer = buffer;
     349   
     350    return true;
    345351}
    346352
  • trunk/Source/WebCore/webaudio/AudioBufferSourceNode.h

    r91723 r94878  
    5353   
    5454    // setBuffer() is called on the main thread.  This is the buffer we use for playback.
    55     void setBuffer(AudioBuffer*);
     55    // returns true on success.
     56    bool setBuffer(AudioBuffer*);
    5657    AudioBuffer* buffer() { return m_buffer.get(); }
    5758                   
  • trunk/Source/WebCore/webaudio/AudioBufferSourceNode.idl

    r92459 r94878  
    2929        GenerateToJS
    3030    ] AudioBufferSourceNode : AudioSourceNode {
    31         attribute [JSCCustomSetter] AudioBuffer buffer;
     31        attribute [CustomSetter] AudioBuffer buffer
     32            setter raises (DOMException);
    3233
    3334        readonly attribute AudioGain gain;
Note: See TracChangeset for help on using the changeset viewer.