summaryrefslogtreecommitdiffstats
path: root/src/js/surrogates.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/surrogates.js')
-rw-r--r--src/js/surrogates.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/js/surrogates.js b/src/js/surrogates.js
new file mode 100644
index 0000000..5389afd
--- /dev/null
+++ b/src/js/surrogates.js
@@ -0,0 +1,87 @@
+/*
+ *
+ * This file is part of Privacy Badger <https://www.eff.org/privacybadger>
+ * Copyright (C) 2016 Electronic Frontier Foundation
+ *
+ * Privacy Badger is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Privacy Badger is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Privacy Badger. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+require.scopes.surrogates = (function() {
+
+const db = require('surrogatedb');
+
+/**
+ * Blocking tracking scripts (trackers) can cause parts of webpages to break.
+ * Surrogate scripts are dummy pieces of JavaScript meant to supply just enough
+ * of the original tracker's functionality to allow pages to continue working.
+ *
+ * This method gets called within request-blocking listeners:
+ * It needs to be fast!
+ *
+ * @param {String} script_url The full URL of the script resource being requested.
+ *
+ * @param {String} script_hostname The hostname component of the script_url
+ * parameter. This is an optimization: the calling context should already have
+ * this information.
+ *
+ * @return {(String|Boolean)} The surrogate script as a data URI when there is a
+ * match, or boolean false when there is no match.
+ */
+function getSurrogateURI(script_url, script_hostname) {
+ // do we have an entry for the script hostname?
+ if (db.hostnames.hasOwnProperty(script_hostname)) {
+ const tokens = db.hostnames[script_hostname];
+
+ // it's a wildcard token
+ if (_.isString(tokens)) {
+ if (db.surrogates.hasOwnProperty(tokens)) {
+ // return the surrogate code
+ return 'data:application/javascript;base64,' + btoa(db.surrogates[tokens]);
+ }
+ }
+
+ // must be an array of suffix tokens
+ const qs_start = script_url.indexOf('?');
+
+ for (let i = 0; i < tokens.length; i++) {
+ // do any of the suffix tokens match the script URL?
+ const token = tokens[i];
+
+ let match = false;
+
+ if (qs_start == -1) {
+ if (script_url.endsWith(token)) {
+ match = true;
+ }
+ } else {
+ if (script_url.endsWith(token, qs_start)) {
+ match = true;
+ }
+ }
+
+ if (match) {
+ // there is a match, return the surrogate code
+ return 'data:application/javascript;base64,' + btoa(db.surrogates[token]);
+ }
+ }
+ }
+
+ return false;
+}
+
+const exports = {
+ getSurrogateURI: getSurrogateURI,
+};
+
+return exports;
+})();