WPT
wpt / webaudio / the-audio-api / the-pannernode-interface / ctor-panner.html
Spec: Web Audio API ↗
Runs: Chrome 155.0.8043.0 (wpt@b89af32bc, 2026-09-05) | Firefox 157.0a1 (wpt@b89af32bc, 2026-09-05) | Safari 251 preview (wpt@9b965429d, 2026-09-05) | Ladybird 1.0-d25dc (wpt@b89af32bc, 2026-09-05) | Servo Servo 0.6 (wpt@2c385f65e, 2026-09-04) | Blitz a50cb8971 (wpt@a95401e4e, 2026-09-03)
View on the Blitz WPT dashboard | Open test on wpt.live | wpt.fyi
| Chrome | Firefox | Safari | Ladybird | Servo | Blitz | |
|---|---|---|---|---|---|---|
| Total | 125/125 | 114/125 | 125/125 | 125/125 | 125/125 | NOT RUN |
| Subtest | Chrome | Firefox | Safari | Ladybird | Servo | Blitz |
|---|---|---|---|---|---|---|
| # AUDIT TASK RUNNER STARTED. | PASS | PASS | PASS | PASS | PASS | — |
| Executing "initialize" | PASS | PASS | PASS | PASS | PASS | — |
| Executing "invalid constructor" | PASS | PASS | PASS | PASS | PASS | — |
| Executing "default constructor" | PASS | FAIL | PASS | PASS | PASS | — |
| Executing "test AudioNodeOptions" | PASS | PASS | PASS | PASS | PASS | — |
| Executing "constructor with options" | PASS | PASS | PASS | PASS | PASS | — |
| Audit report | PASS | PASS | PASS | PASS | PASS | — |
| > [initialize] | PASS | PASS | PASS | PASS | PASS | — |
| context = new OfflineAudioContext(...) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| < [initialize] All assertions passed. (total 1 assertions) | PASS | PASS | PASS | PASS | PASS | — |
| > [invalid constructor] | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode() threw TypeError: "Failed to construct 'PannerNode': 1 argument required, but only 0 present.". | PASS | — | — | — | — | — |
| new PannerNode(1) threw TypeError: "Failed to construct 'PannerNode': parameter 1 is not of type 'BaseAudioContext'.". | PASS | — | — | — | — | — |
| new PannerNode(context, 42) threw TypeError: "Failed to construct 'PannerNode': The provided value is not of type 'PannerOptions'.". | PASS | — | — | — | — | — |
| < [invalid constructor] All assertions passed. (total 3 assertions) | PASS | PASS | PASS | PASS | PASS | — |
| > [default constructor] | PASS | PASS | PASS | PASS | PASS | — |
| node0 = new PannerNode(context) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node0 instanceof PannerNode is equal to true. | PASS | PASS | PASS | PASS | PASS | — |
| node0.numberOfInputs is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node0.numberOfOutputs is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node0.channelCount is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| node0.channelCountMode is equal to clamped-max. | PASS | PASS | PASS | PASS | PASS | — |
| node0.channelInterpretation is equal to speakers. | PASS | PASS | PASS | PASS | PASS | — |
| node0.panningModel is equal to equalpower. | PASS | PASS | PASS | PASS | PASS | — |
| node0.positionX.value is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node0.positionY.value is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node0.positionZ.value is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node0.orientationX.value is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node0.orientationY.value is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node0.orientationZ.value is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node0.distanceModel is equal to inverse. | PASS | PASS | PASS | PASS | PASS | — |
| node0.refDistance is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node0.maxDistance is equal to 10000. | PASS | PASS | PASS | PASS | PASS | — |
| node0.rolloffFactor is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node0.coneInnerAngle is equal to 360. | PASS | PASS | PASS | PASS | PASS | — |
| node0.coneOuterAngle is equal to 360. | PASS | PASS | PASS | PASS | PASS | — |
| node0.coneOuterGain is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| context.listener.positionX.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.positionY.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.positionZ.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.forwardX.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.forwardY.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.forwardZ.value is equal to -1. | PASS | — | PASS | PASS | PASS | — |
| context.listener.upX.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| context.listener.upY.value is equal to 1. | PASS | — | PASS | PASS | PASS | — |
| context.listener.upZ.value is equal to 0. | PASS | — | PASS | PASS | PASS | — |
| < [default constructor] All assertions passed. (total 30 assertions) | PASS | — | PASS | PASS | PASS | — |
| > [test AudioNodeOptions] | PASS | PASS | PASS | PASS | PASS | — |
| node1 = new PannerNode(c, {"channelCount":1}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node1.channelCount is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node2 = new PannerNode(c, {"channelCount":2}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node2.channelCount is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"channelCount":0}) threw NotSupportedError: "Failed to construct 'PannerNode': The channelCount provided (0) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount = 0 threw NotSupportedError: "Failed to set the 'channelCount' property on 'AudioNode': The channelCount provided (0) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount after setting to 0 is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"channelCount":3}) threw NotSupportedError: "Failed to construct 'PannerNode': The channelCount provided (3) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount = 3 threw NotSupportedError: "Failed to set the 'channelCount' property on 'AudioNode': The channelCount provided (3) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount after setting to 3 is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"channelCount":99}) threw NotSupportedError: "Failed to construct 'PannerNode': The channelCount provided (99) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount = 99 threw NotSupportedError: "Failed to set the 'channelCount' property on 'AudioNode': The channelCount provided (99) is outside the range [1, 2].". | PASS | — | — | — | — | — |
| node.channelCount after setting to 99 is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| node3 = new PannerNode(c, {"channelCountMode":"clamped-max"}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node3.channelCountMode is equal to clamped-max. | PASS | PASS | PASS | PASS | PASS | — |
| node4 = new PannerNode(c, {"channelCountMode":"explicit"}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node4.channelCountMode is equal to explicit. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"channelCountMode":"max"}) threw NotSupportedError: "Failed to construct 'PannerNode': Panner: 'max' is not allowed". | PASS | — | — | — | — | — |
| node.channelCountMode = max threw NotSupportedError: "Failed to set the 'channelCountMode' property on 'AudioNode': Panner: 'max' is not allowed". | PASS | — | — | — | — | — |
| node.channelCountMode after setting to max is equal to clamped-max. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, " + JSON.stringify(options) + ") threw TypeError: "Failed to construct 'PannerNode': Failed to read the 'channelCountMode' property from 'AudioNodeOptions': The provided value 'foobar' is not a valid enum value of type ChannelCountMode.". | PASS | — | — | — | — | — |
| node.channelCountMode = foobar did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node.channelCountMode after setting to foobar is equal to clamped-max. | PASS | PASS | PASS | PASS | PASS | — |
| node5 = new PannerNode(c, {"channelInterpretation":"speakers"}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node5.channelInterpretation is equal to speakers. | PASS | PASS | PASS | PASS | PASS | — |
| node6 = new PannerNode(c, {"channelInterpretation":"discrete"}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node6.channelInterpretation is equal to discrete. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"channelInterpretation":"foobar"}) threw TypeError: "Failed to construct 'PannerNode': Failed to read the 'channelInterpretation' property from 'AudioNodeOptions': The provided value 'foobar' is not a valid enum value of type ChannelInterpretation.". | PASS | — | — | — | — | — |
| new PannerNode(c, {"maxDistance":-1}) threw RangeError: "Failed to construct 'PannerNode': The maxDistance provided (-1) is less than the minimum bound (0).". | PASS | — | — | — | — | — |
| node.maxDistance = -1 threw RangeError: "Failed to set the 'maxDistance' property on 'PannerNode': The maxDistance provided (-1) is less than the minimum bound (0).". | PASS | — | — | — | — | — |
| node.maxDistance after setting to -1 is equal to 10000. | PASS | PASS | PASS | PASS | PASS | — |
| node7 = new PannerNode(c, {"maxDistance":100}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node7.maxDistance is equal to 100. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"rolloffFactor":-1}) threw RangeError: "Failed to construct 'PannerNode': The rolloffFactor provided (-1) is less than the minimum bound (0).". | PASS | — | — | — | — | — |
| node.rolloffFactor = -1 threw RangeError: "Failed to set the 'rolloffFactor' property on 'PannerNode': The rolloffFactor provided (-1) is less than the minimum bound (0).". | PASS | — | — | — | — | — |
| node.rolloffFactor after setting to -1 is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| node8 = new PannerNode(c, {"rolloffFactor":0}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node8.rolloffFactor is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node8 = new PannerNode(c, {"rolloffFactor":0.5}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node8.rolloffFactor is equal to 0.5. | PASS | PASS | PASS | PASS | PASS | — |
| node8 = new PannerNode(c, {"rolloffFactor":100}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node8.rolloffFactor is equal to 100. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"coneOuterGain":-1}) threw InvalidStateError: "Failed to construct 'PannerNode': The coneOuterGain provided (-1) is outside the range [0, 1].". | PASS | — | — | — | — | — |
| node.coneOuterGain = -1 threw InvalidStateError: "Failed to set the 'coneOuterGain' property on 'PannerNode': The coneOuterGain provided (-1) is outside the range [0, 1].". | PASS | — | — | — | — | — |
| node.coneOuterGain after setting to -1 is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode(c, {"coneOuterGain":1.1}) threw InvalidStateError: "Failed to construct 'PannerNode': The coneOuterGain provided (1.1) is outside the range [0, 1].". | PASS | — | — | — | — | — |
| node.coneOuterGain = 1.1 threw InvalidStateError: "Failed to set the 'coneOuterGain' property on 'PannerNode': The coneOuterGain provided (1.1) is outside the range [0, 1].". | PASS | — | — | — | — | — |
| node.coneOuterGain after setting to 1.1 is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node9 = new PannerNode(c, {"coneOuterGain":0}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node9.coneOuterGain is equal to 0. | PASS | PASS | PASS | PASS | PASS | — |
| node9 = new PannerNode(c, {"coneOuterGain":0.5}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node9.coneOuterGain is equal to 0.5. | PASS | PASS | PASS | PASS | PASS | — |
| node9 = new PannerNode(c, {"coneOuterGain":1}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node9.coneOuterGain is equal to 1. | PASS | PASS | PASS | PASS | PASS | — |
| < [test AudioNodeOptions] All assertions passed. (total 54 assertions) | PASS | PASS | PASS | PASS | PASS | — |
| > [constructor with options] | PASS | PASS | PASS | PASS | PASS | — |
| node = new PannerNode(c, {"panningModel":"HRTF","positionX":1.4142135623730951,"positionY":2.8284271247461903,"positionZ":4.242640687119286,"orientationX":-1.4142135623730951,"orientationY":-2.8284271247461903,"orientationZ":-4.242640687119286,"distanceModel":"linear","refDistance":3.141592653589793,"maxDistance":6.283185307179586,"rolloffFactor":9.42477796076938,"coneInnerAngle":12.566370614359172,"coneOuterAngle":15.707963267948966,"coneOuterGain":0.3141592653589793}) did not throw an exception. | PASS | PASS | PASS | PASS | PASS | — |
| node instanceof PannerNode is equal to true. | PASS | PASS | PASS | PASS | PASS | — |
| node.panningModel is equal to HRTF. | PASS | PASS | PASS | PASS | PASS | — |
| node.positionX.value is equal to 1.4142135381698608. | PASS | PASS | PASS | PASS | PASS | — |
| node.positionY.value is equal to 2.8284270763397217. | PASS | PASS | PASS | PASS | PASS | — |
| node.positionZ.value is equal to 4.242640495300293. | PASS | PASS | PASS | PASS | PASS | — |
| node.orientationX.value is equal to -1.4142135381698608. | PASS | PASS | PASS | PASS | PASS | — |
| node.orientationY.value is equal to -2.8284270763397217. | PASS | PASS | PASS | PASS | PASS | — |
| node.orientationZ.value is equal to -4.242640495300293. | PASS | PASS | PASS | PASS | PASS | — |
| node.distanceModel is equal to linear. | PASS | PASS | PASS | PASS | PASS | — |
| node.refDistance is equal to 3.141592653589793. | PASS | PASS | PASS | PASS | PASS | — |
| node.maxDistance is equal to 6.283185307179586. | PASS | PASS | PASS | PASS | PASS | — |
| node.rolloffFactor is equal to 9.42477796076938. | PASS | PASS | PASS | PASS | PASS | — |
| node.coneInnerAngle is equal to 12.566370614359172. | PASS | PASS | PASS | PASS | PASS | — |
| node.coneOuterAngle is equal to 15.707963267948966. | PASS | PASS | PASS | PASS | PASS | — |
| node.coneOuterGain is equal to 0.3141592653589793. | PASS | PASS | PASS | PASS | PASS | — |
| node.channelCount is equal to 2. | PASS | PASS | PASS | PASS | PASS | — |
| node.channelCountMode is equal to clamped-max. | PASS | PASS | PASS | PASS | PASS | — |
| node.channelInterpretation is equal to speakers. | PASS | PASS | PASS | PASS | PASS | — |
| < [constructor with options] All assertions passed. (total 19 assertions) | PASS | PASS | PASS | PASS | PASS | — |
| # AUDIT TASK RUNNER FINISHED: 5 tasks ran successfully. | PASS | PASS | PASS | PASS | PASS | — |
| new PannerNode() threw TypeError: "PannerNode constructor: At least 1 argument required, but only 0 passed". | — | PASS | — | — | — | — |
| new PannerNode(1) threw TypeError: "PannerNode constructor: Argument 1 is not an object.". | — | PASS | — | — | — | — |
| new PannerNode(context, 42) threw TypeError: "PannerNode constructor: Value can't be converted to a dictionary.". | — | PASS | — | — | — | — |
| new PannerNode(c, {"channelCount":0}) threw NotSupportedError: "PannerNode constructor: Channel count (0) must be in the range [1, max supported channel count]". | — | PASS | — | — | — | — |
| node.channelCount = 0 threw NotSupportedError: "AudioNode.channelCount setter: Channel count (0) must be in the range [1, max supported channel count]". | — | PASS | — | — | — | — |
| new PannerNode(c, {"channelCount":3}) threw NotSupportedError: "PannerNode constructor: 3 is greater than 2". | — | PASS | — | — | — | — |
| node.channelCount = 3 threw NotSupportedError: "AudioNode.channelCount setter: 3 is greater than 2". | — | PASS | — | — | — | — |
| new PannerNode(c, {"channelCount":99}) threw NotSupportedError: "PannerNode constructor: 99 is greater than 2". | — | PASS | — | — | — | — |
| node.channelCount = 99 threw NotSupportedError: "AudioNode.channelCount setter: 99 is greater than 2". | — | PASS | — | — | — | — |
| new PannerNode(c, {"channelCountMode":"max"}) threw NotSupportedError: "PannerNode constructor: Cannot set channel count mode to "max"". | — | PASS | — | — | — | — |
| node.channelCountMode = max threw NotSupportedError: "AudioNode.channelCountMode setter: Cannot set channel count mode to "max"". | — | PASS | — | — | — | — |
| new PannerNode(c, " + JSON.stringify(options) + ") threw TypeError: "PannerNode constructor: 'foobar' (value of 'channelCountMode' member of AudioNodeOptions) is not a valid value for enumeration ChannelCountMode.". | — | PASS | — | — | — | — |
| new PannerNode(c, {"channelInterpretation":"foobar"}) threw TypeError: "PannerNode constructor: 'foobar' (value of 'channelInterpretation' member of AudioNodeOptions) is not a valid value for enumeration ChannelInterpretation.". | — | PASS | — | — | — | — |
| new PannerNode(c, {"maxDistance":-1}) threw RangeError: "PannerNode constructor: The maxDistance value passed to PannerNode must be positive.". | — | PASS | — | — | — | — |
| node.maxDistance = -1 threw RangeError: "PannerNode.maxDistance setter: The maxDistance value passed to PannerNode must be positive.". | — | PASS | — | — | — | — |
| new PannerNode(c, {"rolloffFactor":-1}) threw RangeError: "PannerNode constructor: The rolloffFactor value passed to PannerNode must not be negative.". | — | PASS | — | — | — | — |
| node.rolloffFactor = -1 threw RangeError: "PannerNode.rolloffFactor setter: The rolloffFactor value passed to PannerNode must not be negative.". | — | PASS | — | — | — | — |
| new PannerNode(c, {"coneOuterGain":-1}) threw InvalidStateError: "PannerNode constructor: -1 is not in the range [0, 1]". | — | PASS | — | — | — | — |
| node.coneOuterGain = -1 threw InvalidStateError: "PannerNode.coneOuterGain setter: -1 is not in the range [0, 1]". | — | PASS | — | — | — | — |
| new PannerNode(c, {"coneOuterGain":1.1}) threw InvalidStateError: "PannerNode constructor: 1.1 is not in the range [0, 1]". | — | PASS | — | — | — | — |
| node.coneOuterGain = 1.1 threw InvalidStateError: "PannerNode.coneOuterGain setter: 1.1 is not in the range [0, 1]". | — | PASS | — | — | — | — |
| new PannerNode() threw TypeError: "Not enough arguments". | — | — | PASS | — | — | — |
| new PannerNode(1) threw TypeError: "Argument 1 ('context') to the PannerNode constructor must be an instance of BaseAudioContext". | — | — | PASS | — | — | — |
| new PannerNode(context, 42) threw TypeError: "Type error". | — | — | PASS | — | — | — |
| new PannerNode(c, {"channelCount":0}) threw NotSupportedError: "Channel count cannot be 0". | — | — | PASS | — | — | — |
| node.channelCount = 0 threw NotSupportedError: "Channel count cannot be 0". | — | — | PASS | — | — | — |
| new PannerNode(c, {"channelCount":3}) threw NotSupportedError: "PannerNode's channelCount cannot be greater than 2". | — | — | PASS | — | — | — |
| node.channelCount = 3 threw NotSupportedError: "PannerNode's channelCount cannot be greater than 2". | — | — | PASS | — | — | — |
| new PannerNode(c, {"channelCount":99}) threw NotSupportedError: "PannerNode's channelCount cannot be greater than 2". | — | — | PASS | — | — | — |
| node.channelCount = 99 threw NotSupportedError: "PannerNode's channelCount cannot be greater than 2". | — | — | PASS | — | — | — |
| new PannerNode(c, {"channelCountMode":"max"}) threw NotSupportedError: "PannerNode's channelCountMode cannot be max". | — | — | PASS | — | — | — |
| node.channelCountMode = max threw NotSupportedError: "PannerNode's channelCountMode cannot be max". | — | — | PASS | — | — | — |
| new PannerNode(c, " + JSON.stringify(options) + ") threw TypeError: "Type error". | — | — | PASS | — | — | — |
| new PannerNode(c, {"channelInterpretation":"foobar"}) threw TypeError: "Type error". | — | — | PASS | — | — | — |
| new PannerNode(c, {"maxDistance":-1}) threw RangeError: "maxDistance cannot be set to a non-positive value". | — | — | PASS | — | — | — |
| node.maxDistance = -1 threw RangeError: "maxDistance cannot be set to a non-positive value". | — | — | PASS | — | — | — |
| new PannerNode(c, {"rolloffFactor":-1}) threw RangeError: "rolloffFactor cannot be set to a negative value". | — | — | PASS | — | — | — |
| node.rolloffFactor = -1 threw RangeError: "rolloffFactor cannot be set to a negative value". | — | — | PASS | — | — | — |
| new PannerNode(c, {"coneOuterGain":-1}) threw InvalidStateError: "coneOuterGain must be in [0, 1]". | — | — | PASS | — | — | — |
| node.coneOuterGain = -1 threw InvalidStateError: "coneOuterGain must be in [0, 1]". | — | — | PASS | — | — | — |
| new PannerNode(c, {"coneOuterGain":1.1}) threw InvalidStateError: "coneOuterGain must be in [0, 1]". | — | — | PASS | — | — | — |
| node.coneOuterGain = 1.1 threw InvalidStateError: "coneOuterGain must be in [0, 1]". | — | — | PASS | — | — | — |
| new PannerNode() threw TypeError: "Not enough arguments to "PannerNode.constructor".". | — | — | — | — | PASS | — |
| new PannerNode(1) threw TypeError: "Value is not an object.". | — | — | — | — | PASS | — |
| new PannerNode(context, 42) threw TypeError: "Value is not an object.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"channelCount":0}) threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| node.channelCount = 0 threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"channelCount":3}) threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| node.channelCount = 3 threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"channelCount":99}) threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| node.channelCount = 99 threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"channelCountMode":"max"}) threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| node.channelCountMode = max threw NotSupportedError: "The operation is not supported.". | — | — | — | — | PASS | — |
| new PannerNode(c, " + JSON.stringify(options) + ") threw TypeError: "'foobar' is not a valid enum value for enumeration 'ChannelCountMode'.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"channelInterpretation":"foobar"}) threw TypeError: "'foobar' is not a valid enum value for enumeration 'ChannelInterpretation'.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"maxDistance":-1}) threw RangeError: "maxDistance should be positive". | — | — | — | — | PASS | — |
| node.maxDistance = -1 threw RangeError: "value should be positive". | — | — | — | — | PASS | — |
| new PannerNode(c, {"rolloffFactor":-1}) threw RangeError: "rolloffFactor should be non-negative". | — | — | — | — | PASS | — |
| node.rolloffFactor = -1 threw RangeError: "value should be non-negative". | — | — | — | — | PASS | — |
| new PannerNode(c, {"coneOuterGain":-1}) threw InvalidStateError: "The object is in an invalid state.". | — | — | — | — | PASS | — |
| node.coneOuterGain = -1 threw InvalidStateError: "The object is in an invalid state.". | — | — | — | — | PASS | — |
| new PannerNode(c, {"coneOuterGain":1.1}) threw InvalidStateError: "The object is in an invalid state.". | — | — | — | — | PASS | — |
| node.coneOuterGain = 1.1 threw InvalidStateError: "The object is in an invalid state.". | — | — | — | — | PASS | — |
| new PannerNode() threw TypeError: "PannerNode() needs one argument". | — | — | — | PASS | — | — |
| new PannerNode(1) threw TypeError: "Not an object of type BaseAudioContext". | — | — | — | PASS | — | — |
| new PannerNode(context, 42) threw TypeError: "Not an object of type PannerOptions". | — | — | — | PASS | — | — |
| new PannerNode(c, {"channelCount":0}) threw NotSupportedError: "Invalid channel count". | — | — | — | PASS | — | — |
| node.channelCount = 0 threw NotSupportedError: "Invalid channel count". | — | — | — | PASS | — | — |
| new PannerNode(c, {"channelCount":3}) threw NotSupportedError: "PannerNode does not support channel count greater than 2". | — | — | — | PASS | — | — |
| node.channelCount = 3 threw NotSupportedError: "PannerNode does not support channel count greater than 2". | — | — | — | PASS | — | — |
| new PannerNode(c, {"channelCount":99}) threw NotSupportedError: "PannerNode does not support channel count greater than 2". | — | — | — | PASS | — | — |
| node.channelCount = 99 threw NotSupportedError: "PannerNode does not support channel count greater than 2". | — | — | — | PASS | — | — |
| new PannerNode(c, {"channelCountMode":"max"}) threw NotSupportedError: "PannerNode does not support 'max' as channelCountMode.". | — | — | — | PASS | — | — |
| node.channelCountMode = max threw NotSupportedError: "PannerNode does not support 'max' as channelCountMode.". | — | — | — | PASS | — | — |
| new PannerNode(c, " + JSON.stringify(options) + ") threw TypeError: "Invalid value 'foobar' for enumeration type 'ChannelCountMode'". | — | — | — | PASS | — | — |
| new PannerNode(c, {"channelInterpretation":"foobar"}) threw TypeError: "Invalid value 'foobar' for enumeration type 'ChannelInterpretation'". | — | — | — | PASS | — | — |
| new PannerNode(c, {"maxDistance":-1}) threw RangeError: "maxDistance must be positive". | — | — | — | PASS | — | — |
| node.maxDistance = -1 threw RangeError: "maxDistance must be positive". | — | — | — | PASS | — | — |
| new PannerNode(c, {"rolloffFactor":-1}) threw RangeError: "rolloffFactor cannot be negative". | — | — | — | PASS | — | — |
| node.rolloffFactor = -1 threw RangeError: "rolloffFactor cannot be negative". | — | — | — | PASS | — | — |
| new PannerNode(c, {"coneOuterGain":-1}) threw InvalidStateError: "coneOuterGain must be in the range of [0, 1]". | — | — | — | PASS | — | — |
| node.coneOuterGain = -1 threw InvalidStateError: "coneOuterGain must be in the range of [0, 1]". | — | — | — | PASS | — | — |
| new PannerNode(c, {"coneOuterGain":1.1}) threw InvalidStateError: "coneOuterGain must be in the range of [0, 1]". | — | — | — | PASS | — | — |
| node.coneOuterGain = 1.1 threw InvalidStateError: "coneOuterGain must be in the range of [0, 1]". | — | — | — | PASS | — | — |