diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2019-12-13 23:26:32 -0500 |
---|---|---|
committer | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2019-12-14 11:12:39 -0500 |
commit | ddaf44ba7bfa8399ddc5e7f7025229f9aa03c700 (patch) | |
tree | b41ccd3bfca1b7ae7e2a2d70040c4578ba4c9c9e | |
parent | 87ece13647aae3f670f03d7f5667f638bee23bcb (diff) |
Isolate functions passed across window contexts
-rw-r--r-- | ext/bg/js/util.js | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index f7f6e770..96d549c9 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -32,11 +32,32 @@ function utilIsolate(value) { return typeof stringValue === 'string' ? JSON.parse(stringValue) : null; } +function utilFunctionIsolate(func) { + return function (...args) { + try { + return func.call(this, ...args); + } catch (e) { + try { + String(func); + } catch (e2) { + // Dead object + return; + } + throw e; + } + }; +} + function utilBackgroundIsolate(data) { const backgroundPage = chrome.extension.getBackgroundPage(); return backgroundPage.utilIsolate(data); } +function utilBackgroundFunctionIsolate(func) { + const backgroundPage = chrome.extension.getBackgroundPage(); + return backgroundPage.utilFunctionIsolate(func); +} + function utilSetEqual(setA, setB) { if (setA.size !== setB.size) { return false; @@ -110,15 +131,15 @@ function utilDatabasePurge() { function utilDatabaseDeleteDictionary(dictionaryName, onProgress) { return utilBackend().translator.database.deleteDictionary( utilBackgroundIsolate(dictionaryName), - onProgress + utilBackgroundFunctionIsolate(onProgress) ); } -async function utilDatabaseImport(data, progress, details) { +async function utilDatabaseImport(data, onProgress, details) { data = await utilReadFile(data); return utilBackend().translator.database.importDictionary( utilBackgroundIsolate(data), - progress, + utilBackgroundFunctionIsolate(onProgress), utilBackgroundIsolate(details) ); } |