From c47116273d51aa262efe0d88f5becea488c332a9 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Thu, 12 Nov 2015 19:35:13 -0800 Subject: [PATCH] JS: Remove Throwing Collection Checks (rFBOBJC) Reviewed By: sebmarkbage Differential Revision: D2650824 fb-gh-sync-id: eb944a2086f1efff05215c9f6bd332d0a832606e --- .../core/_shouldPolyfillES6Collection.js | 63 ++++++------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/Libraries/vendor/core/_shouldPolyfillES6Collection.js b/Libraries/vendor/core/_shouldPolyfillES6Collection.js index a96c00104..4a9aecd80 100644 --- a/Libraries/vendor/core/_shouldPolyfillES6Collection.js +++ b/Libraries/vendor/core/_shouldPolyfillES6Collection.js @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<6c1a82d2f5918f03f3f0e5825e1f32f3>> + * @generated SignedSource<> * * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * !! This file is a check-in of a static_upstream project! !! @@ -12,67 +12,42 @@ * !! static_upstream. !! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * - * Copyright 2013-2014 Facebook, Inc. + * Copyright 2004-present Facebook. All Rights Reserved. + * * @providesModule _shouldPolyfillES6Collection * @preventMunge - * @typechecks + * @flow */ /** - * Given a collection class name (Map or Set) return whether it's safe to use - * the native polyfill. - * - * @param {string} collectionName + * Checks whether a collection name (e.g. "Map" or "Set") has a native polyfill + * that is safe to be used. */ -function shouldPolyfillES6Collection(collectionName) { +function shouldPolyfillES6Collection(collectionName: string): boolean { var Collection = global[collectionName]; if (Collection == null) { return true; } + // The iterator protocol depends on `Symbol.iterator`. If a collection is + // implemented, but `Symbol` is not, it's going to break iteration because + // we'll be using custom "@@iterator" instead, which is not implemented on + // native collections. + if (typeof global.Symbol !== 'function') { + return true; + } + var proto = Collection.prototype; - // These checks are adapted from es6-shim https://fburl.com/34437854 + // These checks are adapted from es6-shim: https://fburl.com/34437854 + // NOTE: `isCallableWithoutNew` and `!supportsSubclassing` are not checked + // because they make debugging with "break on exceptions" difficult. return Collection == null || typeof Collection !== 'function' || typeof proto.clear !== 'function' || new Collection().size !== 0 || typeof proto.keys !== 'function' || - typeof proto.forEach !== 'function' || - isCallableWithoutNew(Collection) || - !supportsSubclassing(Collection); -} - -/** - * Given a class can we subclass it? - * - * @param {function} Collection - */ -function supportsSubclassing(Collection) { - class SubCollection extends Collection {} - try { - var s = (new SubCollection([])); - // Firefox 32 will throw a type error when any operation is called on a - // subclass. - s.size; - return s instanceof Collection; - } catch (e) { - return false; - } -} - -/** - * Given a constructor can we call it without `new`? - * - * @param {function} Collection - */ -function isCallableWithoutNew(Collection) { - try { - Collection(); - } catch (e) { - return false; - } - return true; + typeof proto.forEach !== 'function'; } module.exports = shouldPolyfillES6Collection;