From cd40e32cbf10463acc0b0efb35ccd77f4a35cdd6 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Fri, 8 May 2020 19:49:03 -0500
Subject: [PATCH 001/106] Add mdn-browser-compat-data
---
.../webext-instrumentation/package-lock.json | 498 ++++++++----------
.../webext-instrumentation/package.json | 4 +-
2 files changed, 209 insertions(+), 293 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/package-lock.json b/automation/Extension/webext-instrumentation/package-lock.json
index dab42ddf1..35fcf1a35 100644
--- a/automation/Extension/webext-instrumentation/package-lock.json
+++ b/automation/Extension/webext-instrumentation/package-lock.json
@@ -1560,45 +1560,6 @@
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
"dev": true
},
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
@@ -1901,25 +1862,6 @@
}
}
},
- "conventional-changelog": {
- "version": "3.1.12",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.12.tgz",
- "integrity": "sha512-zyGKwii8Z5zOq1nGFm5jn9Ou1jQ6UBoRT0+nqBIU8fEzh64+AcVxrY97tVuK77Ati0xwpBiFHpDXAW7pkq1jEw==",
- "dev": true,
- "requires": {
- "conventional-changelog-angular": "^5.0.5",
- "conventional-changelog-atom": "^2.0.3",
- "conventional-changelog-codemirror": "^2.0.3",
- "conventional-changelog-conventionalcommits": "^4.2.1",
- "conventional-changelog-core": "^4.0.2",
- "conventional-changelog-ember": "^2.0.4",
- "conventional-changelog-eslint": "^3.0.4",
- "conventional-changelog-express": "^2.0.1",
- "conventional-changelog-jquery": "^3.0.6",
- "conventional-changelog-jshint": "^2.0.3",
- "conventional-changelog-preset-loader": "^2.2.0"
- }
- },
"conventional-changelog-angular": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz",
@@ -2108,41 +2050,6 @@
"trim-off-newlines": "^1.0.0"
}
},
- "conventional-recommended-bump": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.2.tgz",
- "integrity": "sha512-9qWhAweJbT6CAHcCprBYzUb3tySsaRrUx0ckpMprHbtWOBfl3gxakUCBNd/4T3m2Iv9Cb8Y4P2Px3cR5ysXPDw==",
- "dev": true,
- "requires": {
- "concat-stream": "^2.0.0",
- "conventional-changelog-preset-loader": "^2.2.0",
- "conventional-commits-filter": "^2.0.2",
- "conventional-commits-parser": "^3.0.5",
- "git-raw-commits": "2.0.0",
- "git-semver-tags": "^3.0.0",
- "meow": "^4.0.0",
- "q": "^1.5.1"
- },
- "dependencies": {
- "meow": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
- "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
- "dev": true,
- "requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist": "^1.1.3",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0"
- }
- }
- }
- },
"convert-source-map": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
@@ -2548,12 +2455,6 @@
"integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
"dev": true
},
- "detect-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz",
- "integrity": "sha512-JAP22dVPAqvhdRFFxK1G5GViIokyUn0UWXRNW0ztK96fsqi9cuM8w8ESbSk+T2w5OVorcMcL6m7yUg1RrX+2CA==",
- "dev": true
- },
"diff": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
@@ -2884,6 +2785,11 @@
"homedir-polyfill": "^1.0.1"
}
},
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
"extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -3649,41 +3555,6 @@
}
}
},
- "git-semver-tags": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.0.tgz",
- "integrity": "sha512-T4C/gJ9k2Bnxz+PubtcyiMtUUKrC+Nh9Q4zaECcnmVMwJgPhrNyP/Rf+YpdRqsJbCV/+kYrCH24Xg+IeAmbOPg==",
- "dev": true,
- "requires": {
- "meow": "^4.0.0",
- "semver": "^6.0.0"
- },
- "dependencies": {
- "meow": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
- "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
- "dev": true,
- "requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist": "^1.1.3",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
"gitconfiglocal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
@@ -5136,6 +5007,14 @@
"integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=",
"dev": true
},
+ "mdn-browser-compat-data": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.20.tgz",
+ "integrity": "sha512-6sS4ydJ6+/ZnSwKUN8Jtu7NzD2pobXRolYRjHupKtRBDmx+8WZG1yUdOfF9QfCNPkWKrf3GcSFEurIrnJC56Qw==",
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
"mem": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-6.1.0.tgz",
@@ -7480,31 +7359,127 @@
"dev": true,
"requires": {
"chalk": "2.4.2",
- "conventional-changelog": "3.1.12",
+ "conventional-changelog": "3.1.18",
"conventional-changelog-config-spec": "2.1.0",
- "conventional-recommended-bump": "6.0.2",
+ "conventional-changelog-conventionalcommits": "4.2.3",
+ "conventional-recommended-bump": "6.0.5",
"detect-indent": "6.0.0",
- "detect-newline": "3.0.0",
+ "detect-newline": "3.1.0",
"dotgitignore": "2.1.0",
- "figures": "3.0.0",
+ "figures": "3.1.0",
"find-up": "4.1.0",
"fs-access": "1.0.1",
- "git-semver-tags": "3.0.0",
- "semver": "6.3.0",
+ "git-semver-tags": "3.0.1",
+ "semver": "7.1.1",
"stringify-package": "1.0.1",
- "yargs": "14.2.0"
+ "yargs": "15.3.1"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "conventional-changelog": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz",
+ "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "^5.0.6",
+ "conventional-changelog-atom": "^2.0.3",
+ "conventional-changelog-codemirror": "^2.0.3",
+ "conventional-changelog-conventionalcommits": "^4.2.3",
+ "conventional-changelog-core": "^4.1.4",
+ "conventional-changelog-ember": "^2.0.4",
+ "conventional-changelog-eslint": "^3.0.4",
+ "conventional-changelog-express": "^2.0.1",
+ "conventional-changelog-jquery": "^3.0.6",
+ "conventional-changelog-jshint": "^2.0.3",
+ "conventional-changelog-preset-loader": "^2.3.0"
+ }
+ },
"conventional-changelog-config-spec": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
"integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
"dev": true
},
+ "conventional-recommended-bump": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.5.tgz",
+ "integrity": "sha512-srkferrB4kACPEbKYltZwX1CQZAEqbQkabKN444mavLRVMetzwJFJf23/+pwvtMsWbd+cc4HaleV1nHke0f8Rw==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^2.0.0",
+ "conventional-changelog-preset-loader": "^2.3.0",
+ "conventional-commits-filter": "^2.0.2",
+ "conventional-commits-parser": "^3.0.8",
+ "git-raw-commits": "2.0.0",
+ "git-semver-tags": "^3.0.1",
+ "meow": "^5.0.0",
+ "q": "^1.5.1"
+ }
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"figures": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
- "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
+ "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5"
@@ -7520,6 +7495,30 @@
"path-exists": "^4.0.0"
}
},
+ "git-semver-tags": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz",
+ "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==",
+ "dev": true,
+ "requires": {
+ "meow": "^5.0.0",
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -7560,16 +7559,76 @@
"dev": true
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz",
+ "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==",
"dev": true
},
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"stringify-package": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz",
"integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==",
"dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "yargs": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
}
}
},
@@ -8877,45 +8936,6 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -8987,112 +9007,6 @@
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
},
- "yargs": {
- "version": "14.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz",
- "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^15.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "yargs-parser": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
- "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
"yargs-parser": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
diff --git a/automation/Extension/webext-instrumentation/package.json b/automation/Extension/webext-instrumentation/package.json
index 03f91b387..a01d64619 100644
--- a/automation/Extension/webext-instrumentation/package.json
+++ b/automation/Extension/webext-instrumentation/package.json
@@ -59,7 +59,9 @@
"engines": {
"node": ">=8.9"
},
- "dependencies": {},
+ "dependencies": {
+ "mdn-browser-compat-data": "^1.0.20"
+ },
"devDependencies": {
"@types/firefox-webext-browser": "^70.0.1",
"ava": "^3.7.1",
From a2531b2cd19f1d9e53b529afa9bd48143e33f2bf Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Sat, 9 May 2020 00:58:14 -0500
Subject: [PATCH 002/106] js_instrument_modules as list
---
.../Extension/firefox/feature.js/index.js | 2 +-
.../javascript-instrument-content-scope.ts | 27 ++++++++++++-------
.../javascript-instrument-page-scope.ts | 4 +--
automation/default_browser_params.json | 2 +-
crawler.py | 5 ++--
5 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index cfdb45965..c0787aaf1 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -20,7 +20,7 @@ async function main() {
navigation_instrument:true,
cookie_instrument:true,
js_instrument:true,
- js_instrument_modules:"fingerprinting",
+ js_instrument_modules: ["fingerprinting"],
http_instrument:true,
callstack_instrument:true,
save_content:false,
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 16d74778c..d56c769a7 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -2,16 +2,22 @@ import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-a
import { jsInstruments } from "../lib/js-instruments";
import { pageScript } from "./javascript-instrument-page-scope";
-function getPageScriptAsString() {
- return (
- jsInstruments +
- "\n" +
- instrumentFingerprintingApis +
- "\n" +
- "(" +
- pageScript +
- "({jsInstruments, instrumentFingerprintingApis}));"
+function getPageScriptAsString(jsModuleRequests: string[]): string {
+ const pageScriptStrings: string[] = [String(jsInstruments)];
+ const moduleNames: string[] = ["jsInstruments"];
+
+ if (jsModuleRequests.includes("fingerprinting")) {
+ pageScriptStrings.push(String(instrumentFingerprintingApis));
+ moduleNames.push("instrumentFingerprintingApis");
+ }
+
+ pageScriptStrings.push(
+ "(",
+ String(pageScript),
+ `({${moduleNames.join(",")}}));`,
);
+
+ return pageScriptStrings.join("\n");
}
function insertScript(text, data) {
@@ -53,7 +59,8 @@ document.addEventListener(event_id.toString(), function(e: CustomEvent) {
});
export function injectJavascriptInstrumentPageScript(contentScriptConfig) {
- insertScript(getPageScriptAsString(), {
+ const jsModules: string[] = contentScriptConfig.modules;
+ insertScript(getPageScriptAsString(jsModules), {
event_id,
...contentScriptConfig,
});
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index b54857313..d3b7c75a0 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -33,7 +33,7 @@ export const pageScript = function({
* Start Instrumentation
*/
const modules = document.currentScript.getAttribute("data-modules")
- ? document.currentScript.getAttribute("data-modules").split(",")
+ ? document.currentScript.getAttribute("data-modules")
: [];
if (modules.includes("fingerprinting")) {
@@ -46,7 +46,7 @@ export const pageScript = function({
if (testing) {
console.log(
"OpenWPM: Content-side javascript instrumentation started",
- { modules },
+ modules,
new Date().toISOString(),
);
}
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index ec5c617df..d1d74dc87 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -2,7 +2,7 @@
"extension_enabled": true,
"cookie_instrument": false,
"js_instrument": false,
- "js_instrument_modules": "fingerprinting",
+ "js_instrument_modules": ["fingerprinting"],
"http_instrument": false,
"navigation_instrument": false,
"save_content": false,
diff --git a/crawler.py b/crawler.py
index 795a5d13e..1a79f15dc 100644
--- a/crawler.py
+++ b/crawler.py
@@ -24,7 +24,7 @@
NAVIGATION_INSTRUMENT = os.getenv('NAVIGATION_INSTRUMENT', '1') == '1'
JS_INSTRUMENT = os.getenv('JS_INSTRUMENT', '1') == '1'
CALLSTACK_INSTRUMENT = os.getenv('CALLSTACK_INSTRUMENT', '1') == '1'
-JS_INSTRUMENT_MODULES = os.getenv('JS_INSTRUMENT_MODULES', None)
+JS_INSTRUMENT_MODULES = os.getenv('JS_INSTRUMENT_MODULES', [])
SAVE_CONTENT = os.getenv('SAVE_CONTENT', '')
PREFS = os.getenv('PREFS', None)
DWELL_TIME = int(os.getenv('DWELL_TIME', '10'))
@@ -55,8 +55,7 @@
browser_params[i]['navigation_instrument'] = NAVIGATION_INSTRUMENT
browser_params[i]['callstack_instrument'] = CALLSTACK_INSTRUMENT
browser_params[i]['js_instrument'] = JS_INSTRUMENT
- if JS_INSTRUMENT_MODULES:
- browser_params[i]['js_instrument_modules'] = JS_INSTRUMENT_MODULES
+ browser_params[i]['js_instrument_modules'] = JS_INSTRUMENT_MODULES
if SAVE_CONTENT == '1':
browser_params[i]['save_content'] = True
elif SAVE_CONTENT == '0':
From b7403d013bccbc5c60aa8e5ba5377a101790668b Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Sat, 9 May 2020 00:58:38 -0500
Subject: [PATCH 003/106] Add mdn-browser-compat
---
.../Extension/firefox/package-lock.json | 20 ++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/automation/Extension/firefox/package-lock.json b/automation/Extension/firefox/package-lock.json
index e5881d33c..6107f72ec 100644
--- a/automation/Extension/firefox/package-lock.json
+++ b/automation/Extension/firefox/package-lock.json
@@ -7164,7 +7164,25 @@
}
},
"openwpm-webext-instrumentation": {
- "version": "file:../webext-instrumentation"
+ "version": "file:../webext-instrumentation",
+ "requires": {
+ "mdn-browser-compat-data": "^1.0.20"
+ },
+ "dependencies": {
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "mdn-browser-compat-data": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.20.tgz",
+ "integrity": "sha512-6sS4ydJ6+/ZnSwKUN8Jtu7NzD2pobXRolYRjHupKtRBDmx+8WZG1yUdOfF9QfCNPkWKrf3GcSFEurIrnJC56Qw==",
+ "requires": {
+ "extend": "3.0.2"
+ }
+ }
+ }
},
"optionator": {
"version": "0.8.2",
From d211a1c5a0807cbe715e853afaf26be2b31c4b46 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Sat, 9 May 2020 01:29:52 -0500
Subject: [PATCH 004/106] Pass a list of instrumentingFunctions
---
.../javascript-instrument-content-scope.ts | 25 ++++++++-------
.../javascript-instrument-page-scope.ts | 31 +++++++++----------
2 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index d56c769a7..478970ecb 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -3,21 +3,22 @@ import { jsInstruments } from "../lib/js-instruments";
import { pageScript } from "./javascript-instrument-page-scope";
function getPageScriptAsString(jsModuleRequests: string[]): string {
- const pageScriptStrings: string[] = [String(jsInstruments)];
- const moduleNames: string[] = ["jsInstruments"];
+ const instrumentedApis: string[] = [];
- if (jsModuleRequests.includes("fingerprinting")) {
- pageScriptStrings.push(String(instrumentFingerprintingApis));
- moduleNames.push("instrumentFingerprintingApis");
- }
+ jsModuleRequests.forEach(requestedModule => {
+ if (requestedModule == "fingerprinting") {
+ instrumentedApis.push(String(instrumentFingerprintingApis));
+ }
+ });
- pageScriptStrings.push(
- "(",
- String(pageScript),
- `({${moduleNames.join(",")}}));`,
- );
+ const pageScriptString = `
+ ${jsInstruments}
+ const instrumentedApis = [${instrumentedApis.join("\n")}];
+ (${String(pageScript)}({jsInstruments, instrumentedApis}));
+ `;
- return pageScriptStrings.join("\n");
+ console.log(pageScriptString);
+ return pageScriptString;
}
function insertScript(text, data) {
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index d3b7c75a0..f5459a56e 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -4,7 +4,7 @@
export const pageScript = function({
jsInstruments,
- instrumentFingerprintingApis,
+ instrumentedApis, // A list of functions that accept {instrumentObjectProperty, instrumentObject}
}) {
// messages the injected script
function sendMessagesToLogger($event_id, messages) {
@@ -22,28 +22,27 @@ export const pageScript = function({
sendMessagesToLogger,
);
- const testing =
- document.currentScript.getAttribute("data-testing") === "true";
- if (testing) {
- console.log("OpenWPM: Currently testing");
- (window as any).instrumentObject = instrumentObject;
- }
-
/*
* Start Instrumentation
*/
- const modules = document.currentScript.getAttribute("data-modules")
- ? document.currentScript.getAttribute("data-modules")
- : [];
-
- if (modules.includes("fingerprinting")) {
- instrumentFingerprintingApis({
+ instrumentedApis.forEach(func =>
+ func({
instrumentObjectProperty,
instrumentObject,
- });
- }
+ }),
+ );
+ /*
+ * Log if testing
+ */
+ const testing =
+ document.currentScript.getAttribute("data-testing") === "true";
if (testing) {
+ console.log("OpenWPM: Currently testing");
+ (window as any).instrumentObject = instrumentObject;
+ const modules = document.currentScript.getAttribute("data-modules")
+ ? document.currentScript.getAttribute("data-modules")
+ : [];
console.log(
"OpenWPM: Content-side javascript instrumentation started",
modules,
From 7db500b0c61cebfc134802d688f9b352467987fa Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Sat, 9 May 2020 03:32:10 -0500
Subject: [PATCH 005/106] Script to generate api data
---
.../webext-instrumentation/package-lock.json | 4 +++-
.../webext-instrumentation/package.json | 10 ++++----
.../scripts/make_mdn_browser_compat_file.js | 23 +++++++++++++++++++
.../src/lib/mdn-browser-compat-data.ts | 6 +++++
4 files changed, 37 insertions(+), 6 deletions(-)
create mode 100755 automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
create mode 100644 automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
diff --git a/automation/Extension/webext-instrumentation/package-lock.json b/automation/Extension/webext-instrumentation/package-lock.json
index 35fcf1a35..684d444e2 100644
--- a/automation/Extension/webext-instrumentation/package-lock.json
+++ b/automation/Extension/webext-instrumentation/package-lock.json
@@ -2788,7 +2788,8 @@
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
},
"extend-shallow": {
"version": "3.0.2",
@@ -5011,6 +5012,7 @@
"version": "1.0.20",
"resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.20.tgz",
"integrity": "sha512-6sS4ydJ6+/ZnSwKUN8Jtu7NzD2pobXRolYRjHupKtRBDmx+8WZG1yUdOfF9QfCNPkWKrf3GcSFEurIrnJC56Qw==",
+ "dev": true,
"requires": {
"extend": "3.0.2"
}
diff --git a/automation/Extension/webext-instrumentation/package.json b/automation/Extension/webext-instrumentation/package.json
index a01d64619..7591d1c8c 100644
--- a/automation/Extension/webext-instrumentation/package.json
+++ b/automation/Extension/webext-instrumentation/package.json
@@ -41,7 +41,8 @@
"prepare": "run-s build test",
"prepare-release": "run-s all version doc:publish",
"publish-please": "publish-please",
- "prepublishOnly": "publish-please guard"
+ "prepublishOnly": "publish-please guard",
+ "make-compat": "node scripts/make_mdn_browser_compat_file.js"
},
"scripts-info": {
"info": "Display information about the package scripts",
@@ -54,14 +55,12 @@
"doc:json": "Generate API documentation in typedoc JSON format",
"version": "Bump package.json version, update CHANGELOG.md, tag release",
"reset": "Delete all untracked files and reset the repo to the last commit",
- "prepare-release": "One-step: clean, build, test, publish docs, and prep a release"
+ "prepare-release": "One-step: clean, build, test, publish docs, and prep a release",
+ "make-compat": "Script that makes src/lib/mdn-browser-compat-data.ts"
},
"engines": {
"node": ">=8.9"
},
- "dependencies": {
- "mdn-browser-compat-data": "^1.0.20"
- },
"devDependencies": {
"@types/firefox-webext-browser": "^70.0.1",
"ava": "^3.7.1",
@@ -69,6 +68,7 @@
"commitizen": "^4.0.4",
"cz-conventional-changelog": "^2.1.0",
"gh-pages": "^2.1.1",
+ "mdn-browser-compat-data": "^1.0.20",
"npm-run-all": "^4.1.5",
"nyc": "^14.1.1",
"opn-cli": "^3.1.0",
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
new file mode 100755
index 000000000..c37f40e1f
--- /dev/null
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -0,0 +1,23 @@
+const bcd = require('mdn-browser-compat-data');
+const fs = require('fs')
+
+const BROWSER = 'firefox'
+const VERSION = 75
+
+const output = `
+// This file is generated from mdn-browser-compat-data....AASADFA.
+const api = [
+ 'XMLHttpRequest'
+];
+export {api};
+`
+fs.writeFile(
+ 'src/lib/mdn-browser-compat-data.ts',
+ output,
+ (err) => {
+ if(err) {
+ return console.log(err);
+ }
+
+ console.log("The file was saved!");
+});
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts b/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
new file mode 100644
index 000000000..2b8ad11c9
--- /dev/null
+++ b/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
@@ -0,0 +1,6 @@
+
+// This file is generated from mdn-browser-compat-data....AASADFA.
+const api = [
+ 'XMLHttpRequest'
+];
+export {api};
From 5046246517ae9e2d91ee110eb0a19440011074ea Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Sat, 9 May 2020 04:25:59 -0500
Subject: [PATCH 006/106] Working give or take
Getting errors like
OpenWPM: Error name: TypeError post_request_ajax.html:237:17
OpenWPM: Error message: can't redefine non-configurable property
"UNSENT" post_request_ajax.html:238:17
---
.../Extension/firefox/feature.js/index.js | 5 +-
.../Extension/firefox/package-lock.json | 3 -
.../webext-instrumentation/.prettierignore | 4 +-
.../scripts/make_mdn_browser_compat_file.js | 15 +-
.../javascript-instrument-content-scope.ts | 25 +-
.../src/lib/mdn-browser-compat-data.ts | 925 +++++++++++++++++-
6 files changed, 963 insertions(+), 14 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index c0787aaf1..4de2346ba 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -20,7 +20,10 @@ async function main() {
navigation_instrument:true,
cookie_instrument:true,
js_instrument:true,
- js_instrument_modules: ["fingerprinting"],
+ js_instrument_modules: [
+ "fingerprinting",
+ "XMLHttpRequest",
+ ],
http_instrument:true,
callstack_instrument:true,
save_content:false,
diff --git a/automation/Extension/firefox/package-lock.json b/automation/Extension/firefox/package-lock.json
index 6107f72ec..6ca6c0927 100644
--- a/automation/Extension/firefox/package-lock.json
+++ b/automation/Extension/firefox/package-lock.json
@@ -7165,9 +7165,6 @@
},
"openwpm-webext-instrumentation": {
"version": "file:../webext-instrumentation",
- "requires": {
- "mdn-browser-compat-data": "^1.0.20"
- },
"dependencies": {
"extend": {
"version": "3.0.2",
diff --git a/automation/Extension/webext-instrumentation/.prettierignore b/automation/Extension/webext-instrumentation/.prettierignore
index 0e80a3c86..6e1c2b982 100644
--- a/automation/Extension/webext-instrumentation/.prettierignore
+++ b/automation/Extension/webext-instrumentation/.prettierignore
@@ -1,2 +1,4 @@
# package.json is formatted by package managers, so we ignore it here
-package.json
\ No newline at end of file
+package.json
+# This file is autogenerated, and can't do it quite perfectly
+src/lib/mdn-browser-compat-data.ts
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
index c37f40e1f..b4e45b1ad 100755
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -4,10 +4,18 @@ const fs = require('fs')
const BROWSER = 'firefox'
const VERSION = 75
+const api = [];
+Object.keys(bcd.api).forEach(item => {
+ if (item !== '__compat') {
+ api.push(`"${item}"`);
+ }
+});
+
const output = `
-// This file is generated from mdn-browser-compat-data....AASADFA.
+// This file is generated from mdn-browser-compat-data by running
+// "npm run make-compat"
const api = [
- 'XMLHttpRequest'
+ ${api.join(',\n ')}
];
export {api};
`
@@ -18,6 +26,5 @@ fs.writeFile(
if(err) {
return console.log(err);
}
-
- console.log("The file was saved!");
+ console.log("src/lib/mdn-browser-compat-data.ts regenerated.");
});
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 478970ecb..5c6bae391 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -1,5 +1,6 @@
import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-apis";
import { jsInstruments } from "../lib/js-instruments";
+import { api } from "../lib/mdn-browser-compat-data";
import { pageScript } from "./javascript-instrument-page-scope";
function getPageScriptAsString(jsModuleRequests: string[]): string {
@@ -7,17 +8,35 @@ function getPageScriptAsString(jsModuleRequests: string[]): string {
jsModuleRequests.forEach(requestedModule => {
if (requestedModule == "fingerprinting") {
+ // Special case collection of fingerprinting
instrumentedApis.push(String(instrumentFingerprintingApis));
+ } else {
+ // Note: We only do whole modules for now
+ // Check requestedModule is a member of api
+ if (api.includes(requestedModule)) {
+ // Then add functions that do the instrumentation
+ instrumentedApis.push(`
+ function instrument${requestedModule}({
+ instrumentObjectProperty,
+ instrumentObject,
+ }) {
+ instrumentObject(window.${requestedModule}.prototype, "${requestedModule}");
+ }
+ `);
+ } else {
+ // Is this the right way to do logging?
+ console.error(
+ `The requested module ${requestedModule} does not appear to be part of browser api.`,
+ );
+ }
}
});
const pageScriptString = `
${jsInstruments}
- const instrumentedApis = [${instrumentedApis.join("\n")}];
+ const instrumentedApis = [${instrumentedApis.join(",\n")}];
(${String(pageScript)}({jsInstruments, instrumentedApis}));
`;
-
- console.log(pageScriptString);
return pageScriptString;
}
diff --git a/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts b/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
index 2b8ad11c9..c61ac469e 100644
--- a/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
@@ -1,6 +1,927 @@
-// This file is generated from mdn-browser-compat-data....AASADFA.
+// This file is generated from mdn-browser-compat-data by running
+// "npm run make-compat"
const api = [
- 'XMLHttpRequest'
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortPaymentEvent",
+ "AbortSignal",
+ "AbsoluteOrientationSensor",
+ "AbstractRange",
+ "AbstractWorker",
+ "Accelerometer",
+ "AmbientLightSensor",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioParamMap",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "AudioTrack",
+ "AudioTrackList",
+ "AudioWorklet",
+ "AudioWorkletGlobalScope",
+ "AudioWorkletNode",
+ "AudioWorkletProcessor",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BatteryManager",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "Body",
+ "BroadcastChannel",
+ "BudgetService",
+ "BudgetState",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSS",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSPseudoElement",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanMakePaymentEvent",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialUserData",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceLightEvent",
+ "DeviceMotionEvent",
+ "DeviceMotionEventAcceleration",
+ "DeviceMotionEventRotationRate",
+ "DeviceOrientationEvent",
+ "DeviceProximityEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentTimeline",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FederatedCredential",
+ "FetchEvent",
+ "File",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationCoordinates",
+ "GeolocationPosition",
+ "GeolocationPositionError",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "Gyroscope",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBDatabaseException",
+ "IDBEnvironment",
+ "IDBFactory",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBLocaleAwareKeyRange",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageCapture",
+ "ImageData",
+ "InputDeviceCapabilities",
+ "InputDeviceInfo",
+ "InputEvent",
+ "InstallEvent",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LinearAccelerationSensor",
+ "LinkStyle",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "Lock",
+ "LockManager",
+ "LongRange",
+ "MIDIAccess",
+ "MIDIConnectionEvent",
+ "MIDIInput",
+ "MIDIInputMap",
+ "MIDIMessageEvent",
+ "MIDIOutput",
+ "MIDIOutputMap",
+ "MIDIPort",
+ "MSGestureEvent",
+ "Magnetometer",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeySystemConfiguration",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaSettingsRange",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NamedNodeMap",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NavigatorStorage",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "Notification",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_fbo_render_mipmap",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OrientationSensor",
+ "OscillatorNode",
+ "OverconstrainedError",
+ "OverconstrainedErrorEvent",
+ "PageTransitionEvent",
+ "PaintRenderingContext2D",
+ "PaintSize",
+ "PaintWorkletGlobalScope",
+ "PannerNode",
+ "ParentNode",
+ "PasswordCredential",
+ "Path2D",
+ "PayerErrors",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformancePaintTiming",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "PhotoCapabilities",
+ "PictureInPicture",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PointerEvent",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PromiseRejectionEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushRegistrationManager",
+ "PushSubscription",
+ "PushSubscriptionChangeEvent",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCConfiguration",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCErrorEvent",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityAssertion",
+ "RTCIdentityErrorEvent",
+ "RTCIdentityEvent",
+ "RTCIdentityProviderGlobalScope",
+ "RTCIdentityProviderRegistrar",
+ "RTCOfferAnswerOptions",
+ "RTCOfferOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceErrorEvent",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpStreamStats",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsEvent",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStream",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "ReadableStreamDefaultController",
+ "ReadableStreamDefaultReader",
+ "RelativeOrientationSensor",
+ "Request",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "Response",
+ "SVGAElement",
+ "SVGAltGlyphDefElement",
+ "SVGAltGlyphElement",
+ "SVGAltGlyphItemElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPoints",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGColorProfileElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGFilterPrimitiveStandardAttributes",
+ "SVGFontElement",
+ "SVGFontFaceElement",
+ "SVGFontFaceFormatElement",
+ "SVGFontFaceNameElement",
+ "SVGFontFaceSrcElement",
+ "SVGFontFaceUriElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGlyphElement",
+ "SVGGlyphRefElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGHKernElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGMissingGlyphElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGRenderingIntent",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGSolidcolorElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStylable",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTRefElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGTransformable",
+ "SVGURIReference",
+ "SVGUnitTypes",
+ "SVGUnknownElement",
+ "SVGUseElement",
+ "SVGVKernElement",
+ "SVGViewElement",
+ "SVGZoomAndPan",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "Sensor",
+ "SensorErrorEvent",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "ShadowRoot",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "Slotable",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StorageManager",
+ "StorageQuota",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "SubtleCrypto",
+ "SyncEvent",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoder",
+ "TextDecoderStream",
+ "TextEncoder",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackList",
+ "TimeRanges",
+ "Touch",
+ "TouchEvent",
+ "TouchList",
+ "TrackDefault",
+ "TrackDefaultList",
+ "TrackEvent",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "URLUtilsReadOnly",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "UserProximityEvent",
+ "VRDisplay",
+ "VRDisplayCapabilities",
+ "VRDisplayEvent",
+ "VREyeParameters",
+ "VRFieldOfView",
+ "VRFrameData",
+ "VRLayerInit",
+ "VRPose",
+ "VRStageParameters",
+ "VTTCue",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VideoTrack",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_atc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_pvrtc",
+ "WEBGL_compressed_texture_s3tc",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_renderer_info",
+ "WEBGL_debug_shaders",
+ "WEBGL_depth_texture",
+ "WEBGL_draw_buffers",
+ "WEBGL_lose_context",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2ComputeRenderingContext",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLObject",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
];
export {api};
From 2a972620aa038a19d8392953c38aabf66c5d54d6 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 12 May 2020 17:11:02 -0500
Subject: [PATCH 007/106] Small naming cleanup
---
.../javascript-instrument-content-scope.ts | 11 +++++-----
.../javascript-instrument-page-scope.ts | 22 +++++++++----------
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 5c6bae391..8fed08c08 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -4,18 +4,18 @@ import { api } from "../lib/mdn-browser-compat-data";
import { pageScript } from "./javascript-instrument-page-scope";
function getPageScriptAsString(jsModuleRequests: string[]): string {
- const instrumentedApis: string[] = [];
+ const instrumentedApiFuncs: string[] = [];
jsModuleRequests.forEach(requestedModule => {
if (requestedModule == "fingerprinting") {
// Special case collection of fingerprinting
- instrumentedApis.push(String(instrumentFingerprintingApis));
+ instrumentedApiFuncs.push(String(instrumentFingerprintingApis));
} else {
// Note: We only do whole modules for now
// Check requestedModule is a member of api
if (api.includes(requestedModule)) {
// Then add functions that do the instrumentation
- instrumentedApis.push(`
+ instrumentedApiFuncs.push(`
function instrument${requestedModule}({
instrumentObjectProperty,
instrumentObject,
@@ -24,7 +24,6 @@ function getPageScriptAsString(jsModuleRequests: string[]): string {
}
`);
} else {
- // Is this the right way to do logging?
console.error(
`The requested module ${requestedModule} does not appear to be part of browser api.`,
);
@@ -34,8 +33,8 @@ function getPageScriptAsString(jsModuleRequests: string[]): string {
const pageScriptString = `
${jsInstruments}
- const instrumentedApis = [${instrumentedApis.join(",\n")}];
- (${String(pageScript)}({jsInstruments, instrumentedApis}));
+ const instrumentedApiFuncs = [${instrumentedApiFuncs.join(",\n")}];
+ (${String(pageScript)}({jsInstruments, instrumentedApiFuncs}));
`;
return pageScriptString;
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index f5459a56e..a5dd87b8a 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -4,7 +4,7 @@
export const pageScript = function({
jsInstruments,
- instrumentedApis, // A list of functions that accept {instrumentObjectProperty, instrumentObject}
+ instrumentedApiFuncs, // A list of functions that accept {instrumentObjectProperty, instrumentObject}
}) {
// messages the injected script
function sendMessagesToLogger($event_id, messages) {
@@ -25,8 +25,8 @@ export const pageScript = function({
/*
* Start Instrumentation
*/
- instrumentedApis.forEach(func =>
- func({
+ instrumentedApiFuncs.forEach(instrumentedApiFunc =>
+ instrumentedApiFunc({
instrumentObjectProperty,
instrumentObject,
}),
@@ -40,13 +40,13 @@ export const pageScript = function({
if (testing) {
console.log("OpenWPM: Currently testing");
(window as any).instrumentObject = instrumentObject;
- const modules = document.currentScript.getAttribute("data-modules")
- ? document.currentScript.getAttribute("data-modules")
- : [];
- console.log(
- "OpenWPM: Content-side javascript instrumentation started",
- modules,
- new Date().toISOString(),
- );
+ const modules = document.currentScript.getAttribute("data-modules");
+ if (modules) {
+ console.log(
+ "OpenWPM: Content-side javascript instrumentation started",
+ modules,
+ new Date().toISOString(),
+ );
+ };
}
};
From 946ec0790e33c67eefbff1e8e5a15ffc09f336f2 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 12 May 2020 17:36:48 -0500
Subject: [PATCH 008/106] Handle non-configurable properties
---
.../src/lib/js-instruments.ts | 20 ++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 8c39ae2ef..27f673e57 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -292,13 +292,13 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
}
function logErrorToConsole(error, context: any = false) {
- console.log("OpenWPM: Error name: " + error.name);
- console.log("OpenWPM: Error message: " + error.message);
- console.log("OpenWPM: Error filename: " + error.fileName);
- console.log("OpenWPM: Error line number: " + error.lineNumber);
- console.log("OpenWPM: Error stack: " + error.stack);
+ console.error("OpenWPM: Error name: " + error.name);
+ console.error("OpenWPM: Error message: " + error.message);
+ console.error("OpenWPM: Error filename: " + error.fileName);
+ console.error("OpenWPM: Error line number: " + error.lineNumber);
+ console.error("OpenWPM: Error stack: " + error.stack);
if (context) {
- console.log("OpenWPM: Error context: " + JSON.stringify(context));
+ console.error("OpenWPM: Error context: " + JSON.stringify(context));
}
}
@@ -524,7 +524,13 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
try {
instrumentObjectProperty(object, objectName, propertyName, logSettings);
} catch (error) {
- logErrorToConsole(error, { objectName, propertyName });
+ if (
+ (error instanceof TypeError) &&
+ (error.message.includes("can't redefine non-configurable property"))) {
+ console.warn(`Cannot instrument non-configurable property: ${objectName}:${propertyName}`);
+ } else {
+ logErrorToConsole(error, { objectName, propertyName });
+ }
}
}
const nonExistingProperties = logSettings.nonExistingPropertiesToInstrument;
From 7fd8842a4d091a77c6357c6c8282f6cbf5b1e227 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 12 May 2020 17:56:02 -0500
Subject: [PATCH 009/106] Lint
---
.../src/content/javascript-instrument-page-scope.ts | 2 +-
.../webext-instrumentation/src/lib/js-instruments.ts | 9 ++++++---
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index a5dd87b8a..a8e770362 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -47,6 +47,6 @@ export const pageScript = function({
modules,
new Date().toISOString(),
);
- };
+ }
}
};
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 27f673e57..7ef252473 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -525,9 +525,12 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
instrumentObjectProperty(object, objectName, propertyName, logSettings);
} catch (error) {
if (
- (error instanceof TypeError) &&
- (error.message.includes("can't redefine non-configurable property"))) {
- console.warn(`Cannot instrument non-configurable property: ${objectName}:${propertyName}`);
+ error instanceof TypeError &&
+ error.message.includes("can't redefine non-configurable property")
+ ) {
+ console.warn(
+ `Cannot instrument non-configurable property: ${objectName}:${propertyName}`,
+ );
} else {
logErrorToConsole(error, { objectName, propertyName });
}
From ba6ab103d6c5183319a8afa819adfd66f417e93a Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 12 May 2020 19:05:45 -0500
Subject: [PATCH 010/106] Add aspirational API
---
automation/Extension/firefox/feature.js/index.js | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index 4de2346ba..17fd8db7d 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -21,8 +21,14 @@ async function main() {
cookie_instrument:true,
js_instrument:true,
js_instrument_modules: [
+ // Shortcut
"fingerprinting",
- "XMLHttpRequest",
+ // APIs
+ "Storage",
+ {"XMLHttpRequest": ["send"]},
+ // Specific instances on window
+ {"window.document": ["cookie", "referrer"]},
+ {"window": ["name", "localStorage", "sessionStorage"]}
],
http_instrument:true,
callstack_instrument:true,
From 527645497ef2d91d611e706fd008f805ab061eb8 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 15:54:00 -0500
Subject: [PATCH 011/106] Begin migration to new JSInstrumentationRequest
interface.
* We build and mandate LogSettings.
* We have a new JSInstrumentatinRequest that everything runs through
* Preset, fingerprinting, will be specified in JSON
---
.../Extension/firefox/feature.js/index.js | 1 +
.../javascript-instrument-content-scope.ts | 38 ++-
.../javascript-instrument-page-scope.ts | 34 +--
.../fingerprinting.json | 3 +
.../src/lib/js-instruments.ts | 276 ++++++++----------
.../src/types/js-instrumentation.d.ts | 17 ++
.../src/types/window.d.ts | 15 -
7 files changed, 191 insertions(+), 193 deletions(-)
create mode 100644 automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
create mode 100644 automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
delete mode 100644 automation/Extension/webext-instrumentation/src/types/window.d.ts
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index 17fd8db7d..b0b1a84e6 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -26,6 +26,7 @@ async function main() {
// APIs
"Storage",
{"XMLHttpRequest": ["send"]},
+ {"XMLHttpRequest": ["send"]},
// Specific instances on window
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 8fed08c08..92e901f06 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -1,9 +1,34 @@
import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-apis";
-import { jsInstruments } from "../lib/js-instruments";
+import { getInstrumentJS, LogSettings } from "../lib/js-instruments";
import { api } from "../lib/mdn-browser-compat-data";
import { pageScript } from "./javascript-instrument-page-scope";
+import { JSInstrumentRequest } from "../types/js-instrumentation";
-function getPageScriptAsString(jsModuleRequests: string[]): string {
+function getPageScriptAsString(jsModuleRequests: any[]): string {
+ // The new goal of this function will be to collect together a de-duped
+ // list of JSInstrumentRequests from the input request which may include
+ // short hand.
+
+ /*
+ We accept a list. From the list we need to parse each item.
+ The item may be a string or an object with one key.
+ If the item is a string:
+ - Is it a shortcut e.g. "fingerprinting"
+ - Is it an object (verified by mdn-browser-compat)
+ - If neither, reject
+ If the item is an object:
+ - Must only have one property
+ - The value may be a list or a LogSettings object
+ - If the value is a list, it is transformed into the propertiesToInstrument
+ property of a new LogSettings object.
+
+
+ */
+
+
+ const instrumentationRequests: JSInstrumentRequest[] = [];
+
+ /*
const instrumentedApiFuncs: string[] = [];
jsModuleRequests.forEach(requestedModule => {
@@ -30,11 +55,12 @@ function getPageScriptAsString(jsModuleRequests: string[]): string {
}
}
});
-
+ */
+ // Build script as string
const pageScriptString = `
- ${jsInstruments}
- const instrumentedApiFuncs = [${instrumentedApiFuncs.join(",\n")}];
- (${String(pageScript)}({jsInstruments, instrumentedApiFuncs}));
+ ${getInstrumentJS}
+ const instrumentationRequests = [${instrumentationRequests.join(",\n")}];
+ (${String(pageScript)}({getInstrumentJS, instrumentationRequests}));
`;
return pageScriptString;
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index a8e770362..5db88d0db 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -3,9 +3,10 @@
// is exported as a page script as a string
export const pageScript = function({
- jsInstruments,
- instrumentedApiFuncs, // A list of functions that accept {instrumentObjectProperty, instrumentObject}
+ getInstrumentJS,
+ instrumentionRequests, // Spec to pass to instrumentJS function
}) {
+
// messages the injected script
function sendMessagesToLogger($event_id, messages) {
document.dispatchEvent(
@@ -16,21 +17,11 @@ export const pageScript = function({
}
const event_id = document.currentScript.getAttribute("data-event-id");
-
- const { instrumentObject, instrumentObjectProperty } = jsInstruments(
+ const instrumentJS = getInstrumentJS(
event_id,
sendMessagesToLogger,
);
-
- /*
- * Start Instrumentation
- */
- instrumentedApiFuncs.forEach(instrumentedApiFunc =>
- instrumentedApiFunc({
- instrumentObjectProperty,
- instrumentObject,
- }),
- );
+ instrumentJS(instrumentionRequests);
/*
* Log if testing
@@ -39,14 +30,11 @@ export const pageScript = function({
document.currentScript.getAttribute("data-testing") === "true";
if (testing) {
console.log("OpenWPM: Currently testing");
- (window as any).instrumentObject = instrumentObject;
- const modules = document.currentScript.getAttribute("data-modules");
- if (modules) {
- console.log(
- "OpenWPM: Content-side javascript instrumentation started",
- modules,
- new Date().toISOString(),
- );
- }
+ (window as any).instrumentJS = instrumentJS;
+ console.log(
+ "OpenWPM: Content-side javascript instrumentation started with spec:",
+ instrumentionRequests,
+ new Date().toISOString(),
+ );
}
};
diff --git a/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json b/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
new file mode 100644
index 000000000..c44dc44f3
--- /dev/null
+++ b/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
@@ -0,0 +1,3 @@
+[
+
+]
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 7ef252473..c3cd4c6f1 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -1,6 +1,11 @@
// Intrumentation injection code is based on privacybadgerfirefox
// https://github.com/EFForg/privacybadgerfirefox/blob/master/data/fingerprinting.js
+import {
+ ILogSettings,
+ JSInstrumentRequest,
+} from "../types/js-instrumentation";
+
declare global {
interface Object {
getPropertyDescriptor(subject: any, name: any): PropertyDescriptor;
@@ -11,19 +16,50 @@ declare global {
}
}
-interface LogSettings {
- propertiesToInstrument?: string[];
- nonExistingPropertiesToInstrument?: string[];
- excludedProperties?: string[];
- logCallStack?: boolean;
- logFunctionsAsStrings?: boolean;
- logFunctionGets?: boolean;
- preventSets?: boolean;
- recursive?: boolean;
- depth?: number;
+// Implements ILogSettings and sets defaults
+export class LogSettings implements ILogSettings {
+ // propertiesToInstrument : Array
+ // An array of properties to instrument on this object.
+ // If array is empty, then all properties are instrumented.
+ // nonExistingPropertiesToInstrument : Array
+ // An array of non-existing properties to instrument on this object.
+ // excludedProperties : Array
+ // Properties excluded from instrumentation.
+ // logCallStack : boolean
+ // Set to true save the call stack info with each property call.
+ // logFunctionsAsStrings : boolean
+ // Set to true to save functional arguments as strings during
+ // argument serialization.
+ // logFunctionGets: boolean
+ // ....
+ // preventSets : boolean
+ // Set to true to prevent nested objects and functions from being
+ // overwritten (and thus having their instrumentation removed).
+ // Other properties (static values) can still be set with this is
+ // enabled.
+ // recursive : boolean
+ // Set to `true` to recursively instrument all object properties of
+ // the given `object`.
+ // NOTE:
+ // (1)`logSettings['propertiesToInstrument']` does not propagate
+ // to sub-objects.
+ // (2) Sub-objects of prototypes can not be instrumented
+ // recursively as these properties can not be accessed
+ // until an instance of the prototype is created.
+ // depth : integer
+ // Recursion limit when instrumenting object recursively.
+ propertiesToInstrument: string[] = [];
+ nonExistingPropertiesToInstrument: string[] = [];
+ excludedProperties: string[] = [];
+ logCallStack: boolean = false;
+ logFunctionsAsStrings: boolean = false;
+ logFunctionGets: boolean = false;
+ preventSets: boolean = false;
+ recursive: boolean = false;
+ depth: number = 5;
}
-export function jsInstruments(event_id, sendMessagesToLogger) {
+export function getInstrumentJS(event_id, sendMessagesToLogger) {
/*
* Instrumentation helpers
* (Inlined in order for jsInstruments to be easily exportable as a string)
@@ -205,7 +241,7 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
value,
operation,
callContext,
- logSettings,
+ logSettings: LogSettings,
) {
if (inLog) {
return;
@@ -245,7 +281,7 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
}
// For functions
- function logCall(instrumentedFunctionName, args, callContext, logSettings) {
+ function logCall(instrumentedFunctionName, args, callContext, logSettings: LogSettings) {
if (inLog) {
return;
}
@@ -439,131 +475,11 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
return typeof property === "object";
}
- function instrumentObject(object, objectName, logSettings: LogSettings = {}) {
- // Use for objects or object prototypes
- //
- // Parameters
- // ----------
- // object : Object
- // Object to instrument
- // objectName : String
- // Name of the object to be instrumented (saved to database)
- // logSettings : Object
- // (optional) object that can be used to specify additional logging
- // configurations. See available options below.
- //
- // logSettings options (all optional)
- // -------------------
- // propertiesToInstrument : Array
- // An array of properties to instrument on this object. Default is
- // all properties.
- // nonExistingPropertiesToInstrument : Array
- // An array of non-existing properties to instrument on this object.
- // excludedProperties : Array
- // Properties excluded from instrumentation. Default is an empty
- // array.
- // logCallStack : boolean
- // Set to true save the call stack info with each property call.
- // Default is `false`.
- // logFunctionsAsStrings : boolean
- // Set to true to save functional arguments as strings during
- // argument serialization. Default is `false`.
- // preventSets : boolean
- // Set to true to prevent nested objects and functions from being
- // overwritten (and thus having their instrumentation removed).
- // Other properties (static values) can still be set with this is
- // enabled. Default is `false`.
- // recursive : boolean
- // Set to `true` to recursively instrument all object properties of
- // the given `object`. Default is `false`
- // NOTE:
- // (1)`logSettings['propertiesToInstrument']` does not propagate
- // to sub-objects.
- // (2) Sub-objects of prototypes can not be instrumented
- // recursively as these properties can not be accessed
- // until an instance of the prototype is created.
- // depth : integer
- // Recursion limit when instrumenting object recursively.
- // Default is `5`.
- const properties = logSettings.propertiesToInstrument
- ? logSettings.propertiesToInstrument
- : Object.getPropertyNames(object);
- for (const propertyName of properties) {
- if (
- logSettings.excludedProperties &&
- logSettings.excludedProperties.indexOf(propertyName) > -1
- ) {
- continue;
- }
- // If `recursive` flag set we want to recursively instrument any
- // object properties that aren't the prototype object. Only recurse if
- // depth not set (at which point its set to default) or not at limit.
- if (
- !!logSettings.recursive &&
- propertyName !== "__proto__" &&
- isObject(object, propertyName) &&
- (!("depth" in logSettings) || logSettings.depth > 0)
- ) {
- // set recursion limit to default if not specified
- if (!("depth" in logSettings)) {
- logSettings.depth = 5;
- }
- instrumentObject(
- object[propertyName],
- objectName + "." + propertyName,
- {
- excludedProperties: logSettings.excludedProperties,
- logCallStack: logSettings.logCallStack,
- logFunctionsAsStrings: logSettings.logFunctionsAsStrings,
- preventSets: logSettings.preventSets,
- recursive: logSettings.recursive,
- depth: logSettings.depth - 1,
- },
- );
- }
- try {
- instrumentObjectProperty(object, objectName, propertyName, logSettings);
- } catch (error) {
- if (
- error instanceof TypeError &&
- error.message.includes("can't redefine non-configurable property")
- ) {
- console.warn(
- `Cannot instrument non-configurable property: ${objectName}:${propertyName}`,
- );
- } else {
- logErrorToConsole(error, { objectName, propertyName });
- }
- }
- }
- const nonExistingProperties = logSettings.nonExistingPropertiesToInstrument;
- if (nonExistingProperties) {
- for (const propertyName of nonExistingProperties) {
- if (
- logSettings.excludedProperties &&
- logSettings.excludedProperties.indexOf(propertyName) > -1
- ) {
- continue;
- }
- try {
- instrumentObjectProperty(
- object,
- objectName,
- propertyName,
- logSettings,
- );
- } catch (error) {
- logErrorToConsole(error, { objectName, propertyName });
- }
- }
- }
- }
-
// Log calls to a given function
// This helper function returns a wrapper around `func` which logs calls
// to `func`. `objectName` and `methodName` are used strictly to identify
// which object method `func` is coming from in the logs
- function instrumentFunction(objectName, methodName, func, logSettings) {
+ function instrumentFunction(objectName: string, methodName: string, func: any, logSettings: LogSettings) {
return function() {
const callContext = getOriginatingScriptContext(
!!logSettings.logCallStack,
@@ -579,20 +495,20 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
}
// Log properties of prototypes and objects
- function instrumentObjectProperty(
- object,
- objectName,
- propertyName,
- logSettings: LogSettings = {},
- ) {
- if (!object) {
- throw new Error("Invalid object: " + propertyName);
- }
- if (!objectName) {
- throw new Error("Invalid object name: " + propertyName);
- }
- if (!propertyName || propertyName === "undefined") {
- throw new Error("Invalid object property name: " + propertyName);
+ function instrumentObjectProperty(object, objectName: string, propertyName:string, logSettings: LogSettings) {
+ if (
+ !object ||
+ !objectName ||
+ !propertyName ||
+ propertyName === "undefined"
+ ) {
+ throw new Error(
+ `Invalid request to instrumentObjectProperty.
+ Object: ${object}
+ objectName: ${objectName}
+ propertyName: ${propertyName}
+ `
+ );
}
// Store original descriptor in closure
@@ -787,5 +703,67 @@ export function jsInstruments(event_id, sendMessagesToLogger) {
});
}
- return { instrumentObject, instrumentObjectProperty };
+ function instrumentObject(object: any, objectName: string, logSettings: LogSettings) {
+ if (logSettings.propertiesToInstrument.length === 0) {
+ logSettings.propertiesToInstrument = Object.getPropertyNames(object);
+ }
+ for (const propertyName of logSettings.propertiesToInstrument) {
+ if (logSettings.excludedProperties.includes(propertyName)) {
+ continue;
+ }
+ // If `recursive` flag set we want to recursively instrument any
+ // object properties that aren't the prototype object.
+ if (
+ logSettings.recursive &&
+ logSettings.depth > 0 &&
+ isObject(object, propertyName) &&
+ propertyName !== "__proto__"
+ ) {
+ let newDepth = logSettings.depth - 1;
+ logSettings.depth = newDepth
+ instrumentObject(
+ object[propertyName],
+ objectName + "." + propertyName,
+ logSettings,
+ );
+ }
+ try {
+ instrumentObjectProperty(object, objectName, propertyName, logSettings);
+ } catch (error) {
+ if (
+ error instanceof TypeError &&
+ error.message.includes("can't redefine non-configurable property")
+ ) {
+ console.warn(
+ `Cannot instrument non-configurable property: ${objectName}:${propertyName}`,
+ );
+ } else {
+ logErrorToConsole(error, { objectName, propertyName });
+ }
+ }
+ }
+ for (const propertyName of logSettings.nonExistingPropertiesToInstrument) {
+ if (logSettings.excludedProperties.includes(propertyName)) {
+ continue;
+ }
+ try {
+ instrumentObjectProperty(
+ object,
+ objectName,
+ propertyName,
+ logSettings,
+ );
+ } catch (error) {
+ logErrorToConsole(error, { objectName, propertyName });
+ }
+ }
+ }
+
+ function instrumentJS(spec: JSInstrumentRequest[]) {
+ spec.forEach(function(item) {
+ instrumentObject(item.object, item.objectName, item.logSettings)
+ })
+ }
+
+ return { instrumentJS };
}
diff --git a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
new file mode 100644
index 000000000..f5dd3d2b1
--- /dev/null
+++ b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
@@ -0,0 +1,17 @@
+export interface ILogSettings {
+ propertiesToInstrument: string[];
+ nonExistingPropertiesToInstrument: string[];
+ excludedProperties: string[];
+ logCallStack: boolean;
+ logFunctionsAsStrings: boolean;
+ logFunctionGets: boolean;
+ preventSets: boolean;
+ recursive: boolean;
+ depth: number;
+}
+
+export interface JSInstrumentRequest {
+ object: string,
+ objectName: string,
+ logSettings: ILogSettings,
+}
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/types/window.d.ts b/automation/Extension/webext-instrumentation/src/types/window.d.ts
deleted file mode 100644
index 6d9135b91..000000000
--- a/automation/Extension/webext-instrumentation/src/types/window.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-export {}; // this file needs to be a module
-declare global {
- interface Window {
- Storage: any;
- HTMLCanvasElement: any;
- CanvasRenderingContext2D: any;
- RTCPeerConnection: any;
- AudioContext: any;
- OfflineAudioContext: any;
- OscillatorNode: any;
- AnalyserNode: any;
- GainNode: any;
- ScriptProcessorNode: any;
- }
-}
From 3d72db9f6e7e688d72725cd28fde86ee4dbf1ca1 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 16:54:21 -0500
Subject: [PATCH 012/106] Continue making progress
Enum for Operation
---
.../src/background/javascript-instrument.ts | 2 +-
.../src/lib/js-instruments.ts | 195 ++++++++----------
.../webext-instrumentation/src/schema.ts | 13 +-
3 files changed, 103 insertions(+), 107 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
index 2a1bde3a4..29ab59057 100644
--- a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
+++ b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
@@ -26,7 +26,7 @@ export class JavascriptInstrument {
update.script_loc_eval = escapeString(data.scriptLocEval);
update.call_stack = escapeString(data.callStack);
update.symbol = escapeString(data.symbol);
- update.operation = escapeString(data.operation);
+ update.operation = data.operation;
update.value = escapeString(data.value);
update.time_stamp = data.timeStamp;
update.incognito = boolToInt(sender.tab.incognito);
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index c3cd4c6f1..1b5d51a5b 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -5,6 +5,9 @@ import {
ILogSettings,
JSInstrumentRequest,
} from "../types/js-instrumentation";
+import {
+ JSOperation
+} from "../schema";
declare global {
interface Object {
@@ -65,8 +68,47 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
* (Inlined in order for jsInstruments to be easily exportable as a string)
*/
+ // Counter to cap # of calls logged for each script/api combination
+ const maxLogCount = 500;
+ // logCounter
+ const logCounter = new Object();
+ // Prevent logging of gets arising from logging
+ let inLog = false;
+ // To keep track of the original order of events
+ let ordinal = 0;
+
+
+ // Rough implementations of Object.getPropertyDescriptor and Object.getPropertyNames
+ // See http://wiki.ecmascript.org/doku.php?id=harmony:extended_object_api
+ Object.getPropertyDescriptor = function(subject, name) {
+ if (subject === undefined) {
+ throw new Error("Can't get property descriptor for undefined");
+ }
+ let pd = Object.getOwnPropertyDescriptor(subject, name);
+ let proto = Object.getPrototypeOf(subject);
+ while (pd === undefined && proto !== null) {
+ pd = Object.getOwnPropertyDescriptor(proto, name);
+ proto = Object.getPrototypeOf(proto);
+ }
+ return pd;
+ };
+
+ Object.getPropertyNames = function(subject) {
+ if (subject === undefined) {
+ throw new Error("Can't get property names for undefined");
+ }
+ let props = Object.getOwnPropertyNames(subject);
+ let proto = Object.getPrototypeOf(subject);
+ while (proto !== null) {
+ props = props.concat(Object.getOwnPropertyNames(proto));
+ proto = Object.getPrototypeOf(proto);
+ }
+ // FIXME: remove duplicate property names from props
+ return props;
+ };
+
// debounce - from Underscore v1.6.0
- function debounce(func, wait, immediate = false) {
+ function debounce(func, wait, immediate:boolean = false) {
let timeout, args, context, timestamp, result;
const later = function() {
@@ -100,7 +142,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
// Recursively generates a path for an element
- function getPathToDomElement(element, visibilityAttr = false) {
+ function getPathToDomElement(element:any, visibilityAttr:boolean = false) {
if (element === document.body) {
return element.tagName;
}
@@ -135,7 +177,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
// Helper for JSONifying objects
- function serializeObject(object, stringifyFunctions = false) {
+ function serializeObject(object, stringifyFunctions:boolean = false): string {
// Handle permissions errors
try {
if (object === null) {
@@ -190,32 +232,6 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
}
- /*
- * Direct instrumentation of javascript objects
- */
-
- const sendFactory = function($event_id, $sendMessagesToLogger) {
- let messages = [];
- // debounce sending queued messages
- const _send = debounce(function() {
- $sendMessagesToLogger($event_id, messages);
-
- // clear the queue
- messages = [];
- }, 100);
-
- return function(msgType, msg) {
- // queue the message
- messages.push({ type: msgType, content: msg });
- _send();
- };
- };
-
- const send = sendFactory(event_id, sendMessagesToLogger);
-
- // Counter to cap # of calls logged for each script/api combination
- const maxLogCount = 500;
- const logCounter = new Object();
function updateCounterAndCheckIfOver(scriptUrl, symbol) {
const key = scriptUrl + "|" + symbol;
@@ -229,18 +245,12 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
return false;
}
- // Prevent logging of gets arising from logging
- let inLog = false;
-
- // To keep track of the original order of events
- let ordinal = 0;
-
// For gets, sets, etc. on a single value
function logValue(
- instrumentedVariableName,
- value,
- operation,
- callContext,
+ instrumentedVariableName: string,
+ value: any,
+ operation: JSOperation,
+ callContext: any,
logSettings: LogSettings,
) {
if (inLog) {
@@ -260,7 +270,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
const msg = {
operation,
symbol: instrumentedVariableName,
- value: serializeObject(value, !!logSettings.logFunctionsAsStrings),
+ value: serializeObject(value, logSettings.logFunctionsAsStrings),
scriptUrl: callContext.scriptUrl,
scriptLine: callContext.scriptLine,
scriptCol: callContext.scriptCol,
@@ -281,7 +291,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
// For functions
- function logCall(instrumentedFunctionName, args, callContext, logSettings: LogSettings) {
+ function logCall(instrumentedFunctionName: string, args: IArguments, callContext: any, logSettings: LogSettings) {
if (inLog) {
return;
}
@@ -298,14 +308,14 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
try {
// Convert special arguments array to a standard array for JSONifying
- const serialArgs = [];
- for (let i = 0; i < args.length; i++) {
+ const serialArgs: string[] = [];
+ for (let arg of args) {
serialArgs.push(
- serializeObject(args[i], !!logSettings.logFunctionsAsStrings),
+ serializeObject(arg, logSettings.logFunctionsAsStrings),
);
}
const msg = {
- operation: "call",
+ operation: JSOperation.call,
symbol: instrumentedFunctionName,
args: serialArgs,
value: "",
@@ -338,35 +348,6 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
}
- // Rough implementations of Object.getPropertyDescriptor and Object.getPropertyNames
- // See http://wiki.ecmascript.org/doku.php?id=harmony:extended_object_api
- Object.getPropertyDescriptor = function(subject, name) {
- if (subject === undefined) {
- throw new Error("Can't get property descriptor for undefined");
- }
- let pd = Object.getOwnPropertyDescriptor(subject, name);
- let proto = Object.getPrototypeOf(subject);
- while (pd === undefined && proto !== null) {
- pd = Object.getOwnPropertyDescriptor(proto, name);
- proto = Object.getPrototypeOf(proto);
- }
- return pd;
- };
-
- Object.getPropertyNames = function(subject) {
- if (subject === undefined) {
- throw new Error("Can't get property names for undefined");
- }
- let props = Object.getOwnPropertyNames(subject);
- let proto = Object.getPrototypeOf(subject);
- while (proto !== null) {
- props = props.concat(Object.getOwnPropertyNames(proto));
- proto = Object.getPrototypeOf(proto);
- }
- // FIXME: remove duplicate property names from props
- return props;
- };
-
// Helper to get originating script urls
function getStackTrace() {
let stack;
@@ -481,9 +462,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
// which object method `func` is coming from in the logs
function instrumentFunction(objectName: string, methodName: string, func: any, logSettings: LogSettings) {
return function() {
- const callContext = getOriginatingScriptContext(
- !!logSettings.logCallStack,
- );
+ const callContext = getOriginatingScriptContext(logSettings.logCallStack);
logCall(
objectName + "." + methodName,
arguments,
@@ -516,11 +495,10 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
// Property descriptor must exist unless we are instrumenting a
// non-existing property
+
if (
!propDesc &&
- (!logSettings.nonExistingPropertiesToInstrument ||
- logSettings.nonExistingPropertiesToInstrument.indexOf(propertyName) ==
- -1)
+ !logSettings.nonExistingPropertiesToInstrument.includes(propertyName)
) {
console.error(
"Property descriptor not found for",
@@ -555,9 +533,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
get: (function() {
return function() {
let origProperty;
- const callContext = getOriginatingScriptContext(
- !!logSettings.logCallStack,
- );
+ const callContext = getOriginatingScriptContext(logSettings.logCallStack);
// get original value
if (!propDesc) {
@@ -578,7 +554,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
logValue(
objectName + "." + propertyName,
"",
- "get(failed)",
+ JSOperation.get_failed,
callContext,
logSettings,
);
@@ -594,7 +570,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
logValue(
objectName + "." + propertyName,
origProperty,
- "get(function)",
+ JSOperation.get_function,
callContext,
logSettings,
);
@@ -625,7 +601,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
logValue(
objectName + "." + propertyName,
origProperty,
- "get",
+ JSOperation.get,
callContext,
logSettings,
);
@@ -635,21 +611,18 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
})(),
set: (function() {
return function(value) {
- const callContext = getOriginatingScriptContext(
- !!logSettings.logCallStack,
- );
+ const callContext = getOriginatingScriptContext(logSettings.logCallStack);
let returnValue;
// Prevent sets for functions and objects if enabled
if (
- !!logSettings.preventSets &&
- (typeof originalValue === "function" ||
- typeof originalValue === "object")
+ logSettings.preventSets &&
+ (typeof originalValue === "function" || typeof originalValue === "object")
) {
logValue(
objectName + "." + propertyName,
value,
- "set(prevented)",
+ JSOperation.set_prevented,
callContext,
logSettings,
);
@@ -672,31 +645,24 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
returnValue = value;
inLog = false;
} else {
- console.error(
- "Property descriptor for",
- objectName + "." + propertyName,
- "doesn't have setter or value?",
- );
+ let instrumentedVariableName = `${objectName}.${propertyName}`;
+ console.error(`Property descriptor for ${instrumentedVariableName} doesn't have setter or value?`);
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
value,
- "set(failed)",
+ JSOperation.set_failed,
callContext,
logSettings,
);
return value;
}
-
- // log set
logValue(
objectName + "." + propertyName,
value,
- "set",
+ JSOperation.set,
callContext,
logSettings,
);
-
- // return new value
return returnValue;
};
})(),
@@ -759,6 +725,25 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
}
}
+ const sendFactory = function($event_id, $sendMessagesToLogger) {
+ let messages = [];
+ // debounce sending queued messages
+ const _send = debounce(function() {
+ $sendMessagesToLogger($event_id, messages);
+
+ // clear the queue
+ messages = [];
+ }, 100);
+
+ return function(msgType, msg) {
+ // queue the message
+ messages.push({ type: msgType, content: msg });
+ _send();
+ };
+ };
+
+ const send = sendFactory(event_id, sendMessagesToLogger);
+
function instrumentJS(spec: JSInstrumentRequest[]) {
spec.forEach(function(item) {
instrumentObject(item.object, item.objectName, item.logSettings)
diff --git a/automation/Extension/webext-instrumentation/src/schema.ts b/automation/Extension/webext-instrumentation/src/schema.ts
index 4a41e929f..e8e3de873 100644
--- a/automation/Extension/webext-instrumentation/src/schema.ts
+++ b/automation/Extension/webext-instrumentation/src/schema.ts
@@ -119,6 +119,17 @@ export interface HttpRedirect {
time_stamp: DateTime;
}
+
+export enum JSOperation {
+ call = 'call',
+ get = 'get',
+ get_failed = 'get(failed)',
+ get_function = 'get(function)',
+ set = 'set',
+ set_failed = 'set(failed)',
+ set_prevented = 'set(prevented)',
+}
+
export interface JavascriptOperation {
id?: number;
incognito?: number;
@@ -139,7 +150,7 @@ export interface JavascriptOperation {
top_level_url?: string;
call_stack?: string;
symbol?: string;
- operation?: string;
+ operation?: JSOperation;
value?: string;
arguments?: string;
time_stamp: DateTime;
From a9f3d93bf41e90b9e8e50d74a208ed7d8356a802 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 19:06:07 -0500
Subject: [PATCH 013/106] Begin implementing jsModuleRequest validation.
Changing my mind - all validation and construction to be done python
side.
This will reduce JS overhead at runtime.
---
.../Extension/firefox/feature.js/index.js | 12 +++--
.../javascript-instrument-content-scope.ts | 54 +++++++++++++++++--
.../src/lib/js-instruments.ts | 40 +++++++-------
.../src/types/js-instrumentation.d.ts | 2 +-
4 files changed, 75 insertions(+), 33 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index b0b1a84e6..74c0becbd 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -22,14 +22,16 @@ async function main() {
js_instrument:true,
js_instrument_modules: [
// Shortcut
- "fingerprinting",
+ //"fingerprinting",
// APIs
- "Storage",
- {"XMLHttpRequest": ["send"]},
+ {"XMLHttpRequest": {"badSetting": 1}},
+ {"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ {"Prop1": ["hi"], "Prop2": ["hi2"]},
{"XMLHttpRequest": ["send"]},
+ "Storage",
// Specific instances on window
- {"window.document": ["cookie", "referrer"]},
- {"window": ["name", "localStorage", "sessionStorage"]}
+ //{"window.document": ["cookie", "referrer"]},
+ //{"window": ["name", "localStorage", "sessionStorage"]}
],
http_instrument:true,
callstack_instrument:true,
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 92e901f06..694e146ed 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -1,13 +1,37 @@
-import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-apis";
+//import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-apis";
import { getInstrumentJS, LogSettings } from "../lib/js-instruments";
import { api } from "../lib/mdn-browser-compat-data";
import { pageScript } from "./javascript-instrument-page-scope";
import { JSInstrumentRequest } from "../types/js-instrumentation";
+const presetMap = {
+ 'fingerprinting': '../js-instrumentation-presets/fingerprinting.json',
+};
+
+function validateJsModuleRequest(jsModuleRequest: any) {
+ if (typeof jsModuleRequest === 'string') {
+ const isPreset = Object.keys(presetMap).includes(jsModuleRequest);
+ const isAPI = api.includes(jsModuleRequest);
+ if (!isPreset && !isAPI) {
+ throw new Error(`String jsModuleRequest ${jsModuleRequest} is not a preset or a recognized API.`);
+ }
+ } else if (typeof jsModuleRequest === 'object') {
+ const properties = Object.keys(jsModuleRequest);
+ if (properties.length !== 1) {
+ throw new Error(`Object jsModuleRequest must only have one property.`);
+ }
+
+
+ } else {
+ throw new Error(`Invalid jsModuleRequest: ${jsModuleRequest}. Must be string or object.`)
+ }
+ console.debug(`Validation successful for`, jsModuleRequest);
+}
+
function getPageScriptAsString(jsModuleRequests: any[]): string {
- // The new goal of this function will be to collect together a de-duped
- // list of JSInstrumentRequests from the input request which may include
- // short hand.
+ // The new goal of this function is to collect together a de-duped
+ // list of JSInstrumentRequests from the input request (which allows
+ // shorthand for various things).
/*
We accept a list. From the list we need to parse each item.
@@ -22,12 +46,32 @@ function getPageScriptAsString(jsModuleRequests: any[]): string {
- If the value is a list, it is transformed into the propertiesToInstrument
property of a new LogSettings object.
-
+ We must also create the instrumentedName value.
*/
const instrumentationRequests: JSInstrumentRequest[] = [];
+ if (!Array.isArray(jsModuleRequests)) {
+ throw new Error(`jsModuleRequests, must be an Array. Received: ${jsModuleRequests}`);
+ }
+
+ for (let jsModuleRequest of jsModuleRequests) {
+
+ validateJsModuleRequest(jsModuleRequest);
+
+ console.log(presetMap);
+ let logSettings = new LogSettings();
+ let requestedModule = jsModuleRequest.object;
+ console.log(logSettings);
+ console.log(requestedModule);
+ instrumentationRequests.push({
+ object: requestedModule,
+ instrumentedName: 'name',
+ logSettings: logSettings,
+ });
+ }
+
/*
const instrumentedApiFuncs: string[] = [];
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 1b5d51a5b..c44b9c156 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -493,9 +493,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
// Store original descriptor in closure
const propDesc = Object.getPropertyDescriptor(object, propertyName);
- // Property descriptor must exist unless we are instrumenting a
- // non-existing property
-
+ // Property descriptor must exist unless we are instrumenting a nonExisting property
if (
!propDesc &&
!logSettings.nonExistingPropertiesToInstrument.includes(propertyName)
@@ -534,6 +532,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
return function() {
let origProperty;
const callContext = getOriginatingScriptContext(logSettings.logCallStack);
+ let instrumentedVariableName = `${objectName}.${propertyName}`;
// get original value
if (!propDesc) {
@@ -546,13 +545,9 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
// if data property
origProperty = originalValue;
} else {
- console.error(
- "Property descriptor for",
- objectName + "." + propertyName,
- "doesn't have getter or value?",
- );
+ console.error( `Property descriptor for ${instrumentedVariableName} doesn't have getter or value?`);
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
"",
JSOperation.get_failed,
callContext,
@@ -568,7 +563,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
if (typeof origProperty === "function") {
if (logSettings.logFunctionGets) {
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
origProperty,
JSOperation.get_function,
callContext,
@@ -599,7 +594,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
return origProperty;
} else {
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
origProperty,
JSOperation.get,
callContext,
@@ -612,6 +607,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
set: (function() {
return function(value) {
const callContext = getOriginatingScriptContext(logSettings.logCallStack);
+ let instrumentedVariableName = `${objectName}.${propertyName}`;
let returnValue;
// Prevent sets for functions and objects if enabled
@@ -620,7 +616,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
(typeof originalValue === "function" || typeof originalValue === "object")
) {
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
value,
JSOperation.set_prevented,
callContext,
@@ -645,7 +641,6 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
returnValue = value;
inLog = false;
} else {
- let instrumentedVariableName = `${objectName}.${propertyName}`;
console.error(`Property descriptor for ${instrumentedVariableName} doesn't have setter or value?`);
logValue(
instrumentedVariableName,
@@ -657,7 +652,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
return value;
}
logValue(
- objectName + "." + propertyName,
+ instrumentedVariableName,
value,
JSOperation.set,
callContext,
@@ -669,7 +664,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
});
}
- function instrumentObject(object: any, objectName: string, logSettings: LogSettings) {
+ function instrumentObject(object: any, instrumentedName: string, logSettings: LogSettings) {
if (logSettings.propertiesToInstrument.length === 0) {
logSettings.propertiesToInstrument = Object.getPropertyNames(object);
}
@@ -685,26 +680,27 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
isObject(object, propertyName) &&
propertyName !== "__proto__"
) {
+ let newInstrumentedName = `${instrumentedName}.${propertyName}`;
let newDepth = logSettings.depth - 1;
logSettings.depth = newDepth
instrumentObject(
object[propertyName],
- objectName + "." + propertyName,
+ newInstrumentedName,
logSettings,
);
}
try {
- instrumentObjectProperty(object, objectName, propertyName, logSettings);
+ instrumentObjectProperty(object, instrumentedName, propertyName, logSettings);
} catch (error) {
if (
error instanceof TypeError &&
error.message.includes("can't redefine non-configurable property")
) {
console.warn(
- `Cannot instrument non-configurable property: ${objectName}:${propertyName}`,
+ `Cannot instrument non-configurable property: ${instrumentedName}:${propertyName}`,
);
} else {
- logErrorToConsole(error, { objectName, propertyName });
+ logErrorToConsole(error, {instrumentedName, propertyName });
}
}
}
@@ -715,12 +711,12 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
try {
instrumentObjectProperty(
object,
- objectName,
+ instrumentedName,
propertyName,
logSettings,
);
} catch (error) {
- logErrorToConsole(error, { objectName, propertyName });
+ logErrorToConsole(error, {instrumentedName, propertyName });
}
}
}
@@ -746,7 +742,7 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
function instrumentJS(spec: JSInstrumentRequest[]) {
spec.forEach(function(item) {
- instrumentObject(item.object, item.objectName, item.logSettings)
+ instrumentObject(item.object, item.instrumentedName, item.logSettings)
})
}
diff --git a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
index f5dd3d2b1..3447d207d 100644
--- a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
+++ b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
@@ -12,6 +12,6 @@ export interface ILogSettings {
export interface JSInstrumentRequest {
object: string,
- objectName: string,
+ instrumentedName: string,
logSettings: ILogSettings,
}
\ No newline at end of file
From 9139ebecc2185198effb0f63f4c66d3b05e8ce20 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 19:51:51 -0500
Subject: [PATCH 014/106] Big cleanout- js-instrumentation work moving to
python.
---
.../scripts/make_mdn_browser_compat_file.js | 3 +-
.../src/background/javascript-instrument.ts | 4 +-
.../javascript-instrument-content-scope.ts | 132 +++---------------
.../javascript-instrument-page-scope.ts | 13 +-
.../fingerprinting.json | 3 -
.../src/lib/js-instruments.ts | 54 ++-----
.../src/types/js-instrumentation.d.ts | 4 +-
automation/JSInstrumentation.py | 103 ++++++++++++++
.../instrument-fingerprinting-apis.ts | 0
.../mdn-browser-compat-data.ts | 0
10 files changed, 139 insertions(+), 177 deletions(-)
delete mode 100644 automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
create mode 100644 automation/JSInstrumentation.py
rename automation/{Extension/webext-instrumentation/src/lib => js_instrumentation}/instrument-fingerprinting-apis.ts (100%)
rename automation/{Extension/webext-instrumentation/src/lib => js_instrumentation}/mdn-browser-compat-data.ts (100%)
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
index b4e45b1ad..0a10de183 100755
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -13,7 +13,8 @@ Object.keys(bcd.api).forEach(item => {
const output = `
// This file is generated from mdn-browser-compat-data by running
-// "npm run make-compat"
+// "npm run make-compat" in the Extension/webext-instrumentation
+// directory.
const api = [
${api.join(',\n ')}
];
diff --git a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
index 29ab59057..dab29fa15 100644
--- a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
+++ b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
@@ -110,10 +110,10 @@ export class JavascriptInstrument {
});
}
- public async registerContentScript(testing, modules) {
+ public async registerContentScript(testing: boolean, jsInstrumentationRequestsString: string) {
const contentScriptConfig = {
testing,
- modules,
+ jsInstrumentationRequestsString,
};
if (contentScriptConfig) {
// TODO: Avoid using window to pass the content script config
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 694e146ed..d3f9d3cd1 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -1,124 +1,30 @@
-//import { instrumentFingerprintingApis } from "../lib/instrument-fingerprinting-apis";
-import { getInstrumentJS, LogSettings } from "../lib/js-instruments";
-import { api } from "../lib/mdn-browser-compat-data";
+import { getInstrumentJS } from "../lib/js-instruments";
import { pageScript } from "./javascript-instrument-page-scope";
-import { JSInstrumentRequest } from "../types/js-instrumentation";
-const presetMap = {
- 'fingerprinting': '../js-instrumentation-presets/fingerprinting.json',
-};
+function getPageScriptAsString(jsInstrumentationRequestsString: string): string {
+ // The JS Instrument Requests are setup and validated python side
+ // including setting defaults for logSettings. See JSInstrumentation.py
-function validateJsModuleRequest(jsModuleRequest: any) {
- if (typeof jsModuleRequest === 'string') {
- const isPreset = Object.keys(presetMap).includes(jsModuleRequest);
- const isAPI = api.includes(jsModuleRequest);
- if (!isPreset && !isAPI) {
- throw new Error(`String jsModuleRequest ${jsModuleRequest} is not a preset or a recognized API.`);
- }
- } else if (typeof jsModuleRequest === 'object') {
- const properties = Object.keys(jsModuleRequest);
- if (properties.length !== 1) {
- throw new Error(`Object jsModuleRequest must only have one property.`);
- }
+ // The string jsInstrumentationRequestsString should be a JSON list.
+ // If testing, use this carefully as no validation happens JS side.
+ // You can use the JSInstrumentation.py as a standalone module to validate input.
+ // We do this to help the JS instrumentation code load as fast as possible.
-
- } else {
- throw new Error(`Invalid jsModuleRequest: ${jsModuleRequest}. Must be string or object.`)
- }
- console.debug(`Validation successful for`, jsModuleRequest);
-}
-
-function getPageScriptAsString(jsModuleRequests: any[]): string {
- // The new goal of this function is to collect together a de-duped
- // list of JSInstrumentRequests from the input request (which allows
- // shorthand for various things).
-
- /*
- We accept a list. From the list we need to parse each item.
- The item may be a string or an object with one key.
- If the item is a string:
- - Is it a shortcut e.g. "fingerprinting"
- - Is it an object (verified by mdn-browser-compat)
- - If neither, reject
- If the item is an object:
- - Must only have one property
- - The value may be a list or a LogSettings object
- - If the value is a list, it is transformed into the propertiesToInstrument
- property of a new LogSettings object.
-
- We must also create the instrumentedName value.
- */
-
-
- const instrumentationRequests: JSInstrumentRequest[] = [];
-
- if (!Array.isArray(jsModuleRequests)) {
- throw new Error(`jsModuleRequests, must be an Array. Received: ${jsModuleRequests}`);
- }
-
- for (let jsModuleRequest of jsModuleRequests) {
-
- validateJsModuleRequest(jsModuleRequest);
-
- console.log(presetMap);
- let logSettings = new LogSettings();
- let requestedModule = jsModuleRequest.object;
- console.log(logSettings);
- console.log(requestedModule);
- instrumentationRequests.push({
- object: requestedModule,
- instrumentedName: 'name',
- logSettings: logSettings,
- });
- }
-
- /*
- const instrumentedApiFuncs: string[] = [];
-
- jsModuleRequests.forEach(requestedModule => {
- if (requestedModule == "fingerprinting") {
- // Special case collection of fingerprinting
- instrumentedApiFuncs.push(String(instrumentFingerprintingApis));
- } else {
- // Note: We only do whole modules for now
- // Check requestedModule is a member of api
- if (api.includes(requestedModule)) {
- // Then add functions that do the instrumentation
- instrumentedApiFuncs.push(`
- function instrument${requestedModule}({
- instrumentObjectProperty,
- instrumentObject,
- }) {
- instrumentObject(window.${requestedModule}.prototype, "${requestedModule}");
- }
- `);
- } else {
- console.error(
- `The requested module ${requestedModule} does not appear to be part of browser api.`,
- );
- }
- }
- });
- */
- // Build script as string
const pageScriptString = `
${getInstrumentJS}
- const instrumentationRequests = [${instrumentationRequests.join(",\n")}];
+ const instrumentationRequests = ${jsInstrumentationRequestsString};
(${String(pageScript)}({getInstrumentJS, instrumentationRequests}));
`;
return pageScriptString;
}
-function insertScript(text, data) {
+function insertScript(pageScript: string, event_id: string, testing: boolean = false) {
const parent = document.documentElement,
script = document.createElement("script");
- script.text = text;
+ script.text = pageScript;
script.async = false;
-
- for (const key in data) {
- script.setAttribute("data-" + key.replace("_", "-"), data[key]);
- }
-
+ script.setAttribute("data-event-id", event_id);
+ script.setAttribute("data-testing", `${testing}`);
parent.insertBefore(script, parent.firstChild);
parent.removeChild(script);
}
@@ -132,10 +38,10 @@ function emitMsg(type, msg) {
});
}
-const event_id = Math.random();
+const event_id = Math.random().toString();
// listen for messages from the script we are about to insert
-document.addEventListener(event_id.toString(), function(e: CustomEvent) {
+document.addEventListener(event_id, function(e: CustomEvent) {
// pass these on to the background page
const msgs = e.detail;
if (Array.isArray(msgs)) {
@@ -148,9 +54,9 @@ document.addEventListener(event_id.toString(), function(e: CustomEvent) {
});
export function injectJavascriptInstrumentPageScript(contentScriptConfig) {
- const jsModules: string[] = contentScriptConfig.modules;
- insertScript(getPageScriptAsString(jsModules), {
+ insertScript(
+ getPageScriptAsString(contentScriptConfig.jsInstrumentationRequestsString),
event_id,
- ...contentScriptConfig,
- });
+ contentScriptConfig.testing,
+ );
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index 5db88d0db..595a9ff91 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -17,18 +17,11 @@ export const pageScript = function({
}
const event_id = document.currentScript.getAttribute("data-event-id");
- const instrumentJS = getInstrumentJS(
- event_id,
- sendMessagesToLogger,
- );
+ const testing = document.currentScript.getAttribute("data-testing");
+ const instrumentJS = getInstrumentJS(event_id, sendMessagesToLogger);
instrumentJS(instrumentionRequests);
- /*
- * Log if testing
- */
- const testing =
- document.currentScript.getAttribute("data-testing") === "true";
- if (testing) {
+ if (testing === "true") {
console.log("OpenWPM: Currently testing");
(window as any).instrumentJS = instrumentJS;
console.log(
diff --git a/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json b/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
deleted file mode 100644
index c44dc44f3..000000000
--- a/automation/Extension/webext-instrumentation/src/js-instrumentation-presets/fingerprinting.json
+++ /dev/null
@@ -1,3 +0,0 @@
-[
-
-]
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index c44b9c156..522d37e20 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -2,7 +2,7 @@
// https://github.com/EFForg/privacybadgerfirefox/blob/master/data/fingerprinting.js
import {
- ILogSettings,
+ LogSettings,
JSInstrumentRequest,
} from "../types/js-instrumentation";
import {
@@ -19,49 +19,6 @@ declare global {
}
}
-// Implements ILogSettings and sets defaults
-export class LogSettings implements ILogSettings {
- // propertiesToInstrument : Array
- // An array of properties to instrument on this object.
- // If array is empty, then all properties are instrumented.
- // nonExistingPropertiesToInstrument : Array
- // An array of non-existing properties to instrument on this object.
- // excludedProperties : Array
- // Properties excluded from instrumentation.
- // logCallStack : boolean
- // Set to true save the call stack info with each property call.
- // logFunctionsAsStrings : boolean
- // Set to true to save functional arguments as strings during
- // argument serialization.
- // logFunctionGets: boolean
- // ....
- // preventSets : boolean
- // Set to true to prevent nested objects and functions from being
- // overwritten (and thus having their instrumentation removed).
- // Other properties (static values) can still be set with this is
- // enabled.
- // recursive : boolean
- // Set to `true` to recursively instrument all object properties of
- // the given `object`.
- // NOTE:
- // (1)`logSettings['propertiesToInstrument']` does not propagate
- // to sub-objects.
- // (2) Sub-objects of prototypes can not be instrumented
- // recursively as these properties can not be accessed
- // until an instance of the prototype is created.
- // depth : integer
- // Recursion limit when instrumenting object recursively.
- propertiesToInstrument: string[] = [];
- nonExistingPropertiesToInstrument: string[] = [];
- excludedProperties: string[] = [];
- logCallStack: boolean = false;
- logFunctionsAsStrings: boolean = false;
- logFunctionGets: boolean = false;
- preventSets: boolean = false;
- recursive: boolean = false;
- depth: number = 5;
-}
-
export function getInstrumentJS(event_id, sendMessagesToLogger) {
/*
* Instrumentation helpers
@@ -740,8 +697,13 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
const send = sendFactory(event_id, sendMessagesToLogger);
- function instrumentJS(spec: JSInstrumentRequest[]) {
- spec.forEach(function(item) {
+ function instrumentJS(JSInstrumentRequests: JSInstrumentRequest[]) {
+ // The JS Instrument Requests are setup and validated python side
+ // including setting defaults for logSettings.
+
+ // More details about how this function is invoked are in
+ // content/javascript-instrument-content-scope.ts
+ JSInstrumentRequests.forEach(function(item) {
instrumentObject(item.object, item.instrumentedName, item.logSettings)
})
}
diff --git a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
index 3447d207d..a54915975 100644
--- a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
+++ b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
@@ -1,4 +1,4 @@
-export interface ILogSettings {
+export interface LogSettings {
propertiesToInstrument: string[];
nonExistingPropertiesToInstrument: string[];
excludedProperties: string[];
@@ -13,5 +13,5 @@ export interface ILogSettings {
export interface JSInstrumentRequest {
object: string,
instrumentedName: string,
- logSettings: ILogSettings,
+ logSettings: LogSettings,
}
\ No newline at end of file
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
new file mode 100644
index 000000000..ad5a3d207
--- /dev/null
+++ b/automation/JSInstrumentation.py
@@ -0,0 +1,103 @@
+"""
+
+const presetMap = {
+ 'fingerprinting': '../js-instrumentation-presets/fingerprinting.json',
+};
+
+
+function validateJsModuleRequest(jsModuleRequest: any) {
+ if (typeof jsModuleRequest === 'string') {
+ const isPreset = Object.keys(presetMap).includes(jsModuleRequest);
+ const isAPI = api.includes(jsModuleRequest);
+ if (!isPreset && !isAPI) {
+ throw new Error(`String jsModuleRequest ${jsModuleRequest} is not a preset or a recognized API.`);
+ }
+ } else if (typeof jsModuleRequest === 'object') {
+ const properties = Object.keys(jsModuleRequest);
+ if (properties.length !== 1) {
+ throw new Error(`Object jsModuleRequest must only have one property.`);
+ }
+
+
+ } else {
+ throw new Error(`Invalid jsModuleRequest: ${jsModuleRequest}. Must be string or object.`)
+ }
+ console.debug(`Validation successful for`, jsModuleRequest);
+}
+
+
+
+ const instrumentationRequests: JSInstrumentRequest[] = [];
+
+ if (!Array.isArray(jsModuleRequests)) {
+ throw new Error(`jsModuleRequests, must be an Array. Received: ${jsModuleRequests}`);
+ }
+
+ for (let jsModuleRequest of jsModuleRequests) {
+
+ validateJsModuleRequest(jsModuleRequest);
+
+ console.log(presetMap);
+ let logSettings = new LogSettings();
+ let requestedModule = jsModuleRequest.object;
+ console.log(logSettings);
+ console.log(requestedModule);
+ instrumentationRequests.push({
+ object: requestedModule,
+ instrumentedName: 'name',
+ logSettings: logSettings,
+ });
+ }
+
+ /*
+ const instrumentedApiFuncs: string[] = [];
+
+ jsModuleRequests.forEach(requestedModule => {
+ if (requestedModule == "fingerprinting") {
+ // Special case collection of fingerprinting
+ instrumentedApiFuncs.push(String(instrumentFingerprintingApis));
+ } else {
+ // Note: We only do whole modules for now
+ // Check requestedModule is a member of api
+ if (api.includes(requestedModule)) {
+ // Then add functions that do the instrumentation
+ instrumentedApiFuncs.push(`
+ function instrument${requestedModule}({
+ instrumentObjectProperty,
+ instrumentObject,
+ }) {
+ instrumentObject(window.${requestedModule}.prototype, "${requestedModule}");
+ }
+ `);
+ } else {
+ console.error(
+ `The requested module ${requestedModule} does not appear to be part of browser api.`,
+ );
+ }
+ }
+ });
+ */
+
+
+ // The new goal of this function is to collect together a de-duped
+ // list of JSInstrumentRequests from the input request (which allows
+ // shorthand for various things).
+
+ /*
+ We accept a list. From the list we need to parse each item.
+ The item may be a string or an object with one key.
+ If the item is a string:
+ - Is it a shortcut e.g. "fingerprinting"
+ - Is it an object (verified by mdn-browser-compat)
+ - If neither, reject
+ If the item is an object:
+ - Must only have one property
+ - The value may be a list or a LogSettings object
+ - If the value is a list, it is transformed into the propertiesToInstrument
+ property of a new LogSettings object.
+
+ We must also create the instrumentedName value.
+ */
+
+
+"""
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/src/lib/instrument-fingerprinting-apis.ts b/automation/js_instrumentation/instrument-fingerprinting-apis.ts
similarity index 100%
rename from automation/Extension/webext-instrumentation/src/lib/instrument-fingerprinting-apis.ts
rename to automation/js_instrumentation/instrument-fingerprinting-apis.ts
diff --git a/automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts b/automation/js_instrumentation/mdn-browser-compat-data.ts
similarity index 100%
rename from automation/Extension/webext-instrumentation/src/lib/mdn-browser-compat-data.ts
rename to automation/js_instrumentation/mdn-browser-compat-data.ts
From ce3b80e364f8f47a05ebb1850e9b1cbad1d4ceb4 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 21:29:56 -0500
Subject: [PATCH 015/106] Continue update to python js-instrumentation
---
.../Extension/firefox/feature.js/index.js | 45 ++++++++++-----
.../javascript-instrument-content-scope.ts | 18 ++++--
.../javascript-instrument-page-scope.ts | 12 ++--
.../src/lib/js-instruments.ts | 5 +-
automation/JSInstrumentation.py | 56 +++++++++++++++++++
5 files changed, 109 insertions(+), 27 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index 74c0becbd..c0536313d 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -20,19 +20,38 @@ async function main() {
navigation_instrument:true,
cookie_instrument:true,
js_instrument:true,
- js_instrument_modules: [
- // Shortcut
- //"fingerprinting",
- // APIs
- {"XMLHttpRequest": {"badSetting": 1}},
- {"XMLHttpRequest": {"excludedProperties": ["send"]}},
- {"Prop1": ["hi"], "Prop2": ["hi2"]},
- {"XMLHttpRequest": ["send"]},
- "Storage",
- // Specific instances on window
- //{"window.document": ["cookie", "referrer"]},
- //{"window": ["name", "localStorage", "sessionStorage"]}
- ],
+ js_instrument_modules: `
+ [
+ {
+ object: window.CanvasRenderingContext2D.prototype,
+ instrumentedName: "CanvasRenderingContext2D",
+ logSettings: {
+ propertiesToInstrument: [],
+ nonExistingPropertiesToInstrument: [],
+ excludedProperties: [],
+ excludedProperties: [
+ "quadraticCurveTo",
+ "lineTo",
+ "transform",
+ "globalAlpha",
+ "moveTo",
+ "drawImage",
+ "setTransform",
+ "clearRect",
+ "closePath",
+ "beginPath",
+ "canvas",
+ "translate",
+ ],
+ logCallStack: false,
+ logFunctionsAsStrings: false,
+ logFunctionGets: false,
+ preventSets: false,
+ recursive: false,
+ depth: 5,
+ }
+ },
+ ]`,
http_instrument:true,
callstack_instrument:true,
save_content:false,
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index d3f9d3cd1..0b25106c8 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -5,16 +5,24 @@ function getPageScriptAsString(jsInstrumentationRequestsString: string): string
// The JS Instrument Requests are setup and validated python side
// including setting defaults for logSettings. See JSInstrumentation.py
- // The string jsInstrumentationRequestsString should be a JSON list.
+ // The string jsInstrumentationRequestsString should be a string of a JS list.
// If testing, use this carefully as no validation happens JS side.
// You can use the JSInstrumentation.py as a standalone module to validate input.
// We do this to help the JS instrumentation code load as fast as possible.
-
const pageScriptString = `
- ${getInstrumentJS}
- const instrumentationRequests = ${jsInstrumentationRequestsString};
- (${String(pageScript)}({getInstrumentJS, instrumentationRequests}));
+// Start of js-instruments.
+${getInstrumentJS}
+// End of js-instruments.
+
+// Start of custom instrumentRequests.
+const instrumentationRequests = ${jsInstrumentationRequestsString};
+// End of custom instrumentRequests.
+
+// Start of anonymous function from javascript-instrument-page-scope.ts
+(${pageScript}(getInstrumentJS, instrumentationRequests));
+// End.
`;
+
return pageScriptString;
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index 595a9ff91..6f845e3b2 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -2,10 +2,7 @@
// Also, no webpack/es6 imports may be used in this file since the script
// is exported as a page script as a string
-export const pageScript = function({
- getInstrumentJS,
- instrumentionRequests, // Spec to pass to instrumentJS function
-}) {
+export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
// messages the injected script
function sendMessagesToLogger($event_id, messages) {
@@ -18,16 +15,17 @@ export const pageScript = function({
const event_id = document.currentScript.getAttribute("data-event-id");
const testing = document.currentScript.getAttribute("data-testing");
- const instrumentJS = getInstrumentJS(event_id, sendMessagesToLogger);
- instrumentJS(instrumentionRequests);
+ const instrumentJS = $getInstrumentJS(event_id, sendMessagesToLogger);
+ instrumentJS($instrumentionRequests);
if (testing === "true") {
console.log("OpenWPM: Currently testing");
(window as any).instrumentJS = instrumentJS;
console.log(
"OpenWPM: Content-side javascript instrumentation started with spec:",
- instrumentionRequests,
+ $instrumentionRequests,
new Date().toISOString(),
+ "(if check web console.)"
);
}
};
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 522d37e20..320ff9902 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -19,7 +19,7 @@ declare global {
}
}
-export function getInstrumentJS(event_id, sendMessagesToLogger) {
+export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
/*
* Instrumentation helpers
* (Inlined in order for jsInstruments to be easily exportable as a string)
@@ -708,5 +708,6 @@ export function getInstrumentJS(event_id, sendMessagesToLogger) {
})
}
- return { instrumentJS };
+ // This whole function getInstrumentJS returns just the function `instrumentJS`.
+ return instrumentJS;
}
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index ad5a3d207..014246f3b 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -99,5 +99,61 @@
We must also create the instrumentedName value.
*/
+// Implements ILogSettings and sets defaults
+export class LogSettings implements ILogSettings {
+ // propertiesToInstrument : Array
+ // An array of properties to instrument on this object.
+ // If array is empty, then all properties are instrumented.
+ // nonExistingPropertiesToInstrument : Array
+ // An array of non-existing properties to instrument on this object.
+ // excludedProperties : Array
+ // Properties excluded from instrumentation.
+ // logCallStack : boolean
+ // Set to true save the call stack info with each property call.
+ // logFunctionsAsStrings : boolean
+ // Set to true to save functional arguments as strings during
+ // argument serialization.
+ // logFunctionGets: boolean
+ // ....
+ // preventSets : boolean
+ // Set to true to prevent nested objects and functions from being
+ // overwritten (and thus having their instrumentation removed).
+ // Other properties (static values) can still be set with this is
+ // enabled.
+ // recursive : boolean
+ // Set to `true` to recursively instrument all object properties of
+ // the given `object`.
+ // NOTE:
+ // (1)`logSettings['propertiesToInstrument']` does not propagate
+ // to sub-objects.
+ // (2) Sub-objects of prototypes can not be instrumented
+ // recursively as these properties can not be accessed
+ // until an instance of the prototype is created.
+ // depth : integer
+ // Recursion limit when instrumenting object recursively.
+ propertiesToInstrument: string[] = [];
+ nonExistingPropertiesToInstrument: string[] = [];
+ excludedProperties: string[] = [];
+ logCallStack: boolean = false;
+ logFunctionsAsStrings: boolean = false;
+ logFunctionGets: boolean = false;
+ preventSets: boolean = false;
+ recursive: boolean = false;
+ depth: number = 5;
+}
+
+
+ // Shortcut
+ //"fingerprinting",
+ // APIs
+ {"XMLHttpRequest": {"badSetting": 1}},
+ {"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ {"Prop1": ["hi"], "Prop2": ["hi2"]},
+ {"XMLHttpRequest": ["send"]},
+ "Storage",
+ // Specific instances on window
+ //{"window.document": ["cookie", "referrer"]},
+ //{"window": ["name", "localStorage", "sessionStorage"]}
+
"""
\ No newline at end of file
From cdd2f0d1019ef48fb39092252a20136cb2304446 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 21:43:18 -0500
Subject: [PATCH 016/106] Lint
Can't do all the things I want to with typing due to scope
when content is loaded into page.
---
.../Extension/firefox/feature.js/index.js | 15 +--
.../src/background/javascript-instrument.ts | 5 +-
.../javascript-instrument-content-scope.ts | 18 ++-
.../javascript-instrument-page-scope.ts | 3 +-
.../src/lib/js-instruments.ts | 121 +++++++++++++-----
.../webext-instrumentation/src/schema.ts | 13 +-
.../src/types/js-instrumentation.d.ts | 17 ---
7 files changed, 107 insertions(+), 85 deletions(-)
delete mode 100644 automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index c0536313d..2edf15891 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -29,20 +29,7 @@ async function main() {
propertiesToInstrument: [],
nonExistingPropertiesToInstrument: [],
excludedProperties: [],
- excludedProperties: [
- "quadraticCurveTo",
- "lineTo",
- "transform",
- "globalAlpha",
- "moveTo",
- "drawImage",
- "setTransform",
- "clearRect",
- "closePath",
- "beginPath",
- "canvas",
- "translate",
- ],
+ excludedProperties: [],
logCallStack: false,
logFunctionsAsStrings: false,
logFunctionGets: false,
diff --git a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
index dab29fa15..a58e3842f 100644
--- a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
+++ b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
@@ -110,7 +110,10 @@ export class JavascriptInstrument {
});
}
- public async registerContentScript(testing: boolean, jsInstrumentationRequestsString: string) {
+ public async registerContentScript(
+ testing: boolean,
+ jsInstrumentationRequestsString: string,
+ ) {
const contentScriptConfig = {
testing,
jsInstrumentationRequestsString,
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index 0b25106c8..d4ab7cb80 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -1,7 +1,9 @@
import { getInstrumentJS } from "../lib/js-instruments";
import { pageScript } from "./javascript-instrument-page-scope";
-function getPageScriptAsString(jsInstrumentationRequestsString: string): string {
+function getPageScriptAsString(
+ jsInstrumentationRequestsString: string,
+): string {
// The JS Instrument Requests are setup and validated python side
// including setting defaults for logSettings. See JSInstrumentation.py
@@ -26,10 +28,14 @@ const instrumentationRequests = ${jsInstrumentationRequestsString};
return pageScriptString;
}
-function insertScript(pageScript: string, event_id: string, testing: boolean = false) {
+function insertScript(
+ pageScriptString: string,
+ event_id: string,
+ testing: boolean = false,
+) {
const parent = document.documentElement,
script = document.createElement("script");
- script.text = pageScript;
+ script.text = pageScriptString;
script.async = false;
script.setAttribute("data-event-id", event_id);
script.setAttribute("data-testing", `${testing}`);
@@ -46,10 +52,10 @@ function emitMsg(type, msg) {
});
}
-const event_id = Math.random().toString();
+const $event_id = Math.random().toString();
// listen for messages from the script we are about to insert
-document.addEventListener(event_id, function(e: CustomEvent) {
+document.addEventListener($event_id, function(e: CustomEvent) {
// pass these on to the background page
const msgs = e.detail;
if (Array.isArray(msgs)) {
@@ -64,7 +70,7 @@ document.addEventListener(event_id, function(e: CustomEvent) {
export function injectJavascriptInstrumentPageScript(contentScriptConfig) {
insertScript(
getPageScriptAsString(contentScriptConfig.jsInstrumentationRequestsString),
- event_id,
+ $event_id,
contentScriptConfig.testing,
);
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index 6f845e3b2..c9e641636 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -3,7 +3,6 @@
// is exported as a page script as a string
export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
-
// messages the injected script
function sendMessagesToLogger($event_id, messages) {
document.dispatchEvent(
@@ -25,7 +24,7 @@ export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
"OpenWPM: Content-side javascript instrumentation started with spec:",
$instrumentionRequests,
new Date().toISOString(),
- "(if check web console.)"
+ "(if spec is '' check web console.)",
);
}
};
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 320ff9902..1b8b9a3d5 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -1,13 +1,23 @@
// Intrumentation injection code is based on privacybadgerfirefox
// https://github.com/EFForg/privacybadgerfirefox/blob/master/data/fingerprinting.js
-import {
- LogSettings,
- JSInstrumentRequest,
-} from "../types/js-instrumentation";
-import {
- JSOperation
-} from "../schema";
+interface LogSettings {
+ propertiesToInstrument: string[];
+ nonExistingPropertiesToInstrument: string[];
+ excludedProperties: string[];
+ logCallStack: boolean;
+ logFunctionsAsStrings: boolean;
+ logFunctionGets: boolean;
+ preventSets: boolean;
+ recursive: boolean;
+ depth: number;
+}
+
+interface JSInstrumentRequest {
+ object: string;
+ instrumentedName: string;
+ logSettings: LogSettings;
+}
declare global {
interface Object {
@@ -34,6 +44,16 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
// To keep track of the original order of events
let ordinal = 0;
+ // Options for JSOperation
+ const JSOperation = {
+ call: "call",
+ get: "get",
+ get_failed: "get(failed)",
+ get_function: "get(function)",
+ set: "set",
+ set_failed: "set(failed)",
+ set_prevented: "set(prevented)",
+ };
// Rough implementations of Object.getPropertyDescriptor and Object.getPropertyNames
// See http://wiki.ecmascript.org/doku.php?id=harmony:extended_object_api
@@ -65,7 +85,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
};
// debounce - from Underscore v1.6.0
- function debounce(func, wait, immediate:boolean = false) {
+ function debounce(func, wait, immediate: boolean = false) {
let timeout, args, context, timestamp, result;
const later = function() {
@@ -99,7 +119,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
}
// Recursively generates a path for an element
- function getPathToDomElement(element:any, visibilityAttr:boolean = false) {
+ function getPathToDomElement(element: any, visibilityAttr: boolean = false) {
if (element === document.body) {
return element.tagName;
}
@@ -134,7 +154,10 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
}
// Helper for JSONifying objects
- function serializeObject(object, stringifyFunctions:boolean = false): string {
+ function serializeObject(
+ object,
+ stringifyFunctions: boolean = false,
+ ): string {
// Handle permissions errors
try {
if (object === null) {
@@ -189,7 +212,6 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
}
}
-
function updateCounterAndCheckIfOver(scriptUrl, symbol) {
const key = scriptUrl + "|" + symbol;
if (key in logCounter && logCounter[key] >= maxLogCount) {
@@ -206,7 +228,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
function logValue(
instrumentedVariableName: string,
value: any,
- operation: JSOperation,
+ operation: string, // from JSOperation object please
callContext: any,
logSettings: LogSettings,
) {
@@ -248,7 +270,12 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
}
// For functions
- function logCall(instrumentedFunctionName: string, args: IArguments, callContext: any, logSettings: LogSettings) {
+ function logCall(
+ instrumentedFunctionName: string,
+ args: IArguments,
+ callContext: any,
+ logSettings: LogSettings,
+ ) {
if (inLog) {
return;
}
@@ -266,7 +293,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
try {
// Convert special arguments array to a standard array for JSONifying
const serialArgs: string[] = [];
- for (let arg of args) {
+ for (const arg of args) {
serialArgs.push(
serializeObject(arg, logSettings.logFunctionsAsStrings),
);
@@ -417,7 +444,12 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
// This helper function returns a wrapper around `func` which logs calls
// to `func`. `objectName` and `methodName` are used strictly to identify
// which object method `func` is coming from in the logs
- function instrumentFunction(objectName: string, methodName: string, func: any, logSettings: LogSettings) {
+ function instrumentFunction(
+ objectName: string,
+ methodName: string,
+ func: any,
+ logSettings: LogSettings,
+ ) {
return function() {
const callContext = getOriginatingScriptContext(logSettings.logCallStack);
logCall(
@@ -431,7 +463,12 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
}
// Log properties of prototypes and objects
- function instrumentObjectProperty(object, objectName: string, propertyName:string, logSettings: LogSettings) {
+ function instrumentObjectProperty(
+ object,
+ objectName: string,
+ propertyName: string,
+ logSettings: LogSettings,
+ ) {
if (
!object ||
!objectName ||
@@ -443,7 +480,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
Object: ${object}
objectName: ${objectName}
propertyName: ${propertyName}
- `
+ `,
);
}
@@ -488,8 +525,10 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
get: (function() {
return function() {
let origProperty;
- const callContext = getOriginatingScriptContext(logSettings.logCallStack);
- let instrumentedVariableName = `${objectName}.${propertyName}`;
+ const callContext = getOriginatingScriptContext(
+ logSettings.logCallStack,
+ );
+ const instrumentedVariableName = `${objectName}.${propertyName}`;
// get original value
if (!propDesc) {
@@ -502,7 +541,9 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
// if data property
origProperty = originalValue;
} else {
- console.error( `Property descriptor for ${instrumentedVariableName} doesn't have getter or value?`);
+ console.error(
+ `Property descriptor for ${instrumentedVariableName} doesn't have getter or value?`,
+ );
logValue(
instrumentedVariableName,
"",
@@ -563,14 +604,17 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
})(),
set: (function() {
return function(value) {
- const callContext = getOriginatingScriptContext(logSettings.logCallStack);
- let instrumentedVariableName = `${objectName}.${propertyName}`;
+ const callContext = getOriginatingScriptContext(
+ logSettings.logCallStack,
+ );
+ const instrumentedVariableName = `${objectName}.${propertyName}`;
let returnValue;
// Prevent sets for functions and objects if enabled
if (
logSettings.preventSets &&
- (typeof originalValue === "function" || typeof originalValue === "object")
+ (typeof originalValue === "function" ||
+ typeof originalValue === "object")
) {
logValue(
instrumentedVariableName,
@@ -598,7 +642,9 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
returnValue = value;
inLog = false;
} else {
- console.error(`Property descriptor for ${instrumentedVariableName} doesn't have setter or value?`);
+ console.error(
+ `Property descriptor for ${instrumentedVariableName} doesn't have setter or value?`,
+ );
logValue(
instrumentedVariableName,
value,
@@ -621,7 +667,11 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
});
}
- function instrumentObject(object: any, instrumentedName: string, logSettings: LogSettings) {
+ function instrumentObject(
+ object: any,
+ instrumentedName: string,
+ logSettings: LogSettings,
+ ) {
if (logSettings.propertiesToInstrument.length === 0) {
logSettings.propertiesToInstrument = Object.getPropertyNames(object);
}
@@ -637,9 +687,9 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
isObject(object, propertyName) &&
propertyName !== "__proto__"
) {
- let newInstrumentedName = `${instrumentedName}.${propertyName}`;
- let newDepth = logSettings.depth - 1;
- logSettings.depth = newDepth
+ const newInstrumentedName = `${instrumentedName}.${propertyName}`;
+ const newDepth = logSettings.depth - 1;
+ logSettings.depth = newDepth;
instrumentObject(
object[propertyName],
newInstrumentedName,
@@ -647,7 +697,12 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
);
}
try {
- instrumentObjectProperty(object, instrumentedName, propertyName, logSettings);
+ instrumentObjectProperty(
+ object,
+ instrumentedName,
+ propertyName,
+ logSettings,
+ );
} catch (error) {
if (
error instanceof TypeError &&
@@ -657,7 +712,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
`Cannot instrument non-configurable property: ${instrumentedName}:${propertyName}`,
);
} else {
- logErrorToConsole(error, {instrumentedName, propertyName });
+ logErrorToConsole(error, { instrumentedName, propertyName });
}
}
}
@@ -673,7 +728,7 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
logSettings,
);
} catch (error) {
- logErrorToConsole(error, {instrumentedName, propertyName });
+ logErrorToConsole(error, { instrumentedName, propertyName });
}
}
}
@@ -704,8 +759,8 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
// More details about how this function is invoked are in
// content/javascript-instrument-content-scope.ts
JSInstrumentRequests.forEach(function(item) {
- instrumentObject(item.object, item.instrumentedName, item.logSettings)
- })
+ instrumentObject(item.object, item.instrumentedName, item.logSettings);
+ });
}
// This whole function getInstrumentJS returns just the function `instrumentJS`.
diff --git a/automation/Extension/webext-instrumentation/src/schema.ts b/automation/Extension/webext-instrumentation/src/schema.ts
index e8e3de873..4a41e929f 100644
--- a/automation/Extension/webext-instrumentation/src/schema.ts
+++ b/automation/Extension/webext-instrumentation/src/schema.ts
@@ -119,17 +119,6 @@ export interface HttpRedirect {
time_stamp: DateTime;
}
-
-export enum JSOperation {
- call = 'call',
- get = 'get',
- get_failed = 'get(failed)',
- get_function = 'get(function)',
- set = 'set',
- set_failed = 'set(failed)',
- set_prevented = 'set(prevented)',
-}
-
export interface JavascriptOperation {
id?: number;
incognito?: number;
@@ -150,7 +139,7 @@ export interface JavascriptOperation {
top_level_url?: string;
call_stack?: string;
symbol?: string;
- operation?: JSOperation;
+ operation?: string;
value?: string;
arguments?: string;
time_stamp: DateTime;
diff --git a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts b/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
deleted file mode 100644
index a54915975..000000000
--- a/automation/Extension/webext-instrumentation/src/types/js-instrumentation.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export interface LogSettings {
- propertiesToInstrument: string[];
- nonExistingPropertiesToInstrument: string[];
- excludedProperties: string[];
- logCallStack: boolean;
- logFunctionsAsStrings: boolean;
- logFunctionGets: boolean;
- preventSets: boolean;
- recursive: boolean;
- depth: number;
-}
-
-export interface JSInstrumentRequest {
- object: string,
- instrumentedName: string,
- logSettings: LogSettings,
-}
\ No newline at end of file
From de83eaca46e52bb0cee3e322bbe4193f450060af Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 22:24:47 -0500
Subject: [PATCH 017/106] noqa on wip jsinstrumentation file
---
automation/JSInstrumentation.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 014246f3b..091f36561 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -156,4 +156,4 @@
//{"window": ["name", "localStorage", "sessionStorage"]}
-"""
\ No newline at end of file
+""" # noqa
From 82720a2061303572a3c442074265e0cf830a2c96 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 23:37:12 -0500
Subject: [PATCH 018/106] Begin updating existing js instrument tests.
---
automation/default_browser_params.json | 2 +-
..._js_instrument_existing_window_property.py | 3 +-
.../instrument_existing_window_property.html | 48 ++++++++++++-------
test/test_pages/js_instrument/utils.js | 22 +++++++++
4 files changed, 55 insertions(+), 20 deletions(-)
create mode 100644 test/test_pages/js_instrument/utils.js
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index d1d74dc87..2adf86832 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -2,7 +2,7 @@
"extension_enabled": true,
"cookie_instrument": false,
"js_instrument": false,
- "js_instrument_modules": ["fingerprinting"],
+ "js_instrument_modules": "[]",
"http_instrument": false,
"navigation_instrument": false,
"save_content": false,
diff --git a/test/test_js_instrument_existing_window_property.py b/test/test_js_instrument_existing_window_property.py
index 6d0db2d67..405e3e34e 100644
--- a/test/test_js_instrument_existing_window_property.py
+++ b/test/test_js_instrument_existing_window_property.py
@@ -43,6 +43,7 @@ class TestJSInstrumentExistingWindowProperty(OpenWPMTest):
def get_config(self, data_dir=""):
manager_params, browser_params = self.get_test_config(data_dir)
browser_params[0]['js_instrument'] = True
+ browser_params[0]['display_mode'] = 'native'
manager_params['testing'] = True
return manager_params, browser_params
@@ -69,7 +70,7 @@ def _check_calls(self, rows, symbol_prefix, doc_url, top_url):
def test_instrument_object(self):
""" Ensure instrumentObject logs all property gets, sets, and calls """
- db = self.visit('/js_instrument/%s' % TEST_PAGE)
+ db = self.visit('/js_instrument/%s' % TEST_PAGE, sleep_after=0)
rows = db_utils.get_javascript_entries(db, all_columns=True)
# Check calls of non-recursive instrumentation
diff --git a/test/test_pages/js_instrument/instrument_existing_window_property.html b/test/test_pages/js_instrument/instrument_existing_window_property.html
index 0f2cf381a..41777f50c 100644
--- a/test/test_pages/js_instrument/instrument_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_existing_window_property.html
@@ -11,6 +11,7 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
to True otherwise the instrumentObject method won't be exposed to this
test script.
+
diff --git a/test/test_pages/js_instrument/utils.js b/test/test_pages/js_instrument/utils.js
new file mode 100644
index 000000000..56ec6e962
--- /dev/null
+++ b/test/test_pages/js_instrument/utils.js
@@ -0,0 +1,22 @@
+function getLogSettings(
+ propertiesToInstrument=[],
+ nonExistingPropertiesToInstrument=[],
+ excludedProperties=[],
+ logCallStack=false,
+ logFunctionsAsStrings= false,
+ logFunctionGets=false,
+ preventSets=false,
+ recursive=false,
+ depth=5) {
+ return {
+ propertiesToInstrument: propertiesToInstrument,
+ nonExistingPropertiesToInstrument: nonExistingPropertiesToInstrument,
+ excludedProperties: excludedProperties,
+ logCallStack: logCallStack,
+ logFunctionsAsStrings: logFunctionsAsStrings,
+ logFunctionGets: logFunctionGets,
+ preventSets: preventSets,
+ recursive: recursive,
+ depth: depth,
+ };
+};
\ No newline at end of file
From 68f80770bf91e41baea367930df6607d9ba9622d Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Mon, 18 May 2020 23:52:31 -0500
Subject: [PATCH 019/106] Small cleanups
---
.../webext-instrumentation/.prettierignore | 4 +-
.../webext-instrumentation/package-lock.json | 735 ++++++++----------
.../webext-instrumentation/package.json | 2 +-
.../src/background/javascript-instrument.ts | 2 +-
4 files changed, 312 insertions(+), 431 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/.prettierignore b/automation/Extension/webext-instrumentation/.prettierignore
index 6e1c2b982..0e80a3c86 100644
--- a/automation/Extension/webext-instrumentation/.prettierignore
+++ b/automation/Extension/webext-instrumentation/.prettierignore
@@ -1,4 +1,2 @@
# package.json is formatted by package managers, so we ignore it here
-package.json
-# This file is autogenerated, and can't do it quite perfectly
-src/lib/mdn-browser-compat-data.ts
+package.json
\ No newline at end of file
diff --git a/automation/Extension/webext-instrumentation/package-lock.json b/automation/Extension/webext-instrumentation/package-lock.json
index c66fd44a5..a743d06c0 100644
--- a/automation/Extension/webext-instrumentation/package-lock.json
+++ b/automation/Extension/webext-instrumentation/package-lock.json
@@ -1574,45 +1574,6 @@
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
"dev": true
},
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
@@ -1915,25 +1876,6 @@
}
}
},
- "conventional-changelog": {
- "version": "3.1.12",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.12.tgz",
- "integrity": "sha512-zyGKwii8Z5zOq1nGFm5jn9Ou1jQ6UBoRT0+nqBIU8fEzh64+AcVxrY97tVuK77Ati0xwpBiFHpDXAW7pkq1jEw==",
- "dev": true,
- "requires": {
- "conventional-changelog-angular": "^5.0.5",
- "conventional-changelog-atom": "^2.0.3",
- "conventional-changelog-codemirror": "^2.0.3",
- "conventional-changelog-conventionalcommits": "^4.2.1",
- "conventional-changelog-core": "^4.0.2",
- "conventional-changelog-ember": "^2.0.4",
- "conventional-changelog-eslint": "^3.0.4",
- "conventional-changelog-express": "^2.0.1",
- "conventional-changelog-jquery": "^3.0.6",
- "conventional-changelog-jshint": "^2.0.3",
- "conventional-changelog-preset-loader": "^2.2.0"
- }
- },
"conventional-changelog-angular": {
"version": "5.0.10",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz",
@@ -1962,17 +1904,6 @@
"q": "^1.5.1"
}
},
- "conventional-changelog-conventionalcommits": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz",
- "integrity": "sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg==",
- "dev": true,
- "requires": {
- "compare-func": "^1.3.1",
- "lodash": "^4.17.15",
- "q": "^1.5.1"
- }
- },
"conventional-changelog-core": {
"version": "4.1.7",
"resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.7.tgz",
@@ -2134,102 +2065,6 @@
"trim-off-newlines": "^1.0.0"
}
},
- "conventional-recommended-bump": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.2.tgz",
- "integrity": "sha512-9qWhAweJbT6CAHcCprBYzUb3tySsaRrUx0ckpMprHbtWOBfl3gxakUCBNd/4T3m2Iv9Cb8Y4P2Px3cR5ysXPDw==",
- "dev": true,
- "requires": {
- "concat-stream": "^2.0.0",
- "conventional-changelog-preset-loader": "^2.2.0",
- "conventional-commits-filter": "^2.0.2",
- "conventional-commits-parser": "^3.0.5",
- "git-raw-commits": "2.0.0",
- "git-semver-tags": "^3.0.0",
- "meow": "^4.0.0",
- "q": "^1.5.1"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "camelcase-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0",
- "map-obj": "^2.0.0",
- "quick-lru": "^1.0.0"
- }
- },
- "map-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
- "dev": true
- },
- "meow": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
- "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
- "dev": true,
- "requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist": "^1.1.3",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0"
- }
- },
- "minimist-options": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
- "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
- }
- },
- "quick-lru": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
- "dev": true
- },
- "redent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
- "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
- "dev": true,
- "requires": {
- "indent-string": "^3.0.0",
- "strip-indent": "^2.0.0"
- }
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
- "dev": true
- },
- "trim-newlines": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
- "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
- "dev": true
- }
- }
- },
"convert-source-map": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
@@ -2635,12 +2470,6 @@
"integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
"dev": true
},
- "detect-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz",
- "integrity": "sha512-JAP22dVPAqvhdRFFxK1G5GViIokyUn0UWXRNW0ztK96fsqi9cuM8w8ESbSk+T2w5OVorcMcL6m7yUg1RrX+2CA==",
- "dev": true
- },
"diff": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
@@ -3812,102 +3641,6 @@
}
}
},
- "git-semver-tags": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.0.tgz",
- "integrity": "sha512-T4C/gJ9k2Bnxz+PubtcyiMtUUKrC+Nh9Q4zaECcnmVMwJgPhrNyP/Rf+YpdRqsJbCV/+kYrCH24Xg+IeAmbOPg==",
- "dev": true,
- "requires": {
- "meow": "^4.0.0",
- "semver": "^6.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "camelcase-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0",
- "map-obj": "^2.0.0",
- "quick-lru": "^1.0.0"
- }
- },
- "map-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
- "dev": true
- },
- "meow": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
- "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
- "dev": true,
- "requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist": "^1.1.3",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0"
- }
- },
- "minimist-options": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
- "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
- }
- },
- "quick-lru": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
- "dev": true
- },
- "redent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
- "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
- "dev": true,
- "requires": {
- "indent-string": "^3.0.0",
- "strip-indent": "^2.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
- "dev": true
- },
- "trim-newlines": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
- "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
- "dev": true
- }
- }
- },
"gitconfiglocal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
@@ -7849,47 +7582,189 @@
"dev": true,
"requires": {
"chalk": "2.4.2",
- "conventional-changelog": "3.1.12",
+ "conventional-changelog": "3.1.18",
"conventional-changelog-config-spec": "2.1.0",
- "conventional-recommended-bump": "6.0.2",
+ "conventional-changelog-conventionalcommits": "4.2.3",
+ "conventional-recommended-bump": "6.0.5",
"detect-indent": "6.0.0",
- "detect-newline": "3.0.0",
+ "detect-newline": "3.1.0",
"dotgitignore": "2.1.0",
- "figures": "3.0.0",
+ "figures": "3.1.0",
"find-up": "4.1.0",
"fs-access": "1.0.1",
- "git-semver-tags": "3.0.0",
- "semver": "6.3.0",
+ "git-semver-tags": "3.0.1",
+ "semver": "7.1.1",
"stringify-package": "1.0.1",
- "yargs": "14.2.0"
+ "yargs": "15.3.1"
},
"dependencies": {
- "conventional-changelog-config-spec": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
- "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
- "figures": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
- "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "escape-string-regexp": "^1.0.5"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "find-up": {
+ "camelcase": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
+ "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0",
+ "map-obj": "^2.0.0",
+ "quick-lru": "^1.0.0"
+ }
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "conventional-changelog": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz",
+ "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==",
+ "dev": true,
+ "requires": {
+ "conventional-changelog-angular": "^5.0.6",
+ "conventional-changelog-atom": "^2.0.3",
+ "conventional-changelog-codemirror": "^2.0.3",
+ "conventional-changelog-conventionalcommits": "^4.2.3",
+ "conventional-changelog-core": "^4.1.4",
+ "conventional-changelog-ember": "^2.0.4",
+ "conventional-changelog-eslint": "^3.0.4",
+ "conventional-changelog-express": "^2.0.1",
+ "conventional-changelog-jquery": "^3.0.6",
+ "conventional-changelog-jshint": "^2.0.3",
+ "conventional-changelog-preset-loader": "^2.3.0"
+ }
+ },
+ "conventional-changelog-config-spec": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
+ "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
+ "dev": true
+ },
+ "conventional-changelog-conventionalcommits": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz",
+ "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^1.3.1",
+ "lodash": "^4.17.15",
+ "q": "^1.5.1"
+ }
+ },
+ "conventional-recommended-bump": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.5.tgz",
+ "integrity": "sha512-srkferrB4kACPEbKYltZwX1CQZAEqbQkabKN444mavLRVMetzwJFJf23/+pwvtMsWbd+cc4HaleV1nHke0f8Rw==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^2.0.0",
+ "conventional-changelog-preset-loader": "^2.3.0",
+ "conventional-commits-filter": "^2.0.2",
+ "conventional-commits-parser": "^3.0.8",
+ "git-raw-commits": "2.0.0",
+ "git-semver-tags": "^3.0.1",
+ "meow": "^5.0.0",
+ "q": "^1.5.1"
+ }
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "figures": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
+ "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "git-semver-tags": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz",
+ "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==",
+ "dev": true,
+ "requires": {
+ "meow": "^5.0.0",
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
@@ -7898,6 +7773,39 @@
"p-locate": "^4.1.0"
}
},
+ "map-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+ "dev": true
+ },
+ "meow": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz",
+ "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^4.0.0",
+ "decamelize-keys": "^1.0.0",
+ "loud-rejection": "^1.0.0",
+ "minimist-options": "^3.0.1",
+ "normalize-package-data": "^2.3.4",
+ "read-pkg-up": "^3.0.0",
+ "redent": "^2.0.0",
+ "trim-newlines": "^2.0.0",
+ "yargs-parser": "^10.0.0"
+ }
+ },
+ "minimist-options": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
+ "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0"
+ }
+ },
"p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
@@ -7928,17 +7836,122 @@
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
+ "quick-lru": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
+ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
+ "dev": true
+ },
+ "redent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
+ "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^3.0.0",
+ "strip-indent": "^2.0.0"
+ }
+ },
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz",
+ "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==",
"dev": true
},
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"stringify-package": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz",
"integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==",
"dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
+ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "yargs": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.1"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
}
}
},
@@ -9249,45 +9262,6 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -9359,97 +9333,6 @@
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
},
- "yargs": {
- "version": "14.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz",
- "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^15.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "yargs-parser": {
- "version": "15.0.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
- "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
"yargs-parser": {
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
diff --git a/automation/Extension/webext-instrumentation/package.json b/automation/Extension/webext-instrumentation/package.json
index 7591d1c8c..7e16bfff0 100644
--- a/automation/Extension/webext-instrumentation/package.json
+++ b/automation/Extension/webext-instrumentation/package.json
@@ -56,7 +56,7 @@
"version": "Bump package.json version, update CHANGELOG.md, tag release",
"reset": "Delete all untracked files and reset the repo to the last commit",
"prepare-release": "One-step: clean, build, test, publish docs, and prep a release",
- "make-compat": "Script that makes src/lib/mdn-browser-compat-data.ts"
+ "make-compat": "Script that makes XXX TODO: ...../mdn-browser-compat-data.py"
},
"engines": {
"node": ">=8.9"
diff --git a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
index a58e3842f..491fbb8d9 100644
--- a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
+++ b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
@@ -26,7 +26,7 @@ export class JavascriptInstrument {
update.script_loc_eval = escapeString(data.scriptLocEval);
update.call_stack = escapeString(data.callStack);
update.symbol = escapeString(data.symbol);
- update.operation = data.operation;
+ update.operation = escapeString(data.operation);
update.value = escapeString(data.value);
update.time_stamp = data.timeStamp;
update.incognito = boolToInt(sender.tab.incognito);
From bae565b970508f299e632e551737a17e82449497 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 00:40:36 -0500
Subject: [PATCH 020/106] Fix naming in calling instrumentJS
---
.../js_instrument/instrument_existing_window_property.html | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/test/test_pages/js_instrument/instrument_existing_window_property.html b/test/test_pages/js_instrument/instrument_existing_window_property.html
index 41777f50c..c71fe09ec 100644
--- a/test/test_pages/js_instrument/instrument_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_existing_window_property.html
@@ -63,11 +63,10 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
// Instrument partially existing object non-recursively
console.log("Instrumenting window.partiallyExisting!");
-
window.instrumentJS([
{
object: window,
- instrumentName: "window",
+ instrumentedName: "window",
logSettings: getLogSettings(
propertiesToInstrument=[
"partiallyExisting",
@@ -76,7 +75,7 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
},
{
object: window.partiallyExisting,
- instrumentName: "window.partiallyExisting",
+ instrumentedName: "window.partiallyExisting",
logSettings: getLogSettings(
propertiesToInstrument=[
"existingProp",
From 7557bc2f7194c530d874b456dfc399922db4d371 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 00:48:10 -0500
Subject: [PATCH 021/106] No display mode native for testing
---
test/test_js_instrument_existing_window_property.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/test/test_js_instrument_existing_window_property.py b/test/test_js_instrument_existing_window_property.py
index 405e3e34e..446ee17c4 100644
--- a/test/test_js_instrument_existing_window_property.py
+++ b/test/test_js_instrument_existing_window_property.py
@@ -43,7 +43,6 @@ class TestJSInstrumentExistingWindowProperty(OpenWPMTest):
def get_config(self, data_dir=""):
manager_params, browser_params = self.get_test_config(data_dir)
browser_params[0]['js_instrument'] = True
- browser_params[0]['display_mode'] = 'native'
manager_params['testing'] = True
return manager_params, browser_params
From 9d8ca65a5ff3a27f1f250b5b5340125d45773207 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 00:49:40 -0500
Subject: [PATCH 022/106] Restore py test file to orig.
---
test/test_js_instrument_existing_window_property.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/test_js_instrument_existing_window_property.py b/test/test_js_instrument_existing_window_property.py
index 446ee17c4..6d0db2d67 100644
--- a/test/test_js_instrument_existing_window_property.py
+++ b/test/test_js_instrument_existing_window_property.py
@@ -69,7 +69,7 @@ def _check_calls(self, rows, symbol_prefix, doc_url, top_url):
def test_instrument_object(self):
""" Ensure instrumentObject logs all property gets, sets, and calls """
- db = self.visit('/js_instrument/%s' % TEST_PAGE, sleep_after=0)
+ db = self.visit('/js_instrument/%s' % TEST_PAGE)
rows = db_utils.get_javascript_entries(db, all_columns=True)
# Check calls of non-recursive instrumentation
From 8e40b55104b018eaea278c08fa6b32848ea660ff Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 01:21:00 -0500
Subject: [PATCH 023/106] Support null propertiesToInstrument
---
.../src/lib/js-instruments.ts | 80 ++++++++++---------
1 file changed, 42 insertions(+), 38 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 1b8b9a3d5..1a3bf763a 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -2,7 +2,7 @@
// https://github.com/EFForg/privacybadgerfirefox/blob/master/data/fingerprinting.js
interface LogSettings {
- propertiesToInstrument: string[];
+ propertiesToInstrument: string[] | null;
nonExistingPropertiesToInstrument: string[];
excludedProperties: string[];
logCallStack: boolean;
@@ -672,47 +672,51 @@ export function getInstrumentJS(event_id: number, sendMessagesToLogger) {
instrumentedName: string,
logSettings: LogSettings,
) {
- if (logSettings.propertiesToInstrument.length === 0) {
- logSettings.propertiesToInstrument = Object.getPropertyNames(object);
- }
- for (const propertyName of logSettings.propertiesToInstrument) {
- if (logSettings.excludedProperties.includes(propertyName)) {
- continue;
+ // Set propertiesToInstrument to null to force no properties to be instrumented.
+ // (this is used in testing for example)
+ if (logSettings.propertiesToInstrument !== null) {
+ if (logSettings.propertiesToInstrument.length === 0) {
+ logSettings.propertiesToInstrument = Object.getPropertyNames(object);
}
- // If `recursive` flag set we want to recursively instrument any
- // object properties that aren't the prototype object.
- if (
- logSettings.recursive &&
- logSettings.depth > 0 &&
- isObject(object, propertyName) &&
- propertyName !== "__proto__"
- ) {
- const newInstrumentedName = `${instrumentedName}.${propertyName}`;
- const newDepth = logSettings.depth - 1;
- logSettings.depth = newDepth;
- instrumentObject(
- object[propertyName],
- newInstrumentedName,
- logSettings,
- );
- }
- try {
- instrumentObjectProperty(
- object,
- instrumentedName,
- propertyName,
- logSettings,
- );
- } catch (error) {
+ for (const propertyName of logSettings.propertiesToInstrument) {
+ if (logSettings.excludedProperties.includes(propertyName)) {
+ continue;
+ }
+ // If `recursive` flag set we want to recursively instrument any
+ // object properties that aren't the prototype object.
if (
- error instanceof TypeError &&
- error.message.includes("can't redefine non-configurable property")
+ logSettings.recursive &&
+ logSettings.depth > 0 &&
+ isObject(object, propertyName) &&
+ propertyName !== "__proto__"
) {
- console.warn(
- `Cannot instrument non-configurable property: ${instrumentedName}:${propertyName}`,
+ const newInstrumentedName = `${instrumentedName}.${propertyName}`;
+ const newDepth = logSettings.depth - 1;
+ logSettings.depth = newDepth;
+ instrumentObject(
+ object[propertyName],
+ newInstrumentedName,
+ logSettings,
);
- } else {
- logErrorToConsole(error, { instrumentedName, propertyName });
+ }
+ try {
+ instrumentObjectProperty(
+ object,
+ instrumentedName,
+ propertyName,
+ logSettings,
+ );
+ } catch (error) {
+ if (
+ error instanceof TypeError &&
+ error.message.includes("can't redefine non-configurable property")
+ ) {
+ console.warn(
+ `Cannot instrument non-configurable property: ${instrumentedName}:${propertyName}`,
+ );
+ } else {
+ logErrorToConsole(error, { instrumentedName, propertyName });
+ }
}
}
}
From 6559a4df7b101c62e1801f255f595dc0146af90e Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 01:51:58 -0500
Subject: [PATCH 024/106] Re-work instrumentObject tests
---
test/test_pages/canvas_recursion.html | 5 +-
test/test_pages/js_instrument/framed1.html | 9 +-
test/test_pages/js_instrument/framed2.html | 9 +-
.../instrument_existing_window_property.html | 18 ++--
.../instrument_mock_window_property.html | 89 ++++++++++++-------
...strument_non_existing_window_property.html | 15 +++-
.../js_instrument/instrument_object.html | 33 +++++--
test/test_pages/js_instrument/utils.js | 24 ++---
8 files changed, 134 insertions(+), 68 deletions(-)
diff --git a/test/test_pages/canvas_recursion.html b/test/test_pages/canvas_recursion.html
index 063f94bba..a6a2a1e26 100644
--- a/test/test_pages/canvas_recursion.html
+++ b/test/test_pages/canvas_recursion.html
@@ -15,10 +15,11 @@ Canvas Fingerprinting Test Page
}
const instrumentObjectAvailable = new Promise(function(resolve) {
function check() {
- if (typeof window.instrumentObject !== "undefined") {
+ if (typeof window.instrumentJS !== "undefined") {
resolve();
} else {
- setTimeout(check, 250);
+ console.log('RECHECK');
+ setTimeout(check, 10);
}
}
check();
diff --git a/test/test_pages/js_instrument/framed1.html b/test/test_pages/js_instrument/framed1.html
index b0efad350..67deebd3d 100644
--- a/test/test_pages/js_instrument/framed1.html
+++ b/test/test_pages/js_instrument/framed1.html
@@ -5,6 +5,7 @@
Test page frame for JS Instrument's instrumentObject method
+
diff --git a/test/test_pages/js_instrument/framed2.html b/test/test_pages/js_instrument/framed2.html
index 203ad7fe0..04e7018fe 100644
--- a/test/test_pages/js_instrument/framed2.html
+++ b/test/test_pages/js_instrument/framed2.html
@@ -5,6 +5,7 @@
Test page frame for JS Instrument's instrumentObject method
+
diff --git a/test/test_pages/js_instrument/instrument_existing_window_property.html b/test/test_pages/js_instrument/instrument_existing_window_property.html
index c71fe09ec..97023a9ef 100644
--- a/test/test_pages/js_instrument/instrument_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_existing_window_property.html
@@ -67,24 +67,20 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
{
object: window,
instrumentedName: "window",
- logSettings: getLogSettings(
- propertiesToInstrument=[
- "partiallyExisting",
- ]
- ),
+ logSettings: getLogSettings({
+ propertiesToInstrument: ["partiallyExisting",]
+ }),
},
{
object: window.partiallyExisting,
instrumentedName: "window.partiallyExisting",
- logSettings: getLogSettings(
- propertiesToInstrument=[
- "existingProp",
- ],
- nonExistingPropertiesToInstrument=[
+ logSettings: getLogSettings({
+ propertiesToInstrument: ["existingProp",],
+ nonExistingPropertiesToInstrument: [
"nonExistingProp1",
"nonExistingMethod1",
],
- ),
+ }),
},
]);
diff --git a/test/test_pages/js_instrument/instrument_mock_window_property.html b/test/test_pages/js_instrument/instrument_mock_window_property.html
index d18578d89..adfb04ab3 100644
--- a/test/test_pages/js_instrument/instrument_mock_window_property.html
+++ b/test/test_pages/js_instrument/instrument_mock_window_property.html
@@ -11,6 +11,7 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
to True otherwise the instrumentObject method won't be exposed to this
test script.
+
diff --git a/test/test_pages/js_instrument/instrument_non_existing_window_property.html b/test/test_pages/js_instrument/instrument_non_existing_window_property.html
index f6d20bbd5..70adc5b84 100644
--- a/test/test_pages/js_instrument/instrument_non_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_non_existing_window_property.html
@@ -11,6 +11,7 @@ Test page for JS Instrument's instrumentObject method - specifically instrum
to True otherwise the instrumentObject method won't be exposed to this
test script.
+
diff --git a/test/test_pages/js_instrument/utils.js b/test/test_pages/js_instrument/utils.js
index 56ec6e962..760c84b4b 100644
--- a/test/test_pages/js_instrument/utils.js
+++ b/test/test_pages/js_instrument/utils.js
@@ -1,14 +1,16 @@
-function getLogSettings(
- propertiesToInstrument=[],
- nonExistingPropertiesToInstrument=[],
- excludedProperties=[],
- logCallStack=false,
- logFunctionsAsStrings= false,
- logFunctionGets=false,
- preventSets=false,
- recursive=false,
- depth=5) {
- return {
+function getLogSettings(requestedLogSettings) {
+ const {
+ propertiesToInstrument=[],
+ nonExistingPropertiesToInstrument=[],
+ excludedProperties=[],
+ logCallStack=false,
+ logFunctionsAsStrings= false,
+ logFunctionGets=false,
+ preventSets=false,
+ recursive=false,
+ depth=5
+ } = requestedLogSettings;
+ return {
propertiesToInstrument: propertiesToInstrument,
nonExistingPropertiesToInstrument: nonExistingPropertiesToInstrument,
excludedProperties: excludedProperties,
From 0c0ca21181e9e9177e48b40379d853d94ee7d0a3 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 19 May 2020 13:12:57 -0500
Subject: [PATCH 025/106] Clean-up text in test page.
---
test/test_pages/js_instrument/instrument_object.html | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/test/test_pages/js_instrument/instrument_object.html b/test/test_pages/js_instrument/instrument_object.html
index f44e93574..fd57705f1 100644
--- a/test/test_pages/js_instrument/instrument_object.html
+++ b/test/test_pages/js_instrument/instrument_object.html
@@ -1,20 +1,19 @@
- Test page for JS Instrument's instrumentObject method
+ Test page for JS Instrument's instrumentJS method
- Test page for JS Instrument's instrumentObject method
+ Test page for JS Instrument's instrumentJS method
This page defines several types of objects and tests the js
- instrument's instrumentObject() method.
+ instrument's instrumentJS() method.
NOTE: The platform config option `manager_params['testing']` must be set
- to True otherwise the instrumentObject method won't be exposed to this
+ to True otherwise the instrumentJS method won't be exposed to this
test script.
+
+
+
+
+
diff --git a/test/test_pages/js_instrument/instrument_mock_window_property.html b/test/test_pages/js_instrument/instrument_mock_window_property.html
index adfb04ab3..60a6d24fe 100644
--- a/test/test_pages/js_instrument/instrument_mock_window_property.html
+++ b/test/test_pages/js_instrument/instrument_mock_window_property.html
@@ -1,14 +1,14 @@
- Test page for JS Instrument's instrumentObject method - specifically instrumenting a non-existing window property's attributes via a mock class / object
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting a non-existing window property's attributes via a mock class / object
- Test page for JS Instrument's instrumentObject method - specifically instrumenting a non-existing window property's attributes via a mock class / object
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting a non-existing window property's attributes via a mock class / object
This page defines several types of objects and tests the js
- instrument's instrumentObject() method.
+ instrument's instrumentJS() method.
NOTE: The platform config option `manager_params['testing']` must be set
- to True otherwise the instrumentObject method won't be exposed to this
+ to True otherwise the instrumentJS method won't be exposed to this
test script.
diff --git a/test/test_pages/js_instrument/instrument_non_existing_window_property.html b/test/test_pages/js_instrument/instrument_non_existing_window_property.html
index 70adc5b84..20d844d96 100644
--- a/test/test_pages/js_instrument/instrument_non_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_non_existing_window_property.html
@@ -1,14 +1,14 @@
- Test page for JS Instrument's instrumentObject method - specifically instrumenting non-existing window property
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting non-existing window property
- Test page for JS Instrument's instrumentObject method - specifically instrumenting non-existing window property
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting non-existing window property
This page defines several types of objects and tests the js
- instrument's instrumentObject() method.
+ instrument's instrumentJS() method.
NOTE: The platform config option `manager_params['testing']` must be set
- to True otherwise the instrumentObject method won't be exposed to this
+ to True otherwise the instrumentJS method won't be exposed to this
test script.
From 9c393d1ce64d14400756b2c0676bcab19c068921 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 20 May 2020 22:46:07 -0500
Subject: [PATCH 039/106] pep8
---
automation/JSInstrumentation.py | 159 +-
.../mdn-browser-compat-data.py | 1844 ++++++++---------
test/openwpm_jstest.py | 8 +-
test/test_js_instrument.py | 17 +-
4 files changed, 951 insertions(+), 1077 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 091f36561..4de81d449 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,89 +1,4 @@
"""
-
-const presetMap = {
- 'fingerprinting': '../js-instrumentation-presets/fingerprinting.json',
-};
-
-
-function validateJsModuleRequest(jsModuleRequest: any) {
- if (typeof jsModuleRequest === 'string') {
- const isPreset = Object.keys(presetMap).includes(jsModuleRequest);
- const isAPI = api.includes(jsModuleRequest);
- if (!isPreset && !isAPI) {
- throw new Error(`String jsModuleRequest ${jsModuleRequest} is not a preset or a recognized API.`);
- }
- } else if (typeof jsModuleRequest === 'object') {
- const properties = Object.keys(jsModuleRequest);
- if (properties.length !== 1) {
- throw new Error(`Object jsModuleRequest must only have one property.`);
- }
-
-
- } else {
- throw new Error(`Invalid jsModuleRequest: ${jsModuleRequest}. Must be string or object.`)
- }
- console.debug(`Validation successful for`, jsModuleRequest);
-}
-
-
-
- const instrumentationRequests: JSInstrumentRequest[] = [];
-
- if (!Array.isArray(jsModuleRequests)) {
- throw new Error(`jsModuleRequests, must be an Array. Received: ${jsModuleRequests}`);
- }
-
- for (let jsModuleRequest of jsModuleRequests) {
-
- validateJsModuleRequest(jsModuleRequest);
-
- console.log(presetMap);
- let logSettings = new LogSettings();
- let requestedModule = jsModuleRequest.object;
- console.log(logSettings);
- console.log(requestedModule);
- instrumentationRequests.push({
- object: requestedModule,
- instrumentedName: 'name',
- logSettings: logSettings,
- });
- }
-
- /*
- const instrumentedApiFuncs: string[] = [];
-
- jsModuleRequests.forEach(requestedModule => {
- if (requestedModule == "fingerprinting") {
- // Special case collection of fingerprinting
- instrumentedApiFuncs.push(String(instrumentFingerprintingApis));
- } else {
- // Note: We only do whole modules for now
- // Check requestedModule is a member of api
- if (api.includes(requestedModule)) {
- // Then add functions that do the instrumentation
- instrumentedApiFuncs.push(`
- function instrument${requestedModule}({
- instrumentObjectProperty,
- instrumentObject,
- }) {
- instrumentObject(window.${requestedModule}.prototype, "${requestedModule}");
- }
- `);
- } else {
- console.error(
- `The requested module ${requestedModule} does not appear to be part of browser api.`,
- );
- }
- }
- });
- */
-
-
- // The new goal of this function is to collect together a de-duped
- // list of JSInstrumentRequests from the input request (which allows
- // shorthand for various things).
-
- /*
We accept a list. From the list we need to parse each item.
The item may be a string or an object with one key.
If the item is a string:
@@ -95,65 +10,19 @@
- The value may be a list or a LogSettings object
- If the value is a list, it is transformed into the propertiesToInstrument
property of a new LogSettings object.
-
We must also create the instrumentedName value.
- */
-// Implements ILogSettings and sets defaults
-export class LogSettings implements ILogSettings {
- // propertiesToInstrument : Array
- // An array of properties to instrument on this object.
- // If array is empty, then all properties are instrumented.
- // nonExistingPropertiesToInstrument : Array
- // An array of non-existing properties to instrument on this object.
- // excludedProperties : Array
- // Properties excluded from instrumentation.
- // logCallStack : boolean
- // Set to true save the call stack info with each property call.
- // logFunctionsAsStrings : boolean
- // Set to true to save functional arguments as strings during
- // argument serialization.
- // logFunctionGets: boolean
- // ....
- // preventSets : boolean
- // Set to true to prevent nested objects and functions from being
- // overwritten (and thus having their instrumentation removed).
- // Other properties (static values) can still be set with this is
- // enabled.
- // recursive : boolean
- // Set to `true` to recursively instrument all object properties of
- // the given `object`.
- // NOTE:
- // (1)`logSettings['propertiesToInstrument']` does not propagate
- // to sub-objects.
- // (2) Sub-objects of prototypes can not be instrumented
- // recursively as these properties can not be accessed
- // until an instance of the prototype is created.
- // depth : integer
- // Recursion limit when instrumenting object recursively.
- propertiesToInstrument: string[] = [];
- nonExistingPropertiesToInstrument: string[] = [];
- excludedProperties: string[] = [];
- logCallStack: boolean = false;
- logFunctionsAsStrings: boolean = false;
- logFunctionGets: boolean = false;
- preventSets: boolean = false;
- recursive: boolean = false;
- depth: number = 5;
-}
-
-
- // Shortcut
- //"fingerprinting",
- // APIs
- {"XMLHttpRequest": {"badSetting": 1}},
- {"XMLHttpRequest": {"excludedProperties": ["send"]}},
- {"Prop1": ["hi"], "Prop2": ["hi2"]},
- {"XMLHttpRequest": ["send"]},
- "Storage",
- // Specific instances on window
- //{"window.document": ["cookie", "referrer"]},
- //{"window": ["name", "localStorage", "sessionStorage"]}
-
-
-""" # noqa
+ Examples of the APIs we accept.
+
+ // Shortcut
+ "fingerprinting",
+ // APIs
+ {"XMLHttpRequest": {"badSetting": 1}},
+ {"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ {"Prop1": ["hi"], "Prop2": ["hi2"]},
+ {"XMLHttpRequest": ["send"]},
+ "Storage",
+ // Specific instances on window
+ {"window.document": ["cookie", "referrer"]},
+ {"window": ["name", "localStorage", "sessionStorage"]}
+"""
diff --git a/automation/js_instrumentation/mdn-browser-compat-data.py b/automation/js_instrumentation/mdn-browser-compat-data.py
index 923fabaea..c22de27dd 100644
--- a/automation/js_instrumentation/mdn-browser-compat-data.py
+++ b/automation/js_instrumentation/mdn-browser-compat-data.py
@@ -3,925 +3,925 @@
# "npm run make-compat" in the Extension/webext-instrumentation
# directory.
api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortPaymentEvent",
- "AbortSignal",
- "AbsoluteOrientationSensor",
- "AbstractRange",
- "AbstractWorker",
- "Accelerometer",
- "AmbientLightSensor",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioParamMap",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "AudioTrack",
- "AudioTrackList",
- "AudioWorklet",
- "AudioWorkletGlobalScope",
- "AudioWorkletNode",
- "AudioWorkletProcessor",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BatteryManager",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "Body",
- "BroadcastChannel",
- "BudgetService",
- "BudgetState",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSS",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSPseudoElement",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanMakePaymentEvent",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialUserData",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceLightEvent",
- "DeviceMotionEvent",
- "DeviceMotionEventAcceleration",
- "DeviceMotionEventRotationRate",
- "DeviceOrientationEvent",
- "DeviceProximityEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentTimeline",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FederatedCredential",
- "FetchEvent",
- "File",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationCoordinates",
- "GeolocationPosition",
- "GeolocationPositionError",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "Gyroscope",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBDatabaseException",
- "IDBEnvironment",
- "IDBFactory",
- "IDBIndex",
- "IDBKeyRange",
- "IDBLocaleAwareKeyRange",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "IdleDeadline",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageCapture",
- "ImageData",
- "InputDeviceCapabilities",
- "InputDeviceInfo",
- "InputEvent",
- "InstallEvent",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LinearAccelerationSensor",
- "LinkStyle",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "Lock",
- "LockManager",
- "LongRange",
- "MIDIAccess",
- "MIDIConnectionEvent",
- "MIDIInput",
- "MIDIInputMap",
- "MIDIMessageEvent",
- "MIDIOutput",
- "MIDIOutputMap",
- "MIDIPort",
- "MSGestureEvent",
- "Magnetometer",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeySystemConfiguration",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaSettingsRange",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NamedNodeMap",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NavigatorStorage",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "Notification",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_fbo_render_mipmap",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OrientationSensor",
- "OscillatorNode",
- "OverconstrainedError",
- "OverconstrainedErrorEvent",
- "PageTransitionEvent",
- "PaintRenderingContext2D",
- "PaintSize",
- "PaintWorkletGlobalScope",
- "PannerNode",
- "ParentNode",
- "PasswordCredential",
- "Path2D",
- "PayerErrors",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformancePaintTiming",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "PhotoCapabilities",
- "PictureInPicture",
- "Plugin",
- "PluginArray",
- "Point",
- "PointerEvent",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PromiseRejectionEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushRegistrationManager",
- "PushSubscription",
- "PushSubscriptionChangeEvent",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCConfiguration",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCErrorEvent",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityAssertion",
- "RTCIdentityErrorEvent",
- "RTCIdentityEvent",
- "RTCIdentityProviderGlobalScope",
- "RTCIdentityProviderRegistrar",
- "RTCOfferAnswerOptions",
- "RTCOfferOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceErrorEvent",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpStreamStats",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsEvent",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStream",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "ReadableStreamDefaultController",
- "ReadableStreamDefaultReader",
- "RelativeOrientationSensor",
- "Request",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "Response",
- "SVGAElement",
- "SVGAltGlyphDefElement",
- "SVGAltGlyphElement",
- "SVGAltGlyphItemElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPoints",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGColorProfileElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGFilterPrimitiveStandardAttributes",
- "SVGFontElement",
- "SVGFontFaceElement",
- "SVGFontFaceFormatElement",
- "SVGFontFaceNameElement",
- "SVGFontFaceSrcElement",
- "SVGFontFaceUriElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGlyphElement",
- "SVGGlyphRefElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGHKernElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGMissingGlyphElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGRenderingIntent",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGSolidcolorElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStylable",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTRefElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGTransformable",
- "SVGURIReference",
- "SVGUnitTypes",
- "SVGUnknownElement",
- "SVGUseElement",
- "SVGVKernElement",
- "SVGViewElement",
- "SVGZoomAndPan",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "SecurityPolicyViolationEvent",
- "Selection",
- "Sensor",
- "SensorErrorEvent",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "ShadowRoot",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "Slotable",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StorageManager",
- "StorageQuota",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "SubtleCrypto",
- "SyncEvent",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoder",
- "TextDecoderStream",
- "TextEncoder",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackList",
- "TimeRanges",
- "Touch",
- "TouchEvent",
- "TouchList",
- "TrackDefault",
- "TrackDefaultList",
- "TrackEvent",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "URLUtilsReadOnly",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "UserProximityEvent",
- "VRDisplay",
- "VRDisplayCapabilities",
- "VRDisplayEvent",
- "VREyeParameters",
- "VRFieldOfView",
- "VRFrameData",
- "VRLayerInit",
- "VRPose",
- "VRStageParameters",
- "VTTCue",
- "ValidityState",
- "VideoPlaybackQuality",
- "VideoTrack",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_atc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_pvrtc",
- "WEBGL_compressed_texture_s3tc",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_renderer_info",
- "WEBGL_debug_shaders",
- "WEBGL_depth_texture",
- "WEBGL_draw_buffers",
- "WEBGL_lose_context",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2ComputeRenderingContext",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLObject",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
\ No newline at end of file
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortPaymentEvent",
+ "AbortSignal",
+ "AbsoluteOrientationSensor",
+ "AbstractRange",
+ "AbstractWorker",
+ "Accelerometer",
+ "AmbientLightSensor",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioParamMap",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "AudioTrack",
+ "AudioTrackList",
+ "AudioWorklet",
+ "AudioWorkletGlobalScope",
+ "AudioWorkletNode",
+ "AudioWorkletProcessor",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BatteryManager",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "Body",
+ "BroadcastChannel",
+ "BudgetService",
+ "BudgetState",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSS",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSPseudoElement",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanMakePaymentEvent",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialUserData",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceLightEvent",
+ "DeviceMotionEvent",
+ "DeviceMotionEventAcceleration",
+ "DeviceMotionEventRotationRate",
+ "DeviceOrientationEvent",
+ "DeviceProximityEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentTimeline",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FederatedCredential",
+ "FetchEvent",
+ "File",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationCoordinates",
+ "GeolocationPosition",
+ "GeolocationPositionError",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "Gyroscope",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBDatabaseException",
+ "IDBEnvironment",
+ "IDBFactory",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBLocaleAwareKeyRange",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageCapture",
+ "ImageData",
+ "InputDeviceCapabilities",
+ "InputDeviceInfo",
+ "InputEvent",
+ "InstallEvent",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LinearAccelerationSensor",
+ "LinkStyle",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "Lock",
+ "LockManager",
+ "LongRange",
+ "MIDIAccess",
+ "MIDIConnectionEvent",
+ "MIDIInput",
+ "MIDIInputMap",
+ "MIDIMessageEvent",
+ "MIDIOutput",
+ "MIDIOutputMap",
+ "MIDIPort",
+ "MSGestureEvent",
+ "Magnetometer",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeySystemConfiguration",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaSettingsRange",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NamedNodeMap",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NavigatorStorage",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "Notification",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_fbo_render_mipmap",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OrientationSensor",
+ "OscillatorNode",
+ "OverconstrainedError",
+ "OverconstrainedErrorEvent",
+ "PageTransitionEvent",
+ "PaintRenderingContext2D",
+ "PaintSize",
+ "PaintWorkletGlobalScope",
+ "PannerNode",
+ "ParentNode",
+ "PasswordCredential",
+ "Path2D",
+ "PayerErrors",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformancePaintTiming",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "PhotoCapabilities",
+ "PictureInPicture",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PointerEvent",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PromiseRejectionEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushRegistrationManager",
+ "PushSubscription",
+ "PushSubscriptionChangeEvent",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCConfiguration",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCErrorEvent",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityAssertion",
+ "RTCIdentityErrorEvent",
+ "RTCIdentityEvent",
+ "RTCIdentityProviderGlobalScope",
+ "RTCIdentityProviderRegistrar",
+ "RTCOfferAnswerOptions",
+ "RTCOfferOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceErrorEvent",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpStreamStats",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsEvent",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStream",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "ReadableStreamDefaultController",
+ "ReadableStreamDefaultReader",
+ "RelativeOrientationSensor",
+ "Request",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "Response",
+ "SVGAElement",
+ "SVGAltGlyphDefElement",
+ "SVGAltGlyphElement",
+ "SVGAltGlyphItemElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPoints",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGColorProfileElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGFilterPrimitiveStandardAttributes",
+ "SVGFontElement",
+ "SVGFontFaceElement",
+ "SVGFontFaceFormatElement",
+ "SVGFontFaceNameElement",
+ "SVGFontFaceSrcElement",
+ "SVGFontFaceUriElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGlyphElement",
+ "SVGGlyphRefElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGHKernElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGMissingGlyphElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGRenderingIntent",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGSolidcolorElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStylable",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTRefElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGTransformable",
+ "SVGURIReference",
+ "SVGUnitTypes",
+ "SVGUnknownElement",
+ "SVGUseElement",
+ "SVGVKernElement",
+ "SVGViewElement",
+ "SVGZoomAndPan",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "Sensor",
+ "SensorErrorEvent",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "ShadowRoot",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "Slotable",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StorageManager",
+ "StorageQuota",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "SubtleCrypto",
+ "SyncEvent",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoder",
+ "TextDecoderStream",
+ "TextEncoder",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackList",
+ "TimeRanges",
+ "Touch",
+ "TouchEvent",
+ "TouchList",
+ "TrackDefault",
+ "TrackDefaultList",
+ "TrackEvent",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "URLUtilsReadOnly",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "UserProximityEvent",
+ "VRDisplay",
+ "VRDisplayCapabilities",
+ "VRDisplayEvent",
+ "VREyeParameters",
+ "VRFieldOfView",
+ "VRFrameData",
+ "VRLayerInit",
+ "VRPose",
+ "VRStageParameters",
+ "VTTCue",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VideoTrack",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_atc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_pvrtc",
+ "WEBGL_compressed_texture_s3tc",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_renderer_info",
+ "WEBGL_debug_shaders",
+ "WEBGL_depth_texture",
+ "WEBGL_draw_buffers",
+ "WEBGL_lose_context",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2ComputeRenderingContext",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLObject",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
+]
diff --git a/test/openwpm_jstest.py b/test/openwpm_jstest.py
index 7851c80c6..dbc8143f2 100644
--- a/test/openwpm_jstest.py
+++ b/test/openwpm_jstest.py
@@ -1,7 +1,9 @@
import re
+
from ..automation.utilities import db_utils
from .openwpmtest import OpenWPMTest
+
class OpenWPMJSTest(OpenWPMTest):
def get_config(self, data_dir=""):
@@ -10,7 +12,9 @@ def get_config(self, data_dir=""):
manager_params['testing'] = True
return manager_params, browser_params
- def _check_calls(self, db, symbol_prefix, doc_url, top_url, expected_method_calls, expected_gets_and_sets):
+ def _check_calls(
+ self, db, symbol_prefix, doc_url, top_url,
+ expected_method_calls, expected_gets_and_sets):
"""Helper to check method calls and accesses in each frame"""
rows = db_utils.get_javascript_entries(db, all_columns=True)
observed_gets_and_sets = set()
@@ -30,4 +34,4 @@ def _check_calls(self, db, symbol_prefix, doc_url, top_url, expected_method_call
(symbol, row['operation'], row['arguments'])
)
assert observed_calls == expected_method_calls
- assert observed_gets_and_sets == expected_gets_and_sets
\ No newline at end of file
+ assert observed_gets_and_sets == expected_gets_and_sets
diff --git a/test/test_js_instrument.py b/test/test_js_instrument.py
index e5672f10d..3f5a1167f 100644
--- a/test/test_js_instrument.py
+++ b/test/test_js_instrument.py
@@ -59,9 +59,9 @@ class TestJSInstrumentExistingWindowProperty(OpenWPMJSTest):
("window.partiallyExisting", "get", "{\"existingProp\":\"blah1\"}"),
("window.partiallyExisting.nonExistingProp1", "get", "blah1"),
("window.partiallyExisting", "get",
- "{\"existingProp\":\"blah1\"}"), # Note 1
+ "{\"existingProp\":\"blah1\"}"), # Note 1
("window.partiallyExisting.nonExistingMethod1",
- "get", "undefined"), # Note 2
+ "get", "undefined"), # Note 2
}
# Note 1: nonExistingProp1 is not enumerable even after being set
@@ -87,7 +87,7 @@ def test_instrument_object(self):
)
-class TestJSInstrumentExistingWindowPropertyByPython(TestJSInstrumentExistingWindowProperty):
+class TestJSInstrumentExistingWindowPropertyByPython(TestJSInstrumentExistingWindowProperty): # noqa
# This test is a repeat of above test, but as an integration test
# to test correct setting of instrumentaiton via browser params.
@@ -133,6 +133,7 @@ def get_config(self, data_dir=""):
"""
return manager_params, browser_params
+
class TestJSInstrumentMockWindowProperty(OpenWPMJSTest):
GETS_AND_SETS = {
@@ -142,19 +143,19 @@ class TestJSInstrumentMockWindowProperty(OpenWPMJSTest):
("window.alreadyInstantiatedMockClassInstance", "get", "{}"),
("window.MockClass.nonExistingProp1", "get", "undefined"),
("window.alreadyInstantiatedMockClassInstance.nonExistingProp1",
- "get", "undefined"),
+ "get", "undefined"),
("window.alreadyInstantiatedMockClassInstance", "get", "{}"),
("window.MockClass.nonExistingProp1", "set", "blah1"),
("window.alreadyInstantiatedMockClassInstance.nonExistingProp1",
- "set", "blah1"),
+ "set", "blah1"),
("window.alreadyInstantiatedMockClassInstance", "get", "{}"),
("window.MockClass.nonExistingProp1", "get", "blah1"),
("window.alreadyInstantiatedMockClassInstance.nonExistingProp1",
- "get", "blah1"),
+ "get", "blah1"),
("window.alreadyInstantiatedMockClassInstance", "get", "{}"),
("window.MockClass.nonExistingMethod1", "get", "undefined"), # Note 1
("window.alreadyInstantiatedMockClassInstance.nonExistingMethod1",
- "get", "undefined"), # Note 1
+ "get", "undefined"), # Note 1
("window.newMockClassInstance", "get", "{}"),
("window.newMockClassInstance", "get", "{}"),
("window.newMockClassInstance", "get", "{}"),
@@ -214,7 +215,7 @@ class TestJSInstrument(OpenWPMJSTest):
('method1', 'get', 'now static'),
('prop1', 'set', 'FUNCTION'),
('nestedObj', 'get',
- '{"prop1":"default1","prop2":"default2","method1":"FUNCTION"}')
+ '{"prop1":"default1","prop2":"default2","method1":"FUNCTION"}')
}
METHOD_CALLS = {
From 952908a9159c67f98d474797d34aba6d40845d48 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 20 May 2020 22:46:58 -0500
Subject: [PATCH 040/106] New files and failing tests.
---
automation/js_instrumentation/log_settings.py | 44 ++++++++++++
.../js_instrumentation/python_to_js_string.py | 0
test/test_js_instrument_py.py | 71 +++++++++++++++++++
3 files changed, 115 insertions(+)
create mode 100644 automation/js_instrumentation/log_settings.py
create mode 100644 automation/js_instrumentation/python_to_js_string.py
create mode 100644 test/test_js_instrument_py.py
diff --git a/automation/js_instrumentation/log_settings.py b/automation/js_instrumentation/log_settings.py
new file mode 100644
index 000000000..3fd50cb24
--- /dev/null
+++ b/automation/js_instrumentation/log_settings.py
@@ -0,0 +1,44 @@
+"""
+// Implements ILogSettings and sets defaults
+export class LogSettings implements ILogSettings {
+ // propertiesToInstrument : Array
+ // An array of properties to instrument on this object.
+ // If array is empty, then all properties are instrumented.
+ // nonExistingPropertiesToInstrument : Array
+ // An array of non-existing properties to instrument on this object.
+ // excludedProperties : Array
+ // Properties excluded from instrumentation.
+ // logCallStack : boolean
+ // Set to true save the call stack info with each property call.
+ // logFunctionsAsStrings : boolean
+ // Set to true to save functional arguments as strings during
+ // argument serialization.
+ // logFunctionGets: boolean
+ // ....
+ // preventSets : boolean
+ // Set to true to prevent nested objects and functions from being
+ // overwritten (and thus having their instrumentation removed).
+ // Other properties (static values) can still be set with this is
+ // enabled.
+ // recursive : boolean
+ // Set to `true` to recursively instrument all object properties of
+ // the given `object`.
+ // NOTE:
+ // (1)`logSettings['propertiesToInstrument']` does not propagate
+ // to sub-objects.
+ // (2) Sub-objects of prototypes can not be instrumented
+ // recursively as these properties can not be accessed
+ // until an instance of the prototype is created.
+ // depth : integer
+ // Recursion limit when instrumenting object recursively.
+ propertiesToInstrument: string[] = [];
+ nonExistingPropertiesToInstrument: string[] = [];
+ excludedProperties: string[] = [];
+ logCallStack: boolean = false;
+ logFunctionsAsStrings: boolean = false;
+ logFunctionGets: boolean = false;
+ preventSets: boolean = false;
+ recursive: boolean = false;
+ depth: number = 5;
+}
+"""
\ No newline at end of file
diff --git a/automation/js_instrumentation/python_to_js_string.py b/automation/js_instrumentation/python_to_js_string.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
new file mode 100644
index 000000000..13cecf85e
--- /dev/null
+++ b/test/test_js_instrument_py.py
@@ -0,0 +1,71 @@
+from ..automation import JSInstrumentation as jsi
+
+# Unit tests to test JSInstrumentation.py
+# which exists to process short-cut APIs
+# assert Falseed to browser_params['js_instrumentation_modules']
+# and to validate the string to be assert Falseed to the instrumentation
+
+def test_validate_good_string():
+ good_string = """
+ [
+ {
+ object: window,
+ instrumentedName: "window",
+ logSettings: {
+ propertiesToInstrument: ["partiallyExisting",]
+ nonExistingPropertiesToInstrument: [],
+ excludedProperties: [],
+ logCallStack: false,
+ logFunctionsAsStrings: false,
+ logFunctionGets: false,
+ preventSets: false,
+ recursive: false,
+ depth: 5,
+ },
+ }
+ ]
+ """
+ assert jsi.validate(good_string)
+
+
+def test_validate_bad_string_log_settings_missing():
+ assert False
+
+def test_validate_bad_string_log_settings_invalid():
+ assert False
+
+def test_validate_bad_string_not_a_list():
+ assert False
+
+def test_validate_bad_string_missing_object():
+ assert False
+
+def test_validated_bad_string_missing_instrumentedName():
+ assert False
+
+def test_deduplication_multiple_duped_properties():
+ assert False
+
+def test_deduplication_multiple_duped_properties_different_log_settings():
+ assert False
+
+def test_api_shortcut_fingerprinting():
+ assert False
+
+def test_api_whole_module():
+ assert False
+
+def test_api_whole_module_invalid():
+ assert False
+
+def test_api_module_specific_properties():
+ assert False
+
+def test_api_instances_on_window():
+ assert False
+
+def test_api_properties_on_window_instance():
+ assert False
+
+def test_assert_passing_partial_log_settings():
+ assert False
From cd7bf5ec5b191a5975ac49db7e5244244e1a638e Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 02:25:15 -0500
Subject: [PATCH 041/106] Add a json schema for js_instrument_modules
---
.../js_instrument_modules.schema | 97 +++++++++++++++++++
1 file changed, 97 insertions(+)
create mode 100644 automation/js_instrumentation/js_instrument_modules.schema
diff --git a/automation/js_instrumentation/js_instrument_modules.schema b/automation/js_instrumentation/js_instrument_modules.schema
new file mode 100644
index 000000000..4d2908f5e
--- /dev/null
+++ b/automation/js_instrumentation/js_instrument_modules.schema
@@ -0,0 +1,97 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://example.com/js-instrument-modules.schema",
+ "title": "JS Instrument Modules",
+ "description": "Schema describing the JSON to be passed to JS Instrument Modules.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "object": {
+ "description": "The JS object to be instrumented.",
+ "type": "string"
+ },
+ "instrumentedName": {
+ "description": "The name recorded by the instrumentation for this object.",
+ "type": "string"
+ },
+ "logSettings": {
+ "description": "The log settings object.",
+ "type": "object",
+ "properties": {
+ "propertiesToInstrument": {
+ "description": "An array of properties to instrument on this object. If array is empty, then all properties are instrumented.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "default": []
+ },
+ "nonExistingPropertiesToInstrument": {
+ "description": "An array of non-existing properties to instrument on this object.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "default": []
+ },
+ "excludedProperties": {
+ "description": "Properties excluded from instrumentation.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "default": []
+ },
+ "logCallStack": {
+ "description": "Set to true save the call stack info with each property call.",
+ "type": "boolean",
+ "default": false
+ },
+ "logFunctionsAsStrings": {
+ "description": "Set to true to save args that are functions as strings during argument serialization. If false `FUNCTION` is recorded.",
+ "type": "boolean",
+ "default": false
+ },
+ "logFunctionGets": {
+ "description": "Set true to log get requests to properties that are functions. If true when a call is made, the log will contain both the call and a get log.",
+ "type": "boolean",
+ "default": false
+ },
+ "preventSets": {
+ "description": "Set to true to prevent nested objects and functions from being overwritten (and thus having their instrumentation removed). Other properties (static values) can still be set with this is enabled.",
+ "type": "boolean",
+ "default": false
+ },
+ "recursive": {
+ "description": "Set to `true` to recursively instrument all object properties of the given `object`. NOTE: (1) `propertiesToInstrument` does not propagate to sub-objects. (2) Sub-objects of prototypes can not be instrumented recursively as these properties can not be accessed until an instance of the prototype is created.",
+ "type": "boolean",
+ "default": false
+ },
+ "depth": {
+ "description": "Recursion limit when instrumenting object recursively",
+ "type": "number",
+ "default": 5
+ }
+ },
+ "required": [
+ "propertiesToInstrument",
+ "nonExistingPropertiesToInstrument",
+ "excludedProperties",
+ "logCallStack",
+ "logFunctionsAsStrings",
+ "logFunctionGets",
+ "preventSets",
+ "recursive",
+ "depth"
+ ]
+ }
+ },
+ "required": [
+ "object",
+ "instrumentedName",
+ "logSettings"
+ ],
+ "additionalProperties": false
+ }
+}
\ No newline at end of file
From cd4b0f713de1d498586af8bdb37fb6aed5f2847b Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 02:38:03 -0500
Subject: [PATCH 042/106] Latest py tests
---
automation/JSInstrumentation.py | 12 ++
.../js_instrument_modules.schema | 3 +-
.../js_instrumentation/python_to_js_string.py | 18 ++
environment.yaml | 7 +-
scripts/environment-unpinned.yaml | 1 +
test/conftest.py | 20 +--
test/pytest.ini | 1 +
test/test_js_instrument_py.py | 170 ++++++++++++++----
test/utilities.py | 24 ---
9 files changed, 178 insertions(+), 78 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 4de81d449..66c2d1803 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -26,3 +26,15 @@
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
"""
+import os
+import json
+import jsonschema
+from .js_instrumentation.python_to_js_string import python_to_js_string
+
+curdir = os.path.dirname(os.path.realpath(__file__))
+
+def validate(python_list_to_validate):
+ schema_path = os.path.join(curdir, 'js_instrumentation', 'js_instrument_modules.schema')
+ schema = json.loads(open(schema_path).read())
+ jsonschema.validate(instance=python_list_to_validate, schema=schema)
+ return True
\ No newline at end of file
diff --git a/automation/js_instrumentation/js_instrument_modules.schema b/automation/js_instrumentation/js_instrument_modules.schema
index 4d2908f5e..897411653 100644
--- a/automation/js_instrumentation/js_instrument_modules.schema
+++ b/automation/js_instrumentation/js_instrument_modules.schema
@@ -84,7 +84,8 @@
"preventSets",
"recursive",
"depth"
- ]
+ ],
+ "additionalProperties": false
}
},
"required": [
diff --git a/automation/js_instrumentation/python_to_js_string.py b/automation/js_instrumentation/python_to_js_string.py
index e69de29bb..bb28a2828 100644
--- a/automation/js_instrumentation/python_to_js_string.py
+++ b/automation/js_instrumentation/python_to_js_string.py
@@ -0,0 +1,18 @@
+import json
+import textwrap
+
+def python_to_js_string(py_in):
+ """Takes python in and converts it to a string
+ of the equivalent JS object.
+
+ Customized for our specific needs:
+ * expects a list
+ * object is de-quoted
+ """
+ objects = [x['object'] for x in py_in]
+ out = json.dumps(py_in)
+ for o in objects:
+ obj_str_before = f'"object": "{o}",'
+ obj_str_after = f'"object": {o},'
+ out = out.replace(obj_str_before, obj_str_after)
+ return out
\ No newline at end of file
diff --git a/environment.yaml b/environment.yaml
index cbb506c1a..09a7268a3 100644
--- a/environment.yaml
+++ b/environment.yaml
@@ -3,7 +3,7 @@ channels:
- main
dependencies:
- autopep8=1.5.2
-- beautifulsoup4=4.9.0
+- beautifulsoup4=4.9.1
- dill=0.3.1.1
- flake8-isort=3.0.0
- flake8=3.8.1
@@ -15,10 +15,10 @@ dependencies:
- nodejs=13.13.0
- pandas=1.0.3
- pillow=7.1.2
-- pip=20.1
+- pip=20.1.1
- pre-commit=2.4.0
- psutil=5.7.0
-- pyarrow=0.17.0
+- pyarrow=0.17.1
- pytest=5.4.2
- python=3.8.2
- pyvirtualdisplay=0.2.5
@@ -34,6 +34,7 @@ dependencies:
- crontab==0.22.6
- domain-utils==0.7.1
- flask-cors==3.0.8
+ - jsonschema==3.2.0
- moto-ext==1.3.15.15
- plyvel==1.2.0
- subprocess32==3.5.4
diff --git a/scripts/environment-unpinned.yaml b/scripts/environment-unpinned.yaml
index 7010753a7..799cb4b9e 100644
--- a/scripts/environment-unpinned.yaml
+++ b/scripts/environment-unpinned.yaml
@@ -25,5 +25,6 @@ dependencies:
- tblib
- wget
- pip:
+ - jsonschema
- plyvel
- domain-utils
diff --git a/test/conftest.py b/test/conftest.py
index 1ce397dab..841658da8 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -15,20 +15,18 @@
'firefox')
-def create_xpi():
- """Creates a new xpi using npm run build."""
- if utilities.which("npm"):
- subprocess.check_call(["npm", "run", "build"],
- cwd=EXTENSION_DIR)
- else:
- assert os.path.exists(os.path.join(EXTENSION_DIR, 'openwpm.xpi'))
-
-
@pytest.fixture(scope="session", autouse=True)
def prepare_test_setup(request):
"""Run an HTTP server during the tests."""
- create_xpi()
- print("\nStarting local_http_server")
+
+ if 'pyonly' in request.config.invocation_params.args:
+ return
+
+ # Creates a new xpi using npm run build.
+ print("Building new xpi")
+ subprocess.check_call(["npm", "run", "build"], cwd=EXTENSION_DIR)
+
+ print("Starting local_http_server")
server, server_thread = utilities.start_server()
def local_http_server_stop():
diff --git a/test/pytest.ini b/test/pytest.ini
index 1ea2a5938..866c7203a 100644
--- a/test/pytest.ini
+++ b/test/pytest.ini
@@ -2,4 +2,5 @@
python_files=test_*.py
markers =
+ pyonly: marks a test as being python only and so server and xpi not needed
slow: marks a test as slow (omit slow tests with '-m "not slow"')
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 13cecf85e..ce2f590cd 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -1,47 +1,139 @@
+import pytest
+from jsonschema.exceptions import ValidationError
from ..automation import JSInstrumentation as jsi
-# Unit tests to test JSInstrumentation.py
-# which exists to process short-cut APIs
-# assert Falseed to browser_params['js_instrumentation_modules']
-# and to validate the string to be assert Falseed to the instrumentation
-
-def test_validate_good_string():
- good_string = """
- [
+pytestmark = pytest.mark.pyonly
+
+
+def _no_whitespace(x):
+ return "".join(x.split())
+
+# Test function that converts our python
+# objects to our JS string
+
+def test_python_to_js_lower_true_false():
+ inpy = [{
+ 'object': 'window',
+ 'logSettings': {
+ 'logCallStack': False,
+ 'preventSets': True,
+ }
+ }]
+ expected_out = _no_whitespace("""
+ [{
+ "object": window,
+ "logSettings": {
+ "logCallStack": false,
+ "preventSets": true
+ }
+ }]
+ """)
+ actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+def test_python_to_js_no_quote_object():
+ inpy = [{'object': 'window', 'logSettings': {}}]
+ expected_out = _no_whitespace('[{"object": window, "logSettings": {}}]')
+ actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+def test_python_to_js_no_quote_object_two_matching_objects():
+ inpy = [
+ {'object': 'window', 'logSettings': {}},
+ {'object': 'window', 'logSettings': {}},
+ {'object': 'window2', 'logSettings': {}}
+ ]
+ expected_out = _no_whitespace("""[
+ {"object": window, "logSettings": {}},
+ {"object": window, "logSettings": {}},
+ {"object": window2, "logSettings": {}}
+ ]""")
+ actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+# Test our validation
+@pytest.fixture
+def default_log_settings():
+ return {
+ 'propertiesToInstrument': [],
+ 'nonExistingPropertiesToInstrument': [],
+ 'excludedProperties': [],
+ 'logCallStack': False,
+ 'logFunctionsAsStrings': False,
+ 'logFunctionGets': False,
+ 'preventSets': False,
+ 'recursive': False,
+ 'depth': 5,
+ }
+
+
+def test_validate_good(default_log_settings):
+ good_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': "window",
+ 'logSettings': default_log_settings
+ }
+ ]
+ assert jsi.validate(good_input)
+
+
+def test_validate_bad__log_settings_missing(default_log_settings):
+ log_keys = default_log_settings.keys()
+ for log_key in log_keys:
+ print('Testing for missing', log_key)
+ log_settings = default_log_settings.copy()
+ log_settings.pop(log_key)
+ bad_input = [
{
- object: window,
- instrumentedName: "window",
- logSettings: {
- propertiesToInstrument: ["partiallyExisting",]
- nonExistingPropertiesToInstrument: [],
- excludedProperties: [],
- logCallStack: false,
- logFunctionsAsStrings: false,
- logFunctionGets: false,
- preventSets: false,
- recursive: false,
- depth: 5,
- },
+ 'object': 'window',
+ 'instrumentedName': "window",
+ 'logSettings': log_settings
}
]
- """
- assert jsi.validate(good_string)
-
-
-def test_validate_bad_string_log_settings_missing():
- assert False
-
-def test_validate_bad_string_log_settings_invalid():
- assert False
-
-def test_validate_bad_string_not_a_list():
- assert False
-
-def test_validate_bad_string_missing_object():
- assert False
-
-def test_validated_bad_string_missing_instrumentedName():
- assert False
+ with pytest.raises(ValidationError):
+ jsi.validate(bad_input),
+
+def test_validate_bad__log_settings_invalid(default_log_settings):
+ log_settings = default_log_settings.copy()
+ log_settings['recursive'] = 'yes, please'
+ bad_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': "window",
+ 'logSettings': log_settings
+ }
+ ]
+ with pytest.raises(ValidationError):
+ assert jsi.validate(bad_input)
+
+def test_validate_bad__not_a_list(default_log_settings):
+ bad_input = {
+ 'object': 'window',
+ 'instrumentedName': "window",
+ 'logSettings': default_log_settings
+ }
+ with pytest.raises(ValidationError):
+ assert jsi.validate(bad_input)
+
+def test_validate_bad__missing_object(default_log_settings):
+ bad_input = [{
+ 'instrumentedName': "window",
+ 'logSettings': default_log_settings
+ }]
+ with pytest.raises(ValidationError):
+ assert jsi.validate(bad_input)
+
+def test_validated_bad__missing_instrumentedName():
+ bad_input = [{
+ 'object': 'window',
+ 'logSettings': default_log_settings
+ }]
+ with pytest.raises(ValidationError):
+ assert jsi.validate(bad_input)
def test_deduplication_multiple_duped_properties():
assert False
diff --git a/test/utilities.py b/test/utilities.py
index 4740e243e..24e62d404 100644
--- a/test/utilities.py
+++ b/test/utilities.py
@@ -21,24 +21,6 @@
BASE_TEST_URL_NOSCHEME = BASE_TEST_URL.split('//')[1]
-def which(program):
- def is_exe(fpath):
- return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
-
- fpath, fname = os.path.split(program)
- if fpath:
- if is_exe(program):
- return program
- else:
- for path in os.environ["PATH"].split(os.pathsep):
- path = path.strip('"')
- exe_file = os.path.join(path, program)
- if is_exe(exe_file):
- return exe_file
-
- return None
-
-
class MyTCPServer(socketserver.TCPServer):
"""Subclass TCPServer to be able to reuse the same port (Errno 98)."""
allow_reuse_address = True
@@ -132,12 +114,6 @@ def start_server():
return server, thread
-def rand_str(size=8):
- """Return random string with the given size."""
- RAND_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789"
- return ''.join(choice(RAND_CHARS) for _ in range(size))
-
-
class LocalS3Session(object):
"""
Ensures that the local s3 service is used when
From f512fb8d354ce0c7201693675b98018589480a4d Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 02:44:06 -0500
Subject: [PATCH 043/106] Flake8
---
automation/JSInstrumentation.py | 10 +++--
automation/js_instrumentation/log_settings.py | 23 +----------
.../js_instrumentation/python_to_js_string.py | 6 +--
test/test_js_instrument_py.py | 40 +++++++++++++++++--
test/utilities.py | 2 -
5 files changed, 48 insertions(+), 33 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 66c2d1803..0777c6390 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -26,15 +26,19 @@
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
"""
-import os
import json
+import os
+
import jsonschema
+
from .js_instrumentation.python_to_js_string import python_to_js_string
curdir = os.path.dirname(os.path.realpath(__file__))
+
def validate(python_list_to_validate):
- schema_path = os.path.join(curdir, 'js_instrumentation', 'js_instrument_modules.schema')
+ schema_path = os.path.join(
+ curdir, 'js_instrumentation', 'js_instrument_modules.schema')
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
- return True
\ No newline at end of file
+ return True
diff --git a/automation/js_instrumentation/log_settings.py b/automation/js_instrumentation/log_settings.py
index 3fd50cb24..912184caf 100644
--- a/automation/js_instrumentation/log_settings.py
+++ b/automation/js_instrumentation/log_settings.py
@@ -1,25 +1,4 @@
"""
-// Implements ILogSettings and sets defaults
-export class LogSettings implements ILogSettings {
- // propertiesToInstrument : Array
- // An array of properties to instrument on this object.
- // If array is empty, then all properties are instrumented.
- // nonExistingPropertiesToInstrument : Array
- // An array of non-existing properties to instrument on this object.
- // excludedProperties : Array
- // Properties excluded from instrumentation.
- // logCallStack : boolean
- // Set to true save the call stack info with each property call.
- // logFunctionsAsStrings : boolean
- // Set to true to save functional arguments as strings during
- // argument serialization.
- // logFunctionGets: boolean
- // ....
- // preventSets : boolean
- // Set to true to prevent nested objects and functions from being
- // overwritten (and thus having their instrumentation removed).
- // Other properties (static values) can still be set with this is
- // enabled.
// recursive : boolean
// Set to `true` to recursively instrument all object properties of
// the given `object`.
@@ -41,4 +20,4 @@
recursive: boolean = false;
depth: number = 5;
}
-"""
\ No newline at end of file
+"""
diff --git a/automation/js_instrumentation/python_to_js_string.py b/automation/js_instrumentation/python_to_js_string.py
index bb28a2828..5944f8ea4 100644
--- a/automation/js_instrumentation/python_to_js_string.py
+++ b/automation/js_instrumentation/python_to_js_string.py
@@ -1,5 +1,5 @@
import json
-import textwrap
+
def python_to_js_string(py_in):
"""Takes python in and converts it to a string
@@ -13,6 +13,6 @@ def python_to_js_string(py_in):
out = json.dumps(py_in)
for o in objects:
obj_str_before = f'"object": "{o}",'
- obj_str_after = f'"object": {o},'
+ obj_str_after = f'"object": {o},'
out = out.replace(obj_str_before, obj_str_after)
- return out
\ No newline at end of file
+ return out
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index ce2f590cd..91c2328c6 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -1,5 +1,6 @@
import pytest
from jsonschema.exceptions import ValidationError
+
from ..automation import JSInstrumentation as jsi
pytestmark = pytest.mark.pyonly
@@ -11,6 +12,7 @@ def _no_whitespace(x):
# Test function that converts our python
# objects to our JS string
+
def test_python_to_js_lower_true_false():
inpy = [{
'object': 'window',
@@ -97,6 +99,7 @@ def test_validate_bad__log_settings_missing(default_log_settings):
with pytest.raises(ValidationError):
jsi.validate(bad_input),
+
def test_validate_bad__log_settings_invalid(default_log_settings):
log_settings = default_log_settings.copy()
log_settings['recursive'] = 'yes, please'
@@ -110,6 +113,7 @@ def test_validate_bad__log_settings_invalid(default_log_settings):
with pytest.raises(ValidationError):
assert jsi.validate(bad_input)
+
def test_validate_bad__not_a_list(default_log_settings):
bad_input = {
'object': 'window',
@@ -119,6 +123,7 @@ def test_validate_bad__not_a_list(default_log_settings):
with pytest.raises(ValidationError):
assert jsi.validate(bad_input)
+
def test_validate_bad__missing_object(default_log_settings):
bad_input = [{
'instrumentedName': "window",
@@ -127,7 +132,8 @@ def test_validate_bad__missing_object(default_log_settings):
with pytest.raises(ValidationError):
assert jsi.validate(bad_input)
-def test_validated_bad__missing_instrumentedName():
+
+def test_validated_bad__missing_instrumentedName(default_log_settings):
bad_input = [{
'object': 'window',
'logSettings': default_log_settings
@@ -135,29 +141,57 @@ def test_validated_bad__missing_instrumentedName():
with pytest.raises(ValidationError):
assert jsi.validate(bad_input)
-def test_deduplication_multiple_duped_properties():
- assert False
+
+def test_deduplication_multiple_duped_properties(default_log_settings):
+ dupe_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': default_log_settings
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': default_log_settings
+ },
+ ]
+ expected_de_dupe_output = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': default_log_settings
+ },
+ ]
+ assert jsi.dedupe(dupe_input) == expected_de_dupe_output
+
def test_deduplication_multiple_duped_properties_different_log_settings():
assert False
+
def test_api_shortcut_fingerprinting():
assert False
+
def test_api_whole_module():
assert False
+
def test_api_whole_module_invalid():
assert False
+
def test_api_module_specific_properties():
assert False
+
def test_api_instances_on_window():
assert False
+
def test_api_properties_on_window_instance():
assert False
+
def test_assert_passing_partial_log_settings():
assert False
diff --git a/test/utilities.py b/test/utilities.py
index 24e62d404..87bf2eb8c 100644
--- a/test/utilities.py
+++ b/test/utilities.py
@@ -1,10 +1,8 @@
-
import os
import socketserver
import threading
from http.server import SimpleHTTPRequestHandler
from os.path import dirname, realpath
-from random import choice
from urllib.parse import parse_qs, urlparse
import boto3
From a99c7834cf50491a9fe81b131b04e30cb0cc6d20 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 03:01:11 -0500
Subject: [PATCH 044/106] Ongoing progress.
---
automation/JSInstrumentation.py | 116 +++++++++++++-----
automation/default_browser_params.json | 2 +-
automation/js_instrumentation/log_settings.py | 23 ----
.../js_instrumentation/python_to_js_string.py | 18 ---
test/test_js_instrument.py | 38 ++----
test/test_js_instrument_py.py | 12 +-
6 files changed, 94 insertions(+), 115 deletions(-)
delete mode 100644 automation/js_instrumentation/log_settings.py
delete mode 100644 automation/js_instrumentation/python_to_js_string.py
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 0777c6390..8dbfa9ec7 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,44 +1,98 @@
-"""
- We accept a list. From the list we need to parse each item.
- The item may be a string or an object with one key.
- If the item is a string:
- - Is it a shortcut e.g. "fingerprinting"
- - Is it an object (verified by mdn-browser-compat)
- - If neither, reject
- If the item is an object:
- - Must only have one property
- - The value may be a list or a LogSettings object
- - If the value is a list, it is transformed into the propertiesToInstrument
- property of a new LogSettings object.
- We must also create the instrumentedName value.
-
- Examples of the APIs we accept.
-
- // Shortcut
- "fingerprinting",
- // APIs
- {"XMLHttpRequest": {"badSetting": 1}},
- {"XMLHttpRequest": {"excludedProperties": ["send"]}},
- {"Prop1": ["hi"], "Prop2": ["hi2"]},
- {"XMLHttpRequest": ["send"]},
- "Storage",
- // Specific instances on window
- {"window.document": ["cookie", "referrer"]},
- {"window": ["name", "localStorage", "sessionStorage"]}
-"""
import json
import os
import jsonschema
-from .js_instrumentation.python_to_js_string import python_to_js_string
-
curdir = os.path.dirname(os.path.realpath(__file__))
+def get_default_log_settings():
+ return {
+ 'propertiesToInstrument': [],
+ 'nonExistingPropertiesToInstrument': [],
+ 'excludedProperties': [],
+ 'logCallStack': False,
+ 'logFunctionsAsStrings': False,
+ 'logFunctionGets': False,
+ 'preventSets': False,
+ 'recursive': False,
+ 'depth': 5,
+ }
+
+
+def python_to_js_string(py_in):
+ """Takes python in and converts it to a string
+ of the equivalent JS object.
+
+ Customized for our specific needs:
+ * expects a list
+ * object is de-quoted
+ """
+ objects = [x['object'] for x in py_in]
+ out = json.dumps(py_in)
+ for o in objects:
+ obj_str_before = f'"object": "{o}",'
+ obj_str_after = f'"object": {o},'
+ out = out.replace(obj_str_before, obj_str_after)
+ return out
+
+
def validate(python_list_to_validate):
schema_path = os.path.join(
- curdir, 'js_instrumentation', 'js_instrument_modules.schema')
+ curdir, 'js_instrumentation', 'js_instrument_modules.schema'
+ )
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
return True
+
+
+def dedupe(python_list):
+ return python_list
+
+
+def get_instrumented_name(object):
+ pass
+
+
+def build_object_from_request(request):
+ """
+ We need to build a valid object from each request.
+
+ The item may be a string or an object with one key.
+ If the item is a string:
+ - Is it a shortcut e.g. "fingerprinting"
+ - Is it an object (verified by mdn-browser-compat)
+ - If neither, reject
+ If the item is an object:
+ - Must only have one property
+ - The value may be a list or a LogSettings object
+ - If the value is a list, it is transformed into the
+ propertiesToInstrument property of a new LogSettings object.
+ We must also create the instrumentedName value.
+ """
+ return {}
+
+
+def convert_browser_params_to_js_string(js_instrument_modules):
+ """
+ We accept a list. From the list we need to parse each item.
+ Examples of the requests we accept.
+ // Shortcut
+ "fingerprinting",
+ // APIs
+ {"XMLHttpRequest": {"badSetting": 1}},
+ {"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ {"Prop1": ["hi"], "Prop2": ["hi2"]},
+ {"XMLHttpRequest": ["send"]},
+ "Storage",
+ // Specific instances on window
+ {"window.document": ["cookie", "referrer"]},
+ {"window": ["name", "localStorage", "sessionStorage"]}
+ """
+ assert isinstance(js_instrument_modules, list)
+ requests = [
+ build_object_from_request(request) for request in js_instrument_modules
+ ]
+ requests = dedupe(requests)
+ validate(requests)
+ return python_to_js_string(requests)
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index 2adf86832..d1d74dc87 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -2,7 +2,7 @@
"extension_enabled": true,
"cookie_instrument": false,
"js_instrument": false,
- "js_instrument_modules": "[]",
+ "js_instrument_modules": ["fingerprinting"],
"http_instrument": false,
"navigation_instrument": false,
"save_content": false,
diff --git a/automation/js_instrumentation/log_settings.py b/automation/js_instrumentation/log_settings.py
deleted file mode 100644
index 912184caf..000000000
--- a/automation/js_instrumentation/log_settings.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
- // recursive : boolean
- // Set to `true` to recursively instrument all object properties of
- // the given `object`.
- // NOTE:
- // (1)`logSettings['propertiesToInstrument']` does not propagate
- // to sub-objects.
- // (2) Sub-objects of prototypes can not be instrumented
- // recursively as these properties can not be accessed
- // until an instance of the prototype is created.
- // depth : integer
- // Recursion limit when instrumenting object recursively.
- propertiesToInstrument: string[] = [];
- nonExistingPropertiesToInstrument: string[] = [];
- excludedProperties: string[] = [];
- logCallStack: boolean = false;
- logFunctionsAsStrings: boolean = false;
- logFunctionGets: boolean = false;
- preventSets: boolean = false;
- recursive: boolean = false;
- depth: number = 5;
-}
-"""
diff --git a/automation/js_instrumentation/python_to_js_string.py b/automation/js_instrumentation/python_to_js_string.py
deleted file mode 100644
index 5944f8ea4..000000000
--- a/automation/js_instrumentation/python_to_js_string.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import json
-
-
-def python_to_js_string(py_in):
- """Takes python in and converts it to a string
- of the equivalent JS object.
-
- Customized for our specific needs:
- * expects a list
- * object is de-quoted
- """
- objects = [x['object'] for x in py_in]
- out = json.dumps(py_in)
- for o in objects:
- obj_str_before = f'"object": "{o}",'
- obj_str_after = f'"object": {o},'
- out = out.replace(obj_str_before, obj_str_after)
- return out
diff --git a/test/test_js_instrument.py b/test/test_js_instrument.py
index 3f5a1167f..c4e6facba 100644
--- a/test/test_js_instrument.py
+++ b/test/test_js_instrument.py
@@ -93,44 +93,20 @@ class TestJSInstrumentExistingWindowPropertyByPython(TestJSInstrumentExistingWin
def get_config(self, data_dir=""):
manager_params, browser_params = super().get_config(data_dir)
- browser_params[0]['js_insrument_modules'] = """
- [
+ browser_params[0]['js_insrument_modules'] = [
+ {"window": ["partiallyExisting", ]},
{
- object: window,
- instrumentedName: "window",
- logSettings: {
- propertiesToInstrument: ["partiallyExisting",]
- nonExistingPropertiesToInstrument: [],
- excludedProperties: [],
- logCallStack: false,
- logFunctionsAsStrings: false,
- logFunctionGets: false,
- preventSets: false,
- recursive: false,
- depth: 5,
- },
- },
- {
- object: window.partiallyExisting,
- instrumentedName: "window.partiallyExisting",
- logSettings: {
- propertiesToInstrument: ["existingProp",],
- nonExistingPropertiesToInstrument: [
+ "object": "window.partiallyExisting",
+ "instrumentedName": "window.partiallyExisting",
+ "logSettings": {
+ "propertiesToInstrument": ["existingProp", ],
+ "nonExistingPropertiesToInstrument": [
"nonExistingProp1",
"nonExistingMethod1",
],
- nonExistingPropertiesToInstrument: [],
- excludedProperties: [],
- logCallStack: false,
- logFunctionsAsStrings: false,
- logFunctionGets: false,
- preventSets: false,
- recursive: false,
- depth: 5,
},
},
]
- """
return manager_params, browser_params
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 91c2328c6..1ccfa26a3 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -59,17 +59,7 @@ def test_python_to_js_no_quote_object_two_matching_objects():
# Test our validation
@pytest.fixture
def default_log_settings():
- return {
- 'propertiesToInstrument': [],
- 'nonExistingPropertiesToInstrument': [],
- 'excludedProperties': [],
- 'logCallStack': False,
- 'logFunctionsAsStrings': False,
- 'logFunctionGets': False,
- 'preventSets': False,
- 'recursive': False,
- 'depth': 5,
- }
+ return jsi.get_default_log_settings()
def test_validate_good(default_log_settings):
From 8d20b25e32a4cba8f7b9be9fed61b9f0e2315f1a Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 03:48:35 -0500
Subject: [PATCH 045/106] More code, more tests.
---
automation/JSInstrumentation.py | 49 ++++++++++++++++++++++--
test/test_js_instrument_py.py | 66 +++++++++++++++++++++++++++++++--
2 files changed, 108 insertions(+), 7 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 8dbfa9ec7..541b80c9f 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,6 +1,6 @@
+import collections
import json
import os
-
import jsonschema
curdir = os.path.dirname(os.path.realpath(__file__))
@@ -18,6 +18,11 @@ def get_default_log_settings():
'recursive': False,
'depth': 5,
}
+list_log_settings = [
+ 'propertiesToInstrument',
+ 'nonExistingPropertiesToInstrument',
+ 'excludedProperties'
+]
def python_to_js_string(py_in):
@@ -43,11 +48,49 @@ def validate(python_list_to_validate):
)
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
+ # Check properties to instrument and excluded properties don't collide
+ for request in python_list_to_validate:
+ propertiesToInstrument = set(request['logSettings']['propertiesToInstrument'])
+ excludedProperties = set(request['logSettings']['excludedProperties'])
+ assert len(propertiesToInstrument.intersection(excludedProperties)) == 0
return True
-def dedupe(python_list):
- return python_list
+def merge_object_requests(python_list):
+ """
+ Try to merge requests for the same object. Note that
+ this isn't that smart and you could still
+ end up instrumenting a property twice if you're
+ not careful.
+ """
+ merged_map = {}
+ for request in python_list:
+ obj = request['object']
+ if obj not in merged_map:
+ merged_map[obj] = request
+ else:
+ existing_request = merged_map[obj]
+ new_request = request
+ if new_request['instrumentedName'] != existing_request['instrumentedName']:
+ raise RuntimeError(f'Mismatching instrumentedNames found for object {obj}')
+ existing_logSettings = existing_request['logSettings']
+ new_logSettings = new_request['logSettings']
+ for k, v in existing_logSettings.items():
+ # Special case for lists
+ if k in list_log_settings:
+ v.extend(new_logSettings[k])
+ else:
+ if v != new_logSettings[k]:
+ print(v)
+ print(new_logSettings[k])
+ raise RuntimeError(f'Mismatching logSettings for object {obj}')
+
+ merged_list = list(merged_map.values())
+ # Make sure list logSettings are unique
+ for request in merged_list:
+ for logSetting in list_log_settings:
+ request['logSettings'][logSetting] = list(set(request['logSettings'][logSetting]))
+ return merged_list
def get_instrumented_name(object):
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 1ccfa26a3..f446410bb 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -132,7 +132,47 @@ def test_validated_bad__missing_instrumentedName(default_log_settings):
assert jsi.validate(bad_input)
-def test_deduplication_multiple_duped_properties(default_log_settings):
+def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties_to_exclude(default_log_settings):
+ log_settings_1 = default_log_settings.copy()
+ log_settings_2 = default_log_settings.copy()
+ log_settings_1['propertiesToInstrument'] = ['name', 'place']
+ log_settings_2['excludedProperties'] = ['name']
+ dupe_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_1
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_2
+ },
+ ]
+ merged = jsi.merge_object_requests(dupe_input)
+ with pytest.raises(AssertionError) as error:
+ jsi.validate(dupe_input)
+
+
+def test_merge_diff_instrumented_names(default_log_settings):
+ dupe_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window1',
+ 'logSettings': default_log_settings
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window2',
+ 'logSettings': default_log_settings
+ },
+ ]
+ with pytest.raises(RuntimeError) as error:
+ jsi.merge_object_requests(dupe_input)
+ assert 'Mismatching instrumentedNames' in str(error.value)
+
+
+def test_merge_multiple_duped_properties(default_log_settings):
dupe_input = [
{
'object': 'window',
@@ -152,11 +192,29 @@ def test_deduplication_multiple_duped_properties(default_log_settings):
'logSettings': default_log_settings
},
]
- assert jsi.dedupe(dupe_input) == expected_de_dupe_output
+ assert jsi.merge_object_requests(dupe_input) == expected_de_dupe_output
-def test_deduplication_multiple_duped_properties_different_log_settings():
- assert False
+def test_merge_multiple_duped_properties_different_log_settings(default_log_settings):
+ log_settings_1 = default_log_settings.copy()
+ log_settings_2 = default_log_settings.copy()
+ log_settings_1['depth'] = 3
+ log_settings_2['depth'] = 4
+ dupe_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_1
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_2
+ },
+ ]
+ with pytest.raises(RuntimeError) as error:
+ jsi.merge_object_requests(dupe_input)
+ assert 'Mismatching logSettings for object' in str(error.value)
def test_api_shortcut_fingerprinting():
From 3a149e90f5f5e45b1723aa337419edd8b55a55d4 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 03:54:09 -0500
Subject: [PATCH 046/106] flake
---
automation/JSInstrumentation.py | 88 ++++++++++++++++++---------------
test/test_js_instrument_py.py | 21 ++++----
2 files changed, 60 insertions(+), 49 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 541b80c9f..3ee00b4c3 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,6 +1,6 @@
-import collections
import json
import os
+
import jsonschema
curdir = os.path.dirname(os.path.realpath(__file__))
@@ -18,9 +18,11 @@ def get_default_log_settings():
'recursive': False,
'depth': 5,
}
+
+
list_log_settings = [
- 'propertiesToInstrument',
- 'nonExistingPropertiesToInstrument',
+ 'propertiesToInstrument',
+ 'nonExistingPropertiesToInstrument',
'excludedProperties'
]
@@ -50,47 +52,53 @@ def validate(python_list_to_validate):
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
for request in python_list_to_validate:
- propertiesToInstrument = set(request['logSettings']['propertiesToInstrument'])
+ propertiesToInstrument = set(
+ request['logSettings']['propertiesToInstrument'])
excludedProperties = set(request['logSettings']['excludedProperties'])
- assert len(propertiesToInstrument.intersection(excludedProperties)) == 0
+ assert len(propertiesToInstrument.intersection(
+ excludedProperties)) == 0
return True
def merge_object_requests(python_list):
- """
- Try to merge requests for the same object. Note that
- this isn't that smart and you could still
- end up instrumenting a property twice if you're
- not careful.
- """
- merged_map = {}
- for request in python_list:
- obj = request['object']
- if obj not in merged_map:
- merged_map[obj] = request
- else:
- existing_request = merged_map[obj]
- new_request = request
- if new_request['instrumentedName'] != existing_request['instrumentedName']:
- raise RuntimeError(f'Mismatching instrumentedNames found for object {obj}')
- existing_logSettings = existing_request['logSettings']
- new_logSettings = new_request['logSettings']
- for k, v in existing_logSettings.items():
- # Special case for lists
- if k in list_log_settings:
- v.extend(new_logSettings[k])
- else:
- if v != new_logSettings[k]:
- print(v)
- print(new_logSettings[k])
- raise RuntimeError(f'Mismatching logSettings for object {obj}')
-
- merged_list = list(merged_map.values())
- # Make sure list logSettings are unique
- for request in merged_list:
- for logSetting in list_log_settings:
- request['logSettings'][logSetting] = list(set(request['logSettings'][logSetting]))
- return merged_list
+ """
+ Try to merge requests for the same object. Note that
+ this isn't that smart and you could still
+ end up instrumenting a property twice if you're
+ not careful.
+ """
+ merged_map = {}
+ for request in python_list:
+ obj = request['object']
+ if obj not in merged_map:
+ merged_map[obj] = request
+ else:
+ existing_request = merged_map[obj]
+ new_request = request
+ if (new_request['instrumentedName']
+ != existing_request['instrumentedName']):
+ raise RuntimeError(
+ f'Mismatching instrumentedNames found for object {obj}')
+ existing_logSettings = existing_request['logSettings']
+ new_logSettings = new_request['logSettings']
+ for k, v in existing_logSettings.items():
+ # Special case for lists
+ if k in list_log_settings:
+ v.extend(new_logSettings[k])
+ else:
+ if v != new_logSettings[k]:
+ print(v)
+ print(new_logSettings[k])
+ raise RuntimeError(
+ f'Mismatching logSettings for object {obj}')
+
+ merged_list = list(merged_map.values())
+ # Make sure list logSettings are unique
+ for request in merged_list:
+ for logSetting in list_log_settings:
+ request['logSettings'][logSetting] = list(
+ set(request['logSettings'][logSetting]))
+ return merged_list
def get_instrumented_name(object):
@@ -136,6 +144,6 @@ def convert_browser_params_to_js_string(js_instrument_modules):
requests = [
build_object_from_request(request) for request in js_instrument_modules
]
- requests = dedupe(requests)
+ requests = merge_object_requests(requests)
validate(requests)
return python_to_js_string(requests)
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index f446410bb..45094b92b 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -132,7 +132,7 @@ def test_validated_bad__missing_instrumentedName(default_log_settings):
assert jsi.validate(bad_input)
-def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties_to_exclude(default_log_settings):
+def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties_to_exclude(default_log_settings): # noqa
log_settings_1 = default_log_settings.copy()
log_settings_2 = default_log_settings.copy()
log_settings_1['propertiesToInstrument'] = ['name', 'place']
@@ -150,8 +150,8 @@ def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties
},
]
merged = jsi.merge_object_requests(dupe_input)
- with pytest.raises(AssertionError) as error:
- jsi.validate(dupe_input)
+ with pytest.raises(AssertionError):
+ jsi.validate(merged)
def test_merge_diff_instrumented_names(default_log_settings):
@@ -195,7 +195,7 @@ def test_merge_multiple_duped_properties(default_log_settings):
assert jsi.merge_object_requests(dupe_input) == expected_de_dupe_output
-def test_merge_multiple_duped_properties_different_log_settings(default_log_settings):
+def test_merge_multiple_duped_properties_different_log_settings(default_log_settings): # noqa
log_settings_1 = default_log_settings.copy()
log_settings_2 = default_log_settings.copy()
log_settings_1['depth'] = 3
@@ -217,12 +217,11 @@ def test_merge_multiple_duped_properties_different_log_settings(default_log_sett
assert 'Mismatching logSettings for object' in str(error.value)
-def test_api_shortcut_fingerprinting():
- assert False
-
+def test_api_whole_module(default_log_settings):
+ shortcut_input = ["XMLHttpRequest"]
+ expected_output = [{
-def test_api_whole_module():
- assert False
+ }]
def test_api_whole_module_invalid():
@@ -243,3 +242,7 @@ def test_api_properties_on_window_instance():
def test_assert_passing_partial_log_settings():
assert False
+
+
+def test_api_shortcut_fingerprinting():
+ assert False
From 9ff8757c6fe29036dd6d1b09060f6b9296791fc4 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 04:03:18 -0500
Subject: [PATCH 047/106] Rename mdn file
---
.../scripts/make_mdn_browser_compat_file.js | 4 +-
.../mdn-browser-compat-data.py | 927 ------------------
.../mdn_browser_compat_data.py | 927 ++++++++++++++++++
3 files changed, 929 insertions(+), 929 deletions(-)
delete mode 100644 automation/js_instrumentation/mdn-browser-compat-data.py
create mode 100644 automation/js_instrumentation/mdn_browser_compat_data.py
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
index 4fdac922c..b3b5d7c17 100755
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -19,11 +19,11 @@ api = [
${api.join(',\n ')}
]`
fs.writeFile(
- '../../js_instrumentation/mdn-browser-compat-data.py',
+ '../../js_instrumentation/mdn_browser_compat_data.py',
output,
(err) => {
if(err) {
return console.log(err);
}
- console.log("../../js_instrumentation/mdn-browser-compat-data.py regenerated.");
+ console.log("../../js_instrumentation/mdn_browser_compat_data.py regenerated.");
});
\ No newline at end of file
diff --git a/automation/js_instrumentation/mdn-browser-compat-data.py b/automation/js_instrumentation/mdn-browser-compat-data.py
deleted file mode 100644
index c22de27dd..000000000
--- a/automation/js_instrumentation/mdn-browser-compat-data.py
+++ /dev/null
@@ -1,927 +0,0 @@
-
-# This file is generated from mdn-browser-compat-data by running
-# "npm run make-compat" in the Extension/webext-instrumentation
-# directory.
-api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortPaymentEvent",
- "AbortSignal",
- "AbsoluteOrientationSensor",
- "AbstractRange",
- "AbstractWorker",
- "Accelerometer",
- "AmbientLightSensor",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioParamMap",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "AudioTrack",
- "AudioTrackList",
- "AudioWorklet",
- "AudioWorkletGlobalScope",
- "AudioWorkletNode",
- "AudioWorkletProcessor",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BatteryManager",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "Body",
- "BroadcastChannel",
- "BudgetService",
- "BudgetState",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSS",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSPseudoElement",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanMakePaymentEvent",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialUserData",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceLightEvent",
- "DeviceMotionEvent",
- "DeviceMotionEventAcceleration",
- "DeviceMotionEventRotationRate",
- "DeviceOrientationEvent",
- "DeviceProximityEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentTimeline",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FederatedCredential",
- "FetchEvent",
- "File",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationCoordinates",
- "GeolocationPosition",
- "GeolocationPositionError",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "Gyroscope",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBDatabaseException",
- "IDBEnvironment",
- "IDBFactory",
- "IDBIndex",
- "IDBKeyRange",
- "IDBLocaleAwareKeyRange",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "IdleDeadline",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageCapture",
- "ImageData",
- "InputDeviceCapabilities",
- "InputDeviceInfo",
- "InputEvent",
- "InstallEvent",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LinearAccelerationSensor",
- "LinkStyle",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "Lock",
- "LockManager",
- "LongRange",
- "MIDIAccess",
- "MIDIConnectionEvent",
- "MIDIInput",
- "MIDIInputMap",
- "MIDIMessageEvent",
- "MIDIOutput",
- "MIDIOutputMap",
- "MIDIPort",
- "MSGestureEvent",
- "Magnetometer",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeySystemConfiguration",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaSettingsRange",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NamedNodeMap",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NavigatorStorage",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "Notification",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_fbo_render_mipmap",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OrientationSensor",
- "OscillatorNode",
- "OverconstrainedError",
- "OverconstrainedErrorEvent",
- "PageTransitionEvent",
- "PaintRenderingContext2D",
- "PaintSize",
- "PaintWorkletGlobalScope",
- "PannerNode",
- "ParentNode",
- "PasswordCredential",
- "Path2D",
- "PayerErrors",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformancePaintTiming",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "PhotoCapabilities",
- "PictureInPicture",
- "Plugin",
- "PluginArray",
- "Point",
- "PointerEvent",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PromiseRejectionEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushRegistrationManager",
- "PushSubscription",
- "PushSubscriptionChangeEvent",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCConfiguration",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCErrorEvent",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityAssertion",
- "RTCIdentityErrorEvent",
- "RTCIdentityEvent",
- "RTCIdentityProviderGlobalScope",
- "RTCIdentityProviderRegistrar",
- "RTCOfferAnswerOptions",
- "RTCOfferOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceErrorEvent",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpStreamStats",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsEvent",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStream",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "ReadableStreamDefaultController",
- "ReadableStreamDefaultReader",
- "RelativeOrientationSensor",
- "Request",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "Response",
- "SVGAElement",
- "SVGAltGlyphDefElement",
- "SVGAltGlyphElement",
- "SVGAltGlyphItemElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPoints",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGColorProfileElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGFilterPrimitiveStandardAttributes",
- "SVGFontElement",
- "SVGFontFaceElement",
- "SVGFontFaceFormatElement",
- "SVGFontFaceNameElement",
- "SVGFontFaceSrcElement",
- "SVGFontFaceUriElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGlyphElement",
- "SVGGlyphRefElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGHKernElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGMissingGlyphElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGRenderingIntent",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGSolidcolorElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStylable",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTRefElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGTransformable",
- "SVGURIReference",
- "SVGUnitTypes",
- "SVGUnknownElement",
- "SVGUseElement",
- "SVGVKernElement",
- "SVGViewElement",
- "SVGZoomAndPan",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "SecurityPolicyViolationEvent",
- "Selection",
- "Sensor",
- "SensorErrorEvent",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "ShadowRoot",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "Slotable",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StorageManager",
- "StorageQuota",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "SubtleCrypto",
- "SyncEvent",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoder",
- "TextDecoderStream",
- "TextEncoder",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackList",
- "TimeRanges",
- "Touch",
- "TouchEvent",
- "TouchList",
- "TrackDefault",
- "TrackDefaultList",
- "TrackEvent",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "URLUtilsReadOnly",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "UserProximityEvent",
- "VRDisplay",
- "VRDisplayCapabilities",
- "VRDisplayEvent",
- "VREyeParameters",
- "VRFieldOfView",
- "VRFrameData",
- "VRLayerInit",
- "VRPose",
- "VRStageParameters",
- "VTTCue",
- "ValidityState",
- "VideoPlaybackQuality",
- "VideoTrack",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_atc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_pvrtc",
- "WEBGL_compressed_texture_s3tc",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_renderer_info",
- "WEBGL_debug_shaders",
- "WEBGL_depth_texture",
- "WEBGL_draw_buffers",
- "WEBGL_lose_context",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2ComputeRenderingContext",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLObject",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
diff --git a/automation/js_instrumentation/mdn_browser_compat_data.py b/automation/js_instrumentation/mdn_browser_compat_data.py
new file mode 100644
index 000000000..923fabaea
--- /dev/null
+++ b/automation/js_instrumentation/mdn_browser_compat_data.py
@@ -0,0 +1,927 @@
+
+# This file is generated from mdn-browser-compat-data by running
+# "npm run make-compat" in the Extension/webext-instrumentation
+# directory.
+api = [
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortPaymentEvent",
+ "AbortSignal",
+ "AbsoluteOrientationSensor",
+ "AbstractRange",
+ "AbstractWorker",
+ "Accelerometer",
+ "AmbientLightSensor",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioParamMap",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "AudioTrack",
+ "AudioTrackList",
+ "AudioWorklet",
+ "AudioWorkletGlobalScope",
+ "AudioWorkletNode",
+ "AudioWorkletProcessor",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BatteryManager",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "Body",
+ "BroadcastChannel",
+ "BudgetService",
+ "BudgetState",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSS",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSPseudoElement",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanMakePaymentEvent",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialUserData",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceLightEvent",
+ "DeviceMotionEvent",
+ "DeviceMotionEventAcceleration",
+ "DeviceMotionEventRotationRate",
+ "DeviceOrientationEvent",
+ "DeviceProximityEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentTimeline",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FederatedCredential",
+ "FetchEvent",
+ "File",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationCoordinates",
+ "GeolocationPosition",
+ "GeolocationPositionError",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "Gyroscope",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBDatabaseException",
+ "IDBEnvironment",
+ "IDBFactory",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBLocaleAwareKeyRange",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageCapture",
+ "ImageData",
+ "InputDeviceCapabilities",
+ "InputDeviceInfo",
+ "InputEvent",
+ "InstallEvent",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LinearAccelerationSensor",
+ "LinkStyle",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "Lock",
+ "LockManager",
+ "LongRange",
+ "MIDIAccess",
+ "MIDIConnectionEvent",
+ "MIDIInput",
+ "MIDIInputMap",
+ "MIDIMessageEvent",
+ "MIDIOutput",
+ "MIDIOutputMap",
+ "MIDIPort",
+ "MSGestureEvent",
+ "Magnetometer",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeySystemConfiguration",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaSettingsRange",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NamedNodeMap",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NavigatorStorage",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "Notification",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_fbo_render_mipmap",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OrientationSensor",
+ "OscillatorNode",
+ "OverconstrainedError",
+ "OverconstrainedErrorEvent",
+ "PageTransitionEvent",
+ "PaintRenderingContext2D",
+ "PaintSize",
+ "PaintWorkletGlobalScope",
+ "PannerNode",
+ "ParentNode",
+ "PasswordCredential",
+ "Path2D",
+ "PayerErrors",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformancePaintTiming",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "PhotoCapabilities",
+ "PictureInPicture",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PointerEvent",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PromiseRejectionEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushRegistrationManager",
+ "PushSubscription",
+ "PushSubscriptionChangeEvent",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCConfiguration",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCErrorEvent",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityAssertion",
+ "RTCIdentityErrorEvent",
+ "RTCIdentityEvent",
+ "RTCIdentityProviderGlobalScope",
+ "RTCIdentityProviderRegistrar",
+ "RTCOfferAnswerOptions",
+ "RTCOfferOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceErrorEvent",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpStreamStats",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsEvent",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStream",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "ReadableStreamDefaultController",
+ "ReadableStreamDefaultReader",
+ "RelativeOrientationSensor",
+ "Request",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "Response",
+ "SVGAElement",
+ "SVGAltGlyphDefElement",
+ "SVGAltGlyphElement",
+ "SVGAltGlyphItemElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPoints",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGColorProfileElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGFilterPrimitiveStandardAttributes",
+ "SVGFontElement",
+ "SVGFontFaceElement",
+ "SVGFontFaceFormatElement",
+ "SVGFontFaceNameElement",
+ "SVGFontFaceSrcElement",
+ "SVGFontFaceUriElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGlyphElement",
+ "SVGGlyphRefElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGHKernElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGMissingGlyphElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGRenderingIntent",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGSolidcolorElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStylable",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTRefElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGTransformable",
+ "SVGURIReference",
+ "SVGUnitTypes",
+ "SVGUnknownElement",
+ "SVGUseElement",
+ "SVGVKernElement",
+ "SVGViewElement",
+ "SVGZoomAndPan",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "Sensor",
+ "SensorErrorEvent",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "ShadowRoot",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "Slotable",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StorageManager",
+ "StorageQuota",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "SubtleCrypto",
+ "SyncEvent",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoder",
+ "TextDecoderStream",
+ "TextEncoder",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackList",
+ "TimeRanges",
+ "Touch",
+ "TouchEvent",
+ "TouchList",
+ "TrackDefault",
+ "TrackDefaultList",
+ "TrackEvent",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "URLUtilsReadOnly",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "UserProximityEvent",
+ "VRDisplay",
+ "VRDisplayCapabilities",
+ "VRDisplayEvent",
+ "VREyeParameters",
+ "VRFieldOfView",
+ "VRFrameData",
+ "VRLayerInit",
+ "VRPose",
+ "VRStageParameters",
+ "VTTCue",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VideoTrack",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_atc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_pvrtc",
+ "WEBGL_compressed_texture_s3tc",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_renderer_info",
+ "WEBGL_debug_shaders",
+ "WEBGL_depth_texture",
+ "WEBGL_draw_buffers",
+ "WEBGL_lose_context",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2ComputeRenderingContext",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLObject",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
+]
\ No newline at end of file
From 93e73357d09931f94e8bb4506467695772fb58cb Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 04:53:31 -0500
Subject: [PATCH 048/106] Add latest tests - just implement fingerprinting.json
---
automation/JSInstrumentation.py | 74 +++++++++++++++++++++-------
test/test_js_instrument_py.py | 86 +++++++++++++++++++++++++++------
2 files changed, 129 insertions(+), 31 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 3ee00b4c3..93b0cdac6 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,9 +1,22 @@
import json
import os
-
import jsonschema
+from .js_instrumentation.mdn_browser_compat_data import api as mdn
+
curdir = os.path.dirname(os.path.realpath(__file__))
+schema_path = os.path.join(
+ curdir, 'js_instrumentation', 'js_instrument_modules.schema'
+)
+
+list_log_settings = [
+ 'propertiesToInstrument',
+ 'nonExistingPropertiesToInstrument',
+ 'excludedProperties'
+]
+shortcut_specs = {
+ 'fingerprinting': os.path.join(curdir, 'js_instrumentation', 'fingerprinting.json')
+}
def get_default_log_settings():
@@ -20,13 +33,6 @@ def get_default_log_settings():
}
-list_log_settings = [
- 'propertiesToInstrument',
- 'nonExistingPropertiesToInstrument',
- 'excludedProperties'
-]
-
-
def python_to_js_string(py_in):
"""Takes python in and converts it to a string
of the equivalent JS object.
@@ -45,9 +51,6 @@ def python_to_js_string(py_in):
def validate(python_list_to_validate):
- schema_path = os.path.join(
- curdir, 'js_instrumentation', 'js_instrument_modules.schema'
- )
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
@@ -101,8 +104,17 @@ def merge_object_requests(python_list):
return merged_list
-def get_instrumented_name(object):
- pass
+def _handle_obj_string(obj_string):
+ if obj_string in mdn:
+ obj = f'window.{obj_string}.prototype'
+ instrumentedName = obj_string
+ elif obj_string.startswith('window'):
+ obj = obj_string
+ instrumentedName = obj_string
+ else:
+ raise RuntimeError(
+ 'Requested API not listed in MDN Browser Compat Data')
+ return obj, instrumentedName
def build_object_from_request(request):
@@ -121,7 +133,30 @@ def build_object_from_request(request):
propertiesToInstrument property of a new LogSettings object.
We must also create the instrumentedName value.
"""
- return {}
+ obj = None
+ instrumentedName = None
+ logSettings = get_default_log_settings()
+ if isinstance(request, str):
+ obj, instrumentedName = _handle_obj_string(request)
+ elif isinstance(request, dict):
+ assert len(request.keys()) == 1
+ req = list(request.keys())[0]
+ props = request[req]
+ obj, instrumentedName = _handle_obj_string(req)
+ if isinstance(props, list):
+ logSettings['propertiesToInstrument'] = props
+ elif isinstance(props, dict):
+ for k, v in props.items():
+ logSettings[k] = v
+ else:
+ raise RuntimeError('Invalid settings for object')
+ else:
+ raise RuntimeError('Invalid input')
+ return {
+ 'object': obj,
+ 'instrumentedName': instrumentedName,
+ 'logSettings': logSettings
+ }
def convert_browser_params_to_js_string(js_instrument_modules):
@@ -141,9 +176,14 @@ def convert_browser_params_to_js_string(js_instrument_modules):
{"window": ["name", "localStorage", "sessionStorage"]}
"""
assert isinstance(js_instrument_modules, list)
- requests = [
- build_object_from_request(request) for request in js_instrument_modules
- ]
+ requests = []
+ for request in js_instrument_modules:
+ if request in shortcut_specs:
+ shortcut_spec = json.loads(open(shortcut_specs[request]).read())
+ for sub_request in shortcut_spec:
+ requests.append(build_object_from_request(sub_request))
+ else:
+ requests.append(build_object_from_request(request))
requests = merge_object_requests(requests)
validate(requests)
return python_to_js_string(requests)
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 45094b92b..a89abf2e4 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -218,31 +218,89 @@ def test_merge_multiple_duped_properties_different_log_settings(default_log_sett
def test_api_whole_module(default_log_settings):
- shortcut_input = ["XMLHttpRequest"]
- expected_output = [{
-
- }]
+ shortcut_input = "XMLHttpRequest"
+ expected_output = {
+ 'object': 'window.XMLHttpRequest.prototype',
+ 'instrumentedName': 'XMLHttpRequest',
+ 'logSettings': default_log_settings,
+ }
+ actual_output = jsi.build_object_from_request(shortcut_input)
+ assert actual_output == expected_output
def test_api_whole_module_invalid():
- assert False
+ shortcut_input = "xxxxxxx"
+ with pytest.raises(RuntimeError) as error:
+ jsi.build_object_from_request(shortcut_input)
-def test_api_module_specific_properties():
- assert False
+def test_api_two_keys_in_shortcut():
+ shortcut_input = {'k1': [], 'k2': []}
+ with pytest.raises(AssertionError) as error:
+ jsi.build_object_from_request(shortcut_input)
-def test_api_instances_on_window():
- assert False
+def test_api_instances_on_window(default_log_settings):
+ shortcut_input = "window.navigator"
+ expected_output = {
+ 'object': 'window.navigator',
+ 'instrumentedName': 'window.navigator',
+ 'logSettings': default_log_settings,
+ }
+ actual_output = jsi.build_object_from_request(shortcut_input)
+ assert actual_output == expected_output
+
+
+def test_api_instances_on_window_with_properties(default_log_settings):
+ log_settings = default_log_settings.copy()
+ log_settings['propertiesToInstrument'] = ['name', 'localStorage']
+ shortcut_input = {"window": ["name", "localStorage"]}
+ expected_output = {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings,
+ }
+ actual_output = jsi.build_object_from_request(shortcut_input)
+ assert actual_output == expected_output
-def test_api_properties_on_window_instance():
- assert False
+def test_api_module_specific_properties(default_log_settings):
+ log_settings = default_log_settings.copy()
+ log_settings['propertiesToInstrument'] = ['send']
+ shortcut_input = {"XMLHttpRequest": ['send']}
+ expected_output = {
+ 'object': 'window.XMLHttpRequest.prototype',
+ 'instrumentedName': 'XMLHttpRequest',
+ 'logSettings': log_settings,
+ }
+ actual_output = jsi.build_object_from_request(shortcut_input)
+ assert actual_output == expected_output
-def test_assert_passing_partial_log_settings():
- assert False
+def test_api_passing_partial_log_settings(default_log_settings):
+ log_settings = default_log_settings.copy()
+ log_settings['excludedProperties'] = ['send']
+ log_settings['recursive'] = True
+ log_settings['depth'] = 2
+ shortcut_input = {"XMLHttpRequest": {
+ 'excludedProperties': ['send'],
+ 'recursive': True,
+ 'depth': 2
+ }
+ }
+ expected_output = {
+ 'object': 'window.XMLHttpRequest.prototype',
+ 'instrumentedName': 'XMLHttpRequest',
+ 'logSettings': log_settings,
+ }
+ actual_output = jsi.build_object_from_request(shortcut_input)
+ assert actual_output == expected_output
def test_api_shortcut_fingerprinting():
- assert False
+ # This is a very crude test, there are other tests to
+ # check fingeprinting instrumentation in more detail
+ shortcut_input = ['fingerprinting']
+ output = jsi.convert_browser_params_to_js_string(shortcut_input)
+ assert 'window.document' in output
+ assert '["name", "localStorage", "sessionStorage"]' in output
From 5f234a3f47793bb48660d363dc2b50500c98e641 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 04:54:43 -0500
Subject: [PATCH 049/106] flake8
---
automation/JSInstrumentation.py | 6 +-
.../mdn_browser_compat_data.py | 1844 ++++++++---------
test/test_js_instrument_py.py | 4 +-
3 files changed, 928 insertions(+), 926 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 93b0cdac6..9bb1b4446 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -1,8 +1,9 @@
import json
import os
+
import jsonschema
-from .js_instrumentation.mdn_browser_compat_data import api as mdn
+from .js_instrumentation.mdn_browser_compat_data import api as mdn
curdir = os.path.dirname(os.path.realpath(__file__))
schema_path = os.path.join(
@@ -15,7 +16,8 @@
'excludedProperties'
]
shortcut_specs = {
- 'fingerprinting': os.path.join(curdir, 'js_instrumentation', 'fingerprinting.json')
+ 'fingerprinting':
+ os.path.join(curdir, 'js_instrumentation', 'fingerprinting.json')
}
diff --git a/automation/js_instrumentation/mdn_browser_compat_data.py b/automation/js_instrumentation/mdn_browser_compat_data.py
index 923fabaea..c22de27dd 100644
--- a/automation/js_instrumentation/mdn_browser_compat_data.py
+++ b/automation/js_instrumentation/mdn_browser_compat_data.py
@@ -3,925 +3,925 @@
# "npm run make-compat" in the Extension/webext-instrumentation
# directory.
api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortPaymentEvent",
- "AbortSignal",
- "AbsoluteOrientationSensor",
- "AbstractRange",
- "AbstractWorker",
- "Accelerometer",
- "AmbientLightSensor",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioParamMap",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "AudioTrack",
- "AudioTrackList",
- "AudioWorklet",
- "AudioWorkletGlobalScope",
- "AudioWorkletNode",
- "AudioWorkletProcessor",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BatteryManager",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "Body",
- "BroadcastChannel",
- "BudgetService",
- "BudgetState",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSS",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSPseudoElement",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanMakePaymentEvent",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialUserData",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceLightEvent",
- "DeviceMotionEvent",
- "DeviceMotionEventAcceleration",
- "DeviceMotionEventRotationRate",
- "DeviceOrientationEvent",
- "DeviceProximityEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentTimeline",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FederatedCredential",
- "FetchEvent",
- "File",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationCoordinates",
- "GeolocationPosition",
- "GeolocationPositionError",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "Gyroscope",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBDatabaseException",
- "IDBEnvironment",
- "IDBFactory",
- "IDBIndex",
- "IDBKeyRange",
- "IDBLocaleAwareKeyRange",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "IdleDeadline",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageCapture",
- "ImageData",
- "InputDeviceCapabilities",
- "InputDeviceInfo",
- "InputEvent",
- "InstallEvent",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LinearAccelerationSensor",
- "LinkStyle",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "Lock",
- "LockManager",
- "LongRange",
- "MIDIAccess",
- "MIDIConnectionEvent",
- "MIDIInput",
- "MIDIInputMap",
- "MIDIMessageEvent",
- "MIDIOutput",
- "MIDIOutputMap",
- "MIDIPort",
- "MSGestureEvent",
- "Magnetometer",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeySystemConfiguration",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaSettingsRange",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NamedNodeMap",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NavigatorStorage",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "Notification",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_fbo_render_mipmap",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OrientationSensor",
- "OscillatorNode",
- "OverconstrainedError",
- "OverconstrainedErrorEvent",
- "PageTransitionEvent",
- "PaintRenderingContext2D",
- "PaintSize",
- "PaintWorkletGlobalScope",
- "PannerNode",
- "ParentNode",
- "PasswordCredential",
- "Path2D",
- "PayerErrors",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformancePaintTiming",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "PhotoCapabilities",
- "PictureInPicture",
- "Plugin",
- "PluginArray",
- "Point",
- "PointerEvent",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PromiseRejectionEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushRegistrationManager",
- "PushSubscription",
- "PushSubscriptionChangeEvent",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCConfiguration",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCErrorEvent",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityAssertion",
- "RTCIdentityErrorEvent",
- "RTCIdentityEvent",
- "RTCIdentityProviderGlobalScope",
- "RTCIdentityProviderRegistrar",
- "RTCOfferAnswerOptions",
- "RTCOfferOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceErrorEvent",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpStreamStats",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsEvent",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStream",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "ReadableStreamDefaultController",
- "ReadableStreamDefaultReader",
- "RelativeOrientationSensor",
- "Request",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "Response",
- "SVGAElement",
- "SVGAltGlyphDefElement",
- "SVGAltGlyphElement",
- "SVGAltGlyphItemElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPoints",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGColorProfileElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGFilterPrimitiveStandardAttributes",
- "SVGFontElement",
- "SVGFontFaceElement",
- "SVGFontFaceFormatElement",
- "SVGFontFaceNameElement",
- "SVGFontFaceSrcElement",
- "SVGFontFaceUriElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGlyphElement",
- "SVGGlyphRefElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGHKernElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGMissingGlyphElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGRenderingIntent",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGSolidcolorElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStylable",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTRefElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGTransformable",
- "SVGURIReference",
- "SVGUnitTypes",
- "SVGUnknownElement",
- "SVGUseElement",
- "SVGVKernElement",
- "SVGViewElement",
- "SVGZoomAndPan",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "SecurityPolicyViolationEvent",
- "Selection",
- "Sensor",
- "SensorErrorEvent",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "ShadowRoot",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "Slotable",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StorageManager",
- "StorageQuota",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "SubtleCrypto",
- "SyncEvent",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoder",
- "TextDecoderStream",
- "TextEncoder",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackList",
- "TimeRanges",
- "Touch",
- "TouchEvent",
- "TouchList",
- "TrackDefault",
- "TrackDefaultList",
- "TrackEvent",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "URLUtilsReadOnly",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "UserProximityEvent",
- "VRDisplay",
- "VRDisplayCapabilities",
- "VRDisplayEvent",
- "VREyeParameters",
- "VRFieldOfView",
- "VRFrameData",
- "VRLayerInit",
- "VRPose",
- "VRStageParameters",
- "VTTCue",
- "ValidityState",
- "VideoPlaybackQuality",
- "VideoTrack",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_atc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_pvrtc",
- "WEBGL_compressed_texture_s3tc",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_renderer_info",
- "WEBGL_debug_shaders",
- "WEBGL_depth_texture",
- "WEBGL_draw_buffers",
- "WEBGL_lose_context",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2ComputeRenderingContext",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLObject",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
\ No newline at end of file
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortPaymentEvent",
+ "AbortSignal",
+ "AbsoluteOrientationSensor",
+ "AbstractRange",
+ "AbstractWorker",
+ "Accelerometer",
+ "AmbientLightSensor",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioParamMap",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "AudioTrack",
+ "AudioTrackList",
+ "AudioWorklet",
+ "AudioWorkletGlobalScope",
+ "AudioWorkletNode",
+ "AudioWorkletProcessor",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BatteryManager",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "Body",
+ "BroadcastChannel",
+ "BudgetService",
+ "BudgetState",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSS",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSPseudoElement",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanMakePaymentEvent",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialUserData",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceLightEvent",
+ "DeviceMotionEvent",
+ "DeviceMotionEventAcceleration",
+ "DeviceMotionEventRotationRate",
+ "DeviceOrientationEvent",
+ "DeviceProximityEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentTimeline",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FederatedCredential",
+ "FetchEvent",
+ "File",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationCoordinates",
+ "GeolocationPosition",
+ "GeolocationPositionError",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "Gyroscope",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBDatabaseException",
+ "IDBEnvironment",
+ "IDBFactory",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBLocaleAwareKeyRange",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageCapture",
+ "ImageData",
+ "InputDeviceCapabilities",
+ "InputDeviceInfo",
+ "InputEvent",
+ "InstallEvent",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LinearAccelerationSensor",
+ "LinkStyle",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "Lock",
+ "LockManager",
+ "LongRange",
+ "MIDIAccess",
+ "MIDIConnectionEvent",
+ "MIDIInput",
+ "MIDIInputMap",
+ "MIDIMessageEvent",
+ "MIDIOutput",
+ "MIDIOutputMap",
+ "MIDIPort",
+ "MSGestureEvent",
+ "Magnetometer",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeySystemConfiguration",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaSettingsRange",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NamedNodeMap",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NavigatorStorage",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "Notification",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_fbo_render_mipmap",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OrientationSensor",
+ "OscillatorNode",
+ "OverconstrainedError",
+ "OverconstrainedErrorEvent",
+ "PageTransitionEvent",
+ "PaintRenderingContext2D",
+ "PaintSize",
+ "PaintWorkletGlobalScope",
+ "PannerNode",
+ "ParentNode",
+ "PasswordCredential",
+ "Path2D",
+ "PayerErrors",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformancePaintTiming",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "PhotoCapabilities",
+ "PictureInPicture",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PointerEvent",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PromiseRejectionEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushRegistrationManager",
+ "PushSubscription",
+ "PushSubscriptionChangeEvent",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCConfiguration",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCErrorEvent",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityAssertion",
+ "RTCIdentityErrorEvent",
+ "RTCIdentityEvent",
+ "RTCIdentityProviderGlobalScope",
+ "RTCIdentityProviderRegistrar",
+ "RTCOfferAnswerOptions",
+ "RTCOfferOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceErrorEvent",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpStreamStats",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsEvent",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStream",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "ReadableStreamDefaultController",
+ "ReadableStreamDefaultReader",
+ "RelativeOrientationSensor",
+ "Request",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "Response",
+ "SVGAElement",
+ "SVGAltGlyphDefElement",
+ "SVGAltGlyphElement",
+ "SVGAltGlyphItemElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPoints",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGColorProfileElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGFilterPrimitiveStandardAttributes",
+ "SVGFontElement",
+ "SVGFontFaceElement",
+ "SVGFontFaceFormatElement",
+ "SVGFontFaceNameElement",
+ "SVGFontFaceSrcElement",
+ "SVGFontFaceUriElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGlyphElement",
+ "SVGGlyphRefElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGHKernElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGMissingGlyphElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGRenderingIntent",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGSolidcolorElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStylable",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTRefElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGTransformable",
+ "SVGURIReference",
+ "SVGUnitTypes",
+ "SVGUnknownElement",
+ "SVGUseElement",
+ "SVGVKernElement",
+ "SVGViewElement",
+ "SVGZoomAndPan",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "Sensor",
+ "SensorErrorEvent",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "ShadowRoot",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "Slotable",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StorageManager",
+ "StorageQuota",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "SubtleCrypto",
+ "SyncEvent",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoder",
+ "TextDecoderStream",
+ "TextEncoder",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackList",
+ "TimeRanges",
+ "Touch",
+ "TouchEvent",
+ "TouchList",
+ "TrackDefault",
+ "TrackDefaultList",
+ "TrackEvent",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "URLUtilsReadOnly",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "UserProximityEvent",
+ "VRDisplay",
+ "VRDisplayCapabilities",
+ "VRDisplayEvent",
+ "VREyeParameters",
+ "VRFieldOfView",
+ "VRFrameData",
+ "VRLayerInit",
+ "VRPose",
+ "VRStageParameters",
+ "VTTCue",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VideoTrack",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_atc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_pvrtc",
+ "WEBGL_compressed_texture_s3tc",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_renderer_info",
+ "WEBGL_debug_shaders",
+ "WEBGL_depth_texture",
+ "WEBGL_draw_buffers",
+ "WEBGL_lose_context",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2ComputeRenderingContext",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLObject",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
+]
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index a89abf2e4..f64cb91a9 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -230,13 +230,13 @@ def test_api_whole_module(default_log_settings):
def test_api_whole_module_invalid():
shortcut_input = "xxxxxxx"
- with pytest.raises(RuntimeError) as error:
+ with pytest.raises(RuntimeError):
jsi.build_object_from_request(shortcut_input)
def test_api_two_keys_in_shortcut():
shortcut_input = {'k1': [], 'k2': []}
- with pytest.raises(AssertionError) as error:
+ with pytest.raises(AssertionError):
jsi.build_object_from_request(shortcut_input)
From 055f6ea3c434672f6a1d2f834005031d60c12a99 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 13:44:34 -0500
Subject: [PATCH 050/106] Add fingerprinting.json (incomplete)
Mimetypes and plugins
---
.../js_instrumentation/fingerprinting.json | 60 +++++++++
.../instrument-fingerprinting-apis.ts | 124 ------------------
2 files changed, 60 insertions(+), 124 deletions(-)
create mode 100644 automation/js_instrumentation/fingerprinting.json
delete mode 100644 automation/js_instrumentation/instrument-fingerprinting-apis.ts
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/fingerprinting.json
new file mode 100644
index 000000000..7497d628e
--- /dev/null
+++ b/automation/js_instrumentation/fingerprinting.json
@@ -0,0 +1,60 @@
+[
+ "ScriptProcessorNode",
+ "GainNode",
+ "AnalyserNode",
+ "OscillatorNode",
+ "OfflineAudioContext",
+ "AudioContext",
+ "RTCPeerConnection",
+ "HTMLCanvasElement",
+ "Storage",
+ {"CanvasRenderingContext2D": {
+ "excludedProperties": [
+ "quadraticCurveTo",
+ "lineTo",
+ "transform",
+ "globalAlpha",
+ "moveTo",
+ "drawImage",
+ "setTransform",
+ "clearRect",
+ "closePath",
+ "beginPath",
+ "canvas",
+ "translate"
+ ]
+ }},
+ {"window": {
+ "propertiesToInclude": ["name", "localStorage", "sessionStorage"]
+ }},
+ {"window.document": {
+ "propertiesToInclude": ["cookie", "referrer"],
+ "logCallStack": true
+ }},
+ {"window.screen": {
+ "propertiesToInclude": ["pixelDepth", "colorDepth"]
+ }},
+ {"window.navigator": {
+ "propertiesToInclude": [
+ "appCodeName",
+ "appName",
+ "appVersion",
+ "buildID",
+ "cookieEnabled",
+ "doNotTrack",
+ "geolocation",
+ "language",
+ "languages",
+ "onLine",
+ "oscpu",
+ "platform",
+ "product",
+ "productSub",
+ "userAgent",
+ "vendorSub",
+ "vendor"
+ ]
+ }},
+ {"window.navigator.mimeTypes": {"recursive": true}},
+ {"window.navigator.plugins": {"recursive": true}}
+]
\ No newline at end of file
diff --git a/automation/js_instrumentation/instrument-fingerprinting-apis.ts b/automation/js_instrumentation/instrument-fingerprinting-apis.ts
deleted file mode 100644
index f9073b0f6..000000000
--- a/automation/js_instrumentation/instrument-fingerprinting-apis.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-export function instrumentFingerprintingApis({
- instrumentObjectProperty,
- instrumentObject,
-}) {
- // Access to navigator properties
- const navigatorProperties = [
- "appCodeName",
- "appName",
- "appVersion",
- "buildID",
- "cookieEnabled",
- "doNotTrack",
- "geolocation",
- "language",
- "languages",
- "onLine",
- "oscpu",
- "platform",
- "product",
- "productSub",
- "userAgent",
- "vendorSub",
- "vendor",
- ];
- navigatorProperties.forEach(function(property) {
- instrumentObjectProperty(window.navigator, "window.navigator", property);
- });
-
- // Access to screen properties
- // instrumentObject(window.screen, "window.screen");
- // TODO: why do we instrument only two screen properties
- const screenProperties = ["pixelDepth", "colorDepth"];
- screenProperties.forEach(function(property) {
- instrumentObjectProperty(window.screen, "window.screen", property);
- });
-
- // Access to plugins
- const pluginProperties = [
- "name",
- "filename",
- "description",
- "version",
- "length",
- ];
- for (let i = 0; i < window.navigator.plugins.length; i++) {
- const pluginName = window.navigator.plugins[i].name;
- pluginProperties.forEach(function(property) {
- instrumentObjectProperty(
- window.navigator.plugins[pluginName],
- "window.navigator.plugins[" + pluginName + "]",
- property,
- );
- });
- }
-
- // Access to MIMETypes
- const mimeTypeProperties = ["description", "suffixes", "type"];
- for (let i = 0; i < window.navigator.mimeTypes.length; i++) {
- const mimeTypeName = ((window.navigator.mimeTypes[
- i
- ] as unknown) as MimeType).type; // note: upstream typings seems to be incorrect
- mimeTypeProperties.forEach(function(property) {
- instrumentObjectProperty(
- window.navigator.mimeTypes[mimeTypeName],
- "window.navigator.mimeTypes[" + mimeTypeName + "]",
- property,
- );
- });
- }
- // Name, localStorage, and sessionsStorage logging
- // Instrumenting window.localStorage directly doesn't seem to work, so the Storage
- // prototype must be instrumented instead. Unfortunately this fails to differentiate
- // between sessionStorage and localStorage. Instead, you'll have to look for a sequence
- // of a get for the localStorage object followed by a getItem/setItem for the Storage object.
- const windowProperties = ["name", "localStorage", "sessionStorage"];
- windowProperties.forEach(function(property) {
- instrumentObjectProperty(window, "window", property);
- });
- instrumentObject(window.Storage.prototype, "window.Storage");
-
- // Access to document.cookie
- instrumentObjectProperty(window.document, "window.document", "cookie", {
- logCallStack: true,
- });
-
- // Access to document.referrer
- instrumentObjectProperty(window.document, "window.document", "referrer", {
- logCallStack: true,
- });
-
- // Access to canvas
- instrumentObject(window.HTMLCanvasElement.prototype, "HTMLCanvasElement");
-
- const excludedProperties = [
- "quadraticCurveTo",
- "lineTo",
- "transform",
- "globalAlpha",
- "moveTo",
- "drawImage",
- "setTransform",
- "clearRect",
- "closePath",
- "beginPath",
- "canvas",
- "translate",
- ];
- instrumentObject(
- window.CanvasRenderingContext2D.prototype,
- "CanvasRenderingContext2D",
- { excludedProperties },
- );
-
- // Access to webRTC
- instrumentObject(window.RTCPeerConnection.prototype, "RTCPeerConnection");
-
- // Access to Audio API
- instrumentObject(window.AudioContext.prototype, "AudioContext");
- instrumentObject(window.OfflineAudioContext.prototype, "OfflineAudioContext");
- instrumentObject(window.OscillatorNode.prototype, "OscillatorNode");
- instrumentObject(window.AnalyserNode.prototype, "AnalyserNode");
- instrumentObject(window.GainNode.prototype, "GainNode");
- instrumentObject(window.ScriptProcessorNode.prototype, "ScriptProcessorNode");
-}
From 10e56c6599622e5ea3207d78e7f24c0672da7a72 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 13:57:17 -0500
Subject: [PATCH 051/106] Correct logSettings property name
---
automation/js_instrumentation/fingerprinting.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/fingerprinting.json
index 7497d628e..5fbcc4407 100644
--- a/automation/js_instrumentation/fingerprinting.json
+++ b/automation/js_instrumentation/fingerprinting.json
@@ -25,17 +25,17 @@
]
}},
{"window": {
- "propertiesToInclude": ["name", "localStorage", "sessionStorage"]
+ "propertiesToInstrument": ["name", "localStorage", "sessionStorage"]
}},
{"window.document": {
- "propertiesToInclude": ["cookie", "referrer"],
+ "propertiesToInstrument": ["cookie", "referrer"],
"logCallStack": true
}},
{"window.screen": {
- "propertiesToInclude": ["pixelDepth", "colorDepth"]
+ "propertiesToInstrument": ["pixelDepth", "colorDepth"]
}},
{"window.navigator": {
- "propertiesToInclude": [
+ "propertiesToInstrument": [
"appCodeName",
"appName",
"appVersion",
From f13e2f9f219f34c3fd1a6e3ce7410f4d37a50cef Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 14:04:39 -0500
Subject: [PATCH 052/106] Restore create_xpi as function
Needed by manual_test
---
test/conftest.py | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/test/conftest.py b/test/conftest.py
index 841658da8..36b89cea8 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -14,6 +14,11 @@
'Extension',
'firefox')
+def create_xpi():
+ # Creates a new xpi using npm run build.
+ print("Building new xpi")
+ subprocess.check_call(["npm", "run", "build"], cwd=EXTENSION_DIR)
+
@pytest.fixture(scope="session", autouse=True)
def prepare_test_setup(request):
@@ -22,9 +27,7 @@ def prepare_test_setup(request):
if 'pyonly' in request.config.invocation_params.args:
return
- # Creates a new xpi using npm run build.
- print("Building new xpi")
- subprocess.check_call(["npm", "run", "build"], cwd=EXTENSION_DIR)
+ create_xpi()
print("Starting local_http_server")
server, server_thread = utilities.start_server()
From c840fbc5d86350aa4d2f59e645036299a5a8195e Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 15:03:39 -0500
Subject: [PATCH 053/106] Make explicit option for logging to console
---
automation/Extension/firefox/feature.js/index.js | 4 +++-
automation/Extension/firefox/feature.js/loggingdb.js | 6 +++---
automation/default_browser_params.json | 3 +++
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index 2edf15891..b04bd8ad5 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -43,6 +43,7 @@ async function main() {
callstack_instrument:true,
save_content:false,
testing:true,
+ log_to_console:true,
crawl_id:0
};
console.log("WARNING: config not found. Assuming this is a test run of",
@@ -51,7 +52,8 @@ async function main() {
await loggingDB.open(config['aggregator_address'],
config['logger_address'],
- config['crawl_id']);
+ config['crawl_id'],
+ config['log_to_console']);
if (config["navigation_instrument"]) {
loggingDB.logDebug("Navigation instrumentation enabled");
diff --git a/automation/Extension/firefox/feature.js/loggingdb.js b/automation/Extension/firefox/feature.js/loggingdb.js
index 8dee825f3..713be6621 100644
--- a/automation/Extension/firefox/feature.js/loggingdb.js
+++ b/automation/Extension/firefox/feature.js/loggingdb.js
@@ -43,9 +43,9 @@ let listeningSocketCallback = async (data) => {
}
}
-export let open = async function(aggregatorAddress, logAddress, curr_crawlID) {
- if (aggregatorAddress == null && logAddress == null && curr_crawlID == '') {
- console.log("Debugging, everything will output to console");
+export let open = async function(aggregatorAddress, logAddress, curr_crawlID, logToConsole=false) {
+ if (logToConsole === true) {
+ console.log("Logger in debug mode, everything will output to console");
debugging = true;
return;
}
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index d1d74dc87..34715c8b3 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -8,6 +8,9 @@
"save_content": false,
"callstack_instrument": false,
+ "testing": false,
+ "log_to_console": false,
+
"random_attributes": false,
"bot_mitigation": false,
"profile_tar": null,
From b848c441045c557b5a13cf207c51b4231f761dc1 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 15:04:32 -0500
Subject: [PATCH 054/106] Process browser_params in task manager
---
automation/TaskManager.py | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/automation/TaskManager.py b/automation/TaskManager.py
index f74962088..406773716 100644
--- a/automation/TaskManager.py
+++ b/automation/TaskManager.py
@@ -19,6 +19,7 @@
from .DataAggregator.BaseAggregator import (ACTION_TYPE_FINALIZE,
RECORD_TYPE_SPECIAL)
from .Errors import CommandExecutionError
+from .JSInstrumentation import convert_browser_params_to_js_string
from .MPLogger import MPLogger
from .SocketInterface import clientsocket
from .utilities.platform_utils import get_configuration_string, get_version
@@ -108,12 +109,18 @@ def __init__(self, manager_params: Dict[str, Any],
if not os.path.exists(manager_params['source_dump_path']):
os.makedirs(manager_params['source_dump_path'])
- # check size of parameter dictionary
+ # Check size of parameter dictionary
self.num_browsers = manager_params['num_browsers']
if len(browser_params) != self.num_browsers:
raise Exception("Number of dicts is not the same "
"as manager_params['num_browsers']")
+ # Parse and flesh out js_instrument_modules
+ for a_browsers_params in self.browser_params:
+ js_request = a_browser_params['js_instrument_modules']
+ js_request_as_string = convert_browser_params_to_js_string(js_request)
+ a_browsers_params['js_instrument_modules'] = js_request_as_string
+
# Flow control
self.closing = False
self.failure_status: Optional[Dict[str, Any]] = None
@@ -144,11 +151,11 @@ def __init__(self, manager_params: Dict[str, Any],
# Initialize the data aggregators
self._launch_aggregators()
- # sets up the BrowserManager(s) + associated queues
+ # Sets up the BrowserManager(s) + associated queues
self.browsers = self._initialize_browsers(browser_params)
self._launch_browsers()
- # start the manager watchdog
+ # Start the manager watchdog
thread = threading.Thread(target=self._manager_watchdog, args=())
thread.daemon = True
thread.name = "OpenWPM-watchdog"
From 974b52154e1f95193d2297904db6adb53792fe18 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 15:59:26 -0500
Subject: [PATCH 055/106] Start being able to pass browser_params to selenium
Also update manual_test to use click
---
automation/TaskManager.py | 5 +-
environment.yaml | 1 +
scripts/environment-unpinned.yaml | 1 +
test/conftest.py | 1 +
test/debug_params.json | 4 ++
test/manual_test.py | 105 ++++++++++++++++++++++++------
6 files changed, 96 insertions(+), 21 deletions(-)
create mode 100644 test/debug_params.json
diff --git a/automation/TaskManager.py b/automation/TaskManager.py
index 406773716..71ea487f0 100644
--- a/automation/TaskManager.py
+++ b/automation/TaskManager.py
@@ -117,8 +117,9 @@ def __init__(self, manager_params: Dict[str, Any],
# Parse and flesh out js_instrument_modules
for a_browsers_params in self.browser_params:
- js_request = a_browser_params['js_instrument_modules']
- js_request_as_string = convert_browser_params_to_js_string(js_request)
+ js_request = a_browsers_params['js_instrument_modules']
+ js_request_as_string = convert_browser_params_to_js_string(
+ js_request)
a_browsers_params['js_instrument_modules'] = js_request_as_string
# Flow control
diff --git a/environment.yaml b/environment.yaml
index 09a7268a3..14a2eb214 100644
--- a/environment.yaml
+++ b/environment.yaml
@@ -4,6 +4,7 @@ channels:
dependencies:
- autopep8=1.5.2
- beautifulsoup4=4.9.1
+- click=7.1.2
- dill=0.3.1.1
- flake8-isort=3.0.0
- flake8=3.8.1
diff --git a/scripts/environment-unpinned.yaml b/scripts/environment-unpinned.yaml
index 799cb4b9e..9da4d3423 100644
--- a/scripts/environment-unpinned.yaml
+++ b/scripts/environment-unpinned.yaml
@@ -4,6 +4,7 @@ channels:
- main
dependencies:
- beautifulsoup4
+ - click
- dill
# - firefox-unbranded - when it's available
- geckodriver
diff --git a/test/conftest.py b/test/conftest.py
index 36b89cea8..40c8ab8f9 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -14,6 +14,7 @@
'Extension',
'firefox')
+
def create_xpi():
# Creates a new xpi using npm run build.
print("Building new xpi")
diff --git a/test/debug_params.json b/test/debug_params.json
new file mode 100644
index 000000000..245a69afc
--- /dev/null
+++ b/test/debug_params.json
@@ -0,0 +1,4 @@
+{
+ "testing": true,
+ "log_to_console": true
+}
diff --git a/test/manual_test.py b/test/manual_test.py
index 4ef7b77e4..e3c9a353e 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -1,12 +1,16 @@
-
import atexit
+import json
import subprocess
from os.path import dirname, join, realpath
+import click
+import IPython
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
+from automation import JSInstrumentation as jsi
from automation.DeployBrowsers import configure_firefox
+from automation.TaskManager import load_default_params
from automation.utilities.platform_utils import get_firefox_binary_path
from .conftest import create_xpi
@@ -68,7 +72,10 @@ def colorize(line):
return line
-def start_webdriver(with_extension=False):
+def start_webdriver(
+ with_extension=True,
+ load_browser_params=True,
+ browser_params_file=None):
""" Open a webdriver instance and a server for the test pages
This is meant to be imported and run manually from a python or
@@ -79,6 +86,11 @@ def start_webdriver(with_extension=False):
----------
with_extension : boolean
Set to True to also load OpenWPM extension instrumentation
+ load_browser_params : boolean
+ Set to True to load browser_params
+ browser_params_file : string
+ Specify the browser_params.json to load.
+ If None, default_params will be loaded.
Returns
-------
@@ -105,13 +117,37 @@ def cleanup_server():
return driver
fp = webdriver.FirefoxProfile()
+ fo = webdriver.FirefoxOptions()
+ fo.add_argument('-jsconsole')
if with_extension:
# TODO: Restore preference for log level in a way that works in Fx 57+
# fp.set_preference("extensions.@openwpm.sdk.console.logLevel", "all")
configure_firefox.optimize_prefs(fp)
driver = webdriver.Firefox(
- firefox_binary=fb, firefox_profile=fp,
+ firefox_binary=fb,
+ firefox_profile=fp,
+ options=fo
)
+ if load_browser_params is True:
+ # There's probably more we could do here
+ # to set more preferences and better emulate
+ # what happens in TaskManager. But this lets
+ # us pass some basic things.
+
+ browser_params = load_default_params()[1][0]
+ if browser_params_file is not None:
+ browser_params.update(
+ json.loads(open(browser_params_file).read())
+ )
+ js_request = browser_params['js_instrument_modules']
+ js_request_as_string = jsi.convert_browser_params_to_js_string(
+ js_request)
+ browser_params['js_instrument_modules'] = js_request_as_string
+
+ profile_dir = driver.capabilities['moz:profile']
+ with open(join(profile_dir, 'browser_params.json'), 'w') as f:
+ f.write(json.dumps(browser_params))
+
if with_extension:
# add openwpm extension to profile
create_xpi()
@@ -123,8 +159,11 @@ def cleanup_server():
def start_webext():
firefox_binary_path = get_firefox_binary_path()
- cmd_webext_run = "npm start -- --start-url '%s' --firefox '%s'" \
- % (BASE_TEST_URL, firefox_binary_path)
+ cmd_webext_run = f"""
+ npm start -- \
+ --start-url '{BASE_TEST_URL}' \
+ --firefox '{firefox_binary_path}'
+ """
server, thread = start_server()
try:
# http://stackoverflow.com/a/4417735/3104416
@@ -137,18 +176,47 @@ def start_webext():
thread.join()
-def main():
- import IPython
- import sys
-
- # TODO use some real parameter handling library
- if len(sys.argv) == 1:
- start_webext()
- elif len(sys.argv) >= 2 and sys.argv[1] == '--selenium':
- if len(sys.argv) == 3 and sys.argv[2] == '--no-extension':
- driver = start_webdriver(False)
- else:
- driver = start_webdriver(True) # noqa
+flag_opts = dict(
+ is_flag=True,
+ default=False,
+)
+
+
+@click.command()
+@click.option(
+ '--selenium',
+ help="""
+ Run a selenium webdriver instance, and drop into an IPython shell""",
+ **flag_opts
+)
+@click.option(
+ '--no-extension',
+ help="""
+ Use this to prevent the openwpm webextension being loaded.
+ Only applies if --selenium is being used.""",
+ **flag_opts
+)
+@click.option(
+ '--browser-params',
+ help="""Set flag to load browser_params.""",
+ **flag_opts
+)
+@click.option(
+ '--browser-params-file',
+ help="""
+ Specify a browser_params.json file. If none provided and
+ --browser-params is enabled. Default browser_params.json
+ will be used. Pass an absolute path or a path relative
+ to the test directory.""",
+)
+def main(selenium, no_extension, browser_params, browser_params_file):
+
+ if selenium:
+ driver = start_webdriver( # noqa
+ with_extension=not no_extension,
+ load_browser_params=browser_params,
+ browser_params_file=browser_params_file
+ )
print("\nDropping into ipython shell....\n"
" * Interact with the webdriver instance using `driver`\n"
" * The webdriver and server will close automatically\n"
@@ -156,8 +224,7 @@ def main():
logger = Logger() # noqa
IPython.embed()
else:
- print("Unrecognized arguments. Usage:\n"
- "python manual_test.py ('--selenium')? ('--no-extension')?")
+ start_webext()
if __name__ == '__main__':
From f0904ac4b6e28f539daa0ea2e04e79631a916782 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 16:35:51 -0500
Subject: [PATCH 056/106] Revert "Make explicit option for logging to console"
This reverts commit c840fbc5d86350aa4d2f59e645036299a5a8195e.
---
automation/Extension/firefox/feature.js/index.js | 4 +---
automation/Extension/firefox/feature.js/loggingdb.js | 6 +++---
automation/default_browser_params.json | 3 ---
3 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index b04bd8ad5..2edf15891 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -43,7 +43,6 @@ async function main() {
callstack_instrument:true,
save_content:false,
testing:true,
- log_to_console:true,
crawl_id:0
};
console.log("WARNING: config not found. Assuming this is a test run of",
@@ -52,8 +51,7 @@ async function main() {
await loggingDB.open(config['aggregator_address'],
config['logger_address'],
- config['crawl_id'],
- config['log_to_console']);
+ config['crawl_id']);
if (config["navigation_instrument"]) {
loggingDB.logDebug("Navigation instrumentation enabled");
diff --git a/automation/Extension/firefox/feature.js/loggingdb.js b/automation/Extension/firefox/feature.js/loggingdb.js
index 713be6621..8dee825f3 100644
--- a/automation/Extension/firefox/feature.js/loggingdb.js
+++ b/automation/Extension/firefox/feature.js/loggingdb.js
@@ -43,9 +43,9 @@ let listeningSocketCallback = async (data) => {
}
}
-export let open = async function(aggregatorAddress, logAddress, curr_crawlID, logToConsole=false) {
- if (logToConsole === true) {
- console.log("Logger in debug mode, everything will output to console");
+export let open = async function(aggregatorAddress, logAddress, curr_crawlID) {
+ if (aggregatorAddress == null && logAddress == null && curr_crawlID == '') {
+ console.log("Debugging, everything will output to console");
debugging = true;
return;
}
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index 34715c8b3..d1d74dc87 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -8,9 +8,6 @@
"save_content": false,
"callstack_instrument": false,
- "testing": false,
- "log_to_console": false,
-
"random_attributes": false,
"bot_mitigation": false,
"profile_tar": null,
From abf9b1cc6c279e67674bbf18a925a29271a6252f Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 16:43:40 -0500
Subject: [PATCH 057/106] Get manual_test working with browser_params
From toplevel directory run:
`python -m test.manual_test --selenium --browser-params --browser-params-file=debug_params.json`
---
automation/js_instrumentation/fingerprinting.json | 4 +---
test/debug_params.json | 3 ++-
test/manual_test.py | 8 +-------
3 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/fingerprinting.json
index 5fbcc4407..0af12e021 100644
--- a/automation/js_instrumentation/fingerprinting.json
+++ b/automation/js_instrumentation/fingerprinting.json
@@ -54,7 +54,5 @@
"vendorSub",
"vendor"
]
- }},
- {"window.navigator.mimeTypes": {"recursive": true}},
- {"window.navigator.plugins": {"recursive": true}}
+ }}
]
\ No newline at end of file
diff --git a/test/debug_params.json b/test/debug_params.json
index 245a69afc..7383318f5 100644
--- a/test/debug_params.json
+++ b/test/debug_params.json
@@ -1,4 +1,5 @@
{
+ "crawl_id": 0,
"testing": true,
- "log_to_console": true
+ "js_instrument": true
}
diff --git a/test/manual_test.py b/test/manual_test.py
index e3c9a353e..2a31a57da 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -117,17 +117,11 @@ def cleanup_server():
return driver
fp = webdriver.FirefoxProfile()
- fo = webdriver.FirefoxOptions()
- fo.add_argument('-jsconsole')
if with_extension:
# TODO: Restore preference for log level in a way that works in Fx 57+
# fp.set_preference("extensions.@openwpm.sdk.console.logLevel", "all")
configure_firefox.optimize_prefs(fp)
- driver = webdriver.Firefox(
- firefox_binary=fb,
- firefox_profile=fp,
- options=fo
- )
+ driver = webdriver.Firefox(firefox_binary=fb, firefox_profile=fp)
if load_browser_params is True:
# There's probably more we could do here
# to set more preferences and better emulate
From 2c250a7c6c3a67b282f227696dce7e60360df167 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 17:16:19 -0500
Subject: [PATCH 058/106] More robust test for simple fingerprinting output
Can't guarantee order of string output
---
test/test_js_instrument_py.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index f64cb91a9..9e0dc121f 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -303,4 +303,4 @@ def test_api_shortcut_fingerprinting():
shortcut_input = ['fingerprinting']
output = jsi.convert_browser_params_to_js_string(shortcut_input)
assert 'window.document' in output
- assert '["name", "localStorage", "sessionStorage"]' in output
+ assert 'window.AudioContext.prototype' in output
From 4c5ebe54458f42ef26251ba97d276fc934dfb5ce Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 17:42:06 -0500
Subject: [PATCH 059/106] Add timing information when testing
---
.../src/content/javascript-instrument-page-scope.ts | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index c9e641636..63e0f459d 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -15,10 +15,16 @@ export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
const event_id = document.currentScript.getAttribute("data-event-id");
const testing = document.currentScript.getAttribute("data-testing");
const instrumentJS = $getInstrumentJS(event_id, sendMessagesToLogger);
- instrumentJS($instrumentionRequests);
-
+ let t0: number;
if (testing === "true") {
console.log("OpenWPM: Currently testing");
+ t0 = performance.now();
+ console.log("Begin loading JS instrumentation.");
+ }
+ instrumentJS($instrumentionRequests);
+ if (testing === "true") {
+ const t1 = performance.now();
+ console.log(`Call to instrumentJS took ${t1 - t0} milliseconds.`);
(window as any).instrumentJS = instrumentJS;
console.log(
"OpenWPM: Content-side javascript instrumentation started with spec:",
From aeb168bb1dfb4414a00ac35f15e05d3d841b77c9 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 17:42:21 -0500
Subject: [PATCH 060/106] Make recheck really fast.
You'll never hit this recheck as it all happens before page load.
---
test/test_pages/canvas_recursion.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/test_pages/canvas_recursion.html b/test/test_pages/canvas_recursion.html
index e64e99131..a6360e990 100644
--- a/test/test_pages/canvas_recursion.html
+++ b/test/test_pages/canvas_recursion.html
@@ -19,7 +19,7 @@ Canvas Fingerprinting Test Page
resolve();
} else {
console.log('RECHECK');
- setTimeout(check, 10);
+ setTimeout(check, 1);
}
}
check();
From 49dea9100948839fd3c311b020bb8b6d293840c9 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 17:43:02 -0500
Subject: [PATCH 061/106] Handle all inputs properly
---
automation/JSInstrumentation.py | 2 +-
test/test_js_instrument_py.py | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 9bb1b4446..199ba9c4a 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -180,7 +180,7 @@ def convert_browser_params_to_js_string(js_instrument_modules):
assert isinstance(js_instrument_modules, list)
requests = []
for request in js_instrument_modules:
- if request in shortcut_specs:
+ if isinstance(request, str) and (request in shortcut_specs):
shortcut_spec = json.loads(open(shortcut_specs[request]).read())
for sub_request in shortcut_spec:
requests.append(build_object_from_request(sub_request))
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 9e0dc121f..11ad84053 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -304,3 +304,14 @@ def test_api_shortcut_fingerprinting():
output = jsi.convert_browser_params_to_js_string(shortcut_input)
assert 'window.document' in output
assert 'window.AudioContext.prototype' in output
+
+
+def test_complete_pass():
+ shortcut_input = [
+ {
+ 'window': {'recursive': True}
+ }
+ ]
+ output = jsi.convert_browser_params_to_js_string(shortcut_input)
+ assert '"recursive": true' in output
+ assert '"instrumentedName": "window"' in output
From 295e2ecb8e0f30c9f28745bc9994d15ebef372c8 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 17:43:33 -0500
Subject: [PATCH 062/106] Debug with all window params instrumented
---
test/debug_params.json | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/test/debug_params.json b/test/debug_params.json
index 7383318f5..05a3ba85e 100644
--- a/test/debug_params.json
+++ b/test/debug_params.json
@@ -1,5 +1,10 @@
{
"crawl_id": 0,
"testing": true,
- "js_instrument": true
+ "js_instrument": true,
+ "js_instrument_modules": [
+ {
+ "window": {"recursive": true}
+ }
+ ]
}
From 0f4874a3ebd8a944e9f594ebcdd70e19d212b904 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 18:17:01 -0500
Subject: [PATCH 063/106] Load xpi we just built
---
test/manual_test.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/manual_test.py b/test/manual_test.py
index 2a31a57da..bd0a73713 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -145,7 +145,7 @@ def cleanup_server():
if with_extension:
# add openwpm extension to profile
create_xpi()
- ext_xpi = join(EXT_PATH, 'openwpm.xpi')
+ ext_xpi = join(EXT_PATH, 'dist', 'openwpm-1.0.zip')
driver.install_addon(ext_xpi, temporary=True)
return register_cleanup(driver)
From c1b1f5d622bc1601475e26e9f0eee5aebd017cdb Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 19:29:37 -0500
Subject: [PATCH 064/106] Check for ff version support
---
.../scripts/make_mdn_browser_compat_file.js | 9 +-
.../mdn_browser_compat_data.py | 1665 ++++++++---------
2 files changed, 750 insertions(+), 924 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
index b3b5d7c17..8b4844f70 100755
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -6,8 +6,13 @@ const VERSION = 75
const api = [];
Object.keys(bcd.api).forEach(item => {
- if (item !== '__compat') {
- api.push(`"${item}"`);
+ try {
+ let version_added = bcd.api[item].__compat.support.firefox.version_added;
+ if ( ( version_added !== null ) && ( version_added <= VERSION ) ) {
+ api.push(`"${item}"`);
+ }
+ } catch(error) {
+ console.log(error);
}
});
diff --git a/automation/js_instrumentation/mdn_browser_compat_data.py b/automation/js_instrumentation/mdn_browser_compat_data.py
index c22de27dd..2a356be0d 100644
--- a/automation/js_instrumentation/mdn_browser_compat_data.py
+++ b/automation/js_instrumentation/mdn_browser_compat_data.py
@@ -3,925 +3,746 @@
# "npm run make-compat" in the Extension/webext-instrumentation
# directory.
api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortPaymentEvent",
- "AbortSignal",
- "AbsoluteOrientationSensor",
- "AbstractRange",
- "AbstractWorker",
- "Accelerometer",
- "AmbientLightSensor",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioParamMap",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "AudioTrack",
- "AudioTrackList",
- "AudioWorklet",
- "AudioWorkletGlobalScope",
- "AudioWorkletNode",
- "AudioWorkletProcessor",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BatteryManager",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "Body",
- "BroadcastChannel",
- "BudgetService",
- "BudgetState",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSS",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSPseudoElement",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanMakePaymentEvent",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialUserData",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceLightEvent",
- "DeviceMotionEvent",
- "DeviceMotionEventAcceleration",
- "DeviceMotionEventRotationRate",
- "DeviceOrientationEvent",
- "DeviceProximityEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentTimeline",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FederatedCredential",
- "FetchEvent",
- "File",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationCoordinates",
- "GeolocationPosition",
- "GeolocationPositionError",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "Gyroscope",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBDatabaseException",
- "IDBEnvironment",
- "IDBFactory",
- "IDBIndex",
- "IDBKeyRange",
- "IDBLocaleAwareKeyRange",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "IdleDeadline",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageCapture",
- "ImageData",
- "InputDeviceCapabilities",
- "InputDeviceInfo",
- "InputEvent",
- "InstallEvent",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LinearAccelerationSensor",
- "LinkStyle",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "Lock",
- "LockManager",
- "LongRange",
- "MIDIAccess",
- "MIDIConnectionEvent",
- "MIDIInput",
- "MIDIInputMap",
- "MIDIMessageEvent",
- "MIDIOutput",
- "MIDIOutputMap",
- "MIDIPort",
- "MSGestureEvent",
- "Magnetometer",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeySystemConfiguration",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaSettingsRange",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NamedNodeMap",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NavigatorStorage",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "Notification",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_fbo_render_mipmap",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OrientationSensor",
- "OscillatorNode",
- "OverconstrainedError",
- "OverconstrainedErrorEvent",
- "PageTransitionEvent",
- "PaintRenderingContext2D",
- "PaintSize",
- "PaintWorkletGlobalScope",
- "PannerNode",
- "ParentNode",
- "PasswordCredential",
- "Path2D",
- "PayerErrors",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformancePaintTiming",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "PhotoCapabilities",
- "PictureInPicture",
- "Plugin",
- "PluginArray",
- "Point",
- "PointerEvent",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PromiseRejectionEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushRegistrationManager",
- "PushSubscription",
- "PushSubscriptionChangeEvent",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCConfiguration",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCErrorEvent",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityAssertion",
- "RTCIdentityErrorEvent",
- "RTCIdentityEvent",
- "RTCIdentityProviderGlobalScope",
- "RTCIdentityProviderRegistrar",
- "RTCOfferAnswerOptions",
- "RTCOfferOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceErrorEvent",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpStreamStats",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsEvent",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStream",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "ReadableStreamDefaultController",
- "ReadableStreamDefaultReader",
- "RelativeOrientationSensor",
- "Request",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "Response",
- "SVGAElement",
- "SVGAltGlyphDefElement",
- "SVGAltGlyphElement",
- "SVGAltGlyphItemElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPoints",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGColorProfileElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGFilterPrimitiveStandardAttributes",
- "SVGFontElement",
- "SVGFontFaceElement",
- "SVGFontFaceFormatElement",
- "SVGFontFaceNameElement",
- "SVGFontFaceSrcElement",
- "SVGFontFaceUriElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGlyphElement",
- "SVGGlyphRefElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGHKernElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGMissingGlyphElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGRenderingIntent",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGSolidcolorElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStylable",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTRefElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGTransformable",
- "SVGURIReference",
- "SVGUnitTypes",
- "SVGUnknownElement",
- "SVGUseElement",
- "SVGVKernElement",
- "SVGViewElement",
- "SVGZoomAndPan",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "SecurityPolicyViolationEvent",
- "Selection",
- "Sensor",
- "SensorErrorEvent",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "ShadowRoot",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "Slotable",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StorageManager",
- "StorageQuota",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "SubtleCrypto",
- "SyncEvent",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoder",
- "TextDecoderStream",
- "TextEncoder",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackList",
- "TimeRanges",
- "Touch",
- "TouchEvent",
- "TouchList",
- "TrackDefault",
- "TrackDefaultList",
- "TrackEvent",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "URLUtilsReadOnly",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "UserProximityEvent",
- "VRDisplay",
- "VRDisplayCapabilities",
- "VRDisplayEvent",
- "VREyeParameters",
- "VRFieldOfView",
- "VRFrameData",
- "VRLayerInit",
- "VRPose",
- "VRStageParameters",
- "VTTCue",
- "ValidityState",
- "VideoPlaybackQuality",
- "VideoTrack",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_atc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_pvrtc",
- "WEBGL_compressed_texture_s3tc",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_renderer_info",
- "WEBGL_debug_shaders",
- "WEBGL_depth_texture",
- "WEBGL_draw_buffers",
- "WEBGL_lose_context",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2ComputeRenderingContext",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLObject",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortSignal",
+ "AbstractRange",
+ "AbstractWorker",
+ "AnalyserNode",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioProcessingEvent",
+ "AudioTrackList",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "BroadcastChannel",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceMotionEvent",
+ "DeviceOrientationEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FetchEvent",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "History",
+ "IDBDatabaseException",
+ "IDBLocaleAwareKeyRange",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageData",
+ "InputEvent",
+ "InstallEvent",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "LongRange",
+ "MIDIAccess",
+ "MSGestureEvent",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OscillatorNode",
+ "PageTransitionEvent",
+ "PannerNode",
+ "ParentNode",
+ "Path2D",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushSubscription",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityErrorEvent",
+ "RTCOfferAnswerOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "SVGAElement",
+ "SVGAltGlyphElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGUnitTypes",
+ "SVGUseElement",
+ "SVGViewElement",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "Selection",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoderStream",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackList",
+ "TimeRanges",
+ "TrackDefault",
+ "TrackDefaultList",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "VTTCue",
+ "ValidityState",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_shaders",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
+]
\ No newline at end of file
From a1d9723e7a78a15b30812e61000c2544eb873edc Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 21:16:46 -0500
Subject: [PATCH 065/106] Save a bunch of properties
---
docs/window_getOwnPropertyNames.csv | 780 +++++++++++++++++++++++++++
docs/window_getOwnPropertyNames.json | 1 +
test/debug_params.json | 10 -
test/test_browser_params_all.json | 553 +++++++++++++++++++
test/test_browser_params_simple.json | 5 +
5 files changed, 1339 insertions(+), 10 deletions(-)
create mode 100644 docs/window_getOwnPropertyNames.csv
create mode 100644 docs/window_getOwnPropertyNames.json
delete mode 100644 test/debug_params.json
create mode 100644 test/test_browser_params_all.json
create mode 100644 test/test_browser_params_simple.json
diff --git a/docs/window_getOwnPropertyNames.csv b/docs/window_getOwnPropertyNames.csv
new file mode 100644
index 000000000..dca814c99
--- /dev/null
+++ b/docs/window_getOwnPropertyNames.csv
@@ -0,0 +1,780 @@
+​0: undefined
+1: Boolean
+2: Date
+3: Math
+4: Number
+5: String
+6: RegExp
+7: InternalError
+8: EvalError
+9: RangeError
+10: URIError
+11: ArrayBuffer
+12: Int8Array
+13: Uint8Array
+14: Int16Array
+15: Uint16Array
+16: Int32Array
+17: Uint32Array
+18: Float32Array
+19: Float64Array
+20: Uint8ClampedArray
+21: BigInt64Array
+22: BigUint64Array
+23: BigInt
+24: Proxy
+25: WeakMap
+26: Map
+27: Set
+28: DataView
+29: Symbol
+30: Intl
+31: Reflect
+32: WeakSet
+33: ReadableStream
+34: ByteLengthQueuingStrategy
+35: CountQueuingStrategy
+36: WebAssembly
+37: NaN
+38: Infinity
+39: isNaN
+40: isFinite
+41: parseFloat
+42: parseInt
+43: escape
+44: unescape
+45: decodeURI
+46: encodeURI
+47: decodeURIComponent
+48: encodeURIComponent
+49: SVGFEDiffuseLightingElement
+50: Attr
+51: PerformanceTiming
+52: DOMTokenList
+53: RTCDTMFToneChangeEvent
+54: WebGLActiveInfo
+55: SVGFEOffsetElement
+56: HTMLFrameElement
+57: FontFace
+58: ConvolverNode
+59: BeforeUnloadEvent
+60: HTMLDetailsElement
+61: TextTrackCue
+62: PerformanceObserverEntryList
+63: SubmitEvent
+64: CustomElementRegistry
+65: SVGComponentTransferFunctionElement
+66: ScrollAreaEvent
+67: KeyEvent
+68: SVGNumber
+69: DOMException
+70: SVGGraphicsElement
+71: HTMLFrameSetElement
+72: PerformanceObserver
+73: SVGAnimatedLength
+74: HTMLSlotElement
+75: RTCStatsReport
+76: SVGPreserveAspectRatio
+77: ResizeObserverEntry
+78: HTMLMeterElement
+79: SVGElement
+80: ImageData
+81: CloseEvent
+82: XMLSerializer
+83: CharacterData
+84: HTMLAudioElement
+85: DocumentType
+86: DOMStringMap
+87: WebGLUniformLocation
+88: RTCRtpSender
+89: CSS2Properties
+90: HTMLSourceElement
+91: MediaRecorder
+92: GamepadHapticActuator
+93: PaintRequest
+94: SVGPathElement
+95: MediaStreamTrackAudioSourceNode
+96: Selection
+97: SVGAElement
+98: SpeechSynthesisVoice
+99: SVGFETileElement
+100: FormDataEvent
+101: DataTransfer
+102: SourceBufferList
+103: DeviceOrientationEvent
+104: IDBOpenDBRequest
+105: StereoPannerNode
+106: ServiceWorkerRegistration
+107: OfflineAudioCompletionEvent
+108: Image
+109: RTCDTMFSender
+110: SVGSVGElement
+111: StyleSheet
+112: SVGSetElement
+113: TreeWalker
+114: PointerEvent
+115: HTMLOListElement
+116: CSSAnimation
+117: TextDecoder
+118: WebGLRenderbuffer
+119: Range
+120: FileSystemEntry
+121: WebGLSync
+122: RTCCertificate
+123: HTMLIFrameElement
+124: ScreenOrientation
+125: CaretPosition
+126: HTMLTableCaptionElement
+127: HTMLCanvasElement
+128: DynamicsCompressorNode
+129: SVGTextElement
+130: HTMLSelectElement
+131: HTMLHRElement
+132: mozRTCPeerConnection
+133: mozRTCSessionDescription
+134: XPathExpression
+135: SVGScriptElement
+136: WebGLRenderingContext
+137: SVGFEPointLightElement
+138: CSSRule
+139: MediaStreamTrackEvent
+140: SVGFilterElement
+141: SVGFEFuncGElement
+142: SVGFEDisplacementMapElement
+143: Storage
+144: WebGLFramebuffer
+145: FileSystemDirectoryEntry
+146: DataTransferItem
+147: WebGLTransformFeedback
+148: MutationEvent
+149: PerformanceNavigationTiming
+150: VisualViewport
+151: MediaKeySession
+152: XMLHttpRequestUpload
+153: BroadcastChannel
+154: HTMLMenuElement
+155: HTMLMapElement
+156: Gamepad
+157: CSSMediaRule
+158: WebGLSampler
+159: HTMLFormControlsCollection
+160: SVGSymbolElement
+161: SVGLengthList
+162: SVGFEComponentTransferElement
+163: TimeRanges
+164: SVGMatrix
+165: SVGFEConvolveMatrixElement
+166: WebGLProgram
+167: SVGAnimatedNumber
+168: DOMPointReadOnly
+169: SVGFECompositeElement
+170: Animation
+171: MouseEvent
+172: CacheStorage
+173: SVGAnimateTransformElement
+174: MediaKeyMessageEvent
+175: MessageEvent
+176: IntersectionObserverEntry
+177: SharedWorker
+178: TrackEvent
+179: SVGStyleElement
+180: MediaStreamEvent
+181: SVGFEGaussianBlurElement
+182: SVGRect
+183: SVGPathSegList
+184: DOMPoint
+185: ErrorEvent
+186: CSSStyleSheet
+187: CSS
+188: webkitURL
+189: MathMLElement
+190: AudioScheduledSourceNode
+191: Cache
+192: MediaKeys
+193: NodeIterator
+194: AudioBuffer
+195: SVGAnimatedAngle
+196: BaseAudioContext
+197: IDBVersionChangeEvent
+198: NodeList
+199: IDBIndex
+200: AudioNode
+201: TimeEvent
+202: DeviceMotionEvent
+203: AnimationEffect
+204: SVGFEDropShadowElement
+205: Path2D
+206: RTCRtpTransceiver
+207: SVGAnimateMotionElement
+208: TextTrackList
+209: HTMLTableRowElement
+210: HTMLLIElement
+211: AnimationTimeline
+212: IntersectionObserver
+213: Response
+214: HTMLFormElement
+215: AudioProcessingEvent
+216: RTCDataChannelEvent
+217: MediaQueryList
+218: IDBFileRequest
+219: IDBFileHandle
+220: CSSCounterStyleRule
+221: HTMLOptionElement
+222: CSSGroupingRule
+223: DOMStringList
+224: ImageBitmapRenderingContext
+225: GamepadEvent
+226: ImageBitmap
+227: OfflineAudioContext
+228: FileSystemDirectoryReader
+229: CSSKeyframesRule
+230: XPathResult
+231: SVGTextPositioningElement
+232: HTMLHeadingElement
+233: HTMLFieldSetElement
+234: SVGFEBlendElement
+235: InputEvent
+236: WebGL2RenderingContext
+237: DataTransferItemList
+238: ChannelSplitterNode
+239: SVGLength
+240: CSSConditionRule
+241: SVGEllipseElement
+242: WebGLShaderPrecisionFormat
+243: GamepadButton
+244: HTMLTableCellElement
+245: HTMLTextAreaElement
+246: CDATASection
+247: SVGAnimateElement
+248: HTMLTitleElement
+249: FormData
+250: HTMLPreElement
+251: HTMLOutputElement
+252: SVGGradientElement
+253: IDBRequest
+254: CSSStyleRule
+255: Permissions
+256: MediaCapabilitiesInfo
+257: CanvasCaptureMediaStream
+258: SVGAnimatedRect
+259: PannerNode
+260: SecurityPolicyViolationEvent
+261: AnimationPlaybackEvent
+262: WebGLShader
+263: HTMLTimeElement
+264: SVGDescElement
+265: HTMLMarqueeElement
+266: HTMLFontElement
+267: KeyframeEffect
+268: SVGUseElement
+269: GainNode
+270: SVGImageElement
+271: HTMLStyleElement
+272: SVGForeignObjectElement
+273: MessagePort
+274: SVGFEDistantLightElement
+275: StorageEvent
+276: PopStateEvent
+277: Text
+278: GeolocationPositionError
+279: SVGDefsElement
+280: MediaKeyStatusMap
+281: DOMRectReadOnly
+282: SVGRectElement
+283: IDBCursor
+284: AudioBufferSourceNode
+285: SVGFEColorMatrixElement
+286: CSSNamespaceRule
+287: MediaStreamAudioDestinationNode
+288: XPathEvaluator
+289: DocumentFragment
+290: WebSocket
+291: WebGLQuery
+292: HTMLUListElement
+293: Blob
+294: HTMLVideoElement
+295: VideoPlaybackQuality
+296: DelayNode
+297: AudioParam
+298: MediaStream
+299: MouseScrollEvent
+300: IDBDatabase
+301: PushSubscriptionOptions
+302: Request
+303: HTMLImageElement
+304: ClipboardEvent
+305: IDBKeyRange
+306: VTTCue
+307: MediaCapabilities
+308: NamedNodeMap
+309: MutationObserver
+310: HTMLOptGroupElement
+311: RTCTrackEvent
+312: SVGPoint
+313: BlobEvent
+314: MutationRecord
+315: HTMLQuoteElement
+316: FileReader
+317: CanvasPattern
+318: SVGStopElement
+319: RadioNodeList
+320: SVGUnitTypes
+321: MimeTypeArray
+322: Screen
+323: PopupBlockedEvent
+324: WaveShaperNode
+325: IDBFactory
+326: PromiseRejectionEvent
+327: ResizeObserver
+328: MimeType
+329: SVGAnimatedLengthList
+330: Audio
+331: SVGTransform
+332: SpeechSynthesisErrorEvent
+333: RTCPeerConnection
+334: CSSImportRule
+335: PaintRequestList
+336: SVGFESpotLightElement
+337: DOMParser
+338: BiquadFilterNode
+339: Notification
+340: Headers
+341: HTMLPictureElement
+342: SVGCircleElement
+343: SVGFETurbulenceElement
+344: AnimationEvent
+345: MediaKeyError
+346: HTMLLegendElement
+347: AnalyserNode
+348: SVGPatternElement
+349: IDBCursorWithValue
+350: DOMRequest
+351: CSSFontFaceRule
+352: History
+353: SVGSwitchElement
+354: PerformanceMark
+355: DOMQuad
+356: MediaKeySystemAccess
+357: SVGTitleElement
+358: FontFaceSet
+359: SVGTransformList
+360: SVGNumberList
+361: TextMetrics
+362: SpeechSynthesisUtterance
+363: WheelEvent
+364: HTMLCollection
+365: SVGFEMorphologyElement
+366: IDBTransaction
+367: DOMMatrixReadOnly
+368: PeriodicWave
+369: MediaRecorderErrorEvent
+370: MediaStreamAudioSourceNode
+371: SVGLineElement
+372: ProcessingInstruction
+373: VTTRegion
+374: PerformanceEntry
+375: URL
+376: GamepadPose
+377: HTMLBodyElement
+378: CanvasRenderingContext2D
+379: SVGMPathElement
+380: SVGFEFuncBElement
+381: XSLTProcessor
+382: HTMLInputElement
+383: WebGLContextEvent
+384: HTMLMenuItemElement
+385: MediaQueryListEvent
+386: PermissionStatus
+387: HTMLDataElement
+388: SVGFEImageElement
+389: SVGAnimatedBoolean
+390: Geolocation
+391: HashChangeEvent
+392: MediaSource
+393: PluginArray
+394: WebGLBuffer
+395: IIRFilterNode
+396: ScriptProcessorNode
+397: CompositionEvent
+398: CSSRuleList
+399: SVGFEFuncRElement
+400: DragEvent
+401: SVGFESpecularLightingElement
+402: SVGPolylineElement
+403: StaticRange
+404: SVGGeometryElement
+405: ResizeObserverSize
+406: AudioDestinationNode
+407: FontFaceSetLoadEvent
+408: SVGTSpanElement
+409: mozRTCIceCandidate
+410: HTMLParagraphElement
+411: CSSKeyframeRule
+412: MessageChannel
+413: SVGFEFuncAElement
+414: Plugin
+415: SVGLinearGradientElement
+416: PerformanceNavigation
+417: Comment
+418: HTMLMediaElement
+419: ShadowRoot
+420: WebKitCSSMatrix
+421: OscillatorNode
+422: ProgressEvent
+423: HTMLTrackElement
+424: HTMLDirectoryElement
+425: URLSearchParams
+426: HTMLParamElement
+427: SpeechSynthesis
+428: TextTrack
+429: MediaElementAudioSourceNode
+430: SVGClipPathElement
+431: HTMLOptionsCollection
+432: SVGAnimatedNumberList
+433: SVGRadialGradientElement
+434: SVGAnimatedEnumeration
+435: Directory
+436: SVGAnimationElement
+437: SVGMaskElement
+438: RTCDataChannel
+439: SpeechSynthesisEvent
+440: KeyboardEvent
+441: HTMLTemplateElement
+442: SVGStringList
+443: HTMLBRElement
+444: HTMLTableElement
+445: HTMLAllCollection
+446: PushSubscription
+447: ChannelMergerNode
+448: SVGFEFloodElement
+449: SVGAnimatedTransformList
+450: BarProp
+451: RTCIceCandidate
+452: TransitionEvent
+453: IDBMutableFile
+454: ValidityState
+455: SVGAnimatedString
+456: DOMRect
+457: Option
+458: File
+459: DOMMatrix
+460: HTMLAreaElement
+461: SVGFEMergeElement
+462: Navigator
+463: TextEncoder
+464: HTMLBaseElement
+465: TextTrackCueList
+466: CSSSupportsRule
+467: HTMLDListElement
+468: HTMLTableSectionElement
+469: MediaStreamTrack
+470: RTCSessionDescription
+471: HTMLObjectElement
+472: HTMLEmbedElement
+473: FileList
+474: CSSStyleDeclaration
+475: HTMLTableColElement
+476: SVGFEMergeNodeElement
+477: SVGGElement
+478: PerformanceMeasure
+479: NodeFilter
+480: ConstantSourceNode
+481: AudioListener
+482: SVGAngle
+483: PushManager
+484: CSSFontFeatureValuesRule
+485: SVGAnimatedInteger
+486: SVGMetadataElement
+487: SVGTextPathElement
+488: HTMLLabelElement
+489: RTCRtpReceiver
+490: CanvasGradient
+491: FileSystemFileEntry
+492: ServiceWorker
+493: CSSMozDocumentRule
+494: SVGPolygonElement
+495: SVGViewElement
+496: HTMLProgressElement
+497: PerformanceResourceTiming
+498: DocumentTimeline
+499: SVGTextContentElement
+500: HTMLUnknownElement
+501: DOMRectList
+502: SVGPointList
+503: SVGMarkerElement
+504: DOMImplementation
+505: CSSTransition
+506: RTCPeerConnectionIceEvent
+507: WebGLTexture
+508: Worker
+509: HTMLLinkElement
+510: MediaList
+511: MediaError
+512: SVGAnimatedPreserveAspectRatio
+513: EventSource
+514: WebGLVertexArrayObject
+515: HTMLAnchorElement
+516: AudioContext
+517: CSSPageRule
+518: IDBObjectStore
+519: MediaEncryptedEvent
+520: HTMLModElement
+521: FileSystem
+522: HTMLDataListElement
+523: SourceBuffer
+524: Function
+525: Object
+526: eval
+527: EventTarget
+528: Window
+529: close
+530: stop
+531: focus
+532: blur
+533: open
+534: alert
+535: confirm
+536: prompt
+537: print
+538: postMessage
+539: captureEvents
+540: releaseEvents
+541: getSelection
+542: getComputedStyle
+543: matchMedia
+544: moveTo
+545: moveBy
+546: resizeTo
+547: resizeBy
+548: scroll
+549: scrollTo
+550: scrollBy
+551: requestAnimationFrame
+552: cancelAnimationFrame
+553: getDefaultComputedStyle
+554: scrollByLines
+555: scrollByPages
+556: sizeToContent
+557: updateCommands
+558: find
+559: dump
+560: setResizable
+561: requestIdleCallback
+562: cancelIdleCallback
+563: btoa
+564: atob
+565: setTimeout
+566: clearTimeout
+567: setInterval
+568: clearInterval
+569: queueMicrotask
+570: createImageBitmap
+571: fetch
+572: self
+573: name
+574: history
+575: customElements
+576: locationbar
+577: menubar
+578: personalbar
+579: scrollbars
+580: statusbar
+581: toolbar
+582: status
+583: closed
+584: event
+585: frames
+586: length
+587: opener
+588: parent
+589: frameElement
+590: navigator
+591: external
+592: screen
+593: innerWidth
+594: innerHeight
+595: scrollX
+596: pageXOffset
+597: scrollY
+598: pageYOffset
+599: screenLeft
+600: screenTop
+601: screenX
+602: screenY
+603: outerWidth
+604: outerHeight
+605: performance
+606: mozInnerScreenX
+607: mozInnerScreenY
+608: devicePixelRatio
+609: scrollMaxX
+610: scrollMaxY
+611: fullScreen
+612: ondevicemotion
+613: ondeviceorientation
+614: onabsolutedeviceorientation
+615: ondeviceproximity
+616: onuserproximity
+617: ondevicelight
+618: content
+619: InstallTrigger
+620: sidebar
+621: crypto
+622: onabort
+623: onblur
+624: onfocus
+625: onauxclick
+626: oncanplay
+627: oncanplaythrough
+628: onchange
+629: onclick
+630: onclose
+631: oncontextmenu
+632: oncuechange
+633: ondblclick
+634: ondrag
+635: ondragend
+636: ondragenter
+637: ondragexit
+638: ondragleave
+639: ondragover
+640: ondragstart
+641: ondrop
+642: ondurationchange
+643: onemptied
+644: onended
+645: onformdata
+646: oninput
+647: oninvalid
+648: onkeydown
+649: onkeypress
+650: onkeyup
+651: onload
+652: onloadeddata
+653: onloadedmetadata
+654: onloadend
+655: onloadstart
+656: onmousedown
+657: onmouseenter
+658: onmouseleave
+659: onmousemove
+660: onmouseout
+661: onmouseover
+662: onmouseup
+663: onwheel
+664: onpause
+665: onplay
+666: onplaying
+667: onprogress
+668: onratechange
+669: onreset
+670: onresize
+671: onscroll
+672: onseeked
+673: onseeking
+674: onselect
+675: onshow
+676: onstalled
+677: onsubmit
+678: onsuspend
+679: ontimeupdate
+680: onvolumechange
+681: onwaiting
+682: onselectstart
+683: ontoggle
+684: onpointercancel
+685: onpointerdown
+686: onpointerup
+687: onpointermove
+688: onpointerout
+689: onpointerover
+690: onpointerenter
+691: onpointerleave
+692: ongotpointercapture
+693: onlostpointercapture
+694: onmozfullscreenchange
+695: onmozfullscreenerror
+696: onanimationcancel
+697: onanimationend
+698: onanimationiteration
+699: onanimationstart
+700: ontransitioncancel
+701: ontransitionend
+702: ontransitionrun
+703: ontransitionstart
+704: onwebkitanimationend
+705: onwebkitanimationiteration
+706: onwebkitanimationstart
+707: onwebkittransitionend
+708: onerror
+709: speechSynthesis
+710: onafterprint
+711: onbeforeprint
+712: onbeforeunload
+713: onhashchange
+714: onlanguagechange
+715: onmessage
+716: onmessageerror
+717: onoffline
+718: ononline
+719: onpagehide
+720: onpageshow
+721: onpopstate
+722: onrejectionhandled
+723: onstorage
+724: onunhandledrejection
+725: onunload
+726: localStorage
+727: origin
+728: crossOriginIsolated
+729: isSecureContext
+730: indexedDB
+731: caches
+732: sessionStorage
+733: window
+734: document
+735: location
+736: top
+737: netscape
+738: Node
+739: Document
+740: HTMLDocument
+741: Performance
+742: Event
+743: Location
+744: XMLHttpRequestEventTarget
+745: XMLHttpRequest
+746: JSON
+747: Element
+748: HTMLElement
+749: HTMLMetaElement
+750: Crypto
+751: HTMLHtmlElement
+752: HTMLScriptElement
+753: HTMLHeadElement
+754: getInstrumentJS
+755: Array
+756: AbortController
+757: AbortSignal
+758: AbstractRange
+759: Error
+760: TypeError
+761: HTMLDivElement
+762: HTMLSpanElement
+763: HTMLButtonElement
+764: AnonymousContent
+765: Promise
+766: PageTransitionEvent
+767: UIEvent
+768: FocusEvent
+769: console
+770: IdleDeadline
+771: StyleSheetList
+772: NotifyPaintEvent
+773: globalThis
+774: ReferenceError
+775: SyntaxError
+776: XMLDocument
+777: CustomEvent
+
+
diff --git a/docs/window_getOwnPropertyNames.json b/docs/window_getOwnPropertyNames.json
new file mode 100644
index 000000000..e859022b3
--- /dev/null
+++ b/docs/window_getOwnPropertyNames.json
@@ -0,0 +1 @@
+["AbortController", "AbortSignal", "AbstractRange", "AnalyserNode", "Animation", "AnimationEffect", "AnimationEvent", "AnimationPlaybackEvent", "AnimationTimeline", "AnonymousContent", "Array", "ArrayBuffer", "Attr", "Audio", "AudioBuffer", "AudioBufferSourceNode", "AudioContext", "AudioDestinationNode", "AudioListener", "AudioNode", "AudioParam", "AudioProcessingEvent", "AudioScheduledSourceNode", "BarProp", "BaseAudioContext", "BeforeUnloadEvent", "BigInt", "BigInt64Array", "BigUint64Array", "BiquadFilterNode", "Blob", "BlobEvent", "Boolean", "BroadcastChannel", "ByteLengthQueuingStrategy", "CDATASection", "CSS", "CSS2Properties", "CSSAnimation", "CSSConditionRule", "CSSCounterStyleRule", "CSSFontFaceRule", "CSSFontFeatureValuesRule", "CSSGroupingRule", "CSSImportRule", "CSSKeyframeRule", "CSSKeyframesRule", "CSSMediaRule", "CSSMozDocumentRule", "CSSNamespaceRule", "CSSPageRule", "CSSRule", "CSSRuleList", "CSSStyleDeclaration", "CSSStyleRule", "CSSStyleSheet", "CSSSupportsRule", "CSSTransition", "Cache", "CacheStorage", "CanvasCaptureMediaStream", "CanvasGradient", "CanvasPattern", "CanvasRenderingContext2D", "CaretPosition", "ChannelMergerNode", "ChannelSplitterNode", "CharacterData", "ClipboardEvent", "CloseEvent", "Comment", "CompositionEvent", "ConstantSourceNode", "ConvolverNode", "CountQueuingStrategy", "Crypto", "CustomElementRegistry", "CustomEvent", "DOMException", "DOMImplementation", "DOMMatrix", "DOMMatrixReadOnly", "DOMParser", "DOMPoint", "DOMPointReadOnly", "DOMQuad", "DOMRect", "DOMRectList", "DOMRectReadOnly", "DOMRequest", "DOMStringList", "DOMStringMap", "DOMTokenList", "DataTransfer", "DataTransferItem", "DataTransferItemList", "DataView", "Date", "DelayNode", "DeviceMotionEvent", "DeviceOrientationEvent", "Directory", "Document", "DocumentFragment", "DocumentTimeline", "DocumentType", "DragEvent", "DynamicsCompressorNode", "Element", "Error", "ErrorEvent", "EvalError", "Event", "EventSource", "EventTarget", "File", "FileList", "FileReader", "FileSystem", "FileSystemDirectoryEntry", "FileSystemDirectoryReader", "FileSystemEntry", "FileSystemFileEntry", "Float32Array", "Float64Array", "FocusEvent", "FontFace", "FontFaceSet", "FontFaceSetLoadEvent", "FormData", "FormDataEvent", "Function", "GainNode", "Gamepad", "GamepadButton", "GamepadEvent", "GamepadHapticActuator", "GamepadPose", "Geolocation", "GeolocationPositionError", "HTMLAllCollection", "HTMLAnchorElement", "HTMLAreaElement", "HTMLAudioElement", "HTMLBRElement", "HTMLBaseElement", "HTMLBodyElement", "HTMLButtonElement", "HTMLCanvasElement", "HTMLCollection", "HTMLDListElement", "HTMLDataElement", "HTMLDataListElement", "HTMLDetailsElement", "HTMLDirectoryElement", "HTMLDivElement", "HTMLDocument", "HTMLElement", "HTMLEmbedElement", "HTMLFieldSetElement", "HTMLFontElement", "HTMLFormControlsCollection", "HTMLFormElement", "HTMLFrameElement", "HTMLFrameSetElement", "HTMLHRElement", "HTMLHeadElement", "HTMLHeadingElement", "HTMLHtmlElement", "HTMLIFrameElement", "HTMLImageElement", "HTMLInputElement", "HTMLLIElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLLinkElement", "HTMLMapElement", "HTMLMarqueeElement", "HTMLMediaElement", "HTMLMenuElement", "HTMLMenuItemElement", "HTMLMetaElement", "HTMLMeterElement", "HTMLModElement", "HTMLOListElement", "HTMLObjectElement", "HTMLOptGroupElement", "HTMLOptionElement", "HTMLOptionsCollection", "HTMLOutputElement", "HTMLParagraphElement", "HTMLParamElement", "HTMLPictureElement", "HTMLPreElement", "HTMLProgressElement", "HTMLQuoteElement", "HTMLScriptElement", "HTMLSelectElement", "HTMLSlotElement", "HTMLSourceElement", "HTMLSpanElement", "HTMLStyleElement", "HTMLTableCaptionElement", "HTMLTableCellElement", "HTMLTableColElement", "HTMLTableElement", "HTMLTableRowElement", "HTMLTableSectionElement", "HTMLTemplateElement", "HTMLTextAreaElement", "HTMLTimeElement", "HTMLTitleElement", "HTMLTrackElement", "HTMLUListElement", "HTMLUnknownElement", "HTMLVideoElement", "HashChangeEvent", "Headers", "History", "IDBCursor", "IDBCursorWithValue", "IDBDatabase", "IDBFactory", "IDBFileHandle", "IDBFileRequest", "IDBIndex", "IDBKeyRange", "IDBMutableFile", "IDBObjectStore", "IDBOpenDBRequest", "IDBRequest", "IDBTransaction", "IDBVersionChangeEvent", "IIRFilterNode", "IdleDeadline", "Image", "ImageBitmap", "ImageBitmapRenderingContext", "ImageData", "Infinity", "InputEvent", "InstallTrigger", "Int16Array", "Int32Array", "Int8Array", "InternalError", "IntersectionObserver", "IntersectionObserverEntry", "Intl", "JSON", "KeyEvent", "KeyboardEvent", "KeyframeEffect", "Location", "Map", "Math", "MathMLElement", "MediaCapabilities", "MediaCapabilitiesInfo", "MediaElementAudioSourceNode", "MediaEncryptedEvent", "MediaError", "MediaKeyError", "MediaKeyMessageEvent", "MediaKeySession", "MediaKeyStatusMap", "MediaKeySystemAccess", "MediaKeys", "MediaList", "MediaQueryList", "MediaQueryListEvent", "MediaRecorder", "MediaRecorderErrorEvent", "MediaSource", "MediaStream", "MediaStreamAudioDestinationNode", "MediaStreamAudioSourceNode", "MediaStreamEvent", "MediaStreamTrack", "MediaStreamTrackAudioSourceNode", "MediaStreamTrackEvent", "MessageChannel", "MessageEvent", "MessagePort", "MimeType", "MimeTypeArray", "MouseEvent", "MouseScrollEvent", "MutationEvent", "MutationObserver", "MutationRecord", "NamedNodeMap", "Navigator", "Node", "NodeFilter", "NodeIterator", "NodeList", "Notification", "NotifyPaintEvent", "Number", "Object", "OfflineAudioCompletionEvent", "OfflineAudioContext", "Option", "OscillatorNode", "PageTransitionEvent", "PaintRequest", "PaintRequestList", "PannerNode", "Path2D", "Performance", "PerformanceEntry", "PerformanceMark", "PerformanceMeasure", "PerformanceNavigation", "PerformanceNavigationTiming", "PerformanceObserver", "PerformanceObserverEntryList", "PerformanceResourceTiming", "PerformanceTiming", "PeriodicWave", "PermissionStatus", "Permissions", "Plugin", "PluginArray", "PointerEvent", "PopStateEvent", "PopupBlockedEvent", "ProcessingInstruction", "ProgressEvent", "Promise", "PromiseRejectionEvent", "Proxy", "PushManager", "PushSubscription", "PushSubscriptionOptions", "RTCCertificate", "RTCDTMFSender", "RTCDTMFToneChangeEvent", "RTCDataChannel", "RTCDataChannelEvent", "RTCIceCandidate", "RTCPeerConnection", "RTCPeerConnectionIceEvent", "RTCRtpReceiver", "RTCRtpSender", "RTCRtpTransceiver", "RTCSessionDescription", "RTCStatsReport", "RTCTrackEvent", "RadioNodeList", "Range", "RangeError", "ReadableStream", "ReferenceError", "Reflect", "RegExp", "Request", "ResizeObserver", "ResizeObserverEntry", "ResizeObserverSize", "Response", "SVGAElement", "SVGAngle", "SVGAnimateElement", "SVGAnimateMotionElement", "SVGAnimateTransformElement", "SVGAnimatedAngle", "SVGAnimatedBoolean", "SVGAnimatedEnumeration", "SVGAnimatedInteger", "SVGAnimatedLength", "SVGAnimatedLengthList", "SVGAnimatedNumber", "SVGAnimatedNumberList", "SVGAnimatedPreserveAspectRatio", "SVGAnimatedRect", "SVGAnimatedString", "SVGAnimatedTransformList", "SVGAnimationElement", "SVGCircleElement", "SVGClipPathElement", "SVGComponentTransferFunctionElement", "SVGDefsElement", "SVGDescElement", "SVGElement", "SVGEllipseElement", "SVGFEBlendElement", "SVGFEColorMatrixElement", "SVGFEComponentTransferElement", "SVGFECompositeElement", "SVGFEConvolveMatrixElement", "SVGFEDiffuseLightingElement", "SVGFEDisplacementMapElement", "SVGFEDistantLightElement", "SVGFEDropShadowElement", "SVGFEFloodElement", "SVGFEFuncAElement", "SVGFEFuncBElement", "SVGFEFuncGElement", "SVGFEFuncRElement", "SVGFEGaussianBlurElement", "SVGFEImageElement", "SVGFEMergeElement", "SVGFEMergeNodeElement", "SVGFEMorphologyElement", "SVGFEOffsetElement", "SVGFEPointLightElement", "SVGFESpecularLightingElement", "SVGFESpotLightElement", "SVGFETileElement", "SVGFETurbulenceElement", "SVGFilterElement", "SVGForeignObjectElement", "SVGGElement", "SVGGeometryElement", "SVGGradientElement", "SVGGraphicsElement", "SVGImageElement", "SVGLength", "SVGLengthList", "SVGLineElement", "SVGLinearGradientElement", "SVGMPathElement", "SVGMarkerElement", "SVGMaskElement", "SVGMatrix", "SVGMetadataElement", "SVGNumber", "SVGNumberList", "SVGPathElement", "SVGPathSegList", "SVGPatternElement", "SVGPoint", "SVGPointList", "SVGPolygonElement", "SVGPolylineElement", "SVGPreserveAspectRatio", "SVGRadialGradientElement", "SVGRect", "SVGRectElement", "SVGSVGElement", "SVGScriptElement", "SVGSetElement", "SVGStopElement", "SVGStringList", "SVGStyleElement", "SVGSwitchElement", "SVGSymbolElement", "SVGTSpanElement", "SVGTextContentElement", "SVGTextElement", "SVGTextPathElement", "SVGTextPositioningElement", "SVGTitleElement", "SVGTransform", "SVGTransformList", "SVGUnitTypes", "SVGUseElement", "SVGViewElement", "Screen", "ScreenOrientation", "ScriptProcessorNode", "ScrollAreaEvent", "SecurityPolicyViolationEvent", "Selection", "ServiceWorker", "ServiceWorkerRegistration", "Set", "ShadowRoot", "SharedWorker", "SourceBuffer", "SourceBufferList", "SpeechSynthesis", "SpeechSynthesisErrorEvent", "SpeechSynthesisEvent", "SpeechSynthesisUtterance", "SpeechSynthesisVoice", "StaticRange", "StereoPannerNode", "Storage", "StorageEvent", "String", "StyleSheet", "StyleSheetList", "SubmitEvent", "Symbol", "SyntaxError", "Text", "TextDecoder", "TextEncoder", "TextMetrics", "TextTrack", "TextTrackCue", "TextTrackCueList", "TextTrackList", "TimeEvent", "TimeRanges", "TrackEvent", "TransitionEvent", "TreeWalker", "TypeError", "UIEvent", "URIError", "URL", "URLSearchParams", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", "VTTCue", "VTTRegion", "ValidityState", "VideoPlaybackQuality", "VisualViewport", "WaveShaperNode", "WeakMap", "WeakSet", "WebAssembly", "WebGL2RenderingContext", "WebGLActiveInfo", "WebGLBuffer", "WebGLContextEvent", "WebGLFramebuffer", "WebGLProgram", "WebGLQuery", "WebGLRenderbuffer", "WebGLRenderingContext", "WebGLSampler", "WebGLShader", "WebGLShaderPrecisionFormat", "WebGLSync", "WebGLTexture", "WebGLTransformFeedback", "WebGLUniformLocation", "WebGLVertexArrayObject", "WebKitCSSMatrix", "WebSocket", "WheelEvent", "Window", "Worker", "XMLDocument", "XMLHttpRequest", "XMLHttpRequestEventTarget", "XMLHttpRequestUpload", "XMLSerializer", "XPathEvaluator", "XPathExpression", "XPathResult", "XSLTProcessor", "alert", "atob", "blur", "btoa", "caches", "cancelAnimationFrame", "cancelIdleCallback", "captureEvents", "clearInterval", "clearTimeout", "close", "closed", "confirm", "console", "content", "createImageBitmap", "crossOriginIsolated", "crypto", "customElements", "decodeURI", "decodeURIComponent", "devicePixelRatio", "document", "dump", "encodeURI", "encodeURIComponent", "escape", "eval", "event", "external", "fetch", "find", "focus", "frameElement", "frames", "fullScreen", "getComputedStyle", "getDefaultComputedStyle", "getInstrumentJS", "getSelection", "globalThis", "history", "indexedDB", "innerHeight", "innerWidth", "isFinite", "isNaN", "isSecureContext", "length", "localStorage", "location", "locationbar", "matchMedia", "menubar", "moveBy", "moveTo", "mozInnerScreenX", "mozInnerScreenY", "mozRTCIceCandidate", "mozRTCPeerConnection", "mozRTCSessionDescription", "name", "nan", "navigator", "netscape", "onabort", "onabsolutedeviceorientation", "onafterprint", "onanimationcancel", "onanimationend", "onanimationiteration", "onanimationstart", "onauxclick", "onbeforeprint", "onbeforeunload", "onblur", "oncanplay", "oncanplaythrough", "onchange", "onclick", "onclose", "oncontextmenu", "oncuechange", "ondblclick", "ondevicelight", "ondevicemotion", "ondeviceorientation", "ondeviceproximity", "ondrag", "ondragend", "ondragenter", "ondragexit", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "onformdata", "ongotpointercapture", "onhashchange", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onlanguagechange", "onload", "onloadeddata", "onloadedmetadata", "onloadend", "onloadstart", "onlostpointercapture", "onmessage", "onmessageerror", "onmousedown", "onmouseenter", "onmouseleave", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmozfullscreenchange", "onmozfullscreenerror", "onoffline", "ononline", "onpagehide", "onpageshow", "onpause", "onplay", "onplaying", "onpointercancel", "onpointerdown", "onpointerenter", "onpointerleave", "onpointermove", "onpointerout", "onpointerover", "onpointerup", "onpopstate", "onprogress", "onratechange", "onrejectionhandled", "onreset", "onresize", "onscroll", "onseeked", "onseeking", "onselect", "onselectstart", "onshow", "onstalled", "onstorage", "onsubmit", "onsuspend", "ontimeupdate", "ontoggle", "ontransitioncancel", "ontransitionend", "ontransitionrun", "ontransitionstart", "onunhandledrejection", "onunload", "onuserproximity", "onvolumechange", "onwaiting", "onwebkitanimationend", "onwebkitanimationiteration", "onwebkitanimationstart", "onwebkittransitionend", "onwheel", "open", "opener", "origin", "outerHeight", "outerWidth", "pageXOffset", "pageYOffset", "parent", "parseFloat", "parseInt", "performance", "personalbar", "postMessage", "print", "prompt", "queueMicrotask", "releaseEvents", "requestAnimationFrame", "requestIdleCallback", "resizeBy", "resizeTo", "screen", "screenLeft", "screenTop", "screenX", "screenY", "scroll", "scrollBy", "scrollByLines", "scrollByPages", "scrollMaxX", "scrollMaxY", "scrollTo", "scrollX", "scrollY", "scrollbars", "self", "sessionStorage", "setInterval", "setResizable", "setTimeout", "sidebar", "sizeToContent", "speechSynthesis", "status", "statusbar", "stop", "toolbar", "top", "undefined", "unescape", "updateCommands", "webkitURL", "window"]
\ No newline at end of file
diff --git a/test/debug_params.json b/test/debug_params.json
deleted file mode 100644
index 05a3ba85e..000000000
--- a/test/debug_params.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true,
- "js_instrument_modules": [
- {
- "window": {"recursive": true}
- }
- ]
-}
diff --git a/test/test_browser_params_all.json b/test/test_browser_params_all.json
new file mode 100644
index 000000000..46b67a500
--- /dev/null
+++ b/test/test_browser_params_all.json
@@ -0,0 +1,553 @@
+{
+ "crawl_id": 0,
+ "testing": true,
+ "js_instrument": true,
+ "js_instrument_modules": [
+ "AbortController",
+ "AbortSignal",
+ "AbstractRange",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ "Array",
+ "ArrayBuffer",
+ "Attr",
+ "Audio",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioParam",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "BarProp",
+ "BaseAudioContext",
+ "BeforeUnloadEvent",
+ "BigInt",
+ "BigInt64Array",
+ "BigUint64Array",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobEvent",
+ "Boolean",
+ "BroadcastChannel",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSS",
+ "CSS2Properties",
+ "CSSAnimation",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSFontFaceRule",
+ "CSSFontFeatureValuesRule",
+ "CSSGroupingRule",
+ "CSSImportRule",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSMediaRule",
+ "CSSMozDocumentRule",
+ "CSSNamespaceRule",
+ "CSSPageRule",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSSupportsRule",
+ "CSSTransition",
+ "Cache",
+ "CacheStorage",
+ "CanvasCaptureMediaStream",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "ConstantSourceNode",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Crypto",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMException",
+ "DOMImplementation",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectList",
+ "DOMRectReadOnly",
+ "DOMRequest",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DataView",
+ "Date",
+ "DelayNode",
+ "DeviceMotionEvent",
+ "DeviceOrientationEvent",
+ "Directory",
+ "Document",
+ "DocumentFragment",
+ "DocumentTimeline",
+ "DocumentType",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "Element",
+ "Error",
+ "ErrorEvent",
+ "EvalError",
+ "Event",
+ "EventSource",
+ "EventTarget",
+ "File",
+ "FileList",
+ "FileReader",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "Float32Array",
+ "Float64Array",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "Function",
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationPositionError",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDirectoryElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBFactory",
+ "IDBFileHandle",
+ "IDBFileRequest",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBMutableFile",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "Image",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageData",
+ "Infinity",
+ "InputEvent",
+ "InstallTrigger",
+ "Int16Array",
+ "Int32Array",
+ "Int8Array",
+ "InternalError",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Intl",
+ "JSON",
+ "KeyEvent",
+ "KeyboardEvent",
+ "KeyframeEffect",
+ "Location",
+ "Map",
+ "Math",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeys",
+ "MediaList",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MutationEvent",
+ "MutationObserver",
+ "MutationRecord",
+ "NamedNodeMap",
+ "Navigator",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "Notification",
+ "Number",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "Option",
+ "OscillatorNode",
+ "PageTransitionEvent",
+ "PaintRequest",
+ "PaintRequestList",
+ "PannerNode",
+ "Path2D",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformanceResourceTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "Plugin",
+ "PluginArray",
+ "PointerEvent",
+ "PopStateEvent",
+ "PopupBlockedEvent",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "Promise",
+ "PromiseRejectionEvent",
+ "Proxy",
+ "PushManager",
+ "PushSubscription",
+ "PushSubscriptionOptions",
+ "RTCCertificate",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCIceCandidate",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpReceiver",
+ "RTCRtpSender",
+ "RTCRtpTransceiver",
+ "RTCSessionDescription",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RadioNodeList",
+ "Range",
+ "RangeError",
+ "ReadableStream",
+ "ReferenceError",
+ "Reflect",
+ "RegExp",
+ "Request",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "ResizeObserverSize",
+ "Response",
+ "SVGAElement",
+ "SVGAngle",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMarkerElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMetadataElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPathSegList",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPointList",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTSpanElement",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGUnitTypes",
+ "SVGUseElement",
+ "SVGViewElement",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollAreaEvent",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "ServiceWorker",
+ "ServiceWorkerRegistration",
+ "Set",
+ "ShadowRoot",
+ "SharedWorker",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEvent",
+ "String",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "Symbol",
+ "SyntaxError",
+ "Text",
+ "TextDecoder",
+ "TextEncoder",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackCueList",
+ "TextTrackList",
+ "TimeEvent",
+ "TimeRanges",
+ "TrackEvent",
+ "TransitionEvent",
+ "TreeWalker",
+ "TypeError",
+ "UIEvent",
+ "URIError",
+ "URL",
+ "URLSearchParams",
+ "Uint16Array",
+ "Uint32Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "VTTCue",
+ "VTTRegion",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VisualViewport",
+ "WaveShaperNode",
+ "WeakMap",
+ "WeakSet",
+ "WebAssembly",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Worker",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathEvaluator",
+ "XPathExpression",
+ "XPathResult",
+ "XSLTProcessor"
+ ]
+}
diff --git a/test/test_browser_params_simple.json b/test/test_browser_params_simple.json
new file mode 100644
index 000000000..deb11e60d
--- /dev/null
+++ b/test/test_browser_params_simple.json
@@ -0,0 +1,5 @@
+{
+ "crawl_id": 0,
+ "testing": true,
+ "js_instrument": true
+}
\ No newline at end of file
From 3e89866fa5bf793854f0e638b11a6002bc6b06d5 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 21:26:41 -0500
Subject: [PATCH 066/106] Relax constraints on what we can instrument.
Let failing happen during instrumentation by using subscript notation.
Don't restrict to MDN list.
---
.../scripts/make_mdn_browser_compat_file.js | 4 +-
automation/JSInstrumentation.py | 11 +-
.../mdn_browser_compat_data.py | 748 ------------------
docs/mdn_browser_compat_data.py | 748 ++++++++++++++++++
test/test_js_instrument_py.py | 14 +-
5 files changed, 757 insertions(+), 768 deletions(-)
delete mode 100644 automation/js_instrumentation/mdn_browser_compat_data.py
create mode 100644 docs/mdn_browser_compat_data.py
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
index 8b4844f70..1ed3f8d14 100755
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
@@ -24,11 +24,11 @@ api = [
${api.join(',\n ')}
]`
fs.writeFile(
- '../../js_instrumentation/mdn_browser_compat_data.py',
+ '../../../docs/mdn_browser_compat_data.py',
output,
(err) => {
if(err) {
return console.log(err);
}
- console.log("../../js_instrumentation/mdn_browser_compat_data.py regenerated.");
+ console.log("../../../docs/mdn_browser_compat_data.py regenerated.");
});
\ No newline at end of file
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 199ba9c4a..b4464571c 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -3,8 +3,6 @@
import jsonschema
-from .js_instrumentation.mdn_browser_compat_data import api as mdn
-
curdir = os.path.dirname(os.path.realpath(__file__))
schema_path = os.path.join(
curdir, 'js_instrumentation', 'js_instrument_modules.schema'
@@ -107,15 +105,12 @@ def merge_object_requests(python_list):
def _handle_obj_string(obj_string):
- if obj_string in mdn:
- obj = f'window.{obj_string}.prototype'
- instrumentedName = obj_string
- elif obj_string.startswith('window'):
+ if obj_string.startswith('window'):
obj = obj_string
instrumentedName = obj_string
else:
- raise RuntimeError(
- 'Requested API not listed in MDN Browser Compat Data')
+ obj = f'window["{obj_string}"].prototype'
+ instrumentedName = obj_string
return obj, instrumentedName
diff --git a/automation/js_instrumentation/mdn_browser_compat_data.py b/automation/js_instrumentation/mdn_browser_compat_data.py
deleted file mode 100644
index 2a356be0d..000000000
--- a/automation/js_instrumentation/mdn_browser_compat_data.py
+++ /dev/null
@@ -1,748 +0,0 @@
-
-# This file is generated from mdn-browser-compat-data by running
-# "npm run make-compat" in the Extension/webext-instrumentation
-# directory.
-api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortSignal",
- "AbstractRange",
- "AbstractWorker",
- "AnalyserNode",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioProcessingEvent",
- "AudioTrackList",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "BroadcastChannel",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceMotionEvent",
- "DeviceOrientationEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FetchEvent",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "History",
- "IDBDatabaseException",
- "IDBLocaleAwareKeyRange",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageData",
- "InputEvent",
- "InstallEvent",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "LongRange",
- "MIDIAccess",
- "MSGestureEvent",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OscillatorNode",
- "PageTransitionEvent",
- "PannerNode",
- "ParentNode",
- "Path2D",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "Plugin",
- "PluginArray",
- "Point",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushSubscription",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityErrorEvent",
- "RTCOfferAnswerOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "SVGAElement",
- "SVGAltGlyphElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGUnitTypes",
- "SVGUseElement",
- "SVGViewElement",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "Selection",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoderStream",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackList",
- "TimeRanges",
- "TrackDefault",
- "TrackDefaultList",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "VTTCue",
- "ValidityState",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_shaders",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
\ No newline at end of file
diff --git a/docs/mdn_browser_compat_data.py b/docs/mdn_browser_compat_data.py
new file mode 100644
index 000000000..052b18cc4
--- /dev/null
+++ b/docs/mdn_browser_compat_data.py
@@ -0,0 +1,748 @@
+
+# This file is generated from mdn-browser-compat-data by running
+# "npm run make-compat" in the Extension/webext-instrumentation
+# directory.
+api = [
+ "ANGLE_instanced_arrays",
+ "AbortController",
+ "AbortSignal",
+ "AbstractRange",
+ "AbstractWorker",
+ "AnalyserNode",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "Attr",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioContextOptions",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioNodeOptions",
+ "AudioParam",
+ "AudioProcessingEvent",
+ "AudioTrackList",
+ "AuthenticationAssertion",
+ "AuthenticatorAssertionResponse",
+ "AuthenticatorAttestationResponse",
+ "AuthenticatorResponse",
+ "BackgroundFetchEvent",
+ "BackgroundFetchManager",
+ "BackgroundFetchRecord",
+ "BackgroundFetchRegistration",
+ "BackgroundFetchUpdateUIEvent",
+ "BaseAudioContext",
+ "BasicCardRequest",
+ "BasicCardResponse",
+ "BeforeInstallPromptEvent",
+ "BeforeUnloadEvent",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobBuilder",
+ "BlobEvent",
+ "Bluetooth",
+ "BluetoothAdvertisingData",
+ "BluetoothCharacteristicProperties",
+ "BluetoothDevice",
+ "BluetoothRemoteGATTCharacteristic",
+ "BluetoothRemoteGATTDescriptor",
+ "BluetoothRemoteGATTServer",
+ "BluetoothRemoteGATTService",
+ "BroadcastChannel",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSGroupingRule",
+ "CSSImageValue",
+ "CSSKeywordValue",
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum",
+ "CSSMathValue",
+ "CSSMatrixComponent",
+ "CSSMediaRule",
+ "CSSNamespaceRule",
+ "CSSNumericArray",
+ "CSSNumericValue",
+ "CSSPageRule",
+ "CSSPerspective",
+ "CSSPositionValue",
+ "CSSPrimitiveValue",
+ "CSSRotate",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSStyleValue",
+ "CSSSupportsRule",
+ "CSSTransformComponent",
+ "CSSTransformValue",
+ "CSSTranslate",
+ "CSSUnitValue",
+ "CSSUnparsedValue",
+ "CSSValue",
+ "CSSValueList",
+ "CSSVariableReferenceValue",
+ "Cache",
+ "CacheStorage",
+ "CanvasCaptureMediaStreamTrack",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ChildNode",
+ "Client",
+ "Clients",
+ "Clipboard",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "Console",
+ "ConstantSourceNode",
+ "ConstrainBoolean",
+ "ConstrainDOMString",
+ "ConstrainDouble",
+ "ConstrainLong",
+ "ConstrainULong",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Credential",
+ "CredentialsContainer",
+ "Crypto",
+ "CryptoKey",
+ "CryptoKeyPair",
+ "CustomEvent",
+ "DOMConfiguration",
+ "DOMError",
+ "DOMErrorHandler",
+ "DOMException",
+ "DOMHighResTimestamp",
+ "DOMImplementation",
+ "DOMImplementationList",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointInit",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectReadOnly",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DedicatedWorkerGlobalScope",
+ "DelayNode",
+ "DeviceMotionEvent",
+ "DeviceOrientationEvent",
+ "DirectoryEntrySync",
+ "DirectoryReaderSync",
+ "Document",
+ "DocumentFragment",
+ "DocumentOrShadowRoot",
+ "DocumentType",
+ "DoubleRange",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "EXT_blend_minmax",
+ "EXT_color_buffer_float",
+ "EXT_color_buffer_half_float",
+ "EXT_disjoint_timer_query",
+ "EXT_float_blend",
+ "EXT_frag_depth",
+ "EXT_sRGB",
+ "EXT_shader_texture_lod",
+ "EXT_texture_compression_bptc",
+ "EXT_texture_compression_rgtc",
+ "EXT_texture_filter_anisotropic",
+ "EffectTiming",
+ "Element",
+ "EntrySync",
+ "ErrorEvent",
+ "Event",
+ "EventListener",
+ "EventSource",
+ "EventTarget",
+ "ExtendableEvent",
+ "ExtendableMessageEvent",
+ "External",
+ "FeaturePolicy",
+ "FetchEvent",
+ "FileEntrySync",
+ "FileError",
+ "FileException",
+ "FileList",
+ "FileReader",
+ "FileReaderSync",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "FileSystemFlags",
+ "FileSystemSync",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ "FullscreenOptions",
+ "GainNode",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeometryUtils",
+ "GestureEvent",
+ "GlobalEventHandlers",
+ "HMDVRDevice",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBaseFontElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLContentElement",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDialogElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLHyperlinkElementUtils",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLIsIndexElement",
+ "HTMLKeygenElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLShadowElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "History",
+ "IDBDatabaseException",
+ "IDBLocaleAwareKeyRange",
+ "IDBVersionChangeRequest",
+ "IIRFilterNode",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageData",
+ "InputEvent",
+ "InstallEvent",
+ "Keyboard",
+ "KeyboardEvent",
+ "KeyboardLayoutMap",
+ "KeyframeEffect",
+ "LargestContentfulPaint",
+ "LayoutShift",
+ "LayoutShiftAttribution",
+ "LocalFileSystem",
+ "LocalFileSystemSync",
+ "LocalMediaStream",
+ "Location",
+ "LongRange",
+ "MIDIAccess",
+ "MSGestureEvent",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaDeviceInfo",
+ "MediaDevices",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeys",
+ "MediaList",
+ "MediaMetadata",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaQueryListListener",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSession",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioSourceOptions",
+ "MediaStreamConstraints",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackAudioSourceOptions",
+ "MediaStreamTrackEvent",
+ "MediaTrackConstraints",
+ "MediaTrackSettings",
+ "MediaTrackSupportedConstraints",
+ "MerchantValidationEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "Metadata",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MouseWheelEvent",
+ "MutationObserver",
+ "MutationObserverInit",
+ "MutationRecord",
+ "NDEFMessage",
+ "NDEFReader",
+ "NDEFReadingEvent",
+ "NDEFRecord",
+ "NDEFWriter",
+ "NavigationPreloadManager",
+ "Navigator",
+ "NavigatorConcurrentHardware",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine",
+ "NavigatorPlugins",
+ "NetworkInformation",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "NonDocumentTypeChildNode",
+ "Notation",
+ "NotificationEvent",
+ "OES_element_index_uint",
+ "OES_standard_derivatives",
+ "OES_texture_float",
+ "OES_texture_float_linear",
+ "OES_texture_half_float",
+ "OES_texture_half_float_linear",
+ "OES_vertex_array_object",
+ "OVR_multiview2",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "OffscreenCanvas",
+ "OscillatorNode",
+ "PageTransitionEvent",
+ "PannerNode",
+ "ParentNode",
+ "Path2D",
+ "PaymentAddress",
+ "PaymentCurrencyAmount",
+ "PaymentDetailsBase",
+ "PaymentDetailsInit",
+ "PaymentDetailsUpdate",
+ "PaymentInstruments",
+ "PaymentItem",
+ "PaymentManager",
+ "PaymentMethodChangeEvent",
+ "PaymentRequest",
+ "PaymentRequestEvent",
+ "PaymentRequestUpdateEvent",
+ "PaymentResponse",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceEventTiming",
+ "PerformanceFrameTiming",
+ "PerformanceLongTaskTiming",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformanceResourceTiming",
+ "PerformanceServerTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "Plugin",
+ "PluginArray",
+ "Point",
+ "PopStateEvent",
+ "PositionOptions",
+ "PositionSensorVRDevice",
+ "Presentation",
+ "PresentationAvailability",
+ "PresentationConnection",
+ "PresentationConnectionAvailableEvent",
+ "PresentationConnectionCloseEvent",
+ "PresentationConnectionList",
+ "PresentationReceiver",
+ "PresentationRequest",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "PublicKeyCredential",
+ "PublicKeyCredentialCreationOptions",
+ "PublicKeyCredentialRequestOptions",
+ "PushEvent",
+ "PushManager",
+ "PushMessageData",
+ "PushSubscription",
+ "PushSubscriptionOptions",
+ "RTCAnswerOptions",
+ "RTCCertificate",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannelEvent",
+ "RTCDtlsTransport",
+ "RTCIceCandidate",
+ "RTCIceCandidateInit",
+ "RTCIceCandidatePairStats",
+ "RTCIceCandidateStats",
+ "RTCIceCandidateType",
+ "RTCIceComponent",
+ "RTCIceCredentialType",
+ "RTCIceServer",
+ "RTCIceTransport",
+ "RTCIdentityErrorEvent",
+ "RTCOfferAnswerOptions",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpContributingSource",
+ "RTCRtpEncodingParameters",
+ "RTCRtpReceiver",
+ "RTCRtpSendParameters",
+ "RTCRtpSender",
+ "RTCRtpSynchronizationSource",
+ "RTCRtpTransceiver",
+ "RTCRtpTransceiverDirection",
+ "RTCRtpTransceiverInit",
+ "RTCSctpTransport",
+ "RTCSessionDescription",
+ "RTCSessionDescriptionCallback",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RTCTrackEventInit",
+ "RadioNodeList",
+ "Range",
+ "ReadableByteStreamController",
+ "ReadableStreamBYOBReader",
+ "ReadableStreamBYOBRequest",
+ "RequestDestination",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "SVGAElement",
+ "SVGAltGlyphElement",
+ "SVGAngle",
+ "SVGAnimateColorElement",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGCursorElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGExternalResourcesRequired",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMeshElement",
+ "SVGMetadataElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTSpanElement",
+ "SVGTests",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGUnitTypes",
+ "SVGUseElement",
+ "SVGViewElement",
+ "ScopedCredential",
+ "ScopedCredentialInfo",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollToOptions",
+ "Selection",
+ "ServiceWorker",
+ "ServiceWorkerContainer",
+ "ServiceWorkerGlobalScope",
+ "ServiceWorkerMessageEvent",
+ "ServiceWorkerRegistration",
+ "SharedWorker",
+ "SharedWorkerGlobalScope",
+ "SpeechGrammar",
+ "SpeechGrammarList",
+ "SpeechRecognition",
+ "SpeechRecognitionAlternative",
+ "SpeechRecognitionErrorEvent",
+ "SpeechRecognitionEvent",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEstimate",
+ "StorageEvent",
+ "StylePropertyMap",
+ "StylePropertyMapReadOnly",
+ "StyleSheet",
+ "StyleSheetList",
+ "SyncManager",
+ "TaskAttributionTiming",
+ "Text",
+ "TextDecoderStream",
+ "TextEncoderStream",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackList",
+ "TimeRanges",
+ "TrackDefault",
+ "TrackDefaultList",
+ "Transferable",
+ "TransformStream",
+ "TransformStreamDefaultController",
+ "TransitionEvent",
+ "TreeWalker",
+ "UIEvent",
+ "ULongRange",
+ "URL",
+ "URLSearchParams",
+ "USB",
+ "USBAlternateInterface",
+ "USBConfiguration",
+ "USBConnectionEvent",
+ "USBDevice",
+ "USBEndpoint",
+ "USBInTransferResult",
+ "USBInterface",
+ "USBIsochronousInTransferPacket",
+ "USBIsochronousInTransferResult",
+ "USBIsochronousOutTransferPacket",
+ "USBIsochronousOutTransferResult",
+ "USBOutTransferResult",
+ "USBPermissionResult",
+ "UserDataHandler",
+ "VTTCue",
+ "ValidityState",
+ "VideoTrackList",
+ "VisualViewport",
+ "WEBGL_color_buffer_float",
+ "WEBGL_compressed_texture_astc",
+ "WEBGL_compressed_texture_etc",
+ "WEBGL_compressed_texture_etc1",
+ "WEBGL_compressed_texture_s3tc_srgb",
+ "WEBGL_debug_shaders",
+ "WaveShaperNode",
+ "WebAuthentication",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebGLVertexArrayObjectOES",
+ "WheelEvent",
+ "Window",
+ "WindowClient",
+ "WindowEventHandlers",
+ "WindowOrWorkerGlobalScope",
+ "Worker",
+ "WorkerGlobalScope",
+ "WorkerLocation",
+ "WorkerNavigator",
+ "Worklet",
+ "WritableStream",
+ "WritableStreamDefaultController",
+ "WritableStreamDefaultWriter",
+ "XDomainRequest",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathExpression",
+ "XPathResult",
+ "XRBoundedReferenceSpace",
+ "XREnvironmentBlendMode",
+ "XREye",
+ "XRFrame",
+ "XRFrameRequestCallback",
+ "XRInputSource",
+ "XRInputSourceArray",
+ "XRInputSourceEvent",
+ "XRInputSourcesChangeEvent",
+ "XRPermissionDescriptor",
+ "XRPermissionStatus",
+ "XRPose",
+ "XRReferenceSpace",
+ "XRReferenceSpaceEvent",
+ "XRRigidTransform",
+ "XRSession",
+ "XRSessionEvent",
+ "XRSessionMode",
+ "XRSpace",
+ "XRSystem",
+ "XRView",
+ "XRViewerPose",
+ "XRViewport",
+ "XRWebGLLayer",
+ "XRWebGLLayerInit",
+ "XSLTProcessor"
+]
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 11ad84053..41cc81bca 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -220,7 +220,7 @@ def test_merge_multiple_duped_properties_different_log_settings(default_log_sett
def test_api_whole_module(default_log_settings):
shortcut_input = "XMLHttpRequest"
expected_output = {
- 'object': 'window.XMLHttpRequest.prototype',
+ 'object': 'window["XMLHttpRequest"].prototype',
'instrumentedName': 'XMLHttpRequest',
'logSettings': default_log_settings,
}
@@ -228,12 +228,6 @@ def test_api_whole_module(default_log_settings):
assert actual_output == expected_output
-def test_api_whole_module_invalid():
- shortcut_input = "xxxxxxx"
- with pytest.raises(RuntimeError):
- jsi.build_object_from_request(shortcut_input)
-
-
def test_api_two_keys_in_shortcut():
shortcut_input = {'k1': [], 'k2': []}
with pytest.raises(AssertionError):
@@ -269,7 +263,7 @@ def test_api_module_specific_properties(default_log_settings):
log_settings['propertiesToInstrument'] = ['send']
shortcut_input = {"XMLHttpRequest": ['send']}
expected_output = {
- 'object': 'window.XMLHttpRequest.prototype',
+ 'object': 'window["XMLHttpRequest"].prototype',
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
@@ -289,7 +283,7 @@ def test_api_passing_partial_log_settings(default_log_settings):
}
}
expected_output = {
- 'object': 'window.XMLHttpRequest.prototype',
+ 'object': 'window["XMLHttpRequest"].prototype',
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
@@ -303,7 +297,7 @@ def test_api_shortcut_fingerprinting():
shortcut_input = ['fingerprinting']
output = jsi.convert_browser_params_to_js_string(shortcut_input)
assert 'window.document' in output
- assert 'window.AudioContext.prototype' in output
+ assert 'window[\\"AudioContext\\"].prototype' in output
def test_complete_pass():
From 1a68eaaba49b3ae6fb89675847b05ce9309a002f Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 21:49:05 -0500
Subject: [PATCH 067/106] Correct stringifying
---
automation/JSInstrumentation.py | 2 +-
test/test_js_instrument_py.py | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index b4464571c..61ff21195 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -109,7 +109,7 @@ def _handle_obj_string(obj_string):
obj = obj_string
instrumentedName = obj_string
else:
- obj = f'window["{obj_string}"].prototype'
+ obj = f"window['{obj_string}'].prototype"
instrumentedName = obj_string
return obj, instrumentedName
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 41cc81bca..81b024301 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -220,7 +220,7 @@ def test_merge_multiple_duped_properties_different_log_settings(default_log_sett
def test_api_whole_module(default_log_settings):
shortcut_input = "XMLHttpRequest"
expected_output = {
- 'object': 'window["XMLHttpRequest"].prototype',
+ 'object': "window['XMLHttpRequest'].prototype",
'instrumentedName': 'XMLHttpRequest',
'logSettings': default_log_settings,
}
@@ -263,7 +263,7 @@ def test_api_module_specific_properties(default_log_settings):
log_settings['propertiesToInstrument'] = ['send']
shortcut_input = {"XMLHttpRequest": ['send']}
expected_output = {
- 'object': 'window["XMLHttpRequest"].prototype',
+ 'object': "window['XMLHttpRequest'].prototype",
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
@@ -283,7 +283,7 @@ def test_api_passing_partial_log_settings(default_log_settings):
}
}
expected_output = {
- 'object': 'window["XMLHttpRequest"].prototype',
+ 'object': "window['XMLHttpRequest'].prototype",
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
@@ -297,7 +297,7 @@ def test_api_shortcut_fingerprinting():
shortcut_input = ['fingerprinting']
output = jsi.convert_browser_params_to_js_string(shortcut_input)
assert 'window.document' in output
- assert 'window[\\"AudioContext\\"].prototype' in output
+ assert 'window[\'AudioContext\'].prototype' in output
def test_complete_pass():
From dc31a83aaafe3a7f542fe33fd95fc9de3d95b7ec Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 22:49:14 -0500
Subject: [PATCH 068/106] Better name example params, fix some bugs, sample a_f
Some example browser_params - a_f is just working - but crushes
on a page like google.com. g_l and m_z haven't been vetted yet.
---
automation/JSInstrumentation.py | 32 +-
.../js_instrument_modules.schema | 2 +-
test/example_browser_params/a_f.json | 138 ++++++++
test/example_browser_params/g_l.json | 129 ++++++++
test/example_browser_params/m_z.json | 300 ++++++++++++++++++
.../simple.json} | 0
test/test_js_instrument_py.py | 91 ++++++
7 files changed, 683 insertions(+), 9 deletions(-)
create mode 100644 test/example_browser_params/a_f.json
create mode 100644 test/example_browser_params/g_l.json
create mode 100644 test/example_browser_params/m_z.json
rename test/{test_browser_params_simple.json => example_browser_params/simple.json} (100%)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 61ff21195..2dbfa36fb 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -55,11 +55,12 @@ def validate(python_list_to_validate):
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
for request in python_list_to_validate:
- propertiesToInstrument = set(
- request['logSettings']['propertiesToInstrument'])
- excludedProperties = set(request['logSettings']['excludedProperties'])
- assert len(propertiesToInstrument.intersection(
- excludedProperties)) == 0
+ propertiesToInstrument = request['logSettings']['propertiesToInstrument']
+ if propertiesToInstrument is not None:
+ propertiesToInstrument = set(propertiesToInstrument)
+ excludedProperties = set(request['logSettings']['excludedProperties'])
+ assert len(propertiesToInstrument.intersection(
+ excludedProperties)) == 0
return True
@@ -87,7 +88,12 @@ def merge_object_requests(python_list):
for k, v in existing_logSettings.items():
# Special case for lists
if k in list_log_settings:
- v.extend(new_logSettings[k])
+ new_val = new_logSettings[k]
+ if (v is None) or (new_val is None):
+ raise RuntimeError(
+ f'Mismatching logSettings for object {obj}')
+ else:
+ v.extend(new_logSettings[k])
else:
if v != new_logSettings[k]:
print(v)
@@ -99,8 +105,18 @@ def merge_object_requests(python_list):
# Make sure list logSettings are unique
for request in merged_list:
for logSetting in list_log_settings:
- request['logSettings'][logSetting] = list(
- set(request['logSettings'][logSetting]))
+ list_setting_value = request['logSettings'][logSetting]
+ if list_setting_value is None:
+ continue
+ else:
+ if None in list_setting_value:
+ raise RuntimeError(
+ f'Mismatching logSettings for object {obj}')
+ else:
+ # Dedupe
+ request['logSettings'][logSetting] = list(
+ set(request['logSettings'][logSetting])
+ )
return merged_list
diff --git a/automation/js_instrumentation/js_instrument_modules.schema b/automation/js_instrumentation/js_instrument_modules.schema
index 897411653..84a9e0c65 100644
--- a/automation/js_instrumentation/js_instrument_modules.schema
+++ b/automation/js_instrumentation/js_instrument_modules.schema
@@ -21,7 +21,7 @@
"properties": {
"propertiesToInstrument": {
"description": "An array of properties to instrument on this object. If array is empty, then all properties are instrumented.",
- "type": "array",
+ "type": ["array", "null"],
"items": {
"type": "string"
},
diff --git a/test/example_browser_params/a_f.json b/test/example_browser_params/a_f.json
new file mode 100644
index 000000000..2a980f7af
--- /dev/null
+++ b/test/example_browser_params/a_f.json
@@ -0,0 +1,138 @@
+{
+ "crawl_id": 0,
+ "testing": true,
+ "js_instrument": true,
+ "js_instrument_modules": [
+ "AbortController",
+ "AbortSignal",
+ "AbstractRange",
+ "AnalyserNode",
+ "Animation",
+ "AnimationEffect",
+ "AnimationEvent",
+ "AnimationPlaybackEvent",
+ "AnimationTimeline",
+ {"Array": {"propertiesToInstrument": null}},
+ "ArrayBuffer",
+ {"Attr": {"propertiesToInstrument": null}},
+ "Audio",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "AudioContext",
+ "AudioDestinationNode",
+ "AudioListener",
+ "AudioNode",
+ "AudioParam",
+ "AudioProcessingEvent",
+ "AudioScheduledSourceNode",
+ "BarProp",
+ "BaseAudioContext",
+ "BeforeUnloadEvent",
+ "BigInt",
+ "BigInt64Array",
+ "BigUint64Array",
+ "BiquadFilterNode",
+ "Blob",
+ "BlobEvent",
+ "Boolean",
+ "BroadcastChannel",
+ "ByteLengthQueuingStrategy",
+ "CDATASection",
+ {"CSS": {"propertiesToInstrument": null}},
+ "CSS2Properties",
+ "CSSAnimation",
+ "CSSConditionRule",
+ "CSSCounterStyleRule",
+ "CSSFontFaceRule",
+ "CSSFontFeatureValuesRule",
+ "CSSGroupingRule",
+ "CSSImportRule",
+ "CSSKeyframeRule",
+ "CSSKeyframesRule",
+ "CSSMediaRule",
+ "CSSMozDocumentRule",
+ "CSSNamespaceRule",
+ "CSSPageRule",
+ "CSSRule",
+ "CSSRuleList",
+ "CSSStyleDeclaration",
+ "CSSStyleRule",
+ "CSSStyleSheet",
+ "CSSSupportsRule",
+ "CSSTransition",
+ "Cache",
+ "CacheStorage",
+ "CanvasCaptureMediaStream",
+ "CanvasGradient",
+ "CanvasPattern",
+ "CanvasRenderingContext2D",
+ "CaretPosition",
+ "ChannelMergerNode",
+ "ChannelSplitterNode",
+ "CharacterData",
+ "ClipboardEvent",
+ "CloseEvent",
+ "Comment",
+ "CompositionEvent",
+ "ConstantSourceNode",
+ "ConvolverNode",
+ "CountQueuingStrategy",
+ "Crypto",
+ "CustomElementRegistry",
+ "CustomEvent",
+ "DOMException",
+ "DOMImplementation",
+ "DOMMatrix",
+ "DOMMatrixReadOnly",
+ "DOMParser",
+ "DOMPoint",
+ "DOMPointReadOnly",
+ "DOMQuad",
+ "DOMRect",
+ "DOMRectList",
+ "DOMRectReadOnly",
+ "DOMRequest",
+ "DOMStringList",
+ "DOMStringMap",
+ "DOMTokenList",
+ "DataTransfer",
+ "DataTransferItem",
+ "DataTransferItemList",
+ "DataView",
+ {"Date": {"propertiesToInstrument": null}},
+ "DelayNode",
+ "DeviceMotionEvent",
+ "DeviceOrientationEvent",
+ "Directory",
+ {"Document": {"excludedProperties": ["dispatchEvent"]}},
+ "DocumentFragment",
+ "DocumentTimeline",
+ "DocumentType",
+ "DragEvent",
+ "DynamicsCompressorNode",
+ "Element",
+ {"Error": {"propertiesToInstrument": null}},
+ {"ErrorEvent": {"propertiesToInstrument": null}},
+ {"EvalError": {"propertiesToInstrument": null}},
+ {"Event": {"propertiesToInstrument": null}},
+ {"EventSource": {"propertiesToInstrument": null}},
+ {"EventTarget": {"propertiesToInstrument": null}},
+ "File",
+ "FileList",
+ "FileReader",
+ "FileSystem",
+ "FileSystemDirectoryEntry",
+ "FileSystemDirectoryReader",
+ "FileSystemEntry",
+ "FileSystemFileEntry",
+ "Float32Array",
+ "Float64Array",
+ "FocusEvent",
+ "FontFace",
+ "FontFaceSet",
+ "FontFaceSetLoadEvent",
+ "FormData",
+ "FormDataEvent",
+ {"Function": {"propertiesToInstrument": null}}
+ ]
+}
diff --git a/test/example_browser_params/g_l.json b/test/example_browser_params/g_l.json
new file mode 100644
index 000000000..70f77dc66
--- /dev/null
+++ b/test/example_browser_params/g_l.json
@@ -0,0 +1,129 @@
+{
+ "crawl_id": 0,
+ "testing": true,
+ "js_instrument": true,
+ "js_instrument_modules": [
+ "GainNode",
+ "Gamepad",
+ "GamepadButton",
+ "GamepadEvent",
+ "GamepadHapticActuator",
+ "GamepadPose",
+ "Geolocation",
+ "GeolocationPositionError",
+ "HTMLAllCollection",
+ "HTMLAnchorElement",
+ "HTMLAreaElement",
+ "HTMLAudioElement",
+ "HTMLBRElement",
+ "HTMLBaseElement",
+ "HTMLBodyElement",
+ "HTMLButtonElement",
+ "HTMLCanvasElement",
+ "HTMLCollection",
+ "HTMLDListElement",
+ "HTMLDataElement",
+ "HTMLDataListElement",
+ "HTMLDetailsElement",
+ "HTMLDirectoryElement",
+ "HTMLDivElement",
+ "HTMLDocument",
+ "HTMLElement",
+ "HTMLEmbedElement",
+ "HTMLFieldSetElement",
+ "HTMLFontElement",
+ "HTMLFormControlsCollection",
+ "HTMLFormElement",
+ "HTMLFrameElement",
+ "HTMLFrameSetElement",
+ "HTMLHRElement",
+ "HTMLHeadElement",
+ "HTMLHeadingElement",
+ "HTMLHtmlElement",
+ "HTMLIFrameElement",
+ "HTMLImageElement",
+ "HTMLInputElement",
+ "HTMLLIElement",
+ "HTMLLabelElement",
+ "HTMLLegendElement",
+ "HTMLLinkElement",
+ "HTMLMapElement",
+ "HTMLMarqueeElement",
+ "HTMLMediaElement",
+ "HTMLMenuElement",
+ "HTMLMenuItemElement",
+ "HTMLMetaElement",
+ "HTMLMeterElement",
+ "HTMLModElement",
+ "HTMLOListElement",
+ "HTMLObjectElement",
+ "HTMLOptGroupElement",
+ "HTMLOptionElement",
+ "HTMLOptionsCollection",
+ "HTMLOutputElement",
+ "HTMLParagraphElement",
+ "HTMLParamElement",
+ "HTMLPictureElement",
+ "HTMLPreElement",
+ "HTMLProgressElement",
+ "HTMLQuoteElement",
+ "HTMLScriptElement",
+ "HTMLSelectElement",
+ "HTMLSlotElement",
+ "HTMLSourceElement",
+ "HTMLSpanElement",
+ "HTMLStyleElement",
+ "HTMLTableCaptionElement",
+ "HTMLTableCellElement",
+ "HTMLTableColElement",
+ "HTMLTableElement",
+ "HTMLTableRowElement",
+ "HTMLTableSectionElement",
+ "HTMLTemplateElement",
+ "HTMLTextAreaElement",
+ "HTMLTimeElement",
+ "HTMLTitleElement",
+ "HTMLTrackElement",
+ "HTMLUListElement",
+ "HTMLUnknownElement",
+ "HTMLVideoElement",
+ "HashChangeEvent",
+ "Headers",
+ "History",
+ "IDBCursor",
+ "IDBCursorWithValue",
+ "IDBDatabase",
+ "IDBFactory",
+ "IDBFileHandle",
+ "IDBFileRequest",
+ "IDBIndex",
+ "IDBKeyRange",
+ "IDBMutableFile",
+ "IDBObjectStore",
+ "IDBOpenDBRequest",
+ "IDBRequest",
+ "IDBTransaction",
+ "IDBVersionChangeEvent",
+ "IIRFilterNode",
+ "IdleDeadline",
+ "Image",
+ "ImageBitmap",
+ "ImageBitmapRenderingContext",
+ "ImageData",
+ "Infinity",
+ "InputEvent",
+ "InstallTrigger",
+ "Int16Array",
+ "Int32Array",
+ "Int8Array",
+ "InternalError",
+ "IntersectionObserver",
+ "IntersectionObserverEntry",
+ "Intl",
+ "JSON",
+ "KeyEvent",
+ "KeyboardEvent",
+ "KeyframeEffect",
+ "Location"
+ ]
+}
diff --git a/test/example_browser_params/m_z.json b/test/example_browser_params/m_z.json
new file mode 100644
index 000000000..aaf9db4e0
--- /dev/null
+++ b/test/example_browser_params/m_z.json
@@ -0,0 +1,300 @@
+{
+ "crawl_id": 0,
+ "testing": true,
+ "js_instrument": true,
+ "js_instrument_modules": [
+ "Map",
+ "Math",
+ "MathMLElement",
+ "MediaCapabilities",
+ "MediaCapabilitiesInfo",
+ "MediaElementAudioSourceNode",
+ "MediaEncryptedEvent",
+ "MediaError",
+ "MediaKeyError",
+ "MediaKeyMessageEvent",
+ "MediaKeySession",
+ "MediaKeyStatusMap",
+ "MediaKeySystemAccess",
+ "MediaKeys",
+ "MediaList",
+ "MediaQueryList",
+ "MediaQueryListEvent",
+ "MediaRecorder",
+ "MediaRecorderErrorEvent",
+ "MediaSource",
+ "MediaStream",
+ "MediaStreamAudioDestinationNode",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamEvent",
+ "MediaStreamTrack",
+ "MediaStreamTrackAudioSourceNode",
+ "MediaStreamTrackEvent",
+ "MessageChannel",
+ "MessageEvent",
+ "MessagePort",
+ "MimeType",
+ "MimeTypeArray",
+ "MouseEvent",
+ "MouseScrollEvent",
+ "MutationEvent",
+ "MutationObserver",
+ "MutationRecord",
+ "NamedNodeMap",
+ "Navigator",
+ "Node",
+ "NodeFilter",
+ "NodeIterator",
+ "NodeList",
+ "Notification",
+ "Number",
+ "OfflineAudioCompletionEvent",
+ "OfflineAudioContext",
+ "Option",
+ "OscillatorNode",
+ "PageTransitionEvent",
+ "PaintRequest",
+ "PaintRequestList",
+ "PannerNode",
+ "Path2D",
+ "Performance",
+ "PerformanceEntry",
+ "PerformanceMark",
+ "PerformanceMeasure",
+ "PerformanceNavigation",
+ "PerformanceNavigationTiming",
+ "PerformanceObserver",
+ "PerformanceObserverEntryList",
+ "PerformanceResourceTiming",
+ "PerformanceTiming",
+ "PeriodicWave",
+ "PermissionStatus",
+ "Permissions",
+ "Plugin",
+ "PluginArray",
+ "PointerEvent",
+ "PopStateEvent",
+ "PopupBlockedEvent",
+ "ProcessingInstruction",
+ "ProgressEvent",
+ "Promise",
+ "PromiseRejectionEvent",
+ "Proxy",
+ "PushManager",
+ "PushSubscription",
+ "PushSubscriptionOptions",
+ "RTCCertificate",
+ "RTCDTMFSender",
+ "RTCDTMFToneChangeEvent",
+ "RTCDataChannel",
+ "RTCDataChannelEvent",
+ "RTCIceCandidate",
+ "RTCPeerConnection",
+ "RTCPeerConnectionIceEvent",
+ "RTCRtpReceiver",
+ "RTCRtpSender",
+ "RTCRtpTransceiver",
+ "RTCSessionDescription",
+ "RTCStatsReport",
+ "RTCTrackEvent",
+ "RadioNodeList",
+ "Range",
+ "RangeError",
+ "ReadableStream",
+ "ReferenceError",
+ "Reflect",
+ "RegExp",
+ "Request",
+ "ResizeObserver",
+ "ResizeObserverEntry",
+ "ResizeObserverSize",
+ "Response",
+ "SVGAElement",
+ "SVGAngle",
+ "SVGAnimateElement",
+ "SVGAnimateMotionElement",
+ "SVGAnimateTransformElement",
+ "SVGAnimatedAngle",
+ "SVGAnimatedBoolean",
+ "SVGAnimatedEnumeration",
+ "SVGAnimatedInteger",
+ "SVGAnimatedLength",
+ "SVGAnimatedLengthList",
+ "SVGAnimatedNumber",
+ "SVGAnimatedNumberList",
+ "SVGAnimatedPreserveAspectRatio",
+ "SVGAnimatedRect",
+ "SVGAnimatedString",
+ "SVGAnimatedTransformList",
+ "SVGAnimationElement",
+ "SVGCircleElement",
+ "SVGClipPathElement",
+ "SVGComponentTransferFunctionElement",
+ "SVGDefsElement",
+ "SVGDescElement",
+ "SVGElement",
+ "SVGEllipseElement",
+ "SVGFEBlendElement",
+ "SVGFEColorMatrixElement",
+ "SVGFEComponentTransferElement",
+ "SVGFECompositeElement",
+ "SVGFEConvolveMatrixElement",
+ "SVGFEDiffuseLightingElement",
+ "SVGFEDisplacementMapElement",
+ "SVGFEDistantLightElement",
+ "SVGFEDropShadowElement",
+ "SVGFEFloodElement",
+ "SVGFEFuncAElement",
+ "SVGFEFuncBElement",
+ "SVGFEFuncGElement",
+ "SVGFEFuncRElement",
+ "SVGFEGaussianBlurElement",
+ "SVGFEImageElement",
+ "SVGFEMergeElement",
+ "SVGFEMergeNodeElement",
+ "SVGFEMorphologyElement",
+ "SVGFEOffsetElement",
+ "SVGFEPointLightElement",
+ "SVGFESpecularLightingElement",
+ "SVGFESpotLightElement",
+ "SVGFETileElement",
+ "SVGFETurbulenceElement",
+ "SVGFilterElement",
+ "SVGForeignObjectElement",
+ "SVGGElement",
+ "SVGGeometryElement",
+ "SVGGradientElement",
+ "SVGGraphicsElement",
+ "SVGImageElement",
+ "SVGLength",
+ "SVGLengthList",
+ "SVGLineElement",
+ "SVGLinearGradientElement",
+ "SVGMPathElement",
+ "SVGMarkerElement",
+ "SVGMaskElement",
+ "SVGMatrix",
+ "SVGMetadataElement",
+ "SVGNumber",
+ "SVGNumberList",
+ "SVGPathElement",
+ "SVGPathSegList",
+ "SVGPatternElement",
+ "SVGPoint",
+ "SVGPointList",
+ "SVGPolygonElement",
+ "SVGPolylineElement",
+ "SVGPreserveAspectRatio",
+ "SVGRadialGradientElement",
+ "SVGRect",
+ "SVGRectElement",
+ "SVGSVGElement",
+ "SVGScriptElement",
+ "SVGSetElement",
+ "SVGStopElement",
+ "SVGStringList",
+ "SVGStyleElement",
+ "SVGSwitchElement",
+ "SVGSymbolElement",
+ "SVGTSpanElement",
+ "SVGTextContentElement",
+ "SVGTextElement",
+ "SVGTextPathElement",
+ "SVGTextPositioningElement",
+ "SVGTitleElement",
+ "SVGTransform",
+ "SVGTransformList",
+ "SVGUnitTypes",
+ "SVGUseElement",
+ "SVGViewElement",
+ "Screen",
+ "ScreenOrientation",
+ "ScriptProcessorNode",
+ "ScrollAreaEvent",
+ "SecurityPolicyViolationEvent",
+ "Selection",
+ "ServiceWorker",
+ "ServiceWorkerRegistration",
+ "Set",
+ "ShadowRoot",
+ "SharedWorker",
+ "SourceBuffer",
+ "SourceBufferList",
+ "SpeechSynthesis",
+ "SpeechSynthesisErrorEvent",
+ "SpeechSynthesisEvent",
+ "SpeechSynthesisUtterance",
+ "SpeechSynthesisVoice",
+ "StaticRange",
+ "StereoPannerNode",
+ "Storage",
+ "StorageEvent",
+ "String",
+ "StyleSheet",
+ "StyleSheetList",
+ "SubmitEvent",
+ "Symbol",
+ "SyntaxError",
+ "Text",
+ "TextDecoder",
+ "TextEncoder",
+ "TextMetrics",
+ "TextTrack",
+ "TextTrackCue",
+ "TextTrackCueList",
+ "TextTrackList",
+ "TimeEvent",
+ "TimeRanges",
+ "TrackEvent",
+ "TransitionEvent",
+ "TreeWalker",
+ "TypeError",
+ "UIEvent",
+ "URIError",
+ "URL",
+ "URLSearchParams",
+ "Uint16Array",
+ "Uint32Array",
+ "Uint8Array",
+ "Uint8ClampedArray",
+ "VTTCue",
+ "VTTRegion",
+ "ValidityState",
+ "VideoPlaybackQuality",
+ "VisualViewport",
+ "WaveShaperNode",
+ "WeakMap",
+ "WeakSet",
+ "WebAssembly",
+ "WebGL2RenderingContext",
+ "WebGLActiveInfo",
+ "WebGLBuffer",
+ "WebGLContextEvent",
+ "WebGLFramebuffer",
+ "WebGLProgram",
+ "WebGLQuery",
+ "WebGLRenderbuffer",
+ "WebGLRenderingContext",
+ "WebGLSampler",
+ "WebGLShader",
+ "WebGLShaderPrecisionFormat",
+ "WebGLSync",
+ "WebGLTexture",
+ "WebGLTransformFeedback",
+ "WebGLUniformLocation",
+ "WebGLVertexArrayObject",
+ "WebKitCSSMatrix",
+ "WebSocket",
+ "WheelEvent",
+ "Worker",
+ "XMLDocument",
+ "XMLHttpRequest",
+ "XMLHttpRequestEventTarget",
+ "XMLHttpRequestUpload",
+ "XMLSerializer",
+ "XPathEvaluator",
+ "XPathExpression",
+ "XPathResult",
+ "XSLTProcessor"
+ ]
+}
diff --git a/test/test_browser_params_simple.json b/test/example_browser_params/simple.json
similarity index 100%
rename from test/test_browser_params_simple.json
rename to test/example_browser_params/simple.json
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 81b024301..2fc08fa95 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -154,6 +154,97 @@ def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties
jsi.validate(merged)
+def test_merge_and_validate_multiple_overlap_properties(default_log_settings):
+ log_settings_1 = default_log_settings.copy()
+ log_settings_2 = default_log_settings.copy()
+ log_settings_merge = default_log_settings.copy()
+ log_settings_1['propertiesToInstrument'] = ['name', 'place']
+ log_settings_2['propertiesToInstrument'] = ['localStorage']
+ log_settings_merge['propertiesToInstrument'] = ['name', 'place', 'localStorage']
+ dupe_input = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_1
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_2
+ },
+ ]
+ expected_de_dupe_output = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_merge
+ },
+ ]
+ actual_output = jsi.merge_object_requests(dupe_input)
+ for key in ['object', 'instrumentedName']:
+ assert expected_de_dupe_output[0][key] == actual_output[0][key]
+ assert set(expected_de_dupe_output[0]['logSettings']) == \
+ set(actual_output[0]['logSettings'])
+
+
+def test_merge_when_log_settings_is_null(default_log_settings):
+ # It's valid to send None to log settings.
+ # In that case, merging with another list would be a
+ # mismatch. But just asking for null should be allowed.
+
+ log_settings_some = default_log_settings.copy()
+ log_settings_none = default_log_settings.copy()
+ log_settings_some['propertiesToInstrument'] = ['name', 'place']
+ log_settings_none['propertiesToInstrument'] = None
+ input_1 = [
+ {
+ 'object': 'window.document',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_none
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_some
+ },
+ ]
+ actual_output = jsi.merge_object_requests(input_1)
+ assert actual_output == input_1
+
+ input_2 = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_some
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_none
+ },
+ ]
+ with pytest.raises(RuntimeError) as error:
+ jsi.merge_object_requests(input_2)
+ assert 'Mismatching logSettings' in str(error.value)
+
+ input_3 = [
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_none
+ },
+ {
+ 'object': 'window',
+ 'instrumentedName': 'window',
+ 'logSettings': log_settings_some
+ },
+ ]
+ with pytest.raises(RuntimeError) as error:
+ jsi.merge_object_requests(input_3)
+ assert 'Mismatching logSettings' in str(error.value)
+
+
+
def test_merge_diff_instrumented_names(default_log_settings):
dupe_input = [
{
From 4a3f3b3bea272a9f57901294b24ad5fef15fb36d Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 23:31:44 -0500
Subject: [PATCH 069/106] flake8
---
automation/JSInstrumentation.py | 6 ++++--
test/test_js_instrument_py.py | 6 +++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 2dbfa36fb..728b415a7 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -55,10 +55,12 @@ def validate(python_list_to_validate):
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
for request in python_list_to_validate:
- propertiesToInstrument = request['logSettings']['propertiesToInstrument']
+ propertiesToInstrument = \
+ request['logSettings']['propertiesToInstrument']
if propertiesToInstrument is not None:
propertiesToInstrument = set(propertiesToInstrument)
- excludedProperties = set(request['logSettings']['excludedProperties'])
+ excludedProperties = set(
+ request['logSettings']['excludedProperties'])
assert len(propertiesToInstrument.intersection(
excludedProperties)) == 0
return True
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 2fc08fa95..fbcbfa25b 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -160,7 +160,8 @@ def test_merge_and_validate_multiple_overlap_properties(default_log_settings):
log_settings_merge = default_log_settings.copy()
log_settings_1['propertiesToInstrument'] = ['name', 'place']
log_settings_2['propertiesToInstrument'] = ['localStorage']
- log_settings_merge['propertiesToInstrument'] = ['name', 'place', 'localStorage']
+ log_settings_merge['propertiesToInstrument'] = [
+ 'name', 'place', 'localStorage']
dupe_input = [
{
'object': 'window',
@@ -184,7 +185,7 @@ def test_merge_and_validate_multiple_overlap_properties(default_log_settings):
for key in ['object', 'instrumentedName']:
assert expected_de_dupe_output[0][key] == actual_output[0][key]
assert set(expected_de_dupe_output[0]['logSettings']) == \
- set(actual_output[0]['logSettings'])
+ set(actual_output[0]['logSettings'])
def test_merge_when_log_settings_is_null(default_log_settings):
@@ -244,7 +245,6 @@ def test_merge_when_log_settings_is_null(default_log_settings):
assert 'Mismatching logSettings' in str(error.value)
-
def test_merge_diff_instrumented_names(default_log_settings):
dupe_input = [
{
From f2bb845b7ee68ce0718326e6a8f0758771b0c0ee Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 23:43:32 -0500
Subject: [PATCH 070/106] Move example browser_params file out of harms way
---
.../all.json} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename test/{test_browser_params_all.json => example_browser_params/all.json} (100%)
diff --git a/test/test_browser_params_all.json b/test/example_browser_params/all.json
similarity index 100%
rename from test/test_browser_params_all.json
rename to test/example_browser_params/all.json
From 57ed0e374fc70992b32c725a16db7896c8c3b44f Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 21 May 2020 23:54:27 -0500
Subject: [PATCH 071/106] Add failing test for regression I introduced.
---
test/test_js_instrument.py | 36 +++++++++++++
..._not_recurse_properties_to_instrument.html | 52 +++++++++++++++++++
2 files changed, 88 insertions(+)
create mode 100644 test/test_pages/js_instrument/instrument_do_not_recurse_properties_to_instrument.html
diff --git a/test/test_js_instrument.py b/test/test_js_instrument.py
index c4e6facba..fc6dd5edf 100644
--- a/test/test_js_instrument.py
+++ b/test/test_js_instrument.py
@@ -324,3 +324,39 @@ def test_instrument_object(self):
)
assert observed_calls == self.SET_PREVENT_CALLS
assert observed_gets_and_sets == self.SET_PREVENT_GETS_AND_SETS
+
+
+class TestJSInstrumentRecursiveProperties(OpenWPMJSTest):
+ # Since the window property remains non-existing, attempts to
+ # access the window property's attributes first fails when evaluating
+ # the non-existing window property, thus preventing us from receiving
+ # events about the attributes that were attempted to be accessed
+ # This is why we don't see any gets to window.nonExisting.nonExistingProp1
+ # etc below
+
+ GETS_AND_SETS = {
+ ("window.test.prop1", "get", "test_prop1"),
+ # At the nested level we have both because the propertiesToInstrument
+ # was not propogated down.
+ ("window.test.test.prop1", "get", "test_test_prop1"),
+ ("window.test.test.prop2", "get", "test_test_prop2"),
+ }
+
+ METHOD_CALLS = set()
+
+ TEST_PAGE = "instrument_do_not_recurse_properties_to_instrument.html"
+ TOP_URL = (
+ u"%s/js_instrument/%s" % (util.BASE_TEST_URL, TEST_PAGE)
+ )
+
+ def test_instrument_object(self):
+ """ Ensure instrumentObject logs all property gets, sets, and calls """
+ db = self.visit('/js_instrument/%s' % self.TEST_PAGE)
+ self._check_calls(
+ db=db,
+ symbol_prefix='',
+ doc_url=self.TOP_URL,
+ top_url=self.TOP_URL,
+ expected_method_calls=self.METHOD_CALLS,
+ expected_gets_and_sets=self.GETS_AND_SETS,
+ )
diff --git a/test/test_pages/js_instrument/instrument_do_not_recurse_properties_to_instrument.html b/test/test_pages/js_instrument/instrument_do_not_recurse_properties_to_instrument.html
new file mode 100644
index 000000000..a854c3993
--- /dev/null
+++ b/test/test_pages/js_instrument/instrument_do_not_recurse_properties_to_instrument.html
@@ -0,0 +1,52 @@
+
+
+
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting recursive properties
+
+
+ Test page for JS Instrument's instrumentJS method - specifically instrumenting recursive properies.
+ This page defines several types of objects and tests the js
+ instrument's instrumentJS() method.
+ NOTE: The platform config option `manager_params['testing']` must be set
+ to True otherwise the instrumentJS method won't be exposed to this
+ test script.
+
+
+
+
+
From b9a6369b08d35fbe3b55612f048461fc6afb4b13 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Fri, 22 May 2020 00:14:23 -0500
Subject: [PATCH 072/106] Fix for regression.
---
.../Extension/webext-instrumentation/src/lib/js-instruments.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index cc0c19b1f..5a5eda7f0 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -694,9 +694,11 @@ export function getInstrumentJS(event_id: string, sendMessagesToLogger) {
isObject(object, propertyName) &&
propertyName !== "__proto__"
) {
+
const newInstrumentedName = `${instrumentedName}.${propertyName}`;
const newLogSettings = { ...logSettings };
newLogSettings.depth = logSettings.depth - 1;
+ newLogSettings.propertiesToInstrument = [];
instrumentObject(
object[propertyName],
newInstrumentedName,
From bfbe19be658295c8b8bbeb6a8becb7d060efef64 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Fri, 22 May 2020 00:15:51 -0500
Subject: [PATCH 073/106] Add simple mimeTypes and plugins to fingerprinting.
---
automation/js_instrumentation/fingerprinting.json | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/fingerprinting.json
index 0af12e021..ea327a291 100644
--- a/automation/js_instrumentation/fingerprinting.json
+++ b/automation/js_instrumentation/fingerprinting.json
@@ -54,5 +54,7 @@
"vendorSub",
"vendor"
]
- }}
+ }},
+ "window.navigator.mimeTypes",
+ "window.navigator.plugins"
]
\ No newline at end of file
From 17830d494fb88ffdd522058a864cde4e48fce530 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Fri, 22 May 2020 00:21:03 -0500
Subject: [PATCH 074/106] Lint JS
---
.../Extension/webext-instrumentation/src/lib/js-instruments.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 5a5eda7f0..331b7e05f 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -694,7 +694,6 @@ export function getInstrumentJS(event_id: string, sendMessagesToLogger) {
isObject(object, propertyName) &&
propertyName !== "__proto__"
) {
-
const newInstrumentedName = `${instrumentedName}.${propertyName}`;
const newLogSettings = { ...logSettings };
newLogSettings.depth = logSettings.depth - 1;
From 514c6824fc42f80290c109900022699e792dfbc2 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 19:59:34 -0500
Subject: [PATCH 075/106] Rm mdn_browser_comat stuff no longer needed
---
.../scripts/make_mdn_browser_compat_file.js | 34 -
docs/mdn_browser_compat_data.py | 748 -----------------
docs/window_getOwnPropertyNames.csv | 780 ------------------
docs/window_getOwnPropertyNames.json | 1 -
4 files changed, 1563 deletions(-)
delete mode 100755 automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
delete mode 100644 docs/mdn_browser_compat_data.py
delete mode 100644 docs/window_getOwnPropertyNames.csv
delete mode 100644 docs/window_getOwnPropertyNames.json
diff --git a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js b/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
deleted file mode 100755
index 1ed3f8d14..000000000
--- a/automation/Extension/webext-instrumentation/scripts/make_mdn_browser_compat_file.js
+++ /dev/null
@@ -1,34 +0,0 @@
-const bcd = require('mdn-browser-compat-data');
-const fs = require('fs')
-
-const BROWSER = 'firefox'
-const VERSION = 75
-
-const api = [];
-Object.keys(bcd.api).forEach(item => {
- try {
- let version_added = bcd.api[item].__compat.support.firefox.version_added;
- if ( ( version_added !== null ) && ( version_added <= VERSION ) ) {
- api.push(`"${item}"`);
- }
- } catch(error) {
- console.log(error);
- }
-});
-
-const output = `
-# This file is generated from mdn-browser-compat-data by running
-# "npm run make-compat" in the Extension/webext-instrumentation
-# directory.
-api = [
- ${api.join(',\n ')}
-]`
-fs.writeFile(
- '../../../docs/mdn_browser_compat_data.py',
- output,
- (err) => {
- if(err) {
- return console.log(err);
- }
- console.log("../../../docs/mdn_browser_compat_data.py regenerated.");
-});
\ No newline at end of file
diff --git a/docs/mdn_browser_compat_data.py b/docs/mdn_browser_compat_data.py
deleted file mode 100644
index 052b18cc4..000000000
--- a/docs/mdn_browser_compat_data.py
+++ /dev/null
@@ -1,748 +0,0 @@
-
-# This file is generated from mdn-browser-compat-data by running
-# "npm run make-compat" in the Extension/webext-instrumentation
-# directory.
-api = [
- "ANGLE_instanced_arrays",
- "AbortController",
- "AbortSignal",
- "AbstractRange",
- "AbstractWorker",
- "AnalyserNode",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "Attr",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioContextOptions",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioNodeOptions",
- "AudioParam",
- "AudioProcessingEvent",
- "AudioTrackList",
- "AuthenticationAssertion",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "BackgroundFetchEvent",
- "BackgroundFetchManager",
- "BackgroundFetchRecord",
- "BackgroundFetchRegistration",
- "BackgroundFetchUpdateUIEvent",
- "BaseAudioContext",
- "BasicCardRequest",
- "BasicCardResponse",
- "BeforeInstallPromptEvent",
- "BeforeUnloadEvent",
- "BiquadFilterNode",
- "Blob",
- "BlobBuilder",
- "BlobEvent",
- "Bluetooth",
- "BluetoothAdvertisingData",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "BroadcastChannel",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "Cache",
- "CacheStorage",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ChildNode",
- "Client",
- "Clients",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ConstrainBoolean",
- "ConstrainDOMString",
- "ConstrainDouble",
- "ConstrainLong",
- "ConstrainULong",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Credential",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoKeyPair",
- "CustomEvent",
- "DOMConfiguration",
- "DOMError",
- "DOMErrorHandler",
- "DOMException",
- "DOMHighResTimestamp",
- "DOMImplementation",
- "DOMImplementationList",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointInit",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectReadOnly",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DedicatedWorkerGlobalScope",
- "DelayNode",
- "DeviceMotionEvent",
- "DeviceOrientationEvent",
- "DirectoryEntrySync",
- "DirectoryReaderSync",
- "Document",
- "DocumentFragment",
- "DocumentOrShadowRoot",
- "DocumentType",
- "DoubleRange",
- "DragEvent",
- "DynamicsCompressorNode",
- "EXT_blend_minmax",
- "EXT_color_buffer_float",
- "EXT_color_buffer_half_float",
- "EXT_disjoint_timer_query",
- "EXT_float_blend",
- "EXT_frag_depth",
- "EXT_sRGB",
- "EXT_shader_texture_lod",
- "EXT_texture_compression_bptc",
- "EXT_texture_compression_rgtc",
- "EXT_texture_filter_anisotropic",
- "EffectTiming",
- "Element",
- "EntrySync",
- "ErrorEvent",
- "Event",
- "EventListener",
- "EventSource",
- "EventTarget",
- "ExtendableEvent",
- "ExtendableMessageEvent",
- "External",
- "FeaturePolicy",
- "FetchEvent",
- "FileEntrySync",
- "FileError",
- "FileException",
- "FileList",
- "FileReader",
- "FileReaderSync",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FileSystemFlags",
- "FileSystemSync",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "FullscreenOptions",
- "GainNode",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeometryUtils",
- "GestureEvent",
- "GlobalEventHandlers",
- "HMDVRDevice",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLContentElement",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLHyperlinkElementUtils",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "History",
- "IDBDatabaseException",
- "IDBLocaleAwareKeyRange",
- "IDBVersionChangeRequest",
- "IIRFilterNode",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageData",
- "InputEvent",
- "InstallEvent",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LargestContentfulPaint",
- "LayoutShift",
- "LayoutShiftAttribution",
- "LocalFileSystem",
- "LocalFileSystemSync",
- "LocalMediaStream",
- "Location",
- "LongRange",
- "MIDIAccess",
- "MSGestureEvent",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaQueryListListener",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamAudioSourceOptions",
- "MediaStreamConstraints",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackAudioSourceOptions",
- "MediaStreamTrackEvent",
- "MediaTrackConstraints",
- "MediaTrackSettings",
- "MediaTrackSupportedConstraints",
- "MerchantValidationEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Metadata",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MutationObserver",
- "MutationObserverInit",
- "MutationRecord",
- "NDEFMessage",
- "NDEFReader",
- "NDEFReadingEvent",
- "NDEFRecord",
- "NDEFWriter",
- "NavigationPreloadManager",
- "Navigator",
- "NavigatorConcurrentHardware",
- "NavigatorID",
- "NavigatorLanguage",
- "NavigatorOnLine",
- "NavigatorPlugins",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "NonDocumentTypeChildNode",
- "Notation",
- "NotificationEvent",
- "OES_element_index_uint",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "OES_texture_half_float",
- "OES_texture_half_float_linear",
- "OES_vertex_array_object",
- "OVR_multiview2",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OffscreenCanvas",
- "OscillatorNode",
- "PageTransitionEvent",
- "PannerNode",
- "ParentNode",
- "Path2D",
- "PaymentAddress",
- "PaymentCurrencyAmount",
- "PaymentDetailsBase",
- "PaymentDetailsInit",
- "PaymentDetailsUpdate",
- "PaymentInstruments",
- "PaymentItem",
- "PaymentManager",
- "PaymentMethodChangeEvent",
- "PaymentRequest",
- "PaymentRequestEvent",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceEventTiming",
- "PerformanceFrameTiming",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "Plugin",
- "PluginArray",
- "Point",
- "PopStateEvent",
- "PositionOptions",
- "PositionSensorVRDevice",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "PublicKeyCredential",
- "PublicKeyCredentialCreationOptions",
- "PublicKeyCredentialRequestOptions",
- "PushEvent",
- "PushManager",
- "PushMessageData",
- "PushSubscription",
- "PushSubscriptionOptions",
- "RTCAnswerOptions",
- "RTCCertificate",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannelEvent",
- "RTCDtlsTransport",
- "RTCIceCandidate",
- "RTCIceCandidateInit",
- "RTCIceCandidatePairStats",
- "RTCIceCandidateStats",
- "RTCIceCandidateType",
- "RTCIceComponent",
- "RTCIceCredentialType",
- "RTCIceServer",
- "RTCIceTransport",
- "RTCIdentityErrorEvent",
- "RTCOfferAnswerOptions",
- "RTCPeerConnection",
- "RTCPeerConnectionIceEvent",
- "RTCRtpContributingSource",
- "RTCRtpEncodingParameters",
- "RTCRtpReceiver",
- "RTCRtpSendParameters",
- "RTCRtpSender",
- "RTCRtpSynchronizationSource",
- "RTCRtpTransceiver",
- "RTCRtpTransceiverDirection",
- "RTCRtpTransceiverInit",
- "RTCSctpTransport",
- "RTCSessionDescription",
- "RTCSessionDescriptionCallback",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RTCTrackEventInit",
- "RadioNodeList",
- "Range",
- "ReadableByteStreamController",
- "ReadableStreamBYOBReader",
- "ReadableStreamBYOBRequest",
- "RequestDestination",
- "ResizeObserver",
- "ResizeObserverEntry",
- "SVGAElement",
- "SVGAltGlyphElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGExternalResourcesRequired",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMeshElement",
- "SVGMetadataElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTSpanElement",
- "SVGTests",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGUnitTypes",
- "SVGUseElement",
- "SVGViewElement",
- "ScopedCredential",
- "ScopedCredentialInfo",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollToOptions",
- "Selection",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerGlobalScope",
- "ServiceWorkerMessageEvent",
- "ServiceWorkerRegistration",
- "SharedWorker",
- "SharedWorkerGlobalScope",
- "SpeechGrammar",
- "SpeechGrammarList",
- "SpeechRecognition",
- "SpeechRecognitionAlternative",
- "SpeechRecognitionErrorEvent",
- "SpeechRecognitionEvent",
- "SpeechRecognitionResult",
- "SpeechRecognitionResultList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEstimate",
- "StorageEvent",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "SyncManager",
- "TaskAttributionTiming",
- "Text",
- "TextDecoderStream",
- "TextEncoderStream",
- "TextMetrics",
- "TextTrack",
- "TextTrackList",
- "TimeRanges",
- "TrackDefault",
- "TrackDefaultList",
- "Transferable",
- "TransformStream",
- "TransformStreamDefaultController",
- "TransitionEvent",
- "TreeWalker",
- "UIEvent",
- "ULongRange",
- "URL",
- "URLSearchParams",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "USBPermissionResult",
- "UserDataHandler",
- "VTTCue",
- "ValidityState",
- "VideoTrackList",
- "VisualViewport",
- "WEBGL_color_buffer_float",
- "WEBGL_compressed_texture_astc",
- "WEBGL_compressed_texture_etc",
- "WEBGL_compressed_texture_etc1",
- "WEBGL_compressed_texture_s3tc_srgb",
- "WEBGL_debug_shaders",
- "WaveShaperNode",
- "WebAuthentication",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebGLVertexArrayObjectOES",
- "WheelEvent",
- "Window",
- "WindowClient",
- "WindowEventHandlers",
- "WindowOrWorkerGlobalScope",
- "Worker",
- "WorkerGlobalScope",
- "WorkerLocation",
- "WorkerNavigator",
- "Worklet",
- "WritableStream",
- "WritableStreamDefaultController",
- "WritableStreamDefaultWriter",
- "XDomainRequest",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathExpression",
- "XPathResult",
- "XRBoundedReferenceSpace",
- "XREnvironmentBlendMode",
- "XREye",
- "XRFrame",
- "XRFrameRequestCallback",
- "XRInputSource",
- "XRInputSourceArray",
- "XRInputSourceEvent",
- "XRInputSourcesChangeEvent",
- "XRPermissionDescriptor",
- "XRPermissionStatus",
- "XRPose",
- "XRReferenceSpace",
- "XRReferenceSpaceEvent",
- "XRRigidTransform",
- "XRSession",
- "XRSessionEvent",
- "XRSessionMode",
- "XRSpace",
- "XRSystem",
- "XRView",
- "XRViewerPose",
- "XRViewport",
- "XRWebGLLayer",
- "XRWebGLLayerInit",
- "XSLTProcessor"
-]
diff --git a/docs/window_getOwnPropertyNames.csv b/docs/window_getOwnPropertyNames.csv
deleted file mode 100644
index dca814c99..000000000
--- a/docs/window_getOwnPropertyNames.csv
+++ /dev/null
@@ -1,780 +0,0 @@
-​0: undefined
-1: Boolean
-2: Date
-3: Math
-4: Number
-5: String
-6: RegExp
-7: InternalError
-8: EvalError
-9: RangeError
-10: URIError
-11: ArrayBuffer
-12: Int8Array
-13: Uint8Array
-14: Int16Array
-15: Uint16Array
-16: Int32Array
-17: Uint32Array
-18: Float32Array
-19: Float64Array
-20: Uint8ClampedArray
-21: BigInt64Array
-22: BigUint64Array
-23: BigInt
-24: Proxy
-25: WeakMap
-26: Map
-27: Set
-28: DataView
-29: Symbol
-30: Intl
-31: Reflect
-32: WeakSet
-33: ReadableStream
-34: ByteLengthQueuingStrategy
-35: CountQueuingStrategy
-36: WebAssembly
-37: NaN
-38: Infinity
-39: isNaN
-40: isFinite
-41: parseFloat
-42: parseInt
-43: escape
-44: unescape
-45: decodeURI
-46: encodeURI
-47: decodeURIComponent
-48: encodeURIComponent
-49: SVGFEDiffuseLightingElement
-50: Attr
-51: PerformanceTiming
-52: DOMTokenList
-53: RTCDTMFToneChangeEvent
-54: WebGLActiveInfo
-55: SVGFEOffsetElement
-56: HTMLFrameElement
-57: FontFace
-58: ConvolverNode
-59: BeforeUnloadEvent
-60: HTMLDetailsElement
-61: TextTrackCue
-62: PerformanceObserverEntryList
-63: SubmitEvent
-64: CustomElementRegistry
-65: SVGComponentTransferFunctionElement
-66: ScrollAreaEvent
-67: KeyEvent
-68: SVGNumber
-69: DOMException
-70: SVGGraphicsElement
-71: HTMLFrameSetElement
-72: PerformanceObserver
-73: SVGAnimatedLength
-74: HTMLSlotElement
-75: RTCStatsReport
-76: SVGPreserveAspectRatio
-77: ResizeObserverEntry
-78: HTMLMeterElement
-79: SVGElement
-80: ImageData
-81: CloseEvent
-82: XMLSerializer
-83: CharacterData
-84: HTMLAudioElement
-85: DocumentType
-86: DOMStringMap
-87: WebGLUniformLocation
-88: RTCRtpSender
-89: CSS2Properties
-90: HTMLSourceElement
-91: MediaRecorder
-92: GamepadHapticActuator
-93: PaintRequest
-94: SVGPathElement
-95: MediaStreamTrackAudioSourceNode
-96: Selection
-97: SVGAElement
-98: SpeechSynthesisVoice
-99: SVGFETileElement
-100: FormDataEvent
-101: DataTransfer
-102: SourceBufferList
-103: DeviceOrientationEvent
-104: IDBOpenDBRequest
-105: StereoPannerNode
-106: ServiceWorkerRegistration
-107: OfflineAudioCompletionEvent
-108: Image
-109: RTCDTMFSender
-110: SVGSVGElement
-111: StyleSheet
-112: SVGSetElement
-113: TreeWalker
-114: PointerEvent
-115: HTMLOListElement
-116: CSSAnimation
-117: TextDecoder
-118: WebGLRenderbuffer
-119: Range
-120: FileSystemEntry
-121: WebGLSync
-122: RTCCertificate
-123: HTMLIFrameElement
-124: ScreenOrientation
-125: CaretPosition
-126: HTMLTableCaptionElement
-127: HTMLCanvasElement
-128: DynamicsCompressorNode
-129: SVGTextElement
-130: HTMLSelectElement
-131: HTMLHRElement
-132: mozRTCPeerConnection
-133: mozRTCSessionDescription
-134: XPathExpression
-135: SVGScriptElement
-136: WebGLRenderingContext
-137: SVGFEPointLightElement
-138: CSSRule
-139: MediaStreamTrackEvent
-140: SVGFilterElement
-141: SVGFEFuncGElement
-142: SVGFEDisplacementMapElement
-143: Storage
-144: WebGLFramebuffer
-145: FileSystemDirectoryEntry
-146: DataTransferItem
-147: WebGLTransformFeedback
-148: MutationEvent
-149: PerformanceNavigationTiming
-150: VisualViewport
-151: MediaKeySession
-152: XMLHttpRequestUpload
-153: BroadcastChannel
-154: HTMLMenuElement
-155: HTMLMapElement
-156: Gamepad
-157: CSSMediaRule
-158: WebGLSampler
-159: HTMLFormControlsCollection
-160: SVGSymbolElement
-161: SVGLengthList
-162: SVGFEComponentTransferElement
-163: TimeRanges
-164: SVGMatrix
-165: SVGFEConvolveMatrixElement
-166: WebGLProgram
-167: SVGAnimatedNumber
-168: DOMPointReadOnly
-169: SVGFECompositeElement
-170: Animation
-171: MouseEvent
-172: CacheStorage
-173: SVGAnimateTransformElement
-174: MediaKeyMessageEvent
-175: MessageEvent
-176: IntersectionObserverEntry
-177: SharedWorker
-178: TrackEvent
-179: SVGStyleElement
-180: MediaStreamEvent
-181: SVGFEGaussianBlurElement
-182: SVGRect
-183: SVGPathSegList
-184: DOMPoint
-185: ErrorEvent
-186: CSSStyleSheet
-187: CSS
-188: webkitURL
-189: MathMLElement
-190: AudioScheduledSourceNode
-191: Cache
-192: MediaKeys
-193: NodeIterator
-194: AudioBuffer
-195: SVGAnimatedAngle
-196: BaseAudioContext
-197: IDBVersionChangeEvent
-198: NodeList
-199: IDBIndex
-200: AudioNode
-201: TimeEvent
-202: DeviceMotionEvent
-203: AnimationEffect
-204: SVGFEDropShadowElement
-205: Path2D
-206: RTCRtpTransceiver
-207: SVGAnimateMotionElement
-208: TextTrackList
-209: HTMLTableRowElement
-210: HTMLLIElement
-211: AnimationTimeline
-212: IntersectionObserver
-213: Response
-214: HTMLFormElement
-215: AudioProcessingEvent
-216: RTCDataChannelEvent
-217: MediaQueryList
-218: IDBFileRequest
-219: IDBFileHandle
-220: CSSCounterStyleRule
-221: HTMLOptionElement
-222: CSSGroupingRule
-223: DOMStringList
-224: ImageBitmapRenderingContext
-225: GamepadEvent
-226: ImageBitmap
-227: OfflineAudioContext
-228: FileSystemDirectoryReader
-229: CSSKeyframesRule
-230: XPathResult
-231: SVGTextPositioningElement
-232: HTMLHeadingElement
-233: HTMLFieldSetElement
-234: SVGFEBlendElement
-235: InputEvent
-236: WebGL2RenderingContext
-237: DataTransferItemList
-238: ChannelSplitterNode
-239: SVGLength
-240: CSSConditionRule
-241: SVGEllipseElement
-242: WebGLShaderPrecisionFormat
-243: GamepadButton
-244: HTMLTableCellElement
-245: HTMLTextAreaElement
-246: CDATASection
-247: SVGAnimateElement
-248: HTMLTitleElement
-249: FormData
-250: HTMLPreElement
-251: HTMLOutputElement
-252: SVGGradientElement
-253: IDBRequest
-254: CSSStyleRule
-255: Permissions
-256: MediaCapabilitiesInfo
-257: CanvasCaptureMediaStream
-258: SVGAnimatedRect
-259: PannerNode
-260: SecurityPolicyViolationEvent
-261: AnimationPlaybackEvent
-262: WebGLShader
-263: HTMLTimeElement
-264: SVGDescElement
-265: HTMLMarqueeElement
-266: HTMLFontElement
-267: KeyframeEffect
-268: SVGUseElement
-269: GainNode
-270: SVGImageElement
-271: HTMLStyleElement
-272: SVGForeignObjectElement
-273: MessagePort
-274: SVGFEDistantLightElement
-275: StorageEvent
-276: PopStateEvent
-277: Text
-278: GeolocationPositionError
-279: SVGDefsElement
-280: MediaKeyStatusMap
-281: DOMRectReadOnly
-282: SVGRectElement
-283: IDBCursor
-284: AudioBufferSourceNode
-285: SVGFEColorMatrixElement
-286: CSSNamespaceRule
-287: MediaStreamAudioDestinationNode
-288: XPathEvaluator
-289: DocumentFragment
-290: WebSocket
-291: WebGLQuery
-292: HTMLUListElement
-293: Blob
-294: HTMLVideoElement
-295: VideoPlaybackQuality
-296: DelayNode
-297: AudioParam
-298: MediaStream
-299: MouseScrollEvent
-300: IDBDatabase
-301: PushSubscriptionOptions
-302: Request
-303: HTMLImageElement
-304: ClipboardEvent
-305: IDBKeyRange
-306: VTTCue
-307: MediaCapabilities
-308: NamedNodeMap
-309: MutationObserver
-310: HTMLOptGroupElement
-311: RTCTrackEvent
-312: SVGPoint
-313: BlobEvent
-314: MutationRecord
-315: HTMLQuoteElement
-316: FileReader
-317: CanvasPattern
-318: SVGStopElement
-319: RadioNodeList
-320: SVGUnitTypes
-321: MimeTypeArray
-322: Screen
-323: PopupBlockedEvent
-324: WaveShaperNode
-325: IDBFactory
-326: PromiseRejectionEvent
-327: ResizeObserver
-328: MimeType
-329: SVGAnimatedLengthList
-330: Audio
-331: SVGTransform
-332: SpeechSynthesisErrorEvent
-333: RTCPeerConnection
-334: CSSImportRule
-335: PaintRequestList
-336: SVGFESpotLightElement
-337: DOMParser
-338: BiquadFilterNode
-339: Notification
-340: Headers
-341: HTMLPictureElement
-342: SVGCircleElement
-343: SVGFETurbulenceElement
-344: AnimationEvent
-345: MediaKeyError
-346: HTMLLegendElement
-347: AnalyserNode
-348: SVGPatternElement
-349: IDBCursorWithValue
-350: DOMRequest
-351: CSSFontFaceRule
-352: History
-353: SVGSwitchElement
-354: PerformanceMark
-355: DOMQuad
-356: MediaKeySystemAccess
-357: SVGTitleElement
-358: FontFaceSet
-359: SVGTransformList
-360: SVGNumberList
-361: TextMetrics
-362: SpeechSynthesisUtterance
-363: WheelEvent
-364: HTMLCollection
-365: SVGFEMorphologyElement
-366: IDBTransaction
-367: DOMMatrixReadOnly
-368: PeriodicWave
-369: MediaRecorderErrorEvent
-370: MediaStreamAudioSourceNode
-371: SVGLineElement
-372: ProcessingInstruction
-373: VTTRegion
-374: PerformanceEntry
-375: URL
-376: GamepadPose
-377: HTMLBodyElement
-378: CanvasRenderingContext2D
-379: SVGMPathElement
-380: SVGFEFuncBElement
-381: XSLTProcessor
-382: HTMLInputElement
-383: WebGLContextEvent
-384: HTMLMenuItemElement
-385: MediaQueryListEvent
-386: PermissionStatus
-387: HTMLDataElement
-388: SVGFEImageElement
-389: SVGAnimatedBoolean
-390: Geolocation
-391: HashChangeEvent
-392: MediaSource
-393: PluginArray
-394: WebGLBuffer
-395: IIRFilterNode
-396: ScriptProcessorNode
-397: CompositionEvent
-398: CSSRuleList
-399: SVGFEFuncRElement
-400: DragEvent
-401: SVGFESpecularLightingElement
-402: SVGPolylineElement
-403: StaticRange
-404: SVGGeometryElement
-405: ResizeObserverSize
-406: AudioDestinationNode
-407: FontFaceSetLoadEvent
-408: SVGTSpanElement
-409: mozRTCIceCandidate
-410: HTMLParagraphElement
-411: CSSKeyframeRule
-412: MessageChannel
-413: SVGFEFuncAElement
-414: Plugin
-415: SVGLinearGradientElement
-416: PerformanceNavigation
-417: Comment
-418: HTMLMediaElement
-419: ShadowRoot
-420: WebKitCSSMatrix
-421: OscillatorNode
-422: ProgressEvent
-423: HTMLTrackElement
-424: HTMLDirectoryElement
-425: URLSearchParams
-426: HTMLParamElement
-427: SpeechSynthesis
-428: TextTrack
-429: MediaElementAudioSourceNode
-430: SVGClipPathElement
-431: HTMLOptionsCollection
-432: SVGAnimatedNumberList
-433: SVGRadialGradientElement
-434: SVGAnimatedEnumeration
-435: Directory
-436: SVGAnimationElement
-437: SVGMaskElement
-438: RTCDataChannel
-439: SpeechSynthesisEvent
-440: KeyboardEvent
-441: HTMLTemplateElement
-442: SVGStringList
-443: HTMLBRElement
-444: HTMLTableElement
-445: HTMLAllCollection
-446: PushSubscription
-447: ChannelMergerNode
-448: SVGFEFloodElement
-449: SVGAnimatedTransformList
-450: BarProp
-451: RTCIceCandidate
-452: TransitionEvent
-453: IDBMutableFile
-454: ValidityState
-455: SVGAnimatedString
-456: DOMRect
-457: Option
-458: File
-459: DOMMatrix
-460: HTMLAreaElement
-461: SVGFEMergeElement
-462: Navigator
-463: TextEncoder
-464: HTMLBaseElement
-465: TextTrackCueList
-466: CSSSupportsRule
-467: HTMLDListElement
-468: HTMLTableSectionElement
-469: MediaStreamTrack
-470: RTCSessionDescription
-471: HTMLObjectElement
-472: HTMLEmbedElement
-473: FileList
-474: CSSStyleDeclaration
-475: HTMLTableColElement
-476: SVGFEMergeNodeElement
-477: SVGGElement
-478: PerformanceMeasure
-479: NodeFilter
-480: ConstantSourceNode
-481: AudioListener
-482: SVGAngle
-483: PushManager
-484: CSSFontFeatureValuesRule
-485: SVGAnimatedInteger
-486: SVGMetadataElement
-487: SVGTextPathElement
-488: HTMLLabelElement
-489: RTCRtpReceiver
-490: CanvasGradient
-491: FileSystemFileEntry
-492: ServiceWorker
-493: CSSMozDocumentRule
-494: SVGPolygonElement
-495: SVGViewElement
-496: HTMLProgressElement
-497: PerformanceResourceTiming
-498: DocumentTimeline
-499: SVGTextContentElement
-500: HTMLUnknownElement
-501: DOMRectList
-502: SVGPointList
-503: SVGMarkerElement
-504: DOMImplementation
-505: CSSTransition
-506: RTCPeerConnectionIceEvent
-507: WebGLTexture
-508: Worker
-509: HTMLLinkElement
-510: MediaList
-511: MediaError
-512: SVGAnimatedPreserveAspectRatio
-513: EventSource
-514: WebGLVertexArrayObject
-515: HTMLAnchorElement
-516: AudioContext
-517: CSSPageRule
-518: IDBObjectStore
-519: MediaEncryptedEvent
-520: HTMLModElement
-521: FileSystem
-522: HTMLDataListElement
-523: SourceBuffer
-524: Function
-525: Object
-526: eval
-527: EventTarget
-528: Window
-529: close
-530: stop
-531: focus
-532: blur
-533: open
-534: alert
-535: confirm
-536: prompt
-537: print
-538: postMessage
-539: captureEvents
-540: releaseEvents
-541: getSelection
-542: getComputedStyle
-543: matchMedia
-544: moveTo
-545: moveBy
-546: resizeTo
-547: resizeBy
-548: scroll
-549: scrollTo
-550: scrollBy
-551: requestAnimationFrame
-552: cancelAnimationFrame
-553: getDefaultComputedStyle
-554: scrollByLines
-555: scrollByPages
-556: sizeToContent
-557: updateCommands
-558: find
-559: dump
-560: setResizable
-561: requestIdleCallback
-562: cancelIdleCallback
-563: btoa
-564: atob
-565: setTimeout
-566: clearTimeout
-567: setInterval
-568: clearInterval
-569: queueMicrotask
-570: createImageBitmap
-571: fetch
-572: self
-573: name
-574: history
-575: customElements
-576: locationbar
-577: menubar
-578: personalbar
-579: scrollbars
-580: statusbar
-581: toolbar
-582: status
-583: closed
-584: event
-585: frames
-586: length
-587: opener
-588: parent
-589: frameElement
-590: navigator
-591: external
-592: screen
-593: innerWidth
-594: innerHeight
-595: scrollX
-596: pageXOffset
-597: scrollY
-598: pageYOffset
-599: screenLeft
-600: screenTop
-601: screenX
-602: screenY
-603: outerWidth
-604: outerHeight
-605: performance
-606: mozInnerScreenX
-607: mozInnerScreenY
-608: devicePixelRatio
-609: scrollMaxX
-610: scrollMaxY
-611: fullScreen
-612: ondevicemotion
-613: ondeviceorientation
-614: onabsolutedeviceorientation
-615: ondeviceproximity
-616: onuserproximity
-617: ondevicelight
-618: content
-619: InstallTrigger
-620: sidebar
-621: crypto
-622: onabort
-623: onblur
-624: onfocus
-625: onauxclick
-626: oncanplay
-627: oncanplaythrough
-628: onchange
-629: onclick
-630: onclose
-631: oncontextmenu
-632: oncuechange
-633: ondblclick
-634: ondrag
-635: ondragend
-636: ondragenter
-637: ondragexit
-638: ondragleave
-639: ondragover
-640: ondragstart
-641: ondrop
-642: ondurationchange
-643: onemptied
-644: onended
-645: onformdata
-646: oninput
-647: oninvalid
-648: onkeydown
-649: onkeypress
-650: onkeyup
-651: onload
-652: onloadeddata
-653: onloadedmetadata
-654: onloadend
-655: onloadstart
-656: onmousedown
-657: onmouseenter
-658: onmouseleave
-659: onmousemove
-660: onmouseout
-661: onmouseover
-662: onmouseup
-663: onwheel
-664: onpause
-665: onplay
-666: onplaying
-667: onprogress
-668: onratechange
-669: onreset
-670: onresize
-671: onscroll
-672: onseeked
-673: onseeking
-674: onselect
-675: onshow
-676: onstalled
-677: onsubmit
-678: onsuspend
-679: ontimeupdate
-680: onvolumechange
-681: onwaiting
-682: onselectstart
-683: ontoggle
-684: onpointercancel
-685: onpointerdown
-686: onpointerup
-687: onpointermove
-688: onpointerout
-689: onpointerover
-690: onpointerenter
-691: onpointerleave
-692: ongotpointercapture
-693: onlostpointercapture
-694: onmozfullscreenchange
-695: onmozfullscreenerror
-696: onanimationcancel
-697: onanimationend
-698: onanimationiteration
-699: onanimationstart
-700: ontransitioncancel
-701: ontransitionend
-702: ontransitionrun
-703: ontransitionstart
-704: onwebkitanimationend
-705: onwebkitanimationiteration
-706: onwebkitanimationstart
-707: onwebkittransitionend
-708: onerror
-709: speechSynthesis
-710: onafterprint
-711: onbeforeprint
-712: onbeforeunload
-713: onhashchange
-714: onlanguagechange
-715: onmessage
-716: onmessageerror
-717: onoffline
-718: ononline
-719: onpagehide
-720: onpageshow
-721: onpopstate
-722: onrejectionhandled
-723: onstorage
-724: onunhandledrejection
-725: onunload
-726: localStorage
-727: origin
-728: crossOriginIsolated
-729: isSecureContext
-730: indexedDB
-731: caches
-732: sessionStorage
-733: window
-734: document
-735: location
-736: top
-737: netscape
-738: Node
-739: Document
-740: HTMLDocument
-741: Performance
-742: Event
-743: Location
-744: XMLHttpRequestEventTarget
-745: XMLHttpRequest
-746: JSON
-747: Element
-748: HTMLElement
-749: HTMLMetaElement
-750: Crypto
-751: HTMLHtmlElement
-752: HTMLScriptElement
-753: HTMLHeadElement
-754: getInstrumentJS
-755: Array
-756: AbortController
-757: AbortSignal
-758: AbstractRange
-759: Error
-760: TypeError
-761: HTMLDivElement
-762: HTMLSpanElement
-763: HTMLButtonElement
-764: AnonymousContent
-765: Promise
-766: PageTransitionEvent
-767: UIEvent
-768: FocusEvent
-769: console
-770: IdleDeadline
-771: StyleSheetList
-772: NotifyPaintEvent
-773: globalThis
-774: ReferenceError
-775: SyntaxError
-776: XMLDocument
-777: CustomEvent
-
-
diff --git a/docs/window_getOwnPropertyNames.json b/docs/window_getOwnPropertyNames.json
deleted file mode 100644
index e859022b3..000000000
--- a/docs/window_getOwnPropertyNames.json
+++ /dev/null
@@ -1 +0,0 @@
-["AbortController", "AbortSignal", "AbstractRange", "AnalyserNode", "Animation", "AnimationEffect", "AnimationEvent", "AnimationPlaybackEvent", "AnimationTimeline", "AnonymousContent", "Array", "ArrayBuffer", "Attr", "Audio", "AudioBuffer", "AudioBufferSourceNode", "AudioContext", "AudioDestinationNode", "AudioListener", "AudioNode", "AudioParam", "AudioProcessingEvent", "AudioScheduledSourceNode", "BarProp", "BaseAudioContext", "BeforeUnloadEvent", "BigInt", "BigInt64Array", "BigUint64Array", "BiquadFilterNode", "Blob", "BlobEvent", "Boolean", "BroadcastChannel", "ByteLengthQueuingStrategy", "CDATASection", "CSS", "CSS2Properties", "CSSAnimation", "CSSConditionRule", "CSSCounterStyleRule", "CSSFontFaceRule", "CSSFontFeatureValuesRule", "CSSGroupingRule", "CSSImportRule", "CSSKeyframeRule", "CSSKeyframesRule", "CSSMediaRule", "CSSMozDocumentRule", "CSSNamespaceRule", "CSSPageRule", "CSSRule", "CSSRuleList", "CSSStyleDeclaration", "CSSStyleRule", "CSSStyleSheet", "CSSSupportsRule", "CSSTransition", "Cache", "CacheStorage", "CanvasCaptureMediaStream", "CanvasGradient", "CanvasPattern", "CanvasRenderingContext2D", "CaretPosition", "ChannelMergerNode", "ChannelSplitterNode", "CharacterData", "ClipboardEvent", "CloseEvent", "Comment", "CompositionEvent", "ConstantSourceNode", "ConvolverNode", "CountQueuingStrategy", "Crypto", "CustomElementRegistry", "CustomEvent", "DOMException", "DOMImplementation", "DOMMatrix", "DOMMatrixReadOnly", "DOMParser", "DOMPoint", "DOMPointReadOnly", "DOMQuad", "DOMRect", "DOMRectList", "DOMRectReadOnly", "DOMRequest", "DOMStringList", "DOMStringMap", "DOMTokenList", "DataTransfer", "DataTransferItem", "DataTransferItemList", "DataView", "Date", "DelayNode", "DeviceMotionEvent", "DeviceOrientationEvent", "Directory", "Document", "DocumentFragment", "DocumentTimeline", "DocumentType", "DragEvent", "DynamicsCompressorNode", "Element", "Error", "ErrorEvent", "EvalError", "Event", "EventSource", "EventTarget", "File", "FileList", "FileReader", "FileSystem", "FileSystemDirectoryEntry", "FileSystemDirectoryReader", "FileSystemEntry", "FileSystemFileEntry", "Float32Array", "Float64Array", "FocusEvent", "FontFace", "FontFaceSet", "FontFaceSetLoadEvent", "FormData", "FormDataEvent", "Function", "GainNode", "Gamepad", "GamepadButton", "GamepadEvent", "GamepadHapticActuator", "GamepadPose", "Geolocation", "GeolocationPositionError", "HTMLAllCollection", "HTMLAnchorElement", "HTMLAreaElement", "HTMLAudioElement", "HTMLBRElement", "HTMLBaseElement", "HTMLBodyElement", "HTMLButtonElement", "HTMLCanvasElement", "HTMLCollection", "HTMLDListElement", "HTMLDataElement", "HTMLDataListElement", "HTMLDetailsElement", "HTMLDirectoryElement", "HTMLDivElement", "HTMLDocument", "HTMLElement", "HTMLEmbedElement", "HTMLFieldSetElement", "HTMLFontElement", "HTMLFormControlsCollection", "HTMLFormElement", "HTMLFrameElement", "HTMLFrameSetElement", "HTMLHRElement", "HTMLHeadElement", "HTMLHeadingElement", "HTMLHtmlElement", "HTMLIFrameElement", "HTMLImageElement", "HTMLInputElement", "HTMLLIElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLLinkElement", "HTMLMapElement", "HTMLMarqueeElement", "HTMLMediaElement", "HTMLMenuElement", "HTMLMenuItemElement", "HTMLMetaElement", "HTMLMeterElement", "HTMLModElement", "HTMLOListElement", "HTMLObjectElement", "HTMLOptGroupElement", "HTMLOptionElement", "HTMLOptionsCollection", "HTMLOutputElement", "HTMLParagraphElement", "HTMLParamElement", "HTMLPictureElement", "HTMLPreElement", "HTMLProgressElement", "HTMLQuoteElement", "HTMLScriptElement", "HTMLSelectElement", "HTMLSlotElement", "HTMLSourceElement", "HTMLSpanElement", "HTMLStyleElement", "HTMLTableCaptionElement", "HTMLTableCellElement", "HTMLTableColElement", "HTMLTableElement", "HTMLTableRowElement", "HTMLTableSectionElement", "HTMLTemplateElement", "HTMLTextAreaElement", "HTMLTimeElement", "HTMLTitleElement", "HTMLTrackElement", "HTMLUListElement", "HTMLUnknownElement", "HTMLVideoElement", "HashChangeEvent", "Headers", "History", "IDBCursor", "IDBCursorWithValue", "IDBDatabase", "IDBFactory", "IDBFileHandle", "IDBFileRequest", "IDBIndex", "IDBKeyRange", "IDBMutableFile", "IDBObjectStore", "IDBOpenDBRequest", "IDBRequest", "IDBTransaction", "IDBVersionChangeEvent", "IIRFilterNode", "IdleDeadline", "Image", "ImageBitmap", "ImageBitmapRenderingContext", "ImageData", "Infinity", "InputEvent", "InstallTrigger", "Int16Array", "Int32Array", "Int8Array", "InternalError", "IntersectionObserver", "IntersectionObserverEntry", "Intl", "JSON", "KeyEvent", "KeyboardEvent", "KeyframeEffect", "Location", "Map", "Math", "MathMLElement", "MediaCapabilities", "MediaCapabilitiesInfo", "MediaElementAudioSourceNode", "MediaEncryptedEvent", "MediaError", "MediaKeyError", "MediaKeyMessageEvent", "MediaKeySession", "MediaKeyStatusMap", "MediaKeySystemAccess", "MediaKeys", "MediaList", "MediaQueryList", "MediaQueryListEvent", "MediaRecorder", "MediaRecorderErrorEvent", "MediaSource", "MediaStream", "MediaStreamAudioDestinationNode", "MediaStreamAudioSourceNode", "MediaStreamEvent", "MediaStreamTrack", "MediaStreamTrackAudioSourceNode", "MediaStreamTrackEvent", "MessageChannel", "MessageEvent", "MessagePort", "MimeType", "MimeTypeArray", "MouseEvent", "MouseScrollEvent", "MutationEvent", "MutationObserver", "MutationRecord", "NamedNodeMap", "Navigator", "Node", "NodeFilter", "NodeIterator", "NodeList", "Notification", "NotifyPaintEvent", "Number", "Object", "OfflineAudioCompletionEvent", "OfflineAudioContext", "Option", "OscillatorNode", "PageTransitionEvent", "PaintRequest", "PaintRequestList", "PannerNode", "Path2D", "Performance", "PerformanceEntry", "PerformanceMark", "PerformanceMeasure", "PerformanceNavigation", "PerformanceNavigationTiming", "PerformanceObserver", "PerformanceObserverEntryList", "PerformanceResourceTiming", "PerformanceTiming", "PeriodicWave", "PermissionStatus", "Permissions", "Plugin", "PluginArray", "PointerEvent", "PopStateEvent", "PopupBlockedEvent", "ProcessingInstruction", "ProgressEvent", "Promise", "PromiseRejectionEvent", "Proxy", "PushManager", "PushSubscription", "PushSubscriptionOptions", "RTCCertificate", "RTCDTMFSender", "RTCDTMFToneChangeEvent", "RTCDataChannel", "RTCDataChannelEvent", "RTCIceCandidate", "RTCPeerConnection", "RTCPeerConnectionIceEvent", "RTCRtpReceiver", "RTCRtpSender", "RTCRtpTransceiver", "RTCSessionDescription", "RTCStatsReport", "RTCTrackEvent", "RadioNodeList", "Range", "RangeError", "ReadableStream", "ReferenceError", "Reflect", "RegExp", "Request", "ResizeObserver", "ResizeObserverEntry", "ResizeObserverSize", "Response", "SVGAElement", "SVGAngle", "SVGAnimateElement", "SVGAnimateMotionElement", "SVGAnimateTransformElement", "SVGAnimatedAngle", "SVGAnimatedBoolean", "SVGAnimatedEnumeration", "SVGAnimatedInteger", "SVGAnimatedLength", "SVGAnimatedLengthList", "SVGAnimatedNumber", "SVGAnimatedNumberList", "SVGAnimatedPreserveAspectRatio", "SVGAnimatedRect", "SVGAnimatedString", "SVGAnimatedTransformList", "SVGAnimationElement", "SVGCircleElement", "SVGClipPathElement", "SVGComponentTransferFunctionElement", "SVGDefsElement", "SVGDescElement", "SVGElement", "SVGEllipseElement", "SVGFEBlendElement", "SVGFEColorMatrixElement", "SVGFEComponentTransferElement", "SVGFECompositeElement", "SVGFEConvolveMatrixElement", "SVGFEDiffuseLightingElement", "SVGFEDisplacementMapElement", "SVGFEDistantLightElement", "SVGFEDropShadowElement", "SVGFEFloodElement", "SVGFEFuncAElement", "SVGFEFuncBElement", "SVGFEFuncGElement", "SVGFEFuncRElement", "SVGFEGaussianBlurElement", "SVGFEImageElement", "SVGFEMergeElement", "SVGFEMergeNodeElement", "SVGFEMorphologyElement", "SVGFEOffsetElement", "SVGFEPointLightElement", "SVGFESpecularLightingElement", "SVGFESpotLightElement", "SVGFETileElement", "SVGFETurbulenceElement", "SVGFilterElement", "SVGForeignObjectElement", "SVGGElement", "SVGGeometryElement", "SVGGradientElement", "SVGGraphicsElement", "SVGImageElement", "SVGLength", "SVGLengthList", "SVGLineElement", "SVGLinearGradientElement", "SVGMPathElement", "SVGMarkerElement", "SVGMaskElement", "SVGMatrix", "SVGMetadataElement", "SVGNumber", "SVGNumberList", "SVGPathElement", "SVGPathSegList", "SVGPatternElement", "SVGPoint", "SVGPointList", "SVGPolygonElement", "SVGPolylineElement", "SVGPreserveAspectRatio", "SVGRadialGradientElement", "SVGRect", "SVGRectElement", "SVGSVGElement", "SVGScriptElement", "SVGSetElement", "SVGStopElement", "SVGStringList", "SVGStyleElement", "SVGSwitchElement", "SVGSymbolElement", "SVGTSpanElement", "SVGTextContentElement", "SVGTextElement", "SVGTextPathElement", "SVGTextPositioningElement", "SVGTitleElement", "SVGTransform", "SVGTransformList", "SVGUnitTypes", "SVGUseElement", "SVGViewElement", "Screen", "ScreenOrientation", "ScriptProcessorNode", "ScrollAreaEvent", "SecurityPolicyViolationEvent", "Selection", "ServiceWorker", "ServiceWorkerRegistration", "Set", "ShadowRoot", "SharedWorker", "SourceBuffer", "SourceBufferList", "SpeechSynthesis", "SpeechSynthesisErrorEvent", "SpeechSynthesisEvent", "SpeechSynthesisUtterance", "SpeechSynthesisVoice", "StaticRange", "StereoPannerNode", "Storage", "StorageEvent", "String", "StyleSheet", "StyleSheetList", "SubmitEvent", "Symbol", "SyntaxError", "Text", "TextDecoder", "TextEncoder", "TextMetrics", "TextTrack", "TextTrackCue", "TextTrackCueList", "TextTrackList", "TimeEvent", "TimeRanges", "TrackEvent", "TransitionEvent", "TreeWalker", "TypeError", "UIEvent", "URIError", "URL", "URLSearchParams", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", "VTTCue", "VTTRegion", "ValidityState", "VideoPlaybackQuality", "VisualViewport", "WaveShaperNode", "WeakMap", "WeakSet", "WebAssembly", "WebGL2RenderingContext", "WebGLActiveInfo", "WebGLBuffer", "WebGLContextEvent", "WebGLFramebuffer", "WebGLProgram", "WebGLQuery", "WebGLRenderbuffer", "WebGLRenderingContext", "WebGLSampler", "WebGLShader", "WebGLShaderPrecisionFormat", "WebGLSync", "WebGLTexture", "WebGLTransformFeedback", "WebGLUniformLocation", "WebGLVertexArrayObject", "WebKitCSSMatrix", "WebSocket", "WheelEvent", "Window", "Worker", "XMLDocument", "XMLHttpRequest", "XMLHttpRequestEventTarget", "XMLHttpRequestUpload", "XMLSerializer", "XPathEvaluator", "XPathExpression", "XPathResult", "XSLTProcessor", "alert", "atob", "blur", "btoa", "caches", "cancelAnimationFrame", "cancelIdleCallback", "captureEvents", "clearInterval", "clearTimeout", "close", "closed", "confirm", "console", "content", "createImageBitmap", "crossOriginIsolated", "crypto", "customElements", "decodeURI", "decodeURIComponent", "devicePixelRatio", "document", "dump", "encodeURI", "encodeURIComponent", "escape", "eval", "event", "external", "fetch", "find", "focus", "frameElement", "frames", "fullScreen", "getComputedStyle", "getDefaultComputedStyle", "getInstrumentJS", "getSelection", "globalThis", "history", "indexedDB", "innerHeight", "innerWidth", "isFinite", "isNaN", "isSecureContext", "length", "localStorage", "location", "locationbar", "matchMedia", "menubar", "moveBy", "moveTo", "mozInnerScreenX", "mozInnerScreenY", "mozRTCIceCandidate", "mozRTCPeerConnection", "mozRTCSessionDescription", "name", "nan", "navigator", "netscape", "onabort", "onabsolutedeviceorientation", "onafterprint", "onanimationcancel", "onanimationend", "onanimationiteration", "onanimationstart", "onauxclick", "onbeforeprint", "onbeforeunload", "onblur", "oncanplay", "oncanplaythrough", "onchange", "onclick", "onclose", "oncontextmenu", "oncuechange", "ondblclick", "ondevicelight", "ondevicemotion", "ondeviceorientation", "ondeviceproximity", "ondrag", "ondragend", "ondragenter", "ondragexit", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", "onfocus", "onformdata", "ongotpointercapture", "onhashchange", "oninput", "oninvalid", "onkeydown", "onkeypress", "onkeyup", "onlanguagechange", "onload", "onloadeddata", "onloadedmetadata", "onloadend", "onloadstart", "onlostpointercapture", "onmessage", "onmessageerror", "onmousedown", "onmouseenter", "onmouseleave", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onmozfullscreenchange", "onmozfullscreenerror", "onoffline", "ononline", "onpagehide", "onpageshow", "onpause", "onplay", "onplaying", "onpointercancel", "onpointerdown", "onpointerenter", "onpointerleave", "onpointermove", "onpointerout", "onpointerover", "onpointerup", "onpopstate", "onprogress", "onratechange", "onrejectionhandled", "onreset", "onresize", "onscroll", "onseeked", "onseeking", "onselect", "onselectstart", "onshow", "onstalled", "onstorage", "onsubmit", "onsuspend", "ontimeupdate", "ontoggle", "ontransitioncancel", "ontransitionend", "ontransitionrun", "ontransitionstart", "onunhandledrejection", "onunload", "onuserproximity", "onvolumechange", "onwaiting", "onwebkitanimationend", "onwebkitanimationiteration", "onwebkitanimationstart", "onwebkittransitionend", "onwheel", "open", "opener", "origin", "outerHeight", "outerWidth", "pageXOffset", "pageYOffset", "parent", "parseFloat", "parseInt", "performance", "personalbar", "postMessage", "print", "prompt", "queueMicrotask", "releaseEvents", "requestAnimationFrame", "requestIdleCallback", "resizeBy", "resizeTo", "screen", "screenLeft", "screenTop", "screenX", "screenY", "scroll", "scrollBy", "scrollByLines", "scrollByPages", "scrollMaxX", "scrollMaxY", "scrollTo", "scrollX", "scrollY", "scrollbars", "self", "sessionStorage", "setInterval", "setResizable", "setTimeout", "sidebar", "sizeToContent", "speechSynthesis", "status", "statusbar", "stop", "toolbar", "top", "undefined", "unescape", "updateCommands", "webkitURL", "window"]
\ No newline at end of file
From 55ac279e0ea0cada4b7d8600ed90b9ae9e333221 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:04:54 -0500
Subject: [PATCH 076/106] Remove example_browser_params
They're not used in tests, were just for my testing.
---
test/example_browser_params/a_f.json | 138 ------
test/example_browser_params/all.json | 553 ------------------------
test/example_browser_params/g_l.json | 129 ------
test/example_browser_params/m_z.json | 300 -------------
test/example_browser_params/simple.json | 5 -
5 files changed, 1125 deletions(-)
delete mode 100644 test/example_browser_params/a_f.json
delete mode 100644 test/example_browser_params/all.json
delete mode 100644 test/example_browser_params/g_l.json
delete mode 100644 test/example_browser_params/m_z.json
delete mode 100644 test/example_browser_params/simple.json
diff --git a/test/example_browser_params/a_f.json b/test/example_browser_params/a_f.json
deleted file mode 100644
index 2a980f7af..000000000
--- a/test/example_browser_params/a_f.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true,
- "js_instrument_modules": [
- "AbortController",
- "AbortSignal",
- "AbstractRange",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- {"Array": {"propertiesToInstrument": null}},
- "ArrayBuffer",
- {"Attr": {"propertiesToInstrument": null}},
- "Audio",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioParam",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "BarProp",
- "BaseAudioContext",
- "BeforeUnloadEvent",
- "BigInt",
- "BigInt64Array",
- "BigUint64Array",
- "BiquadFilterNode",
- "Blob",
- "BlobEvent",
- "Boolean",
- "BroadcastChannel",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- {"CSS": {"propertiesToInstrument": null}},
- "CSS2Properties",
- "CSSAnimation",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSFontFaceRule",
- "CSSFontFeatureValuesRule",
- "CSSGroupingRule",
- "CSSImportRule",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSMediaRule",
- "CSSMozDocumentRule",
- "CSSNamespaceRule",
- "CSSPageRule",
- "CSSRule",
- "CSSRuleList",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSSupportsRule",
- "CSSTransition",
- "Cache",
- "CacheStorage",
- "CanvasCaptureMediaStream",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "ConstantSourceNode",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Crypto",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMException",
- "DOMImplementation",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectList",
- "DOMRectReadOnly",
- "DOMRequest",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DataView",
- {"Date": {"propertiesToInstrument": null}},
- "DelayNode",
- "DeviceMotionEvent",
- "DeviceOrientationEvent",
- "Directory",
- {"Document": {"excludedProperties": ["dispatchEvent"]}},
- "DocumentFragment",
- "DocumentTimeline",
- "DocumentType",
- "DragEvent",
- "DynamicsCompressorNode",
- "Element",
- {"Error": {"propertiesToInstrument": null}},
- {"ErrorEvent": {"propertiesToInstrument": null}},
- {"EvalError": {"propertiesToInstrument": null}},
- {"Event": {"propertiesToInstrument": null}},
- {"EventSource": {"propertiesToInstrument": null}},
- {"EventTarget": {"propertiesToInstrument": null}},
- "File",
- "FileList",
- "FileReader",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "Float32Array",
- "Float64Array",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- {"Function": {"propertiesToInstrument": null}}
- ]
-}
diff --git a/test/example_browser_params/all.json b/test/example_browser_params/all.json
deleted file mode 100644
index 46b67a500..000000000
--- a/test/example_browser_params/all.json
+++ /dev/null
@@ -1,553 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true,
- "js_instrument_modules": [
- "AbortController",
- "AbortSignal",
- "AbstractRange",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnimationTimeline",
- "Array",
- "ArrayBuffer",
- "Attr",
- "Audio",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioParam",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "BarProp",
- "BaseAudioContext",
- "BeforeUnloadEvent",
- "BigInt",
- "BigInt64Array",
- "BigUint64Array",
- "BiquadFilterNode",
- "Blob",
- "BlobEvent",
- "Boolean",
- "BroadcastChannel",
- "ByteLengthQueuingStrategy",
- "CDATASection",
- "CSS",
- "CSS2Properties",
- "CSSAnimation",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSFontFaceRule",
- "CSSFontFeatureValuesRule",
- "CSSGroupingRule",
- "CSSImportRule",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSMediaRule",
- "CSSMozDocumentRule",
- "CSSNamespaceRule",
- "CSSPageRule",
- "CSSRule",
- "CSSRuleList",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSSupportsRule",
- "CSSTransition",
- "Cache",
- "CacheStorage",
- "CanvasCaptureMediaStream",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "ClipboardEvent",
- "CloseEvent",
- "Comment",
- "CompositionEvent",
- "ConstantSourceNode",
- "ConvolverNode",
- "CountQueuingStrategy",
- "Crypto",
- "CustomElementRegistry",
- "CustomEvent",
- "DOMException",
- "DOMImplementation",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectList",
- "DOMRectReadOnly",
- "DOMRequest",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DataView",
- "Date",
- "DelayNode",
- "DeviceMotionEvent",
- "DeviceOrientationEvent",
- "Directory",
- "Document",
- "DocumentFragment",
- "DocumentTimeline",
- "DocumentType",
- "DragEvent",
- "DynamicsCompressorNode",
- "Element",
- "Error",
- "ErrorEvent",
- "EvalError",
- "Event",
- "EventSource",
- "EventTarget",
- "File",
- "FileList",
- "FileReader",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "Float32Array",
- "Float64Array",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "FormDataEvent",
- "Function",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationPositionError",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDirectoryElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBFactory",
- "IDBFileHandle",
- "IDBFileRequest",
- "IDBIndex",
- "IDBKeyRange",
- "IDBMutableFile",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IIRFilterNode",
- "IdleDeadline",
- "Image",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageData",
- "Infinity",
- "InputEvent",
- "InstallTrigger",
- "Int16Array",
- "Int32Array",
- "Int8Array",
- "InternalError",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Intl",
- "JSON",
- "KeyEvent",
- "KeyboardEvent",
- "KeyframeEffect",
- "Location",
- "Map",
- "Math",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeys",
- "MediaList",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MutationEvent",
- "MutationObserver",
- "MutationRecord",
- "NamedNodeMap",
- "Navigator",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "Notification",
- "Number",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "Option",
- "OscillatorNode",
- "PageTransitionEvent",
- "PaintRequest",
- "PaintRequestList",
- "PannerNode",
- "Path2D",
- "Performance",
- "PerformanceEntry",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformanceResourceTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "Plugin",
- "PluginArray",
- "PointerEvent",
- "PopStateEvent",
- "PopupBlockedEvent",
- "ProcessingInstruction",
- "ProgressEvent",
- "Promise",
- "PromiseRejectionEvent",
- "Proxy",
- "PushManager",
- "PushSubscription",
- "PushSubscriptionOptions",
- "RTCCertificate",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCIceCandidate",
- "RTCPeerConnection",
- "RTCPeerConnectionIceEvent",
- "RTCRtpReceiver",
- "RTCRtpSender",
- "RTCRtpTransceiver",
- "RTCSessionDescription",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RadioNodeList",
- "Range",
- "RangeError",
- "ReadableStream",
- "ReferenceError",
- "Reflect",
- "RegExp",
- "Request",
- "ResizeObserver",
- "ResizeObserverEntry",
- "ResizeObserverSize",
- "Response",
- "SVGAElement",
- "SVGAngle",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGComponentTransferFunctionElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMarkerElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMetadataElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPathSegList",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPointList",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTSpanElement",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGUnitTypes",
- "SVGUseElement",
- "SVGViewElement",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollAreaEvent",
- "SecurityPolicyViolationEvent",
- "Selection",
- "ServiceWorker",
- "ServiceWorkerRegistration",
- "Set",
- "ShadowRoot",
- "SharedWorker",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEvent",
- "String",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "Symbol",
- "SyntaxError",
- "Text",
- "TextDecoder",
- "TextEncoder",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackCueList",
- "TextTrackList",
- "TimeEvent",
- "TimeRanges",
- "TrackEvent",
- "TransitionEvent",
- "TreeWalker",
- "TypeError",
- "UIEvent",
- "URIError",
- "URL",
- "URLSearchParams",
- "Uint16Array",
- "Uint32Array",
- "Uint8Array",
- "Uint8ClampedArray",
- "VTTCue",
- "VTTRegion",
- "ValidityState",
- "VideoPlaybackQuality",
- "VisualViewport",
- "WaveShaperNode",
- "WeakMap",
- "WeakSet",
- "WebAssembly",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Worker",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathEvaluator",
- "XPathExpression",
- "XPathResult",
- "XSLTProcessor"
- ]
-}
diff --git a/test/example_browser_params/g_l.json b/test/example_browser_params/g_l.json
deleted file mode 100644
index 70f77dc66..000000000
--- a/test/example_browser_params/g_l.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true,
- "js_instrument_modules": [
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GeolocationPositionError",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAreaElement",
- "HTMLAudioElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLDListElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDirectoryElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBFactory",
- "IDBFileHandle",
- "IDBFileRequest",
- "IDBIndex",
- "IDBKeyRange",
- "IDBMutableFile",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IIRFilterNode",
- "IdleDeadline",
- "Image",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageData",
- "Infinity",
- "InputEvent",
- "InstallTrigger",
- "Int16Array",
- "Int32Array",
- "Int8Array",
- "InternalError",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Intl",
- "JSON",
- "KeyEvent",
- "KeyboardEvent",
- "KeyframeEffect",
- "Location"
- ]
-}
diff --git a/test/example_browser_params/m_z.json b/test/example_browser_params/m_z.json
deleted file mode 100644
index aaf9db4e0..000000000
--- a/test/example_browser_params/m_z.json
+++ /dev/null
@@ -1,300 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true,
- "js_instrument_modules": [
- "Map",
- "Math",
- "MathMLElement",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyError",
- "MediaKeyMessageEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeys",
- "MediaList",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackAudioSourceNode",
- "MediaStreamTrackEvent",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "MimeType",
- "MimeTypeArray",
- "MouseEvent",
- "MouseScrollEvent",
- "MutationEvent",
- "MutationObserver",
- "MutationRecord",
- "NamedNodeMap",
- "Navigator",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "Notification",
- "Number",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "Option",
- "OscillatorNode",
- "PageTransitionEvent",
- "PaintRequest",
- "PaintRequestList",
- "PannerNode",
- "Path2D",
- "Performance",
- "PerformanceEntry",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformanceResourceTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "Plugin",
- "PluginArray",
- "PointerEvent",
- "PopStateEvent",
- "PopupBlockedEvent",
- "ProcessingInstruction",
- "ProgressEvent",
- "Promise",
- "PromiseRejectionEvent",
- "Proxy",
- "PushManager",
- "PushSubscription",
- "PushSubscriptionOptions",
- "RTCCertificate",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCIceCandidate",
- "RTCPeerConnection",
- "RTCPeerConnectionIceEvent",
- "RTCRtpReceiver",
- "RTCRtpSender",
- "RTCRtpTransceiver",
- "RTCSessionDescription",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RadioNodeList",
- "Range",
- "RangeError",
- "ReadableStream",
- "ReferenceError",
- "Reflect",
- "RegExp",
- "Request",
- "ResizeObserver",
- "ResizeObserverEntry",
- "ResizeObserverSize",
- "Response",
- "SVGAElement",
- "SVGAngle",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGComponentTransferFunctionElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGElement",
- "SVGEllipseElement",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMarkerElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMetadataElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPathElement",
- "SVGPathSegList",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPointList",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTSpanElement",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGUnitTypes",
- "SVGUseElement",
- "SVGViewElement",
- "Screen",
- "ScreenOrientation",
- "ScriptProcessorNode",
- "ScrollAreaEvent",
- "SecurityPolicyViolationEvent",
- "Selection",
- "ServiceWorker",
- "ServiceWorkerRegistration",
- "Set",
- "ShadowRoot",
- "SharedWorker",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "Storage",
- "StorageEvent",
- "String",
- "StyleSheet",
- "StyleSheetList",
- "SubmitEvent",
- "Symbol",
- "SyntaxError",
- "Text",
- "TextDecoder",
- "TextEncoder",
- "TextMetrics",
- "TextTrack",
- "TextTrackCue",
- "TextTrackCueList",
- "TextTrackList",
- "TimeEvent",
- "TimeRanges",
- "TrackEvent",
- "TransitionEvent",
- "TreeWalker",
- "TypeError",
- "UIEvent",
- "URIError",
- "URL",
- "URLSearchParams",
- "Uint16Array",
- "Uint32Array",
- "Uint8Array",
- "Uint8ClampedArray",
- "VTTCue",
- "VTTRegion",
- "ValidityState",
- "VideoPlaybackQuality",
- "VisualViewport",
- "WaveShaperNode",
- "WeakMap",
- "WeakSet",
- "WebAssembly",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArrayObject",
- "WebKitCSSMatrix",
- "WebSocket",
- "WheelEvent",
- "Worker",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XPathEvaluator",
- "XPathExpression",
- "XPathResult",
- "XSLTProcessor"
- ]
-}
diff --git a/test/example_browser_params/simple.json b/test/example_browser_params/simple.json
deleted file mode 100644
index deb11e60d..000000000
--- a/test/example_browser_params/simple.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "crawl_id": 0,
- "testing": true,
- "js_instrument": true
-}
\ No newline at end of file
From 2bd0dca9041a9c17efb2388c649898f4126eeb5f Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:07:53 -0500
Subject: [PATCH 077/106] Load JS_INSTRUMENT_MODULES from JSON string
---
crawler.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/crawler.py b/crawler.py
index d7d2ab6d7..aeb094b33 100644
--- a/crawler.py
+++ b/crawler.py
@@ -26,7 +26,7 @@
NAVIGATION_INSTRUMENT = os.getenv('NAVIGATION_INSTRUMENT', '1') == '1'
JS_INSTRUMENT = os.getenv('JS_INSTRUMENT', '1') == '1'
CALLSTACK_INSTRUMENT = os.getenv('CALLSTACK_INSTRUMENT', '1') == '1'
-JS_INSTRUMENT_MODULES = os.getenv('JS_INSTRUMENT_MODULES', [])
+JS_INSTRUMENT_MODULES = os.getenv('JS_INSTRUMENT_MODULES', '["fingerprinting"]')
SAVE_CONTENT = os.getenv('SAVE_CONTENT', '')
PREFS = os.getenv('PREFS', None)
DWELL_TIME = int(os.getenv('DWELL_TIME', '10'))
@@ -35,6 +35,7 @@
LOGGER_SETTINGS = MPLogger.parse_config_from_env()
MAX_JOB_RETRIES = int(os.getenv('MAX_JOB_RETRIES', '2'))
+JS_INSTRUMENT_MODULES = json.loads(JS_INSTRUMENT_MODULES)
if CALLSTACK_INSTRUMENT is True:
# Must have JS_INSTRUMENT True for CALLSTACK_INSTRUMENT to work
From 8f593c863fced7d55d18e831f9d0f699b84a881f Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:19:56 -0500
Subject: [PATCH 078/106] Rename JS_INSTRUMENT_MODULES to
JS_INSTRUMENT_SETTINGS
---
automation/Extension/firefox/feature.js/index.js | 4 ++--
automation/JSInstrumentation.py | 8 ++++----
automation/TaskManager.py | 6 +++---
automation/default_browser_params.json | 2 +-
...ment_modules.schema => js_instrument_settings.schema} | 0
crawler.py | 9 +++++----
test/manual_test.py | 4 ++--
7 files changed, 17 insertions(+), 16 deletions(-)
rename automation/js_instrumentation/{js_instrument_modules.schema => js_instrument_settings.schema} (100%)
diff --git a/automation/Extension/firefox/feature.js/index.js b/automation/Extension/firefox/feature.js/index.js
index 2edf15891..c9ff2437b 100644
--- a/automation/Extension/firefox/feature.js/index.js
+++ b/automation/Extension/firefox/feature.js/index.js
@@ -20,7 +20,7 @@ async function main() {
navigation_instrument:true,
cookie_instrument:true,
js_instrument:true,
- js_instrument_modules: `
+ js_instrument_settings: `
[
{
object: window.CanvasRenderingContext2D.prototype,
@@ -69,7 +69,7 @@ async function main() {
loggingDB.logDebug("Javascript instrumentation enabled");
let jsInstrument = new JavascriptInstrument(loggingDB);
jsInstrument.run(config['crawl_id']);
- await jsInstrument.registerContentScript(config['testing'], config['js_instrument_modules']);
+ await jsInstrument.registerContentScript(config['testing'], config['js_instrument_settings']);
}
if (config['http_instrument']) {
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 728b415a7..51f284d6c 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -5,7 +5,7 @@
curdir = os.path.dirname(os.path.realpath(__file__))
schema_path = os.path.join(
- curdir, 'js_instrumentation', 'js_instrument_modules.schema'
+ curdir, 'js_instrumentation', 'js_instrument_settings.schema'
)
list_log_settings = [
@@ -174,7 +174,7 @@ def build_object_from_request(request):
}
-def convert_browser_params_to_js_string(js_instrument_modules):
+def convert_browser_params_to_js_string(js_instrument_settings):
"""
We accept a list. From the list we need to parse each item.
Examples of the requests we accept.
@@ -190,9 +190,9 @@ def convert_browser_params_to_js_string(js_instrument_modules):
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
"""
- assert isinstance(js_instrument_modules, list)
+ assert isinstance(js_instrument_settings, list)
requests = []
- for request in js_instrument_modules:
+ for request in js_instrument_settings:
if isinstance(request, str) and (request in shortcut_specs):
shortcut_spec = json.loads(open(shortcut_specs[request]).read())
for sub_request in shortcut_spec:
diff --git a/automation/TaskManager.py b/automation/TaskManager.py
index 273166225..cf7e26948 100644
--- a/automation/TaskManager.py
+++ b/automation/TaskManager.py
@@ -115,12 +115,12 @@ def __init__(self, manager_params: Dict[str, Any],
raise Exception("Number of dicts is not the same "
"as manager_params['num_browsers']")
- # Parse and flesh out js_instrument_modules
+ # Parse and flesh out js_instrument_settings
for a_browsers_params in self.browser_params:
- js_request = a_browsers_params['js_instrument_modules']
+ js_request = a_browsers_params['js_instrument_settings']
js_request_as_string = convert_browser_params_to_js_string(
js_request)
- a_browsers_params['js_instrument_modules'] = js_request_as_string
+ a_browsers_params['js_instrument_settings'] = js_request_as_string
# Flow control
self.closing = False
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index d1d74dc87..f8c78c794 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -2,7 +2,7 @@
"extension_enabled": true,
"cookie_instrument": false,
"js_instrument": false,
- "js_instrument_modules": ["fingerprinting"],
+ "js_instrument_settings": ["fingerprinting"],
"http_instrument": false,
"navigation_instrument": false,
"save_content": false,
diff --git a/automation/js_instrumentation/js_instrument_modules.schema b/automation/js_instrumentation/js_instrument_settings.schema
similarity index 100%
rename from automation/js_instrumentation/js_instrument_modules.schema
rename to automation/js_instrumentation/js_instrument_settings.schema
diff --git a/crawler.py b/crawler.py
index aeb094b33..5f22faa24 100644
--- a/crawler.py
+++ b/crawler.py
@@ -26,7 +26,7 @@
NAVIGATION_INSTRUMENT = os.getenv('NAVIGATION_INSTRUMENT', '1') == '1'
JS_INSTRUMENT = os.getenv('JS_INSTRUMENT', '1') == '1'
CALLSTACK_INSTRUMENT = os.getenv('CALLSTACK_INSTRUMENT', '1') == '1'
-JS_INSTRUMENT_MODULES = os.getenv('JS_INSTRUMENT_MODULES', '["fingerprinting"]')
+JS_INSTRUMENT_SETTINGS = os.getenv('JS_INSTRUMENT_SETTINGS', '["fingerprinting"]')
SAVE_CONTENT = os.getenv('SAVE_CONTENT', '')
PREFS = os.getenv('PREFS', None)
DWELL_TIME = int(os.getenv('DWELL_TIME', '10'))
@@ -35,7 +35,7 @@
LOGGER_SETTINGS = MPLogger.parse_config_from_env()
MAX_JOB_RETRIES = int(os.getenv('MAX_JOB_RETRIES', '2'))
-JS_INSTRUMENT_MODULES = json.loads(JS_INSTRUMENT_MODULES)
+JS_INSTRUMENT_SETTINGS = json.loads(JS_INSTRUMENT_SETTINGS)
if CALLSTACK_INSTRUMENT is True:
# Must have JS_INSTRUMENT True for CALLSTACK_INSTRUMENT to work
@@ -58,7 +58,7 @@
browser_params[i]['navigation_instrument'] = NAVIGATION_INSTRUMENT
browser_params[i]['callstack_instrument'] = CALLSTACK_INSTRUMENT
browser_params[i]['js_instrument'] = JS_INSTRUMENT
- browser_params[i]['js_instrument_modules'] = JS_INSTRUMENT_MODULES
+ browser_params[i]['js_instrument_settings'] = JS_INSTRUMENT_SETTINGS
if SAVE_CONTENT == '1':
browser_params[i]['save_content'] = True
elif SAVE_CONTENT == '0':
@@ -99,7 +99,8 @@
scope.set_tag('COOKIE_INSTRUMENT', COOKIE_INSTRUMENT)
scope.set_tag('NAVIGATION_INSTRUMENT', NAVIGATION_INSTRUMENT)
scope.set_tag('JS_INSTRUMENT', JS_INSTRUMENT)
- scope.set_tag('JS_INSTRUMENT_MODULES', JS_INSTRUMENT)
+ scope.set_tag('JS_INSTRUMENT_SETTINGS', JS_INSTRUMENT_SETTINGS)
+ scope.set_tag('CALLSTACK_INSTRUMENT', CALLSTACK_INSTRUMENT)
scope.set_tag('SAVE_CONTENT', SAVE_CONTENT)
scope.set_tag('DWELL_TIME', DWELL_TIME)
scope.set_tag('TIMEOUT', TIMEOUT)
diff --git a/test/manual_test.py b/test/manual_test.py
index bd0a73713..a0d73ca98 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -133,10 +133,10 @@ def cleanup_server():
browser_params.update(
json.loads(open(browser_params_file).read())
)
- js_request = browser_params['js_instrument_modules']
+ js_request = browser_params['js_instrument_settings']
js_request_as_string = jsi.convert_browser_params_to_js_string(
js_request)
- browser_params['js_instrument_modules'] = js_request_as_string
+ browser_params['js_instrument_settings'] = js_request_as_string
profile_dir = driver.capabilities['moz:profile']
with open(join(profile_dir, 'browser_params.json'), 'w') as f:
From 8fee522a852afe4dc33d19580c582bf25b9d0e29 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:22:22 -0500
Subject: [PATCH 079/106] Fixes #28 - Instrument all window.navigator
properties.
---
.../js_instrumentation/fingerprinting.json | 28 ++-----------------
1 file changed, 3 insertions(+), 25 deletions(-)
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/fingerprinting.json
index ea327a291..f87b34a86 100644
--- a/automation/js_instrumentation/fingerprinting.json
+++ b/automation/js_instrumentation/fingerprinting.json
@@ -8,6 +8,7 @@
"RTCPeerConnection",
"HTMLCanvasElement",
"Storage",
+ "window.navigator",
{"CanvasRenderingContext2D": {
"excludedProperties": [
"quadraticCurveTo",
@@ -33,28 +34,5 @@
}},
{"window.screen": {
"propertiesToInstrument": ["pixelDepth", "colorDepth"]
- }},
- {"window.navigator": {
- "propertiesToInstrument": [
- "appCodeName",
- "appName",
- "appVersion",
- "buildID",
- "cookieEnabled",
- "doNotTrack",
- "geolocation",
- "language",
- "languages",
- "onLine",
- "oscpu",
- "platform",
- "product",
- "productSub",
- "userAgent",
- "vendorSub",
- "vendor"
- ]
- }},
- "window.navigator.mimeTypes",
- "window.navigator.plugins"
-]
\ No newline at end of file
+ }}
+]
From c600ae6962b7de836b7394d192635697cf7f1608 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:28:12 -0500
Subject: [PATCH 080/106] Finish removing unused mdn-compat pieces.
---
.../webext-instrumentation/package-lock.json | 15 ---------------
.../Extension/webext-instrumentation/package.json | 7 ++-----
2 files changed, 2 insertions(+), 20 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/package-lock.json b/automation/Extension/webext-instrumentation/package-lock.json
index 2497e6064..736d46897 100644
--- a/automation/Extension/webext-instrumentation/package-lock.json
+++ b/automation/Extension/webext-instrumentation/package-lock.json
@@ -3059,12 +3059,6 @@
"homedir-polyfill": "^1.0.1"
}
},
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
"extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@@ -5595,15 +5589,6 @@
"blueimp-md5": "^2.10.0"
}
},
- "mdn-browser-compat-data": {
- "version": "1.0.27",
- "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.27.tgz",
- "integrity": "sha512-zuuqs6GnxVia8xz1KQLbju/TfZVsi2WtR2Xs+7aCHmS7ZnrOfol4Th0fOkudWWLTqTe9Bm8Ixiy4LXed1CB/xA==",
- "dev": true,
- "requires": {
- "extend": "3.0.2"
- }
- },
"mem": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-6.1.0.tgz",
diff --git a/automation/Extension/webext-instrumentation/package.json b/automation/Extension/webext-instrumentation/package.json
index 0c718864c..fb65b27ef 100644
--- a/automation/Extension/webext-instrumentation/package.json
+++ b/automation/Extension/webext-instrumentation/package.json
@@ -41,8 +41,7 @@
"prepare": "run-s build test",
"prepare-release": "run-s all version doc:publish",
"publish-please": "publish-please",
- "prepublishOnly": "publish-please guard",
- "make-compat": "node scripts/make_mdn_browser_compat_file.js"
+ "prepublishOnly": "publish-please guard"
},
"scripts-info": {
"info": "Display information about the package scripts",
@@ -55,8 +54,7 @@
"doc:json": "Generate API documentation in typedoc JSON format",
"version": "Bump package.json version, update CHANGELOG.md, tag release",
"reset": "Delete all untracked files and reset the repo to the last commit",
- "prepare-release": "One-step: clean, build, test, publish docs, and prep a release",
- "make-compat": "Script that makes XXX TODO: ...../mdn-browser-compat-data.py"
+ "prepare-release": "One-step: clean, build, test, publish docs, and prep a release"
},
"engines": {
"node": ">=8.9"
@@ -68,7 +66,6 @@
"commitizen": "^4.1.2",
"cz-conventional-changelog": "^2.1.0",
"gh-pages": "^2.1.1",
- "mdn-browser-compat-data": "^1.0.20",
"npm-run-all": "^4.1.5",
"nyc": "^14.1.1",
"opn-cli": "^3.1.0",
From 941c3cc87a8ab76e9d55f082a9c8eea0df293f08 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:52:00 -0500
Subject: [PATCH 081/106] EventID as a shadow variable
---
.../src/content/javascript-instrument-content-scope.ts | 10 +++++-----
.../src/content/javascript-instrument-page-scope.ts | 8 ++++----
.../webext-instrumentation/src/lib/js-instruments.ts | 8 ++++----
.../Extension/webext-instrumentation/tslint.json | 1 +
4 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index b68aa1a38..c93a30b46 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -24,14 +24,14 @@ const instrumentationRequests = ${jsInstrumentationRequestsString};
function insertScript(
pageScriptString: string,
- event_id: string,
+ eventId: string,
testing: boolean = false,
) {
const parent = document.documentElement,
script = document.createElement("script");
script.text = pageScriptString;
script.async = false;
- script.setAttribute("data-event-id", event_id);
+ script.setAttribute("data-event-id", eventId);
script.setAttribute("data-testing", `${testing}`);
parent.insertBefore(script, parent.firstChild);
parent.removeChild(script);
@@ -46,10 +46,10 @@ function emitMsg(type, msg) {
});
}
-const $event_id = Math.random().toString();
+const eventId = Math.random().toString();
// listen for messages from the script we are about to insert
-document.addEventListener($event_id, function(e: CustomEvent) {
+document.addEventListener(eventId, function(e: CustomEvent) {
// pass these on to the background page
const msgs = e.detail;
if (Array.isArray(msgs)) {
@@ -64,7 +64,7 @@ document.addEventListener($event_id, function(e: CustomEvent) {
export function injectJavascriptInstrumentPageScript(contentScriptConfig) {
insertScript(
getPageScriptAsString(contentScriptConfig.jsInstrumentationRequestsString),
- $event_id,
+ eventId,
contentScriptConfig.testing,
);
}
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index 63e0f459d..b85f4ce57 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -4,17 +4,17 @@
export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
// messages the injected script
- function sendMessagesToLogger($event_id, messages) {
+ function sendMessagesToLogger(eventId, messages) {
document.dispatchEvent(
- new CustomEvent($event_id, {
+ new CustomEvent(eventId, {
detail: messages,
}),
);
}
- const event_id = document.currentScript.getAttribute("data-event-id");
+ const eventId = document.currentScript.getAttribute("data-event-id");
const testing = document.currentScript.getAttribute("data-testing");
- const instrumentJS = $getInstrumentJS(event_id, sendMessagesToLogger);
+const instrumentJS = $getInstrumentJS(eventId, sendMessagesToLogger);
let t0: number;
if (testing === "true") {
console.log("OpenWPM: Currently testing");
diff --git a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
index 331b7e05f..8876c595a 100644
--- a/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
+++ b/automation/Extension/webext-instrumentation/src/lib/js-instruments.ts
@@ -29,7 +29,7 @@ declare global {
}
}
-export function getInstrumentJS(event_id: string, sendMessagesToLogger) {
+export function getInstrumentJS(eventId: string, sendMessagesToLogger) {
/*
* Instrumentation helpers
* (Inlined in order for jsInstruments to be easily exportable as a string)
@@ -741,11 +741,11 @@ export function getInstrumentJS(event_id: string, sendMessagesToLogger) {
}
}
- const sendFactory = function($event_id, $sendMessagesToLogger) {
+ const sendFactory = function(eventId, $sendMessagesToLogger) {
let messages = [];
// debounce sending queued messages
const _send = debounce(function() {
- $sendMessagesToLogger($event_id, messages);
+ $sendMessagesToLogger(eventId, messages);
// clear the queue
messages = [];
@@ -758,7 +758,7 @@ export function getInstrumentJS(event_id: string, sendMessagesToLogger) {
};
};
- const send = sendFactory(event_id, sendMessagesToLogger);
+ const send = sendFactory(eventId, sendMessagesToLogger);
function instrumentJS(JSInstrumentRequests: JSInstrumentRequest[]) {
// The JS Instrument Requests are setup and validated python side
diff --git a/automation/Extension/webext-instrumentation/tslint.json b/automation/Extension/webext-instrumentation/tslint.json
index 5b6a672c7..2dae28e23 100644
--- a/automation/Extension/webext-instrumentation/tslint.json
+++ b/automation/Extension/webext-instrumentation/tslint.json
@@ -6,6 +6,7 @@
],
"rules": {
"no-object-literal-type-assertion": false,
+ "no-shadowed-variable": false,
"interface-name": [
true,
"never-prefix"
From dd5cb98b789d0cfaafc2c47c6dcfeb9ab1b79549 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:53:25 -0500
Subject: [PATCH 082/106] Flake8
---
crawler.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/crawler.py b/crawler.py
index 5f22faa24..094c3325b 100644
--- a/crawler.py
+++ b/crawler.py
@@ -26,7 +26,8 @@
NAVIGATION_INSTRUMENT = os.getenv('NAVIGATION_INSTRUMENT', '1') == '1'
JS_INSTRUMENT = os.getenv('JS_INSTRUMENT', '1') == '1'
CALLSTACK_INSTRUMENT = os.getenv('CALLSTACK_INSTRUMENT', '1') == '1'
-JS_INSTRUMENT_SETTINGS = os.getenv('JS_INSTRUMENT_SETTINGS', '["fingerprinting"]')
+JS_INSTRUMENT_SETTINGS = os.getenv(
+ 'JS_INSTRUMENT_SETTINGS', '["fingerprinting"]')
SAVE_CONTENT = os.getenv('SAVE_CONTENT', '')
PREFS = os.getenv('PREFS', None)
DWELL_TIME = int(os.getenv('DWELL_TIME', '10'))
From 98b4e37bd4c80e02a94e1f3304a36610abca04ff Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 20:57:20 -0500
Subject: [PATCH 083/106] Remove $ prefix and rename
$instrumentionRequests -> jsInstrumentationSettings
---
.../src/content/javascript-instrument-page-scope.ts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index b85f4ce57..1f6801075 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -2,7 +2,7 @@
// Also, no webpack/es6 imports may be used in this file since the script
// is exported as a page script as a string
-export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
+export const pageScript = function(getInstrumentJS, jsInstrumentationSettings) {
// messages the injected script
function sendMessagesToLogger(eventId, messages) {
document.dispatchEvent(
@@ -14,21 +14,21 @@ export const pageScript = function($getInstrumentJS, $instrumentionRequests) {
const eventId = document.currentScript.getAttribute("data-event-id");
const testing = document.currentScript.getAttribute("data-testing");
-const instrumentJS = $getInstrumentJS(eventId, sendMessagesToLogger);
+const instrumentJS = getInstrumentJS(eventId, sendMessagesToLogger);
let t0: number;
if (testing === "true") {
console.log("OpenWPM: Currently testing");
t0 = performance.now();
console.log("Begin loading JS instrumentation.");
}
- instrumentJS($instrumentionRequests);
+ instrumentJS(jsInstrumentationSettings);
if (testing === "true") {
const t1 = performance.now();
console.log(`Call to instrumentJS took ${t1 - t0} milliseconds.`);
(window as any).instrumentJS = instrumentJS;
console.log(
"OpenWPM: Content-side javascript instrumentation started with spec:",
- $instrumentionRequests,
+ jsInstrumentationSettings,
new Date().toISOString(),
"(if spec is '' check web console.)",
);
From 101c41acbc6283243b6c10d421ab08ed5d540194 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 21:03:35 -0500
Subject: [PATCH 084/106] Rename
jsInstrumentationRequests->jsInstrumentationSettings
---
.../src/background/javascript-instrument.ts | 4 ++--
.../src/content/javascript-instrument-content-scope.ts | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
index 491fbb8d9..421ce3d8a 100644
--- a/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
+++ b/automation/Extension/webext-instrumentation/src/background/javascript-instrument.ts
@@ -112,11 +112,11 @@ export class JavascriptInstrument {
public async registerContentScript(
testing: boolean,
- jsInstrumentationRequestsString: string,
+ jsInstrumentationSettingsString: string,
) {
const contentScriptConfig = {
testing,
- jsInstrumentationRequestsString,
+ jsInstrumentationSettingsString,
};
if (contentScriptConfig) {
// TODO: Avoid using window to pass the content script config
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
index c93a30b46..b5aa4a06f 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-content-scope.ts
@@ -2,7 +2,7 @@ import { getInstrumentJS } from "../lib/js-instruments";
import { pageScript } from "./javascript-instrument-page-scope";
function getPageScriptAsString(
- jsInstrumentationRequestsString: string,
+ jsInstrumentationSettingsString: string,
): string {
// The JS Instrument Requests are setup and validated python side
// including setting defaults for logSettings. See JSInstrumentation.py
@@ -12,11 +12,11 @@ ${getInstrumentJS}
// End of js-instruments.
// Start of custom instrumentRequests.
-const instrumentationRequests = ${jsInstrumentationRequestsString};
+const jsInstrumentationSettings = ${jsInstrumentationSettingsString};
// End of custom instrumentRequests.
// Start of anonymous function from javascript-instrument-page-scope.ts
-(${pageScript}(getInstrumentJS, instrumentationRequests));
+(${pageScript}(getInstrumentJS, jsInstrumentationSettings));
// End.
`;
return pageScriptString;
@@ -63,7 +63,7 @@ document.addEventListener(eventId, function(e: CustomEvent) {
export function injectJavascriptInstrumentPageScript(contentScriptConfig) {
insertScript(
- getPageScriptAsString(contentScriptConfig.jsInstrumentationRequestsString),
+ getPageScriptAsString(contentScriptConfig.jsInstrumentationSettingsString),
eventId,
contentScriptConfig.testing,
);
From ac808fc13db5026b3593f5c6900d0609d8e5a8fc Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 23 Jun 2020 21:06:28 -0500
Subject: [PATCH 085/106] TS Lint
---
.../src/content/javascript-instrument-page-scope.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
index 1f6801075..4f75b3781 100755
--- a/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
+++ b/automation/Extension/webext-instrumentation/src/content/javascript-instrument-page-scope.ts
@@ -14,7 +14,7 @@ export const pageScript = function(getInstrumentJS, jsInstrumentationSettings) {
const eventId = document.currentScript.getAttribute("data-event-id");
const testing = document.currentScript.getAttribute("data-testing");
-const instrumentJS = getInstrumentJS(eventId, sendMessagesToLogger);
+ const instrumentJS = getInstrumentJS(eventId, sendMessagesToLogger);
let t0: number;
if (testing === "true") {
console.log("OpenWPM: Currently testing");
From 6756eaf858aa5ad1aa2004c0188a3b3bdf900825 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 14:33:45 -0500
Subject: [PATCH 086/106] Remove use of "request".
Rename python side as per discussion with @englehardt.
Privatize most methods
Numpy docstrings for public methods
---
automation/JSInstrumentation.py | 157 ++++++++++++++++++++------------
automation/TaskManager.py | 10 +-
test/test_js_instrument_py.py | 57 ++++++------
3 files changed, 133 insertions(+), 91 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 51f284d6c..6e8a38581 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -19,21 +19,7 @@
}
-def get_default_log_settings():
- return {
- 'propertiesToInstrument': [],
- 'nonExistingPropertiesToInstrument': [],
- 'excludedProperties': [],
- 'logCallStack': False,
- 'logFunctionsAsStrings': False,
- 'logFunctionGets': False,
- 'preventSets': False,
- 'recursive': False,
- 'depth': 5,
- }
-
-
-def python_to_js_string(py_in):
+def _python_to_js_string(py_in):
"""Takes python in and converts it to a string
of the equivalent JS object.
@@ -50,43 +36,43 @@ def python_to_js_string(py_in):
return out
-def validate(python_list_to_validate):
+def _validate(python_list_to_validate):
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
- for request in python_list_to_validate:
+ for setting in python_list_to_validate:
propertiesToInstrument = \
- request['logSettings']['propertiesToInstrument']
+ setting['logSettings']['propertiesToInstrument']
if propertiesToInstrument is not None:
propertiesToInstrument = set(propertiesToInstrument)
excludedProperties = set(
- request['logSettings']['excludedProperties'])
+ setting['logSettings']['excludedProperties'])
assert len(propertiesToInstrument.intersection(
excludedProperties)) == 0
return True
-def merge_object_requests(python_list):
+def _merge_settings(python_list):
"""
- Try to merge requests for the same object. Note that
+ Try to merge settings for the same object. Note that
this isn't that smart and you could still
end up instrumenting a property twice if you're
not careful.
"""
merged_map = {}
- for request in python_list:
- obj = request['object']
+ for setting in python_list:
+ obj = setting['object']
if obj not in merged_map:
- merged_map[obj] = request
+ merged_map[obj] = setting
else:
- existing_request = merged_map[obj]
- new_request = request
- if (new_request['instrumentedName']
- != existing_request['instrumentedName']):
+ existing_setting = merged_map[obj]
+ new_setting = setting
+ if (new_setting['instrumentedName']
+ != existing_setting['instrumentedName']):
raise RuntimeError(
f'Mismatching instrumentedNames found for object {obj}')
- existing_logSettings = existing_request['logSettings']
- new_logSettings = new_request['logSettings']
+ existing_logSettings = existing_setting['logSettings']
+ new_logSettings = new_setting['logSettings']
for k, v in existing_logSettings.items():
# Special case for lists
if k in list_log_settings:
@@ -105,9 +91,9 @@ def merge_object_requests(python_list):
merged_list = list(merged_map.values())
# Make sure list logSettings are unique
- for request in merged_list:
+ for setting in merged_list:
for logSetting in list_log_settings:
- list_setting_value = request['logSettings'][logSetting]
+ list_setting_value = setting['logSettings'][logSetting]
if list_setting_value is None:
continue
else:
@@ -116,8 +102,8 @@ def merge_object_requests(python_list):
f'Mismatching logSettings for object {obj}')
else:
# Dedupe
- request['logSettings'][logSetting] = list(
- set(request['logSettings'][logSetting])
+ setting['logSettings'][logSetting] = list(
+ set(setting['logSettings'][logSetting])
)
return merged_list
@@ -132,9 +118,9 @@ def _handle_obj_string(obj_string):
return obj, instrumentedName
-def build_object_from_request(request):
+def _build_object_from_instrumentation_input(input_):
"""
- We need to build a valid object from each request.
+ We need to build a valid object from each setting.
The item may be a string or an object with one key.
If the item is a string:
@@ -151,12 +137,12 @@ def build_object_from_request(request):
obj = None
instrumentedName = None
logSettings = get_default_log_settings()
- if isinstance(request, str):
- obj, instrumentedName = _handle_obj_string(request)
- elif isinstance(request, dict):
- assert len(request.keys()) == 1
- req = list(request.keys())[0]
- props = request[req]
+ if isinstance(input_, str):
+ obj, instrumentedName = _handle_obj_string(input_)
+ elif isinstance(input_, dict):
+ assert len(input_.keys()) == 1
+ req = list(input_.keys())[0]
+ props = input_[req]
obj, instrumentedName = _handle_obj_string(req)
if isinstance(props, list):
logSettings['propertiesToInstrument'] = props
@@ -174,31 +160,82 @@ def build_object_from_request(request):
}
-def convert_browser_params_to_js_string(js_instrument_settings):
+def get_default_log_settings():
+ """Returns a dictionary of default instrumentation settings.
+
+ The set of instrumentation settings to be used when
+ others are not provided. The specification of these
+ settings is detailed in ``js_instrument_settings.schema``.
+
+
+ Returns
+ -------
+ dict
+ Dictionary of default instrumentation settings
"""
- We accept a list. From the list we need to parse each item.
- Examples of the requests we accept.
- // Shortcut
- "fingerprinting",
- // APIs
- {"XMLHttpRequest": {"badSetting": 1}},
+ return {
+ 'propertiesToInstrument': [],
+ 'nonExistingPropertiesToInstrument': [],
+ 'excludedProperties': [],
+ 'logCallStack': False,
+ 'logFunctionsAsStrings': False,
+ 'logFunctionGets': False,
+ 'preventSets': False,
+ 'recursive': False,
+ 'depth': 5,
+ }
+
+
+def clean_js_instrumentation_settings(user_requested_settings):
+ """Convert user input JSinstrumentation settings to full settings object.
+
+ Accepts a list. From the list we need to parse each item.
+ Examples of the settings we accept.
+
+ ```
+ // Collections
+ "collection_fingerprinting",
+ // APIs, with or without settings details
+ "XMLHttpRequest",
{"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ // APIs with shortcut to includedProperties
{"Prop1": ["hi"], "Prop2": ["hi2"]},
{"XMLHttpRequest": ["send"]},
"Storage",
// Specific instances on window
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
+ ```
+
+ Parameters
+ ----------
+ user_requested_settings: list
+ The list of JS Instrumentation settings requested by
+ the user, which may include syntactic shortcuts as outlined
+ in method docs.
+
+
+ Returns
+ -------
+ list
+ List of all requested JS Instrumentation with all settings
+ applied. Has been nominally de-duped and validated against
+ `js_instrument_settings.schema``.
+
"""
- assert isinstance(js_instrument_settings, list)
- requests = []
- for request in js_instrument_settings:
- if isinstance(request, str) and (request in shortcut_specs):
- shortcut_spec = json.loads(open(shortcut_specs[request]).read())
- for sub_request in shortcut_spec:
- requests.append(build_object_from_request(sub_request))
+ if not isinstance(user_requested_settings, list):
+ raise TypeError(
+ f"js_instrumentation_settings must be a list. \
+ Received {user_requested_settings}")
+ settings = []
+ for setting in user_requested_settings:
+ if isinstance(setting, str) and (setting in shortcut_specs):
+ shortcut_spec = json.loads(open(shortcut_specs[setting]).read())
+ for sub_setting in shortcut_spec:
+ settings.append(
+ _build_object_from_instrumentation_input(sub_setting))
else:
- requests.append(build_object_from_request(request))
- requests = merge_object_requests(requests)
- validate(requests)
- return python_to_js_string(requests)
+ settings.append(_build_object_from_instrumentation_input(setting))
+ settings = _merge_settings(settings)
+ _validate(settings)
+ return _python_to_js_string(settings)
diff --git a/automation/TaskManager.py b/automation/TaskManager.py
index cf7e26948..ccf7c8f5d 100644
--- a/automation/TaskManager.py
+++ b/automation/TaskManager.py
@@ -19,7 +19,7 @@
from .DataAggregator.BaseAggregator import (ACTION_TYPE_FINALIZE,
RECORD_TYPE_SPECIAL)
from .Errors import CommandExecutionError
-from .JSInstrumentation import convert_browser_params_to_js_string
+from .JSInstrumentation import clean_js_instrumentation_settings
from .MPLogger import MPLogger
from .SocketInterface import clientsocket
from .utilities.platform_utils import get_configuration_string, get_version
@@ -117,10 +117,10 @@ def __init__(self, manager_params: Dict[str, Any],
# Parse and flesh out js_instrument_settings
for a_browsers_params in self.browser_params:
- js_request = a_browsers_params['js_instrument_settings']
- js_request_as_string = convert_browser_params_to_js_string(
- js_request)
- a_browsers_params['js_instrument_settings'] = js_request_as_string
+ js_settings = a_browsers_params['js_instrument_settings']
+ cleaned_js_settings = clean_js_instrumentation_settings(
+ js_settings)
+ a_browsers_params['js_instrument_settings'] = cleaned_js_settings
# Flow control
self.closing = False
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index fbcbfa25b..546246d93 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -30,14 +30,14 @@ def test_python_to_js_lower_true_false():
}
}]
""")
- actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
assert actual_out == expected_out
def test_python_to_js_no_quote_object():
inpy = [{'object': 'window', 'logSettings': {}}]
expected_out = _no_whitespace('[{"object": window, "logSettings": {}}]')
- actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
assert actual_out == expected_out
@@ -52,7 +52,7 @@ def test_python_to_js_no_quote_object_two_matching_objects():
{"object": window, "logSettings": {}},
{"object": window2, "logSettings": {}}
]""")
- actual_out = _no_whitespace(jsi.python_to_js_string(inpy))
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
assert actual_out == expected_out
@@ -70,7 +70,7 @@ def test_validate_good(default_log_settings):
'logSettings': default_log_settings
}
]
- assert jsi.validate(good_input)
+ assert jsi._validate(good_input)
def test_validate_bad__log_settings_missing(default_log_settings):
@@ -87,7 +87,7 @@ def test_validate_bad__log_settings_missing(default_log_settings):
}
]
with pytest.raises(ValidationError):
- jsi.validate(bad_input),
+ jsi._validate(bad_input),
def test_validate_bad__log_settings_invalid(default_log_settings):
@@ -101,7 +101,7 @@ def test_validate_bad__log_settings_invalid(default_log_settings):
}
]
with pytest.raises(ValidationError):
- assert jsi.validate(bad_input)
+ assert jsi._validate(bad_input)
def test_validate_bad__not_a_list(default_log_settings):
@@ -111,7 +111,7 @@ def test_validate_bad__not_a_list(default_log_settings):
'logSettings': default_log_settings
}
with pytest.raises(ValidationError):
- assert jsi.validate(bad_input)
+ assert jsi._validate(bad_input)
def test_validate_bad__missing_object(default_log_settings):
@@ -120,7 +120,7 @@ def test_validate_bad__missing_object(default_log_settings):
'logSettings': default_log_settings
}]
with pytest.raises(ValidationError):
- assert jsi.validate(bad_input)
+ assert jsi._validate(bad_input)
def test_validated_bad__missing_instrumentedName(default_log_settings):
@@ -129,7 +129,7 @@ def test_validated_bad__missing_instrumentedName(default_log_settings):
'logSettings': default_log_settings
}]
with pytest.raises(ValidationError):
- assert jsi.validate(bad_input)
+ assert jsi._validate(bad_input)
def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties_to_exclude(default_log_settings): # noqa
@@ -149,9 +149,9 @@ def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties
'logSettings': log_settings_2
},
]
- merged = jsi.merge_object_requests(dupe_input)
+ merged = jsi._merge_settings(dupe_input)
with pytest.raises(AssertionError):
- jsi.validate(merged)
+ jsi._validate(merged)
def test_merge_and_validate_multiple_overlap_properties(default_log_settings):
@@ -181,7 +181,7 @@ def test_merge_and_validate_multiple_overlap_properties(default_log_settings):
'logSettings': log_settings_merge
},
]
- actual_output = jsi.merge_object_requests(dupe_input)
+ actual_output = jsi._merge_settings(dupe_input)
for key in ['object', 'instrumentedName']:
assert expected_de_dupe_output[0][key] == actual_output[0][key]
assert set(expected_de_dupe_output[0]['logSettings']) == \
@@ -209,7 +209,7 @@ def test_merge_when_log_settings_is_null(default_log_settings):
'logSettings': log_settings_some
},
]
- actual_output = jsi.merge_object_requests(input_1)
+ actual_output = jsi._merge_settings(input_1)
assert actual_output == input_1
input_2 = [
@@ -225,7 +225,7 @@ def test_merge_when_log_settings_is_null(default_log_settings):
},
]
with pytest.raises(RuntimeError) as error:
- jsi.merge_object_requests(input_2)
+ jsi._merge_settings(input_2)
assert 'Mismatching logSettings' in str(error.value)
input_3 = [
@@ -241,7 +241,7 @@ def test_merge_when_log_settings_is_null(default_log_settings):
},
]
with pytest.raises(RuntimeError) as error:
- jsi.merge_object_requests(input_3)
+ jsi._merge_settings(input_3)
assert 'Mismatching logSettings' in str(error.value)
@@ -259,7 +259,7 @@ def test_merge_diff_instrumented_names(default_log_settings):
},
]
with pytest.raises(RuntimeError) as error:
- jsi.merge_object_requests(dupe_input)
+ jsi._merge_settings(dupe_input)
assert 'Mismatching instrumentedNames' in str(error.value)
@@ -283,7 +283,7 @@ def test_merge_multiple_duped_properties(default_log_settings):
'logSettings': default_log_settings
},
]
- assert jsi.merge_object_requests(dupe_input) == expected_de_dupe_output
+ assert jsi._merge_settings(dupe_input) == expected_de_dupe_output
def test_merge_multiple_duped_properties_different_log_settings(default_log_settings): # noqa
@@ -304,7 +304,7 @@ def test_merge_multiple_duped_properties_different_log_settings(default_log_sett
},
]
with pytest.raises(RuntimeError) as error:
- jsi.merge_object_requests(dupe_input)
+ jsi._merge_settings(dupe_input)
assert 'Mismatching logSettings for object' in str(error.value)
@@ -315,14 +315,15 @@ def test_api_whole_module(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': default_log_settings,
}
- actual_output = jsi.build_object_from_request(shortcut_input)
+ actual_output = jsi._build_object_from_instrumentation_input(
+ shortcut_input)
assert actual_output == expected_output
def test_api_two_keys_in_shortcut():
shortcut_input = {'k1': [], 'k2': []}
with pytest.raises(AssertionError):
- jsi.build_object_from_request(shortcut_input)
+ jsi._build_object_from_instrumentation_input(shortcut_input)
def test_api_instances_on_window(default_log_settings):
@@ -332,7 +333,8 @@ def test_api_instances_on_window(default_log_settings):
'instrumentedName': 'window.navigator',
'logSettings': default_log_settings,
}
- actual_output = jsi.build_object_from_request(shortcut_input)
+ actual_output = jsi._build_object_from_instrumentation_input(
+ shortcut_input)
assert actual_output == expected_output
@@ -345,7 +347,8 @@ def test_api_instances_on_window_with_properties(default_log_settings):
'instrumentedName': 'window',
'logSettings': log_settings,
}
- actual_output = jsi.build_object_from_request(shortcut_input)
+ actual_output = jsi._build_object_from_instrumentation_input(
+ shortcut_input)
assert actual_output == expected_output
@@ -358,7 +361,8 @@ def test_api_module_specific_properties(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
- actual_output = jsi.build_object_from_request(shortcut_input)
+ actual_output = jsi._build_object_from_instrumentation_input(
+ shortcut_input)
assert actual_output == expected_output
@@ -378,7 +382,8 @@ def test_api_passing_partial_log_settings(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
- actual_output = jsi.build_object_from_request(shortcut_input)
+ actual_output = jsi._build_object_from_instrumentation_input(
+ shortcut_input)
assert actual_output == expected_output
@@ -386,7 +391,7 @@ def test_api_shortcut_fingerprinting():
# This is a very crude test, there are other tests to
# check fingeprinting instrumentation in more detail
shortcut_input = ['fingerprinting']
- output = jsi.convert_browser_params_to_js_string(shortcut_input)
+ output = jsi.clean_js_instrumentation_settings(shortcut_input)
assert 'window.document' in output
assert 'window[\'AudioContext\'].prototype' in output
@@ -397,6 +402,6 @@ def test_complete_pass():
'window': {'recursive': True}
}
]
- output = jsi.convert_browser_params_to_js_string(shortcut_input)
+ output = jsi.clean_js_instrumentation_settings(shortcut_input)
assert '"recursive": true' in output
assert '"instrumentedName": "window"' in output
From 520c782421e9757210630fa859dc0e3de28ebb29 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 14:49:52 -0500
Subject: [PATCH 087/106] Convert assertions to ValueErrors
---
automation/JSInstrumentation.py | 45 +++++++++++++++++++++++----------
test/test_js_instrument_py.py | 16 ++++++------
2 files changed, 39 insertions(+), 22 deletions(-)
diff --git a/automation/JSInstrumentation.py b/automation/JSInstrumentation.py
index 6e8a38581..be7008e2c 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/JSInstrumentation.py
@@ -47,8 +47,12 @@ def _validate(python_list_to_validate):
propertiesToInstrument = set(propertiesToInstrument)
excludedProperties = set(
setting['logSettings']['excludedProperties'])
- assert len(propertiesToInstrument.intersection(
- excludedProperties)) == 0
+ if len(propertiesToInstrument.intersection(
+ excludedProperties)) != 0:
+ raise ValueError(f"excludedProperties and \
+ propertiesToInstrument collide. This \
+ may have occurred after a merge. \
+ Setting with collision: {setting}.")
return True
@@ -118,7 +122,7 @@ def _handle_obj_string(obj_string):
return obj, instrumentedName
-def _build_object_from_instrumentation_input(input_):
+def _build_full_settings_object(setting):
"""
We need to build a valid object from each setting.
@@ -137,22 +141,35 @@ def _build_object_from_instrumentation_input(input_):
obj = None
instrumentedName = None
logSettings = get_default_log_settings()
- if isinstance(input_, str):
- obj, instrumentedName = _handle_obj_string(input_)
- elif isinstance(input_, dict):
- assert len(input_.keys()) == 1
- req = list(input_.keys())[0]
- props = input_[req]
- obj, instrumentedName = _handle_obj_string(req)
+
+ if isinstance(setting, str):
+ obj, instrumentedName = _handle_obj_string(setting)
+
+ elif isinstance(setting, dict):
+
+ if len(setting.keys()) != 1:
+ raise ValueError(f"Invalid settings request. \
+ Settings item is a dictionary with more \
+ than one key. Received {setting}.")
+
+ setting_key = list(setting.keys())[0]
+ props = setting[setting_key]
+ obj, instrumentedName = _handle_obj_string(setting_key)
if isinstance(props, list):
logSettings['propertiesToInstrument'] = props
elif isinstance(props, dict):
for k, v in props.items():
logSettings[k] = v
else:
- raise RuntimeError('Invalid settings for object')
+ raise ValueError(f"Invalid settings request. \
+ Setting was a dictionary. Settings value \
+ must be a list or a dictionary. Received \
+ {setting}.")
else:
- raise RuntimeError('Invalid input')
+ raise ValueError(f"Invalid settings request. \
+ Must be a string or a dictionary. \
+ Received {setting}.")
+
return {
'object': obj,
'instrumentedName': instrumentedName,
@@ -233,9 +250,9 @@ def clean_js_instrumentation_settings(user_requested_settings):
shortcut_spec = json.loads(open(shortcut_specs[setting]).read())
for sub_setting in shortcut_spec:
settings.append(
- _build_object_from_instrumentation_input(sub_setting))
+ _build_full_settings_object(sub_setting))
else:
- settings.append(_build_object_from_instrumentation_input(setting))
+ settings.append(_build_full_settings_object(setting))
settings = _merge_settings(settings)
_validate(settings)
return _python_to_js_string(settings)
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index 546246d93..eff6bd7ae 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -150,7 +150,7 @@ def test_merge_and_validate_multiple_overlap_properties_to_instrument_properties
},
]
merged = jsi._merge_settings(dupe_input)
- with pytest.raises(AssertionError):
+ with pytest.raises(ValueError):
jsi._validate(merged)
@@ -315,15 +315,15 @@ def test_api_whole_module(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': default_log_settings,
}
- actual_output = jsi._build_object_from_instrumentation_input(
+ actual_output = jsi._build_full_settings_object(
shortcut_input)
assert actual_output == expected_output
def test_api_two_keys_in_shortcut():
shortcut_input = {'k1': [], 'k2': []}
- with pytest.raises(AssertionError):
- jsi._build_object_from_instrumentation_input(shortcut_input)
+ with pytest.raises(ValueError):
+ jsi._build_full_settings_object(shortcut_input)
def test_api_instances_on_window(default_log_settings):
@@ -333,7 +333,7 @@ def test_api_instances_on_window(default_log_settings):
'instrumentedName': 'window.navigator',
'logSettings': default_log_settings,
}
- actual_output = jsi._build_object_from_instrumentation_input(
+ actual_output = jsi._build_full_settings_object(
shortcut_input)
assert actual_output == expected_output
@@ -347,7 +347,7 @@ def test_api_instances_on_window_with_properties(default_log_settings):
'instrumentedName': 'window',
'logSettings': log_settings,
}
- actual_output = jsi._build_object_from_instrumentation_input(
+ actual_output = jsi._build_full_settings_object(
shortcut_input)
assert actual_output == expected_output
@@ -361,7 +361,7 @@ def test_api_module_specific_properties(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
- actual_output = jsi._build_object_from_instrumentation_input(
+ actual_output = jsi._build_full_settings_object(
shortcut_input)
assert actual_output == expected_output
@@ -382,7 +382,7 @@ def test_api_passing_partial_log_settings(default_log_settings):
'instrumentedName': 'XMLHttpRequest',
'logSettings': log_settings,
}
- actual_output = jsi._build_object_from_instrumentation_input(
+ actual_output = jsi._build_full_settings_object(
shortcut_input)
assert actual_output == expected_output
From 8ac03dcbc6b1294a358ffce395b2852423b05ec7 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 17:42:17 -0500
Subject: [PATCH 088/106] Rename file/folder and fingerprinting ->
collection_fingerprinting
file JSInstrumentation.py -> js_instrumentation/__init__.py
collections have their own folder
---
automation/TaskManager.py | 2 +-
automation/default_browser_params.json | 2 +-
.../__init__.py} | 8 ++++----
.../{ => collections}/fingerprinting.json | 0
crawler.py | 2 +-
test/test_js_instrument_py.py | 6 +++---
6 files changed, 10 insertions(+), 10 deletions(-)
rename automation/{JSInstrumentation.py => js_instrumentation/__init__.py} (97%)
rename automation/js_instrumentation/{ => collections}/fingerprinting.json (100%)
diff --git a/automation/TaskManager.py b/automation/TaskManager.py
index ccf7c8f5d..4c2983a20 100644
--- a/automation/TaskManager.py
+++ b/automation/TaskManager.py
@@ -19,7 +19,7 @@
from .DataAggregator.BaseAggregator import (ACTION_TYPE_FINALIZE,
RECORD_TYPE_SPECIAL)
from .Errors import CommandExecutionError
-from .JSInstrumentation import clean_js_instrumentation_settings
+from .js_instrumentation import clean_js_instrumentation_settings
from .MPLogger import MPLogger
from .SocketInterface import clientsocket
from .utilities.platform_utils import get_configuration_string, get_version
diff --git a/automation/default_browser_params.json b/automation/default_browser_params.json
index f8c78c794..013688536 100644
--- a/automation/default_browser_params.json
+++ b/automation/default_browser_params.json
@@ -2,7 +2,7 @@
"extension_enabled": true,
"cookie_instrument": false,
"js_instrument": false,
- "js_instrument_settings": ["fingerprinting"],
+ "js_instrument_settings": ["collection_fingerprinting"],
"http_instrument": false,
"navigation_instrument": false,
"save_content": false,
diff --git a/automation/JSInstrumentation.py b/automation/js_instrumentation/__init__.py
similarity index 97%
rename from automation/JSInstrumentation.py
rename to automation/js_instrumentation/__init__.py
index be7008e2c..993ef670a 100644
--- a/automation/JSInstrumentation.py
+++ b/automation/js_instrumentation/__init__.py
@@ -5,7 +5,7 @@
curdir = os.path.dirname(os.path.realpath(__file__))
schema_path = os.path.join(
- curdir, 'js_instrumentation', 'js_instrument_settings.schema'
+ curdir, 'js_instrument_settings.schema'
)
list_log_settings = [
@@ -14,8 +14,8 @@
'excludedProperties'
]
shortcut_specs = {
- 'fingerprinting':
- os.path.join(curdir, 'js_instrumentation', 'fingerprinting.json')
+ 'collection_fingerprinting':
+ os.path.join(curdir, 'collections', 'fingerprinting.json')
}
@@ -128,7 +128,7 @@ def _build_full_settings_object(setting):
The item may be a string or an object with one key.
If the item is a string:
- - Is it a shortcut e.g. "fingerprinting"
+ - Is it a shortcut e.g. "collection_fingerprinting"
- Is it an object (verified by mdn-browser-compat)
- If neither, reject
If the item is an object:
diff --git a/automation/js_instrumentation/fingerprinting.json b/automation/js_instrumentation/collections/fingerprinting.json
similarity index 100%
rename from automation/js_instrumentation/fingerprinting.json
rename to automation/js_instrumentation/collections/fingerprinting.json
diff --git a/crawler.py b/crawler.py
index 094c3325b..e13b14760 100644
--- a/crawler.py
+++ b/crawler.py
@@ -27,7 +27,7 @@
JS_INSTRUMENT = os.getenv('JS_INSTRUMENT', '1') == '1'
CALLSTACK_INSTRUMENT = os.getenv('CALLSTACK_INSTRUMENT', '1') == '1'
JS_INSTRUMENT_SETTINGS = os.getenv(
- 'JS_INSTRUMENT_SETTINGS', '["fingerprinting"]')
+ 'JS_INSTRUMENT_SETTINGS', '["collection_fingerprinting"]')
SAVE_CONTENT = os.getenv('SAVE_CONTENT', '')
PREFS = os.getenv('PREFS', None)
DWELL_TIME = int(os.getenv('DWELL_TIME', '10'))
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index eff6bd7ae..dc46dadca 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -1,7 +1,7 @@
import pytest
from jsonschema.exceptions import ValidationError
-from ..automation import JSInstrumentation as jsi
+from ..automation import js_instrumentation as jsi
pytestmark = pytest.mark.pyonly
@@ -387,10 +387,10 @@ def test_api_passing_partial_log_settings(default_log_settings):
assert actual_output == expected_output
-def test_api_shortcut_fingerprinting():
+def test_api_collection_fingerprinting():
# This is a very crude test, there are other tests to
# check fingeprinting instrumentation in more detail
- shortcut_input = ['fingerprinting']
+ shortcut_input = ['collection_fingerprinting']
output = jsi.clean_js_instrumentation_settings(shortcut_input)
assert 'window.document' in output
assert 'window[\'AudioContext\'].prototype' in output
From bceda0e6bd19365a849eac8a6604d461ef79c91a Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 17:50:06 -0500
Subject: [PATCH 089/106] Clean-up naming in schema
---
automation/js_instrumentation/js_instrument_settings.schema | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/automation/js_instrumentation/js_instrument_settings.schema b/automation/js_instrumentation/js_instrument_settings.schema
index 84a9e0c65..1dbde937d 100644
--- a/automation/js_instrumentation/js_instrument_settings.schema
+++ b/automation/js_instrumentation/js_instrument_settings.schema
@@ -1,8 +1,8 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
- "$id": "http://example.com/js-instrument-modules.schema",
- "title": "JS Instrument Modules",
- "description": "Schema describing the JSON to be passed to JS Instrument Modules.",
+ "$id": "http://example.com/js-instrument-settings.schema",
+ "title": "JS Instrument Settings",
+ "description": "Schema describing the JSON to be passed to JS Instrument Settings.",
"type": "array",
"items": {
"type": "object",
From 8c385e0ea4456d7f637005bdb4e711d99ec2c3e9 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 18:08:51 -0500
Subject: [PATCH 090/106] Add processing of json schema to documentation
---
docs/schemas/README.md | 21 +
...tings-items-properties-instrumentedname.md | 16 +
...properties-logsettings-properties-depth.md | 24 +
...ngs-properties-excludedproperties-items.md | 16 +
...gsettings-properties-excludedproperties.md | 24 +
...ies-logsettings-properties-logcallstack.md | 16 +
...-logsettings-properties-logfunctiongets.md | 16 +
...ttings-properties-logfunctionsasstrings.md | 16 +
...nonexistingpropertiestoinstrument-items.md | 16 +
...rties-nonexistingpropertiestoinstrument.md | 24 +
...ties-logsettings-properties-preventsets.md | 16 +
...properties-propertiestoinstrument-items.md | 16 +
...tings-properties-propertiestoinstrument.md | 24 +
...erties-logsettings-properties-recursive.md | 16 +
...items-properties-logsettings-properties.md | 16 +
...t_settings-items-properties-logsettings.md | 206 +++++
...rument_settings-items-properties-object.md | 16 +
...js_instrument_settings-items-properties.md | 16 +
docs/schemas/js_instrument_settings-items.md | 72 ++
docs/schemas/js_instrument_settings.md | 16 +
package-lock.json | 794 ++++++++++++++++++
package.json | 24 +
.../js_instrument_settings.schema.json | 0
23 files changed, 1421 insertions(+)
create mode 100644 docs/schemas/README.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-instrumentedname.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-logsettings.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties-object.md
create mode 100644 docs/schemas/js_instrument_settings-items-properties.md
create mode 100644 docs/schemas/js_instrument_settings-items.md
create mode 100644 docs/schemas/js_instrument_settings.md
create mode 100644 package-lock.json
create mode 100644 package.json
rename automation/js_instrumentation/js_instrument_settings.schema => schemas/js_instrument_settings.schema.json (100%)
diff --git a/docs/schemas/README.md b/docs/schemas/README.md
new file mode 100644
index 000000000..fa904b4b5
--- /dev/null
+++ b/docs/schemas/README.md
@@ -0,0 +1,21 @@
+# README
+
+## Top-level Schemas
+
+- [JS Instrument Settings](./js_instrument_settings.md "Schema describing the JSON to be passed to JS Instrument Settings") – `http://example.com/js-instrument-settings.schema`
+
+## Other Schemas
+
+### Objects
+
+- [Untitled object in JS Instrument Settings](./js_instrument_settings-items.md) – `http://example.com/js-instrument-settings.schema#/items`
+- [Untitled object in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings.md "The log settings object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings`
+
+### Arrays
+
+- [Untitled array in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "An array of non-existing properties to instrument on this object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument`
+- [Untitled array in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "Properties excluded from instrumentation") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties`
+
+## Version Note
+
+The schemas linked above follow the JSON Schema Spec version: `http://json-schema.org/draft-07/schema#`
diff --git a/docs/schemas/js_instrument_settings-items-properties-instrumentedname.md b/docs/schemas/js_instrument_settings-items-properties-instrumentedname.md
new file mode 100644
index 000000000..b139dbd13
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-instrumentedname.md
@@ -0,0 +1,16 @@
+# Untitled string in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName
+```
+
+The name recorded by the instrumentation for this object.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## instrumentedName Type
+
+`string`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md
new file mode 100644
index 000000000..d662a0db5
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md
@@ -0,0 +1,24 @@
+# Untitled number in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth
+```
+
+Recursion limit when instrumenting object recursively
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## depth Type
+
+`number`
+
+## depth Default Value
+
+The default value is:
+
+```json
+5
+```
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md
new file mode 100644
index 000000000..2667274cb
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md
@@ -0,0 +1,16 @@
+# Untitled string in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties/items
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## items Type
+
+`string`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md
new file mode 100644
index 000000000..5bdc4a7b4
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md
@@ -0,0 +1,24 @@
+# Untitled array in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties
+```
+
+Properties excluded from instrumentation.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## excludedProperties Type
+
+`string[]`
+
+## excludedProperties Default Value
+
+The default value is:
+
+```json
+[]
+```
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md
new file mode 100644
index 000000000..1c37d3a16
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md
@@ -0,0 +1,16 @@
+# Untitled boolean in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack
+```
+
+Set to true save the call stack info with each property call.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## logCallStack Type
+
+`boolean`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md
new file mode 100644
index 000000000..7b2ddfebe
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md
@@ -0,0 +1,16 @@
+# Untitled boolean in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets
+```
+
+Set true to log get requests to properties that are functions. If true when a call is made, the log will contain both the call and a get log.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## logFunctionGets Type
+
+`boolean`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md
new file mode 100644
index 000000000..2001451fa
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md
@@ -0,0 +1,16 @@
+# Untitled boolean in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings
+```
+
+Set to true to save args that are functions as strings during argument serialization. If false `FUNCTION` is recorded.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## logFunctionsAsStrings Type
+
+`boolean`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md
new file mode 100644
index 000000000..0239c6014
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md
@@ -0,0 +1,16 @@
+# Untitled string in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument/items
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## items Type
+
+`string`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md
new file mode 100644
index 000000000..094d07adc
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md
@@ -0,0 +1,24 @@
+# Untitled array in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument
+```
+
+An array of non-existing properties to instrument on this object.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## nonExistingPropertiesToInstrument Type
+
+`string[]`
+
+## nonExistingPropertiesToInstrument Default Value
+
+The default value is:
+
+```json
+[]
+```
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md
new file mode 100644
index 000000000..82e7befe6
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md
@@ -0,0 +1,16 @@
+# Untitled boolean in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets
+```
+
+Set to true to prevent nested objects and functions from being overwritten (and thus having their instrumentation removed). Other properties (static values) can still be set with this is enabled.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## preventSets Type
+
+`boolean`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md
new file mode 100644
index 000000000..c7bb0160b
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md
@@ -0,0 +1,16 @@
+# Untitled string in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument/items
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## items Type
+
+`string`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md
new file mode 100644
index 000000000..5f5d1ed2c
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md
@@ -0,0 +1,24 @@
+# Untitled undefined type in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument
+```
+
+An array of properties to instrument on this object. If array is empty, then all properties are instrumented.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## propertiesToInstrument Type
+
+`string[]`
+
+## propertiesToInstrument Default Value
+
+The default value is:
+
+```json
+[]
+```
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md
new file mode 100644
index 000000000..ed20b27b5
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md
@@ -0,0 +1,16 @@
+# Untitled boolean in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive
+```
+
+Set to `true` to recursively instrument all object properties of the given `object`. NOTE: (1) `propertiesToInstrument` does not propagate to sub-objects. (2) Sub-objects of prototypes can not be instrumented recursively as these properties can not be accessed until an instance of the prototype is created.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## recursive Type
+
+`boolean`
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md
new file mode 100644
index 000000000..5121a0182
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md
@@ -0,0 +1,16 @@
+# Untitled undefined type in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## properties Type
+
+unknown
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings.md b/docs/schemas/js_instrument_settings-items-properties-logsettings.md
new file mode 100644
index 000000000..86e1d58ab
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-logsettings.md
@@ -0,0 +1,206 @@
+# Untitled object in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/logSettings
+```
+
+The log settings object.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ------------ | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## logSettings Type
+
+`object` ([Details](js_instrument_settings-items-properties-logsettings.md))
+
+# undefined Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------------------------------------------------------- | ------------ | -------- | -------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [propertiesToInstrument](#propertiesToInstrument) | Unknown Type | Required | can be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument") |
+| [nonExistingPropertiesToInstrument](#nonExistingPropertiesToInstrument) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument") |
+| [excludedProperties](#excludedProperties) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties") |
+| [logCallStack](#logCallStack) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logcallstack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack") |
+| [logFunctionsAsStrings](#logFunctionsAsStrings) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings") |
+| [logFunctionGets](#logFunctionGets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets") |
+| [preventSets](#preventSets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-preventsets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets") |
+| [recursive](#recursive) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive") |
+| [depth](#depth) | `number` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth") |
+
+## propertiesToInstrument
+
+An array of properties to instrument on this object. If array is empty, then all properties are instrumented.
+
+
+`propertiesToInstrument`
+
+- is required
+- Type: `string[]`
+- can be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument")
+
+### propertiesToInstrument Type
+
+`string[]`
+
+### propertiesToInstrument Default Value
+
+The default value is:
+
+```json
+[]
+```
+
+## nonExistingPropertiesToInstrument
+
+An array of non-existing properties to instrument on this object.
+
+
+`nonExistingPropertiesToInstrument`
+
+- is required
+- Type: `string[]`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument")
+
+### nonExistingPropertiesToInstrument Type
+
+`string[]`
+
+### nonExistingPropertiesToInstrument Default Value
+
+The default value is:
+
+```json
+[]
+```
+
+## excludedProperties
+
+Properties excluded from instrumentation.
+
+
+`excludedProperties`
+
+- is required
+- Type: `string[]`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties")
+
+### excludedProperties Type
+
+`string[]`
+
+### excludedProperties Default Value
+
+The default value is:
+
+```json
+[]
+```
+
+## logCallStack
+
+Set to true save the call stack info with each property call.
+
+
+`logCallStack`
+
+- is required
+- Type: `boolean`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logcallstack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack")
+
+### logCallStack Type
+
+`boolean`
+
+## logFunctionsAsStrings
+
+Set to true to save args that are functions as strings during argument serialization. If false `FUNCTION` is recorded.
+
+
+`logFunctionsAsStrings`
+
+- is required
+- Type: `boolean`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings")
+
+### logFunctionsAsStrings Type
+
+`boolean`
+
+## logFunctionGets
+
+Set true to log get requests to properties that are functions. If true when a call is made, the log will contain both the call and a get log.
+
+
+`logFunctionGets`
+
+- is required
+- Type: `boolean`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets")
+
+### logFunctionGets Type
+
+`boolean`
+
+## preventSets
+
+Set to true to prevent nested objects and functions from being overwritten (and thus having their instrumentation removed). Other properties (static values) can still be set with this is enabled.
+
+
+`preventSets`
+
+- is required
+- Type: `boolean`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-preventsets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets")
+
+### preventSets Type
+
+`boolean`
+
+## recursive
+
+Set to `true` to recursively instrument all object properties of the given `object`. NOTE: (1) `propertiesToInstrument` does not propagate to sub-objects. (2) Sub-objects of prototypes can not be instrumented recursively as these properties can not be accessed until an instance of the prototype is created.
+
+
+`recursive`
+
+- is required
+- Type: `boolean`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive")
+
+### recursive Type
+
+`boolean`
+
+## depth
+
+Recursion limit when instrumenting object recursively
+
+
+`depth`
+
+- is required
+- Type: `number`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth")
+
+### depth Type
+
+`number`
+
+### depth Default Value
+
+The default value is:
+
+```json
+5
+```
diff --git a/docs/schemas/js_instrument_settings-items-properties-object.md b/docs/schemas/js_instrument_settings-items-properties-object.md
new file mode 100644
index 000000000..9f8cf0e38
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties-object.md
@@ -0,0 +1,16 @@
+# Untitled string in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties/object
+```
+
+The JS object to be instrumented.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## object Type
+
+`string`
diff --git a/docs/schemas/js_instrument_settings-items-properties.md b/docs/schemas/js_instrument_settings-items-properties.md
new file mode 100644
index 000000000..9c054ed82
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items-properties.md
@@ -0,0 +1,16 @@
+# Untitled undefined type in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items/properties
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## properties Type
+
+unknown
diff --git a/docs/schemas/js_instrument_settings-items.md b/docs/schemas/js_instrument_settings-items.md
new file mode 100644
index 000000000..3ce58516d
--- /dev/null
+++ b/docs/schemas/js_instrument_settings-items.md
@@ -0,0 +1,72 @@
+# Untitled object in JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema#/items
+```
+
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ------------ | :---------------- | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [js_instrument_settings.schema.json\*](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## items Type
+
+`object` ([Details](js_instrument_settings-items.md))
+
+# undefined Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------------------ | -------- | -------- | -------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [object](#object) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object") |
+| [instrumentedName](#instrumentedName) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-instrumentedname.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName") |
+| [logSettings](#logSettings) | `object` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings") |
+
+## object
+
+The JS object to be instrumented.
+
+
+`object`
+
+- is required
+- Type: `string`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object")
+
+### object Type
+
+`string`
+
+## instrumentedName
+
+The name recorded by the instrumentation for this object.
+
+
+`instrumentedName`
+
+- is required
+- Type: `string`
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-instrumentedname.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName")
+
+### instrumentedName Type
+
+`string`
+
+## logSettings
+
+The log settings object.
+
+
+`logSettings`
+
+- is required
+- Type: `object` ([Details](js_instrument_settings-items-properties-logsettings.md))
+- cannot be null
+- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings")
+
+### logSettings Type
+
+`object` ([Details](js_instrument_settings-items-properties-logsettings.md))
diff --git a/docs/schemas/js_instrument_settings.md b/docs/schemas/js_instrument_settings.md
new file mode 100644
index 000000000..2549b1d31
--- /dev/null
+++ b/docs/schemas/js_instrument_settings.md
@@ -0,0 +1,16 @@
+# JS Instrument Settings Schema
+
+```txt
+http://example.com/js-instrument-settings.schema
+```
+
+Schema describing the JSON to be passed to JS Instrument Settings.
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | ---------- | -------------- | ----------------------- | :---------------- | --------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [js_instrument_settings.schema.json](../../schemas/js_instrument_settings.schema.json "open original schema") |
+
+## JS Instrument Settings Type
+
+`object[]` ([Details](js_instrument_settings-items.md))
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..4461abfe6
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,794 @@
+{
+ "name": "openwpm",
+ "version": "0.10.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@adobe/helix-log": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@adobe/helix-log/-/helix-log-4.5.1.tgz",
+ "integrity": "sha512-9++ZtL++VDDDCxUvjNaejMwTJg7OqGVfocDrYVIbRiR3gVEs6jqfgyd9bAI8aEBi+8edj0OPnUn7j8eBQKZ/Jw==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "colorette": "^1.1.0",
+ "ferrum": "^1.4.1",
+ "phin": "^3.4.0",
+ "polka": "^0.5.2",
+ "triple-beam": "^1.3.0",
+ "uuid": "^7.0.0",
+ "winston-transport": "^4.3.0"
+ }
+ },
+ "@adobe/jsonschema2md": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@adobe/jsonschema2md/-/jsonschema2md-4.1.5.tgz",
+ "integrity": "sha512-jezku/XKu/GUwto4NfAm4GQD48dKikTRnOvoXo/Ez06zM6AwX95WcLvDdJQoyWppkdJucOnYjm73JQoZqG8xlA==",
+ "requires": {
+ "@adobe/helix-log": "^4.4.0",
+ "es2015-i18n-tag": "1.6.1",
+ "ferrum": "^1.4.1",
+ "fs-extra": "^8.1.0",
+ "github-slugger": "^1.2.1",
+ "js-yaml": "3.13.1",
+ "mdast-builder": "^1.1.1",
+ "mdast-util-to-string": "^1.0.7",
+ "readdirp": "^3.3.0",
+ "remark-parse": "^7.0.2",
+ "remark-stringify": "^7.0.4",
+ "unified": "^8.4.2",
+ "unist-util-inspect": "^5.0.0",
+ "yargs": "^15.3.1"
+ }
+ },
+ "@arr/every": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz",
+ "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg=="
+ },
+ "@polka/url": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz",
+ "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw=="
+ },
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+ },
+ "@types/unist": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
+ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ=="
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "ccount": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
+ "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw=="
+ },
+ "centra": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/centra/-/centra-2.4.2.tgz",
+ "integrity": "sha512-f1RaP0V1HqVNEXfLfjNBthB2yy3KnSGnPCnOPCFLUk9e/Z4rNJ8nBaJNnghflnp88mi1IT8mfmW+HlMS1/H+bg=="
+ },
+ "character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
+ },
+ "character-entities-html4": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
+ "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g=="
+ },
+ "character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
+ },
+ "character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "collapse-white-space": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
+ "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ=="
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "colorette": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz",
+ "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "emoji-regex": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
+ "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4="
+ },
+ "es2015-i18n-tag": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/es2015-i18n-tag/-/es2015-i18n-tag-1.6.1.tgz",
+ "integrity": "sha512-MYoh9p+JTkgnzBh0MEBON6xUyzdmwT6wzsmmFJvZujGSXiI2kM+3XvFl6+AcIO2eeL6VWgtX9szSiDTMwDxyYA=="
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "ferrum": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ferrum/-/ferrum-1.7.0.tgz",
+ "integrity": "sha512-Ycr5nz/Pj7HsIqx+dZgAq27nq35bSzNzwsUbc4vFPl9PG1OgrzwDH57noH6blT7gh1XzKnqEYGrSYDU+4Vy2VA==",
+ "requires": {
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
+ "github-slugger": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz",
+ "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
+ "requires": {
+ "emoji-regex": ">=6.0.0 <=6.1.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
+ },
+ "is-alphanumeric": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
+ "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ="
+ },
+ "is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "requires": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+ "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
+ },
+ "is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
+ },
+ "is-empty": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz",
+ "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s="
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ },
+ "is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
+ },
+ "is-whitespace-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+ "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="
+ },
+ "is-word-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
+ "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "longest-streak": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
+ "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg=="
+ },
+ "markdown-escapes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
+ "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
+ },
+ "markdown-table": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
+ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q=="
+ },
+ "matchit": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.8.tgz",
+ "integrity": "sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw==",
+ "requires": {
+ "@arr/every": "^1.0.0"
+ }
+ },
+ "mdast-builder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mdast-builder/-/mdast-builder-1.1.1.tgz",
+ "integrity": "sha512-a3KBk/LmYD6wKsWi8WJrGU/rXR4yuF4Men0JO0z6dSZCm5FrXXWTRDjqK0vGSqa+1M6p9edeuypZAZAzSehTUw==",
+ "requires": {
+ "@types/unist": "^2.0.3"
+ }
+ },
+ "mdast-util-compact": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
+ "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
+ "requires": {
+ "unist-util-visit": "^1.1.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A=="
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "parse-entities": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
+ "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
+ "requires": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ },
+ "phin": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-3.5.0.tgz",
+ "integrity": "sha512-BEJYqD07B5uBFPAzNpLuLh0LzHr4MDLe0Vc6gBYi+PSIL57VbiE/UvkCc86x24pKQn2X2Keg7HTJEDr8BrBCCg==",
+ "requires": {
+ "centra": "^2.4.2"
+ }
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+ },
+ "polka": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz",
+ "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==",
+ "requires": {
+ "@polka/url": "^0.5.0",
+ "trouter": "^2.0.1"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+ "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "remark-parse": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz",
+ "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==",
+ "requires": {
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^1.1.0",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^1.0.0",
+ "vfile-location": "^2.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "remark-stringify": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-7.0.4.tgz",
+ "integrity": "sha512-qck+8NeA1D0utk1ttKcWAoHRrJxERYQzkHDyn+pF5Z4whX1ug98uCNPPSeFgLSaNERRxnD6oxIug6DzZQth6Pg==",
+ "requires": {
+ "ccount": "^1.0.0",
+ "is-alphanumeric": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "longest-streak": "^2.0.1",
+ "markdown-escapes": "^1.0.0",
+ "markdown-table": "^1.1.0",
+ "mdast-util-compact": "^1.0.0",
+ "parse-entities": "^1.0.2",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "stringify-entities": "^2.0.0",
+ "unherit": "^1.0.4",
+ "xtend": "^4.0.1"
+ }
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "state-toggle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
+ "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ=="
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "stringify-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz",
+ "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==",
+ "requires": {
+ "character-entities-html4": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.2",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "trim": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
+ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
+ },
+ "trim-trailing-lines": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
+ "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA=="
+ },
+ "triple-beam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+ },
+ "trough": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
+ },
+ "trouter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz",
+ "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==",
+ "requires": {
+ "matchit": "^1.0.0"
+ }
+ },
+ "unherit": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
+ "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
+ "requires": {
+ "inherits": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "unified": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz",
+ "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==",
+ "requires": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile": "^4.0.0"
+ }
+ },
+ "unist-util-inspect": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-5.0.1.tgz",
+ "integrity": "sha512-fPNWewS593JSmg49HbnE86BJKuBi1/nMWhDSccBvbARfxezEuJV85EaARR9/VplveiwCoLm2kWq+DhP8TBaDpw==",
+ "requires": {
+ "is-empty": "^1.0.0"
+ }
+ },
+ "unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
+ },
+ "unist-util-remove-position": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
+ "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
+ "requires": {
+ "unist-util-visit": "^1.1.0"
+ }
+ },
+ "unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "requires": {
+ "@types/unist": "^2.0.2"
+ }
+ },
+ "unist-util-visit": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
+ "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+ "requires": {
+ "unist-util-visit-parents": "^2.0.0"
+ }
+ },
+ "unist-util-visit-parents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
+ "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+ "requires": {
+ "unist-util-is": "^3.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="
+ },
+ "vfile": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.1.tgz",
+ "integrity": "sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "replace-ext": "1.0.0",
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
+ }
+ },
+ "vfile-location": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
+ "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA=="
+ },
+ "vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "winston-transport": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
+ "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
+ "requires": {
+ "readable-stream": "^2.3.7",
+ "triple-beam": "^1.2.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+ },
+ "yargs": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..a19e00cf8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "openwpm",
+ "version": "0.10.0",
+ "author": "Mozilla",
+ "description": "OpenWPM NodeJS Utilities",
+ "scripts": {
+ "jsonschema2md": "jsonschema2md || true",
+ "render_schema_docs": "jsonschema2md --input=schemas --out=docs/schemas --schema-out=-"
+ },
+ "scripts-info": {
+ "jsonschema2md": "Display the help for jsonschema2md",
+ "render_schema_docs": "Render the JSON schemas in `schemas` folder to documentation in `docs/schemas`."
+ },
+ "license": "MPL-2.0",
+ "private": true,
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mozilla/OpenWPM.git"
+ },
+ "homepage": "",
+ "dependencies": {
+ "@adobe/jsonschema2md": "^4.1.5"
+ }
+}
diff --git a/automation/js_instrumentation/js_instrument_settings.schema b/schemas/js_instrument_settings.schema.json
similarity index 100%
rename from automation/js_instrumentation/js_instrument_settings.schema
rename to schemas/js_instrument_settings.schema.json
From 5b7e65311f810cd02fef194b58698f9469590015 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 18:15:20 -0500
Subject: [PATCH 091/106] Rename js_instrumentation again and ref schema
location
---
automation/Extension/firefox/package.json | 2 +-
.../__init__.py => js_instrumentation.py} | 5 +++--
.../fingerprinting.json | 0
3 files changed, 4 insertions(+), 3 deletions(-)
rename automation/{js_instrumentation/__init__.py => js_instrumentation.py} (98%)
rename automation/{js_instrumentation/collections => js_instrumentation_collections}/fingerprinting.json (100%)
diff --git a/automation/Extension/firefox/package.json b/automation/Extension/firefox/package.json
index a76772c2c..3975658ad 100644
--- a/automation/Extension/firefox/package.json
+++ b/automation/Extension/firefox/package.json
@@ -35,7 +35,7 @@
"private": true,
"repository": {
"type": "git",
- "url": "https://github.com/mozilla/openwpm-firefox-webext"
+ "url": "git+https://github.com/mozilla/OpenWPM.git"
},
"scripts": {
"prebuild": "cd ../webext-instrumentation && npm run build && cd - && webpack",
diff --git a/automation/js_instrumentation/__init__.py b/automation/js_instrumentation.py
similarity index 98%
rename from automation/js_instrumentation/__init__.py
rename to automation/js_instrumentation.py
index 993ef670a..ae545edbb 100644
--- a/automation/js_instrumentation/__init__.py
+++ b/automation/js_instrumentation.py
@@ -5,7 +5,7 @@
curdir = os.path.dirname(os.path.realpath(__file__))
schema_path = os.path.join(
- curdir, 'js_instrument_settings.schema'
+ curdir, os.pardir, 'schemas', 'js_instrument_settings.schema.json'
)
list_log_settings = [
@@ -15,7 +15,8 @@
]
shortcut_specs = {
'collection_fingerprinting':
- os.path.join(curdir, 'collections', 'fingerprinting.json')
+ os.path.join(curdir, 'js_instrumentation_collections',
+ 'fingerprinting.json')
}
diff --git a/automation/js_instrumentation/collections/fingerprinting.json b/automation/js_instrumentation_collections/fingerprinting.json
similarity index 100%
rename from automation/js_instrumentation/collections/fingerprinting.json
rename to automation/js_instrumentation_collections/fingerprinting.json
From 8eb4edb5422fee30208882ca940cddc9688852dd Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 18:35:56 -0500
Subject: [PATCH 092/106] Pass JSON not a js string
---
automation/js_instrumentation.py | 19 +--------
test/test_js_instrument_py.py | 73 ++++++++++----------------------
2 files changed, 23 insertions(+), 69 deletions(-)
diff --git a/automation/js_instrumentation.py b/automation/js_instrumentation.py
index ae545edbb..967ac380c 100644
--- a/automation/js_instrumentation.py
+++ b/automation/js_instrumentation.py
@@ -20,23 +20,6 @@
}
-def _python_to_js_string(py_in):
- """Takes python in and converts it to a string
- of the equivalent JS object.
-
- Customized for our specific needs:
- * expects a list
- * object is de-quoted
- """
- objects = [x['object'] for x in py_in]
- out = json.dumps(py_in)
- for o in objects:
- obj_str_before = f'"object": "{o}",'
- obj_str_after = f'"object": {o},'
- out = out.replace(obj_str_before, obj_str_after)
- return out
-
-
def _validate(python_list_to_validate):
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
@@ -256,4 +239,4 @@ def clean_js_instrumentation_settings(user_requested_settings):
settings.append(_build_full_settings_object(setting))
settings = _merge_settings(settings)
_validate(settings)
- return _python_to_js_string(settings)
+ return settings
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index dc46dadca..e14c1d6fc 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -9,54 +9,8 @@
def _no_whitespace(x):
return "".join(x.split())
-# Test function that converts our python
-# objects to our JS string
-
-def test_python_to_js_lower_true_false():
- inpy = [{
- 'object': 'window',
- 'logSettings': {
- 'logCallStack': False,
- 'preventSets': True,
- }
- }]
- expected_out = _no_whitespace("""
- [{
- "object": window,
- "logSettings": {
- "logCallStack": false,
- "preventSets": true
- }
- }]
- """)
- actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
- assert actual_out == expected_out
-
-
-def test_python_to_js_no_quote_object():
- inpy = [{'object': 'window', 'logSettings': {}}]
- expected_out = _no_whitespace('[{"object": window, "logSettings": {}}]')
- actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
- assert actual_out == expected_out
-
-
-def test_python_to_js_no_quote_object_two_matching_objects():
- inpy = [
- {'object': 'window', 'logSettings': {}},
- {'object': 'window', 'logSettings': {}},
- {'object': 'window2', 'logSettings': {}}
- ]
- expected_out = _no_whitespace("""[
- {"object": window, "logSettings": {}},
- {"object": window, "logSettings": {}},
- {"object": window2, "logSettings": {}}
- ]""")
- actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
- assert actual_out == expected_out
-
-
-# Test our validation
+# Test validation
@pytest.fixture
def default_log_settings():
return jsi.get_default_log_settings()
@@ -391,9 +345,25 @@ def test_api_collection_fingerprinting():
# This is a very crude test, there are other tests to
# check fingeprinting instrumentation in more detail
shortcut_input = ['collection_fingerprinting']
+ expected_instrumented_objects = {
+ "window['AnalyserNode'].prototype",
+ "window['AudioContext'].prototype",
+ "window['CanvasRenderingContext2D'].prototype",
+ "window['GainNode'].prototype",
+ "window['HTMLCanvasElement'].prototype",
+ "window['OfflineAudioContext'].prototype",
+ "window['OscillatorNode'].prototype",
+ "window['RTCPeerConnection'].prototype",
+ "window['ScriptProcessorNode'].prototype",
+ "window['Storage'].prototype",
+ "window",
+ "window.document",
+ "window.navigator",
+ "window.screen"
+ }
output = jsi.clean_js_instrumentation_settings(shortcut_input)
- assert 'window.document' in output
- assert 'window[\'AudioContext\'].prototype' in output
+ actual_instrumented_objects = {x['object'] for x in output}
+ assert actual_instrumented_objects == expected_instrumented_objects
def test_complete_pass():
@@ -403,5 +373,6 @@ def test_complete_pass():
}
]
output = jsi.clean_js_instrumentation_settings(shortcut_input)
- assert '"recursive": true' in output
- assert '"instrumentedName": "window"' in output
+ assert len(output) == 1
+ assert output[0]['logSettings']['recursive'] == True
+ assert output[0]['instrumentedName'] == 'window'
From fd844b3906423a9436e96f432cf0b7f0a2143ff2 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 18:50:42 -0500
Subject: [PATCH 093/106] Do copying to xpi in npm postbuild step
---
automation/Extension/firefox/package.json | 1 +
scripts/build-extension.sh | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/automation/Extension/firefox/package.json b/automation/Extension/firefox/package.json
index 3975658ad..ae84d71c9 100644
--- a/automation/Extension/firefox/package.json
+++ b/automation/Extension/firefox/package.json
@@ -40,6 +40,7 @@
"scripts": {
"prebuild": "cd ../webext-instrumentation && npm run build && cd - && webpack",
"postinstall": "cd ../webext-instrumentation && npm install",
+ "postbuild": "cp dist/openwpm-1.0.zip openwpm.xpi",
"build": "web-ext build",
"eslint": "eslint . --ext jsm,js,json",
"lint": "npm-run-all lint:*",
diff --git a/scripts/build-extension.sh b/scripts/build-extension.sh
index 2c6c78fb5..bd8610303 100755
--- a/scripts/build-extension.sh
+++ b/scripts/build-extension.sh
@@ -15,7 +15,6 @@ pushd ../webext-instrumentation
npm install
popd
npm run build
-cp dist/*.zip ./openwpm.xpi
popd
echo "Success: automation/Extension/firefox/openwpm.xpi has been built"
From 2e8eaacb485a12de02627263a20b31a04756abb7 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 20:29:42 -0500
Subject: [PATCH 094/106] Fix import in manual_test
---
test/manual_test.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/manual_test.py b/test/manual_test.py
index a0d73ca98..9520f42ae 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -8,7 +8,7 @@
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
-from automation import JSInstrumentation as jsi
+from automation import js_instrumentation as jsi
from automation.DeployBrowsers import configure_firefox
from automation.TaskManager import load_default_params
from automation.utilities.platform_utils import get_firefox_binary_path
From 60bae1a1477276aec6d93835f9478e5450f0d6d8 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 20:29:49 -0500
Subject: [PATCH 095/106] Revert "Pass JSON not a js string"
This reverts commit 8eb4edb5422fee30208882ca940cddc9688852dd.
---
automation/js_instrumentation.py | 19 ++++++++-
test/test_js_instrument_py.py | 73 ++++++++++++++++++++++----------
2 files changed, 69 insertions(+), 23 deletions(-)
diff --git a/automation/js_instrumentation.py b/automation/js_instrumentation.py
index 967ac380c..ae545edbb 100644
--- a/automation/js_instrumentation.py
+++ b/automation/js_instrumentation.py
@@ -20,6 +20,23 @@
}
+def _python_to_js_string(py_in):
+ """Takes python in and converts it to a string
+ of the equivalent JS object.
+
+ Customized for our specific needs:
+ * expects a list
+ * object is de-quoted
+ """
+ objects = [x['object'] for x in py_in]
+ out = json.dumps(py_in)
+ for o in objects:
+ obj_str_before = f'"object": "{o}",'
+ obj_str_after = f'"object": {o},'
+ out = out.replace(obj_str_before, obj_str_after)
+ return out
+
+
def _validate(python_list_to_validate):
schema = json.loads(open(schema_path).read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
@@ -239,4 +256,4 @@ def clean_js_instrumentation_settings(user_requested_settings):
settings.append(_build_full_settings_object(setting))
settings = _merge_settings(settings)
_validate(settings)
- return settings
+ return _python_to_js_string(settings)
diff --git a/test/test_js_instrument_py.py b/test/test_js_instrument_py.py
index e14c1d6fc..dc46dadca 100644
--- a/test/test_js_instrument_py.py
+++ b/test/test_js_instrument_py.py
@@ -9,8 +9,54 @@
def _no_whitespace(x):
return "".join(x.split())
+# Test function that converts our python
+# objects to our JS string
-# Test validation
+
+def test_python_to_js_lower_true_false():
+ inpy = [{
+ 'object': 'window',
+ 'logSettings': {
+ 'logCallStack': False,
+ 'preventSets': True,
+ }
+ }]
+ expected_out = _no_whitespace("""
+ [{
+ "object": window,
+ "logSettings": {
+ "logCallStack": false,
+ "preventSets": true
+ }
+ }]
+ """)
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+def test_python_to_js_no_quote_object():
+ inpy = [{'object': 'window', 'logSettings': {}}]
+ expected_out = _no_whitespace('[{"object": window, "logSettings": {}}]')
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+def test_python_to_js_no_quote_object_two_matching_objects():
+ inpy = [
+ {'object': 'window', 'logSettings': {}},
+ {'object': 'window', 'logSettings': {}},
+ {'object': 'window2', 'logSettings': {}}
+ ]
+ expected_out = _no_whitespace("""[
+ {"object": window, "logSettings": {}},
+ {"object": window, "logSettings": {}},
+ {"object": window2, "logSettings": {}}
+ ]""")
+ actual_out = _no_whitespace(jsi._python_to_js_string(inpy))
+ assert actual_out == expected_out
+
+
+# Test our validation
@pytest.fixture
def default_log_settings():
return jsi.get_default_log_settings()
@@ -345,25 +391,9 @@ def test_api_collection_fingerprinting():
# This is a very crude test, there are other tests to
# check fingeprinting instrumentation in more detail
shortcut_input = ['collection_fingerprinting']
- expected_instrumented_objects = {
- "window['AnalyserNode'].prototype",
- "window['AudioContext'].prototype",
- "window['CanvasRenderingContext2D'].prototype",
- "window['GainNode'].prototype",
- "window['HTMLCanvasElement'].prototype",
- "window['OfflineAudioContext'].prototype",
- "window['OscillatorNode'].prototype",
- "window['RTCPeerConnection'].prototype",
- "window['ScriptProcessorNode'].prototype",
- "window['Storage'].prototype",
- "window",
- "window.document",
- "window.navigator",
- "window.screen"
- }
output = jsi.clean_js_instrumentation_settings(shortcut_input)
- actual_instrumented_objects = {x['object'] for x in output}
- assert actual_instrumented_objects == expected_instrumented_objects
+ assert 'window.document' in output
+ assert 'window[\'AudioContext\'].prototype' in output
def test_complete_pass():
@@ -373,6 +403,5 @@ def test_complete_pass():
}
]
output = jsi.clean_js_instrumentation_settings(shortcut_input)
- assert len(output) == 1
- assert output[0]['logSettings']['recursive'] == True
- assert output[0]['instrumentedName'] == 'window'
+ assert '"recursive": true' in output
+ assert '"instrumentedName": "window"' in output
From 7072504abc41ad2eaa033b0673edeebec0909545 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 20:48:23 -0500
Subject: [PATCH 096/106] Add titles to schema pieces
---
docs/schemas/README.md | 8 +--
...s-objects-properties-instrumented-name.md} | 4 +-
...-settings-objects-properties-js-object.md} | 4 +-
...s-properties-excluded-properties-items.md} | 0
...ettings-properties-excluded-properties.md} | 2 +-
...log-settings-properties-log-call-stack.md} | 4 +-
...-settings-properties-log-function-gets.md} | 4 +-
...gs-properties-log-functions-as-strings.md} | 4 +-
...xisting-properties-to-instrument-items.md} | 0
...-non-existing-properties-to-instrument.md} | 2 +-
...s-log-settings-properties-prevent-sets.md} | 4 +-
...perties-properties-to-instrument-items.md} | 0
...gs-properties-properties-to-instrument.md} | 2 +-
...og-settings-properties-recursion-depth.md} | 4 +-
...ties-log-settings-properties-recursive.md} | 4 +-
...cts-properties-log-settings-properties.md} | 0
...ttings-objects-properties-log-settings.md} | 70 +++++++++----------
...t_settings-settings-objects-properties.md} | 0
...s_instrument_settings-settings-objects.md} | 34 ++++-----
docs/schemas/js_instrument_settings.md | 2 +-
schemas/js_instrument_settings.schema.json | 15 +++-
21 files changed, 90 insertions(+), 77 deletions(-)
rename docs/schemas/{js_instrument_settings-items-properties-instrumentedname.md => js_instrument_settings-settings-objects-properties-instrumented-name.md} (88%)
rename docs/schemas/{js_instrument_settings-items-properties-object.md => js_instrument_settings-settings-objects-properties-js-object.md} (89%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md => js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties-items.md} (100%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md => js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md} (95%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-logcallstack.md => js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md} (86%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md => js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md} (87%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md => js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md} (85%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md => js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument-items.md} (100%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md => js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md} (95%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-preventsets.md => js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md} (88%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md => js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument-items.md} (100%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md => js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md} (95%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-depth.md => js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md} (87%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties-recursive.md => js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md} (90%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings-properties.md => js_instrument_settings-settings-objects-properties-log-settings-properties.md} (100%)
rename docs/schemas/{js_instrument_settings-items-properties-logsettings.md => js_instrument_settings-settings-objects-properties-log-settings.md} (50%)
rename docs/schemas/{js_instrument_settings-items-properties.md => js_instrument_settings-settings-objects-properties.md} (100%)
rename docs/schemas/{js_instrument_settings-items.md => js_instrument_settings-settings-objects.md} (59%)
diff --git a/docs/schemas/README.md b/docs/schemas/README.md
index fa904b4b5..40412da7a 100644
--- a/docs/schemas/README.md
+++ b/docs/schemas/README.md
@@ -8,13 +8,13 @@
### Objects
-- [Untitled object in JS Instrument Settings](./js_instrument_settings-items.md) – `http://example.com/js-instrument-settings.schema#/items`
-- [Untitled object in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings.md "The log settings object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings`
+- [Log settings](./js_instrument_settings-settings-objects-properties-log-settings.md "The log settings object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings`
+- [Settings objects](./js_instrument_settings-settings-objects.md) – `http://example.com/js-instrument-settings.schema#/items`
### Arrays
-- [Untitled array in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "An array of non-existing properties to instrument on this object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument`
-- [Untitled array in JS Instrument Settings](./js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "Properties excluded from instrumentation") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties`
+- [Excluded properties](./js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md "Properties excluded from instrumentation") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties`
+- [Non-existing properties to instrument](./js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md "An array of non-existing properties to instrument on this object") – `http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument`
## Version Note
diff --git a/docs/schemas/js_instrument_settings-items-properties-instrumentedname.md b/docs/schemas/js_instrument_settings-settings-objects-properties-instrumented-name.md
similarity index 88%
rename from docs/schemas/js_instrument_settings-items-properties-instrumentedname.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-instrumented-name.md
index b139dbd13..0f56d0bc9 100644
--- a/docs/schemas/js_instrument_settings-items-properties-instrumentedname.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-instrumented-name.md
@@ -1,4 +1,4 @@
-# Untitled string in JS Instrument Settings Schema
+# Instrumented name Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName
@@ -13,4 +13,4 @@ The name recorded by the instrumentation for this object.
## instrumentedName Type
-`string`
+`string` ([Instrumented name](js_instrument_settings-settings-objects-properties-instrumented-name.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-object.md b/docs/schemas/js_instrument_settings-settings-objects-properties-js-object.md
similarity index 89%
rename from docs/schemas/js_instrument_settings-items-properties-object.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-js-object.md
index 9f8cf0e38..af0db2e32 100644
--- a/docs/schemas/js_instrument_settings-items-properties-object.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-js-object.md
@@ -1,4 +1,4 @@
-# Untitled string in JS Instrument Settings Schema
+# JS object Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/object
@@ -13,4 +13,4 @@ The JS object to be instrumented.
## object Type
-`string`
+`string` ([JS object](js_instrument_settings-settings-objects-properties-js-object.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties-items.md
similarity index 100%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties-items.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties-items.md
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md
similarity index 95%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md
index 5bdc4a7b4..65ee95d5f 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md
@@ -1,4 +1,4 @@
-# Untitled array in JS Instrument Settings Schema
+# Excluded properties Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md
similarity index 86%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md
index 1c37d3a16..da65bb6c2 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logcallstack.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md
@@ -1,4 +1,4 @@
-# Untitled boolean in JS Instrument Settings Schema
+# Log call stack? Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack
@@ -13,4 +13,4 @@ Set to true save the call stack info with each property call.
## logCallStack Type
-`boolean`
+`boolean` ([Log call stack?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md
similarity index 87%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md
index 7b2ddfebe..a83c72f7b 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md
@@ -1,4 +1,4 @@
-# Untitled boolean in JS Instrument Settings Schema
+# Log function gets? Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets
@@ -13,4 +13,4 @@ Set true to log get requests to properties that are functions. If true when a ca
## logFunctionGets Type
-`boolean`
+`boolean` ([Log function gets?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md
similarity index 85%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md
index 2001451fa..0ad7f3b83 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md
@@ -1,4 +1,4 @@
-# Untitled boolean in JS Instrument Settings Schema
+# Log functions as strings? Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings
@@ -13,4 +13,4 @@ Set to true to save args that are functions as strings during argument serializa
## logFunctionsAsStrings Type
-`boolean`
+`boolean` ([Log functions as strings?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument-items.md
similarity index 100%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument-items.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument-items.md
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md
similarity index 95%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md
index 094d07adc..b66a40208 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md
@@ -1,4 +1,4 @@
-# Untitled array in JS Instrument Settings Schema
+# Non-existing properties to instrument Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md
similarity index 88%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md
index 82e7befe6..ced0cff24 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-preventsets.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md
@@ -1,4 +1,4 @@
-# Untitled boolean in JS Instrument Settings Schema
+# Prevent sets? Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets
@@ -13,4 +13,4 @@ Set to true to prevent nested objects and functions from being overwritten (and
## preventSets Type
-`boolean`
+`boolean` ([Prevent sets?](js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument-items.md
similarity index 100%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument-items.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument-items.md
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md
similarity index 95%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md
index 5f5d1ed2c..7d9fd3c5f 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md
@@ -1,4 +1,4 @@
-# Untitled undefined type in JS Instrument Settings Schema
+# Properties to instrument Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md
similarity index 87%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md
index d662a0db5..ab0f5db73 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-depth.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md
@@ -1,4 +1,4 @@
-# Untitled number in JS Instrument Settings Schema
+# Recursion depth Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth
@@ -13,7 +13,7 @@ Recursion limit when instrumenting object recursively
## depth Type
-`number`
+`number` ([Recursion depth](js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md))
## depth Default Value
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md
similarity index 90%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md
index ed20b27b5..f6b1ef635 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties-recursive.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md
@@ -1,4 +1,4 @@
-# Untitled boolean in JS Instrument Settings Schema
+# Recursive? Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive
@@ -13,4 +13,4 @@ Set to `true` to recursively instrument all object properties of the given `obje
## recursive Type
-`boolean`
+`boolean` ([Recursive?](js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md))
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties.md
similarity index 100%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings-properties.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings-properties.md
diff --git a/docs/schemas/js_instrument_settings-items-properties-logsettings.md b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md
similarity index 50%
rename from docs/schemas/js_instrument_settings-items-properties-logsettings.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md
index 86e1d58ab..fc474a55f 100644
--- a/docs/schemas/js_instrument_settings-items-properties-logsettings.md
+++ b/docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md
@@ -1,4 +1,4 @@
-# Untitled object in JS Instrument Settings Schema
+# Log settings Schema
```txt
http://example.com/js-instrument-settings.schema#/items/properties/logSettings
@@ -13,21 +13,21 @@ The log settings object.
## logSettings Type
-`object` ([Details](js_instrument_settings-items-properties-logsettings.md))
+`object` ([Log settings](js_instrument_settings-settings-objects-properties-log-settings.md))
-# undefined Properties
+# Log settings Properties
-| Property | Type | Required | Nullable | Defined by |
-| :---------------------------------------------------------------------- | ------------ | -------- | -------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [propertiesToInstrument](#propertiesToInstrument) | Unknown Type | Required | can be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument") |
-| [nonExistingPropertiesToInstrument](#nonExistingPropertiesToInstrument) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument") |
-| [excludedProperties](#excludedProperties) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties") |
-| [logCallStack](#logCallStack) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logcallstack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack") |
-| [logFunctionsAsStrings](#logFunctionsAsStrings) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings") |
-| [logFunctionGets](#logFunctionGets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets") |
-| [preventSets](#preventSets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-preventsets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets") |
-| [recursive](#recursive) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive") |
-| [depth](#depth) | `number` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth") |
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------------------------------------------------------- | ------------ | -------- | -------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [propertiesToInstrument](#propertiesToInstrument) | Unknown Type | Required | can be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument") |
+| [nonExistingPropertiesToInstrument](#nonExistingPropertiesToInstrument) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument") |
+| [excludedProperties](#excludedProperties) | `array` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties") |
+| [logCallStack](#logCallStack) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack") |
+| [logFunctionsAsStrings](#logFunctionsAsStrings) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings") |
+| [logFunctionGets](#logFunctionGets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets") |
+| [preventSets](#preventSets) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets") |
+| [recursive](#recursive) | `boolean` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive") |
+| [depth](#depth) | `number` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth") |
## propertiesToInstrument
@@ -39,7 +39,7 @@ An array of properties to instrument on this object. If array is empty, then all
- is required
- Type: `string[]`
- can be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-propertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-properties-to-instrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/propertiesToInstrument")
### propertiesToInstrument Type
@@ -63,7 +63,7 @@ An array of non-existing properties to instrument on this object.
- is required
- Type: `string[]`
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-nonexistingpropertiestoinstrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-non-existing-properties-to-instrument.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/nonExistingPropertiesToInstrument")
### nonExistingPropertiesToInstrument Type
@@ -87,7 +87,7 @@ Properties excluded from instrumentation.
- is required
- Type: `string[]`
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-excludedproperties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-excluded-properties.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/excludedProperties")
### excludedProperties Type
@@ -109,13 +109,13 @@ Set to true save the call stack info with each property call.
`logCallStack`
- is required
-- Type: `boolean`
+- Type: `boolean` ([Log call stack?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logcallstack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logCallStack")
### logCallStack Type
-`boolean`
+`boolean` ([Log call stack?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-call-stack.md))
## logFunctionsAsStrings
@@ -125,13 +125,13 @@ Set to true to save args that are functions as strings during argument serializa
`logFunctionsAsStrings`
- is required
-- Type: `boolean`
+- Type: `boolean` ([Log functions as strings?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctionsasstrings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionsAsStrings")
### logFunctionsAsStrings Type
-`boolean`
+`boolean` ([Log functions as strings?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-functions-as-strings.md))
## logFunctionGets
@@ -141,13 +141,13 @@ Set true to log get requests to properties that are functions. If true when a ca
`logFunctionGets`
- is required
-- Type: `boolean`
+- Type: `boolean` ([Log function gets?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-logfunctiongets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/logFunctionGets")
### logFunctionGets Type
-`boolean`
+`boolean` ([Log function gets?](js_instrument_settings-settings-objects-properties-log-settings-properties-log-function-gets.md))
## preventSets
@@ -157,13 +157,13 @@ Set to true to prevent nested objects and functions from being overwritten (and
`preventSets`
- is required
-- Type: `boolean`
+- Type: `boolean` ([Prevent sets?](js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-preventsets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/preventSets")
### preventSets Type
-`boolean`
+`boolean` ([Prevent sets?](js_instrument_settings-settings-objects-properties-log-settings-properties-prevent-sets.md))
## recursive
@@ -173,13 +173,13 @@ Set to `true` to recursively instrument all object properties of the given `obje
`recursive`
- is required
-- Type: `boolean`
+- Type: `boolean` ([Recursive?](js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/recursive")
### recursive Type
-`boolean`
+`boolean` ([Recursive?](js_instrument_settings-settings-objects-properties-log-settings-properties-recursive.md))
## depth
@@ -189,13 +189,13 @@ Recursion limit when instrumenting object recursively
`depth`
- is required
-- Type: `number`
+- Type: `number` ([Recursion depth](js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings-properties-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings/properties/depth")
### depth Type
-`number`
+`number` ([Recursion depth](js_instrument_settings-settings-objects-properties-log-settings-properties-recursion-depth.md))
### depth Default Value
diff --git a/docs/schemas/js_instrument_settings-items-properties.md b/docs/schemas/js_instrument_settings-settings-objects-properties.md
similarity index 100%
rename from docs/schemas/js_instrument_settings-items-properties.md
rename to docs/schemas/js_instrument_settings-settings-objects-properties.md
diff --git a/docs/schemas/js_instrument_settings-items.md b/docs/schemas/js_instrument_settings-settings-objects.md
similarity index 59%
rename from docs/schemas/js_instrument_settings-items.md
rename to docs/schemas/js_instrument_settings-settings-objects.md
index 3ce58516d..a5210e04a 100644
--- a/docs/schemas/js_instrument_settings-items.md
+++ b/docs/schemas/js_instrument_settings-settings-objects.md
@@ -1,4 +1,4 @@
-# Untitled object in JS Instrument Settings Schema
+# Settings objects Schema
```txt
http://example.com/js-instrument-settings.schema#/items
@@ -13,15 +13,15 @@ http://example.com/js-instrument-settings.schema#/items
## items Type
-`object` ([Details](js_instrument_settings-items.md))
+`object` ([Settings objects](js_instrument_settings-settings-objects.md))
-# undefined Properties
+# Settings objects Properties
-| Property | Type | Required | Nullable | Defined by |
-| :------------------------------------ | -------- | -------- | -------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [object](#object) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object") |
-| [instrumentedName](#instrumentedName) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-instrumentedname.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName") |
-| [logSettings](#logSettings) | `object` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-items-properties-logsettings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings") |
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------------------ | -------- | -------- | -------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [object](#object) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-js-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object") |
+| [instrumentedName](#instrumentedName) | `string` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-instrumented-name.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName") |
+| [logSettings](#logSettings) | `object` | Required | cannot be null | [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings") |
## object
@@ -31,13 +31,13 @@ The JS object to be instrumented.
`object`
- is required
-- Type: `string`
+- Type: `string` ([JS object](js_instrument_settings-settings-objects-properties-js-object.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-js-object.md "http://example.com/js-instrument-settings.schema#/items/properties/object")
### object Type
-`string`
+`string` ([JS object](js_instrument_settings-settings-objects-properties-js-object.md))
## instrumentedName
@@ -47,13 +47,13 @@ The name recorded by the instrumentation for this object.
`instrumentedName`
- is required
-- Type: `string`
+- Type: `string` ([Instrumented name](js_instrument_settings-settings-objects-properties-instrumented-name.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-instrumentedname.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-instrumented-name.md "http://example.com/js-instrument-settings.schema#/items/properties/instrumentedName")
### instrumentedName Type
-`string`
+`string` ([Instrumented name](js_instrument_settings-settings-objects-properties-instrumented-name.md))
## logSettings
@@ -63,10 +63,10 @@ The log settings object.
`logSettings`
- is required
-- Type: `object` ([Details](js_instrument_settings-items-properties-logsettings.md))
+- Type: `object` ([Log settings](js_instrument_settings-settings-objects-properties-log-settings.md))
- cannot be null
-- defined in: [JS Instrument Settings](js_instrument_settings-items-properties-logsettings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings")
+- defined in: [JS Instrument Settings](js_instrument_settings-settings-objects-properties-log-settings.md "http://example.com/js-instrument-settings.schema#/items/properties/logSettings")
### logSettings Type
-`object` ([Details](js_instrument_settings-items-properties-logsettings.md))
+`object` ([Log settings](js_instrument_settings-settings-objects-properties-log-settings.md))
diff --git a/docs/schemas/js_instrument_settings.md b/docs/schemas/js_instrument_settings.md
index 2549b1d31..27a3ee6f9 100644
--- a/docs/schemas/js_instrument_settings.md
+++ b/docs/schemas/js_instrument_settings.md
@@ -13,4 +13,4 @@ Schema describing the JSON to be passed to JS Instrument Settings.
## JS Instrument Settings Type
-`object[]` ([Details](js_instrument_settings-items.md))
+`object[]` ([Settings objects](js_instrument_settings-settings-objects.md))
diff --git a/schemas/js_instrument_settings.schema.json b/schemas/js_instrument_settings.schema.json
index 1dbde937d..029a51d8a 100644
--- a/schemas/js_instrument_settings.schema.json
+++ b/schemas/js_instrument_settings.schema.json
@@ -5,21 +5,26 @@
"description": "Schema describing the JSON to be passed to JS Instrument Settings.",
"type": "array",
"items": {
+ "title": "Settings objects",
"type": "object",
"properties": {
"object": {
+ "title": "JS object",
"description": "The JS object to be instrumented.",
"type": "string"
},
"instrumentedName": {
+ "title": "Instrumented name",
"description": "The name recorded by the instrumentation for this object.",
"type": "string"
},
"logSettings": {
+ "title": "Log settings",
"description": "The log settings object.",
"type": "object",
"properties": {
"propertiesToInstrument": {
+ "title": "Properties to instrument",
"description": "An array of properties to instrument on this object. If array is empty, then all properties are instrumented.",
"type": ["array", "null"],
"items": {
@@ -28,6 +33,7 @@
"default": []
},
"nonExistingPropertiesToInstrument": {
+ "title": "Non-existing properties to instrument",
"description": "An array of non-existing properties to instrument on this object.",
"type": "array",
"items": {
@@ -36,6 +42,7 @@
"default": []
},
"excludedProperties": {
+ "title": "Excluded properties",
"description": "Properties excluded from instrumentation.",
"type": "array",
"items": {
@@ -44,31 +51,37 @@
"default": []
},
"logCallStack": {
+ "title": "Log call stack?",
"description": "Set to true save the call stack info with each property call.",
"type": "boolean",
"default": false
},
"logFunctionsAsStrings": {
+ "title": "Log functions as strings?",
"description": "Set to true to save args that are functions as strings during argument serialization. If false `FUNCTION` is recorded.",
"type": "boolean",
"default": false
},
"logFunctionGets": {
+ "title": "Log function gets?",
"description": "Set true to log get requests to properties that are functions. If true when a call is made, the log will contain both the call and a get log.",
"type": "boolean",
"default": false
},
"preventSets": {
+ "title": "Prevent sets?",
"description": "Set to true to prevent nested objects and functions from being overwritten (and thus having their instrumentation removed). Other properties (static values) can still be set with this is enabled.",
"type": "boolean",
"default": false
},
"recursive": {
+ "title": "Recursive?",
"description": "Set to `true` to recursively instrument all object properties of the given `object`. NOTE: (1) `propertiesToInstrument` does not propagate to sub-objects. (2) Sub-objects of prototypes can not be instrumented recursively as these properties can not be accessed until an instance of the prototype is created.",
"type": "boolean",
"default": false
},
"depth": {
+ "title": "Recursion depth",
"description": "Recursion limit when instrumenting object recursively",
"type": "number",
"default": 5
@@ -95,4 +108,4 @@
],
"additionalProperties": false
}
-}
\ No newline at end of file
+}
From 5a3230ffc7ed923eb65dcde42ec4815d3206c960 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 23:15:10 -0500
Subject: [PATCH 097/106] Add docs for js_instrument_settings
---
README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 53 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index e0838772a..af17b455e 100644
--- a/README.md
+++ b/README.md
@@ -80,11 +80,17 @@ After running the install script, activate your conda environment by running:
### Developer instructions
Dev dependencies are installed by using the main `environment.yaml` (which
-is used by `./install.sh` script.
+is used by `./install.sh` script).
-You can install pre-commit hooks install the hooks by running `pre-commit install` to
+You can install pre-commit hooks install the hooks by running `pre-commit install` to
lint all the changes before you make a commit.
+In the rare instance that you need to create schema docs
+(after updating or adding files to `schemas` folder), run `npm install`
+from OpenWPM top level. Then run `npm run render_schema_docs`. This will update the
+`docs/schemas` folder. You may want to clean out the `docs/schemas` folder before doing this
+incase files have been renamed.
+
### Troubleshooting
1. `make` / `gcc` may need to be installed in order to build the web extension.
@@ -173,8 +179,22 @@ available [below](#output-format).
with the exception of images.
See: [Bug 634073](https://bugzilla.mozilla.org/show_bug.cgi?id=634073).
* Javascript Calls
- * Records all method calls (with arguments) and property accesses for APIs
- of potential fingerprinting interest:
+ * Records all method calls (with arguments) and property accesses for configured APIs
+ * Set `browser_params['js_instrument'] = True`
+ * Configure `browser_params['js_instrument_settings']` to desired settings.
+ * Data is saved to the `javascript` table.
+ * The full specification for `js_instrument_settings` is defined by a JSON schema.
+ Details of that schema are available in [docs/schemas/README.md](docs/schemas/README.md).
+ In summary, a list is passed with JS objects to be instrumented and details about how
+ that object should be instrumented. The js_instrument_settings you pass to browser_params
+ will be validated python side against the JSON schema before the crawl starts running.
+ * A number of shortcuts are available to make writing `js_instrument_settings` less
+ cumbersome than spelling out the full schema. These shortcuts are converted to a full
+ specification by the `clean_js_instrumentation_settings` method in
+ [automation/js_instrumentation.py](automation/js_instrumentation.py).
+ * The first shortcut is the fingerprinting collection, specified by
+ `collection_fingerprinting`. This was the default before the ability to specify APIs
+ was added. It contains a collection of APIs of potential fingerprinting interest:
* HTML5 Canvas
* HTML5 WebRTC
* HTML5 Audio
@@ -184,8 +204,35 @@ available [below](#output-format).
and `window.name` access.
* Navigator properties (e.g. `appCodeName`, `oscpu`, `userAgent`, ...)
* Window properties (via `window.screen`)
- * Set `browser_params['js_instrument'] = True`
- * Data is saved to the `javascript` table.
+ * The fingerprinting collection is specified by the json file
+ [fingerprinting.json](automation/js_instrumentation_collections/fingeprinting.json).
+ This file is also a nice reference example for specifying your own APIs using the other
+ shortcuts.
+ * Shortcuts:
+ * Specifying just a string will instrument
+ the whole API with the [default log settings](docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md)
+ * For just strings you can specify a [Web API](https://developer.mozilla.org/en-US/docs/Web/API)
+ such as `XMLHttpRequest`. Or you can specify instances on window e.g. `window.document`.
+ * Alternatively, you can specify a dictionary with just one key. As with strings, the key
+ can be an instance on `window` or a Web API. The value of the key can be:
+ * A list - this is a shortcut for `propertiesToInstrument`
+ * A dictionary - with non default log settings. Items missing from this dictionary
+ will be filled in with the default log settings.
+ * Here are some examples:
+ ```
+ // Collections
+ "collection_fingerprinting",
+ // APIs, with or without settings details
+ "XMLHttpRequest",
+ {"XMLHttpRequest": {"excludedProperties": ["send"]}},
+ // APIs with shortcut to includedProperties
+ {"Prop1": ["hi"], "Prop2": ["hi2"]},
+ {"XMLHttpRequest": ["send"]},
+ "Storage",
+ // Specific instances on window
+ {"window.document": ["cookie", "referrer"]},
+ {"window": ["name", "localStorage", "sessionStorage"]}
+ ```
* Response body content
* Saves all files encountered during the crawl to a `LevelDB`
database de-duplicated by the md5 hash of the content.
From 389f4a28f0d833f8109488830cf84566f993cc21 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Thu, 25 Jun 2020 23:17:57 -0500
Subject: [PATCH 098/106] Bit more README cleanup
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index af17b455e..7bc680193 100644
--- a/README.md
+++ b/README.md
@@ -204,6 +204,7 @@ available [below](#output-format).
and `window.name` access.
* Navigator properties (e.g. `appCodeName`, `oscpu`, `userAgent`, ...)
* Window properties (via `window.screen`)
+ * `collection_fingerprinting` is the default if `js_instrument` is `True`.
* The fingerprinting collection is specified by the json file
[fingerprinting.json](automation/js_instrumentation_collections/fingeprinting.json).
This file is also a nice reference example for specifying your own APIs using the other
@@ -215,7 +216,7 @@ available [below](#output-format).
such as `XMLHttpRequest`. Or you can specify instances on window e.g. `window.document`.
* Alternatively, you can specify a dictionary with just one key. As with strings, the key
can be an instance on `window` or a Web API. The value of the key can be:
- * A list - this is a shortcut for `propertiesToInstrument`
+ * A list - this is a shortcut for `propertiesToInstrument` (see [log settings](docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md))
* A dictionary - with non default log settings. Items missing from this dictionary
will be filled in with the default log settings.
* Here are some examples:
@@ -223,12 +224,12 @@ available [below](#output-format).
// Collections
"collection_fingerprinting",
// APIs, with or without settings details
+ "Storage",
"XMLHttpRequest",
{"XMLHttpRequest": {"excludedProperties": ["send"]}},
// APIs with shortcut to includedProperties
{"Prop1": ["hi"], "Prop2": ["hi2"]},
{"XMLHttpRequest": ["send"]},
- "Storage",
// Specific instances on window
{"window.document": ["cookie", "referrer"]},
{"window": ["name", "localStorage", "sessionStorage"]}
From e9a7dc8bf6fb7e4efd59cc799eaf0841a8c5c860 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 1 Jul 2020 23:20:16 -0500
Subject: [PATCH 099/106] Update README.md
Co-authored-by: Steven Englehardt
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 3cea4c185..b255cad7a 100644
--- a/README.md
+++ b/README.md
@@ -193,8 +193,8 @@ available [below](#output-format).
specification by the `clean_js_instrumentation_settings` method in
[automation/js_instrumentation.py](automation/js_instrumentation.py).
* The first shortcut is the fingerprinting collection, specified by
- `collection_fingerprinting`. This was the default before the ability to specify APIs
- was added. It contains a collection of APIs of potential fingerprinting interest:
+ `collection_fingerprinting`. This was the default prior to v0.11.0. It contains a collection
+ of APIs of potential fingerprinting interest:
* HTML5 Canvas
* HTML5 WebRTC
* HTML5 Audio
From 12141c5f034e7f8091f1f6cd79d4a8c4ff06b340 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 7 Jul 2020 23:37:01 -0500
Subject: [PATCH 100/106] Move updating schema docs section
* Add title
* Fix typo in mac-osx hyperlink
---
README.md | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index b255cad7a..d6ec1c663 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,8 @@ Table of Contents
* [Debugging the platform](#debugging-the-platform)
* [Managing requirements](#managing-requirements)
* [Running tests](#running-tests)
- * [Mac OSX](#mac-osx-limited-support-for-developers)
+ * [Mac OSX](#mac-osx)
+ * [Updating schema docs](#updating-schema-docs)
* [Troubleshooting](#troubleshooting)
* [Docker Deployment for OpenWPM](#docker-deployment-for-openwpm)
* [Building the Docker Container](#building-the-docker-container)
@@ -85,12 +86,6 @@ is used by `./install.sh` script).
You can install pre-commit hooks install the hooks by running `pre-commit install` to
lint all the changes before you make a commit.
-In the rare instance that you need to create schema docs
-(after updating or adding files to `schemas` folder), run `npm install`
-from OpenWPM top level. Then run `npm run render_schema_docs`. This will update the
-`docs/schemas` folder. You may want to clean out the `docs/schemas` folder before doing this
-incase files have been renamed.
-
### Troubleshooting
1. `make` / `gcc` may need to be installed in order to build the web extension.
@@ -585,7 +580,7 @@ in the test directory to run all tests:
$ cd test
$ py.test -vv
-See the [pytest docs](https://docs.pytest.org/en/latest/) for more information on selecting
+See the [pytest docs](https://docs.pytest.org/en/latest/) for more information on selecting
specific tests and various pytest options.
### Mac OSX
@@ -600,6 +595,14 @@ Running Firefox with xvfb on OSX is untested and will require the user to instal
an X11 server. We suggest [XQuartz](https://www.xquartz.org/). This setup has not
been tested, we welcome feedback as to whether this is working.
+### Updating schema docs
+
+In the rare instance that you need to create schema docs
+(after updating or adding files to `schemas` folder), run `npm install`
+from OpenWPM top level. Then run `npm run render_schema_docs`. This will update the
+`docs/schemas` folder. You may want to clean out the `docs/schemas` folder before doing this
+incase files have been renamed.
+
Troubleshooting
---------------
From 76b3712efdb9d516bedadeda18d54bf2dad5b7f7 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 7 Jul 2020 23:41:12 -0500
Subject: [PATCH 101/106] Make the single-key dictionary clearer
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index d6ec1c663..0640d282b 100644
--- a/README.md
+++ b/README.md
@@ -209,8 +209,9 @@ available [below](#output-format).
the whole API with the [default log settings](docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md)
* For just strings you can specify a [Web API](https://developer.mozilla.org/en-US/docs/Web/API)
such as `XMLHttpRequest`. Or you can specify instances on window e.g. `window.document`.
- * Alternatively, you can specify a dictionary with just one key. As with strings, the key
- can be an instance on `window` or a Web API. The value of the key can be:
+ * Alternatively, you can specify a single-key dictionary that maps an API name to the properties / settings you'd
+ like to use. The key of this dictionary can be an instance on `window` or a Web API.
+ The value of this dictionary can be:
* A list - this is a shortcut for `propertiesToInstrument` (see [log settings](docs/schemas/js_instrument_settings-settings-objects-properties-log-settings.md))
* A dictionary - with non default log settings. Items missing from this dictionary
will be filled in with the default log settings.
From 7dcebfc13d2175a259fcefc26a3775169f26d563 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Tue, 7 Jul 2020 23:42:38 -0500
Subject: [PATCH 102/106] Remove versions from npm package files
---
automation/Extension/firefox/package-lock.json | 3 +--
automation/Extension/firefox/package.json | 1 -
automation/Extension/webext-instrumentation/package-lock.json | 3 +--
automation/Extension/webext-instrumentation/package.json | 1 -
package-lock.json | 3 +--
package.json | 1 -
6 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/automation/Extension/firefox/package-lock.json b/automation/Extension/firefox/package-lock.json
index dd09bf962..65de91f1e 100644
--- a/automation/Extension/firefox/package-lock.json
+++ b/automation/Extension/firefox/package-lock.json
@@ -1,8 +1,7 @@
{
"name": "OpenWPM",
- "version": "1.0.0",
- "lockfileVersion": 1,
"requires": true,
+ "lockfileVersion": 1,
"dependencies": {
"@babel/code-frame": {
"version": "7.0.0",
diff --git a/automation/Extension/firefox/package.json b/automation/Extension/firefox/package.json
index ae84d71c9..eb69af0af 100644
--- a/automation/Extension/firefox/package.json
+++ b/automation/Extension/firefox/package.json
@@ -1,7 +1,6 @@
{
"name": "OpenWPM",
"description": "OpenWPM Client extension",
- "version": "1.0.0",
"author": "Mozilla",
"dependencies": {
"openwpm-webext-instrumentation": "../webext-instrumentation"
diff --git a/automation/Extension/webext-instrumentation/package-lock.json b/automation/Extension/webext-instrumentation/package-lock.json
index 736d46897..f52ade109 100644
--- a/automation/Extension/webext-instrumentation/package-lock.json
+++ b/automation/Extension/webext-instrumentation/package-lock.json
@@ -1,8 +1,7 @@
{
"name": "@openwpm/webext-instrumentation",
- "version": "0.4.0",
- "lockfileVersion": 1,
"requires": true,
+ "lockfileVersion": 1,
"dependencies": {
"@babel/code-frame": {
"version": "7.10.3",
diff --git a/automation/Extension/webext-instrumentation/package.json b/automation/Extension/webext-instrumentation/package.json
index fb65b27ef..2eff44854 100644
--- a/automation/Extension/webext-instrumentation/package.json
+++ b/automation/Extension/webext-instrumentation/package.json
@@ -1,6 +1,5 @@
{
"name": "@openwpm/webext-instrumentation",
- "version": "0.4.0",
"description": "Allows WebExtensions to track and monitor privacy-related browsing behavior",
"author": "OpenWPM Contributors",
"license": "GPL-3.0-or-later",
diff --git a/package-lock.json b/package-lock.json
index 4461abfe6..b665fde1b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,8 +1,7 @@
{
"name": "openwpm",
- "version": "0.10.0",
- "lockfileVersion": 1,
"requires": true,
+ "lockfileVersion": 1,
"dependencies": {
"@adobe/helix-log": {
"version": "4.5.1",
diff --git a/package.json b/package.json
index a19e00cf8..eb65b526d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,5 @@
{
"name": "openwpm",
- "version": "0.10.0",
"author": "Mozilla",
"description": "OpenWPM NodeJS Utilities",
"scripts": {
From 2a359106181969380bd0e3440cbf6ab490192907 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 8 Jul 2020 00:52:20 -0500
Subject: [PATCH 103/106] Clean up instrument_existing_window_property.html and
js
We're not using the js in two htmls now, so unify like other test files
---
.../instrument_existing_window_property.html | 38 ++++++++++++++++-
...ument_existing_window_property_interact.js | 42 -------------------
2 files changed, 37 insertions(+), 43 deletions(-)
delete mode 100644 test/test_pages/js_instrument/instrument_existing_window_property_interact.js
diff --git a/test/test_pages/js_instrument/instrument_existing_window_property.html b/test/test_pages/js_instrument/instrument_existing_window_property.html
index 159de5430..5c31045cc 100644
--- a/test/test_pages/js_instrument/instrument_existing_window_property.html
+++ b/test/test_pages/js_instrument/instrument_existing_window_property.html
@@ -12,8 +12,44 @@ Test page for JS Instrument's instrumentJS method - specifically instrumenti
test script.
-
-
-
-
-
diff --git a/test/test_pages/js_instrument/instrument_pyside.html b/test/test_pages/js_instrument/instrument_pyside.html
new file mode 100644
index 000000000..769770135
--- /dev/null
+++ b/test/test_pages/js_instrument/instrument_pyside.html
@@ -0,0 +1,29 @@
+
+
+
+ Test page for JS Instrumentation configured python side.
+
+
+ Test page for JS Instrumentation configured python side.
+
+ Because the instrumentation occurs before the page loads, we can not instrument
+ objects that we subsequently setup in this html. So we interact with standard
+ window objects and record the response.
+
+
+
+
From e2ef6037f8c6d60365f094814e0f7fa71f06f496 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 8 Jul 2020 12:54:30 -0500
Subject: [PATCH 105/106] Use example.com and example.org as localDomains
---
test/test_js_instrument.py | 5 +++--
test/test_pages/js_instrument/instrument_pyside.html | 8 ++------
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/test/test_js_instrument.py b/test/test_js_instrument.py
index a3ac6c2af..11dd9648b 100644
--- a/test/test_js_instrument.py
+++ b/test/test_js_instrument.py
@@ -102,12 +102,13 @@ class TestJSInstrumentByPython(OpenWPMJSTest): # noqa
}
METHOD_CALLS = {
# In the JS we use both fetch and window.fetch
- ("window.fetch", "call", '["https://example1.com"]'),
- ("window.fetch", "call", '["https://example2.com"]'),
+ ("window.fetch", "call", '["https://example.com"]'),
+ ("window.fetch", "call", '["https://example.org"]'),
}
def get_config(self, data_dir=""):
manager_params, browser_params = super().get_config(data_dir)
+ browser_params[0]['prefs'] = {'network.dns.localDomains': 'example.com,example.org'}
browser_params[0]['js_instrument_settings'] = [
# Note that the string "window.document.cookie" does not work.
{"window.document": ["cookie", ]},
diff --git a/test/test_pages/js_instrument/instrument_pyside.html b/test/test_pages/js_instrument/instrument_pyside.html
index 769770135..cdd41433f 100644
--- a/test/test_pages/js_instrument/instrument_pyside.html
+++ b/test/test_pages/js_instrument/instrument_pyside.html
@@ -18,12 +18,8 @@ Test page for JS Instrumentation configured python side.
// Test get a cookie
console.log(window.document.cookie);
// Test both fetch() and window.fetch()
- fetch(
- "https://example1.com"
- ).then(response => console.log(response));
- window.fetch(
- "https://example2.com"
- ).then(response => console.log(response));
+ fetch("https://example.com");
+ window.fetch("https://example.org");
From 95465a8d1e4945265b70aeaed9215a2a6919a073 Mon Sep 17 00:00:00 2001
From: Sarah Bird
Date: Wed, 8 Jul 2020 13:24:27 -0500
Subject: [PATCH 106/106] context-manage open, and flake8
---
automation/js_instrumentation.py | 6 ++++--
test/manual_test.py | 5 ++---
test/test_js_instrument.py | 3 ++-
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/automation/js_instrumentation.py b/automation/js_instrumentation.py
index ae545edbb..f57514512 100644
--- a/automation/js_instrumentation.py
+++ b/automation/js_instrumentation.py
@@ -38,7 +38,8 @@ def _python_to_js_string(py_in):
def _validate(python_list_to_validate):
- schema = json.loads(open(schema_path).read())
+ with open(schema_path, 'r') as f:
+ schema = json.loads(f.read())
jsonschema.validate(instance=python_list_to_validate, schema=schema)
# Check properties to instrument and excluded properties don't collide
for setting in python_list_to_validate:
@@ -248,7 +249,8 @@ def clean_js_instrumentation_settings(user_requested_settings):
settings = []
for setting in user_requested_settings:
if isinstance(setting, str) and (setting in shortcut_specs):
- shortcut_spec = json.loads(open(shortcut_specs[setting]).read())
+ with open(shortcut_specs[setting], 'r') as f:
+ shortcut_spec = json.loads(f.read())
for sub_setting in shortcut_spec:
settings.append(
_build_full_settings_object(sub_setting))
diff --git a/test/manual_test.py b/test/manual_test.py
index 9520f42ae..047efe117 100644
--- a/test/manual_test.py
+++ b/test/manual_test.py
@@ -130,9 +130,8 @@ def cleanup_server():
browser_params = load_default_params()[1][0]
if browser_params_file is not None:
- browser_params.update(
- json.loads(open(browser_params_file).read())
- )
+ with open(browser_params_file, 'r') as f:
+ browser_params.update(json.loads(f.read()))
js_request = browser_params['js_instrument_settings']
js_request_as_string = jsi.convert_browser_params_to_js_string(
js_request)
diff --git a/test/test_js_instrument.py b/test/test_js_instrument.py
index 11dd9648b..139b67b4f 100644
--- a/test/test_js_instrument.py
+++ b/test/test_js_instrument.py
@@ -108,7 +108,8 @@ class TestJSInstrumentByPython(OpenWPMJSTest): # noqa
def get_config(self, data_dir=""):
manager_params, browser_params = super().get_config(data_dir)
- browser_params[0]['prefs'] = {'network.dns.localDomains': 'example.com,example.org'}
+ browser_params[0]['prefs'] = {
+ 'network.dns.localDomains': 'example.com,example.org'}
browser_params[0]['js_instrument_settings'] = [
# Note that the string "window.document.cookie" does not work.
{"window.document": ["cookie", ]},