Change: report updatable after the install button is prepared. Prevent installing duplicated styles from USO (#717)

* Fix: don't install duplicate styles on USO

* Change: report updatable after the install button is prepared
This commit is contained in:
eight 2019-06-01 17:12:06 +08:00 committed by narcolepticinsomniac
parent 0d6c2bdb42
commit 19ee4d46bc

View File

@ -93,9 +93,26 @@
}); });
} }
function prepareInstallButton() {
return new Promise(resolve => {
const observer = new MutationObserver(check);
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
check();
function check() {
if (document.querySelector('#install_style_button')) {
resolve();
observer.disconnect();
}
}
});
}
function reportUpdatable(isUpdatable) { function reportUpdatable(isUpdatable) {
// USO doesn't bind these listeners immediately prepareInstallButton().then(() => {
setTimeout(() => {
sendEvent({ sendEvent({
type: isUpdatable type: isUpdatable
? 'styleCanBeUpdatedChrome' ? 'styleCanBeUpdatedChrome'
@ -104,7 +121,7 @@
updateUrl: installedStyle.updateUrl updateUrl: installedStyle.updateUrl
}, },
}); });
}, 300); });
} }
} }
@ -130,8 +147,18 @@
return; return;
} }
onClick.processing = true; onClick.processing = true;
(event.type.includes('Update') ? onUpdate() : onInstall()) doInstall()
.then(done, done); .then(() => {
if (!event.type.includes('Update')) {
// FIXME: sometimes the button is broken i.e. the button sends
// 'install' instead of 'update' event while the style is already
// install.
// This triggers an incorrect install count but we don't really care.
return getResource(getMeta('stylish-install-ping-url-chrome'));
}
})
.catch(console.error)
.then(done);
function done() { function done() {
setTimeout(() => { setTimeout(() => {
onClick.processing = false; onClick.processing = false;
@ -139,26 +166,26 @@
} }
} }
function doInstall() {
function onInstall() { let oldStyle;
return getResource(getMeta('stylish-description')) return API.findStyle({
.then(name => saveStyleCode('styleInstall', name)) md5Url: getMeta('stylish-md5-url') || location.href
.then(() => getResource(getMeta('stylish-install-ping-url-chrome'))); }, true)
} .then(_oldStyle => {
oldStyle = _oldStyle;
return oldStyle ?
function onUpdate() { oldStyle.name :
return new Promise((resolve, reject) => { getResource(getMeta('stylish-description'));
API.findStyle({ })
md5Url: getMeta('stylish-md5-url') || location.href .then(name => {
}, true).then(style => { const props = {};
saveStyleCode('styleUpdate', style.name, {id: style.id}) if (oldStyle) {
.then(resolve, reject); props.id = oldStyle.id;
}
return saveStyleCode(oldStyle ? 'styleUpdate' : 'styleInstall', name, props);
}); });
});
} }
function saveStyleCode(message, name, addProps = {}) { function saveStyleCode(message, name, addProps = {}) {
const isNew = message === 'styleInstall'; const isNew = message === 'styleInstall';
const needsConfirmation = isNew || !saveStyleCode.confirmed; const needsConfirmation = isNew || !saveStyleCode.confirmed;