mirror of
https://github.com/servo/servo.git
synced 2025-09-30 00:29:14 +01:00
XPath: implement lang() and id() core functions (#34594)
XPath's `lang()` and `id()` functions were still unimplemented. Also: * Add WPT tests for `id()`. * Fix uniqueness check in `NodesetHelpers::document_order_unique`. * Tweak the AST a bit to make it clearer to express "no predicates". * Fix a parsing bug where "/" was attempted before "//", leaving the "//" branch as always unused. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #34593 - [x] There are tests for these changes --------- Signed-off-by: Ville Lindholm <ville@lindholm.dev>
This commit is contained in:
parent
1dfc14d2fb
commit
8cfb6e33fe
11 changed files with 276 additions and 61 deletions
7
tests/wpt/meta/MANIFEST.json
vendored
7
tests/wpt/meta/MANIFEST.json
vendored
|
@ -631177,6 +631177,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"fn-id.html": [
|
||||
"617ff7216d84d56f8cef3f8ca08e902dd67f487d",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"fn-lang.html": [
|
||||
"1fbd0a2ee4d419275c6d78f54e3425135cf838a1",
|
||||
[
|
||||
|
|
21
tests/wpt/meta/domxpath/fn-lang.html.ini
vendored
21
tests/wpt/meta/domxpath/fn-lang.html.ini
vendored
|
@ -1,21 +0,0 @@
|
|||
[fn-lang.html]
|
||||
[lang("en"): <root><match lang="en"></match></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("en"): <root><match lang="EN"></match></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("en"): <root><match lang="en-us"></match></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("en"): <root><unmatch></unmatch></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("ja"): <root lang="ja"><match></match></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("ja"): <root lang="ja-jp"><unmatch lang="ja_JP"></unmatch></root>]
|
||||
expected: FAIL
|
||||
|
||||
[lang("ko"): <root><unmatch lang="Ko"></unmatch></root>]
|
||||
expected: FAIL
|
3
tests/wpt/meta/domxpath/node-sets.html.ini
vendored
3
tests/wpt/meta/domxpath/node-sets.html.ini
vendored
|
@ -1,3 +0,0 @@
|
|||
[node-sets.html]
|
||||
[| operator should evaluate both sides of expressions with the same context node]
|
||||
expected: FAIL
|
47
tests/wpt/tests/domxpath/fn-id.html
vendored
Normal file
47
tests/wpt/tests/domxpath/fn-id.html
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-id">
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
// Test the id() function with various scenarios
|
||||
function testIdFunction(expression, xmlString, expectedIds) {
|
||||
let doc = (new DOMParser()).parseFromString(xmlString, 'text/xml');
|
||||
test(() => {
|
||||
let result = doc.evaluate(expression, doc.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
||||
assert_equals(result.resultType, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
|
||||
let actualIds = [];
|
||||
for (let i = 0; i < result.snapshotLength; i++) {
|
||||
actualIds.push(result.snapshotItem(i).getAttribute('id'));
|
||||
}
|
||||
actualIds.sort();
|
||||
expectedIds.sort();
|
||||
assert_array_equals(actualIds, expectedIds, `Expected IDs ${expectedIds}, got ${actualIds}`);
|
||||
}, `${expression}: ${doc.documentElement.outerHTML}`);
|
||||
}
|
||||
|
||||
// Test single ID
|
||||
testIdFunction('id("test1")', '<root><div id="test1">Match</div></root>', ['test1']);
|
||||
|
||||
// Test multiple IDs in space-separated string
|
||||
testIdFunction('id("test1 test2")', '<root><div id="test1">First</div><div id="test2">Second</div></root>', ['test1', 'test2']);
|
||||
|
||||
// Test non-existent ID
|
||||
testIdFunction('id("nonexistent")', '<root><div id="test1">No match</div></root>', []);
|
||||
|
||||
// Test mixed case IDs (should be case-sensitive)
|
||||
testIdFunction('id("Test1")', '<root><div id="test1">No match</div></root>', []);
|
||||
|
||||
// Test multiple elements with same ID (should return all)
|
||||
testIdFunction('id("duplicate")', '<root><div id="duplicate">First</div><div id="duplicate">Second</div></root>', ['duplicate', 'duplicate']);
|
||||
|
||||
// Test IDs with special characters
|
||||
testIdFunction('id("test-1")', '<root><div id="test-1">Match</div></root>', ['test-1']);
|
||||
|
||||
// Test empty ID string
|
||||
testIdFunction('id("")', '<root><div id="">Empty ID</div></root>', []);
|
||||
|
||||
// Test whitespace in ID string
|
||||
testIdFunction('id(" test1 ")', '<root><div id="test1">Match</div></root>', ['test1']);
|
||||
</script>
|
||||
</body>
|
Loading…
Add table
Add a link
Reference in a new issue