Made AudioNode an EventTarget
authorjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 May 2013 17:54:20 +0000 (17:54 +0000)
committerjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 28 May 2013 17:54:20 +0000 (17:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=116871

Source/WebCore:

Merge: https://chromium.googlesource.com/chromium/blink/+/ef37484162ddb95d677dcfdcdd778ec60590928b

Reviewed by Darin Adler.

Tests: webaudio/audionode-expected.txt:
       webaudio/audionode.html:

Add the requisite boilerplate to allow AudioNode to become an EventTarget. Remove
all that same boilerplate from ScriptProcessorNode now that it's base class
is an EventTarget.

* Modules/webaudio/AudioNode.cpp:
(WebCore::AudioNode::interfaceName): Added boilerplate.
(WebCore::AudioNode::scriptExecutionContext): Return the AudioContext's context.
(WebCore::AudioNode::processIfNecessary): Whitespace.
* Modules/webaudio/AudioNode.h:
* Modules/webaudio/AudioNode.idl: Make AudioNode an EventTarget.
* Modules/webaudio/ScriptProcessorNode.cpp: Remove EventTarget boilerplate.
* Modules/webaudio/ScriptProcessorNode.h: Ditto.
* Modules/webaudio/ScriptProcessorNode.idl: Ditto.
* dom/EventTarget.h: Mark AudioNode as an EventTarget.
* dom/EventTargetFactory.in: Ditto.

LayoutTests:

Reviewed by Darin Adler.

* webaudio/audionode-expected.txt:
* webaudio/audionode.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@150810 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
LayoutTests/ChangeLog
LayoutTests/webaudio/audionode-expected.txt
LayoutTests/webaudio/audionode.html
Source/WebCore/ChangeLog
Source/WebCore/Modules/webaudio/AudioNode.cpp
Source/WebCore/Modules/webaudio/AudioNode.h
Source/WebCore/Modules/webaudio/AudioNode.idl
Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp
Source/WebCore/Modules/webaudio/ScriptProcessorNode.h
Source/WebCore/Modules/webaudio/ScriptProcessorNode.idl
Source/WebCore/dom/EventTarget.h
Source/WebCore/dom/EventTargetFactory.in

index accf122..36c0862 100644 (file)
@@ -1,3 +1,13 @@
+2013-05-28  Jer Noble  <jer.noble@apple.com>
+
+        Made AudioNode an EventTarget
+        https://bugs.webkit.org/show_bug.cgi?id=116871
+
+        Reviewed by Darin Adler.
+
+        * webaudio/audionode-expected.txt:
+        * webaudio/audionode.html:
+
 2013-05-28  Sergio Villar Senin  <svillar@igalia.com>
 
         Invalid block doesn't make declaration invalid
index 8358c73..7a3dc3d 100644 (file)
@@ -16,6 +16,7 @@ PASS connect() exception thrown for illegal input index.
 PASS audioNode.connect(context.destination) succeeded.
 PASS exception thrown when connecting to other context's node.
 PASS exception thrown when creating audio context with not enough arguments.
+PASS AudioNode is an EventTarget
 PASS successfullyParsed is true
 
 TEST COMPLETE
index dd0dc32..f5baec7 100644 (file)
@@ -101,6 +101,16 @@ function runTest() {
         testPassed("exception thrown when creating audio context with not enough arguments.");
     }
 
+    // Ensure it is an EventTarget
+    try {
+        audioNode.addEventListener('testEvent', function(){
+            testPassed("AudioNode is an EventTarget");
+        });
+        audioNode.dispatchEvent(new Event('testEvent'));
+    } catch(e) {
+        testFailed("exception shouldn't be thrown when testing whether audio node is an event target");
+    }
+
     finishJSTest();
 }
 
index 34125fd..fb68050 100644 (file)
@@ -1,3 +1,31 @@
+2013-05-28  Jer Noble  <jer.noble@apple.com>
+
+        Made AudioNode an EventTarget
+        https://bugs.webkit.org/show_bug.cgi?id=116871
+
+        Merge: https://chromium.googlesource.com/chromium/blink/+/ef37484162ddb95d677dcfdcdd778ec60590928b
+
+        Reviewed by Darin Adler.
+
+        Tests: webaudio/audionode-expected.txt:
+               webaudio/audionode.html:
+
+        Add the requisite boilerplate to allow AudioNode to become an EventTarget. Remove
+        all that same boilerplate from ScriptProcessorNode now that it's base class
+        is an EventTarget.
+
+        * Modules/webaudio/AudioNode.cpp:
+        (WebCore::AudioNode::interfaceName): Added boilerplate.
+        (WebCore::AudioNode::scriptExecutionContext): Return the AudioContext's context.
+        (WebCore::AudioNode::processIfNecessary): Whitespace.
+        * Modules/webaudio/AudioNode.h:
+        * Modules/webaudio/AudioNode.idl: Make AudioNode an EventTarget.
+        * Modules/webaudio/ScriptProcessorNode.cpp: Remove EventTarget boilerplate.
+        * Modules/webaudio/ScriptProcessorNode.h: Ditto.
+        * Modules/webaudio/ScriptProcessorNode.idl: Ditto.
+        * dom/EventTarget.h: Mark AudioNode as an EventTarget.
+        * dom/EventTargetFactory.in: Ditto.
+
 2013-05-28  Arvid Nilsson  <anilsson@rim.com>
 
         [BlackBerry] backface-visibility: hidden doesn't work properly with masks and filters
index 4b4dab1..41eca34 100644 (file)
@@ -280,10 +280,20 @@ void AudioNode::updateChannelsForInputs()
         input(i)->changedOutputs();
 }
 
+const AtomicString& AudioNode::interfaceName() const
+{
+    return eventNames().interfaceForAudioNode;
+}
+
+ScriptExecutionContext* AudioNode::scriptExecutionContext() const
+{
+    return const_cast<AudioNode*>(this)->context()->scriptExecutionContext();
+}
+
 void AudioNode::processIfNecessary(size_t framesToProcess)
 {
     ASSERT(context()->isAudioThread());
-    
+
     if (!isInitialized())
         return;
 
index 7b5004a..392fac4 100644 (file)
@@ -26,6 +26,7 @@
 #define AudioNode_h
 
 #include "AudioBus.h"
+#include "EventTarget.h"
 #include <wtf/Forward.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
@@ -49,7 +50,7 @@ typedef int ExceptionCode;
 // An AudioDestinationNode has one input and no outputs and represents the final destination to the audio hardware.
 // Most processing nodes such as filters will have one input and one output, although multiple inputs and outputs are possible.
 
-class AudioNode {
+class AudioNode : public EventTarget {
 public:
     enum { ProcessingSizeInFrames = 128 };
 
@@ -178,6 +179,12 @@ public:
     ChannelCountMode internalChannelCountMode() const { return m_channelCountMode; }
     AudioBus::ChannelInterpretation internalChannelInterpretation() const { return m_channelInterpretation; }
 
+    // EventTarget
+    virtual const AtomicString& interfaceName() const OVERRIDE;
+    virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE;
+    virtual EventTargetData* eventTargetData() OVERRIDE { return &m_eventTargetData; }
+    virtual EventTargetData* ensureEventTargetData() OVERRIDE { return &m_eventTargetData; }
+
 protected:
     // Inputs and outputs must be created before the AudioNode is initialized.
     void addInput(PassOwnPtr<AudioNodeInput>);
@@ -199,6 +206,8 @@ private:
     Vector<OwnPtr<AudioNodeInput> > m_inputs;
     Vector<OwnPtr<AudioNodeOutput> > m_outputs;
 
+    EventTargetData m_eventTargetData;
+
     double m_lastProcessingTime;
     double m_lastNonSilentTime;
 
@@ -214,6 +223,9 @@ private:
     static int s_nodeCount[NodeTypeEnd];
 #endif
 
+    virtual void refEventTarget() OVERRIDE { ref(); }
+    virtual void derefEventTarget() OVERRIDE { deref(); }
+
 protected:
     unsigned m_channelCount;
     ChannelCountMode m_channelCountMode;
index 0fc2348..b29e206 100644 (file)
  */
 
 [
-    Conditional=WEB_AUDIO
-] interface AudioNode {
+    Conditional=WEB_AUDIO,
+    JSGenerateToJSObject,
+    JSGenerateToNativeObject,
+    GenerateIsReachable=Impl,
+    EventTarget
+] interface AudioNode : EventTarget {
     readonly attribute AudioContext context;
     readonly attribute unsigned long numberOfInputs;
     readonly attribute unsigned long numberOfOutputs;
 
     void disconnect([Default=Undefined] optional unsigned long output)
         raises(DOMException);
+
+    void addEventListener(DOMString type, EventListener listener, optional boolean useCapture);
+
+    void removeEventListener(DOMString type, EventListener listener, optional boolean useCapture);
+
+    boolean dispatchEvent(Event event)
+        raises(EventException);
 };
index b4042dd..a608364 100644 (file)
@@ -263,16 +263,6 @@ void ScriptProcessorNode::reset()
     }
 }
 
-const AtomicString& ScriptProcessorNode::interfaceName() const
-{
-    return eventNames().interfaceForScriptProcessorNode;
-}
-
-ScriptExecutionContext* ScriptProcessorNode::scriptExecutionContext() const
-{
-    return const_cast<ScriptProcessorNode*>(this)->context()->scriptExecutionContext();
-}
-
 double ScriptProcessorNode::tailTime() const
 {
     return std::numeric_limits<double>::infinity();
index 21a9cda..c625068 100644 (file)
@@ -47,8 +47,7 @@ class AudioProcessingEvent;
 // The "onaudioprocess" attribute is an event listener which will get called periodically with an AudioProcessingEvent which has
 // AudioBuffers for each input and output.
 
-// FIXME: EventTarget should be introduced at the base of the inheritance hierarchy (i.e., as a base class for AudioNode).
-class ScriptProcessorNode : public AudioNode, public EventTarget {
+class ScriptProcessorNode : public AudioNode {
 public:
     // bufferSize must be one of the following values: 256, 512, 1024, 2048, 4096, 8192, 16384.
     // This value controls how frequently the onaudioprocess event handler is called and how many sample-frames need to be processed each call.
@@ -64,19 +63,9 @@ public:
     virtual void initialize();
     virtual void uninitialize();
 
-    // EventTarget
-    virtual const AtomicString& interfaceName() const;
-    virtual ScriptExecutionContext* scriptExecutionContext() const;
-    virtual EventTargetData* eventTargetData() { return &m_eventTargetData; }
-    virtual EventTargetData* ensureEventTargetData()  { return &m_eventTargetData; }
-
     size_t bufferSize() const { return m_bufferSize; }
 
     DEFINE_ATTRIBUTE_EVENT_LISTENER(audioprocess);
-
-    // Reconcile ref/deref which are defined both in AudioNode and EventTarget.
-    using AudioNode::ref;
-    using AudioNode::deref;
     
 private:
     virtual double tailTime() const OVERRIDE;
@@ -95,10 +84,6 @@ private:
     Vector<RefPtr<AudioBuffer> > m_inputBuffers;
     Vector<RefPtr<AudioBuffer> > m_outputBuffers;
 
-    virtual void refEventTarget() { ref(); }
-    virtual void derefEventTarget() { deref(); }
-    EventTargetData m_eventTargetData;
-
     size_t m_bufferSize;
     unsigned m_bufferReadWriteIndex;
     volatile bool m_isRequestOutstanding;
index 78cf6da..d5dcd50 100644 (file)
 [
     Conditional=WEB_AUDIO,
     JSGenerateToJSObject,
-    JSGenerateToNativeObject,
-    EventTarget
+    JSGenerateToNativeObject
 ] interface ScriptProcessorNode : AudioNode {
     // Rendering callback
     attribute EventListener onaudioprocess;
-    
+
     readonly attribute long bufferSize;
 };
index 869568a..6dd4d6e 100644 (file)
@@ -40,6 +40,7 @@
 
 namespace WebCore {
 
+    class AudioNode;
     class AudioContext;
     class AudioTrackList;
     class DedicatedWorkerContext;
index 8ea5b7b..3895aee 100644 (file)
@@ -1,5 +1,6 @@
 namespace="EventTarget"
 
+AudioNode conditional=WEB_AUDIO
 AudioContext conditional=WEB_AUDIO
 AudioTrackList conditional=VIDEO_TRACK
 BatteryManager conditional=BATTERY_STATUS
@@ -14,7 +15,6 @@ IDBDatabase conditional=INDEXED_DATABASE
 IDBOpenDBRequest conditional=INDEXED_DATABASE
 IDBRequest conditional=INDEXED_DATABASE
 IDBTransaction conditional=INDEXED_DATABASE
-ScriptProcessorNode conditional=WEB_AUDIO
 LocalMediaStream conditional=MEDIA_STREAM
 MediaKeySession conditional=ENCRYPTED_MEDIA_V2
 MediaController conditional=VIDEO