Skip to content

Commit

Permalink
fix: bring back Android 4.x support (#6289)
Browse files Browse the repository at this point in the history
Use a WeakMap and Set shams for browsers that don't support it.
  • Loading branch information
gkatsev authored Nov 7, 2019
1 parent de21baf commit bacd2b2
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 5 deletions.
35 changes: 32 additions & 3 deletions src/js/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion src/js/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
});
}

Expand Down
58 changes: 57 additions & 1 deletion src/js/utils/dom-data.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand All @@ -13,4 +69,4 @@
* @type {Object}
* @private
*/
export default new WeakMap();
export default window.WeakMap ? new WeakMap() : new FakeWeakMap();

0 comments on commit bacd2b2

Please sign in to comment.