summaryrefslogtreecommitdiff
path: root/src/content/content.js
diff options
context:
space:
mode:
authorhackademix2018-07-01 01:01:23 +0200
committerhackademix2018-07-01 01:01:23 +0200
commiteceae7187a6f0e9510bc1165f6977256b87f490f (patch)
treed943f1ec73c09efa70954dcedb55eac82a726148 /src/content/content.js
downloadnoscript-eceae7187a6f0e9510bc1165f6977256b87f490f.tar.gz
noscript-eceae7187a6f0e9510bc1165f6977256b87f490f.tar.xz
noscript-eceae7187a6f0e9510bc1165f6977256b87f490f.zip
Initial commit starting at version 10.1.8.3rc4.
Diffstat (limited to 'src/content/content.js')
-rw-r--r--src/content/content.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/content/content.js b/src/content/content.js
new file mode 100644
index 0000000..5ba5076
--- /dev/null
+++ b/src/content/content.js
@@ -0,0 +1,107 @@
+'use strict';
+
+ // debug = () => {}; // XPI_ONLY
+
+var _ = browser.i18n.getMessage;
+
+var canScript = true;
+
+var embeddingDocument = false;
+
+var seen = {
+ _map: new Map(),
+ _list: null,
+ record(event) {
+ let key = event.request.key;
+ if (this._map.has(key)) return;
+ this._map.set(key, event);
+ this._list = null;
+ },
+ get list() {
+ return this._list || (this._list = [...this._map.values()]);
+ }
+}
+
+var handlers = {
+
+ seen(event) {
+ let {allowed, policyType, request, ownFrame} = event;
+ if (window.top === window) {
+ seen.record(event);
+ }
+ if (ownFrame) {
+ init();
+ if (!allowed && PlaceHolder.canReplace(policyType)) {
+ request.embeddingDocument = embeddingDocument;
+ PlaceHolder.create(policyType, request);
+ }
+ }
+ },
+
+ collect(event) {
+ let list = seen.list;
+ debug("COLLECT", list);
+ return list;
+ }
+};
+
+browser.runtime.onMessage.addListener(async event => {
+ if (event.type in handlers) {
+ debug("Received message", event);
+ return handlers[event.type](event);
+ }
+});
+
+if (document.readyState !== "complete") {
+ let pageshown = e => {
+ removeEventListener("pageshow", pageshown);
+ init();
+ };
+ addEventListener("pageshow", pageshown);
+} else init();
+
+let notifyPage = () => {
+ if (document.readyState === "complete") {
+ browser.runtime.sendMessage({type: "pageshow", seen, canScript});
+ return true;
+ }
+ return false;
+}
+
+
+async function init() {
+ try {
+ canScript = await browser.runtime.sendMessage({type: "canScript"});
+ init = () => {};
+ debug("canScript:", canScript);
+ } catch (e) {
+ // background script not initialized yet?
+ setTimeout(() => init(), 100);
+ return;
+ }
+
+ if (!canScript) onScriptDisabled();
+ seen.record({
+ request: {
+ key: "noscript-probe",
+ url: document.URL,
+ documentUrl: document.URL,
+ type: window === window.top ? "main_frame" : "script",
+ },
+ allowed: canScript
+ }
+ );
+
+ debug(`Loading NoScript in document %s, scripting=%s, content type %s readyState %s`,
+ document.URL, canScript, document.contentType, document.readyState);
+
+ if (/application|video|audio/.test(document.contentType)) {
+ debug("Embedding document detected");
+ embeddingDocument = true;
+ window.addEventListener("pageshow", e => {
+ debug("Active content still in document %s: %o", document.url, document.querySelectorAll("embed,object,video,audio"));
+ }, true);
+ // document.write("<plaintext>");
+ }
+ notifyPage() || addEventListener("pageshow", notifyPage);
+};