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",