Changeset 203235 in webkit


Ignore:
Timestamp:
Jul 14, 2016 12:32:24 PM (8 years ago)
Author:
commit-queue@webkit.org
Message:

DOMIterators should be assigned a correct prototype
https://bugs.webkit.org/show_bug.cgi?id=159115

Patch by Youenn Fablet <youenn@apple.com> on 2016-07-14
Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

  • web-platform-tests/fetch/api/headers/headers-basic.html: Updating test (changes to be upstreamed to w3c wpt repo)

Source/WebCore:

Default iterator object internal prototype property is the Iterator prototype as defined in
http://heycam.github.io/webidl/#dfn-iterator-prototype-object.
Linking DOMIterator prototype to IteratorPrototype.
This allows adding @@iterator property to the result of entries, keys and values methods.
This in turns allow doing for-of loops on them.

Covered by updated test.

  • ForwardingHeaders/runtime/IteratorPrototype.h: Added.
  • bindings/js/JSDOMIterator.h: Setting correct prototype and marking next prototype property as enumerable.
Location:
trunk
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r203221 r203235  
     12016-07-14  Youenn Fablet  <youenn@apple.com>
     2
     3        DOMIterators should be assigned a correct prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=159115
     5
     6        Reviewed by Chris Dumez.
     7
     8        * web-platform-tests/fetch/api/headers/headers-basic.html: Updating test (changes to be upstreamed to w3c wpt repo)
     9
    1102016-07-14  Youenn Fablet  <youenn@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-basic.html

    r198888 r203235  
    121121      };
    122122      var sortedHeaderDict = {};
     123      var headerValues = [];
    123124      var sortedHeaderKeys = Object.keys(headerEntriesDict).map(function(value) {
    124125        sortedHeaderDict[value.toLowerCase()] = headerEntriesDict[value];
     126        headerValues.push(headerEntriesDict[value]);
    125127        return value.toLowerCase();
    126128      }).sort();
    127129
     130      var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values()));
     131      function checkIteratorProperties(iterator) {
     132        var prototype = Object.getPrototypeOf(iterator);
     133        assert_equals(Object.getPrototypeOf(prototype), iteratorPrototype);
     134
     135        var descriptor = Object.getOwnPropertyDescriptor(prototype, "next");
     136        assert_true(descriptor.configurable, "configurable");
     137        assert_true(descriptor.enumerable, "enumerable");
     138        assert_true(descriptor.writable, "writable");
     139      }
     140
    128141      test(function() {
    129142        var headers = new Headers(headerEntriesDict);
    130143        var actual = headers.keys();
     144        checkIteratorProperties(actual);
     145
    131146        sortedHeaderKeys.forEach(function(key) {
    132147            entry = actual.next();
     
    136151        assert_true(actual.next().done);
    137152        assert_true(actual.next().done);
     153
     154        for (key of headers.keys())
     155            assert_true(sortedHeaderKeys.indexOf(key) != -1);
    138156      }, "Check keys method");
    139157
     
    141159        var headers = new Headers(headerEntriesDict);
    142160        var actual = headers.values();
     161        checkIteratorProperties(actual);
    143162
    144163        sortedHeaderKeys.forEach(function(key) {
     
    149168        assert_true(actual.next().done);
    150169        assert_true(actual.next().done);
     170
     171        for (value of headers.values())
     172            assert_true(headerValues.indexOf(value) != -1);
    151173      }, "Check values method");
    152174
     
    154176        var headers = new Headers(headerEntriesDict);
    155177        var actual = headers.entries();
     178        checkIteratorProperties(actual);
    156179
    157180        sortedHeaderKeys.forEach(function(key) {
     
    163186        assert_true(actual.next().done);
    164187        assert_true(actual.next().done);
     188
     189        for (entry of headers.entries())
     190            assert_equals(entry[1], sortedHeaderDict[entry[0]]);
    165191      }, "Check entries method");
    166192
  • trunk/Source/WebCore/ChangeLog

    r203234 r203235  
     12016-07-14  Youenn Fablet  <youenn@apple.com>
     2
     3        DOMIterators should be assigned a correct prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=159115
     5
     6        Reviewed by Chris Dumez.
     7
     8        Default iterator object internal prototype property is the Iterator prototype as defined in
     9        http://heycam.github.io/webidl/#dfn-iterator-prototype-object.
     10        Linking DOMIterator prototype to IteratorPrototype.
     11        This allows adding @@iterator property to the result of entries, keys and values methods.
     12        This in turns allow doing for-of loops on them.
     13
     14        Covered by updated test.
     15
     16        * ForwardingHeaders/runtime/IteratorPrototype.h: Added.
     17        * bindings/js/JSDOMIterator.h: Setting correct prototype and marking next prototype property as enumerable.
     18
    1192016-07-14  Youenn Fablet  <youenn@apple.com>
    220
  • trunk/Source/WebCore/bindings/js/JSDOMIterator.h

    r203234 r203235  
    2828
    2929#include "JSDOMBinding.h"
     30#include <runtime/IteratorPrototype.h>
    3031#include <runtime/JSDestructibleObject.h>
    3132#include <type_traits>
     
    9899    {
    99100        return JSDOMIteratorPrototype<JSWrapper>::create(vm, globalObject,
    100             JSDOMIteratorPrototype<JSWrapper>::createStructure(vm, globalObject, globalObject->objectPrototype()));
     101            JSDOMIteratorPrototype<JSWrapper>::createStructure(vm, globalObject, globalObject->iteratorPrototype()));
    101102    }
    102103
     
    239240    ASSERT(inherits(info()));
    240241
    241     JSC_NATIVE_INTRINSIC_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->next, next, JSC::DontEnum, 0, JSC::NoIntrinsic);
     242    JSC_NATIVE_INTRINSIC_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->next, next, 0, 0, JSC::NoIntrinsic);
    242243}
    243244
Note: See TracChangeset for help on using the changeset viewer.