diff --git a/audit/run.js b/audit/run.js index b20a4280a98084a830686c7e93dc0ce6f788ad3d..6b36dedb60bf80a11ed8ac69ed780993dc78d75b 100644 --- a/audit/run.js +++ b/audit/run.js @@ -15,12 +15,11 @@ * Imports */ -var fileSystem, crypto, http, path, sourceMappingURL; +var fileSystem, crypto, https, sourceMappingURL; fileSystem = require('fs'); crypto = require('crypto'); https = require('https'); -path = require('path'); sourceMappingURL = require('source-map-url'); @@ -205,7 +204,7 @@ resourceAmount = localResourcePaths.length; * Script */ -localResourcePaths.forEach(function (resourcePath, index) { +localResourcePaths.forEach(function (resourcePath) { var resourceRoute = resourcePath.substr(localResourceLocationLength + 1); resourceRoute = resourceRoute.substring(0, resourceRoute.length - 4); diff --git a/core/constants.js b/core/constants.js new file mode 100644 index 0000000000000000000000000000000000000000..e68440d5b2daf1d81329403b3c9b94e4e20486a5 --- /dev/null +++ b/core/constants.js @@ -0,0 +1,31 @@ +/** + * Global Constants + * Belongs to Decentraleyes. + * + * @author Thomas Rientjes + * @since 2017-10-27 + * @license MPL 2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +'use strict'; + +/** + * Constants + */ + +const HOST_PREFIX = '*://'; +const HOST_SUFFIX = '/*'; +const HTTP_EXPRESSION = /^http?:\/\//; +const MAPPING_FILE_EXPRESSION = /\.map$/i; +const REQUEST_BLOCKING = 'blocking'; +const REQUEST_HEADERS = 'requestHeaders'; +const VALUE_SEPARATOR = ';'; +const VERSION_EXPRESSION = /(?:\d{1,2}\.){1,3}\d{1,2}/; +const VERSION_PLACEHOLDER = '{version}'; +const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^/]+)(.*)/; +const WEB_PREFIX_LENGTH = 4; +const WEB_PREFIX_VALUE = 'www.'; diff --git a/core/interceptor.js b/core/interceptor.js index 57ce92afef9f200343eb3595c07a34af20b3b0bc..f361425b538e15730b8629f4a2e4f5062894af2f 100644 --- a/core/interceptor.js +++ b/core/interceptor.js @@ -19,12 +19,6 @@ var interceptor = {}; -/** - * Constants - */ - -const HTTP_EXPRESSION = /^http?:\/\//; - /** * Public Methods */ @@ -60,7 +54,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) { 'udacity.com': true }; - if (undetectableTaintedDomains[tabDomain] || /yandex\./.test(tabDomain)) { + if (undetectableTaintedDomains[tabDomain] || (/yandex\./).test(tabDomain)) { if (tabDomain !== 'yandex.ru') { return interceptor._handleMissingCandidate(requestDetails.url); @@ -79,8 +73,7 @@ interceptor.handleRequest = function (requestDetails, tabIdentifier, tab) { } stateManager.requests[requestDetails.requestId] = { - 'tabIdentifier': tabIdentifier, - 'targetDetails': targetDetails + tabIdentifier, targetDetails }; return { @@ -103,10 +96,10 @@ interceptor._handleMissingCandidate = function (requestUrl) { if (requestUrl.match(HTTP_EXPRESSION)) { - requestUrl = requestUrl.replace(HTTP_EXPRESSION, 'https://'); + let secureRequestUrl = requestUrl.replace(HTTP_EXPRESSION, 'https://'); return { - 'redirectUrl': requestUrl + 'redirectUrl': secureRequestUrl }; } else { diff --git a/core/main.js b/core/main.js index 9f09d280476c99ad8c3685cc450834cdaa9c2eb2..9bfc787612e6d4f0dbbf7c04245b67514fc71d15 100644 --- a/core/main.js +++ b/core/main.js @@ -52,19 +52,19 @@ main._initializeOptions = function () { main._showReleaseNotes = function (details) { - let location = browser.extension.getURL('pages/welcome/welcome.html'); + let location = chrome.extension.getURL('pages/welcome/welcome.html'); if (details.reason === 'install' || details.reason === 'update') { - if (details.temporary === false) { + if (details.temporary !== true) { - browser.storage.local.get({ + chrome.storage.local.get({ 'showReleaseNotes': true }, function (options) { if (options.showReleaseNotes === true) { - browser.tabs.create({ + chrome.tabs.create({ 'url': location, 'active': false }); @@ -78,7 +78,7 @@ main._showReleaseNotes = function (details) { * Initializations */ -browser.runtime.onInstalled.addListener(main._showReleaseNotes); +chrome.runtime.onInstalled.addListener(main._showReleaseNotes); main._initializeOptions(); chrome.runtime.getPlatformInfo(function (information) { diff --git a/core/mappings.js b/core/mappings.js index fca471e81a6eb9b07ace346abe04be30bdb7a598..3aac79592d9571a5a0c758b83908a9d7a267c424 100644 --- a/core/mappings.js +++ b/core/mappings.js @@ -37,40 +37,40 @@ var mappings = { // Common Shorthand Notations [Deprecated] 'dojo/1/dojo/dojo.': { - path: 'resources/dojo/1.6.1/dojo/dojo.js.dec', - type: 'application/javascript' + 'path': 'resources/dojo/1.6.1/dojo/dojo.js.dec', + 'type': 'application/javascript' }, 'jquery/1/jquery.': { - path: 'resources/jquery/1.11.1/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.11.1/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jqueryui/1/jquery-ui.js': { - path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec', + 'type': 'application/javascript' }, 'jqueryui/1/jquery-ui.min.js': { - path: 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec', + 'type': 'application/javascript' }, 'mootools/1/mootools-yui-compressed.': { - path: 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec', - type: 'application/javascript' + 'path': 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec', + 'type': 'application/javascript' }, 'prototype/1/prototype.': { - path: 'resources/prototype/1.7.1.0/prototype.js.dec', - type: 'application/javascript' + 'path': 'resources/prototype/1.7.1.0/prototype.js.dec', + 'type': 'application/javascript' }, 'scriptaculous/1/scriptaculous.': { - path: 'resources/scriptaculous/1.9.0/scriptaculous.js.dec', - type: 'application/javascript' + 'path': 'resources/scriptaculous/1.9.0/scriptaculous.js.dec', + 'type': 'application/javascript' }, 'swfobject/2/swfobject.': { - path: 'resources/swfobject/2.2/swfobject.js.dec', - type: 'application/javascript' + 'path': 'resources/swfobject/2.2/swfobject.js.dec', + 'type': 'application/javascript' }, 'webfont/1/webfont.': { - path: 'resources/webfont/1.5.18/webfont.js.dec', - type: 'application/javascript' + 'path': 'resources/webfont/1.5.18/webfont.js.dec', + 'type': 'application/javascript' } } }, @@ -118,52 +118,52 @@ var mappings = { // Common Shorthand Notations [Deprecated] 'jquery-latest.': { - path: 'resources/jquery/1.11.1/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.11.1/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery.': { - path: 'resources/jquery/1.11.1/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.11.1/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.3.min.js': { - path: 'resources/jquery/1.3.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.3.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.3.js': { - path: 'resources/jquery/1.3.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.3.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.4.min.js': { - path: 'resources/jquery/1.4.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.4.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.4.js': { - path: 'resources/jquery/1.4.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.4.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.5.min.js': { - path: 'resources/jquery/1.5.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.5.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.5.js': { - path: 'resources/jquery/1.5.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.5.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.6.min.js': { - path: 'resources/jquery/1.6.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.6.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.6.js': { - path: 'resources/jquery/1.6.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.6.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.7.min.js': { - path: 'resources/jquery/1.7.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.7.0/jquery.min.js.dec', + 'type': 'application/javascript' }, 'jquery-1.7.js': { - path: 'resources/jquery/1.7.0/jquery.min.js.dec', - type: 'application/javascript' + 'path': 'resources/jquery/1.7.0/jquery.min.js.dec', + 'type': 'application/javascript' } } }, diff --git a/core/request-analyzer.js b/core/request-analyzer.js index 513a0991c11c28c2855b470e0a3e67eaa9969714..70b41cb45764e6135076578bd92a6ad2144901c9 100644 --- a/core/request-analyzer.js +++ b/core/request-analyzer.js @@ -19,17 +19,6 @@ var requestAnalyzer = {}; -/** - * Constants - */ - -const MAPPING_FILE_EXPRESSION = new RegExp('\.map$', 'i'); -const VERSION_EXPRESSION = /(?:\d{1,2}\.){1,3}\d{1,2}/; -const VERSION_PLACEHOLDER = '{version}'; -const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^\/]+)(.*)/; -const WEB_PREFIX_VALUE = 'www.'; -const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length; - /** * Public Methods */ @@ -96,7 +85,7 @@ requestAnalyzer._matchBasePath = function (hostMappings, channelPath) { requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channelHost, channelPath) { - var resourcePath, versionNumber, resourcePattern; + let resourcePath, versionNumber, resourcePattern; resourcePath = channelPath.replace(basePath, ''); @@ -116,9 +105,9 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel // Prepare and return a local target. return { - source: channelHost, - version: version, - path: targetPath + 'source': channelHost, + 'version': version, + 'path': targetPath }; } } @@ -128,7 +117,6 @@ requestAnalyzer._findLocalTarget = function (resourceMappings, basePath, channel requestAnalyzer._applyWhitelistedDomains = function () { - //noinspection JSUnresolvedVariable chrome.storage.local.get('whitelistedDomains', function (items) { requestAnalyzer.whitelistedDomains = items.whitelistedDomains || {}; }); diff --git a/core/resources.js b/core/resources.js index 76b8d06216d3260218d3e95d4ff3c85525030f51..cbc7b7783c5f697ad0a77913603cd0ce8a327f46 100644 --- a/core/resources.js +++ b/core/resources.js @@ -20,73 +20,73 @@ var resources = { // AngularJS - angular: { - path: 'resources/angularjs/{version}/angular.min.js.dec', - type: 'application/javascript' + 'angular': { + 'path': 'resources/angularjs/{version}/angular.min.js.dec', + 'type': 'application/javascript' }, // Backbone.js - backbone: { - path: 'resources/backbone.js/{version}/backbone-min.js.dec', - type: 'application/javascript' + 'backbone': { + 'path': 'resources/backbone.js/{version}/backbone-min.js.dec', + 'type': 'application/javascript' }, // Dojo - dojo: { - path: 'resources/dojo/{version}/dojo/dojo.js.dec', - type: 'application/javascript' + 'dojo': { + 'path': 'resources/dojo/{version}/dojo/dojo.js.dec', + 'type': 'application/javascript' }, // Ember.js - ember: { - path: 'resources/ember.js/{version}/ember.min.js.dec', - type: 'application/javascript' + 'ember': { + 'path': 'resources/ember.js/{version}/ember.min.js.dec', + 'type': 'application/javascript' }, // Ext Core - extCore: { - path: 'resources/ext-core/{version}/ext-core.js.dec', - type: 'application/javascript' + 'extCore': { + 'path': 'resources/ext-core/{version}/ext-core.js.dec', + 'type': 'application/javascript' }, // jQuery - jQuery: { - path: 'resources/jquery/{version}/jquery.min.js.dec', - type: 'application/javascript' + 'jQuery': { + 'path': 'resources/jquery/{version}/jquery.min.js.dec', + 'type': 'application/javascript' }, // jQuery UI - jQueryUI: { - path: 'resources/jqueryui/{version}/jquery-ui.min.js.dec', - type: 'application/javascript' + 'jQueryUI': { + 'path': 'resources/jqueryui/{version}/jquery-ui.min.js.dec', + 'type': 'application/javascript' }, // Modernizr - modernizr: { - path: 'resources/modernizr/{version}/modernizr.min.js.dec', - type: 'application/javascript' + 'modernizr': { + 'path': 'resources/modernizr/{version}/modernizr.min.js.dec', + 'type': 'application/javascript' }, // MooTools - mootools: { - path: 'resources/mootools/{version}/mootools-yui-compressed.js.dec', - type: 'application/javascript' + 'mootools': { + 'path': 'resources/mootools/{version}/mootools-yui-compressed.js.dec', + 'type': 'application/javascript' }, // Prototype - prototypeJS: { - path: 'resources/prototype/{version}/prototype.js.dec', - type: 'application/javascript' + 'prototypeJS': { + 'path': 'resources/prototype/{version}/prototype.js.dec', + 'type': 'application/javascript' }, // Scriptaculous - scriptaculous: { - path: 'resources/scriptaculous/{version}/scriptaculous.js.dec', - type: 'application/javascript' + 'scriptaculous': { + 'path': 'resources/scriptaculous/{version}/scriptaculous.js.dec', + 'type': 'application/javascript' }, // SWFObject - swfobject: { - path: 'resources/swfobject/{version}/swfobject.js.dec', - type: 'application/javascript' + 'swfobject': { + 'path': 'resources/swfobject/{version}/swfobject.js.dec', + 'type': 'application/javascript' }, // Underscore.js - underscore: { - path: 'resources/underscore.js/{version}/underscore-min.js.dec', - type: 'application/javascript' + 'underscore': { + 'path': 'resources/underscore.js/{version}/underscore-min.js.dec', + 'type': 'application/javascript' }, // Web Font Loader - webfont: { - path: 'resources/webfont/{version}/webfont.js.dec', - type: 'application/javascript' + 'webfont': { + 'path': 'resources/webfont/{version}/webfont.js.dec', + 'type': 'application/javascript' } }; diff --git a/core/state-manager.js b/core/state-manager.js index 6191872fac62e99af1bbf2196728eea7a0d82c6d..bfe475db0431b006f5fec07f3bfd54e274504a64 100644 --- a/core/state-manager.js +++ b/core/state-manager.js @@ -19,15 +19,6 @@ var stateManager = {}; -/** - * Constants - */ - -const BLOCKING_ACTION = 'blocking'; -const HOST_PREFIX = '*://'; -const HOST_SUFFIX = '/*'; -const REQUEST_HEADERS = 'requestHeaders'; - /** * Public Methods */ @@ -47,15 +38,15 @@ stateManager.registerInjection = function (tabIdentifier, injection) { if (injectionCount > 0) { chrome.browserAction.setBadgeText({ - tabId: tabIdentifier, - text: injectionCount.toString() + 'tabId': tabIdentifier, + 'text': injectionCount.toString() }); } else { chrome.browserAction.setBadgeText({ - tabId: tabIdentifier, - text: '' + 'tabId': tabIdentifier, + 'text': '' }); } } @@ -130,7 +121,7 @@ stateManager._createTab = function (tab) { }); }); - }, requestFilters, [BLOCKING_ACTION]); + }, requestFilters, [REQUEST_BLOCKING]); }; stateManager._removeTab = function (tabIdentifier) { @@ -151,8 +142,8 @@ stateManager._updateTab = function (details) { if (stateManager.showIconBadge === true) { chrome.browserAction.setBadgeText({ - tabId: tabIdentifier, - text: '' + 'tabId': tabIdentifier, + 'text': '' }); } @@ -180,7 +171,7 @@ stateManager._stripMetadata = function (requestDetails) { stateManager._handleStorageChanged = function (changes) { if ('showIconBadge' in changes) { - + stateManager.showIconBadge = changes.showIconBadge.newValue; if (changes.showIconBadge.newValue !== true) { @@ -199,13 +190,13 @@ stateManager._handleStorageChanged = function (changes) { onBeforeSendHeaders.removeListener(stateManager._stripMetadata, { 'urls': stateManager.validHosts - }, [BLOCKING_ACTION, REQUEST_HEADERS]); + }, [REQUEST_BLOCKING, REQUEST_HEADERS]); if (changes.stripMetadata.newValue !== false) { - + onBeforeSendHeaders.addListener(stateManager._stripMetadata, { 'urls': stateManager.validHosts - }, [BLOCKING_ACTION, REQUEST_HEADERS]); + }, [REQUEST_BLOCKING, REQUEST_HEADERS]); } } }; @@ -213,8 +204,8 @@ stateManager._handleStorageChanged = function (changes) { stateManager._removeIconBadgeFromTab = function (tab) { chrome.browserAction.setBadgeText({ - tabId: tab.id, - text: '' + 'tabId': tab.id, + 'text': '' }); }; @@ -228,10 +219,6 @@ stateManager.validHosts = []; for (let mapping in mappings) { - if (!mappings.hasOwnProperty(mapping)) { - continue; - } - let supportedHost = HOST_PREFIX + mapping + HOST_SUFFIX; stateManager.validHosts.push(supportedHost); } @@ -252,7 +239,7 @@ chrome.tabs.onCreated.addListener(stateManager._createTab); chrome.tabs.onRemoved.addListener(stateManager._removeTab); chrome.webNavigation.onCommitted.addListener(stateManager._updateTab, { - url: [{urlContains: ':'}] + 'url': [{'urlContains': ':'}] }); chrome.webRequest.onErrorOccurred.addListener(function (requestDetails) { @@ -277,6 +264,6 @@ chrome.webRequest.onBeforeRedirect.addListener(function (requestDetails) { chrome.webRequest.onBeforeSendHeaders.addListener(stateManager._stripMetadata, { 'urls': stateManager.validHosts -}, [BLOCKING_ACTION, REQUEST_HEADERS]); +}, [REQUEST_BLOCKING, REQUEST_HEADERS]); chrome.storage.onChanged.addListener(stateManager._handleStorageChanged); diff --git a/manifest.json b/manifest.json index 55c1fc351e0ec0809b5440808e762bfa67d97d5b..ad9c92d822ba4c76a1577fbc20fe86bd89c99cb8 100644 --- a/manifest.json +++ b/manifest.json @@ -44,8 +44,7 @@ }, "options_ui": { - "page": "pages/options/options.html", - "browser_style": false + "page": "pages/options/options.html" }, "applications": { diff --git a/modules/internal/.gitkeep b/modules/internal/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/modules/internal/helpers.js b/modules/internal/helpers.js new file mode 100644 index 0000000000000000000000000000000000000000..c5798f7c1d054c2f424a6fe48e4e81b6e52baea1 --- /dev/null +++ b/modules/internal/helpers.js @@ -0,0 +1,169 @@ +/** + * Internal Helper Module + * Belongs to Decentraleyes. + * + * @author Thomas Rientjes + * @since 2017-10-26 + * @license MPL 2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +'use strict'; + +/** + * Helpers + */ + +var helpers = {}; + +/** + * Public Functions + */ + +helpers.insertI18nContentIntoDocument = function (document) { + + let scriptDirection, i18nElements; + + scriptDirection = helpers.determineScriptDirection(navigator.language); + i18nElements = document.querySelectorAll('[data-i18n-content]'); + + i18nElements.forEach(function (i18nElement) { + + let i18nMessageName = i18nElement.getAttribute('data-i18n-content'); + + i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName); + i18nElement.setAttribute('dir', scriptDirection); + }); +}; + +helpers.insertI18nTitlesIntoDocument = function (document) { + + let scriptDirection, i18nElements; + + scriptDirection = helpers.determineScriptDirection(navigator.language); + i18nElements = document.querySelectorAll('[data-i18n-title]'); + + i18nElements.forEach(function (i18nElement) { + + let i18nMessageName = i18nElement.getAttribute('data-i18n-title'); + + i18nElement.setAttribute('title', chrome.i18n.getMessage(i18nMessageName)); + i18nElement.setAttribute('dir', scriptDirection); + }); +}; + +helpers.languageIsFullySupported = function (language) { + + let languageSupported, supportedLanguages; + + languageSupported = false; + + supportedLanguages = [ + 'ar', 'bg', 'zh-CN', 'zh-TW', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'he', + 'hu', 'is', 'id', 'pl', 'pt-PT', 'ro', 'es', 'tr' + ]; + + for (let supportedLanguage of supportedLanguages) { + + if (language.search(supportedLanguage) !== -1) { + languageSupported = true; + } + } + + return languageSupported; +}; + +helpers.determineCdnName = function (domainName) { + + switch (domainName) { + + case 'ajax.googleapis.com': + return 'Google Hosted Libraries'; + case 'ajax.aspnetcdn.com': + return 'Microsoft Ajax CDN'; + case 'ajax.microsoft.com': + return 'Microsoft Ajax CDN [Deprecated]'; + case 'cdnjs.cloudflare.com': + return 'CDNJS (Cloudflare)'; + case 'code.jquery.com': + return 'jQuery CDN (MaxCDN)'; + case 'cdn.jsdelivr.net': + return 'jsDelivr (MaxCDN)'; + case 'yastatic.net': + return 'Yandex CDN'; + case 'yandex.st': + return 'Yandex CDN [Deprecated]'; + case 'libs.baidu.com': + return 'Baidu CDN'; + case 'lib.sinaapp.com': + return 'Sina Public Resources'; + case 'upcdn.b0.upaiyun.com': + return 'UpYun Library'; + default: + return 'Unknown'; + } +}; + +helpers.determineResourceName = function (filename) { + + switch (filename) { + + case 'angular.min.js.dec': + return 'AngularJS'; + case 'backbone-min.js.dec': + return 'Backbone.js'; + case 'dojo.js.dec': + return 'Dojo'; + case 'ember.min.js.dec': + return 'Ember.js'; + case 'ext-core.js.dec': + return 'Ext Core'; + case 'jquery.min.js.dec': + return 'jQuery'; + case 'jquery-ui.min.js.dec': + return 'jQuery UI'; + case 'modernizr.min.js.dec': + return 'Modernizr'; + case 'mootools-yui-compressed.js.dec': + return 'MooTools'; + case 'prototype.js.dec': + return 'Prototype'; + case 'scriptaculous.js.dec': + return 'Scriptaculous'; + case 'swfobject.js.dec': + return 'SWFObject'; + case 'underscore-min.js.dec': + return 'Underscore.js'; + case 'webfont.js.dec': + return 'Web Font Loader'; + default: + return 'Unknown'; + } +}; + +helpers.determineScriptDirection = function (language) { + + let rightToLeftLanguages, scriptDirection; + + rightToLeftLanguages = ['ar', 'he']; + + if (rightToLeftLanguages.indexOf(language) === -1) { + scriptDirection = 'ltr'; + } else { + scriptDirection = 'rtl'; + } + + return scriptDirection; +}; + +helpers.formatVersion = function (version) { + + if (version.indexOf('beta') === -1) { + return version; + } else { + return 'BETA'; + } +}; diff --git a/pages/background/background.html b/pages/background/background.html index 06238b3f338c77c97d8bcba5dbcfa8a6c281bda5..f61861d48437ae778b4ff62e1c200e27186ea047 100644 --- a/pages/background/background.html +++ b/pages/background/background.html @@ -10,6 +10,9 @@ <body> + <script src="../../modules/internal/helpers.js"></script> + + <script src="../../core/constants.js"></script> <script src="../../core/files.js"></script> <script src="../../core/resources.js"></script> <script src="../../core/mappings.js"></script> diff --git a/pages/options/options.html b/pages/options/options.html index f75f177404b126873bb93b46c8bd1bf8d276c830..c18429774c15a9de468e75ff10a9c69a38e72041 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -18,6 +18,9 @@ <body> + <script src="../../core/constants.js"></script> + <script src="../../modules/internal/helpers.js"></script> + <script src="options.js"></script> <section class="option"> diff --git a/pages/options/options.js b/pages/options/options.js index 85988c12a054ad31a357b5317315a701d5d907d2..d91d2cc91254fc47d7e88b6e3e971d0037c0fc7a 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -19,55 +19,24 @@ var options = {}; -/** - * Constants - */ - -const WEB_PREFIX_VALUE = 'www.'; -const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length; -const VALUE_SEPARATOR = ';'; - /** * Private Methods */ -options._determineScriptDirection = function (language) { - - let rightToLeftLanguages, scriptDirection; - - rightToLeftLanguages = ['ar', 'he']; - - if (rightToLeftLanguages.indexOf(language) !== -1) { - scriptDirection = 'rtl'; - } else { - scriptDirection = 'ltr'; - } - - return scriptDirection; +options._getOptionElement = function (optionKey) { + return document.querySelector(`[data-option=${optionKey}]`); }; -options._languageIsFullySupported = function (language) { - - let languageSupported, supportedLanguages; +function _normalizeDomain (domain) { - languageSupported = false; - - supportedLanguages = ['ar', 'bg', 'zh-CN', 'zh-TW', 'nl', 'en', 'et', 'fi', - 'fr', 'de', 'he', 'hu', 'is', 'id', 'pl', 'pt-PT', 'ro', 'es', 'tr']; - - for (let supportedLanguage of supportedLanguages) { + domain = domain.toLowerCase().trim(); - if (language.search(supportedLanguage) !== -1) { - languageSupported = true; - } + if (domain.startsWith(WEB_PREFIX_VALUE)) { + domain = domain.slice(WEB_PREFIX_LENGTH); } - return languageSupported; -}; - -options._getOptionElement = function (optionKey) { - return document.querySelector('[data-option=' + optionKey + ']'); -}; + return domain; +} /** * Initializations @@ -75,13 +44,12 @@ options._getOptionElement = function (optionKey) { document.addEventListener('DOMContentLoaded', function () { - let i18nElements, scriptDirection, languageSupported, optionElements; + let scriptDirection, languageSupported, optionElements; - i18nElements = document.querySelectorAll('[data-i18n-content]'); - scriptDirection = options._determineScriptDirection(navigator.language); + scriptDirection = helpers.determineScriptDirection(navigator.language); document.body.setAttribute('dir', scriptDirection); - languageSupported = options._languageIsFullySupported(navigator.language); + languageSupported = helpers.languageIsFullySupported(navigator.language); if (languageSupported === false) { @@ -89,11 +57,7 @@ document.addEventListener('DOMContentLoaded', function () { localeNoticeElement.setAttribute('class', 'notice'); } - i18nElements.forEach(function (i18nElement) { - - let i18nMessageName = i18nElement.getAttribute('data-i18n-content'); - i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName); - }); + helpers.insertI18nContentIntoDocument(document); optionElements = { 'showIconBadge': options._getOptionElement('showIconBadge'), @@ -111,7 +75,7 @@ document.addEventListener('DOMContentLoaded', function () { domainWhitelist = ''; Object.keys(whitelistedDomains).forEach(function (domain) { - domainWhitelist = domainWhitelist + domain + ';'; + domainWhitelist = `${domainWhitelist}${domain};`; }); domainWhitelist = domainWhitelist.slice(0, -1); @@ -132,11 +96,11 @@ document.addEventListener('DOMContentLoaded', function () { optionType = target.getAttribute('type'); switch (optionType) { - case 'checkbox': - optionValue = target.checked; - break; - default: - optionValue = target.value; + case 'checkbox': + optionValue = target.checked; + break; + default: + optionValue = target.value; } if (optionKey === 'disablePrefetch') { @@ -145,7 +109,7 @@ document.addEventListener('DOMContentLoaded', function () { // Restore default values of related preference values. chrome.privacy.network.networkPredictionEnabled.clear({}); - + } else { chrome.privacy.network.networkPredictionEnabled.set({ @@ -157,7 +121,7 @@ document.addEventListener('DOMContentLoaded', function () { if (optionKey === 'whitelistedDomains') { let domainWhitelist = optionValue; - + optionValue = {}; domainWhitelist.split(VALUE_SEPARATOR).forEach(function (domain) { @@ -176,18 +140,3 @@ document.addEventListener('DOMContentLoaded', function () { optionElements.stripMetadata.addEventListener('change', optionChangedHandler); optionElements.whitelistedDomains.addEventListener('keyup', optionChangedHandler); }); - -/** - * Private Methods - */ - -function _normalizeDomain(domain) { - - domain = domain.toLowerCase().trim(); - - if (domain.startsWith(WEB_PREFIX_VALUE)) { - domain = domain.slice(WEB_PREFIX_LENGTH); - } - - return domain; -} diff --git a/pages/popup/popup.html b/pages/popup/popup.html index 53dab5808455c4fb98027736be521a7eb3b12856..9b82ff5cbbedaa56c4dc08f7446388a8e6ed43d7 100644 --- a/pages/popup/popup.html +++ b/pages/popup/popup.html @@ -18,6 +18,9 @@ <body> + <script src="../../core/constants.js"></script> + <script src="../../modules/internal/helpers.js"></script> + <script src="popup.js"></script> <header> @@ -61,7 +64,7 @@ <span id="testing-utility-link" class="link-text">decentraleyes.org/test</span> - <div id="options-button" class="button"> + <div id="options-button" class="button" data-i18n-title="optionsTitle"> <i class="fas fa-cog" data-fa-transform="grow-2"></i> </div> diff --git a/pages/popup/popup.js b/pages/popup/popup.js index af2996f757b96c4a345e005952bd3592a9f97a7d..cda7eaf5683216a1aaa14aec89be182811afc762 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -19,75 +19,31 @@ var popup = {}; -/** - * Constants - */ - -const WEB_DOMAIN_EXPRESSION = /:\/\/(.[^\/]+)(.*)/; -const WEB_PREFIX_VALUE = 'www.'; -const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length; - -/** - * Private Methods - */ - -popup._determineScriptDirection = function (language) { - - let rightToLeftLanguages, scriptDirection; - - rightToLeftLanguages = ['ar', 'he']; - - if (rightToLeftLanguages.indexOf(language) !== -1) { - scriptDirection = 'rtl'; - } else { - scriptDirection = 'ltr'; - } - - return scriptDirection; -}; - /** * Initializations */ document.addEventListener('DOMContentLoaded', function () { - let version, optionsButtonElement, optionsTitle, scriptDirection, i18nElements; - - version = browser.runtime.getManifest().version; - - if (version.indexOf('beta') !== -1) { - version = 'BETA'; - } + let version, optionsButtonElement, scriptDirection; + version = helpers.formatVersion(browser.runtime.getManifest().version); document.getElementById('version-label').innerText = version; + scriptDirection = helpers.determineScriptDirection(navigator.language); optionsButtonElement = document.getElementById('options-button'); - optionsTitle = chrome.i18n.getMessage('optionsTitle'); - - scriptDirection = popup._determineScriptDirection(navigator.language); - - optionsButtonElement.setAttribute('title', optionsTitle); - optionsButtonElement.setAttribute('dir', scriptDirection); - i18nElements = document.querySelectorAll('[data-i18n-content]'); - - i18nElements.forEach(function (i18nElement) { - - let i18nMessageName = i18nElement.getAttribute('data-i18n-content'); - - i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName); - i18nElement.setAttribute('dir', scriptDirection); - }); + helpers.insertI18nContentIntoDocument(document); + helpers.insertI18nTitlesIntoDocument(document); chrome.storage.local.get('amountInjected', function (items) { let amountInjected = items.amountInjected || 0; document.getElementById('injection-counter').innerText = amountInjected; - chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) { - browser.runtime.getBackgroundPage().then(function (backgroundPage) { + chrome.runtime.getBackgroundPage(function (backgroundPage) { if (backgroundPage === null) { return; @@ -130,18 +86,16 @@ document.addEventListener('DOMContentLoaded', function () { domainIndicatorElement.innerText = domain; - if (!backgroundPage.requestAnalyzer.whitelistedDomains[domain]) { + if (backgroundPage.requestAnalyzer.whitelistedDomains[domain]) { - protectionToggleElement.setAttribute('class', 'button button-toggle active'); + protectionToggleElement.setAttribute('class', 'button button-toggle'); - let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle'); - - protectionToggleElement.setAttribute('title', disableProtectionTitle); - protectionToggleElement.setAttribute('dir', scriptDirection); + let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle'); + protectionToggleElement.setAttribute('title', enableProtectionTitle); protectionToggleElement.addEventListener('click', function () { - backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () { + backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () { chrome.tabs.reload(tabs[0].id); @@ -158,14 +112,16 @@ document.addEventListener('DOMContentLoaded', function () { } else { - protectionToggleElement.setAttribute('class', 'button button-toggle'); + protectionToggleElement.setAttribute('class', 'button button-toggle active'); - let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle'); - protectionToggleElement.setAttribute('title', enableProtectionTitle); + let disableProtectionTitle = chrome.i18n.getMessage('disableProtectionTitle'); + + protectionToggleElement.setAttribute('title', disableProtectionTitle); + protectionToggleElement.setAttribute('dir', scriptDirection); protectionToggleElement.addEventListener('click', function () { - backgroundPage.stateManager.deleteDomainFromWhitelist(domain).then(function () { + backgroundPage.stateManager.addDomainToWhitelist(domain).then(function () { chrome.tabs.reload(tabs[0].id); @@ -216,42 +172,7 @@ document.addEventListener('DOMContentLoaded', function () { badgeTextNode = document.createTextNode(cdn.length); badgeElement.appendChild(badgeTextNode); - switch (injectionSource) { - - case 'ajax.googleapis.com': - cdnName = 'Google Hosted Libraries'; - break; - case 'ajax.aspnetcdn.com': - cdnName = 'Microsoft Ajax CDN'; - break; - case 'ajax.microsoft.com': - cdnName = 'Microsoft Ajax CDN [Deprecated]'; - break; - case 'cdnjs.cloudflare.com': - cdnName = 'CDNJS (Cloudflare)'; - break; - case 'code.jquery.com': - cdnName = 'jQuery CDN (MaxCDN)'; - break; - case 'cdn.jsdelivr.net': - cdnName = 'jsDelivr (MaxCDN)'; - break; - case 'yastatic.net': - cdnName = 'Yandex CDN'; - break; - case 'yandex.st': - cdnName = 'Yandex CDN [Deprecated]'; - break; - case 'libs.baidu.com': - cdnName = 'Baidu CDN'; - break; - case 'lib.sinaapp.com': - cdnName = 'Sina Public Resources'; - break; - case 'upcdn.b0.upaiyun.com': - cdnName = 'UpYun Library'; - break; - } + cdnName = helpers.determineCdnName(injectionSource); cdnNameTextNode = document.createTextNode(cdnName); @@ -276,59 +197,15 @@ document.addEventListener('DOMContentLoaded', function () { resourcePathDetails = injection.path.split('/'); resourceFilename = resourcePathDetails[resourcePathDetails.length - 1]; - switch (resourceFilename) { - - case 'angular.min.js.dec': - resourceName = 'AngularJS'; - break; - case 'backbone-min.js.dec': - resourceName = 'Backbone.js'; - break; - case 'dojo.js.dec': - resourceName = 'Dojo'; - break; - case 'ember.min.js.dec': - resourceName = 'Ember.js'; - break; - case 'ext-core.js.dec': - resourceName = 'Ext Core'; - break; - case 'jquery.min.js.dec': - resourceName = 'jQuery'; - break; - case 'jquery-ui.min.js.dec': - resourceName = 'jQuery UI'; - break; - case 'modernizr.min.js.dec': - resourceName = 'Modernizr'; - break; - case 'mootools-yui-compressed.js.dec': - resourceName = 'MooTools'; - break; - case 'prototype.js.dec': - resourceName = 'Prototype'; - break; - case 'scriptaculous.js.dec': - resourceName = 'Scriptaculous'; - break; - case 'swfobject.js.dec': - resourceName = 'SWFObject'; - break; - case 'underscore-min.js.dec': - resourceName = 'Underscore.js'; - break; - case 'webfont.js.dec': - resourceName = 'Web Font Loader'; - break; - } - - resourceNameTextNode = document.createTextNode('- ' + resourceName); + resourceName = helpers.determineResourceName(resourceFilename); + + resourceNameTextNode = document.createTextNode(`- ${resourceName}`); subListItemElement.appendChild(resourceNameTextNode); sideNoteElement = document.createElement('span'); sideNoteElement.setAttribute('class', 'side-note'); - sideNoteTextNode = document.createTextNode(' v' + injection.version); + sideNoteTextNode = document.createTextNode(` v${injection.version}`); sideNoteElement.appendChild(sideNoteTextNode); subListItemElement.appendChild(sideNoteElement); @@ -363,7 +240,7 @@ document.addEventListener('DOMContentLoaded', function () { if (event.button === 0 || event.button === 1) { - browser.tabs.create({ + chrome.tabs.create({ 'url': 'https://decentraleyes.org/test', 'active': (event.button === 0) });