Skip to content

Commit

Permalink
Fix: query the style before installation
Browse files Browse the repository at this point in the history
  • Loading branch information
eight04 committed Aug 9, 2017
1 parent 77802d0 commit 685f360
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 40 deletions.
15 changes: 15 additions & 0 deletions _locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,21 @@
}
}
},
"styleInstallOverwrite" : {
"message": "'$stylename$' is already installed. Overwrite?\nVersion: $oldVersion$ -> $newVersion$",
"description": "Confirmation when re-installing a style",
"placeholders": {
"stylename": {
"content": "$1"
},
"oldVersion": {
"content": "$2"
},
"newVersion": {
"content": "$3"
}
}
},
"styleInstallNoName": {
"message": "Install this style into stylus?",
"description": "Confirmation when installing a style"
Expand Down
49 changes: 35 additions & 14 deletions background/background.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* global dbExec, getStyles, saveStyle, saveStyleSource */
/* global dbExec, getStyles, saveStyle, saveStyleSource, queryUserStyle */
'use strict';

// eslint-disable-next-line no-var
Expand Down Expand Up @@ -330,14 +330,11 @@ function onRuntimeMessage(request, sender, sendResponse) {
return KEEP_CHANNEL_OPEN;

case 'saveStyleSource':
saveStyleSource(request)
.then(
result => sendResponse([null, result]),
error => {
console.log(error);
sendResponse([String(error), null]);
}
);
responseWithError(saveStyleSource(request));
return KEEP_CHANNEL_OPEN;

case 'queryUserStyle':
responseWithError(queryUserStyle(request));
return KEEP_CHANNEL_OPEN;

case 'healthCheck':
Expand All @@ -353,13 +350,37 @@ function onRuntimeMessage(request, sender, sendResponse) {
return KEEP_CHANNEL_OPEN;

case 'injectContentScript':
injectContentScript(request.js, sender.tab.id);
return;
injectContentScript(request.js, sender.tab.id).then(sendResponse);
return KEEP_CHANNEL_OPEN;
}

function responseWithError(pending) {
return pending.then(
result => sendResponse([null, result]),
error => {
console.log(error);
sendResponse([String(error), null]);
}
);
}
}


function injectContentScript(file, tabId) {
// TODO: share some code with injectCS?
chrome.tabs.executeScript(tabId, {file});
function injectContentScript(files, tabId) {
return new Promise(resolve => {
if (typeof files === 'string') {
files = [files];
}

let pending = 0;
for (const file of files) {
pending++;
chrome.tabs.executeScript(tabId, {file}, () => {
pending--;
if (!pending) {
resolve();
}
});
}
});
}
36 changes: 30 additions & 6 deletions background/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,26 @@ function filterStylesInternal({
: filtered;
}

// {id: int, style: object, source: string, checkDup: boolean}
function queryUserStyle(req) {
return Promise.resolve().then(() => {
let style;
if (req.source) {
style = userstyle.buildMeta(req.source);
} else {
style = req.style;
}
if (!style.id && req.id) {
style.id = req.id;
}
if (!style.id && req.checkDup) {
return findDupUserstyle(style)
.then(dup => ({style, dup}));
}
return {style};
});
}


function saveStyleSource(style) {
style = Object.assign({
Expand Down Expand Up @@ -255,12 +275,7 @@ function saveStyle(style) {
if (id) {
return getStyles({id}).then(s => s[0]);
}
// FIXME: use composed index for better performance?
return getStyles().then(styles =>
styles.find(
s => s.name === style.name && s.namespace === style.namespace
)
);
return findDupUserstyle(style);
}).then(dup => {
if (!dup) {
return;
Expand Down Expand Up @@ -371,6 +386,15 @@ function deleteStyle({id, notify = true}) {
});
}

function findDupUserstyle(style) {
// FIXME: use composed index for better performance?
return getStyles().then(styles =>
styles.find(
s => s.name === style.name && s.namespace === style.namespace
)
);
}


function getApplicableSections({style, matchUrl, strictRegexp = true, stopOnFirst}) {
if (!matchUrl.startsWith('http')
Expand Down
57 changes: 37 additions & 20 deletions content/install-user-css.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,48 @@ function fetchText(url) {
});
}

function install() {
fetchText(location.href).then(source => {
const request = {
method: 'saveStyleSource',
url: location.href,
source: source
};
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(request, ([err, result]) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
function install(style) {
const request = Object.assign(style, {
method: 'saveStyle',
reason: 'install',
url: location.href,
updateUrl: location.href
});
return communicate(request);
}

function communicate(request) {
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(request, ([err, result]) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}

function initUserstyleInstall() {
fetchText(location.href).then(source =>
communicate({
method: 'queryUserStyle',
source: source,
checkDup: true
})
).then(({style, dup}) => {
if (dup) {
if (confirm(chrome.i18n.getMessage('styleInstallOverwrite', [style.name, dup.version, style.version]))) {
return install(style);
}
} else if (confirm(chrome.i18n.getMessage('styleInstall', [style.name]))) {
return install(style);
}
}).catch(err => {
console.log(err);
alert(chrome.i18n.getMessage('styleInstallFailed', String(err)));
});
}

// It seems that we need to wait some time to redraw the page.
setTimeout(() => {
if (confirm(chrome.i18n.getMessage('styleInstallNoName'))) {
install();
}
}, 500);
setTimeout(initUserstyleInstall, 500);

0 comments on commit 685f360

Please sign in to comment.