From 823f07a382c50d9d351a509213fcb127ac582f1b Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Sat, 24 Mar 2018 12:47:47 +0000 Subject: [PATCH] Move polyfill JavaScript code to be included as a remote script from the head block. --- .../frontend/layout/default_head_blocks.xml | 2 +- .../view/frontend/templates/js/polyfill.phtml | 132 ------------- lib/web/mage/polyfill.js | 176 ++++++++++++++++++ 3 files changed, 177 insertions(+), 133 deletions(-) delete mode 100644 app/code/Magento/Theme/view/frontend/templates/js/polyfill.phtml create mode 100644 lib/web/mage/polyfill.js diff --git a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml index 38ab9c29402e9..38cfe25c16f8e 100644 --- a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml +++ b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml @@ -10,10 +10,10 @@ diff --git a/lib/web/mage/polyfill.js b/lib/web/mage/polyfill.js new file mode 100644 index 0000000000000..94232b29404fa --- /dev/null +++ b/lib/web/mage/polyfill.js @@ -0,0 +1,176 @@ +try { + if (!window.localStorage || !window.sessionStorage) { + throw new Error(); + } + + localStorage.setItem('storage_test', 1); + localStorage.removeItem('storage_test'); +} catch (e) { + (function () { + 'use strict'; + + /** + * Returns a storage object to shim local or sessionStorage + * @param {String} type - either 'local' or 'session' + */ + var Storage = function (type) { + var data; + + /** + * Creates a cookie + * @param {String} name + * @param {String} value + * @param {Integer} days + */ + function createCookie(name, value, days) { + var date, expires; + + if (days) { + date = new Date(); + date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); + expires = '; expires=' + date.toGMTString(); + } else { + expires = ''; + } + document.cookie = name + '=' + value + expires + '; path=/'; + } + + /** + * Reads value of a cookie + * @param {String} name + */ + function readCookie(name) { + var nameEQ = name + '=', + ca = document.cookie.split(';'), + i = 0, + c; + + for (i = 0; i < ca.length; i++) { + c = ca[i]; + + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + + if (c.indexOf(nameEQ) === 0) { + return c.substring(nameEQ.length, c.length); + } + } + + return null; + } + + /** + * Returns cookie name based upon the storage type. + * If this is session storage, the function returns a unique cookie per tab + */ + function getCookieName() { + + if (type !== 'session') { + return 'localstorage'; + } + + if (!window.name) { + window.name = new Date().getTime(); + } + + return 'sessionStorage' + window.name; + } + + /** + * Sets storage cookie to a data object + * @param {Object} dataObject + */ + function setData(dataObject) { + data = encodeURIComponent(JSON.stringify(dataObject)); + createCookie(getCookieName(), data, 365); + } + + /** + * Clears value of cookie data + */ + function clearData() { + createCookie(getCookieName(), '', 365); + } + + /** + * @returns value of cookie data + */ + function getData() { + var dataResponse = readCookie(getCookieName()); + + return dataResponse ? JSON.parse(decodeURIComponent(dataResponse)) : {}; + } + + data = getData(); + + return { + length: 0, + + /** + * Clears data from storage + */ + clear: function () { + data = {}; + this.length = 0; + clearData(); + }, + + /** + * Gets an item from storage + * @param {String} key + */ + getItem: function (key) { + return data[key] === undefined ? null : data[key]; + }, + + /** + * Gets an item by index from storage + * @param {Integer} i + */ + key: function (i) { + var ctr = 0, + k; + + for (k in data) { + + if (data.hasOwnProperty(k)) { + + // eslint-disable-next-line max-depth + if (ctr.toString() === i.toString()) { + return k; + } + ctr++; + } + } + + return null; + }, + + /** + * Removes an item from storage + * @param {String} key + */ + removeItem: function (key) { + delete data[key]; + this.length--; + setData(data); + }, + + /** + * Sets an item from storage + * @param {String} key + * @param {String} value + */ + setItem: function (key, value) { + data[key] = value.toString(); + this.length++; + setData(data); + } + }; + }; + + window.localStorage.prototype = window.localStorage = new Storage('local'); + window.sessionStorage.prototype = window.sessionStorage = new Storage('session'); + })(); +}