Skip to content

Commit f090e96

Browse files
Fixes for Node.js <= 0.12 and Firefox <66 (#37)
Fixes for Node.js <= 0.12 and Firefox <66
2 parents 5abeabe + 3959376 commit f090e96

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

support/types.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,10 @@ function isUint8Array(value) {
115115
} else {
116116
return (
117117
ObjectToString(value) === '[object Uint8Array]' ||
118-
isBuffer(value)
118+
// If it's a Buffer instance _and_ has a `.buffer` property,
119+
// this is an ArrayBuffer based buffer; thus it's an Uint8Array
120+
// (Old Node.js had a custom non-Uint8Array implementation)
121+
isBuffer(value) && value.buffer !== undefined
119122
);
120123
}
121124
}
@@ -309,7 +312,7 @@ function isDataViewToString(value) {
309312
isDataViewToString.working = (
310313
typeof ArrayBuffer !== 'undefined' &&
311314
typeof DataView !== 'undefined' &&
312-
isDataViewToString(new DataView(new ArrayBuffer()))
315+
isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1))
313316
);
314317
function isDataView(value) {
315318
if (typeof DataView === 'undefined') {

test/node/types.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ var vm = require('vm');
1919
var Buffer = require('safe-buffer').Buffer
2020
var objectEntries = require('object.entries');
2121

22+
// "polyfill" deepStrictEqual on Node 0.12 and below
23+
if (!assert.deepStrictEqual) {
24+
assert.deepStrictEqual = assert.deepEqual;
25+
}
26+
2227
function uncurryThis(f) {
2328
return f.call.bind(f);
2429
}
@@ -82,7 +87,7 @@ for (var _i = 0, _arr = [
8287
value: 'foo'
8388
});
8489
}, 'isUint8Array'],
85-
[function () { return new DataView(new ArrayBuffer(1)); }, 'isDataView'],
90+
[function () { return new DataView(new ArrayBuffer(1), 0, 1); }, 'isDataView'],
8691
[function () { return new SharedArrayBuffer(); }, 'isSharedArrayBuffer'],
8792
// [ new Proxy({}, {}), 'isProxy' ],
8893
[function () { return new WebAssembly.Module(wasmBuffer); }, 'isWebAssemblyCompiledModule']
@@ -137,7 +142,9 @@ console.log('Testing', 'isBoxedPrimitive');
137142

138143
var SymbolSupported = typeof Symbol !== 'undefined';
139144
var SymbolToStringTagSupported = SymbolSupported && typeof Symbol.toStringTag !== 'undefined';
140-
if (SymbolToStringTagSupported) {
145+
var isBuggyFirefox = typeof navigator !== 'undefined' && /Firefox\/\d+/.test(navigator.userAgent) &&
146+
parseInt(navigator.userAgent.split('Firefox/')[1], 10) < 66
147+
if (SymbolToStringTagSupported && !isBuggyFirefox) {
141148
[
142149
'Uint8Array',
143150
'Uint8ClampedArray',
@@ -164,13 +171,19 @@ if (SymbolToStringTagSupported) {
164171
assert(types[method](array));
165172
});
166173
}
174+
if (isBuggyFirefox) {
175+
console.log('skipping fake typed array tests because they do not work in FF')
176+
}
167177

178+
// Old Node.js had a fully custom Buffer implementation, newer are based on ArrayBuffer
179+
// This is important for the ArrayBuffer and typed array tests
180+
var isBufferBasedOnArrayBuffer = Buffer.alloc(1).buffer !== undefined;
168181
{
169182
var primitive = function primitive() { return true; };
170183
var arrayBuffer = function arrayBuffer() { return new ArrayBuffer(1); };
171184

172185
var buffer = function buffer() { return Buffer.from(arrayBuffer()); };
173-
var dataView = function dataView() { return new DataView(arrayBuffer()); };
186+
var dataView = function dataView() { return new DataView(arrayBuffer(), 0, 1); };
174187
var uint8Array = function uint8Array() { return new Uint8Array(arrayBuffer()); };
175188
var uint8ClampedArray = function uint8ClampedArray() { return new Uint8ClampedArray(arrayBuffer()); };
176189
var uint16Array = function uint16Array() { return new Uint16Array(arrayBuffer()); };
@@ -208,7 +221,7 @@ if (SymbolToStringTagSupported) {
208221
var fakeBigUint64Array = function fakeBigUint64Array() { return Object.create(BigUint64Array.prototype); };
209222

210223
var stealthyDataView = function stealthyDataView() {
211-
return Object.setPrototypeOf(new DataView(arrayBuffer()), Uint8Array.prototype);
224+
return Object.setPrototypeOf(new DataView(arrayBuffer(), 0, 1), Uint8Array.prototype);
212225
};
213226
var stealthyUint8Array = function stealthyUint8Array() {
214227
return Object.setPrototypeOf(new Uint8Array(arrayBuffer()), ArrayBuffer.prototype);
@@ -384,7 +397,7 @@ if (SymbolToStringTagSupported) {
384397

385398
var expected = {
386399
isArrayBufferView: [
387-
buffer,
400+
isBufferBasedOnArrayBuffer ? buffer : undefined,
388401
dataView,
389402
stealthyDataView,
390403
uint8Array,
@@ -411,7 +424,7 @@ if (SymbolToStringTagSupported) {
411424
stealthyBigUint64Array
412425
],
413426
isTypedArray: [
414-
buffer,
427+
isBufferBasedOnArrayBuffer ? buffer : undefined,
415428
uint8Array,
416429
stealthyUint8Array,
417430
uint8ClampedArray,
@@ -436,7 +449,7 @@ if (SymbolToStringTagSupported) {
436449
stealthyBigUint64Array
437450
],
438451
isUint8Array: [
439-
buffer,
452+
isBufferBasedOnArrayBuffer ? buffer : undefined,
440453
uint8Array,
441454
stealthyUint8Array
442455
],

0 commit comments

Comments
 (0)