From bacd2b238db959e342c9d44ab56f563cfb0c8671 Mon Sep 17 00:00:00 2001 From: Gary Katsevman Date: Thu, 7 Nov 2019 16:35:48 -0500 Subject: [PATCH] fix: bring back Android 4.x support (#6289) Use a WeakMap and Set shams for browsers that don't support it. --- src/js/component.js | 35 +++++++++++++++++++++--- src/js/player.js | 6 ++++- src/js/utils/dom-data.js | 58 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/js/component.js b/src/js/component.js index 7bf0ae6f63..da83f6fa94 100644 --- a/src/js/component.js +++ b/src/js/component.js @@ -98,9 +98,38 @@ class Component { this.childIndex_ = {}; this.childNameIndex_ = {}; - this.setTimeoutIds_ = new Set(); - this.setIntervalIds_ = new Set(); - this.rafIds_ = new Set(); + let SetSham; + + if (!window.Set) { + SetSham = class { + constructor() { + this.set_ = {}; + } + has(key) { + return key in this.set_; + } + delete(key) { + const has = this.has(key); + + delete this.set_[key]; + + return has; + } + add(key) { + this.set_[key] = 1; + return this; + } + forEach(callback, thisArg) { + for (const key in this.set_) { + callback.call(thisArg, key, key, this); + } + } + }; + } + + this.setTimeoutIds_ = window.Set ? new Set() : new SetSham(); + this.setIntervalIds_ = window.Set ? new Set() : new SetSham(); + this.rafIds_ = window.Set ? new Set() : new SetSham(); this.clearingTimersOnDispose_ = false; // Add any child components in options diff --git a/src/js/player.js b/src/js/player.js index 5241209046..19856ae278 100644 --- a/src/js/player.js +++ b/src/js/player.js @@ -655,7 +655,11 @@ class Player extends Component { // `src` or `controls` that were set via js before the player // was initialized. Object.keys(el).forEach((k) => { - tag[k] = el[k]; + try { + tag[k] = el[k]; + } catch (e) { + // we got a a property like outerHTML which we can't actually copy, ignore it + } }); } diff --git a/src/js/utils/dom-data.js b/src/js/utils/dom-data.js index 43cf1a915e..cd077ebfa8 100644 --- a/src/js/utils/dom-data.js +++ b/src/js/utils/dom-data.js @@ -3,6 +3,62 @@ * @module dom-data */ +import log from './log.js'; +import * as Guid from './guid.js'; +import window from 'global/window'; + +let FakeWeakMap; + +if (!window.WeakMap) { + FakeWeakMap = class { + constructor() { + this.vdata = 'vdata' + Math.floor(window.performance && window.performance.now() || Date.now()); + this.data = {}; + } + + set(key, value) { + const access = key[this.vdata] || Guid.newGUID(); + + if (!key[this.vdata]) { + key[this.vdata] = access; + } + + this.data[access] = value; + + return this; + } + + get(key) { + const access = key[this.vdata]; + + // we have data, return it + if (access) { + return this.data[access]; + } + + // we don't have data, return nothing. + // return undefined explicitly as that's the contract for this method + log('We have no data for this element', key); + return undefined; + } + + has(key) { + const access = key[this.vdata]; + + return access in this.data; + } + + delete(key) { + const access = key[this.vdata]; + + if (access) { + delete this.data[access]; + delete key[this.vdata]; + } + } + }; +} + /** * Element Data Store. * @@ -13,4 +69,4 @@ * @type {Object} * @private */ -export default new WeakMap(); +export default window.WeakMap ? new WeakMap() : new FakeWeakMap();