blob: bf88e6526b93e6830ee5c3d3f696f6e066be49e5 [file] [edit]
<!doctype html>
<title>HighlightRegistry iteration</title>
<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
let customHighlight1 = new Highlight("example1");
let customHighlight2 = new Highlight("example2");
let iterationInitializationCollection = ["CSS.highlights[Symbol.iterator]()", "CSS.highlights.values()", "CSS.highlights.keys()"];
function getIterator(iterationInitialization){
var iterator;
if(iterationInitialization === "CSS.highlights[Symbol.iterator]()"){
iterator = CSS.highlights[Symbol.iterator]();
}
else if(iterationInitialization === "CSS.highlights.values()"){
iterator = CSS.highlights.values();
}
else if(iterationInitialization === "CSS.highlights.keys()"){
iterator = CSS.highlights.keys();
}
return iterator;
}
// Test .values, .keys, [Symbol.iterator]
for(let iterationInitialization of iterationInitializationCollection){
test(() => {
let iterator = getIterator(iterationInitialization);
let element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated when it\'s empty initializing the iterator with ' + iterationInitialization);
test(() => {
CSS.highlights.add(customHighlight1);
let iterator = getIterator(iterationInitialization);
let element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value, customHighlight1, '.next() returns an element with .value corresponding to the first Highlight added to the HighlightRegistry');
element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated over all of its Highlights after adding one of them initializing the iterator with ' + iterationInitialization);
test(() => {
CSS.highlights.add(customHighlight2);
let iterator = getIterator(iterationInitialization);
let element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value, customHighlight1, '.next() returns an element with .value corresponding to the first Highlight added to the HighlightRegistry');
element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value, customHighlight2, '.next() returns an element with .value corresponding to the second Highlight added to the HighlightRegistry');
element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated over all of its Highlights after adding two of them initializing the iterator with ' + iterationInitialization);
CSS.highlights.clear();
}
// Test .entries
test(() => {
let iterator = CSS.highlights.entries();
let element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated when it\'s empty initializing the iterator with .entries().');
test(() => {
CSS.highlights.add(customHighlight1);
let iterator = CSS.highlights.entries();
let element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value[0], customHighlight1, '.next() returns an element with .value[0] corresponding to the first Highlight added to the HighlightRegistry');
assert_equals(element.value[1], customHighlight1, '.next() returns an element with .value[1] corresponding to the first Highlight added to the HighlightRegistry');
element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated over all of its Highlights after adding one of them initializing the iterator with .entries().');
test(() => {
CSS.highlights.add(customHighlight2);
let iterator = CSS.highlights.entries();
let element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value[0], customHighlight1, '.next() returns an element with .value[0] corresponding to the first Highlight added to the HighlightRegistry');
assert_equals(element.value[1], customHighlight1, '.next() returns an element with .value[1] corresponding to the first Highlight added to the HighlightRegistry');
element = iterator.next();
assert_false(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last highlight');
assert_equals(element.value[0], customHighlight2, '.next() returns an element with .value[0] corresponding to the second Highlight added to the HighlightRegistry');
assert_equals(element.value[1], customHighlight2, '.next() returns an element with .value[1] corresponding to the second Highlight added to the HighlightRegistry');
element = iterator.next();
assert_true(element.done, 'HighlightRegistry is iterable and .next() returns an element with .done===true when there are no more highlights to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlights to iterate.');
}, 'HighlightRegistry can be iterated over all of its Highlights after adding two of them initializing the iterator with .entries().');
CSS.highlights.clear();
// Test .forEach
function compareArrays(array1, array2){
if(array1.length != array2.length){
return false;
}
for(let index=0; index<array1.length; ++index){
if(array1[index] != array2[index])
return false;
}
return true;
}
let expectedResult = [];
test(() => {
let actualResult = [];
CSS.highlights.forEach((highlight) => {actualResult.push(highlight);});
assert_true(compareArrays(actualResult, expectedResult), 'The highlights seen match the highlights added');
}, 'HighlightRegistry can be iterated through when it\'s empty using forEach.');
test(() => {
CSS.highlights.add(customHighlight1);
expectedResult.push(customHighlight1);
let actualResult = [];
CSS.highlights.forEach((highlight) => {actualResult.push(highlight);});
assert_true(compareArrays(actualResult, expectedResult), 'The highlights seen match the highlights added');
}, 'HighlightRegistry can be iterated through when it has one Highlight using forEach.');
test(() => {
CSS.highlights.add(customHighlight2);
expectedResult.push(customHighlight2);
let actualResult = [];
CSS.highlights.forEach((highlight) => {actualResult.push(highlight);});
assert_true(compareArrays(actualResult, expectedResult), 'The highlights seen match the highlights added');
}, 'HighlightRegistry can be iterated through when it has two Highlights using forEach.');
</script>