diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 08975dba..38befb21 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..399f5285 100644 --- a/popup.html +++ b/popup.html @@ -42,6 +42,9 @@ #installed { margin-top: 0.5em; } + #installed.disabled { + opacity: 0.5; + } body > .actions { margin-top: 0.5em; } @@ -49,6 +52,9 @@ .actions > div, #unavailable { margin-bottom: 0.75em; } + .actions input, .actions label { + vertical-align: middle; + } #unavailable { border: none; @@ -120,6 +126,10 @@