Refactor ContentMetadata into ResponseMetaData.

This commit is contained in:
hackademix 2018-07-19 01:04:35 +02:00
parent 0910566926
commit 580450b463
4 changed files with 65 additions and 40 deletions

View File

@ -47,8 +47,8 @@
var RequestUtil = { var RequestUtil = {
getContentMetaData(request) { getResponseMetaData(request) {
return request.content || (request.content = new ContentMetaData(request)); return request.response || (request.response = new ResponseMetaData(request));
}, },
async executeOnStart(request, details) { async executeOnStart(request, details) {
@ -63,12 +63,14 @@
return; return;
} }
} }
let content = this.getContentMetaData(request);
if (content.disposition) { let response = this.getResponseMetaData(request);
debug("Skipping execute on start of %s %o", url, content); let {contentType, contentDisposition} = response;
if (contentDisposition) {
debug("Skipping execute on start of %s %o", url, response);
return; 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 scripts = pendingRequests.get(requestId);
let scriptKey = JSON.stringify(details); let scriptKey = JSON.stringify(details);
@ -80,12 +82,12 @@
return; 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") { if (typeof brokenXMLOnLoad === "undefined") {
brokenXMLOnLoad = await (async () => parseInt((await browser.runtime.getBrowserInfo()).version) < 61)(); 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); debug("mustCheckFeed = %s, brokenXMLOnLoad = %s", mustCheckFeed, brokenXMLOnLoad);
let filter = browser.webRequest.filterResponseData(requestId); let filter = browser.webRequest.filterResponseData(requestId);
let buffer = []; let buffer = [];

View File

@ -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);
}
}
};

View File

@ -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");
}
};

View File

@ -39,7 +39,7 @@
"lib/include.js", "lib/include.js",
"lib/punycode.js", "lib/punycode.js",
"lib/tld.js", "lib/tld.js",
"lib/ContentMetaData.js", "lib/ResponseMetaData.js",
"common/Policy.js", "common/Policy.js",
"common/locale.js", "common/locale.js",
"common/Entities.js", "common/Entities.js",