Convert to Unix linebreaks

This commit is contained in:
Jason Barnabe 2015-01-30 11:31:20 -06:00
parent 0756f2d2b8
commit 16abc9c19d

760
manage.js
View File

@ -1,380 +1,380 @@
var styleTemplate = document.createElement("div"); var styleTemplate = document.createElement("div");
styleTemplate.innerHTML = "<h2 class='style-name'></h2><p class='applies-to'></p><p class='actions'><a class='style-edit-link' href='edit.html?id='><button>" + t('editStyleLabel') + "</button></a><button class='enable'>" + t('enableStyleLabel') + "</button><button class='disable'>" + t('disableStyleLabel') + "</button><button class='delete'>" + t('deleteStyleLabel') + "</button><button class='check-update'>" + t('checkForUpdate') + "</button><button class='update'>" + t('installUpdate') + "</button><span class='update-note'></span></p>"; styleTemplate.innerHTML = "<h2 class='style-name'></h2><p class='applies-to'></p><p class='actions'><a class='style-edit-link' href='edit.html?id='><button>" + t('editStyleLabel') + "</button></a><button class='enable'>" + t('enableStyleLabel') + "</button><button class='disable'>" + t('disableStyleLabel') + "</button><button class='delete'>" + t('deleteStyleLabel') + "</button><button class='check-update'>" + t('checkForUpdate') + "</button><button class='update'>" + t('installUpdate') + "</button><span class='update-note'></span></p>";
var lastUpdatedStyleId = null; var lastUpdatedStyleId = null;
var appliesToExtraTemplate = document.createElement("span"); var appliesToExtraTemplate = document.createElement("span");
appliesToExtraTemplate.className = "applies-to-extra"; appliesToExtraTemplate.className = "applies-to-extra";
appliesToExtraTemplate.innerHTML = " " + t('appliesDisplayTruncatedSuffix'); appliesToExtraTemplate.innerHTML = " " + t('appliesDisplayTruncatedSuffix');
chrome.extension.sendMessage({method: "getStyles"}, showStyles); chrome.extension.sendMessage({method: "getStyles"}, showStyles);
function showStyles(styles) { function showStyles(styles) {
var installed = document.getElementById("installed"); var installed = document.getElementById("installed");
styles.map(createStyleElement).forEach(function(e) { styles.map(createStyleElement).forEach(function(e) {
installed.appendChild(e); installed.appendChild(e);
}); });
// prefs may be defaulted in storage.js - at this point they'll have been loaded // prefs may be defaulted in storage.js - at this point they'll have been loaded
loadPrefs(); loadPrefs();
} }
function createStyleElement(style) { function createStyleElement(style) {
var e = styleTemplate.cloneNode(true); var e = styleTemplate.cloneNode(true);
e.setAttribute("class", style.enabled == "true" ? "enabled" : "disabled"); e.setAttribute("class", style.enabled == "true" ? "enabled" : "disabled");
e.setAttribute("style-id", style.id); e.setAttribute("style-id", style.id);
if (style.updateUrl) { if (style.updateUrl) {
e.setAttribute("style-update-url", style.updateUrl); e.setAttribute("style-update-url", style.updateUrl);
} }
if (style.md5Url) { if (style.md5Url) {
e.setAttribute("style-md5-url", style.md5Url); e.setAttribute("style-md5-url", style.md5Url);
} }
if (style.originalMd5) { if (style.originalMd5) {
e.setAttribute("style-original-md5", style.originalMd5); e.setAttribute("style-original-md5", style.originalMd5);
} }
var styleName = e.querySelector(".style-name"); var styleName = e.querySelector(".style-name");
styleName.appendChild(document.createTextNode(style.name)); styleName.appendChild(document.createTextNode(style.name));
if (style.url) { if (style.url) {
var homepage = document.createElement("a"); var homepage = document.createElement("a");
homepage.setAttribute("href", style.url); homepage.setAttribute("href", style.url);
homepage.setAttribute("target", "_blank"); homepage.setAttribute("target", "_blank");
var homepageImg = document.createElement("img"); var homepageImg = document.createElement("img");
homepageImg.src = "world_go.png"; homepageImg.src = "world_go.png";
homepageImg.alt = "*"; homepageImg.alt = "*";
homepage.appendChild(homepageImg); homepage.appendChild(homepageImg);
styleName.appendChild(document.createTextNode(" " )); styleName.appendChild(document.createTextNode(" " ));
styleName.appendChild(homepage); styleName.appendChild(homepage);
} }
var domains = []; var domains = [];
var urls = []; var urls = [];
var urlPrefixes = []; var urlPrefixes = [];
var regexps = []; var regexps = [];
function add(array, property) { function add(array, property) {
style.sections.forEach(function(section) { style.sections.forEach(function(section) {
if (section[property]) { if (section[property]) {
section[property].filter(function(value) { section[property].filter(function(value) {
return array.indexOf(value) == -1; return array.indexOf(value) == -1;
}).forEach(function(value) { }).forEach(function(value) {
array.push(value); array.push(value);
});; });;
} }
}); });
} }
add(domains, 'domains'); add(domains, 'domains');
add(urls, 'urls'); add(urls, 'urls');
add(urlPrefixes, 'urlPrefixes'); add(urlPrefixes, 'urlPrefixes');
add(regexps, 'regexps'); add(regexps, 'regexps');
var appliesToToShow = []; var appliesToToShow = [];
if (domains) if (domains)
appliesToToShow = appliesToToShow.concat(domains); appliesToToShow = appliesToToShow.concat(domains);
if (urls) if (urls)
appliesToToShow = appliesToToShow.concat(urls); appliesToToShow = appliesToToShow.concat(urls);
if (urlPrefixes) if (urlPrefixes)
appliesToToShow = appliesToToShow.concat(urlPrefixes.map(function(u) { return u + "*"; })); appliesToToShow = appliesToToShow.concat(urlPrefixes.map(function(u) { return u + "*"; }));
if (regexps) if (regexps)
appliesToToShow = appliesToToShow.concat(regexps.map(function(u) { return "/" + u + "/"; })); appliesToToShow = appliesToToShow.concat(regexps.map(function(u) { return "/" + u + "/"; }));
var appliesToString = ""; var appliesToString = "";
var showAppliesToExtra = false; var showAppliesToExtra = false;
if (appliesToToShow.length == "") if (appliesToToShow.length == "")
appliesToString = t('appliesToEverything'); appliesToString = t('appliesToEverything');
else if (appliesToToShow.length <= 10) else if (appliesToToShow.length <= 10)
appliesToString = appliesToToShow.join(", "); appliesToString = appliesToToShow.join(", ");
else { else {
appliesToString = appliesToToShow.slice(0, 10).join(", "); appliesToString = appliesToToShow.slice(0, 10).join(", ");
showAppliesToExtra = true; showAppliesToExtra = true;
} }
e.querySelector(".applies-to").appendChild(document.createTextNode(t('appliesDisplay', [appliesToString]))); e.querySelector(".applies-to").appendChild(document.createTextNode(t('appliesDisplay', [appliesToString])));
if (showAppliesToExtra) { if (showAppliesToExtra) {
e.querySelector(".applies-to").appendChild(appliesToExtraTemplate.cloneNode(true)); e.querySelector(".applies-to").appendChild(appliesToExtraTemplate.cloneNode(true));
} }
var editLink = e.querySelector(".style-edit-link"); var editLink = e.querySelector(".style-edit-link");
editLink.setAttribute("href", editLink.getAttribute("href") + style.id); editLink.setAttribute("href", editLink.getAttribute("href") + style.id);
e.querySelector(".enable").addEventListener("click", function(event) { enable(event, true); }, false); e.querySelector(".enable").addEventListener("click", function(event) { enable(event, true); }, false);
e.querySelector(".disable").addEventListener("click", function(event) { enable(event, false); }, false); e.querySelector(".disable").addEventListener("click", function(event) { enable(event, false); }, false);
e.querySelector(".check-update").addEventListener("click", doCheckUpdate, false); e.querySelector(".check-update").addEventListener("click", doCheckUpdate, false);
e.querySelector(".update").addEventListener("click", doUpdate, false); e.querySelector(".update").addEventListener("click", doUpdate, false);
e.querySelector(".delete").addEventListener("click", doDelete, false); e.querySelector(".delete").addEventListener("click", doDelete, false);
return e; return e;
} }
function enable(event, enabled) { function enable(event, enabled) {
var id = getId(event); var id = getId(event);
enableStyle(id, enabled); enableStyle(id, enabled);
} }
function doDelete() { function doDelete() {
if (!confirm(t('deleteStyleConfirm'))) { if (!confirm(t('deleteStyleConfirm'))) {
return; return;
} }
var id = getId(event); var id = getId(event);
deleteStyle(id); deleteStyle(id);
} }
function getId(event) { function getId(event) {
return getStyleElement(event).getAttribute("style-id"); return getStyleElement(event).getAttribute("style-id");
} }
function getStyleElement(event) { function getStyleElement(event) {
var e = event.target; var e = event.target;
while (e) { while (e) {
if (e.hasAttribute("style-id")) { if (e.hasAttribute("style-id")) {
return e; return e;
} }
e = e.parentNode; e = e.parentNode;
} }
return null; return null;
} }
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
switch(request.name) { switch(request.name) {
case "styleUpdated": case "styleUpdated":
handleUpdate(request.style); handleUpdate(request.style);
break; break;
case "styleAdded": case "styleAdded":
installed.appendChild(createStyleElement(request.style)); installed.appendChild(createStyleElement(request.style));
break; break;
case "styleDeleted": case "styleDeleted":
handleDelete(request.id); handleDelete(request.id);
break; break;
} }
}); });
function handleUpdate(style) { function handleUpdate(style) {
var installed = document.getElementById("installed"); var installed = document.getElementById("installed");
var element = createStyleElement(style); var element = createStyleElement(style);
installed.replaceChild(element, installed.querySelector("[style-id='" + style.id + "']")); installed.replaceChild(element, installed.querySelector("[style-id='" + style.id + "']"));
if (style.id == lastUpdatedStyleId) { if (style.id == lastUpdatedStyleId) {
lastUpdatedStyleId = null; lastUpdatedStyleId = null;
element.className = element.className += " update-done"; element.className = element.className += " update-done";
element.querySelector(".update-note").innerHTML = t('updateCompleted'); element.querySelector(".update-note").innerHTML = t('updateCompleted');
}; };
} }
function handleDelete(id) { function handleDelete(id) {
var installed = document.getElementById("installed"); var installed = document.getElementById("installed");
installed.removeChild(installed.querySelector("[style-id='" + id + "']")); installed.removeChild(installed.querySelector("[style-id='" + id + "']"));
} }
function doCheckUpdate(event) { function doCheckUpdate(event) {
checkUpdate(getStyleElement(event)); checkUpdate(getStyleElement(event));
} }
function checkUpdateAll() { function checkUpdateAll() {
Array.prototype.forEach.call(document.querySelectorAll("[style-update-url]"), checkUpdate); Array.prototype.forEach.call(document.querySelectorAll("[style-update-url]"), checkUpdate);
} }
function checkUpdate(element) { function checkUpdate(element) {
element.querySelector(".update-note").innerHTML = t('checkingForUpdate'); element.querySelector(".update-note").innerHTML = t('checkingForUpdate');
element.className = element.className.replace("checking-update", "").replace("no-update", "").replace("can-update", "") + " checking-update"; element.className = element.className.replace("checking-update", "").replace("no-update", "").replace("can-update", "") + " checking-update";
var id = element.getAttribute("style-id"); var id = element.getAttribute("style-id");
var url = element.getAttribute("style-update-url"); var url = element.getAttribute("style-update-url");
var md5Url = element.getAttribute("style-md5-url"); var md5Url = element.getAttribute("style-md5-url");
var originalMd5 = element.getAttribute("style-original-md5"); var originalMd5 = element.getAttribute("style-original-md5");
function handleSuccess(forceUpdate, serverJson) { function handleSuccess(forceUpdate, serverJson) {
chrome.extension.sendMessage({method: "getStyles", id: id}, function(styles) { chrome.extension.sendMessage({method: "getStyles", id: id}, function(styles) {
var style = styles[0]; var style = styles[0];
if (!forceUpdate && codeIsEqual(style.sections, serverJson.sections)) { if (!forceUpdate && codeIsEqual(style.sections, serverJson.sections)) {
handleNeedsUpdate("no", id, serverJson); handleNeedsUpdate("no", id, serverJson);
} else { } else {
handleNeedsUpdate("yes", id, serverJson); handleNeedsUpdate("yes", id, serverJson);
} }
}); });
} }
function handleFailure(status) { function handleFailure(status) {
if (status == 0) { if (status == 0) {
handleNeedsUpdate(t('updateCheckFailServerUnreachable'), id, null); handleNeedsUpdate(t('updateCheckFailServerUnreachable'), id, null);
} else { } else {
handleNeedsUpdate(t('updateCheckFailBadResponseCode', [status]), id, null); handleNeedsUpdate(t('updateCheckFailBadResponseCode', [status]), id, null);
} }
} }
if (!md5Url || !originalMd5) { if (!md5Url || !originalMd5) {
checkUpdateFullCode(url, false, handleSuccess, handleFailure) checkUpdateFullCode(url, false, handleSuccess, handleFailure)
} else { } else {
checkUpdateMd5(originalMd5, md5Url, function(needsUpdate) { checkUpdateMd5(originalMd5, md5Url, function(needsUpdate) {
if (needsUpdate) { if (needsUpdate) {
// If the md5 shows a change we will update regardless of whether the code looks different // If the md5 shows a change we will update regardless of whether the code looks different
checkUpdateFullCode(url, true, handleSuccess, handleFailure); checkUpdateFullCode(url, true, handleSuccess, handleFailure);
} else { } else {
handleNeedsUpdate("no", id, null); handleNeedsUpdate("no", id, null);
} }
}, handleFailure); }, handleFailure);
} }
} }
function checkUpdateFullCode(url, forceUpdate, successCallback, failureCallback) { function checkUpdateFullCode(url, forceUpdate, successCallback, failureCallback) {
download(url, function(responseText) { download(url, function(responseText) {
successCallback(forceUpdate, JSON.parse(responseText)); successCallback(forceUpdate, JSON.parse(responseText));
}, failureCallback); }, failureCallback);
} }
function checkUpdateMd5(originalMd5, md5Url, successCallback, failureCallback) { function checkUpdateMd5(originalMd5, md5Url, successCallback, failureCallback) {
download(md5Url, function(responseText) { download(md5Url, function(responseText) {
if (responseText.length != 32) { if (responseText.length != 32) {
failureCallback(-1); failureCallback(-1);
return; return;
} }
successCallback(responseText != originalMd5); successCallback(responseText != originalMd5);
}, failureCallback); }, failureCallback);
} }
function download(url, successCallback, failureCallback) { function download(url, successCallback, failureCallback) {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (aEvt) { xhr.onreadystatechange = function (aEvt) {
if (xhr.readyState == 4) { if (xhr.readyState == 4) {
if (xhr.status == 200) { if (xhr.status == 200) {
successCallback(xhr.responseText) successCallback(xhr.responseText)
} else { } else {
failureCallback(xhr.status); failureCallback(xhr.status);
} }
} }
} }
if (url.length > 2000) { if (url.length > 2000) {
var parts = url.split("?"); var parts = url.split("?");
xhr.open("POST", parts[0], true); xhr.open("POST", parts[0], true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(parts[1]); xhr.send(parts[1]);
} else { } else {
xhr.open("GET", url, true); xhr.open("GET", url, true);
xhr.send(); xhr.send();
} }
} }
function handleNeedsUpdate(needsUpdate, id, serverJson) { function handleNeedsUpdate(needsUpdate, id, serverJson) {
var e = document.querySelector("[style-id='" + id + "']"); var e = document.querySelector("[style-id='" + id + "']");
e.className = e.className.replace("checking-update", ""); e.className = e.className.replace("checking-update", "");
switch (needsUpdate) { switch (needsUpdate) {
case "yes": case "yes":
e.className += " can-update"; e.className += " can-update";
e.updatedCode = serverJson; e.updatedCode = serverJson;
e.querySelector(".update-note").innerHTML = ''; e.querySelector(".update-note").innerHTML = '';
break; break;
case "no": case "no":
e.className += " no-update"; e.className += " no-update";
e.querySelector(".update-note").innerHTML = t('updateCheckSucceededNoUpdate'); e.querySelector(".update-note").innerHTML = t('updateCheckSucceededNoUpdate');
break; break;
default: default:
e.className += " no-update"; e.className += " no-update";
e.querySelector(".update-note").innerHTML = needsUpdate; e.querySelector(".update-note").innerHTML = needsUpdate;
} }
} }
function doUpdate(event) { function doUpdate(event) {
var element = getStyleElement(event); var element = getStyleElement(event);
var updatedCode = element.updatedCode; var updatedCode = element.updatedCode;
// update everything but name // update everything but name
delete updatedCode.name; delete updatedCode.name;
updatedCode.id = element.getAttribute('style-id'); updatedCode.id = element.getAttribute('style-id');
updatedCode.method = "saveStyle"; updatedCode.method = "saveStyle";
// updating the UI will be handled by the general update listener // updating the UI will be handled by the general update listener
lastUpdatedStyleId = updatedCode.id; lastUpdatedStyleId = updatedCode.id;
chrome.extension.sendMessage(updatedCode); chrome.extension.sendMessage(updatedCode);
} }
function codeIsEqual(a, b) { function codeIsEqual(a, b) {
if (a.length != b.length) { if (a.length != b.length) {
return false; return false;
} }
var properties = ["code", "urlPrefixes", "urls", "domains", "regexps"]; var properties = ["code", "urlPrefixes", "urls", "domains", "regexps"];
for (var i = 0; i < a.length; i++) { for (var i = 0; i < a.length; i++) {
var found = false; var found = false;
for (var j = 0; j < b.length; j++) { for (var j = 0; j < b.length; j++) {
var allEquals = properties.every(function(property) { var allEquals = properties.every(function(property) {
return jsonEquals(a[i], b[j], property); return jsonEquals(a[i], b[j], property);
}); });
if (allEquals) { if (allEquals) {
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
return false; return false;
} }
} }
return true; return true;
} }
function jsonEquals(a, b, property) { function jsonEquals(a, b, property) {
var type = getType(a[property]); var type = getType(a[property]);
var typeB = getType(b[property]); var typeB = getType(b[property]);
if (type != typeB) { if (type != typeB) {
// consider empty arrays equivalent to lack of property // consider empty arrays equivalent to lack of property
if ((type == "undefined" || (type == "array" && a[property].length == 0)) && (typeB == "undefined" || (typeB == "array" && b[property].length == 0))) { if ((type == "undefined" || (type == "array" && a[property].length == 0)) && (typeB == "undefined" || (typeB == "array" && b[property].length == 0))) {
return true; return true;
} }
return false; return false;
} }
if (type == "undefined") { if (type == "undefined") {
return true; return true;
} }
if (type == "array") { if (type == "array") {
if (a[property].length != b[property].length) { if (a[property].length != b[property].length) {
return false; return false;
} }
for (var i = 0; i < a.length; i++) { for (var i = 0; i < a.length; i++) {
var found = false; var found = false;
for (var j = 0; j < b.length; j++) { for (var j = 0; j < b.length; j++) {
if (a[i] == b[j]) { if (a[i] == b[j]) {
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
return false; return false;
} }
} }
return true; return true;
} }
if (type == "string") { if (type == "string") {
return a[property] == b[property]; return a[property] == b[property];
} }
} }
function getType(o) { function getType(o) {
if (typeof o == "undefined" || typeof o == "string") { if (typeof o == "undefined" || typeof o == "string") {
return typeof o; return typeof o;
} }
if (o instanceof Array) { if (o instanceof Array) {
return "array"; return "array";
} }
throw "Not supported - " + o; throw "Not supported - " + o;
} }
function isCheckbox(el) { function isCheckbox(el) {
return el.nodeName.toLowerCase() == "input" && "checkbox" == el.type.toLowerCase(); return el.nodeName.toLowerCase() == "input" && "checkbox" == el.type.toLowerCase();
} }
function changePref(event) { function changePref(event) {
var el = event.target; var el = event.target;
localStorage[el.id] = isCheckbox(el) ? el.checked : el.value; localStorage[el.id] = isCheckbox(el) ? el.checked : el.value;
notifyAllTabs({method: "prefChanged"}); notifyAllTabs({method: "prefChanged"});
} }
function loadPrefs() { function loadPrefs() {
["show-badge"].forEach(function(id) { ["show-badge"].forEach(function(id) {
var value = localStorage[id]; var value = localStorage[id];
var el = document.getElementById(id); var el = document.getElementById(id);
if (isCheckbox(el)) { if (isCheckbox(el)) {
if (value == "true") { if (value == "true") {
el.checked = true; el.checked = true;
} }
} else { } else {
el.value = value; el.value = value;
} }
el.addEventListener("change", changePref); el.addEventListener("change", changePref);
}); });
} }
document.title = t("manageTitle"); document.title = t("manageTitle");
tE("manage-heading", "manageHeading"); tE("manage-heading", "manageHeading");
tE("manage-text", "manageText", null, false); tE("manage-text", "manageText", null, false);
tE("check-all-updates", "checkAllUpdates"); tE("check-all-updates", "checkAllUpdates");
tE("add-style-label", "addStyleLabel"); tE("add-style-label", "addStyleLabel");
tE("options-heading", "optionsHeading"); tE("options-heading", "optionsHeading");
tE("show-badge-label", "prefShowBadge"); tE("show-badge-label", "prefShowBadge");
document.getElementById("check-all-updates").addEventListener("click", checkUpdateAll, false); document.getElementById("check-all-updates").addEventListener("click", checkUpdateAll, false);