ソースを参照

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. :^)
Sam Atkins 3 年 前
コミット
bc0ef5f69d
1 ファイル変更13 行追加6 行削除
  1. 13 6
      Userland/Libraries/LibWeb/Bindings/CSSNamespace.cpp

+ 13 - 6
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 <supports-condition>, would return true, return true.
-        //
-        //    Otherwise, If conditionText, wrapped in parentheses and then parsed and evaluated as a <supports-condition>, 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 <supports-condition>, 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 <supports-condition>, 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);
     }
 }