diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 29772243..ed75905f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -112,6 +112,10 @@ "message": "Restyle the web with Stylish, a user styles manager. Stylish lets you easily install themes and skins for many popular sites.", "description": "Extension description" }, + "disableAllStyles": { + "message": "Turn all styles off", + "description": "Label for the checkbox that turns all enabled styles off." + }, "disableStyleLabel": { "message": "Disable", "description": "Label for the button to disable a style" diff --git a/apply.js b/apply.js index 569b5303..66d70bcf 100644 --- a/apply.js +++ b/apply.js @@ -14,19 +14,38 @@ chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { } break; case "styleApply": - for (var styleId in request.styles) { - applySections(styleId, request.styles[styleId]); - } + applyStyles(request.styles); break; case "styleReplaceAll": replaceAll(request.styles, document); break; - case "realURL": - sendResponse(location.href); + case "realURL": + sendResponse(location.href); + break; + case "styleDisableAll": + disableAll(request.disableAll); break; } }); +var g_disableAll = false; +function disableAll(disable) { + if (!disable === !g_disableAll) return; + g_disableAll = disable; + disableSheets(g_disableAll, document); + + function disableSheets(disable, doc) { + Array.prototype.forEach.call(doc.styleSheets, function(stylesheet) { + if (stylesheet.ownerNode.classList.contains("stylish")) { + stylesheet.disabled = disable; + } + }); + getDynamicIFrames(doc).forEach(function(iframe) { + disableSheets(disable, iframe.contentDocument); + }); + } +} + function removeStyle(id, doc) { var e = doc.getElementById("stylish-" + id); if (e) { @@ -38,6 +57,11 @@ function removeStyle(id, doc) { } function applyStyles(styleHash) { + if ("disableAll" in styleHash) { + disableAll(styleHash.disableAll); + delete styleHash.disableAll; + } + for (var styleId in styleHash) { applySections(styleId, styleHash[styleId]); } @@ -66,7 +90,8 @@ function applySections(styleId, sections) { } function addStyleElement(styleElement, doc) { - doc.documentElement.appendChild(doc.importNode(styleElement, true)); + doc.documentElement.appendChild(doc.importNode(styleElement, true)) + .disabled = g_disableAll; getDynamicIFrames(doc).forEach(function(iframe) { addStyleElement(styleElement, iframe.contentDocument); }); @@ -110,9 +135,10 @@ var iframeObserver = new MutationObserver(function(mutations) { Array.prototype.filter.call(mutation.addedNodes, function(node) { return "IFRAME" === node.tagName; }).filter(iframeIsDynamic).forEach(function(iframe) { var doc = iframe.contentDocument; styles.forEach(function(style) { - doc.documentElement.appendChild(doc.importNode(style, true)); + doc.documentElement.appendChild(doc.importNode(style, true)) + .disabled = g_disableAll; }); }); }); }); -iframeObserver.observe(document, {childList: true, subtree: true}); +iframeObserver.observe(document, {childList: true, subtree: true}); \ No newline at end of file diff --git a/background.js b/background.js index 4056abdb..1c386919 100644 --- a/background.js +++ b/background.js @@ -14,6 +14,7 @@ function webNavigationListener(method, data) { chrome.tabs.sendMessage(data.tabId, {method: method, styles: styleHash}); // Don't show the badge for frames if (data.frameId == 0 && prefs.getPref("show-badge")) { + delete styleHash.disableAll; chrome.browserAction.setBadgeText({text: getBadgeText(Object.keys(styleHash)), tabId: data.tabId}); } }); @@ -49,7 +50,7 @@ function getStyles(options, callback) { var asHash = "asHash" in options ? options.asHash : false; var callCallback = function() { - var styles = asHash ? {} : []; + var styles = asHash ? {disableAll: prefs.getPref("disableAll", false)} : []; cachedStyles.forEach(function(style) { if (enabled != null && fixBoolean(style.enabled) != enabled) { return; diff --git a/popup.html b/popup.html index 611e0c2f..27062251 100644 --- a/popup.html +++ b/popup.html @@ -105,6 +105,12 @@ color: inherit; text-decoration: underline; } + + #disableAll { + margin: 0 .5ex 0 0; + font-size: x-small; + vertical-align: text-bottom; + } @@ -122,6 +128,7 @@
diff --git a/popup.js b/popup.js index a1538259..7fdba161 100644 --- a/popup.js +++ b/popup.js @@ -25,6 +25,7 @@ function updatePopUp(url) { if (!urlWillWork) { document.body.classList.add("blocked"); tE("unavailable", "stylishUnavailableForURL"); + return; } chrome.extension.sendMessage({method: "getStyles", matchUrl: url}, showStyles); @@ -184,7 +185,13 @@ function handleDelete(id) { tE("open-manage-link", "openManage"); tE("write-style-for", "writeStyleFor"); tE("find-styles-link", "findStylesForSite"); +tE("disableAll-label", "disableAllStyles"); ["find-styles-link", "open-manage-link"].forEach(function(id) { document.getElementById(id).addEventListener("click", openLink, false); }); + +loadPrefs({"disableAll": false}) +document.getElementById("disableAll").addEventListener("change", function(event) { + notifyAllTabs({method: "styleDisableAll", disableAll: event.target.checked}); +}); diff --git a/storage.js b/storage.js index ddcce537..c4b75689 100644 --- a/storage.js +++ b/storage.js @@ -162,6 +162,7 @@ var prefs = { // defaults "openEditInWindow": false, // new editor opens in a own browser window "show-badge": true, // display text on popup menu icon + "disableAll": false, // boss key "popup.breadcrumbs": true, // display "New style" links as URL breadcrumbs "popup.breadcrumbs.usePath": false, // use URL path for "this URL"