diff options
author | Ruben Rodriguez <ruben@gnu.org> | 2019-05-10 19:05:20 -0400 |
---|---|---|
committer | Ruben Rodriguez <ruben@gnu.org> | 2019-05-10 19:05:20 -0400 |
commit | 7859a9131fcda359265dc16ef55933e5ed218119 (patch) | |
tree | ecb4bf7a0fd005a637d3ff0444ce9afaa8817ba9 /data/extensions/https-everywhere@eff.org/pages/popup/ux.js | |
parent | cb4bbb16a12d495eca1ac05ebacc7557e9b05c05 (diff) |
Updated extensions bundle
Diffstat (limited to 'data/extensions/https-everywhere@eff.org/pages/popup/ux.js')
-rw-r--r-- | data/extensions/https-everywhere@eff.org/pages/popup/ux.js | 180 |
1 files changed, 136 insertions, 44 deletions
diff --git a/data/extensions/https-everywhere@eff.org/pages/popup/ux.js b/data/extensions/https-everywhere@eff.org/pages/popup/ux.js index f50a928..142c372 100644 --- a/data/extensions/https-everywhere@eff.org/pages/popup/ux.js +++ b/data/extensions/https-everywhere@eff.org/pages/popup/ux.js @@ -11,34 +11,67 @@ * Handles rule (de)activation in the popup */ function toggleRuleLine(event) { - if (event.target.matches("input[type=checkbox]")) { - getTab(activeTab => { - const set_ruleset = { - active: event.target.checked, - name: event.target.nextSibling.innerText, - tab_id: activeTab.id, - }; - - sendMessage("set_ruleset_active_status", set_ruleset, () => { - // purge the name from the cache so that this unchecking is persistent. - sendMessage("delete_from_ruleset_cache", set_ruleset.name, () => { - // Now reload the selected tab of the current window. - chrome.tabs.reload(set_ruleset.tab_id); - }); + getTab(activeTab => { + const set_ruleset = { + active: event.target.parentNode.firstChild.checked, + name: event.target.innerText, + tab_id: activeTab.id, + }; + + sendMessage("set_ruleset_active_status", set_ruleset, () => { + // purge the name from the cache so that this unchecking is persistent. + sendMessage("delete_from_ruleset_cache", set_ruleset.name, () => { + // Now reload the selected tab of the current window. + chrome.tabs.reload(set_ruleset.tab_id); }); }); - } + }); } +/** + * @param {object} event + * @description Toggles content for user to view rules and explanations for different modes + */ +function toggleSeeMore(event) { + let target = event.target; + let content; + + if (target !== this) { + content = document.querySelector('.see_more__content'); + } else { + content = target.parentNode.querySelector('.see_more__content'); + } + + let arrow = target.parentNode.querySelector('.see_more__arrow'); + let text = target.parentNode.querySelector('.see_more__text'); + + if(arrow.classList.contains('down')) { + arrow.classList.replace('down', 'up'); + text.innerText = 'See less'; + } else if (arrow.classList.contains('up')) { + arrow.classList.replace('up', 'down'); + text.innerText = 'See more'; + } + + if (content.classList.contains('hide')) { + content.classList.replace('hide', 'show'); + } else if (content.classList.contains('show')) { + content.classList.replace('show', 'hide'); + } +} /** * Creates rule lines (including checkbox and icon) for the popup * @param rulesets * @param list_div + * @param {string} ruleType * @returns {*} */ -function appendRulesToListDiv(rulesets, list_div) { +function appendRulesToListDiv(rulesets, list_div, ruleType) { if (rulesets && rulesets.length) { + let counter = rulesets.length; + let counterElement = document.querySelector("#RuleManagement--counter"); + counterElement.innerText = counter; // template parent block for each ruleset let templateLine = document.createElement("div"); templateLine.className = "rule checkbox"; @@ -55,18 +88,26 @@ function appendRulesToListDiv(rulesets, list_div) { // img "remove" button let templateRemove = document.createElement("img"); - templateRemove.src = chrome.extension.getURL("images/remove.png"); + templateRemove.src = chrome.runtime.getURL("images/remove.png"); templateRemove.className = "remove"; - templateLabel.appendChild(templateCheckbox); + templateLine.appendChild(templateCheckbox); templateLabel.appendChild(templateLabelText); templateLine.appendChild(templateLabel); + let increment = 0; + for (const ruleset of rulesets) { + increment++; let line = templateLine.cloneNode(true); let checkbox = line.querySelector("input[type=checkbox]"); + let label = line.querySelector("label"); let text = line.querySelector("span"); + // For each "id" attribute in each checkbox input and "for" attribute in label + checkbox.setAttribute("id", `${ruleType}_ruleset_${increment}`); + label.setAttribute("for", `${ruleType}_ruleset_${increment}`); + checkbox.checked = ruleset.active; text.innerText = ruleset.name; @@ -95,6 +136,8 @@ function showHttpNowhereUI() { getOption_('httpNowhere', false, function(item) { if (item.httpNowhere) { e('http-nowhere-checkbox').checked = true; + e('HttpNowhere__header').innerText = 'Encrypt All Sites Eligible is ON'; + e('HttpNowhere__explained').innerText = 'Unencrypted requests are currently blocked'; } e('HttpNowhere').style.visibility = "visible"; }); @@ -108,30 +151,32 @@ function updateEnabledDisabledUI() { // Hide or show the rules sections if (item.globalEnabled) { document.body.className = "" - showHttpNowhereUI() + showHttpNowhereUI(); } else { - document.body.className = "disabled" + document.body.className = "disabled"; + e('onoffswitch_label').innerText = 'HTTPS Everywhere is OFF'; } }); } // Toggle extension enabled/disabled status function toggleEnabledDisabled() { - var extension_toggle_effect = function() { + let extension_toggle_effect = function() { updateEnabledDisabledUI(); - // The extension state changed, so reload this tab. - chrome.tabs.reload(); - window.close(); + // The extension state changed, give some time for toggle animation and reload tab + setTimeout(function() { + chrome.tabs.reload(); + window.close(); + }, 1500); } getOption_('globalEnabled', true, function(item) { setOption_('globalEnabled', !item.globalEnabled, extension_toggle_effect); }); - } /** - * Create the list of rules for a specific tab + * @description Create the list of rules for a specific tab * @param activeTab */ function listRules(activeTab) { @@ -140,11 +185,11 @@ function listRules(activeTab) { const stableRules = rulesets.filter(ruleset => ruleset.default_state); const unstableRules = rulesets.filter(ruleset => !ruleset.default_state); - appendRulesToListDiv(stableRules, e("StableRules")); - appendRulesToListDiv(unstableRules, e("UnstableRules")); + appendRulesToListDiv(stableRules, e("StableRules"), 'stable'); + appendRulesToListDiv(unstableRules, e("UnstableRules"), 'unstable'); // Add listener to capture the toggle event - e("RuleManagement").addEventListener("click", toggleRuleLine); + e("add-new-rule-button").addEventListener("click", toggleRuleLine); } // Only show the "Add a rule" section if we're on an HTTPS page @@ -161,7 +206,7 @@ document.addEventListener("DOMContentLoaded", function () { getTab(tab => { const url = new URL(tab.url); sendMessage("check_if_site_disabled", url.host, disabled => { - if(!disabled){ + if(!disabled) { listRules(tab); } showEnableOrDisable(url, disabled); @@ -172,12 +217,22 @@ document.addEventListener("DOMContentLoaded", function () { updateEnabledDisabledUI(); e('onoffswitch').addEventListener('click', toggleEnabledDisabled); e('http-nowhere-checkbox').addEventListener('click', toggleHttpNowhere, false); + e('RuleManagement__see_more--prompt').addEventListener('click', toggleSeeMore); + e('reset-to-defaults').addEventListener('click', () => { - if (confirm(chrome.i18n.getMessage("prefs_reset_defaults_message"))) { - sendMessage("reset_to_defaults", null, () => { - window.close(); - }); - } + sendMessage("is_firefox", null, is_firefox => { + if (is_firefox) { + sendMessage("reset_to_defaults", null, () => { + window.close(); + }); + } else { + if (confirm(chrome.i18n.getMessage("prefs_reset_defaults_message"))) { + sendMessage("reset_to_defaults", null, () => { + window.close(); + }); + } + } + }); }); // Print the extension's current version. @@ -186,16 +241,27 @@ document.addEventListener("DOMContentLoaded", function () { version_info.innerText = the_manifest.version; let rulesets_versions = e('rulesets-versions'); + + rulesets_versions.addSpan = function(update_channel_name, ruleset_version_string) { + let timestamp_span = document.createElement("span"); + timestamp_span.className = "rulesets-version"; + timestamp_span.innerText = `${chrome.i18n.getMessage("about_rulesets_version")} ${update_channel_name}: ${ruleset_version_string}`; + this.appendChild(timestamp_span); + } + sendMessage("get_ruleset_timestamps", null, timestamps => { - for(let [update_channel, timestamp] of timestamps){ - if(timestamp > 0){ + let replaces = timestamps.some(([update_channel, timestamp]) => + update_channel.replaces_default_rulesets && timestamp > 0 + ); + if(!replaces) { + rulesets_versions.addSpan("EFF (Full, Bundled)", the_manifest.version); + } + for(let [update_channel, timestamp] of timestamps) { + if(timestamp > 0) { let ruleset_date = new Date(timestamp * 1000); let ruleset_version_string = ruleset_date.getUTCFullYear() + "." + (ruleset_date.getUTCMonth() + 1) + "." + ruleset_date.getUTCDate(); - let timestamp_span = document.createElement("span"); - timestamp_span.className = "rulesets-version"; - timestamp_span.innerText = chrome.i18n.getMessage("about_rulesets_version") + " " + update_channel + ": " + ruleset_version_string; - rulesets_versions.appendChild(timestamp_span); + rulesets_versions.addSpan(update_channel.name, ruleset_version_string); } } }); @@ -205,7 +271,6 @@ document.addEventListener("DOMContentLoaded", function () { e("enable-on-this-site").addEventListener("click", enableOnSite); }); - var escapeForRegex = function( value ) { return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); }; @@ -303,9 +368,24 @@ function enableOnSite() { }); } +/** + * @description Turns EASE Mode on and off + */ function toggleHttpNowhere() { - getOption_('httpNowhere', false, function(item) { - setOption_('httpNowhere', !item.httpNowhere); + getTab(tab => { + getOption_('httpNowhere', false, item => { + const enabled = !item.httpNowhere; + setOption_('httpNowhere', enabled, () => { + if (enabled) { + chrome.tabs.reload(tab.id); + e('HttpNowhere__header').innerText = 'Encrypt All Sites Eligible is ON'; + e('HttpNowhere__explained').innerText = 'Unencrypted requests are currently blocked'; + } else { + e('HttpNowhere__header').innerText = 'Encrypt All Sites Eligible is OFF'; + e('HttpNowhere__explained').innerText = 'Unencrypted requests are currently allowed'; + } + }); + }); }); } @@ -317,3 +397,15 @@ function getTab(callback) { } chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => callback(tabs[0])); } + +// This code fixes a Chromium-specific bug that causes links in extension popup +// to open in regular tab even if the popup is opened in incognito mode. + +document.addEventListener('click', e => { + const { target } = e + + if (target.matches('a[target="_blank"]')) { + chrome.tabs.create({ url: target.href }) + e.preventDefault() + } +}) |