From bc0ef5f69d31369922d82ee468e90c34d7eea8c7 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 8 Oct 2021 16:00:05 +0100 Subject: [PATCH] LibWeb: Implement `CSS.supports(string)` function :^) Websites being able to query whether we support a given CSS feature should prevent them from loading unnecessary polyfills for things we already support! Or at least, that's the nice theory. :^) --- .../LibWeb/Bindings/CSSNamespace.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibWeb/Bindings/CSSNamespace.cpp b/Userland/Libraries/LibWeb/Bindings/CSSNamespace.cpp index 3cc12c444f..d43e86aed7 100644 --- a/Userland/Libraries/LibWeb/Bindings/CSSNamespace.cpp +++ b/Userland/Libraries/LibWeb/Bindings/CSSNamespace.cpp @@ -79,12 +79,19 @@ JS_DEFINE_NATIVE_FUNCTION(CSSNamespace::supports) return JS::Value(false); } else { // When the supports(conditionText) method is invoked with a single conditionText argument: - // - // If conditionText, parsed and evaluated as a , would return true, return true. - // - // Otherwise, If conditionText, wrapped in parentheses and then parsed and evaluated as a , would return true, return true. - // - // Otherwise, return false. + String supports_text = vm.argument(0).to_string(global_object); + if (vm.exception()) + return {}; + + // If conditionText, parsed and evaluated as a , would return true, return true. + if (auto supports = parse_css_supports({}, supports_text); supports && supports->matches()) + return JS::Value(true); + + // Otherwise, If conditionText, wrapped in parentheses and then parsed and evaluated as a , would return true, return true. + if (auto supports = parse_css_supports({}, String::formatted("({})", supports_text)); supports && supports->matches()) + return JS::Value(true); + + // Otherwise, return false. return JS::Value(false); } }