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