diff --git a/lib/web/webidl/index.js b/lib/web/webidl/index.js index c7834328f87..5518b495906 100644 --- a/lib/web/webidl/index.js +++ b/lib/web/webidl/index.js @@ -452,6 +452,9 @@ webidl.interfaceConverter = function (TypeCheck, name) { } webidl.dictionaryConverter = function (converters) { + // "For each dictionary member member declared on dictionary, in lexicographical order:" + converters.sort((a, b) => (a.key > b.key) - (a.key < b.key)) + return (dictionary, prefix, argument) => { const dict = {} diff --git a/test/webidl/converters.js b/test/webidl/converters.js index cccb230619d..bb487900de0 100644 --- a/test/webidl/converters.js +++ b/test/webidl/converters.js @@ -121,6 +121,32 @@ describe('webidl.dictionaryConverter', () => { assert.deepStrictEqual(dict(obj), { key: 1 }) assert.deepStrictEqual(dict(obj2), { key: 1 }) }) + + test('keys are accessed in lexicographical order', () => { + const converter = webidl.dictionaryConverter([ + { + converter: () => true, + key: 'zyx' + }, + { + converter: () => true, + key: 'abc' + } + ]) + + const accessed = [] + + converter({ + get abc () { + return accessed.push('abc') + }, + get zyx () { + return accessed.push('zyx') + } + }, 'converter', 'converter') + + assert.deepStrictEqual(accessed, ['abc', 'zyx']) + }) }) describe('buffer source converters', () => {