| <!doctype html> | |
| <title>Highlight 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> | |
| <div id='testDiv'>abc</div> | |
| <script> | |
| 'use strict'; | |
| let range1 = new Range(); | |
| let container = document.getElementById('testDiv'); | |
| let range2 = new StaticRange({startContainer: container, startOffset: 0, endContainer: container, endOffset: 0}); | |
| let rangeAdditionModeCollection = ["constructor", "add function"]; | |
| let iterationInitializationCollection = ["customHighlight[Symbol.iterator]()", "customHighlight.values()", "customHighlight.keys()"]; | |
| function getIterator(customHighlight, iterationInitialization){ | |
| var iterator; | |
| if(iterationInitialization === "customHighlight[Symbol.iterator]()"){ | |
| iterator = customHighlight[Symbol.iterator](); | |
| } | |
| else if(iterationInitialization === "customHighlight.values()"){ | |
| iterator = customHighlight.values(); | |
| } | |
| else if(iterationInitialization === "customHighlight.keys()"){ | |
| iterator = customHighlight.keys(); | |
| } | |
| return iterator; | |
| } | |
| // Test .keys, .values, [Symbol.iterator] | |
| for(let iterationInitialization of iterationInitializationCollection){ | |
| test(() => { | |
| let customHighlight = new Highlight(); | |
| let iterator = getIterator(customHighlight, iterationInitialization); | |
| let element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated when it\'s empty initializing the iterator with ' + iterationInitialization); | |
| } | |
| for(let rangeAdditionMode of rangeAdditionModeCollection){ | |
| for(let iterationInitialization of iterationInitializationCollection){ | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| } | |
| let iterator = getIterator(customHighlight, iterationInitialization); | |
| let element = iterator.next(); | |
| assert_false(element.done, 'Highlight is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last range'); | |
| assert_equals(element.value, range1, '.next() returns an element with .value corresponding to the first range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated over all of its ranges initializing the iterator with ' + iterationInitialization + ' and adding a range by passing it to the ' + rangeAdditionMode); | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1, range2); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| customHighlight.add(range2); | |
| } | |
| let iterator = getIterator(customHighlight, iterationInitialization); | |
| let element = iterator.next(); | |
| assert_false(element.done, 'Highlight is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last range'); | |
| assert_equals(element.value, range1, '.next() returns an element with .value corresponding to the first range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_false(element.done, 'Highlight is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last range'); | |
| assert_equals(element.value, range2, '.next() returns an element with .value corresponding to the second range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated over all of its ranges initializing the iterator with ' + iterationInitialization + ' and adding two ranges by passing them to the ' + rangeAdditionMode); | |
| } | |
| } | |
| // Test .entries() | |
| test(() => { | |
| let customHighlight = new Highlight(); | |
| let iterator = customHighlight.entries(); | |
| let element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated when it\'s empty initializing the iterator with .entries()'); | |
| for(let rangeAdditionMode of rangeAdditionModeCollection){ | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| } | |
| let iterator = customHighlight.entries(); | |
| let element = iterator.next(); | |
| assert_false(element.done, 'Highlight is iterable and .next() returns an element with .done===false when the iteration didn\'t go past the last range'); | |
| assert_equals(element.value[0], range1, '.next() returns an element with .value[0] corresponding to the first range added to the Highlight'); | |
| assert_equals(element.value[1], range1, '.next() returns an element with .value[1] corresponding to the first range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated over all of its ranges initializing the iterator with .entries() and adding a range by passing it to the ' + rangeAdditionMode); | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1, range2); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| customHighlight.add(range2); | |
| } | |
| let iterator = customHighlight.entries(); | |
| let element = iterator.next(); | |
| assert_false(element.done, 'Highlight 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], range1, '.next() returns an element with .value[0] corresponding to the first range added to the Highlight'); | |
| assert_equals(element.value[1], range1, '.next() returns an element with .value[1] corresponding to the first range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_false(element.done, 'Highlight 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], range2, '.next() returns an element with .value[0] corresponding to the second range added to the Highlight'); | |
| assert_equals(element.value[1], range2, '.next() returns an element with .value[1] corresponding to the second range added to the Highlight'); | |
| element = iterator.next(); | |
| assert_true(element.done, 'Highlight is iterable and .next() returns an element with .done===true when there are no more ranges to iterate'); | |
| assert_equals(element.value, undefined, 'Highlight is iterable and .next() returns an element with .value undefined when there are no more ranges to iterate.'); | |
| }, 'Highlight can be iterated over all of its ranges initializing the iterator with .entries() and adding two ranges by passing them to the ' + rangeAdditionMode); | |
| } | |
| // 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; | |
| } | |
| test(() => { | |
| let customHighlight = new Highlight(); | |
| let expectedResult = []; | |
| let actualResult = []; | |
| customHighlight.forEach((range) => {actualResult.push(range);}); | |
| assert_true(compareArrays(actualResult, expectedResult), 'The ranges seen match the ranges added'); | |
| }, 'Highlight can be iterated through when it\'s empty using forEach.'); | |
| for(let rangeAdditionMode of rangeAdditionModeCollection){ | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| } | |
| let expectedResult = [range1]; | |
| let actualResult = []; | |
| customHighlight.forEach((range) => {actualResult.push(range);}); | |
| assert_true(compareArrays(actualResult, expectedResult), 'The ranges seen match the ranges added'); | |
| }, 'Highlight can be iterated through using forEach when it has one range that was added by passing it to the ' + rangeAdditionMode); | |
| test(() => { | |
| var customHighlight; | |
| if(rangeAdditionMode === "constructor"){ | |
| customHighlight = new Highlight(range1, range2); | |
| } | |
| else if(rangeAdditionMode === "add function"){ | |
| customHighlight = new Highlight(); | |
| customHighlight.add(range1); | |
| customHighlight.add(range2); | |
| } | |
| let expectedResult = [range1, range2]; | |
| let actualResult = []; | |
| customHighlight.forEach((range) => {actualResult.push(range);}); | |
| assert_true(compareArrays(actualResult, expectedResult), 'The ranges seen match the ranges added'); | |
| }, 'Highlight can be iterated through using forEach when it has two ranges that were added by passing them to the ' + rangeAdditionMode); | |
| } | |
| </script> |