Changeset 200678 in webkit
- Timestamp:
- May 11, 2016 12:50:49 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r200677 r200678 1 2016-05-11 Youenn Fablet <youenn.fablet@crf.canon.fr> 2 3 Ensure DOM iterators remain done 4 https://bugs.webkit.org/show_bug.cgi?id=157453 5 6 Reviewed by Darin Adler. 7 8 * fast/dom/nodeListIterator-expected.txt: 9 * fast/text/font-face-set-javascript-expected.txt: 10 1 11 2016-05-11 Joanmarie Diggs <jdiggs@igalia.com> 2 12 -
trunk/LayoutTests/fast/dom/nodeListIterator-expected.txt
r200619 r200678 10 10 PASS pair[1] is children[1] 11 11 PASS forEachContainer is nodeList 12 FAIL forEachIndex should be 0 (of type number). Was [object HTMLDivElement] (of type object). 12 PASS forEachIndex is index 13 13 PASS node is children[index++] 14 14 PASS forEachContainer is nodeList 15 FAIL forEachIndex should be 1 (of type number). Was [object HTMLOListElement] (of type object). 15 PASS forEachIndex is index 16 16 PASS node is children[index++] 17 17 PASS iterator.next().value is children[0] … … 24 24 PASS end.value is undefined 25 25 PASS pair.length is 2 26 FAIL pair[0] should be 0 (of type number). Was [object HTMLDivElement] (of type object). 26 PASS pair[0] is 0 27 27 PASS pair[1] is children[0] 28 28 PASS pair.length is 2 29 FAIL pair[0] should be 1 (of type number). Was [object HTMLOListElement] (of type object). 29 PASS pair[0] is 1 30 30 PASS pair[1] is children[1] 31 31 PASS end.done is true 32 32 PASS end.value is undefined 33 FAIL end.done should be true. Was false. 34 FAIL end.value should be undefined (of type undefined). Was [object HTMLParagraphElement],[object HTMLParagraphElement] (of type object). 33 PASS end.done is true 34 PASS end.value is undefined 35 35 PASS successfullyParsed is true 36 36 -
trunk/LayoutTests/fast/text/font-face-set-javascript-expected.txt
r200619 r200678 5 5 PASS item.done is false 6 6 PASS item.value.length is 2 7 FAIL item.value[0] should be 0 (of type number). Was [object FontFace] (of type object). 7 PASS item.value[0] is 0 8 8 PASS item.value[1] is fontFace1 9 9 PASS item.done is true -
trunk/Source/WebCore/ChangeLog
r200677 r200678 1 2016-05-11 Youenn Fablet <youenn.fablet@crf.canon.fr> 2 3 Ensure DOM iterators remain done 4 https://bugs.webkit.org/show_bug.cgi?id=157453 5 6 Reviewed by Darin Adler. 7 8 Covered by updated test. 9 10 Making DOMWrapped::Iterator an Optional. 11 Setting it to Nullopt on the first time Iterator is returning null. 12 13 For set iterators, incrementing a counter which value is used in forEach callbacks and entries iterators. 14 15 * bindings/js/JSDOMIterator.h: 16 (WebCore::JSDOMIterator<JSWrapper>::asJS): 17 (WebCore::appendForEachArguments): 18 (WebCore::iteratorForEach): 19 (WebCore::JSDOMIterator<JSWrapper>::next): 20 1 21 2016-05-11 Joanmarie Diggs <jdiggs@igalia.com> 2 22 -
trunk/Source/WebCore/bindings/js/JSDOMIterator.h
r200619 r200678 109 109 } 110 110 111 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isMap, JSC::JSValue>::type 112 asJS(JSC::ExecState&, IteratorValue&); 113 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isSet, JSC::JSValue>::type 114 asJS(JSC::ExecState&, IteratorValue&); 115 111 116 static void destroy(JSC::JSCell*); 112 117 113 typename DOMWrapped::Iteratorm_iterator;118 Optional<typename DOMWrapped::Iterator> m_iterator; 114 119 IterationKind m_kind; 120 size_t m_index { 0 }; 115 121 }; 116 122 … … 130 136 } 131 137 132 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isMap, JSC::JSValue>::type 133 toJS(JSC::ExecState& state, JSDOMGlobalObject* globalObject, IteratorValue& value, IterationKind kind) 134 { 135 ASSERT(value); 136 if (kind != IterationKind::KeyValue) 137 return toJS(&state, globalObject, (kind == IterationKind::Key) ? value->key : value->value); 138 139 return jsPair(state, globalObject, value->key, value->value); 140 } 141 142 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isSet, JSC::JSValue>::type 143 toJS(JSC::ExecState& state, JSDOMGlobalObject* globalObject, IteratorValue& value, IterationKind kind) 144 { 145 ASSERT(value); 146 JSC::JSValue result = toJS(&state, globalObject, *value); 147 if (kind != IterationKind::KeyValue) 138 template<typename JSWrapper> 139 template<typename IteratorValue> inline typename std::enable_if<IteratorInspector<IteratorValue>::isMap, JSC::JSValue>::type 140 JSDOMIterator<JSWrapper>::asJS(JSC::ExecState& state, IteratorValue& value) 141 { 142 ASSERT(value); 143 if (m_kind != IterationKind::KeyValue) 144 return toJS(&state, globalObject(), (m_kind == IterationKind::Key) ? value->key : value->value); 145 146 return jsPair(state, globalObject(), value->key, value->value); 147 } 148 149 template<typename JSWrapper> 150 template<typename IteratorValue> inline typename std::enable_if<IteratorInspector<IteratorValue>::isSet, JSC::JSValue>::type 151 JSDOMIterator<JSWrapper>::asJS(JSC::ExecState& state, IteratorValue& value) 152 { 153 ASSERT(value); 154 JSC::JSValue result = toJS(&state, globalObject(), *value); 155 if (m_kind != IterationKind::KeyValue) 148 156 return result; 149 157 150 // FIXME: first pair value should be the index of result. 151 return jsPair(state, globalObject, result, result); 158 return jsPair(state, globalObject(), JSC::jsNumber(m_index++), result); 152 159 } 153 160 154 161 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isMap, void>::type 155 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value )162 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value, size_t&) 156 163 { 157 164 ASSERT(value); … … 161 168 162 169 template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isSet, void>::type 163 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value )170 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value, size_t& index) 164 171 { 165 172 ASSERT(value); 166 173 JSC::JSValue argument = toJS(&state, globalObject, *value); 167 174 arguments.append(argument); 168 arguments.append( argument);175 arguments.append(JSC::jsNumber(index++)); 169 176 } 170 177 … … 181 188 return throwVMTypeError(&state); 182 189 190 size_t index = 0; 183 191 auto iterator = wrapper->wrapped().createIterator(); 184 192 while (auto value = iterator.next()) { 185 193 JSC::MarkedArgumentBuffer arguments; 186 appendForEachArguments(state, wrapper->globalObject(), arguments, value );194 appendForEachArguments(state, wrapper->globalObject(), arguments, value, index); 187 195 arguments.append(wrapper); 188 196 JSC::call(&state, state.argument(0), callType, callData, wrapper, arguments); … … 203 211 JSC::JSValue JSDOMIterator<JSWrapper>::next(JSC::ExecState& state) 204 212 { 205 auto iteratorValue = m_iterator.next(); 206 if (!iteratorValue) 207 return createIteratorResultObject(&state, JSC::jsUndefined(), true); 208 return createIteratorResultObject(&state, toJS(state, globalObject(), iteratorValue, m_kind), false); 213 if (m_iterator) { 214 auto iteratorValue = m_iterator->next(); 215 if (iteratorValue) 216 return createIteratorResultObject(&state, asJS(state, iteratorValue), false); 217 m_iterator = Nullopt; 218 } 219 return createIteratorResultObject(&state, JSC::jsUndefined(), true); 209 220 } 210 221
Note: See TracChangeset
for help on using the changeset viewer.