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.
This commit is contained in:
Tim Ledbetter 2024-07-17 14:42:45 +01:00 committed by Alexander Kalenik
parent 27d429a85f
commit 055c902a37
Notes: sideshowbarker 2024-07-18 23:46:11 +09:00
5 changed files with 59 additions and 1 deletions

View File

@ -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

View File

@ -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>

View File

@ -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
{

View File

@ -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);

View File

@ -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);