From 2559457d0bac15dfc9e6a7ea38d4a865e58b5fb1 Mon Sep 17 00:00:00 2001 From: Thomas Rientjes <synzvato@protonmail.com> Date: Tue, 2 Feb 2016 20:49:05 +0100 Subject: [PATCH] Refactor existing code --- lib/data-handler.js | 39 ++-- lib/files.js | 420 ++++++++++++++++++++-------------------- lib/interceptor.js | 33 ++-- lib/request-analyzer.js | 146 +++++++------- package.json | 2 +- 5 files changed, 313 insertions(+), 327 deletions(-) diff --git a/lib/data-handler.js b/lib/data-handler.js index c4672db..13216b1 100644 --- a/lib/data-handler.js +++ b/lib/data-handler.js @@ -18,10 +18,7 @@ */ var { Cc, Ci } = require('chrome'); - var self = require('sdk/self'); -var resourceData = self.data; -var version = self.version; //noinspection JSUnresolvedFunction var ioService = Cc['@mozilla.org/network/io-service;1'] @@ -33,6 +30,18 @@ var ioService = Cc['@mozilla.org/network/io-service;1'] */ var files = require('./files'); +/** + * Constants + */ + +const DELIVERY_NOTICE = '/**\n * Local delivery by Decentraleyes (' + self.version + ').\n */\n\n'; + +/** + * Variables + */ + +var resourceData = self.data; + /** * Public Methods */ @@ -41,8 +50,8 @@ function getRedirectionURI(targetPath, characterSet, type) { var data, dataURI, redirectionURI; - data = loadResource(targetPath); - dataURI = buildDataURI(type, characterSet, data); + data = _loadResource(targetPath); + dataURI = _buildDataURI(type, characterSet, data); redirectionURI = ioService.newURI(dataURI, null, null); return redirectionURI; @@ -58,39 +67,31 @@ exports.getRedirectionURI = getRedirectionURI; * Private Methods */ -function loadResource(targetPath) { +function _loadResource(targetPath) { var resource; // Find the result inside a static path index. - if (files.indexOf(targetPath) == -1) { + if (!files[targetPath]) { throw 'The requested resource is missing.'; } // Attempt to load resource contents. - try { - resource = resourceData.load(targetPath); - } catch (exception) { - throw exception; - } - - return resource; + return resource = resourceData.load(targetPath); } -function buildDataURI(type, characterSet, data) { +function _buildDataURI(type, characterSet, data) { - var addNotice, dataURI, notice; + var addNotice, dataURI; //noinspection JSUnresolvedVariable addNotice = require('sdk/simple-prefs').prefs.addNotice; - dataURI = 'data:' + type + ';charset=' + characterSet + ','; - notice = '/**\n * Local delivery by Decentraleyes (' + version + ').\n */\n\n'; if (!addNotice) { dataURI = dataURI + encodeURIComponent(data); } else { - dataURI = dataURI + encodeURIComponent(notice + data); + dataURI = dataURI + encodeURIComponent(DELIVERY_NOTICE + data); } return dataURI; diff --git a/lib/files.js b/lib/files.js index 655c120..e663c18 100644 --- a/lib/files.js +++ b/lib/files.js @@ -17,244 +17,244 @@ * Files */ -var files = [ +var files = { // AngularJS - 'resources/angularjs/1.0.1/angular.min.js.dec', - 'resources/angularjs/1.0.2/angular.min.js.dec', - 'resources/angularjs/1.0.3/angular.min.js.dec', - 'resources/angularjs/1.0.4/angular.min.js.dec', - 'resources/angularjs/1.0.5/angular.min.js.dec', - 'resources/angularjs/1.0.6/angular.min.js.dec', - 'resources/angularjs/1.0.8/angular.min.js.dec', - 'resources/angularjs/1.2.0/angular.min.js.dec', - 'resources/angularjs/1.2.1/angular.min.js.dec', - 'resources/angularjs/1.2.10/angular.min.js.dec', - 'resources/angularjs/1.2.15/angular.min.js.dec', - 'resources/angularjs/1.2.16/angular.min.js.dec', - 'resources/angularjs/1.2.20/angular.min.js.dec', - 'resources/angularjs/1.2.23/angular.min.js.dec', - 'resources/angularjs/1.2.26/angular.min.js.dec', - 'resources/angularjs/1.2.28/angular.min.js.dec', - 'resources/angularjs/1.2.29/angular.min.js.dec', - 'resources/angularjs/1.3.0/angular.min.js.dec', - 'resources/angularjs/1.3.3/angular.min.js.dec', - 'resources/angularjs/1.3.8/angular.min.js.dec', - 'resources/angularjs/1.3.10/angular.min.js.dec', - 'resources/angularjs/1.3.11/angular.min.js.dec', - 'resources/angularjs/1.3.14/angular.min.js.dec', - 'resources/angularjs/1.3.15/angular.min.js.dec', - 'resources/angularjs/1.4.0/angular.min.js.dec', - 'resources/angularjs/1.4.2/angular.min.js.dec', - 'resources/angularjs/1.4.8/angular.min.js.dec', + 'resources/angularjs/1.0.1/angular.min.js.dec': true, + 'resources/angularjs/1.0.2/angular.min.js.dec': true, + 'resources/angularjs/1.0.3/angular.min.js.dec': true, + 'resources/angularjs/1.0.4/angular.min.js.dec': true, + 'resources/angularjs/1.0.5/angular.min.js.dec': true, + 'resources/angularjs/1.0.6/angular.min.js.dec': true, + 'resources/angularjs/1.0.8/angular.min.js.dec': true, + 'resources/angularjs/1.2.0/angular.min.js.dec': true, + 'resources/angularjs/1.2.1/angular.min.js.dec': true, + 'resources/angularjs/1.2.10/angular.min.js.dec': true, + 'resources/angularjs/1.2.15/angular.min.js.dec': true, + 'resources/angularjs/1.2.16/angular.min.js.dec': true, + 'resources/angularjs/1.2.20/angular.min.js.dec': true, + 'resources/angularjs/1.2.23/angular.min.js.dec': true, + 'resources/angularjs/1.2.26/angular.min.js.dec': true, + 'resources/angularjs/1.2.28/angular.min.js.dec': true, + 'resources/angularjs/1.2.29/angular.min.js.dec': true, + 'resources/angularjs/1.3.0/angular.min.js.dec': true, + 'resources/angularjs/1.3.3/angular.min.js.dec': true, + 'resources/angularjs/1.3.8/angular.min.js.dec': true, + 'resources/angularjs/1.3.10/angular.min.js.dec': true, + 'resources/angularjs/1.3.11/angular.min.js.dec': true, + 'resources/angularjs/1.3.14/angular.min.js.dec': true, + 'resources/angularjs/1.3.15/angular.min.js.dec': true, + 'resources/angularjs/1.4.0/angular.min.js.dec': true, + 'resources/angularjs/1.4.2/angular.min.js.dec': true, + 'resources/angularjs/1.4.8/angular.min.js.dec': true, // Backbone.js - 'resources/backbone.js/0.9.0/backbone-min.js.dec', - 'resources/backbone.js/0.9.1/backbone-min.js.dec', - 'resources/backbone.js/0.9.2/backbone-min.js.dec', - 'resources/backbone.js/0.9.9/backbone-min.js.dec', - 'resources/backbone.js/0.9.10/backbone-min.js.dec', - 'resources/backbone.js/1.0.0/backbone-min.js.dec', - 'resources/backbone.js/1.1.0/backbone-min.js.dec', - 'resources/backbone.js/1.1.1/backbone-min.js.dec', - 'resources/backbone.js/1.1.2/backbone-min.js.dec', - 'resources/backbone.js/1.2.0/backbone-min.js.dec', - 'resources/backbone.js/1.2.1/backbone-min.js.dec', - 'resources/backbone.js/1.2.2/backbone-min.js.dec', - 'resources/backbone.js/1.2.3/backbone-min.js.dec', + 'resources/backbone.js/0.9.0/backbone-min.js.dec': true, + 'resources/backbone.js/0.9.1/backbone-min.js.dec': true, + 'resources/backbone.js/0.9.2/backbone-min.js.dec': true, + 'resources/backbone.js/0.9.9/backbone-min.js.dec': true, + 'resources/backbone.js/0.9.10/backbone-min.js.dec': true, + 'resources/backbone.js/1.0.0/backbone-min.js.dec': true, + 'resources/backbone.js/1.1.0/backbone-min.js.dec': true, + 'resources/backbone.js/1.1.1/backbone-min.js.dec': true, + 'resources/backbone.js/1.1.2/backbone-min.js.dec': true, + 'resources/backbone.js/1.2.0/backbone-min.js.dec': true, + 'resources/backbone.js/1.2.1/backbone-min.js.dec': true, + 'resources/backbone.js/1.2.2/backbone-min.js.dec': true, + 'resources/backbone.js/1.2.3/backbone-min.js.dec': true, // Dojo - 'resources/dojo/1.4.1/dojo/dojo.js.dec', - 'resources/dojo/1.4.5/dojo/dojo.js.dec', - 'resources/dojo/1.5.0/dojo/dojo.js.dec', - 'resources/dojo/1.6.1/dojo/dojo.js.dec', - 'resources/dojo/1.7.5/dojo/dojo.js.dec', - 'resources/dojo/1.8.3/dojo/dojo.js.dec', - 'resources/dojo/1.8.7/dojo/dojo.js.dec', - 'resources/dojo/1.8.9/dojo/dojo.js.dec', - 'resources/dojo/1.9.1/dojo/dojo.js.dec', - 'resources/dojo/1.9.3/dojo/dojo.js.dec', - 'resources/dojo/1.9.7/dojo/dojo.js.dec', - 'resources/dojo/1.10.4/dojo/dojo.js.dec', + 'resources/dojo/1.4.1/dojo/dojo.js.dec': true, + 'resources/dojo/1.4.5/dojo/dojo.js.dec': true, + 'resources/dojo/1.5.0/dojo/dojo.js.dec': true, + 'resources/dojo/1.6.1/dojo/dojo.js.dec': true, + 'resources/dojo/1.7.5/dojo/dojo.js.dec': true, + 'resources/dojo/1.8.3/dojo/dojo.js.dec': true, + 'resources/dojo/1.8.7/dojo/dojo.js.dec': true, + 'resources/dojo/1.8.9/dojo/dojo.js.dec': true, + 'resources/dojo/1.9.1/dojo/dojo.js.dec': true, + 'resources/dojo/1.9.3/dojo/dojo.js.dec': true, + 'resources/dojo/1.9.7/dojo/dojo.js.dec': true, + 'resources/dojo/1.10.4/dojo/dojo.js.dec': true, // Ember.js - 'resources/ember.js/1.0.1/ember.min.js.dec', - 'resources/ember.js/1.1.3/ember.min.js.dec', - 'resources/ember.js/1.2.2/ember.min.js.dec', - 'resources/ember.js/1.3.2/ember.min.js.dec', - 'resources/ember.js/1.4.0/ember.min.js.dec', - 'resources/ember.js/1.5.1/ember.min.js.dec', - 'resources/ember.js/2.0.0/ember.min.js.dec', - 'resources/ember.js/2.0.2/ember.min.js.dec', - 'resources/ember.js/2.1.0/ember.min.js.dec', + 'resources/ember.js/1.0.1/ember.min.js.dec': true, + 'resources/ember.js/1.1.3/ember.min.js.dec': true, + 'resources/ember.js/1.2.2/ember.min.js.dec': true, + 'resources/ember.js/1.3.2/ember.min.js.dec': true, + 'resources/ember.js/1.4.0/ember.min.js.dec': true, + 'resources/ember.js/1.5.1/ember.min.js.dec': true, + 'resources/ember.js/2.0.0/ember.min.js.dec': true, + 'resources/ember.js/2.0.2/ember.min.js.dec': true, + 'resources/ember.js/2.1.0/ember.min.js.dec': true, // Ext Core - 'resources/ext-core/3.0.0/ext-core.js.dec', - 'resources/ext-core/3.1.0/ext-core.js.dec', + 'resources/ext-core/3.0.0/ext-core.js.dec': true, + 'resources/ext-core/3.1.0/ext-core.js.dec': true, // jQuery - 'resources/jquery/1.2.3/jquery.min.js.dec', - 'resources/jquery/1.2.6/jquery.min.js.dec', - 'resources/jquery/1.3.0/jquery.min.js.dec', - 'resources/jquery/1.3.1/jquery.min.js.dec', - 'resources/jquery/1.3.2/jquery.min.js.dec', - 'resources/jquery/1.4.0/jquery.min.js.dec', - 'resources/jquery/1.4.1/jquery.min.js.dec', - 'resources/jquery/1.4.2/jquery.min.js.dec', - 'resources/jquery/1.4.3/jquery.min.js.dec', - 'resources/jquery/1.4.4/jquery.min.js.dec', - 'resources/jquery/1.5.0/jquery.min.js.dec', - 'resources/jquery/1.5.1/jquery.min.js.dec', - 'resources/jquery/1.5.2/jquery.min.js.dec', - 'resources/jquery/1.6.0/jquery.min.js.dec', - 'resources/jquery/1.6.1/jquery.min.js.dec', - 'resources/jquery/1.6.2/jquery.min.js.dec', - 'resources/jquery/1.6.3/jquery.min.js.dec', - 'resources/jquery/1.6.4/jquery.min.js.dec', - 'resources/jquery/1.7.0/jquery.min.js.dec', - 'resources/jquery/1.7.1/jquery.min.js.dec', - 'resources/jquery/1.7.2/jquery.min.js.dec', - 'resources/jquery/1.8.0/jquery.min.js.dec', - 'resources/jquery/1.8.1/jquery.min.js.dec', - 'resources/jquery/1.8.2/jquery.min.js.dec', - 'resources/jquery/1.8.3/jquery.min.js.dec', - 'resources/jquery/1.9.0/jquery.min.js.dec', - 'resources/jquery/1.9.1/jquery.min.js.dec', - 'resources/jquery/1.10.0/jquery.min.js.dec', - 'resources/jquery/1.10.1/jquery.min.js.dec', - 'resources/jquery/1.10.2/jquery.min.js.dec', - 'resources/jquery/1.11.0/jquery.min.js.dec', - 'resources/jquery/1.11.1/jquery.min.js.dec', - 'resources/jquery/1.11.2/jquery.min.js.dec', - 'resources/jquery/1.11.3/jquery.min.js.dec', - 'resources/jquery/2.0.0/jquery.min.js.dec', - 'resources/jquery/2.0.1/jquery.min.js.dec', - 'resources/jquery/2.0.2/jquery.min.js.dec', - 'resources/jquery/2.0.3/jquery.min.js.dec', - 'resources/jquery/2.1.0/jquery.min.js.dec', - 'resources/jquery/2.1.1/jquery.min.js.dec', - 'resources/jquery/2.1.3/jquery.min.js.dec', - 'resources/jquery/2.1.4/jquery.min.js.dec', + 'resources/jquery/1.2.3/jquery.min.js.dec': true, + 'resources/jquery/1.2.6/jquery.min.js.dec': true, + 'resources/jquery/1.3.0/jquery.min.js.dec': true, + 'resources/jquery/1.3.1/jquery.min.js.dec': true, + 'resources/jquery/1.3.2/jquery.min.js.dec': true, + 'resources/jquery/1.4.0/jquery.min.js.dec': true, + 'resources/jquery/1.4.1/jquery.min.js.dec': true, + 'resources/jquery/1.4.2/jquery.min.js.dec': true, + 'resources/jquery/1.4.3/jquery.min.js.dec': true, + 'resources/jquery/1.4.4/jquery.min.js.dec': true, + 'resources/jquery/1.5.0/jquery.min.js.dec': true, + 'resources/jquery/1.5.1/jquery.min.js.dec': true, + 'resources/jquery/1.5.2/jquery.min.js.dec': true, + 'resources/jquery/1.6.0/jquery.min.js.dec': true, + 'resources/jquery/1.6.1/jquery.min.js.dec': true, + 'resources/jquery/1.6.2/jquery.min.js.dec': true, + 'resources/jquery/1.6.3/jquery.min.js.dec': true, + 'resources/jquery/1.6.4/jquery.min.js.dec': true, + 'resources/jquery/1.7.0/jquery.min.js.dec': true, + 'resources/jquery/1.7.1/jquery.min.js.dec': true, + 'resources/jquery/1.7.2/jquery.min.js.dec': true, + 'resources/jquery/1.8.0/jquery.min.js.dec': true, + 'resources/jquery/1.8.1/jquery.min.js.dec': true, + 'resources/jquery/1.8.2/jquery.min.js.dec': true, + 'resources/jquery/1.8.3/jquery.min.js.dec': true, + 'resources/jquery/1.9.0/jquery.min.js.dec': true, + 'resources/jquery/1.9.1/jquery.min.js.dec': true, + 'resources/jquery/1.10.0/jquery.min.js.dec': true, + 'resources/jquery/1.10.1/jquery.min.js.dec': true, + 'resources/jquery/1.10.2/jquery.min.js.dec': true, + 'resources/jquery/1.11.0/jquery.min.js.dec': true, + 'resources/jquery/1.11.1/jquery.min.js.dec': true, + 'resources/jquery/1.11.2/jquery.min.js.dec': true, + 'resources/jquery/1.11.3/jquery.min.js.dec': true, + 'resources/jquery/2.0.0/jquery.min.js.dec': true, + 'resources/jquery/2.0.1/jquery.min.js.dec': true, + 'resources/jquery/2.0.2/jquery.min.js.dec': true, + 'resources/jquery/2.0.3/jquery.min.js.dec': true, + 'resources/jquery/2.1.0/jquery.min.js.dec': true, + 'resources/jquery/2.1.1/jquery.min.js.dec': true, + 'resources/jquery/2.1.3/jquery.min.js.dec': true, + 'resources/jquery/2.1.4/jquery.min.js.dec': true, // jQuery UI - 'resources/jqueryui/1.5.3/jquery-ui.min.js.dec', - 'resources/jqueryui/1.6.0/jquery-ui.min.js.dec', - 'resources/jqueryui/1.7.3/jquery-ui.min.js.dec', - 'resources/jqueryui/1.8.24/jquery-ui.min.js.dec', - 'resources/jqueryui/1.9.2/jquery-ui.min.js.dec', - 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec', - 'resources/jqueryui/1.11.0/jquery-ui.min.js.dec', - 'resources/jqueryui/1.11.1/jquery-ui.min.js.dec', - 'resources/jqueryui/1.11.2/jquery-ui.min.js.dec', - 'resources/jqueryui/1.11.3/jquery-ui.min.js.dec', - 'resources/jqueryui/1.11.4/jquery-ui.min.js.dec', + 'resources/jqueryui/1.5.3/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.6.0/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.7.3/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.8.24/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.9.2/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.10.4/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.11.0/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.11.1/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.11.2/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.11.3/jquery-ui.min.js.dec': true, + 'resources/jqueryui/1.11.4/jquery-ui.min.js.dec': true, // Modernizr - 'resources/modernizr/2.6.2/modernizr.min.js.dec', - 'resources/modernizr/2.7.1/modernizr.min.js.dec', - 'resources/modernizr/2.7.2/modernizr.min.js.dec', - 'resources/modernizr/2.8.2/modernizr.min.js.dec', - 'resources/modernizr/2.8.3/modernizr.min.js.dec', + 'resources/modernizr/2.6.2/modernizr.min.js.dec': true, + 'resources/modernizr/2.7.1/modernizr.min.js.dec': true, + 'resources/modernizr/2.7.2/modernizr.min.js.dec': true, + 'resources/modernizr/2.8.2/modernizr.min.js.dec': true, + 'resources/modernizr/2.8.3/modernizr.min.js.dec': true, // MooTools - 'resources/mootools/1.1.1/mootools-yui-compressed.js.dec', - 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec', - 'resources/mootools/1.2.1/mootools-yui-compressed.js.dec', - 'resources/mootools/1.2.3/mootools-yui-compressed.js.dec', - 'resources/mootools/1.2.4/mootools-yui-compressed.js.dec', - 'resources/mootools/1.2.5/mootools-yui-compressed.js.dec', - 'resources/mootools/1.3.0/mootools-yui-compressed.js.dec', - 'resources/mootools/1.3.1/mootools-yui-compressed.js.dec', - 'resources/mootools/1.3.2/mootools-yui-compressed.js.dec', - 'resources/mootools/1.4.1/mootools-yui-compressed.js.dec', - 'resources/mootools/1.4.5/mootools-yui-compressed.js.dec', - 'resources/mootools/1.5.0/mootools-yui-compressed.js.dec', - 'resources/mootools/1.5.1/mootools-yui-compressed.js.dec', + 'resources/mootools/1.1.1/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.1.2/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.2.1/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.2.3/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.2.4/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.2.5/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.3.0/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.3.1/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.3.2/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.4.1/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.4.5/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.5.0/mootools-yui-compressed.js.dec': true, + 'resources/mootools/1.5.1/mootools-yui-compressed.js.dec': true, // Prototype - 'resources/prototype/1.6.0.2/prototype.js.dec', - 'resources/prototype/1.6.0.3/prototype.js.dec', - 'resources/prototype/1.6.1.0/prototype.js.dec', - 'resources/prototype/1.7.0.0/prototype.js.dec', - 'resources/prototype/1.7.1.0/prototype.js.dec', - 'resources/prototype/1.7.2.0/prototype.js.dec', - 'resources/prototype/1.7.3.0/prototype.js.dec', + 'resources/prototype/1.6.0.2/prototype.js.dec': true, + 'resources/prototype/1.6.0.3/prototype.js.dec': true, + 'resources/prototype/1.6.1.0/prototype.js.dec': true, + 'resources/prototype/1.7.0.0/prototype.js.dec': true, + 'resources/prototype/1.7.1.0/prototype.js.dec': true, + 'resources/prototype/1.7.2.0/prototype.js.dec': true, + 'resources/prototype/1.7.3.0/prototype.js.dec': true, // Scriptaculous - 'resources/scriptaculous/1.8.1/scriptaculous.js.dec', - 'resources/scriptaculous/1.8.2/scriptaculous.js.dec', - 'resources/scriptaculous/1.8.3/scriptaculous.js.dec', - 'resources/scriptaculous/1.9.0/scriptaculous.js.dec', + 'resources/scriptaculous/1.8.1/scriptaculous.js.dec': true, + 'resources/scriptaculous/1.8.2/scriptaculous.js.dec': true, + 'resources/scriptaculous/1.8.3/scriptaculous.js.dec': true, + 'resources/scriptaculous/1.9.0/scriptaculous.js.dec': true, // SWFObject - 'resources/swfobject/2.1/swfobject.js.dec', - 'resources/swfobject/2.2/swfobject.js.dec', + 'resources/swfobject/2.1/swfobject.js.dec': true, + 'resources/swfobject/2.2/swfobject.js.dec': true, // Underscore.js - 'resources/underscore.js/1.3.0/underscore-min.js.dec', - 'resources/underscore.js/1.3.1/underscore-min.js.dec', - 'resources/underscore.js/1.3.3/underscore-min.js.dec', - 'resources/underscore.js/1.4.0/underscore-min.js.dec', - 'resources/underscore.js/1.4.1/underscore-min.js.dec', - 'resources/underscore.js/1.4.2/underscore-min.js.dec', - 'resources/underscore.js/1.4.3/underscore-min.js.dec', - 'resources/underscore.js/1.4.4/underscore-min.js.dec', - 'resources/underscore.js/1.5.0/underscore-min.js.dec', - 'resources/underscore.js/1.5.1/underscore-min.js.dec', - 'resources/underscore.js/1.5.2/underscore-min.js.dec', - 'resources/underscore.js/1.6.0/underscore-min.js.dec', - 'resources/underscore.js/1.7.0/underscore-min.js.dec', - 'resources/underscore.js/1.8.0/underscore-min.js.dec', - 'resources/underscore.js/1.8.1/underscore-min.js.dec', - 'resources/underscore.js/1.8.2/underscore-min.js.dec', - 'resources/underscore.js/1.8.3/underscore-min.js.dec', + 'resources/underscore.js/1.3.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.3.1/underscore-min.js.dec': true, + 'resources/underscore.js/1.3.3/underscore-min.js.dec': true, + 'resources/underscore.js/1.4.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.4.1/underscore-min.js.dec': true, + 'resources/underscore.js/1.4.2/underscore-min.js.dec': true, + 'resources/underscore.js/1.4.3/underscore-min.js.dec': true, + 'resources/underscore.js/1.4.4/underscore-min.js.dec': true, + 'resources/underscore.js/1.5.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.5.1/underscore-min.js.dec': true, + 'resources/underscore.js/1.5.2/underscore-min.js.dec': true, + 'resources/underscore.js/1.6.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.7.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.8.0/underscore-min.js.dec': true, + 'resources/underscore.js/1.8.1/underscore-min.js.dec': true, + 'resources/underscore.js/1.8.2/underscore-min.js.dec': true, + 'resources/underscore.js/1.8.3/underscore-min.js.dec': true, // Web Font Loader - 'resources/webfont/1.0.0/webfont.js.dec', - 'resources/webfont/1.0.1/webfont.js.dec', - 'resources/webfont/1.0.2/webfont.js.dec', - 'resources/webfont/1.0.3/webfont.js.dec', - 'resources/webfont/1.0.4/webfont.js.dec', - 'resources/webfont/1.0.5/webfont.js.dec', - 'resources/webfont/1.0.6/webfont.js.dec', - 'resources/webfont/1.0.9/webfont.js.dec', - 'resources/webfont/1.0.10/webfont.js.dec', - 'resources/webfont/1.0.11/webfont.js.dec', - 'resources/webfont/1.0.12/webfont.js.dec', - 'resources/webfont/1.0.13/webfont.js.dec', - 'resources/webfont/1.0.14/webfont.js.dec', - 'resources/webfont/1.0.15/webfont.js.dec', - 'resources/webfont/1.0.16/webfont.js.dec', - 'resources/webfont/1.0.17/webfont.js.dec', - 'resources/webfont/1.0.18/webfont.js.dec', - 'resources/webfont/1.0.19/webfont.js.dec', - 'resources/webfont/1.0.21/webfont.js.dec', - 'resources/webfont/1.0.22/webfont.js.dec', - 'resources/webfont/1.0.23/webfont.js.dec', - 'resources/webfont/1.0.24/webfont.js.dec', - 'resources/webfont/1.0.25/webfont.js.dec', - 'resources/webfont/1.0.26/webfont.js.dec', - 'resources/webfont/1.0.27/webfont.js.dec', - 'resources/webfont/1.0.28/webfont.js.dec', - 'resources/webfont/1.0.29/webfont.js.dec', - 'resources/webfont/1.0.30/webfont.js.dec', - 'resources/webfont/1.0.31/webfont.js.dec', - 'resources/webfont/1.1.0/webfont.js.dec', - 'resources/webfont/1.1.1/webfont.js.dec', - 'resources/webfont/1.1.2/webfont.js.dec', - 'resources/webfont/1.3.0/webfont.js.dec', - 'resources/webfont/1.4.2/webfont.js.dec', - 'resources/webfont/1.4.6/webfont.js.dec', - 'resources/webfont/1.4.7/webfont.js.dec', - 'resources/webfont/1.4.8/webfont.js.dec', - 'resources/webfont/1.4.10/webfont.js.dec', - 'resources/webfont/1.5.0/webfont.js.dec', - 'resources/webfont/1.5.2/webfont.js.dec', - 'resources/webfont/1.5.3/webfont.js.dec', - 'resources/webfont/1.5.6/webfont.js.dec', - 'resources/webfont/1.5.10/webfont.js.dec', - 'resources/webfont/1.5.18/webfont.js.dec' -]; + 'resources/webfont/1.0.0/webfont.js.dec': true, + 'resources/webfont/1.0.1/webfont.js.dec': true, + 'resources/webfont/1.0.2/webfont.js.dec': true, + 'resources/webfont/1.0.3/webfont.js.dec': true, + 'resources/webfont/1.0.4/webfont.js.dec': true, + 'resources/webfont/1.0.5/webfont.js.dec': true, + 'resources/webfont/1.0.6/webfont.js.dec': true, + 'resources/webfont/1.0.9/webfont.js.dec': true, + 'resources/webfont/1.0.10/webfont.js.dec': true, + 'resources/webfont/1.0.11/webfont.js.dec': true, + 'resources/webfont/1.0.12/webfont.js.dec': true, + 'resources/webfont/1.0.13/webfont.js.dec': true, + 'resources/webfont/1.0.14/webfont.js.dec': true, + 'resources/webfont/1.0.15/webfont.js.dec': true, + 'resources/webfont/1.0.16/webfont.js.dec': true, + 'resources/webfont/1.0.17/webfont.js.dec': true, + 'resources/webfont/1.0.18/webfont.js.dec': true, + 'resources/webfont/1.0.19/webfont.js.dec': true, + 'resources/webfont/1.0.21/webfont.js.dec': true, + 'resources/webfont/1.0.22/webfont.js.dec': true, + 'resources/webfont/1.0.23/webfont.js.dec': true, + 'resources/webfont/1.0.24/webfont.js.dec': true, + 'resources/webfont/1.0.25/webfont.js.dec': true, + 'resources/webfont/1.0.26/webfont.js.dec': true, + 'resources/webfont/1.0.27/webfont.js.dec': true, + 'resources/webfont/1.0.28/webfont.js.dec': true, + 'resources/webfont/1.0.29/webfont.js.dec': true, + 'resources/webfont/1.0.30/webfont.js.dec': true, + 'resources/webfont/1.0.31/webfont.js.dec': true, + 'resources/webfont/1.1.0/webfont.js.dec': true, + 'resources/webfont/1.1.1/webfont.js.dec': true, + 'resources/webfont/1.1.2/webfont.js.dec': true, + 'resources/webfont/1.3.0/webfont.js.dec': true, + 'resources/webfont/1.4.2/webfont.js.dec': true, + 'resources/webfont/1.4.6/webfont.js.dec': true, + 'resources/webfont/1.4.7/webfont.js.dec': true, + 'resources/webfont/1.4.8/webfont.js.dec': true, + 'resources/webfont/1.4.10/webfont.js.dec': true, + 'resources/webfont/1.5.0/webfont.js.dec': true, + 'resources/webfont/1.5.2/webfont.js.dec': true, + 'resources/webfont/1.5.3/webfont.js.dec': true, + 'resources/webfont/1.5.6/webfont.js.dec': true, + 'resources/webfont/1.5.10/webfont.js.dec': true, + 'resources/webfont/1.5.18/webfont.js.dec': true +}; /** * Exports diff --git a/lib/interceptor.js b/lib/interceptor.js index c84b666..ea447f1 100644 --- a/lib/interceptor.js +++ b/lib/interceptor.js @@ -48,6 +48,10 @@ var Interceptor = new Class({ observerService.removeObserver(this, this.topic); }, + /** + * Called whenever an HTTP request is made. + * @param httpChannel + */ observe: function (httpChannel) { var validCandidate, target, characterSet, redirectionURI; @@ -65,27 +69,21 @@ var Interceptor = new Class({ // Remove referer header from request. httpChannel.setRequestHeader('Referer', null, false); - // Temporary fix for reported issues with the Play Store website. - // Temporary fix for reported issues with the Report URI website. - var requestDomain = null; + // Temporary fixes for reported edge-case issues with specific websites. + var initiatorDomain = + httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain || + httpChannel.referrer && httpChannel.referrer.host; - if (httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain) { - requestDomain = httpChannel.loadInfo.loadingDocument.domain; - } else if (httpChannel.referrer && httpChannel.referrer.host) { - requestDomain = httpChannel.referrer.host; - } - - if (requestDomain === 'play.google.com' || requestDomain === 'report-uri.io') { - this.handleMissingCandidate(httpChannel); - return; + if (initiatorDomain === 'play.google.com' || initiatorDomain === 'passport.twitch.tv' || initiatorDomain === 'report-uri.io' + || initiatorDomain === 'minigames.mail.ru' || initiatorDomain === 'stefansundin.github.io') { + return this.handleMissingCandidate(httpChannel); } // Convert the original request URI to a local target. target = requestAnalyzer.getLocalTarget(httpChannel.URI.host, httpChannel.URI.path); if (!target) { - this.handleMissingCandidate(httpChannel); - return; + return this.handleMissingCandidate(httpChannel); } characterSet = httpChannel.URI.originCharset; @@ -94,8 +92,7 @@ var Interceptor = new Class({ try { redirectionURI = dataHandler.getRedirectionURI(target.path, characterSet, target.type); } catch (exception) { - this.handleMissingCandidate(httpChannel); - return; + return this.handleMissingCandidate(httpChannel); } httpChannel.redirectTo(redirectionURI); @@ -104,6 +101,10 @@ var Interceptor = new Class({ preferences.amountInjected++; }, + /** + * Called when a valid candidate cannot be injected. + * @param httpChannel + */ handleMissingCandidate: function (httpChannel) { //noinspection JSUnresolvedVariable diff --git a/lib/request-analyzer.js b/lib/request-analyzer.js index 32f2bf0..a9bc889 100644 --- a/lib/request-analyzer.js +++ b/lib/request-analyzer.js @@ -17,172 +17,156 @@ * Imports */ -var preferences = require('sdk/simple-prefs').prefs; - /** * Resource version mappings. * @var {object} mappings */ var mappings = require('./mappings'); +/** + * Gets and sets add-on specific preferences. + * @var {object} simplePreferences + */ +var simplePreferences = require('sdk/simple-prefs'); + +/** + * 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_PREFIX_VALUE = 'www.'; +const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length; +const VALUE_SEPARATOR = ';'; + /** * Variables */ -var whitelistedDomains = []; +var preferences = simplePreferences.prefs; +var whitelistedDomains = {}; /** * Initializations */ -applyWhitelistPreference(); +_applyWhitelistPreference(); /** * Event Handlers */ -require('sdk/simple-prefs').on('domainWhitelist', applyWhitelistPreference); - +simplePreferences.on('domainWhitelist', _applyWhitelistPreference); /** * Public Methods */ -function isValidCandidate(httpChannel) { +exports.isValidCandidate = function (httpChannel) { + // See if the request is targeted at a Content Delivery Network. if (mappings[httpChannel.URI.host] === undefined) { return false; } - var requestDomain = null; - - if (httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain) { - requestDomain = normalizeDomain(httpChannel.loadInfo.loadingDocument.domain); - } else if (httpChannel.referrer && httpChannel.referrer.host) { - requestDomain = normalizeDomain(httpChannel.referrer.host); - } - - if (whitelistedDomains.length > 0 && requestDomain !== null) { + // Attempt to determine the domain of the request initiator. + var initiatorDomain = + httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain || + httpChannel.referrer && httpChannel.referrer.host; - for (let domain of whitelistedDomains) { + // If the request initiator could be determined and is whitelisted. + if (initiatorDomain && whitelistedDomains[_normalizeDomain(initiatorDomain)]) { - if (domain === requestDomain) { - - // Remove referer header from request. - httpChannel.setRequestHeader('Referer', null, false); - return false; - } - } + // Remove referer header from request. + httpChannel.setRequestHeader('Referer', null, false); + return false; } + // Only requests of type GET can be valid candidates. return httpChannel.requestMethod === 'GET'; -} +}; -function getLocalTarget(channelHost, channelPath) { +exports.getLocalTarget = function (channelHost, channelPath) { - var basePath, hostMappings, resourceMappings, localTarget; + var hostMappings, basePath, resourceMappings; + // Use the proper mappings for the targeted host. hostMappings = mappings[channelHost]; - // Ignore mapping files. - if (channelPath.indexOf('.min.js.map') > -1) { - return false; - } - - if (channelPath.indexOf('.min.map') > -1) { - return false; - } - - basePath = matchBasePath(hostMappings, channelPath); - - if (!basePath) { + // Resource mapping files are never locally available. + if (MAPPING_FILE_EXPRESSION.test(channelPath)) { return false; } + basePath = _matchBasePath(hostMappings, channelPath); resourceMappings = hostMappings[basePath]; - localTarget = matchResourcePath(resourceMappings, basePath, channelPath); - if (!localTarget) { + if (!resourceMappings) { return false; } - return localTarget; -} - -/** - * Exports - */ - -exports.isValidCandidate = isValidCandidate; -exports.getLocalTarget = getLocalTarget; + // Return either the local target's path or false. + return _findLocalTarget(resourceMappings, basePath, channelPath); +}; /** * Private Methods */ -function matchBasePath(hostMappings, channelPath) { +function _matchBasePath(hostMappings, channelPath) { - for (let basePath in hostMappings) { + for (let basePath of Object.keys(hostMappings)) { - if (hostMappings.hasOwnProperty(basePath)) { - - if (channelPath.startsWith(basePath)) { - return basePath; - } + if (channelPath.startsWith(basePath)) { + return basePath; } } return false; } -function matchResourcePath(resourceMappings, basePath, channelPath) { +function _findLocalTarget(resourceMappings, basePath, channelPath) { var resourcePath, versionNumber, resourcePattern; resourcePath = channelPath.replace(basePath, ''); - versionNumber = resourcePath.match(/(?:\d{1,2}\.){1,3}\d{1,2}/); - resourcePattern = resourcePath.replace(versionNumber, '{version}'); - - for (let resourceMold in resourceMappings) { - - if (resourceMappings.hasOwnProperty(resourceMold)) { - - if (resourcePattern.startsWith(resourceMold)) { + versionNumber = resourcePath.match(VERSION_EXPRESSION); + resourcePattern = resourcePath.replace(versionNumber, VERSION_PLACEHOLDER); - var localTarget = { - path: resourceMappings[resourceMold].path, - type: resourceMappings[resourceMold].type - }; + for (let resourceMold of Object.keys(resourceMappings)) { - // Fill in the appropriate version number. - localTarget.path = localTarget.path.replace('{version}', versionNumber); + if (resourcePattern.startsWith(resourceMold)) { - return localTarget; - } + // Prepare and return a local target. + return { + path: resourceMappings[resourceMold].path.replace(VERSION_PLACEHOLDER, versionNumber), + type: resourceMappings[resourceMold].type + }; } } return false; } -function normalizeDomain(domain) { +function _normalizeDomain(domain) { domain = domain.toLowerCase().trim(); - if (domain.startsWith('www.')) { - domain = domain.slice(4); + if (domain.startsWith(WEB_PREFIX_VALUE)) { + domain = domain.slice(WEB_PREFIX_LENGTH); } return domain; } -function applyWhitelistPreference() { +function _applyWhitelistPreference() { - whitelistedDomains = []; + whitelistedDomains = {}; //noinspection JSUnresolvedVariable - preferences.domainWhitelist.split(';').forEach(function(domain, index) { - whitelistedDomains[index] = normalizeDomain(domain); + preferences.domainWhitelist.split(VALUE_SEPARATOR).forEach(function (domain) { + whitelistedDomains[_normalizeDomain(domain)] = true; }); } diff --git a/package.json b/package.json index a501d9a..068455c 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,6 @@ "engines": { "firefox": ">=38.0a1", "fennec": ">=38.0a1", - "seamonkey": ">=2.0" + "seamonkey": ">=2.0a1" } } -- GitLab