stylus/install.js

155 lines
5.2 KiB
JavaScript

/*jshint undef:false*/
chrome.runtime.sendMessage({
method: "getStyles",
url: getMeta("stylish-id-url") || location.href
}, function (response) {
if (response.length === 0) {
sendEvent("styleCanBeInstalledChrome");
} else {
var installedStyle = response[0];
// maybe an update is needed
// use the md5 if available
var md5Url = getMeta("stylish-md5-url");
if (md5Url && installedStyle.md5Url && installedStyle.originalMd5) {
getResource(md5Url, function (md5) {
if (md5 == installedStyle.originalMd5) {
sendEvent("styleAlreadyInstalledChrome", {
updateUrl: installedStyle.updateUrl
});
} else {
sendEvent("styleCanBeUpdatedChrome", {
updateUrl: installedStyle.updateUrl
});
}
});
} else {
getResource(getMeta("stylish-code-chrome"), function (code) {
// this would indicate a failure (a style with settings?).
if (code === null) {
sendEvent("styleCanBeUpdatedChrome", {
updateUrl: installedStyle.updateUrl
});
}
var json = JSON.parse(code);
if (json.sections.length == installedStyle.sections.length) {
if (json.sections.every(function (section) {
return installedStyle.sections.some(function (installedSection) {
return sectionsAreEqual(section, installedSection);
});
})) {
// everything's the same
sendEvent("styleAlreadyInstalledChrome", {
updateUrl: installedStyle.updateUrl
});
return;
}
}
sendEvent("styleCanBeUpdatedChrome", {
updateUrl: installedStyle.updateUrl
});
});
}
}
});
function sectionsAreEqual(a, b) {
if (a.code != b.code) {
return false;
}
return ["urls", "urlPrefixes", "domains", "regexps"].every(function (attribute) {
return arraysAreEqual(a[attribute], b[attribute]);
});
}
function arraysAreEqual(a, b) {
// treat empty array and undefined as equivalent
if (typeof a == "undefined")
return (typeof b == "undefined") || (b.length === 0);
if (typeof b == "undefined")
return (typeof a == "undefined") || (a.length === 0);
if (a.length != b.length) {
return false;
}
return a.every(function (entry) {
return b.indexOf(entry) != -1;
});
}
function sendEvent(type, data) {
if (typeof data == "undefined") {
data = null;
}
var stylishEvent = new CustomEvent(type, {
detail: data
});
document.dispatchEvent(stylishEvent);
}
document.addEventListener("stylishInstallChrome", function () {
getResource(getMeta("stylish-description"), function (name) {
if (confirm(chrome.i18n.getMessage('styleInstall', [name]))) {
getResource(getMeta("stylish-code-chrome"), function (code) {
// check for old style json
var json = JSON.parse(code);
json.method = "saveStyle";
chrome.runtime.sendMessage(json, function (response) {
sendEvent("styleInstalledChrome");
});
});
getResource(getMeta("stylish-install-ping-url-chrome"));
}
});
}, false);
document.addEventListener("stylishUpdateChrome", function () {
chrome.runtime.sendMessage({
method: "getStyles",
url: getMeta("stylish-id-url") || location.href
}, function (response) {
var style = response[0];
if (confirm(chrome.i18n.getMessage('styleUpdate', [style.name]))) {
getResource(getMeta("stylish-code-chrome"), function (code) {
var json = JSON.parse(code);
json.method = "saveStyle";
json.id = style.id;
chrome.runtime.sendMessage(json, function () {
sendEvent("styleInstalledChrome");
});
});
}
});
}, false);
function getMeta(name) {
var e = document.querySelector("link[rel='" + name + "']");
return e ? e.getAttribute("href") : null;
}
function getResource(url, callback) {
if (url.indexOf("#") === 0) {
if (callback) {
callback(document.getElementById(url.substring(1)).innerText);
}
return;
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && callback) {
if (xhr.status >= 400) {
callback(null);
} else {
callback(xhr.responseText);
}
}
};
if (url.length > 2000) {
var parts = url.split("?");
xhr.open("POST", parts[0], true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(parts[1]);
} else {
xhr.open("GET", url, true);
xhr.send();
}
}