diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2019-09-29 15:26:46 -0400 | 
|---|---|---|
| committer | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2019-09-29 15:26:57 -0400 | 
| commit | 8b7558a757447b931ee0dd1b5d724673e98bc13d (patch) | |
| tree | 8838aaa2b329612bcd597cd613c5766120ed28e8 | |
| parent | 8195e5109b97c284fc1d6c8559de6e5f5941c911 (diff) | |
Use toIterable for cross-window origin objects
| -rw-r--r-- | ext/bg/js/conditions-ui.js | 4 | ||||
| -rw-r--r-- | ext/bg/js/settings.js | 4 | ||||
| -rw-r--r-- | ext/mixed/js/extension.js | 15 | 
3 files changed, 17 insertions, 6 deletions
| diff --git a/ext/bg/js/conditions-ui.js b/ext/bg/js/conditions-ui.js index a6f54a1c..43c6dc08 100644 --- a/ext/bg/js/conditions-ui.js +++ b/ext/bg/js/conditions-ui.js @@ -36,7 +36,7 @@ ConditionsUI.Container = class Container {          this.container.empty(); -        for (const conditionGroup of conditionGroups) { +        for (const conditionGroup of toIterable(conditionGroups)) {              this.children.push(new ConditionsUI.ConditionGroup(this, conditionGroup));          } @@ -122,7 +122,7 @@ ConditionsUI.ConditionGroup = class ConditionGroup {          this.separator = ConditionsUI.instantiateTemplate('#condition-group-separator-template').appendTo(parent.container);          this.addButton = this.options.find('.condition-add'); -        for (const condition of conditionGroup.conditions) { +        for (const condition of toIterable(conditionGroup.conditions)) {              this.children.push(new ConditionsUI.Condition(this, condition));          } diff --git a/ext/bg/js/settings.js b/ext/bg/js/settings.js index a0fe7c70..a100550c 100644 --- a/ext/bg/js/settings.js +++ b/ext/bg/js/settings.js @@ -422,7 +422,7 @@ async function onDictionaryPurge(e) {          dictionarySpinnerShow(true);          await utilDatabasePurge(); -        for (const options of await getOptionsArray()) { +        for (const options of toIterable(await getOptionsArray())) {              options.dictionaries = utilBackgroundIsolate({});              options.general.mainDictionary = '';          } @@ -466,7 +466,7 @@ async function onDictionaryImport(e) {          const exceptions = [];          const summary = await utilDatabaseImport(e.target.files[0], updateProgress, exceptions); -        for (const options of await getOptionsArray()) { +        for (const options of toIterable(await getOptionsArray())) {              options.dictionaries[summary.title] = utilBackgroundIsolate({                  enabled: true,                  priority: 0, diff --git a/ext/mixed/js/extension.js b/ext/mixed/js/extension.js index d7085e5b..5c803132 100644 --- a/ext/mixed/js/extension.js +++ b/ext/mixed/js/extension.js @@ -17,13 +17,24 @@   */ +// toIterable is required on Edge for cross-window origin objects.  function toIterable(value) {      if (typeof Symbol !== 'undefined' && typeof value[Symbol.iterator] !== 'undefined') {          return value;      } -    const array = JSON.parse(JSON.stringify(value)); -    return Array.isArray(array) ? array : []; +    if (value !== null && typeof value === 'object') { +        const length = value.length; +        if (typeof length === 'number' && Number.isFinite(length)) { +            const array = []; +            for (let i = 0; i < length; ++i) { +                array.push(value[i]); +            } +            return array; +        } +    } + +    throw 'Could not convert to iterable';  }  function extensionHasChrome() { |