mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
Auto merge of #24471 - saschanaz:enum-default, r=ferjm
Support enum value as a union default value <!-- Please describe your changes on the following line: --> Didn't implement the actual latency thing because the relevant things are already marked as TODO. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #21342 <!-- Either: --> - [x] There are tests for these changes <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
commit
5011e9c21c
4 changed files with 36 additions and 29 deletions
|
@ -13,6 +13,7 @@ use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{
|
||||||
};
|
};
|
||||||
use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::AudioContextState;
|
use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::AudioContextState;
|
||||||
use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextBinding::BaseAudioContextMethods;
|
use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextBinding::BaseAudioContextMethods;
|
||||||
|
use crate::dom::bindings::codegen::UnionTypes::AudioContextLatencyCategoryOrDouble;
|
||||||
use crate::dom::bindings::error::{Error, Fallible};
|
use crate::dom::bindings::error::{Error, Fallible};
|
||||||
use crate::dom::bindings::inheritance::Castable;
|
use crate::dom::bindings::inheritance::Castable;
|
||||||
use crate::dom::bindings::num::Finite;
|
use crate::dom::bindings::num::Finite;
|
||||||
|
@ -48,7 +49,12 @@ impl AudioContext {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Step 4.1.
|
// Step 4.1.
|
||||||
let latency_hint = options.latencyHint;
|
let latency_hint = match options.latencyHint {
|
||||||
|
AudioContextLatencyCategoryOrDouble::AudioContextLatencyCategory(category) => category,
|
||||||
|
AudioContextLatencyCategoryOrDouble::Double(_) => {
|
||||||
|
AudioContextLatencyCategory::Interactive
|
||||||
|
}, // TODO
|
||||||
|
};
|
||||||
|
|
||||||
// Step 4.2. The sample rate is set during the creation of the BaseAudioContext.
|
// Step 4.2. The sample rate is set during the creation of the BaseAudioContext.
|
||||||
// servo-media takes care of setting the default sample rate of the output device
|
// servo-media takes care of setting the default sample rate of the output device
|
||||||
|
@ -250,7 +256,12 @@ impl<'a> From<&'a AudioContextOptions> for RealTimeAudioContextOptions {
|
||||||
fn from(options: &AudioContextOptions) -> Self {
|
fn from(options: &AudioContextOptions) -> Self {
|
||||||
Self {
|
Self {
|
||||||
sample_rate: *options.sampleRate.unwrap_or(Finite::wrap(44100.)),
|
sample_rate: *options.sampleRate.unwrap_or(Finite::wrap(44100.)),
|
||||||
latency_hint: options.latencyHint.into(),
|
latency_hint: match options.latencyHint {
|
||||||
|
AudioContextLatencyCategoryOrDouble::AudioContextLatencyCategory(category) => {
|
||||||
|
category.into()
|
||||||
|
},
|
||||||
|
AudioContextLatencyCategoryOrDouble::Double(_) => LatencyCategory::Interactive, // TODO
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -736,6 +736,13 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
|
||||||
default = '%s::USVString(USVString("%s".to_owned()))' % (
|
default = '%s::USVString(USVString("%s".to_owned()))' % (
|
||||||
union_native_type(type),
|
union_native_type(type),
|
||||||
defaultValue.value)
|
defaultValue.value)
|
||||||
|
elif defaultValue.type.isEnum():
|
||||||
|
enum = defaultValue.type.inner.identifier.name
|
||||||
|
default = "%s::%s(%s::%s)" % (
|
||||||
|
union_native_type(type),
|
||||||
|
enum,
|
||||||
|
enum,
|
||||||
|
getEnumValueName(defaultValue.value))
|
||||||
else:
|
else:
|
||||||
raise("We don't currently support default values that aren't null, boolean or default dictionary")
|
raise("We don't currently support default values that aren't null, boolean or default dictionary")
|
||||||
elif dictionaries:
|
elif dictionaries:
|
||||||
|
@ -2373,20 +2380,19 @@ def getAllTypes(descriptors, dictionaries, callbacks, typedefs):
|
||||||
"""
|
"""
|
||||||
Generate all the types we're dealing with. For each type, a tuple
|
Generate all the types we're dealing with. For each type, a tuple
|
||||||
containing type, descriptor, dictionary is yielded. The
|
containing type, descriptor, dictionary is yielded. The
|
||||||
descriptor and dictionary can be None if the type does not come
|
descriptor can be None if the type does not come from a descriptor.
|
||||||
from a descriptor or dictionary; they will never both be non-None.
|
|
||||||
"""
|
"""
|
||||||
for d in descriptors:
|
for d in descriptors:
|
||||||
for t in getTypesFromDescriptor(d):
|
for t in getTypesFromDescriptor(d):
|
||||||
yield (t, d, None)
|
yield (t, d)
|
||||||
for dictionary in dictionaries:
|
for dictionary in dictionaries:
|
||||||
for t in getTypesFromDictionary(dictionary):
|
for t in getTypesFromDictionary(dictionary):
|
||||||
yield (t, None, dictionary)
|
yield (t, None)
|
||||||
for callback in callbacks:
|
for callback in callbacks:
|
||||||
for t in getTypesFromCallback(callback):
|
for t in getTypesFromCallback(callback):
|
||||||
yield (t, None, None)
|
yield (t, None)
|
||||||
for typedef in typedefs:
|
for typedef in typedefs:
|
||||||
yield (typedef.innerType, None, None)
|
yield (typedef.innerType, None)
|
||||||
|
|
||||||
|
|
||||||
def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config):
|
def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config):
|
||||||
|
@ -2411,6 +2417,7 @@ def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config):
|
||||||
'crate::dom::bindings::str::DOMString',
|
'crate::dom::bindings::str::DOMString',
|
||||||
'crate::dom::bindings::str::USVString',
|
'crate::dom::bindings::str::USVString',
|
||||||
'crate::dom::bindings::trace::RootedTraceableBox',
|
'crate::dom::bindings::trace::RootedTraceableBox',
|
||||||
|
'crate::dom::bindings::utils::find_enum_value',
|
||||||
'crate::dom::types::*',
|
'crate::dom::types::*',
|
||||||
'crate::script_runtime::JSContext as SafeJSContext',
|
'crate::script_runtime::JSContext as SafeJSContext',
|
||||||
'js::error::throw_type_error',
|
'js::error::throw_type_error',
|
||||||
|
@ -2426,13 +2433,17 @@ def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config):
|
||||||
# Now find all the things we'll need as arguments and return values because
|
# Now find all the things we'll need as arguments and return values because
|
||||||
# we need to wrap or unwrap them.
|
# we need to wrap or unwrap them.
|
||||||
unionStructs = dict()
|
unionStructs = dict()
|
||||||
for (t, descriptor, dictionary) in getAllTypes(descriptors, dictionaries, callbacks, typedefs):
|
for (t, descriptor) in getAllTypes(descriptors, dictionaries, callbacks, typedefs):
|
||||||
if dictionary:
|
|
||||||
imports.append("%s::%s" % (CGDictionary.makeModuleName(dictionary),
|
|
||||||
CGDictionary.makeDictionaryName(dictionary)))
|
|
||||||
t = t.unroll()
|
t = t.unroll()
|
||||||
if not t.isUnion():
|
if not t.isUnion():
|
||||||
continue
|
continue
|
||||||
|
for memberType in t.flatMemberTypes:
|
||||||
|
if memberType.isDictionary() or memberType.isEnum():
|
||||||
|
memberModule = getModuleFromObject(memberType)
|
||||||
|
memberName = memberType.inner.identifier.name
|
||||||
|
imports.append("%s::%s" % (memberModule, memberName))
|
||||||
|
if memberType.isEnum():
|
||||||
|
imports.append("%s::%sValues" % (memberModule, memberName))
|
||||||
name = str(t)
|
name = str(t)
|
||||||
if name not in unionStructs:
|
if name not in unionStructs:
|
||||||
provider = descriptor or config.getDescriptorProvider()
|
provider = descriptor or config.getDescriptorProvider()
|
||||||
|
|
|
@ -13,7 +13,7 @@ enum AudioContextLatencyCategory {
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary AudioContextOptions {
|
dictionary AudioContextOptions {
|
||||||
AudioContextLatencyCategory latencyHint = "interactive";
|
(AudioContextLatencyCategory or double) latencyHint = "interactive";
|
||||||
float sampleRate;
|
float sampleRate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,8 @@
|
||||||
[audiocontextoptions.html]
|
[audiocontextoptions.html]
|
||||||
[X creating two high latency contexts incorrectly threw TypeError: "'0' is not a valid enum value for enumeration 'AudioContextLatencyCategory'.".]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[X context = new AudioContext({'latencyHint': interactiveLatency/2}) incorrectly threw TypeError: "'0' is not a valid enum value for enumeration 'AudioContextLatencyCategory'.".]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[X context = new AudioContext({'latencyHint': validLatency}) incorrectly threw TypeError: "'0' is not a valid enum value for enumeration 'AudioContextLatencyCategory'.".]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[X context = new AudioContext({sampleRate: 1}) did not throw an exception.]
|
[X context = new AudioContext({sampleRate: 1}) did not throw an exception.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[< [test-audiocontextoptions-latencyHint-double\] 3 out of 6 assertions were failed.]
|
[# AUDIT TASK RUNNER FINISHED: 1 out of 3 tasks were failed.]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[# AUDIT TASK RUNNER FINISHED: 2 out of 3 tasks were failed.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Executing "test-audiocontextoptions-latencyHint-double"]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[X context = new AudioContext({sampleRate: 1000000}) did not throw an exception.]
|
[X context = new AudioContext({sampleRate: 1000000}) did not throw an exception.]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue