LibIDL: Deduplicate code that parses an ExposedTo name

This commit is contained in:
Sam Atkins 2025-08-14 11:10:19 +01:00 committed by Jelle Raaijmakers
commit 24c5dc2f7f
Notes: github-actions[bot] 2025-08-15 07:22:41 +00:00

View file

@ -20,43 +20,35 @@ ErrorOr<ExposedTo> parse_exposure_set(StringView interface_name, StringView expo
return ExposedTo::All; return ExposedTo::All;
if (exposed_trimmed == "Nobody"sv) if (exposed_trimmed == "Nobody"sv)
return ExposedTo::Nobody; return ExposedTo::Nobody;
if (exposed_trimmed == "Window"sv)
return ExposedTo::Window; auto exposed_from_string = [](auto& string) -> Optional<ExposedTo> {
if (exposed_trimmed == "Worker"sv) if (string == "Window"sv)
return ExposedTo::AllWorkers; return ExposedTo::Window;
if (exposed_trimmed == "DedicatedWorker"sv) if (string == "Worker"sv)
return ExposedTo::DedicatedWorker; return ExposedTo::AllWorkers;
if (exposed_trimmed == "SharedWorker"sv) if (string == "DedicatedWorker"sv)
return ExposedTo::SharedWorker; return ExposedTo::DedicatedWorker;
if (exposed_trimmed == "ServiceWorker"sv) if (string == "SharedWorker"sv)
return ExposedTo::ServiceWorker; return ExposedTo::SharedWorker;
if (exposed_trimmed == "AudioWorklet"sv) if (string == "ServiceWorker"sv)
return ExposedTo::AudioWorklet; return ExposedTo::ServiceWorker;
if (exposed_trimmed == "Worklet"sv) if (string == "AudioWorklet"sv)
return ExposedTo::Worklet; return ExposedTo::AudioWorklet;
if (exposed_trimmed == "ShadowRealm"sv) if (string == "Worklet"sv)
return ExposedTo::ShadowRealm; return ExposedTo::Worklet;
if (string == "ShadowRealm"sv)
return ExposedTo::ShadowRealm;
return {};
};
if (auto parsed_exposed = exposed_from_string(exposed_trimmed); parsed_exposed.has_value())
return parsed_exposed.value();
if (exposed_trimmed[0] == '(') { if (exposed_trimmed[0] == '(') {
ExposedTo whom = ExposedTo::Nobody; ExposedTo whom = ExposedTo::Nobody;
for (StringView candidate : exposed_trimmed.substring_view(1, exposed_trimmed.length() - 1).split_view(',')) { for (StringView candidate : exposed_trimmed.substring_view(1, exposed_trimmed.length() - 1).split_view(',')) {
candidate = candidate.trim_whitespace(); candidate = candidate.trim_whitespace();
if (candidate == "Window"sv) { if (auto parsed_exposed = exposed_from_string(candidate); parsed_exposed.has_value()) {
whom |= ExposedTo::Window; whom |= parsed_exposed.value();
} else if (candidate == "Worker"sv) {
whom |= ExposedTo::AllWorkers;
} else if (candidate == "DedicatedWorker"sv) {
whom |= ExposedTo::DedicatedWorker;
} else if (candidate == "SharedWorker"sv) {
whom |= ExposedTo::SharedWorker;
} else if (candidate == "ServiceWorker"sv) {
whom |= ExposedTo::ServiceWorker;
} else if (candidate == "AudioWorklet"sv) {
whom |= ExposedTo::AudioWorklet;
} else if (candidate == "Worklet"sv) {
whom |= ExposedTo::Worklet;
} else if (candidate == "ShadowRealm"sv) {
whom |= ExposedTo::ShadowRealm;
} else { } else {
s_error_string = ByteString::formatted("Unknown Exposed attribute candidate {} in {} in {}", candidate, exposed_trimmed, interface_name); s_error_string = ByteString::formatted("Unknown Exposed attribute candidate {} in {} in {}", candidate, exposed_trimmed, interface_name);
return Error::from_string_view(s_error_string.view()); return Error::from_string_view(s_error_string.view());