summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bg/RequestUtil.js18
-rw-r--r--src/lib/ContentMetaData.js31
-rw-r--r--src/lib/ResponseMetaData.js54
-rw-r--r--src/manifest.json2
4 files changed, 65 insertions, 40 deletions
diff --git a/src/bg/RequestUtil.js b/src/bg/RequestUtil.js
index 5a52975..629f270 100644
--- a/src/bg/RequestUtil.js
+++ b/src/bg/RequestUtil.js
@@ -47,8 +47,8 @@
var RequestUtil = {
- getContentMetaData(request) {
- return request.content || (request.content = new ContentMetaData(request));
+ getResponseMetaData(request) {
+ return request.response || (request.response = new ResponseMetaData(request));
},
async executeOnStart(request, details) {
@@ -63,12 +63,14 @@
return;
}
}
- let content = this.getContentMetaData(request);
- if (content.disposition) {
- debug("Skipping execute on start of %s %o", url, content);
+
+ let response = this.getResponseMetaData(request);
+ let {contentType, contentDisposition} = response;
+ if (contentDisposition) {
+ debug("Skipping execute on start of %s %o", url, response);
return;
}
- debug("Injecting script on start in %s (%o)", url, content);
+ debug("Injecting script on start in %s (%o)", url, response);
let scripts = pendingRequests.get(requestId);
let scriptKey = JSON.stringify(details);
@@ -80,12 +82,12 @@
return;
}
- if (xmlFeedOrImage.test(content.type) && !/\/svg\b/i.test(content.type)) return;
+ if (xmlFeedOrImage.test(contentType) && !/\/svg\b/i.test(contentType)) return;
if (typeof brokenXMLOnLoad === "undefined") {
brokenXMLOnLoad = await (async () => parseInt((await browser.runtime.getBrowserInfo()).version) < 61)();
}
- let mustCheckFeed = brokenXMLOnLoad && frameId === 0 && rawXml.test(content.type);
+ let mustCheckFeed = brokenXMLOnLoad && frameId === 0 && rawXml.test(contentType);
debug("mustCheckFeed = %s, brokenXMLOnLoad = %s", mustCheckFeed, brokenXMLOnLoad);
let filter = browser.webRequest.filterResponseData(requestId);
let buffer = [];
diff --git a/src/lib/ContentMetaData.js b/src/lib/ContentMetaData.js
deleted file mode 100644
index 002a212..0000000
--- a/src/lib/ContentMetaData.js
+++ /dev/null
@@ -1,31 +0,0 @@
-class ContentMetaData {
- constructor(request, defaultCharset = "utf-8") {
- this.defaultCharset = defaultCharset;
- let {responseHeaders} = request;
- for (let h of responseHeaders) {
- if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) {
- this[RegExp.$1.toLowerCase()] = h.value;
- }
- }
- }
-
- get charset() {
- let charset = this.defaultCharset;
- if (this.type) {
- let m = this.type.match(/;\s*charset\s*=\s*(\S+)/);
- if (m) {
- charset = m[1];
- }
- }
- Object.defineProperty(this, "charset", { value: charset, writable: false, configurable: true });
- return charset;
- }
-
- createDecoder() {
- try {
- return new TextDecoder(this.charset);
- } catch (e) {
- return new TextDecoder(this.defaultCharset);
- }
- }
-};
diff --git a/src/lib/ResponseMetaData.js b/src/lib/ResponseMetaData.js
new file mode 100644
index 0000000..17e1608
--- /dev/null
+++ b/src/lib/ResponseMetaData.js
@@ -0,0 +1,54 @@
+class ResponseMetaData {
+ constructor(request) {
+ let {responseHeaders} = request;
+ this.headers = {};
+ this.contentType = this.contentDisposition = null;
+ for (let h of responseHeaders) {
+ if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) {
+ let propertyName = RegExp.$1;
+ propertyName = `content${propertyName.charAt(0).toUpperCase()}${propertyName.substring(1).toLowerCase()}`;
+ this[propertyName] = h.value;
+ this.headers[propertyName] = h;
+ }
+ }
+ this.forcedUTF8 = false;
+ }
+
+ get charset() {
+ let charset = "";
+ if (this.contentType) {
+ let m = this.contentType.match(/;\s*charset\s*=\s*(\S+)/);
+ if (m) {
+ charset = m[1];
+ }
+ }
+ Object.defineProperty(this, "charset", { value: charset, writable: false, configurable: true });
+ return charset;
+ }
+
+ get isUTF8() {
+ return /^utf-8$/i.test(this.charset);
+ }
+
+ forceUTF8() {
+ if (!(this.forcedUTF8 || this.isUTF8)) {
+ let h = this.headers.contentType;
+ if (h) {
+ h.value = h.value.replace(/;\s*charset\s*=.*|$/, "; charset=utf8");
+ this.forcedUTF8 = true;
+ } // if the header doesn't exist the browser should default to UTF-8 anyway
+ }
+ return this.forcedUTF8;
+ }
+
+ createDecoder() {
+ if (this.charset) {
+ try {
+ return new TextDecoder(this.charset);
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ return new TextDecoder("utf-8");
+ }
+};
diff --git a/src/manifest.json b/src/manifest.json
index 9cb967c..acb237f 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -39,7 +39,7 @@
"lib/include.js",
"lib/punycode.js",
"lib/tld.js",
- "lib/ContentMetaData.js",
+ "lib/ResponseMetaData.js",
"common/Policy.js",
"common/locale.js",
"common/Entities.js",