Skip to content

Commit eb8d6c4

Browse files
committed
1 parent 7810f65 commit eb8d6c4

File tree

6 files changed

+119
-28
lines changed

6 files changed

+119
-28
lines changed

Uint8Array.prototype.setFromBase64/implementation.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,21 @@ module.exports = function setFromBase64(string) {
6464

6565
var result = FromBase64(string, alphabet, lastChunkHandling, byteLength); // step 14
6666

67-
if (result['[[Error]]']) { // step 15
68-
throw result['[[Error]]']; // step 15.a
69-
}
70-
71-
var bytes = result['[[Bytes]]']; // step 16
67+
var bytes = result['[[Bytes]]']; // step 15
7268

73-
var written = bytes.length; // step 17
69+
var written = bytes.length; // step 16
7470

75-
// 18. NOTE: FromBase64 does not invoke any user code, so the ArrayBuffer backing into cannot have been detached or shrunk.
71+
// 17. NOTE: FromBase64 does not invoke any user code, so the ArrayBuffer backing into cannot have been detached or shrunk.
7672

7773
if (written > byteLength) {
7874
throw new $TypeError('Assertion failed: written is not <= byteLength'); // step 19
7975
}
8076

81-
SetUint8ArrayBytes(into, bytes); // step 20
77+
SetUint8ArrayBytes(into, bytes); // step 19
78+
79+
if (result['[[Error]]']) { // step 20
80+
throw result['[[Error]]']; // step 20.a
81+
}
8282

8383
var offset = typedArrayByteOffset(into); // step 21
8484

Uint8Array.prototype.setFromHex/implementation.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,21 @@ module.exports = function setFromHex(string) {
3636

3737
var result = FromHex(string, byteLength); // step 7
3838

39-
if (result['[[Error]]']) { // step 8
40-
throw result['[[Error]]']; // step 8.a
41-
}
42-
43-
var bytes = result['[[Bytes]]']; // step 9
39+
var bytes = result['[[Bytes]]']; // step 8
4440

45-
var written = bytes.length; // step 10
41+
var written = bytes.length; // step 9
4642

47-
// 11. NOTE: FromHex does not invoke any user code, so the ArrayBuffer backing into cannot have been detached or shrunk.
43+
// 10. NOTE: FromHex does not invoke any user code, so the ArrayBuffer backing into cannot have been detached or shrunk.
4844

4945
if (written > byteLength) {
50-
throw new $TypeError('Assertion failed: written is not <= byteLength'); // step 12
46+
throw new $TypeError('Assertion failed: written is not <= byteLength'); // step 11
5147
}
5248

53-
SetUint8ArrayBytes(into, bytes); // step 13
49+
SetUint8ArrayBytes(into, bytes); // step 12
50+
51+
if (result['[[Error]]']) { // step 13
52+
throw result['[[Error]]']; // step 13.a
53+
}
5454

5555
// var resultObject = {}; // step 14 // OrdinaryObjectCreate(%Object.prototype%)
5656
// CreateDataPropertyOrThrow(resultObject, 'read', result['[[Read]]']); // step 15

aos/FromHex.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,38 @@ module.exports = function FromHex(string) {
3131

3232
var length = string.length; // step 2
3333

34-
if (modulo(length, 2) !== 0) {
35-
throw new $SyntaxError('string should be an even number of characters'); // step 3
36-
}
34+
var bytes = []; // step 3
3735

38-
var bytes = []; // step 4
36+
var read = 0; // step 4
3937

40-
var index = 0; // step 5
38+
if (modulo(length, 2) !== 0) { // step 5
39+
return {
40+
'[[Read]]': read,
41+
'[[Bytes]]': bytes,
42+
'[[Error]]': new $SyntaxError('string should be an even number of characters')
43+
};
44+
}
4145

42-
while (index < length && bytes.length < maxLength) { // step 6
43-
var hexits = substring(string, index, index + 2); // step 6.a
46+
while (read < length && bytes.length < maxLength) { // step 6
47+
var hexits = substring(string, read, read + 2); // step 6.a
4448

45-
if (!isHexDigit(hexits)) {
46-
throw new $SyntaxError('string should only contain hex characters'); // step 6.b
49+
if (!isHexDigit(hexits)) { // step 6.b
50+
return {
51+
'[[Read]]': read,
52+
'[[Bytes]]': bytes,
53+
'[[Error]]': new $SyntaxError('string should only contain hex characters')
54+
};
4755
}
4856

49-
index += 2; // step 6.c
57+
read += 2; // step 6.c
5058

5159
var byte = $parseInt(hexits, 16); // step 6.d
5260

5361
$push(bytes, byte); // step 6.e
5462
}
55-
return { '[[Read]]': index, '[[Bytes]]': bytes }; // step 7
63+
return {
64+
'[[Read]]': read,
65+
'[[Bytes]]': bytes,
66+
'[[Error]]': null
67+
}; // step 7
5668
};

test/Uint8Array.prototype.setFromBase64.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,46 @@ module.exports = {
574574
s2t.end();
575575
});
576576

577+
st.test('test262: test/built-ins/Uint8Array/prototype/setFromBase64/writes-up-to-error', function (s2t) {
578+
var target = new Uint8Array([255, 255, 255, 255, 255]);
579+
s2t['throws'](
580+
function () { method(target, 'MjYyZm.9v'); },
581+
SyntaxError,
582+
'illegal character in second chunk'
583+
);
584+
s2t.deepEqual(
585+
target,
586+
new Uint8Array([50, 54, 50, 255, 255]),
587+
'decoding from MjYyZm.9v should only write the valid chunks'
588+
);
589+
590+
var target2 = new Uint8Array([255, 255, 255, 255, 255]);
591+
s2t['throws'](
592+
function () { method(target2, 'MjYyZg', { lastChunkHandling: 'strict' }); },
593+
SyntaxError,
594+
'padding omitted with lastChunkHandling: strict'
595+
);
596+
s2t.deepEqual(
597+
target2,
598+
new Uint8Array([50, 54, 50, 255, 255]),
599+
'decoding from MjYyZg should only write the valid chunks'
600+
);
601+
602+
var target3 = new Uint8Array([255, 255, 255, 255, 255]);
603+
s2t['throws'](
604+
function () { method(target3, 'MjYyZg==='); },
605+
SyntaxError,
606+
'extra characters after padding'
607+
);
608+
s2t.deepEqual(
609+
target3,
610+
new Uint8Array([50, 54, 50, 255, 255]),
611+
'decoding from MjYyZg=== should not write the last chunk because it has extra padding'
612+
);
613+
614+
s2t.end();
615+
});
616+
577617
var illegal = [
578618
'Zm.9v',
579619
'Zm9v^',

test/Uint8Array.prototype.setFromHex.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,26 @@ module.exports = {
181181
s2t.end();
182182
});
183183

184+
st.test('test262: test/built-ins/Uint8Array/prototype/setFromHex/writes-up-to-error', function (s2t) {
185+
['aaa ', 'aaag'].forEach(function (value) {
186+
var target = new Uint8Array([255, 255, 255, 255, 255]);
187+
s2t['throws'](
188+
function () { method(target, value); },
189+
SyntaxError
190+
);
191+
s2t.deepEqual(target, new Uint8Array([170, 255, 255, 255, 255]), 'decoding from ' + value);
192+
});
193+
194+
var target = new Uint8Array([255, 255, 255, 255, 255]);
195+
s2t['throws'](
196+
function () { method(target, 'aaa'); },
197+
SyntaxError
198+
);
199+
s2t.deepEqual(target, new Uint8Array([255, 255, 255, 255, 255]), 'when length is odd no data is written');
200+
201+
s2t.end();
202+
});
203+
184204
st.end();
185205
});
186206
},

test/Uint8Array.prototype.toBase64.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,25 @@ module.exports = {
225225
s2t.end();
226226
});
227227

228+
st.test('test262: test/built-ins/Uint8Array/prototype/toBase64/omit-padding', function (s2t) {
229+
s2t.equal(method(new Uint8Array([199, 239])), 'x+8=');
230+
s2t.equal(method(new Uint8Array([199, 239]), { omitPadding: false }), 'x+8=');
231+
s2t.equal(method(new Uint8Array([199, 239]), { omitPadding: true }), 'x+8');
232+
s2t.equal(method(new Uint8Array([255]), { omitPadding: true }), '/w');
233+
234+
// works with base64url alphabet
235+
s2t.equal(method(new Uint8Array([199, 239]), { alphabet: 'base64url' }), 'x-8=');
236+
s2t.equal(method(new Uint8Array([199, 239]), { alphabet: 'base64url', omitPadding: false }), 'x-8=');
237+
s2t.equal(method(new Uint8Array([199, 239]), { alphabet: 'base64url', omitPadding: true }), 'x-8');
238+
s2t.equal(method(new Uint8Array([255]), { alphabet: 'base64url', omitPadding: true }), '_w');
239+
240+
// performs ToBoolean on the argument
241+
s2t.equal(method(new Uint8Array([255]), { omitPadding: 0 }), '/w==');
242+
s2t.equal(method(new Uint8Array([255]), { omitPadding: 1 }), '/w');
243+
244+
s2t.end();
245+
});
246+
228247
// standard test vectors from https://datatracker.ietf.org/doc/html/rfc4648#section-10
229248
st.equal(method(new Uint8Array([])), '');
230249
st.equal(method(new Uint8Array([102])), 'Zg==');

0 commit comments

Comments
 (0)