<!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();
let customHighlight2 = new Highlight();
let highlightName1 = "example1";
let highlightName2 = "example2";
function getIterator(iterationInitialization){
var iterator;
if(iterationInitialization === "CSS.highlights[Symbol.iterator]()"){
iterator = CSS.highlights[Symbol.iterator]();
}
else if(iterationInitialization === "CSS.highlights.entries()"){
iterator = CSS.highlights.entries();
}
else if(iterationInitialization === "CSS.highlights.values()"){
iterator = CSS.highlights.values();
}
else if(iterationInitialization === "CSS.highlights.keys()"){
iterator = CSS.highlights.keys();
}
return iterator;
}
// Test .keys()
let iterationInitialization = "CSS.highlights.keys()";
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 highlight names to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlight names to iterate.');
}, 'HighlightRegistry can be iterated when it\'s empty initializing the iterator with ' + iterationInitialization);
test(() => {
CSS.highlights.set(highlightName1, 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 name');
assert_equals(element.value, highlightName1, '.next() returns an element with .value corresponding to the first highlight name 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 highlight names to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlight names to iterate.');
}, 'HighlightRegistry can be iterated over all of its highlight names after adding one of them initializing the iterator with ' + iterationInitialization);
test(() => {
CSS.highlights.set(highlightName2, 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, highlightName1, '.next() returns an element with .value corresponding to the first highlight name 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, highlightName2, '.next() returns an element with .value corresponding to the second highlight name 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 highlight names to iterate');
assert_equals(element.value, undefined, 'HighlightRegistry is iterable and .next() returns an element with .value undefined when there are no more highlight names to iterate.');
}, 'HighlightRegistry can be iterated over all of its highlight names after adding two of them initializing the iterator with ' + iterationInitialization);
CSS.highlights.clear();
// Test .values()
iterationInitialization = "CSS.highlights.values()";
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.set(highlightName1, 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.set(highlightName2, 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 [Symbol.iterator]() and .entries()
let iterationInitializationCollection = ["CSS.highlights[Symbol.iterator]()", "CSS.highlights.entries()"];
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.set(highlightName1, 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[0], highlightName1, '.next() returns an element with .value[0] corresponding to the first Highlight name 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 ' + iterationInitialization);
test(() => {
CSS.highlights.set(highlightName2, 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[0], highlightName1, '.next() returns an element with .value[0] corresponding to the first Highlight name 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], highlightName2, '.next() returns an element with .value[0] corresponding to the second Highlight name 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 ' + iterationInitialization);
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.set(highlightName1, 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.set(highlightName2, 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>