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