Changeset 200678 in webkit


Ignore:
Timestamp:
May 11, 2016 12:50:49 AM (8 years ago)
Author:
youenn.fablet@crf.canon.fr
Message:

Ensure DOM iterators remain done
https://bugs.webkit.org/show_bug.cgi?id=157453

Reviewed by Darin Adler.

Source/WebCore:

Covered by updated test.

Making DOMWrapped::Iterator an Optional.
Setting it to Nullopt on the first time Iterator is returning null.

For set iterators, incrementing a counter which value is used in forEach callbacks and entries iterators.

  • bindings/js/JSDOMIterator.h:

(WebCore::JSDOMIterator<JSWrapper>::asJS):
(WebCore::appendForEachArguments):
(WebCore::iteratorForEach):
(WebCore::JSDOMIterator<JSWrapper>::next):

LayoutTests:

  • fast/dom/nodeListIterator-expected.txt:
  • fast/text/font-face-set-javascript-expected.txt:
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r200677 r200678  
     12016-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
    1112016-05-11  Joanmarie Diggs  <jdiggs@igalia.com>
    212
  • trunk/LayoutTests/fast/dom/nodeListIterator-expected.txt

    r200619 r200678  
    1010PASS pair[1] is children[1]
    1111PASS forEachContainer is nodeList
    12 FAIL forEachIndex should be 0 (of type number). Was [object HTMLDivElement] (of type object).
     12PASS forEachIndex is index
    1313PASS node is children[index++]
    1414PASS forEachContainer is nodeList
    15 FAIL forEachIndex should be 1 (of type number). Was [object HTMLOListElement] (of type object).
     15PASS forEachIndex is index
    1616PASS node is children[index++]
    1717PASS iterator.next().value is children[0]
     
    2424PASS end.value is undefined
    2525PASS pair.length is 2
    26 FAIL pair[0] should be 0 (of type number). Was [object HTMLDivElement] (of type object).
     26PASS pair[0] is 0
    2727PASS pair[1] is children[0]
    2828PASS pair.length is 2
    29 FAIL pair[0] should be 1 (of type number). Was [object HTMLOListElement] (of type object).
     29PASS pair[0] is 1
    3030PASS pair[1] is children[1]
    3131PASS end.done is true
    3232PASS 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).
     33PASS end.done is true
     34PASS end.value is undefined
    3535PASS successfullyParsed is true
    3636
  • trunk/LayoutTests/fast/text/font-face-set-javascript-expected.txt

    r200619 r200678  
    55PASS item.done is false
    66PASS item.value.length is 2
    7 FAIL item.value[0] should be 0 (of type number). Was [object FontFace] (of type object).
     7PASS item.value[0] is 0
    88PASS item.value[1] is fontFace1
    99PASS item.done is true
  • trunk/Source/WebCore/ChangeLog

    r200677 r200678  
     12016-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
    1212016-05-11  Joanmarie Diggs  <jdiggs@igalia.com>
    222
  • trunk/Source/WebCore/bindings/js/JSDOMIterator.h

    r200619 r200678  
    109109    }
    110110
     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
    111116    static void destroy(JSC::JSCell*);
    112117
    113     typename DOMWrapped::Iterator m_iterator;
     118    Optional<typename DOMWrapped::Iterator> m_iterator;
    114119    IterationKind m_kind;
     120    size_t m_index { 0 };
    115121};
    116122
     
    130136}
    131137
    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)
     138template<typename JSWrapper>
     139template<typename IteratorValue> inline typename std::enable_if<IteratorInspector<IteratorValue>::isMap, JSC::JSValue>::type
     140JSDOMIterator<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
     149template<typename JSWrapper>
     150template<typename IteratorValue> inline typename std::enable_if<IteratorInspector<IteratorValue>::isSet, JSC::JSValue>::type
     151JSDOMIterator<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)
    148156        return result;
    149157
    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);
    152159}
    153160
    154161template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isMap, void>::type
    155 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value)
     162appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value, size_t&)
    156163{
    157164    ASSERT(value);
     
    161168
    162169template<typename IteratorValue> typename std::enable_if<IteratorInspector<IteratorValue>::isSet, void>::type
    163 appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value)
     170appendForEachArguments(JSC::ExecState& state, JSDOMGlobalObject* globalObject, JSC::MarkedArgumentBuffer& arguments, IteratorValue& value, size_t& index)
    164171{
    165172    ASSERT(value);
    166173    JSC::JSValue argument = toJS(&state, globalObject, *value);
    167174    arguments.append(argument);
    168     arguments.append(argument);
     175    arguments.append(JSC::jsNumber(index++));
    169176}
    170177
     
    181188        return throwVMTypeError(&state);
    182189
     190    size_t index = 0;
    183191    auto iterator = wrapper->wrapped().createIterator();
    184192    while (auto value = iterator.next()) {
    185193        JSC::MarkedArgumentBuffer arguments;
    186         appendForEachArguments(state, wrapper->globalObject(), arguments, value);
     194        appendForEachArguments(state, wrapper->globalObject(), arguments, value, index);
    187195        arguments.append(wrapper);
    188196        JSC::call(&state, state.argument(0), callType, callData, wrapper, arguments);
     
    203211JSC::JSValue JSDOMIterator<JSWrapper>::next(JSC::ExecState& state)
    204212{
    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);
    209220}
    210221
Note: See TracChangeset for help on using the changeset viewer.