refactor settings: retrieve tab info in background script (#33)
This commit is contained in:
@@ -72,7 +72,7 @@ function copyToClipboard(text) {
|
|||||||
* @param bool remove Remove this item from recent history
|
* @param bool remove Remove this item from recent history
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function saveRecent(settings, host, login, remove = false) {
|
function saveRecent(settings, login, remove = false) {
|
||||||
var ignoreInterval = 60000; // 60 seconds - don't increment counter twice within this window
|
var ignoreInterval = 60000; // 60 seconds - don't increment counter twice within this window
|
||||||
|
|
||||||
// save store timestamp
|
// save store timestamp
|
||||||
@@ -83,7 +83,7 @@ function saveRecent(settings, host, login, remove = false) {
|
|||||||
login.recent.count++;
|
login.recent.count++;
|
||||||
}
|
}
|
||||||
login.recent.when = Date.now();
|
login.recent.when = Date.now();
|
||||||
settings.recent[sha1(host + sha1(login.store.id + sha1(login.login)))] = login.recent;
|
settings.recent[sha1(settings.host + sha1(login.store.id + sha1(login.login)))] = login.recent;
|
||||||
|
|
||||||
// save to local storage
|
// save to local storage
|
||||||
localStorage.setItem("recent", JSON.stringify(settings.recent));
|
localStorage.setItem("recent", JSON.stringify(settings.recent));
|
||||||
@@ -195,7 +195,7 @@ async function fillFields(tab, login, fields) {
|
|||||||
*
|
*
|
||||||
* @return object Local settings from the extension
|
* @return object Local settings from the extension
|
||||||
*/
|
*/
|
||||||
function getLocalSettings() {
|
async function getLocalSettings() {
|
||||||
var settings = Object.assign({}, defaultSettings);
|
var settings = Object.assign({}, defaultSettings);
|
||||||
for (var key in settings) {
|
for (var key in settings) {
|
||||||
var value = localStorage.getItem(key);
|
var value = localStorage.getItem(key);
|
||||||
@@ -212,6 +212,8 @@ function getLocalSettings() {
|
|||||||
settings.stores[storeId].when = 0;
|
settings.stores[storeId].when = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill recent data
|
||||||
settings.recent = localStorage.getItem("recent");
|
settings.recent = localStorage.getItem("recent");
|
||||||
if (settings.recent) {
|
if (settings.recent) {
|
||||||
settings.recent = JSON.parse(settings.recent);
|
settings.recent = JSON.parse(settings.recent);
|
||||||
@@ -219,6 +221,14 @@ function getLocalSettings() {
|
|||||||
settings.recent = {};
|
settings.recent = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill current tab info
|
||||||
|
try {
|
||||||
|
settings.tab = (await chrome.tabs.query({ active: true, currentWindow: true }))[0];
|
||||||
|
settings.host = new URL(settings.tab.url).hostname;
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("Unable to retrieve current tab information");
|
||||||
|
}
|
||||||
|
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,7 +341,7 @@ async function handleMessage(settings, message, sendResponse) {
|
|||||||
case "copyPassword":
|
case "copyPassword":
|
||||||
try {
|
try {
|
||||||
copyToClipboard(message.login.fields.secret);
|
copyToClipboard(message.login.fields.secret);
|
||||||
saveRecent(settings, message.host, message.login);
|
saveRecent(settings, message.login);
|
||||||
sendResponse({ status: "ok" });
|
sendResponse({ status: "ok" });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
sendResponse({
|
sendResponse({
|
||||||
@@ -343,7 +353,7 @@ async function handleMessage(settings, message, sendResponse) {
|
|||||||
case "copyUsername":
|
case "copyUsername":
|
||||||
try {
|
try {
|
||||||
copyToClipboard(message.login.fields.login);
|
copyToClipboard(message.login.fields.login);
|
||||||
saveRecent(settings, message.host, message.login);
|
saveRecent(settings, message.login);
|
||||||
sendResponse({ status: "ok" });
|
sendResponse({ status: "ok" });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
sendResponse({
|
sendResponse({
|
||||||
@@ -355,7 +365,6 @@ async function handleMessage(settings, message, sendResponse) {
|
|||||||
|
|
||||||
case "launch":
|
case "launch":
|
||||||
try {
|
try {
|
||||||
var tab = (await chrome.tabs.query({ active: true, currentWindow: true }))[0];
|
|
||||||
var url = message.login.fields.url || message.login.domain;
|
var url = message.login.fields.url || message.login.domain;
|
||||||
if (!url) {
|
if (!url) {
|
||||||
throw new Error("No URL is defined for this entry");
|
throw new Error("No URL is defined for this entry");
|
||||||
@@ -363,17 +372,20 @@ async function handleMessage(settings, message, sendResponse) {
|
|||||||
if (!url.match(/:\/\//)) {
|
if (!url.match(/:\/\//)) {
|
||||||
url = "http://" + url;
|
url = "http://" + url;
|
||||||
}
|
}
|
||||||
if (authListeners[tab.id]) {
|
if (authListeners[settings.tab.id]) {
|
||||||
chrome.tabs.onUpdated.removeListener(authListeners[tab.id]);
|
chrome.tabs.onUpdated.removeListener(authListeners[settings.tab.id]);
|
||||||
delete authListeners[tab.id];
|
delete authListeners[settings.tab.id];
|
||||||
}
|
}
|
||||||
authListeners[tab.id] = handleModalAuth.bind({ url: url, login: message.login });
|
authListeners[settings.tab.id] = handleModalAuth.bind({
|
||||||
|
url: url,
|
||||||
|
login: message.login
|
||||||
|
});
|
||||||
chrome.webRequest.onAuthRequired.addListener(
|
chrome.webRequest.onAuthRequired.addListener(
|
||||||
authListeners[tab.id],
|
authListeners[settings.tab.id],
|
||||||
{ urls: ["*://*/*"], tabId: tab.id },
|
{ urls: ["*://*/*"], tabId: settings.tab.id },
|
||||||
["blocking"]
|
["blocking"]
|
||||||
);
|
);
|
||||||
chrome.tabs.update(tab.id, { url: url });
|
chrome.tabs.update(settings.tab.id, { url: url });
|
||||||
sendResponse({ status: "ok" });
|
sendResponse({ status: "ok" });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
sendResponse({
|
sendResponse({
|
||||||
@@ -384,12 +396,12 @@ async function handleMessage(settings, message, sendResponse) {
|
|||||||
break;
|
break;
|
||||||
case "fill":
|
case "fill":
|
||||||
try {
|
try {
|
||||||
// get tab info
|
|
||||||
var targetTab = (await chrome.tabs.query({ active: true, currentWindow: true }))[0];
|
|
||||||
|
|
||||||
// dispatch initial fill request
|
// dispatch initial fill request
|
||||||
var filledFields = await fillFields(targetTab, message.login, ["login", "secret"]);
|
var filledFields = await fillFields(settings.tab, message.login, [
|
||||||
saveRecent(settings, message.host, message.login);
|
"login",
|
||||||
|
"secret"
|
||||||
|
]);
|
||||||
|
saveRecent(settings, message.login);
|
||||||
|
|
||||||
// no need to check filledFields, because fillFields() already throws an error if empty
|
// no need to check filledFields, because fillFields() already throws an error if empty
|
||||||
sendResponse({ status: "ok", filledFields: filledFields });
|
sendResponse({ status: "ok", filledFields: filledFields });
|
||||||
@@ -519,7 +531,7 @@ async function receiveMessage(message, sender, sendResponse) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settings = getLocalSettings();
|
var settings = await getLocalSettings();
|
||||||
try {
|
try {
|
||||||
var configureSettings = Object.assign(settings, { defaultStore: {} });
|
var configureSettings = Object.assign(settings, { defaultStore: {} });
|
||||||
var response = await chrome.runtime.sendNativeMessage(appID, {
|
var response = await chrome.runtime.sendNativeMessage(appID, {
|
||||||
|
@@ -6,25 +6,7 @@ var TldJS = require("tldjs");
|
|||||||
var sha1 = require("sha1");
|
var sha1 = require("sha1");
|
||||||
var Interface = require("./interface");
|
var Interface = require("./interface");
|
||||||
|
|
||||||
// wrap with current tab & settings
|
run();
|
||||||
chrome.tabs.query({ active: true, currentWindow: true }, async function(tabs) {
|
|
||||||
try {
|
|
||||||
var response = await chrome.runtime.sendMessage({ action: "getSettings" });
|
|
||||||
if (response.status != "ok") {
|
|
||||||
throw new Error(response.message);
|
|
||||||
}
|
|
||||||
var settings = response.settings;
|
|
||||||
|
|
||||||
// Set additional settings only visible in the popup context,
|
|
||||||
// if necessary these need to be additionally passed to the background script
|
|
||||||
settings.tab = tabs[0];
|
|
||||||
settings.host = new URL(settings.tab.url).hostname;
|
|
||||||
|
|
||||||
run(settings);
|
|
||||||
} catch (e) {
|
|
||||||
handleError(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//----------------------------------- Function definitions ----------------------------------//
|
//----------------------------------- Function definitions ----------------------------------//
|
||||||
|
|
||||||
@@ -75,15 +57,20 @@ function pathToDomain(path) {
|
|||||||
*
|
*
|
||||||
* @since 3.0.0
|
* @since 3.0.0
|
||||||
*
|
*
|
||||||
* @param object settings Settings object
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
async function run(settings) {
|
async function run() {
|
||||||
try {
|
try {
|
||||||
// get list of logins
|
var response = await chrome.runtime.sendMessage({ action: "getSettings" });
|
||||||
var response = await chrome.runtime.sendMessage({ action: "listFiles" });
|
|
||||||
if (response.status != "ok") {
|
if (response.status != "ok") {
|
||||||
throw new Error(e);
|
throw new Error(response.message);
|
||||||
|
}
|
||||||
|
var settings = response.settings;
|
||||||
|
|
||||||
|
// get list of logins
|
||||||
|
response = await chrome.runtime.sendMessage({ action: "listFiles" });
|
||||||
|
if (response.status != "ok") {
|
||||||
|
throw new Error(response.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
var logins = [];
|
var logins = [];
|
||||||
@@ -153,8 +140,7 @@ async function withLogin(action) {
|
|||||||
// hand off action to background script
|
// hand off action to background script
|
||||||
var response = await chrome.runtime.sendMessage({
|
var response = await chrome.runtime.sendMessage({
|
||||||
action: action,
|
action: action,
|
||||||
login: this.login,
|
login: this.login
|
||||||
host: this.settings.host
|
|
||||||
});
|
});
|
||||||
if (response.status != "ok") {
|
if (response.status != "ok") {
|
||||||
throw new Error(response.message);
|
throw new Error(response.message);
|
||||||
|
Reference in New Issue
Block a user