Browse Source

LibWeb: Implement `Node.isDefaultNamespace()`

This method accepts a namespace URI as an argument and returns true if
the given URI is the default namespace on the given node, false
otherwise.
Tim Ledbetter 1 year ago
parent
commit
055c902a37

+ 12 - 0
Tests/LibWeb/Text/expected/DOM/Node-isDefaultNamespace.txt

@@ -0,0 +1,12 @@
+documentFragment.isDefaultNamespace(null): true
+documentFragment.isDefaultNamespace(""): true
+documentFragment.isDefaultNamespace("foo"): false
+documentFragment.isDefaultNamespace("xmlms"): false
+docType.isDefaultNamespace(null): true
+docType.isDefaultNamespace(""): true
+docType.isDefaultNamespace("foo"): false
+docType.isDefaultNamespace("xmlms"): false
+element.isDefaultNamespace(null): true
+element.isDefaultNamespace(""): true
+element.isDefaultNamespace("foo"): false
+element.isDefaultNamespace("xmlms"): false

+ 31 - 0
Tests/LibWeb/Text/input/DOM/Node-isDefaultNamespace.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<script src="../include.js"></script>
+<script>
+    function testIsDefaultNamespace(node, prefix, name) {
+        let prefixName = prefix;
+        if (prefixName !== null)
+            prefixName = `"${prefix}"`;
+
+        println(`${name}.isDefaultNamespace(${prefixName}): ${node.isDefaultNamespace(prefix)}`);
+    }
+
+    test(() => {
+        const documentFragment = document.createDocumentFragment();
+        testIsDefaultNamespace(documentFragment, null, "documentFragment");
+        testIsDefaultNamespace(documentFragment, "", "documentFragment");
+        testIsDefaultNamespace(documentFragment, "foo", "documentFragment");
+        testIsDefaultNamespace(documentFragment, "xmlms", "documentFragment");
+
+        const docType = document.doctype;
+        testIsDefaultNamespace(docType, null, "docType");
+        testIsDefaultNamespace(docType, "", "docType");
+        testIsDefaultNamespace(docType, "foo", "docType");
+        testIsDefaultNamespace(docType, "xmlms", "docType");
+
+        const element = document.createElementNS("namespace", "prefix:element");
+        testIsDefaultNamespace(element, null, "element");
+        testIsDefaultNamespace(element, "", "element");
+        testIsDefaultNamespace(element, "foo", "element");
+        testIsDefaultNamespace(element, "xmlms", "element");
+    });
+</script>

+ 14 - 0
Userland/Libraries/LibWeb/DOM/Node.cpp

@@ -1733,6 +1733,20 @@ Optional<String> Node::lookup_namespace_uri(Optional<String> prefix) const
     return locate_a_namespace(prefix);
 }
 
+// https://dom.spec.whatwg.org/#dom-node-isdefaultnamespace
+bool Node::is_default_namespace(Optional<String> namespace_) const
+{
+    // 1. If namespace is the empty string, then set it to null.
+    if (namespace_.has_value() && namespace_->is_empty())
+        namespace_ = {};
+
+    // 2. Let defaultNamespace be the result of running locate a namespace for this using null.
+    auto default_namespace = locate_a_namespace({});
+
+    // 3. Return true if defaultNamespace is the same as namespace; otherwise false.
+    return default_namespace == namespace_;
+}
+
 // https://dom.spec.whatwg.org/#in-a-document-tree
 bool Node::in_a_document_tree() const
 {

+ 1 - 0
Userland/Libraries/LibWeb/DOM/Node.h

@@ -697,6 +697,7 @@ public:
 
     Optional<String> locate_a_namespace(Optional<String> const& prefix) const;
     Optional<String> lookup_namespace_uri(Optional<String> prefix) const;
+    bool is_default_namespace(Optional<String> namespace_) const;
 
 protected:
     Node(JS::Realm&, Document&, NodeType);

+ 1 - 1
Userland/Libraries/LibWeb/DOM/Node.idl

@@ -56,7 +56,7 @@ interface Node : EventTarget {
 
     [FIXME] DOMString? lookupPrefix(DOMString? namespace);
     DOMString? lookupNamespaceURI(DOMString? prefix);
-    [FIXME] boolean isDefaultNamespace(DOMString? namespace);
+    boolean isDefaultNamespace(DOMString? namespace);
 
     [ImplementedAs=pre_insert, CEReactions] Node insertBefore(Node node, Node? child);
     [CEReactions] Node appendChild(Node node);