Refactor ContentMetadata into ResponseMetaData.
This commit is contained in:
parent
0910566926
commit
580450b463
|
@ -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 = [];
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -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");
|
||||||
|
}
|
||||||
|
};
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in New Issue