Changeset 265028 in webkit


Ignore:
Timestamp:
Jul 28, 2020 10:18:35 PM (4 years ago)
Author:
Chris Dumez
Message:

Source/WebCore:
Move non standard OscillatorNode API to new webKitOscillatorNode interface
https://bugs.webkit.org/show_bug.cgi?id=214902

Reviewed by Darin Adler.

Move non standard OscillatorNode API to new webKitOscillatorNode interface:
https://webaudio.github.io/web-audio-api/#oscillatornode

Namely, the playbackState attribute and its associated constants are now exposed
on the prefixed webKitOscillatorNode interface instead of the unprefixed
OscillatorNode. This way, this API is still available to apps using the prefixed
API but we do not support this legacy API if the app is using the modern unprefixed
API.

Test: webaudio/oscillatornode-legacy-api.html

  • CMakeLists.txt:
  • DerivedSources-input.xcfilelist:
  • DerivedSources-output.xcfilelist:
  • DerivedSources.make:
  • Modules/webaudio/OscillatorNode.cpp:

(WebCore::OscillatorNode::create):
(WebCore::OscillatorNode::setType):
(WebCore::OscillatorNode::setPeriodicWave):

  • Modules/webaudio/OscillatorNode.h:
  • Modules/webaudio/OscillatorNode.idl:
  • Modules/webaudio/WebKitAudioContext.cpp:

(WebCore::WebKitAudioContext::createWebKitOscillator):

  • Modules/webaudio/WebKitAudioContext.h:
  • Modules/webaudio/WebKitAudioContext.idl:
  • Modules/webaudio/WebKitOscillatorNode.h: Copied from Source/WebCore/Modules/webaudio/OscillatorNode.idl.

(WebCore::WebKitOscillatorNode::create):
(WebCore::WebKitOscillatorNode::setWebKitPeriodicWave):
(WebCore::WebKitOscillatorNode::WebKitOscillatorNode):

  • Modules/webaudio/WebKitOscillatorNode.idl: Copied from Source/WebCore/Modules/webaudio/OscillatorNode.idl.
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/WebCoreBuiltinNames.h:

LayoutTests:
Move non standard OscillatorNode API to new WebKitOscillatorNode interface
https://bugs.webkit.org/show_bug.cgi?id=214902

Reviewed by Darin Adler.

Add layout test coverage.

  • webaudio/oscillatornode-legacy-api-expected.txt: Added.
  • webaudio/oscillatornode-legacy-api.html: Added.
Location:
trunk
Files:
2 added
15 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r265026 r265028  
     12020-07-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Move non standard OscillatorNode API to new WebKitOscillatorNode interface
     4        https://bugs.webkit.org/show_bug.cgi?id=214902
     5
     6        Reviewed by Darin Adler.
     7
     8        Add layout test coverage.
     9
     10        * webaudio/oscillatornode-legacy-api-expected.txt: Added.
     11        * webaudio/oscillatornode-legacy-api.html: Added.
     12
    1132020-07-28  Karl Rackler  <rackler@apple.com>
    214
  • trunk/Source/WebCore/CMakeLists.txt

    r265002 r265028  
    494494    Modules/webaudio/WebKitAudioPannerNode.idl
    495495    Modules/webaudio/WebKitOfflineAudioContext.idl
     496    Modules/webaudio/WebKitOscillatorNode.idl
    496497
    497498    Modules/webauthn/AttestationConveyancePreference.idl
  • trunk/Source/WebCore/ChangeLog

    r265026 r265028  
     12020-07-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Move non standard OscillatorNode API to new webKitOscillatorNode interface
     4        https://bugs.webkit.org/show_bug.cgi?id=214902
     5
     6        Reviewed by Darin Adler.
     7
     8        Move non standard OscillatorNode API to new webKitOscillatorNode interface:
     9        https://webaudio.github.io/web-audio-api/#oscillatornode
     10
     11        Namely, the playbackState attribute and its associated constants are now exposed
     12        on the prefixed webKitOscillatorNode interface instead of the unprefixed
     13        OscillatorNode. This way, this API is still available to apps using the prefixed
     14        API but we do not support this legacy API if the app is using the modern unprefixed
     15        API.
     16
     17        Test: webaudio/oscillatornode-legacy-api.html
     18
     19        * CMakeLists.txt:
     20        * DerivedSources-input.xcfilelist:
     21        * DerivedSources-output.xcfilelist:
     22        * DerivedSources.make:
     23        * Modules/webaudio/OscillatorNode.cpp:
     24        (WebCore::OscillatorNode::create):
     25        (WebCore::OscillatorNode::setType):
     26        (WebCore::OscillatorNode::setPeriodicWave):
     27        * Modules/webaudio/OscillatorNode.h:
     28        * Modules/webaudio/OscillatorNode.idl:
     29        * Modules/webaudio/WebKitAudioContext.cpp:
     30        (WebCore::WebKitAudioContext::createWebKitOscillator):
     31        * Modules/webaudio/WebKitAudioContext.h:
     32        * Modules/webaudio/WebKitAudioContext.idl:
     33        * Modules/webaudio/WebKitOscillatorNode.h: Copied from Source/WebCore/Modules/webaudio/OscillatorNode.idl.
     34        (WebCore::WebKitOscillatorNode::create):
     35        (WebCore::WebKitOscillatorNode::setWebKitPeriodicWave):
     36        (WebCore::WebKitOscillatorNode::WebKitOscillatorNode):
     37        * Modules/webaudio/WebKitOscillatorNode.idl: Copied from Source/WebCore/Modules/webaudio/OscillatorNode.idl.
     38        * Sources.txt:
     39        * WebCore.xcodeproj/project.pbxproj:
     40        * bindings/js/WebCoreBuiltinNames.h:
     41
    1422020-07-28  Karl Rackler  <rackler@apple.com>
    243
  • trunk/Source/WebCore/DerivedSources-input.xcfilelist

    r265002 r265028  
    343343$(PROJECT_DIR)/Modules/webaudio/WebKitAudioPannerNode.idl
    344344$(PROJECT_DIR)/Modules/webaudio/WebKitOfflineAudioContext.idl
     345$(PROJECT_DIR)/Modules/webaudio/WebKitOscillatorNode.idl
    345346$(PROJECT_DIR)/Modules/webauthn/AttestationConveyancePreference.idl
    346347$(PROJECT_DIR)/Modules/webauthn/AuthenticationExtensionsClientInputs.idl
  • trunk/Source/WebCore/DerivedSources-output.xcfilelist

    r265002 r265028  
    21372137$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitOfflineAudioContext.cpp
    21382138$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitOfflineAudioContext.h
     2139$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitOscillatorNode.cpp
     2140$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitOscillatorNode.h
    21392141$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitPlaybackTargetAvailabilityEvent.cpp
    21402142$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSWebKitPlaybackTargetAvailabilityEvent.h
  • trunk/Source/WebCore/DerivedSources.make

    r265002 r265028  
    426426    $(WebCore)/Modules/webaudio/WebKitAudioPannerNode.idl \
    427427    $(WebCore)/Modules/webaudio/WebKitOfflineAudioContext.idl \
     428    $(WebCore)/Modules/webaudio/WebKitOscillatorNode.idl \
    428429    $(WebCore)/Modules/webauthn/AttestationConveyancePreference.idl \
    429430    $(WebCore)/Modules/webauthn/AuthenticationExtensionsClientInputs.idl \
  • trunk/Source/WebCore/Modules/webaudio/OscillatorNode.cpp

    r264941 r265028  
    6565        return result.releaseException();
    6666   
    67     if (options.periodicWave.get())
    68         oscillator->setPeriodicWave(options.periodicWave.get());
     67    if (options.periodicWave)
     68        oscillator->setPeriodicWave(*options.periodicWave);
    6969    else {
    7070        result = oscillator->setType(options.type);
     
    126126    }
    127127
    128     setPeriodicWave(periodicWave);
     128    setPeriodicWave(*periodicWave);
    129129    m_type = type;
    130130
     
    315315}
    316316
    317 void OscillatorNode::setPeriodicWave(PeriodicWave* periodicWave)
    318 {
    319     ALWAYS_LOG(LOGIDENTIFIER, "sample rate = ", periodicWave ? periodicWave->sampleRate() : 0, ", wave size = ", periodicWave ? periodicWave->periodicWaveSize() : 0, ", rate scale = ", periodicWave ? periodicWave->rateScale() : 0);
     317void OscillatorNode::setPeriodicWave(PeriodicWave& periodicWave)
     318{
     319    ALWAYS_LOG(LOGIDENTIFIER, "sample rate = ", periodicWave.sampleRate(), ", wave size = ", periodicWave.periodicWaveSize(), ", rate scale = ", periodicWave.rateScale());
    320320    ASSERT(isMainThread());
    321321   
    322322    // This synchronizes with process().
    323323    auto locker = holdLock(m_processMutex);
    324     m_periodicWave = periodicWave;
     324    m_periodicWave = &periodicWave;
    325325    m_type = OscillatorType::Custom;
    326326}
  • trunk/Source/WebCore/Modules/webaudio/OscillatorNode.h

    r264941 r265028  
    3636// OscillatorNode is an audio generator of periodic waveforms.
    3737
    38 class OscillatorNode final : public AudioScheduledSourceNode {
     38class OscillatorNode : public AudioScheduledSourceNode {
    3939    WTF_MAKE_ISO_ALLOCATED(OscillatorNode);
    4040public:
     
    5151    AudioParam* detune() { return m_detune.get(); }
    5252
    53     void setPeriodicWave(PeriodicWave*);
     53    void setPeriodicWave(PeriodicWave&);
     54
     55protected:
     56    explicit OscillatorNode(BaseAudioContext&, const OscillatorOptions& = { });
    5457
    5558private:
    56     explicit OscillatorNode(BaseAudioContext&, const OscillatorOptions& = { });
    57 
    5859    void process(size_t framesToProcess) final;
    5960    void reset() final;
  • trunk/Source/WebCore/Modules/webaudio/OscillatorNode.idl

    r264941 r265028  
    11/*
    22 * Copyright (C) 2012, Google Inc. All rights reserved.
    3  * Copyright (C) 2016, Apple Inc. All rights reserved.
     3 * Copyright (C) 2016-2020, Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    2828    JSGenerateToJSObject,
    2929    ActiveDOMObject,
     30    EnabledBySetting=ModernUnprefixedWebAudio
    3031] interface OscillatorNode : AudioScheduledSourceNode {
    31     [MayThrowException, EnabledBySetting=ModernUnprefixedWebAudio] constructor (BaseAudioContext context, optional OscillatorOptions options);
     32    [MayThrowException] constructor (BaseAudioContext context, optional OscillatorOptions options);
    3233
    3334    attribute OscillatorType type;
    34 
    35     // Playback state constants.
    36     const unsigned short UNSCHEDULED_STATE = 0;
    37     const unsigned short SCHEDULED_STATE = 1;
    38     const unsigned short PLAYING_STATE = 2;
    39     const unsigned short FINISHED_STATE = 3;
    40 
    41     readonly attribute unsigned short playbackState;
    4235
    4336    readonly attribute AudioParam frequency; // in Hertz
    4437    readonly attribute AudioParam detune; // in Cents
    4538
    46     void setPeriodicWave(PeriodicWave? wave); // FIXME: The parameter should not be nullable.
     39    void setPeriodicWave(PeriodicWave wave);
    4740};
  • trunk/Source/WebCore/Modules/webaudio/WebKitAudioContext.cpp

    r264782 r265028  
    3333#include "PeriodicWave.h"
    3434#include "WebKitAudioPannerNode.h"
     35#include "WebKitOscillatorNode.h"
    3536#include <wtf/IsoMallocInlines.h>
    3637
     
    171172}
    172173
     174ExceptionOr<Ref<WebKitOscillatorNode>> WebKitAudioContext::createWebKitOscillator()
     175{
     176    ALWAYS_LOG(LOGIDENTIFIER);
     177
     178    ASSERT(isMainThread());
     179    if (isStopped())
     180        return Exception { InvalidStateError };
     181
     182    lazyInitialize();
     183
     184    auto node = WebKitOscillatorNode::create(*this);
     185    if (node.hasException())
     186        return node.releaseException();
     187
     188    // Because this is an AudioScheduledSourceNode, the context keeps a reference until it has finished playing.
     189    // When this happens, AudioScheduledSourceNode::finish() calls BaseAudioContext::notifyNodeFinishedProcessing().
     190    auto nodeValue = node.releaseReturnValue();
     191    refNode(nodeValue);
     192    return nodeValue;
     193}
     194
    173195ExceptionOr<Ref<PeriodicWave>> WebKitAudioContext::createPeriodicWave(Float32Array& real, Float32Array& imaginary)
    174196{
  • trunk/Source/WebCore/Modules/webaudio/WebKitAudioContext.h

    r264782 r265028  
    3939class PeriodicWave;
    4040class WebKitAudioPannerNode;
     41class WebKitOscillatorNode;
    4142
    4243// AudioContext is the cornerstone of the web audio API and all AudioNodes are created from it.
     
    6263#endif
    6364    ExceptionOr<Ref<WebKitAudioPannerNode>> createWebKitPanner();
     65    ExceptionOr<Ref<WebKitOscillatorNode>> createWebKitOscillator();
    6466    ExceptionOr<Ref<PeriodicWave>> createPeriodicWave(Float32Array& real, Float32Array& imaginary);
    6567
  • trunk/Source/WebCore/Modules/webaudio/WebKitAudioContext.idl

    r263410 r265028  
    8080    [MayThrowException] AnalyserNode createAnalyser();
    8181    [MayThrowException] ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0, optional unsigned long numberOfInputChannels = 2, optional unsigned long numberOfOutputChannels = 2);
    82     [MayThrowException] OscillatorNode createOscillator();
     82    [MayThrowException, ImplementedAs=createWebKitOscillator] WebKitOscillatorNode createOscillator();
    8383    [MayThrowException] PeriodicWave createPeriodicWave(Float32Array real, Float32Array imag);
    8484
  • trunk/Source/WebCore/Modules/webaudio/WebKitOscillatorNode.h

    r265027 r265028  
    11/*
    22 * Copyright (C) 2012, Google Inc. All rights reserved.
    3  * Copyright (C) 2016, Apple Inc. All rights reserved.
     3 * Copyright (C) 2020, Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    2323 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2424 */
    25  
    26 [
    27     Conditional=WEB_AUDIO,
    28     JSGenerateToJSObject,
    29     ActiveDOMObject,
    30 ] interface OscillatorNode : AudioScheduledSourceNode {
    31     [MayThrowException, EnabledBySetting=ModernUnprefixedWebAudio] constructor (BaseAudioContext context, optional OscillatorOptions options);
    3225
    33     attribute OscillatorType type;
     26#pragma once
    3427
    35     // Playback state constants.
    36     const unsigned short UNSCHEDULED_STATE = 0;
    37     const unsigned short SCHEDULED_STATE = 1;
    38     const unsigned short PLAYING_STATE = 2;
    39     const unsigned short FINISHED_STATE = 3;
     28#include "OscillatorNode.h"
    4029
    41     readonly attribute unsigned short playbackState;
     30namespace WebCore {
    4231
    43     readonly attribute AudioParam frequency; // in Hertz
    44     readonly attribute AudioParam detune; // in Cents
     32class WebKitOscillatorNode final : public OscillatorNode {
     33public:
     34    static ExceptionOr<Ref<WebKitOscillatorNode>> create(WebKitAudioContext& context)
     35    {
     36        return adoptRef(*new WebKitOscillatorNode(context));
     37    }
    4538
    46     void setPeriodicWave(PeriodicWave? wave); // FIXME: The parameter should not be nullable.
     39    void setWebKitPeriodicWave(PeriodicWave* wave)
     40    {
     41        if (!wave)
     42            return;
     43        setPeriodicWave(*wave);
     44    }
     45
     46private:
     47    explicit WebKitOscillatorNode(WebKitAudioContext& context)
     48        : OscillatorNode(context)
     49    {
     50        setType(OscillatorType::Sine);
     51    }
     52
     53    const char* activeDOMObjectName() const final { return "WebKitOscillatorNode"; }
    4754};
     55
     56} // namespace WebCore
  • trunk/Source/WebCore/Modules/webaudio/WebKitOscillatorNode.idl

    r265027 r265028  
    11/*
    22 * Copyright (C) 2012, Google Inc. All rights reserved.
    3  * Copyright (C) 2016, Apple Inc. All rights reserved.
     3 * Copyright (C) 2016-2020, Apple Inc. All rights reserved.
    44 *
    55 * Redistribution and use in source and binary forms, with or without
     
    2323 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2424 */
    25  
     25
    2626[
     27    ActiveDOMObject,
    2728    Conditional=WEB_AUDIO,
     29    EnabledBySetting=WebAudio&PrefixedWebAudio,
    2830    JSGenerateToJSObject,
    29     ActiveDOMObject,
    30 ] interface OscillatorNode : AudioScheduledSourceNode {
    31     [MayThrowException, EnabledBySetting=ModernUnprefixedWebAudio] constructor (BaseAudioContext context, optional OscillatorOptions options);
    32 
     31    InterfaceName=webkitOscillatorNode,
     32] interface WebKitOscillatorNode : AudioScheduledSourceNode {
    3333    attribute OscillatorType type;
    3434
     
    4444    readonly attribute AudioParam detune; // in Cents
    4545
    46     void setPeriodicWave(PeriodicWave? wave); // FIXME: The parameter should not be nullable.
     46    [ImplementedAs=setWebKitPeriodicWave] void setPeriodicWave(PeriodicWave? wave);
    4747};
  • trunk/Source/WebCore/Sources.txt

    r265002 r265028  
    35703570JSWebKitNamespace.cpp
    35713571JSWebKitOfflineAudioContext.cpp
     3572JSWebKitOscillatorNode.cpp
    35723573JSWebKitPlaybackTargetAvailabilityEvent.cpp
    35733574JSWebKitPoint.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r265002 r265028  
    24362436                833B9E361F508D8500E0E428 /* JSFileSystemFileEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 833B9E2C1F508D8000E0E428 /* JSFileSystemFileEntry.h */; };
    24372437                83407FC11E8D9C1700E048D3 /* VisibilityChangeClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 83407FC01E8D9C1200E048D3 /* VisibilityChangeClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2438                8343D98424D0DEE9009ABD49 /* WebKitOscillatorNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 8343D98124D0DEA9009ABD49 /* WebKitOscillatorNode.h */; };
    24382439                834476EF1DA5BC5E002B5EB0 /* JSScrollLogicalPosition.h in Headers */ = {isa = PBXBuildFile; fileRef = 83E9B3011DA5A51E00FFD8D4 /* JSScrollLogicalPosition.h */; };
    24392440                834476EF1DA5BC5E002B5EC1 /* JSScrollIntoViewOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 83E9B3011DA5A51E00FFD8E5 /* JSScrollIntoViewOptions.h */; };
     
    1041310414                833CF70F20DB3F5F00141BCC /* JSPerformanceObserverCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPerformanceObserverCustom.cpp; sourceTree = "<group>"; };
    1041410415                83407FC01E8D9C1200E048D3 /* VisibilityChangeClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisibilityChangeClient.h; sourceTree = "<group>"; };
     10416                8343D98124D0DEA9009ABD49 /* WebKitOscillatorNode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebKitOscillatorNode.h; sourceTree = "<group>"; };
     10417                8343D98324D0DEA9009ABD49 /* WebKitOscillatorNode.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebKitOscillatorNode.idl; sourceTree = "<group>"; };
    1041510418                8348BFA91B85729500912F36 /* ClassCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ClassCollection.cpp; sourceTree = "<group>"; };
    1041610419                8348BFAA1B85729500912F36 /* ClassCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassCollection.h; sourceTree = "<group>"; };
     
    2957429577                                831B61752499A59D00C07C79 /* WebKitOfflineAudioContext.h */,
    2957529578                                831B61722499A59A00C07C79 /* WebKitOfflineAudioContext.idl */,
     29579                                8343D98124D0DEA9009ABD49 /* WebKitOscillatorNode.h */,
     29580                                8343D98324D0DEA9009ABD49 /* WebKitOscillatorNode.idl */,
    2957629581                        );
    2957729582                        path = webaudio;
     
    3400634011                                7A22732120C9FAFE00DB1DEF /* WebKitNSImageExtras.h in Headers */,
    3400734012                                831B61772499A5BF00C07C79 /* WebKitOfflineAudioContext.h in Headers */,
     34013                                8343D98424D0DEE9009ABD49 /* WebKitOscillatorNode.h in Headers */,
    3400834014                                A5DEBDA416FB908700836FE0 /* WebKitPlaybackTargetAvailabilityEvent.h in Headers */,
    3400934015                                494BD7950F55C8EE00747828 /* WebKitPoint.h in Headers */,
  • trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h

    r263999 r265028  
    171171    macro(OffscreenCanvas) \
    172172    macro(OffscreenCanvasRenderingContext2D) \
     173    macro(OscillatorNode) \
    173174    macro(PaintRenderingContext2D) \
    174175    macro(PannerNode) \
     
    403404    macro(webkitIndexedDB) \
    404405    macro(webkitOfflineAudioContext) \
     406    macro(webkitOscillatorNode) \
    405407    macro(window) \
    406408    macro(writing) \
Note: See TracChangeset for help on using the changeset viewer.