Skip to content

Commit

Permalink
v8.3.14-dev.32 Extension: get / set values in the content script inst…
Browse files Browse the repository at this point in the history
…ead of the background page (close #1377)
  • Loading branch information
Rafael committed May 26, 2019
1 parent b540604 commit f3398ce
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 159 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -53,7 +53,7 @@
"webpack-shell-plugin": "0.5.0",
"webpack-cli": "^3.1.0"
},
"devVersion": "8.3.14-dev.31",
"devVersion": "8.3.14-dev.32",
"homepage": "https://github.com/gsrafael01/ESGST",
"keywords": [
"esgst",
Expand Down
146 changes: 88 additions & 58 deletions src/_browser.js
Expand Up @@ -56,17 +56,6 @@ if (typeof browser !== `undefined`) {
resolve();
break;
}
case `delValues`: {
const keys = JSON.parse(obj.keys);
const promises = [];
for (const key of keys) {
promises.push(_browser.gm.deleteValue(key));
}
await Promise.all(promises);
await _browser.gm.setValue(`delValuesTemp`, obj.values);
resolve();
break;
}
case `fetch`: {
const parameters = JSON.parse(obj.parameters);
if (parameters.credentials === `omit`) {
Expand All @@ -91,42 +80,61 @@ if (typeof browser !== `undefined`) {
});
break;
}
case `getStorage`: {
const keys = await _browser.gm.listValues();
const promises = [];
const storage = {};
for (const key of keys) {
const promise = _browser.gm.getValue(key);
promise.then(value => storage[key] = value);
promises.push(promise);
}
await Promise.all(promises);
resolve(JSON.stringify(storage));
break;
}
case `setValues`: {
const values = JSON.parse(obj.values);
const promises = [];
for (const key in values) {
if (values.hasOwnProperty(key)) {
promises.push(_browser.gm.setValue(key, values[key]));
}
}
await Promise.all(promises);
await _browser.gm.setValue(`setValuesTemp`, obj.values);
resolve();
break;
}
}
});
}
},
storage: {
local: {
get: async () => {
const keys = await _browser.gm.listValues();
const promises = [];
const storage = {};
for (const key of keys) {
const promise = _browser.gm.getValue(key);
promise.then(value => storage[key] = value);
promises.push(promise);
}
await Promise.all(promises);

if (!storage.settings) {
_browser.gm.listener(JSON.stringify({
action: `isFirstRun`
}));
}

return storage;
},
remove: async keys => {
const promises = [];
for (const key of keys) {
promises.push(_browser.gm.deleteValue(key));
}
await Promise.all(promises);
await _browser.gm.setValue(`storageChanged`, JSON.stringify(Date.now()));
},
set: async values => {
const promises = [];
for (const key in values) {
if (values.hasOwnProperty(key)) {
promises.push(_browser.gm.setValue(key, values[key]));
}
}
await Promise.all(promises);
await _browser.gm.setValue(`storageChanged`, JSON.stringify(Date.now()));
}
},
onChanged: {
addListener: () => {}
}
}
};
// @ts-ignore
if (typeof GM === `undefined`) {
// polyfill for userscript managers that do not support the gm-dot api
_browser.gm = {
// @ts-ignore
// eslint-disable-next-line no-undef
addValueChangeListener: GM_addValueChangeListener,
// @ts-ignore
deleteValue: GM_deleteValue,
Expand Down Expand Up @@ -155,7 +163,8 @@ if (typeof browser !== `undefined`) {
} else {
// @ts-ignore
_browser.gm = GM;
}
}
_browser.gm.lastUpdate = 0;
if (!_browser.gm.addValueChangeListener) {
_browser.gm.hasValueChanged = async (key, oldValue, callback) => {
const newValue = await _browser.gm.getValue(key);
Expand All @@ -170,28 +179,25 @@ if (typeof browser !== `undefined`) {
_browser.gm.hasValueChanged(key, oldValue, callback);
};
}
_browser.gm.addValueChangeListener(`delValuesTemp`, async (name, oldValue, newValue, remote) => {
if (remote) {
if (newValue && newValue !== `undefined`) {
_browser.gm.listener(JSON.stringify({
action: `delValues`,
values: JSON.parse(newValue)
}));
}
} else {
await _browser.gm.deleteValue(`setValuesTemp`);
_browser.gm.addValueChangeListener(`storageChanged`, async (name, oldValue, newValue, remote) => {
if (!remote || !newValue || newValue === `undefined`) {
return;
}
});
_browser.gm.addValueChangeListener(`setValuesTemp`, async (name, oldValue, newValue, remote) => {
if (remote) {
if (newValue && newValue !== `undefined`) {
_browser.gm.listener(JSON.stringify({
action: `setValues`,
values: JSON.parse(newValue)
}));
const lastUpdate = JSON.parse(newValue);
if (lastUpdate > _browser.gm.lastUpdate) {
_browser.gm.lastUpdate = lastUpdate;

const storage = await _browser.storage.local.get(null);
const changes = {};
for (const key in storage) {
changes[key] = {
newValue: storage[key]
};
}
} else {
await _browser.gm.deleteValue(`setValuesTemp`);
_browser.gm.listener(JSON.stringify({
action: `storageChanged`,
values: { changes, areaName: `local` }
}));
}
});
_browser.gm.doLock = async (lock) => {
Expand Down Expand Up @@ -243,6 +249,30 @@ if (typeof browser !== `undefined`) {
});
});
}
},
storage: {
local: {
get: async () => {
return JSON.parse(await _browser.runtime.sendMessage({
action: `getStorage`
}));
},
remove: async keys => {
await _browser.runtime.sendMessage({
action: `delValues`,
values: JSON.stringify(keys)
});
},
set: async values => {
await _browser.runtime.sendMessage({
action: `setValues`,
values: JSON.stringify(values)
});
}
},
onChanged: {
addListener: () => {}
}
}
};
} else {
Expand Down
73 changes: 17 additions & 56 deletions src/eventPage.js
Expand Up @@ -2,16 +2,13 @@ import JSZip from 'jszip';
import { browser } from './browser';

let browserInfo = null;
let storage = null;
let isFirstRun = false;
let isUpdate = false;

browser.runtime.onInstalled.addListener(async details => {
if (details.reason === `install`) {
isFirstRun = true;
sendMessage(`isFirstRun`);
} else if (details.reason === `update`) {
if ((await browser.runtime.getManifest()).version !== details.previousVersion) {
isUpdate = true;
sendMessage(`isUpdate`);
}
}
});
Expand Down Expand Up @@ -66,16 +63,20 @@ browser.storage.local.get(`settings`).then(async result => {
}
});

function sendMessage(action, sender, values) {
browser.tabs.query({url: [`*://*.steamgifts.com/*`, `*://*.steamtrades.com/*`]}).then(tabs => {
tabs.forEach(tab => {
if (tab.id === sender.tab.id) return;
browser.tabs.sendMessage(tab.id, JSON.stringify({
action: action,
values: values
})).then(() => {});
});
});
async function sendMessage(action, sender, values) {
const tabs = await browser.tabs.query({ url: [`*://*.steamgifts.com/*`, `*://*.steamtrades.com/*`] });
for (const tab of tabs) {
if (sender && tab.id === sender.tab.id) {
continue;
}
await browser.tabs.sendMessage(tab.id, JSON.stringify({
action: action,
values: values
}));
if (!sender) {
return;
}
}
}

async function getZip(data, fileName) {
Expand Down Expand Up @@ -337,7 +338,7 @@ let permissionRequests = {};

browser.runtime.onMessage.addListener((request, sender) => {
return new Promise(async resolve => {
let key, keys, parameters, values;
let parameters;
switch (request.action) {
case `permissions_contains`:
resolve(await browser.permissions.contains(JSON.parse(request.permissions)));
Expand Down Expand Up @@ -379,56 +380,16 @@ browser.runtime.onMessage.addListener((request, sender) => {
do_unlock(JSON.parse(request.lock));
resolve();
break;
case `delValues`:
keys = JSON.parse(request.keys);
browser.storage.local.remove(keys).then(() => {
keys.forEach(key => {
delete storage[key];
});
sendMessage(`delValues`, sender, keys);
resolve();
});
break;
case `fetch`:
parameters = JSON.parse(request.parameters);
parameters.headers = new Headers(parameters.headers);
// noinspection JSIgnoredPromiseFromCall
doFetch(parameters, request, sender, resolve);
break;
case `getStorage`:
if (storage) {
storage.isFirstRun = isFirstRun;
storage.isUpdate = isUpdate;
isFirstRun = false;
isUpdate = false;
resolve(JSON.stringify(storage));
} else {
browser.storage.local.get(null).then(stg => {
storage = stg;
storage.isFirstRun = isFirstRun;
storage.isUpdate = isUpdate;
isFirstRun = false;
isUpdate = false;
resolve(JSON.stringify(storage));
});
}
break;
case `reload`:
browser.runtime.reload();
resolve();
break;
case `setValues`:
values = JSON.parse(request.values);
browser.storage.local.set(values).then(() => {
for (key in values) {
if (values.hasOwnProperty(key)) {
storage[key] = values[key];
}
}
sendMessage(`setValues`, sender, values);
resolve();
});
break;
case `tabs`:
// noinspection JSIgnoredPromiseFromCall
getTabs(request);
Expand Down
35 changes: 23 additions & 12 deletions src/eventPage_sdk.js
Expand Up @@ -24,14 +24,11 @@ buttons.ActionButton({
onClick: handleClick
});

let isFirstRun = false;
let isUpdate = false;

exports.main = details => {
if (details.loadReason === `install`) {
isFirstRun = true;
sendMessage(`isFirstRun`);
} else if (details.loadReason === `upgrade`) {
isUpdate = true;
sendMessage(`isUpdate`);
}
};

Expand Down Expand Up @@ -147,9 +144,15 @@ function handle_storage(operation, values) {
}
})();

function sendMessage(action, values) {
function sendMessage(action, sender, values) {
for (const worker of workers) {
if (sender && worker === sender) {
continue;
}
worker.port.emit(`esgstMessage`, JSON.stringify({ action, values }));
if (!sender) {
return;
}
}
}

Expand Down Expand Up @@ -346,7 +349,13 @@ PageMod({
keys = JSON.parse(request.keys);
await handle_storage(TYPE_DEL, keys);
worker.port.emit(`delValues_${request.uuid}_response`, `null`);
sendMessage(`delValues`, keys);
const changes = {};
for (const key of keys) {
changes[key] = {
newValue: `null`
};
}
sendMessage(`storageChanged`, worker, { changes, areaName: `local` });
});

worker.port.on(`fetch`, async request => {
Expand All @@ -362,10 +371,6 @@ PageMod({

worker.port.on(`getStorage`, async request => {
const storage = await handle_storage(TYPE_GET, null);
storage.isFirstRun = isFirstRun;
storage.isUpdate = isUpdate;
isFirstRun = false;
isUpdate = false;
worker.port.emit(`getStorage_${request.uuid}_response`, JSON.stringify(storage));
});

Expand All @@ -377,7 +382,13 @@ PageMod({
values = JSON.parse(request.values);
await handle_storage(TYPE_SET, values);
worker.port.emit(`setValues_${request.uuid}_response`, `null`);
sendMessage(`setValues`, values);
const changes = {};
for (const key in values) {
changes[key] = {
newValue: values[key]
};
}
sendMessage(`storageChanged`, worker, { changes, areaName: `local` });
});

worker.port.on(`tabs`, request => {
Expand Down

0 comments on commit f3398ce

Please sign in to comment.