ruffle/web/packages/extension/js/util.js

228 lines
6.1 KiB
JavaScript

module.exports = {
get_i18n_string,
set_sync_storage,
get_sync_storage,
reload_tab,
dict_equality,
tab_query,
tab_sendmessage,
add_storage_change_listener,
open_settings_page,
set_message_listener,
get_extension_url,
};
// List of defaults for all settings.
const DEFAULT_SETTINGS = {
ruffle_enable: true,
ignore_output: false,
};
function get_i18n_string(key) {
if (chrome && chrome.i18n && chrome.i18n.getMessage) {
return chrome.i18n.getMessage(key);
} else if (browser && browser.i18n && browser.i18n.getMessage) {
return browser.i18n.getMessage(key);
} else {
console.error("Can't get i18n message: " + key);
}
}
function set_sync_storage(key) {
if (
chrome &&
chrome.storage &&
chrome.storage.sync &&
chrome.storage.sync.set
) {
chrome.storage.sync.set(key);
} else if (
browser &&
browser.storage &&
browser.storage.sync &&
browser.storage.sync.set
) {
browser.storage.sync.set(key);
} else {
console.error("Can't set settings.");
}
}
function get_sync_storage(key, callback) {
// Create array of keys so that we can grab the defaults, if necessary.
let data_type = typeof key;
let keys;
if (data_type == "string") {
keys = [key];
} else if (Array.isArray(key)) {
keys = key;
} else {
keys = Object.keys(key);
}
// Copy over default settings if they don't exist yet.
let callback_with_default = (data) => {
for (const k of keys) {
if (data[k] === undefined) {
data[k] = DEFAULT_SETTINGS[k];
}
}
return callback(data);
};
if (
chrome &&
chrome.storage &&
chrome.storage.sync &&
chrome.storage.sync.get
) {
chrome.storage.sync.get(key, callback_with_default);
} else if (
browser &&
browser.storage &&
browser.storage.sync &&
browser.storage.sync.get
) {
browser.storage.sync.get(key, callback_with_default);
} else {
console.error("Couldn't read setting: " + key);
}
}
function add_storage_change_listener(listener) {
if (
chrome &&
chrome.storage &&
chrome.storage.onChanged &&
chrome.storage.onChanged.addListener
) {
chrome.storage.onChanged.addListener(listener);
} else if (
browser &&
browser.storage &&
browser.storage.onChanged &&
browser.storage.onChanged.addListener
) {
browser.storage.onChanged.addListener(listener);
} else {
console.error("Couldn't add setting change listener");
}
}
function reload_tab(tab, callback) {
if (chrome && chrome.tabs && chrome.tabs.reload) {
chrome.tabs.reload(tab, callback);
} else if (browser && browser.tabs && browser.tabs.reload) {
browser.tabs.reload(tab, callback);
} else {
console.error("Couldn't reload tab.");
}
}
function dict_equality(dict1, dict2) {
let is_equal = true;
for (var k in dict1) {
if (Object.prototype.hasOwnProperty.call(dict1, k)) {
is_equal = is_equal && dict1[k] === dict2[k];
}
}
for (let k in dict2) {
if (Object.prototype.hasOwnProperty.call(dict2, k)) {
is_equal = is_equal && dict1[k] === dict2[k];
}
}
return is_equal;
}
/**
* Promise-based version of `chrome.tabs.query`.
*
* Mozilla does this by default in `browser.tabs` but Chrome is behind on this
* sort of thing. Chrome won't even let us check if we're running in
*/
function tab_query() {
let my_args = arguments;
if (window.browser && browser.tabs && browser.tabs.query) {
return browser.tabs.query.apply(this, arguments);
}
return new Promise(function (resolve) {
let new_arguments = Array.prototype.slice.call(my_args);
new_arguments.push(resolve);
chrome.tabs.query.apply(this, new_arguments);
});
}
/**
* Promise-based version of `chrome.tabs.sendMessage`.
*/
function tab_sendmessage() {
let my_args = arguments;
if (window.browser && browser.tabs && browser.tabs.sendMessage) {
return browser.tabs.sendMessage.apply(this, arguments);
}
return new Promise(function (resolve, reject) {
let new_arguments = Array.prototype.slice.call(my_args);
new_arguments.push(function (response) {
if (chrome.runtime.lastError !== undefined) {
reject(chrome.runtime.lastError.message);
}
resolve(response);
});
chrome.tabs.sendMessage.apply(this, new_arguments);
});
}
function open_settings_page() {
if (chrome && chrome.tabs && chrome.tabs.create) {
chrome.tabs.create({ url: "/settings.htm" });
/* Open the settings page manually */
} else if (browser && browser.runtime && browser.runtime.openOptionsPage) {
browser.runtime.openOptionsPage();
/* Have the browser open the settings page for us */
} else {
console.error("Can't open settings page");
}
}
function set_message_listener(listener) {
if (
chrome &&
chrome.runtime &&
chrome.runtime.onMessage &&
chrome.runtime.onMessage.addListener
) {
chrome.runtime.onMessage.addListener(listener);
} else if (
browser &&
browser.runtime &&
browser.runtime.onMessage &&
browser.runtime.onMessage.addListener
) {
browser.runtime.onMessage.addListener(listener);
} else {
console.error("Couldn't add message listener");
}
}
function get_extension_url() {
if (chrome && chrome.extension && chrome.extension.getURL) {
return chrome.extension
.getURL("dist/ruffle.js")
.replace("dist/ruffle.js", "");
} else if (browser && browser.runtime && browser.runtime.getURL) {
return browser.runtime
.getURL("dist/ruffle.js")
.replace("dist/ruffle.js", "");
} else {
console.error("Couldn't get extension URL");
}
}