diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..4261437 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +node_modules/ +add-on/lib/third_party/ +add-on/lib/standards.js +add-on/config/js/third_party/ +test.config.js \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index a4c9d9d..985ec1c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -7,12 +7,22 @@ "mocha": true }, "extends": [ - "eslint:recommended" + "eslint:recommended" ], "rules": { "no-console": "off", - "no-trailing-spaces": "error", "no-unused-vars": ["error", {"varsIgnorePattern": "ignore"}], - "semi": ["error", "always"] + "semi": ["error", "always"], + "indent": ["error", 4], + "eol-last": "error", + "quotes": ["error", "double"], + "comma-dangle": ["error", "only-multiline"], + "function-paren-newline": ["error"], + "max-len": ["error", {"ignoreStrings": true, "code": 100}], + "require-jsdoc": "error", + "valid-jsdoc": "error", + "prefer-const": "error", + "no-template-curly-in-string": "error", + "no-unused-expressions": "error" } } diff --git a/add-on/background_scripts/background.js b/add-on/background_scripts/background.js index cd38ec5..c9900ed 100644 --- a/add-on/background_scripts/background.js +++ b/add-on/background_scripts/background.js @@ -81,7 +81,8 @@ if (label === "rulesForDomains") { - const matchHostNameBound = domainMatcherLib.matchHostName.bind(undefined, Object.keys(domainRules)); + const matchHostName = domainMatcherLib.matchHostName; + const matchHostNameBound = matchHostName.bind(undefined, Object.keys(domainRules)); const rulesForDomains = data.map(matchHostNameBound); const domainToRuleMapping = {}; @@ -113,7 +114,7 @@ const newHeaders = details.requestHeaders.map(function (header) { if (header.name.indexOf("Cookie") === -1) { - header; + return header; } const cookieValue = header.value; diff --git a/add-on/config/index.html b/add-on/config/index.html index 68ba52c..e7c4a19 100644 --- a/add-on/config/index.html +++ b/add-on/config/index.html @@ -40,7 +40,7 @@ - + diff --git a/add-on/config/js/components/domain-rules.vue.js b/add-on/config/js/components/domain-rules.vue.js index 5c9547e..1152ab7 100644 --- a/add-on/config/js/components/domain-rules.vue.js +++ b/add-on/config/js/components/domain-rules.vue.js @@ -27,10 +27,15 @@
- +
- + `, data: function () { @@ -72,4 +77,4 @@ } } }); -}()); \ No newline at end of file +}()); diff --git a/add-on/config/js/components/logging-settings.vue.js b/add-on/config/js/components/logging-settings.vue.js index ac7938d..f7d49bf 100644 --- a/add-on/config/js/components/logging-settings.vue.js +++ b/add-on/config/js/components/logging-settings.vue.js @@ -29,4 +29,4 @@ } } }); -}()); \ No newline at end of file +}()); diff --git a/add-on/config/js/components/web-api-standards.vue.js b/add-on/config/js/components/web-api-standards.vue.js index 49b79ca..e29b865 100644 --- a/add-on/config/js/components/web-api-standards.vue.js +++ b/add-on/config/js/components/web-api-standards.vue.js @@ -85,4 +85,4 @@ } } }); -}()); \ No newline at end of file +}()); diff --git a/add-on/config/js/config.js b/add-on/config/js/config.js index b54bc5d..99b1672 100644 --- a/add-on/config/js/config.js +++ b/add-on/config/js/config.js @@ -33,4 +33,4 @@ window.onload = function () { storageLib.get(onSettingsLoaded); }; -}()); \ No newline at end of file +}()); diff --git a/add-on/config/js/state.js b/add-on/config/js/state.js index 48428be..5b06933 100644 --- a/add-on/config/js/state.js +++ b/add-on/config/js/state.js @@ -71,4 +71,4 @@ window.WEB_API_MANAGER.stateLib = { generateStateObject }; -}()); \ No newline at end of file +}()); diff --git a/add-on/config/js/lib/vue.js b/add-on/config/js/third_party/vue.js similarity index 100% rename from add-on/config/js/lib/vue.js rename to add-on/config/js/third_party/vue.js diff --git a/add-on/content_scripts/instrument.js b/add-on/content_scripts/instrument.js index 223ae51..0b45f23 100644 --- a/add-on/content_scripts/instrument.js +++ b/add-on/content_scripts/instrument.js @@ -10,7 +10,7 @@ const standardsCookieName = constants.cookieName; const doc = window.document; - const script = doc.createElement('script'); + const script = doc.createElement("script"); const rootElm = doc.head || doc.documentElement; // First see if we can read the standards to block out of the cookie diff --git a/add-on/lib/cookieencoding.js b/add-on/lib/cookieencoding.js index 7014d4c..eb201fa 100644 --- a/add-on/lib/cookieencoding.js +++ b/add-on/lib/cookieencoding.js @@ -15,12 +15,12 @@ * The `standardsToBlock` array must be a subset of all the standards * documented in data/standards. * - * @param array standardsToBlock + * @param {array} standardsToBlock * An array of strings, each a standard that should be blocked. - * @param bool shouldLog + * @param {boolean} shouldLog * Whether logging should be enabled. * - * @return string + * @return {string} * A cookie safe string encoding the above values. */ const toCookieValue = function (standardsToBlock, shouldLog) { @@ -45,10 +45,10 @@ * standard names, and two, a boolean flag of whether the logging option * is enabled. * - * @param string data + * @param {string} data * A string created from `toCookieValue` * - * @return [array, bool] + * @return {[array, bool]} * An array of strings of standard names (representing standards to * block), and a boolean describing whether to log blocking * behavior. @@ -77,4 +77,4 @@ toCookieValue, fromCookieValue }; -}()); \ No newline at end of file +}()); diff --git a/add-on/lib/defaults.js b/add-on/lib/defaults.js index 0521ccf..b2a7939 100644 --- a/add-on/lib/defaults.js +++ b/add-on/lib/defaults.js @@ -17,7 +17,7 @@ window.WEB_API_MANAGER.defaults.lite = [ "WebRTC 1.0: Real-time Communication Between Browser", "WebGL Specification", "Geometry Interfaces Module Level 1", - "Web Notifications", + "Web Notifications" ]; window.WEB_API_MANAGER.defaults.conservative = [ @@ -35,7 +35,7 @@ window.WEB_API_MANAGER.defaults.conservative = [ "UI Events Specification", "WebGL Specification", "Web Audio API", - "Scalable Vector Graphics (SVG) 1.1 (Second Edition)", + "Scalable Vector Graphics (SVG) 1.1 (Second Edition)" ]; window.WEB_API_MANAGER.defaults.aggressive = window.WEB_API_MANAGER.defaults.conservative.concat([ @@ -69,4 +69,4 @@ window.WEB_API_MANAGER.defaults.aggressive = window.WEB_API_MANAGER.defaults.con "W3C DOM4", "Web Notifications", "WebRTC 1.0: Real-time Communication Between Browser" -]); \ No newline at end of file +]); diff --git a/add-on/lib/domainmatcher.js b/add-on/lib/domainmatcher.js index f91694d..59b0f23 100644 --- a/add-on/lib/domainmatcher.js +++ b/add-on/lib/domainmatcher.js @@ -6,11 +6,11 @@ const matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; const escapeStringRegexp = function (aString) { - if (typeof aString !== 'string') { - throw new TypeError('Expected a string'); + if (typeof aString !== "string") { + throw new TypeError("Expected a string"); } - return aString.replace(matchOperatorsRe, '\\$&'); + return aString.replace(matchOperatorsRe, "\\$&"); }; // From https://www.npmjs.com/package/matcher @@ -24,19 +24,19 @@ return reCache.get(cacheKey); } - const negated = pattern[0] === '!'; + const negated = pattern[0] === "!"; if (negated) { pattern = pattern.slice(1); } - pattern = escapeStringRegexp(pattern).replace(/\\\*/g, '.*'); + pattern = escapeStringRegexp(pattern).replace(/\\\*/g, ".*"); if (negated && shouldNegate) { pattern = `(?!${pattern})`; } - const re = new RegExp(`^${pattern}$`, 'i'); + const re = new RegExp(`^${pattern}$`, "i"); re.negated = negated; reCache.set(cacheKey, re); @@ -61,10 +61,23 @@ return prev; }; - const matchHostName = function (domainRegExes, hostName) { - // of the URL being requested. + /** + * Returns the match patern that matches given host name. + * + * @see https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Match_patterns + * + * @param {array} matchPatterns + * An array of strings, each describing a match patern. + * @param {string} hostName + * A string depicting a host name. + * + * @return {string|undefined} + * A match patern string that matches the hostname, or undefined if no + * patterns match. + */ + const matchHostName = function (matchPatterns, hostName) { const matchingUrlReduceFunctionBound = matchingUrlReduceFunction.bind(undefined, hostName); - const matchingPattern = domainRegExes + const matchingPattern = matchPatterns .filter((aRule) => aRule !== defaultKey) .sort() .reduce(matchingUrlReduceFunctionBound, undefined); @@ -72,13 +85,27 @@ return matchingPattern || undefined; }; - const matchUrl = function (domainRegExes, url) { + /** + * Returns the match patern that matches the host of a given url. + * + * @see https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Match_patterns + * + * @param {array} matchPatterns + * An array of strings, each describing a match patern. + * @param {string} url + * A string depicting a url. + * + * @return {string|undefined} + * A match patern string that matches the host portion of the given + * url, or undefined if no patterns match. + */ + const matchUrl = function (matchPatterns, url) { const hostName = extractHostNameFromUrl(url); - return matchHostName(domainRegExes, hostName); + return matchHostName(matchPatterns, hostName); }; window.WEB_API_MANAGER.domainMatcherLib = { matchHostName, matchUrl }; -}()); \ No newline at end of file +}()); diff --git a/add-on/lib/httpheaders.js b/add-on/lib/httpheaders.js index 6ac068a..f94890e 100644 --- a/add-on/lib/httpheaders.js +++ b/add-on/lib/httpheaders.js @@ -16,10 +16,10 @@ * @see https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/HttpHeaders * @see https://w3c.github.io/webappsec-csp/ * - * @param object header + * @param {object} header * An object describing a HTTP header * - * @return boolean + * @return {boolean} * true if the given object depicts a CSP policy with the above stated * properties, and false in all other cases. */ @@ -63,13 +63,13 @@ * @see https://w3c.github.io/webappsec-csp/#strict-dynamic-usage * @see https://w3c.github.io/webappsec-csp/#grammardef-hash-source * - * @param string cspInstruction + * @param {string} cspInstruction * The value of a HTTP header defining a CSP instruction. - * @param string scriptHash + * @param {string} scriptHash * A hash value, in the form of "sha256-", that is a valid * hash source description. * - * @return string|false + * @return {string|false} * Returns false if the CSP instruction looks malformed (ie we * couldn't find either a "script-src" or "default-src" section), * otherwise, a new value CSP instruction with the given hash allowed. @@ -102,4 +102,4 @@ isHeaderCSPScriptSrcWithOutUnsafeInline, createCSPInstructionWithHashAllowed }; -}()); \ No newline at end of file +}()); diff --git a/add-on/lib/init.js b/add-on/lib/init.js index 81f8407..fec0fc5 100644 --- a/add-on/lib/init.js +++ b/add-on/lib/init.js @@ -4,7 +4,13 @@ "use strict"; window.WEB_API_MANAGER = { constants: { + // The name of the cookie that will be used to push domain + // configuration information into pages. cookieName: "_wamtcstandards", + + // The value in the packed array of options thats used to + // include the shouldLog option in the in bitfield encoded in + // the above cookie. shouldLogKey: "shouldLogKey" } }; diff --git a/add-on/lib/pack.js b/add-on/lib/pack.js index 10328d8..2881a6e 100644 --- a/add-on/lib/pack.js +++ b/add-on/lib/pack.js @@ -18,10 +18,19 @@ const bucketSize = 8; + /** + * Encodes a buffer (such as a Uint8Array) to a base64 encoded string. + * + * @param {ArrayBuffer} buf + * A buffer of binary data. + * + * @return {string} + * A base64 encoded string. + */ const bufferToBase64 = function (buf) { const binstr = Array.prototype.map.call(buf, function (ch) { return String.fromCharCode(ch); - }).join(''); + }).join(""); return window.btoa(binstr); }; @@ -61,12 +70,12 @@ * * This function is the inverse of the `unpack` function from this module. * - * @param array options + * @param {array} options * An array of all possible options that might need to be encoded. - * @param array selected + * @param {array} selected * An array containing zero or more elements from option. * - * @return string + * @return {string} * A base64 encoded string, which encodes which elements in `options` * were in the provided `selected` array. */ @@ -83,11 +92,11 @@ for (i = 0; i < numBuckets; i += 1) { let bitfield = 0; - let currentBucket = binnedOptions[i]; + const currentBucket = binnedOptions[i]; for (j = 0; j < currentBucket.length; j += 1) { - let currentOption = currentBucket[j]; + const currentOption = currentBucket[j]; if (selected.indexOf(currentOption) !== -1) { bitfield |= 1 << j; } @@ -108,13 +117,13 @@ * * This function is the inverse of the `pack` function from this module. * - * @param array options + * @param {array} options * An array of all possible options that might need to be encoded. - * @param string data + * @param {string} data * A base64 encoded string, generated from the `pack` function in * this module. * - * @return array + * @return {array} * An array of zero or more elements, each of which will be in the * options array. */ @@ -131,12 +140,12 @@ let i, j; for (i = 0; i < bitFields.length; i += 1) { - let currentBitField = bitFields[i]; - let currentOptionsBin = binnedOptions[i]; + const currentBitField = bitFields[i]; + const currentOptionsBin = binnedOptions[i]; for (j = 0; j < bucketSize; j += 1) { if (currentBitField & (1 << j)) { - let currentOption = currentOptionsBin[j]; + const currentOption = currentOptionsBin[j]; result.push(currentOption); } } diff --git a/add-on/lib/proxyblock.js b/add-on/lib/proxyblock.js index 63a73b2..a4833c2 100644 --- a/add-on/lib/proxyblock.js +++ b/add-on/lib/proxyblock.js @@ -85,8 +85,7 @@ } }; - let blockingProxy; - blockingProxy = new Proxy(defaultFunction, { + const blockingProxy = new Proxy(defaultFunction, { get: function (ignore, property) { logKeyPath(); @@ -189,16 +188,16 @@ * but with the window.WEB_API_MANAGER_PAGE object set up * correctly to block the desired functions. * - * @param object standards + * @param {object} standards * A mapping of standard names to information about those standards. * The structure of this object should match whats in data/standards.js - * @param array standardNamesToBlock + * @param {array} standardNamesToBlock * An array of strings, which must be a subset of the keys of the * standards object. - * @param bool shouldLog + * @param {boolean} shouldLog * Whether to log the behavior of the blocking proxy. * - * @return [string, hash] + * @return {[string, string]} * Returns an array containing two values. First, JavaScript code * that instruments the DOM of page's its injected into to render the * standardNamesToBlock standards un-reachable, and second, a diff --git a/add-on/lib/standards.js b/add-on/lib/standards.js index 045770a..cd8a69f 100644 --- a/add-on/lib/standards.js +++ b/add-on/lib/standards.js @@ -1,2 +1,3 @@ /** This file is automatically generated. **/ -window.WEB_API_MANAGER.standards = {"XMLHttpRequest":{"info":{"name":"XMLHttpRequest","subsection_number":null,"subsection_name":null,"url":"https://xhr.spec.whatwg.org/","identifier":"XMLHttpRequest"},"features":["FormData.prototype.append","FormData.prototype.delete","FormData.prototype.get","FormData.prototype.getAll","FormData.prototype.has","FormData.prototype.set","XMLHttpRequest.prototype.abort","XMLHttpRequest.prototype.getAllResponseHeaders","XMLHttpRequest.prototype.getResponseHeader","XMLHttpRequest.prototype.open","XMLHttpRequest.prototype.overrideMimeType","XMLHttpRequest.prototype.send","XMLHttpRequest.prototype.setRequestHeader"]},"Ambient Light Sensor API":{"info":{"name":"Ambient Light Sensor API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/ambient-light/","identifier":"Ambient Light Sensor API"},"features":["window.ondevicelight"]},"Battery Status API":{"info":{"name":"Battery Status API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/battery-status/","identifier":"Battery Status API"},"features":["navigator.battery","Navigator.prototype.getBattery"]},"Beacon":{"info":{"name":"Beacon","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/beacon/","identifier":"Beacon"},"features":["Navigator.prototype.sendBeacon"]},"Console API":{"info":{"name":"Console API","subsection_number":null,"subsection_name":null,"url":"https://github.com/DeveloperToolsWG/console-object","identifier":"Console API"},"features":["Console.prototype.assert","Console.prototype.clear","Console.prototype.count","Console.prototype.debug","Console.prototype.dir","Console.prototype.dirxml","Console.prototype.error","Console.prototype.group","Console.prototype.groupCollapsed","Console.prototype.groupEnd","Console.prototype.info","Console.prototype.log","Console.prototype.markTimeline","Console.prototype.profile","Console.prototype.profileEnd","Console.prototype.table","Console.prototype.time","Console.prototype.timeEnd","Console.prototype.timeline","Console.prototype.timelineEnd","Console.prototype.timeStamp","Console.prototype.trace","Console.prototype.warn"]},"CSS Conditional Rules Module Level 3":{"info":{"name":"CSS Conditional Rules Module Level 3","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/css-conditional-3/","identifier":"CSS Conditional Rules Module Level 3"},"features":["CSS.supports"]},"CSS Font Loading Module Level 3":{"info":{"name":"CSS Font Loading Module Level 3","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/css-font-loading/","identifier":"CSS Font Loading Module Level 3"},"features":["document.fonts","FontFace.prototype.load","FontFaceSet.prototype.add","FontFaceSet.prototype.check","FontFaceSet.prototype.clear","FontFaceSet.prototype.delete","FontFaceSet.prototype.entries","FontFaceSet.prototype.forEach","FontFaceSet.prototype.has","FontFaceSet.prototype.keys","FontFaceSet.prototype.load","FontFaceSet.prototype.values"]},"CSS Object Model (CSSOM)":{"info":{"name":"CSS Object Model (CSSOM)","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/cssom/","identifier":"CSS Object Model (CSSOM)"},"features":["CSS.escape","Document.prototype.caretPositionFromPoint","Document.prototype.elementFromPoint","Element.prototype.getBoundingClientRect","Element.prototype.getClientRects","Element.prototype.scroll","Element.prototype.scrollBy","Element.prototype.scrollIntoView","Element.prototype.scrollTo","MediaList.prototype.appendMedium","MediaList.prototype.deleteMedium","MediaList.prototype.item","MediaQueryList.prototype.addListener","MediaQueryList.prototype.removeListener","StyleSheetList.prototype.item"]},"CSSOM View Module":{"info":{"name":"CSSOM View Module","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/cssom-view/","identifier":"CSSOM View Module"},"features":["CaretPosition.prototype.getClientRect","screen.availHeight","screen.availWidth","screen.colorDepth","screen.height","screen.left","screen.pixelDepth","screen.width","window.devicePixelRatio","window.innerHeight","window.innerWidth","window.matchMedia","window.moveBy","window.moveTo","window.outerHeight","window.outerWidth","window.pageXOffset","window.pageYOffset","window.resizeBy","window.resizeTo","window.screen","window.screenX","window.screenY","window.scroll","window.scrollBy","window.scrollTo","window.scrollX","window.scrollY"]},"DeviceOrientation Event Specification":{"info":{"name":"DeviceOrientation Event Specification","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/orientation-event/","identifier":"DeviceOrientation Event Specification"},"features":["DeviceMotionEvent.prototype.initDeviceMotionEvent","DeviceOrientationEvent.prototype.initDeviceOrientationEvent"]},"DOM Parsing and Serialization":{"info":{"name":"DOM Parsing and Serialization","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/DOM-Parsing/","identifier":"DOM Parsing and Serialization"},"features":["DOMParser.prototype.parseFromString","Element.prototype.insertAdjacentHTML","XMLSerializer.prototype.serializeToString"]},"DOM":{"info":{"name":"DOM","subsection_number":null,"subsection_name":null,"url":"https://dom.spec.whatwg.org/","identifier":"DOM"},"features":["CharacterData.prototype.appendData","CharacterData.prototype.deleteData","CharacterData.prototype.insertData","CharacterData.prototype.remove","CharacterData.prototype.replaceData","CharacterData.prototype.substringData","CustomEvent.prototype.initCustomEvent","document.characterSet","document.childElementCount","document.children","document.close","document.compatMode","document.contentType","document.firstElementChild","document.inputEncoding","document.lastElementChild","Document.prototype.createAttribute","Document.prototype.createElement","Document.prototype.createProcessingInstruction","Document.prototype.getElementsByClassName","document.scripts","DocumentFragment.prototype.getElementById","DocumentType.prototype.remove","DOMImplementation.prototype.createHTMLDocument","DOMTokenList.prototype.add","DOMTokenList.prototype.contains","DOMTokenList.prototype.item","DOMTokenList.prototype.remove","DOMTokenList.prototype.toggle","Element.prototype.closest","Element.prototype.getElementsByClassName","Element.prototype.matches","Element.prototype.mozMatchesSelector","Element.prototype.remove","window.clearInterval","window.clearTimeout"]},"DOM Level 1":{"info":{"name":"DOM Level 1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/REC-DOM-Level-1/","identifier":"DOM Level 1"},"features":["Document.prototype.getElementById","Document.prototype.getElementsByTagName","Element.prototype.getAttribute","Element.prototype.getAttributeNode","Element.prototype.getElementsByTagName","Element.prototype.removeAttribute","Element.prototype.removeAttributeNode","Element.prototype.setAttribute","Element.prototype.setAttributeNode","HTMLCollection.prototype.item","HTMLCollection.prototype.namedItem","HTMLDocument.prototype.close","HTMLDocument.prototype.open","HTMLDocument.prototype.write","HTMLDocument.prototype.writeln","HTMLElement.prototype.click","HTMLElement.prototype.focus","HTMLFormElement.prototype.reset","HTMLFormElement.prototype.submit","HTMLInputElement.prototype.select","HTMLSelectElement.prototype.add","HTMLSelectElement.prototype.item","HTMLSelectElement.prototype.namedItem","HTMLSelectElement.prototype.remove","HTMLTableElement.prototype.createCaption","HTMLTableElement.prototype.createTBody","HTMLTableElement.prototype.createTFoot","HTMLTableElement.prototype.createTHead","HTMLTableElement.prototype.deleteCaption","HTMLTableElement.prototype.deleteRow","HTMLTableElement.prototype.deleteTFoot","HTMLTableElement.prototype.deleteTHead","HTMLTableElement.prototype.insertRow","HTMLTableRowElement.prototype.deleteCell","HTMLTableRowElement.prototype.insertCell","HTMLTableSectionElement.prototype.deleteRow","HTMLTableSectionElement.prototype.insertRow","HTMLTextAreaElement.prototype.select","Node.prototype.appendChild","Node.prototype.cloneNode","Node.prototype.hasChildNodes","Node.prototype.insertBefore","Node.prototype.normalize","Node.prototype.removeChild","Node.prototype.replaceChild","NodeList.prototype.item","Text.prototype.splitText"]},"DOM Level 2: Core":{"info":{"name":"DOM Level 2: Core","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Core/","identifier":"DOM Level 2: Core"},"features":["document.doctype","document.documentElement","document.domain","document.implementation","Document.prototype.createAttributeNS","Document.prototype.createCDATASection","Document.prototype.createComment","Document.prototype.createDocumentFragment","Document.prototype.createElementNS","Document.prototype.createTextNode","Document.prototype.getElementsByTagNameNS","Document.prototype.importNode","DOMImplementation.prototype.createDocument","DOMImplementation.prototype.createDocumentType","DOMImplementation.prototype.hasFeature","Element.prototype.getAttributeNodeNS","Element.prototype.getAttributeNS","Element.prototype.getElementsByTagNameNS","Element.prototype.hasAttribute","Element.prototype.hasAttributeNS","Element.prototype.hasAttributes","Element.prototype.removeAttributeNS","Element.prototype.setAttributeNodeNS","Element.prototype.setAttributeNS","NamedNodeMap.prototype.getNamedItem","NamedNodeMap.prototype.getNamedItemNS","NamedNodeMap.prototype.item","NamedNodeMap.prototype.removeNamedItem","NamedNodeMap.prototype.removeNamedItemNS","NamedNodeMap.prototype.setNamedItem","NamedNodeMap.prototype.setNamedItemNS"]},"DOM Level 2: Events":{"info":{"name":"DOM Level 2: Events","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Events/","identifier":"DOM Level 2: Events"},"features":["Document.prototype.createEvent","Event.prototype.initEvent","Event.prototype.preventDefault","Event.prototype.stopPropagation","EventTarget.prototype.addEventListener","EventTarget.prototype.dispatchEvent","EventTarget.prototype.removeEventListener"]},"DOM Level 2: HTML":{"info":{"name":"DOM Level 2: HTML","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-HTML/","identifier":"DOM Level 2: HTML"},"features":["document.cookie","document.forms","document.getElementsByName","document.open","document.referrer","document.title","document.URL","document.write","document.writeln","HTMLDocument.prototype.getElementsByName","HTMLElement.prototype.blur"]},"DOM Level 2: Style":{"info":{"name":"DOM Level 2: Style","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Style/","identifier":"DOM Level 2: Style"},"features":["CSSPrimitiveValue.prototype.getCounterValue","CSSPrimitiveValue.prototype.getFloatValue","CSSPrimitiveValue.prototype.getRectValue","CSSPrimitiveValue.prototype.getRGBColorValue","CSSPrimitiveValue.prototype.getStringValue","CSSPrimitiveValue.prototype.setFloatValue","CSSPrimitiveValue.prototype.setStringValue","CSSRuleList.prototype.item","CSSStyleDeclaration.prototype.getPropertyCSSValue","CSSStyleDeclaration.prototype.getPropertyPriority","CSSStyleDeclaration.prototype.getPropertyValue","CSSStyleDeclaration.prototype.item","CSSStyleDeclaration.prototype.removeProperty","CSSStyleDeclaration.prototype.setProperty","CSSStyleSheet.prototype.deleteRule","CSSStyleSheet.prototype.insertRule","CSSValueList.prototype.item","document.styleSheets","window.getComputedStyle"]},"DOM Level 2: Traversal and Range":{"info":{"name":"DOM Level 2: Traversal and Range","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Traversal-Range/","identifier":"DOM Level 2: Traversal and Range"},"features":["Document.prototype.createNodeIterator","Document.prototype.createRange","Document.prototype.createTreeWalker","NodeIterator.prototype.detach","NodeIterator.prototype.nextNode","NodeIterator.prototype.previousNode","Range.prototype.cloneContents","Range.prototype.cloneRange","Range.prototype.collapse","Range.prototype.compareBoundaryPoints","Range.prototype.comparePoint","Range.prototype.createContextualFragment","Range.prototype.deleteContents","Range.prototype.detach","Range.prototype.extractContents","Range.prototype.getBoundingClientRect","Range.prototype.getClientRects","Range.prototype.insertNode","Range.prototype.intersectsNode","Range.prototype.isPointInRange","Range.prototype.selectNode","Range.prototype.selectNodeContents","Range.prototype.setEnd","Range.prototype.setEndAfter","Range.prototype.setEndBefore","Range.prototype.setStart","Range.prototype.setStartAfter","Range.prototype.setStartBefore","Range.prototype.surroundContents","TreeWalker.prototype.firstChild","TreeWalker.prototype.lastChild","TreeWalker.prototype.nextNode","TreeWalker.prototype.nextSibling","TreeWalker.prototype.parentNode","TreeWalker.prototype.previousNode","TreeWalker.prototype.previousSibling"]},"DOM Level 3: Core":{"info":{"name":"DOM Level 3: Core","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-3-Core/","identifier":"DOM Level 3: Core"},"features":["document.documentURI","Document.prototype.adoptNode","DOMStringList.prototype.contains","DOMStringList.prototype.item","Node.prototype.compareDocumentPosition","Node.prototype.contains","Node.prototype.isDefaultNamespace","Node.prototype.isEqualNode","Node.prototype.lookupNamespaceURI","Node.prototype.lookupPrefix"]},"DOM Level 3: XPath":{"info":{"name":"DOM Level 3: XPath","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-3-XPath/","identifier":"DOM Level 3: XPath"},"features":["Document.prototype.createExpression","Document.prototype.createNSResolver","Document.prototype.evaluate","XPathEvaluator.prototype.createExpression","XPathEvaluator.prototype.createNSResolver","XPathEvaluator.prototype.evaluate","XPathExpression.prototype.evaluate","XPathResult.prototype.iterateNext","XPathResult.prototype.snapshotItem"]},"W3C DOM4":{"info":{"name":"W3C DOM4","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/dom/","identifier":"W3C DOM4"},"features":["MutationObserver.prototype.disconnect","MutationObserver.prototype.observe","MutationObserver.prototype.takeRecords"]},"Directory Upload":{"info":{"name":"Directory Upload","subsection_number":null,"subsection_name":null,"url":"https://wicg.github.io/directory-upload/proposal.html","identifier":"Directory Upload"},"features":["Directory.prototype.getFilesAndDirectories"]},"Encoding":{"info":{"name":"Encoding","subsection_number":null,"subsection_name":null,"url":"https://encoding.spec.whatwg.org/","identifier":"Encoding"},"features":["TextDecoder.prototype.decode","TextEncoder.prototype.encode"]},"execCommand":{"info":{"name":"execCommand","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/editing/execCommand.html","identifier":"execCommand"},"features":["document.execCommand","document.queryCommandEnabled","document.queryCommandIndeterm","document.queryCommandState","document.queryCommandSupported","document.queryCommandValue","HTMLDocument.prototype.execCommand","HTMLDocument.prototype.queryCommandEnabled","HTMLDocument.prototype.queryCommandIndeterm","HTMLDocument.prototype.queryCommandState","HTMLDocument.prototype.queryCommandSupported","HTMLDocument.prototype.queryCommandValue"]},"Encrypted Media Extensions":{"info":{"name":"Encrypted Media Extensions","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/encrypted-media/","identifier":"Encrypted Media Extensions"},"features":["MediaKeys.prototype.createSession","MediaKeys.prototype.setServerCertificate","MediaKeySession.prototype.close","MediaKeySession.prototype.generateRequest","MediaKeySession.prototype.load","MediaKeySession.prototype.remove","MediaKeySession.prototype.update","MediaKeyStatusMap.prototype.entries","MediaKeyStatusMap.prototype.keys","MediaKeyStatusMap.prototype.values","MediaKeySystemAccess.prototype.createMediaKeys","MediaKeySystemAccess.prototype.getConfiguration","Navigator.prototype.requestMediaKeySystemAccess"]},"Fetch":{"info":{"name":"Fetch","subsection_number":null,"subsection_name":null,"url":"https://fetch.spec.whatwg.org/","identifier":"Fetch"},"features":["Headers.prototype.append","Headers.prototype.delete","Headers.prototype.get","Headers.prototype.getAll","Headers.prototype.has","Headers.prototype.set","Request.prototype.arrayBuffer","Request.prototype.blob","Request.prototype.clone","Request.prototype.formData","Request.prototype.json","Request.prototype.text","Response.error","Response.prototype.arrayBuffer","Response.prototype.blob","Response.prototype.clone","Response.prototype.formData","Response.prototype.json","Response.prototype.text","Response.redirect","window.fetch"]},"File API":{"info":{"name":"File API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/FileAPI/","identifier":"File API"},"features":["Blob.prototype.slice","FileList.prototype.item","FileReader.prototype.abort","FileReader.prototype.readAsArrayBuffer","FileReader.prototype.readAsBinaryString","FileReader.prototype.readAsDataURL","FileReader.prototype.readAsText","URL.createObjectURL","URL.revokeObjectURL"]},"Fullscreen API":{"info":{"name":"Fullscreen API","subsection_number":null,"subsection_name":null,"url":"https://fullscreen.spec.whatwg.org/","identifier":"Fullscreen API"},"features":["document.mozFullScreen","document.mozFullScreenElement","document.mozFullScreenEnabled","document.onmozfullscreenchange","document.onmozfullscreenerror","Document.prototype.mozCancelFullScreen","Element.prototype.mozRequestFullScreen","window.onmozfullscreenchange","window.onmozfullscreenerror"]},"Geolocation API":{"info":{"name":"Geolocation API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/geolocation-API/","identifier":"Geolocation API"},"features":["navigator.geolocation","navigator.geolocation.getCurrentPosition","navigator.geolocation.watchPosition","navigator.geolocation.clearWatch"]},"Geometry Interfaces Module Level 1":{"info":{"name":"Geometry Interfaces Module Level 1","subsection_number":null,"subsection_name":null,"url":"https://drafts.fxtf.org/geometry/","identifier":"Geometry Interfaces Module Level 1"},"features":["DOMMatrix.prototype.invertSelf","DOMMatrix.prototype.multiplySelf","DOMMatrix.prototype.preMultiplySelf","DOMMatrix.prototype.rotateAxisAngleSelf","DOMMatrix.prototype.rotateFromVectorSelf","DOMMatrix.prototype.rotateSelf","DOMMatrix.prototype.scale3dSelf","DOMMatrix.prototype.scaleNonUniformSelf","DOMMatrix.prototype.scaleSelf","DOMMatrix.prototype.setMatrixValue","DOMMatrix.prototype.skewXSelf","DOMMatrix.prototype.skewYSelf","DOMMatrix.prototype.translateSelf","DOMMatrixReadOnly.prototype.flipX","DOMMatrixReadOnly.prototype.flipY","DOMMatrixReadOnly.prototype.inverse","DOMMatrixReadOnly.prototype.multiply","DOMMatrixReadOnly.prototype.rotate","DOMMatrixReadOnly.prototype.rotateAxisAngle","DOMMatrixReadOnly.prototype.rotateFromVector","DOMMatrixReadOnly.prototype.scale","DOMMatrixReadOnly.prototype.scale3d","DOMMatrixReadOnly.prototype.scaleNonUniform","DOMMatrixReadOnly.prototype.skewX","DOMMatrixReadOnly.prototype.skewY","DOMMatrixReadOnly.prototype.toFloat32Array","DOMMatrixReadOnly.prototype.toFloat64Array","DOMMatrixReadOnly.prototype.transformPoint","DOMMatrixReadOnly.prototype.translate","DOMRectList.prototype.item"]},"Gamepad":{"info":{"name":"Gamepad","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/gamepad/","identifier":"Gamepad"},"features":["Navigator.prototype.getGamepads"]},"HTML: Broadcasting":{"info":{"name":"HTML","subsection_number":"9.6","subsection_name":"Broadcasting","url":"https://html.spec.whatwg.org/multipage/comms.html#dom-broadcastchannel-postmessage","identifier":"HTML: Broadcasting"},"features":["BroadcastChannel.prototype.close","BroadcastChannel.prototype.postMessage"]},"HTML: Canvas Element":{"info":{"name":"HTML","subsection_number":"4.12.4","subsection_name":"Canvas Element","url":"https://html.spec.whatwg.org/multipage/scripting.html#the-canvas-element","identifier":"HTML: Canvas Element"},"features":["CanvasGradient.prototype.addColorStop","CanvasPattern.prototype.setTransform","CanvasRenderingContext2D.prototype.arc","CanvasRenderingContext2D.prototype.arcTo","CanvasRenderingContext2D.prototype.beginPath","CanvasRenderingContext2D.prototype.bezierCurveTo","CanvasRenderingContext2D.prototype.clearRect","CanvasRenderingContext2D.prototype.clip","CanvasRenderingContext2D.prototype.closePath","CanvasRenderingContext2D.prototype.createImageData","CanvasRenderingContext2D.prototype.createLinearGradient","CanvasRenderingContext2D.prototype.createPattern","CanvasRenderingContext2D.prototype.createRadialGradient","CanvasRenderingContext2D.prototype.drawFocusIfNeeded","CanvasRenderingContext2D.prototype.drawImage","CanvasRenderingContext2D.prototype.fill","CanvasRenderingContext2D.prototype.fillRect","CanvasRenderingContext2D.prototype.fillText","CanvasRenderingContext2D.prototype.getImageData","CanvasRenderingContext2D.prototype.getLineDash","CanvasRenderingContext2D.prototype.isPointInPath","CanvasRenderingContext2D.prototype.isPointInStroke","CanvasRenderingContext2D.prototype.lineTo","CanvasRenderingContext2D.prototype.measureText","CanvasRenderingContext2D.prototype.moveTo","CanvasRenderingContext2D.prototype.putImageData","CanvasRenderingContext2D.prototype.quadraticCurveTo","CanvasRenderingContext2D.prototype.rect","CanvasRenderingContext2D.prototype.resetTransform","CanvasRenderingContext2D.prototype.restore","CanvasRenderingContext2D.prototype.rotate","CanvasRenderingContext2D.prototype.save","CanvasRenderingContext2D.prototype.scale","CanvasRenderingContext2D.prototype.setLineDash","CanvasRenderingContext2D.prototype.setTransform","CanvasRenderingContext2D.prototype.stroke","CanvasRenderingContext2D.prototype.strokeRect","CanvasRenderingContext2D.prototype.strokeText","CanvasRenderingContext2D.prototype.transform","CanvasRenderingContext2D.prototype.translate","HTMLCanvasElement.prototype.getContext","HTMLCanvasElement.prototype.mozGetAsFile","HTMLCanvasElement.prototype.toBlob","HTMLCanvasElement.prototype.toDataURL","Path2D.prototype.addPath","Path2D.prototype.arc","Path2D.prototype.arcTo","Path2D.prototype.bezierCurveTo","Path2D.prototype.closePath","Path2D.prototype.lineTo","Path2D.prototype.moveTo","Path2D.prototype.quadraticCurveTo","Path2D.prototype.rect","window.requestAnimationFrame"]},"HTML: Channel Messaging":{"info":{"name":"HTML","subsection_number":"9.5","subsection_name":"Channel Messaging","url":"https://html.spec.whatwg.org/multipage/comms.html#channel-messaging","identifier":"HTML: Channel Messaging"},"features":["MessagePort.prototype.close","MessagePort.prototype.postMessage","MessagePort.prototype.start","window.postMessage"]},"HTML: History Interface":{"info":{"name":"HTML","subsection_number":"7.5.2","subsection_name":"History Interface","url":"https://html.spec.whatwg.org/multipage/browsers.html#the-history-interface","identifier":"HTML: History Interface"},"features":["History.prototype.back","History.prototype.forward","History.prototype.go","History.prototype.pushState","History.prototype.replaceState","window.history"]},"HTML: Plugins":{"info":{"name":"HTML","subsection_number":"8.6.1.5","subsection_name":"Plugins","url":"https://html.spec.whatwg.org/multipage/webappapis.html#plugins-2","identifier":"HTML: Plugins"},"features":["document.plugins","MimeTypeArray.prototype.item","MimeTypeArray.prototype.namedItem","navigator.mimeTypes","navigator.plugins","Plugin.prototype.item","Plugin.prototype.namedItem","PluginArray.prototype.item","PluginArray.prototype.namedItem","PluginArray.prototype.refresh"]},"HTML: Web Storage":{"info":{"name":"HTML","subsection_number":"11","subsection_name":"Web Storage","url":"https://html.spec.whatwg.org/multipage/webstorage.html","identifier":"HTML: Web Storage"},"features":["Storage.prototype.clear","Storage.prototype.getItem","Storage.prototype.key","Storage.prototype.removeItem","Storage.prototype.setItem","StorageEvent.prototype.initStorageEvent","window.localStorage","window.sessionStorage"]},"HTML: Web Sockets":{"info":{"name":"HTML","subsection_number":"9.3","subsection_name":"Web Sockets","url":"https://html.spec.whatwg.org/multipage/comms.html#network","identifier":"HTML: Web Sockets"},"features":["WebSocket.prototype.close","WebSocket.prototype.send"]},"HTML: Web Workers":{"info":{"name":"HTML","subsection_number":"10","subsection_name":"Web Workers","url":"https://html.spec.whatwg.org/multipage/workers.html","identifier":"HTML: Web Workers"},"features":["Worker.prototype.postMessage","Worker.prototype.terminate"]},"High Resolution Time Level 2":{"info":{"name":"High Resolution Time Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/hr-time/","identifier":"High Resolution Time Level 2"},"features":["Performance.prototype.now"]},"HTML":{"info":{"name":"HTML","subsection_number":null,"subsection_name":null,"url":"https://html.spec.whatwg.org","identifier":"HTML"},"features":["DataTransfer.prototype.addElement","DataTransfer.prototype.clearData","DataTransfer.prototype.getData","DataTransfer.prototype.mozClearDataAt","DataTransfer.prototype.mozGetDataAt","DataTransfer.prototype.mozSetDataAt","DataTransfer.prototype.mozTypesAt","DataTransfer.prototype.setData","DataTransfer.prototype.setDragImage","document.activeElement","document.body","document.currentScript","document.designMode","document.dir","document.getItems","document.head","document.images","document.lastModified","document.lastStyleSheetSet","document.links","document.onabort","document.onblur","document.oncanplay","document.oncanplaythrough","document.onchange","document.onclick","document.oncontextmenu","document.oncopy","document.oncut","document.ondblclick","document.ondrag","document.ondragend","document.ondragenter","document.ondragleave","document.ondragover","document.ondragstart","document.ondrop","document.ondurationchange","document.onemptied","document.onended","document.onerror","document.onfocus","document.oninput","document.oninvalid","document.onkeydown","document.onkeypress","document.onkeyup","document.onload","document.onloadeddata","document.onloadedmetadata","document.onloadstart","document.onmousedown","document.onmouseenter","document.onmouseleave","document.onmousemove","document.onmouseout","document.onmouseover","document.onmouseup","document.onpaste","document.onpause","document.onplay","document.onplaying","document.onprogress","document.onratechange","document.onreadystatechange","document.onreset","document.onresize","document.onscroll","document.onseeked","document.onseeking","document.onselect","document.onshow","document.onstalled","document.onsubmit","document.onsuspend","document.ontimeupdate","document.onvolumechange","document.onwaiting","document.onwheel","Document.prototype.enableStyleSheetsForSet","Document.prototype.hasFocus","document.selectedStyleSheetSet","document.styleSheetSets","EventSource.prototype.close","HashChangeEvent.prototype.initHashChangeEvent","HTMLAllCollection.prototype.item","HTMLAllCollection.prototype.namedItem","HTMLDocument.prototype.clear","HTMLDocument.prototype.getItems","navigator.appCodeName","navigator.appName","navigator.appVersion","navigator.cookieEnabled","navigator.onLine","navigator.platform","navigator.product","navigator.productSub","Navigator.prototype.registerContentHandler","Navigator.prototype.registerProtocolHandler","navigator.userAgent","navigator.vendor","navigator.vendorSub","PropertyNodeList.prototype.getValues","TimeRanges.prototype.end","TimeRanges.prototype.start","window.blur","window.close","window.closed","window.console","window.createImageBitmap","window.document","window.focus","window.frameElement","window.frames","window.length","window.location","window.name","window.navigator","window.onabort","window.onafterprint","window.onbeforeprint","window.onbeforeunload","window.onblur","window.oncanplay","window.oncanplaythrough","window.onchange","window.onclick","window.oncontextmenu","window.ondblclick","window.ondrag","window.ondragend","window.ondragenter","window.ondragleave","window.ondragover","window.ondragstart","window.ondurationchange","window.onemptied","window.onended","window.onerror","window.onfocus","window.onhashchange","window.oninput","window.oninvalid","window.onkeydown","window.onkeypress","window.onkeyup","window.onlanguagechange","window.onloadeddata","window.onloadedmetadata","window.onloadstart","window.onmessage","window.onmousedown","window.onmouseenter","window.onmouseleave","window.onmousemove","window.onmouseout","window.onmouseover","window.onmouseup","window.onoffline","window.ononline","window.onpagehide","window.onpageshow","window.onpause","window.onplay","window.onplaying","window.onpopstate","window.onprogress","window.onratechange","window.onreset","window.onresize","window.onscroll","window.onseeked","window.onseeking","window.onselect","window.onshow","window.onstalled","window.onsubmit","window.onsuspend","window.ontimeupdate","window.onunload","window.onvolumechange","window.onwaiting","window.onwheel","window.open","window.opener","window.parent","window.self","window.setInterval","window.setResizable","window.setTimeout","window.showModalDialog","window.stop","window.top","window.window","XMLDocument.prototype.load"]},"HTML 5":{"info":{"name":"HTML 5","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/html5/","identifier":"HTML 5"},"features":["document.defaultView","document.location","document.onafterscriptexecute","document.onbeforescriptexecute","document.preferredStyleSheetSet","document.readyState","HTMLButtonElement.prototype.checkValidity","HTMLButtonElement.prototype.setCustomValidity","HTMLFieldSetElement.prototype.checkValidity","HTMLFieldSetElement.prototype.setCustomValidity","HTMLFormControlsCollection.prototype.item","HTMLFormElement.prototype.checkValidity","HTMLInputElement.prototype.checkValidity","HTMLInputElement.prototype.setCustomValidity","HTMLInputElement.prototype.setRangeText","HTMLInputElement.prototype.setSelectionRange","HTMLInputElement.prototype.stepDown","HTMLInputElement.prototype.stepUp","HTMLMediaElement.prototype.addTextTrack","HTMLMediaElement.prototype.canPlayType","HTMLMediaElement.prototype.fastSeek","HTMLMediaElement.prototype.load","HTMLMediaElement.prototype.mozCaptureStream","HTMLMediaElement.prototype.mozCaptureStreamUntilEnded","HTMLMediaElement.prototype.mozGetMetadata","HTMLMediaElement.prototype.pause","HTMLMediaElement.prototype.play","HTMLMediaElement.prototype.setMediaKeys","HTMLObjectElement.prototype.checkValidity","HTMLObjectElement.prototype.setCustomValidity","HTMLOptionsCollection.prototype.add","HTMLOptionsCollection.prototype.remove","HTMLOutputElement.prototype.checkValidity","HTMLOutputElement.prototype.setCustomValidity","HTMLSelectElement.prototype.checkValidity","HTMLSelectElement.prototype.setCustomValidity","HTMLTextAreaElement.prototype.checkValidity","HTMLTextAreaElement.prototype.setCustomValidity","HTMLTextAreaElement.prototype.setRangeText","HTMLTextAreaElement.prototype.setSelectionRange","location.assign","location.reload","location.replace","OfflineResourceList.prototype.mozAdd","OfflineResourceList.prototype.mozHasItem","OfflineResourceList.prototype.mozItem","OfflineResourceList.prototype.mozRemove","OfflineResourceList.prototype.swapCache","OfflineResourceList.prototype.update","TextTrack.prototype.addCue","TextTrack.prototype.removeCue","TextTrackCueList.prototype.getCueById","TextTrackList.prototype.getTrackById","TimeEvent.prototype.initTimeEvent","window.alert","window.applicationCache","window.atob","window.btoa","window.confirm","window.locationbar","window.menubar","window.personalbar","window.print","window.prompt","window.scrollbars","window.status","window.statusbar","window.toolbar","location.href"]},"HTML 5.1":{"info":{"name":"HTML 5.1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/html51/","identifier":"HTML 5.1"},"features":["DragEvent.prototype.initDragEvent","External.prototype.addSearchEngine","External.prototype.AddSearchProvider","External.prototype.IsSearchProviderInstalled","navigator.language","navigator.languages"]},"Indexed Database API":{"info":{"name":"Indexed Database API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/IndexedDB/","identifier":"Indexed Database API"},"features":["IDBCursor.prototype.advance","IDBCursor.prototype.continue","IDBCursor.prototype.delete","IDBCursor.prototype.update","IDBDatabase.prototype.close","IDBDatabase.prototype.createMutableFile","IDBDatabase.prototype.createObjectStore","IDBDatabase.prototype.deleteObjectStore","IDBDatabase.prototype.mozCreateFileHandle","IDBDatabase.prototype.transaction","IDBFactory.prototype.cmp","IDBFactory.prototype.deleteDatabase","IDBFactory.prototype.open","IDBFileHandle.prototype.abort","IDBFileHandle.prototype.append","IDBFileHandle.prototype.flush","IDBFileHandle.prototype.getMetadata","IDBFileHandle.prototype.readAsArrayBuffer","IDBFileHandle.prototype.readAsText","IDBFileHandle.prototype.truncate","IDBFileHandle.prototype.write","IDBIndex.prototype.count","IDBIndex.prototype.get","IDBIndex.prototype.getKey","IDBIndex.prototype.mozGetAll","IDBIndex.prototype.mozGetAllKeys","IDBIndex.prototype.openCursor","IDBIndex.prototype.openKeyCursor","IDBKeyRange.bound","IDBKeyRange.lowerBound","IDBKeyRange.only","IDBKeyRange.upperBound","IDBMutableFile.prototype.getFile","IDBMutableFile.prototype.open","IDBObjectStore.prototype.add","IDBObjectStore.prototype.clear","IDBObjectStore.prototype.count","IDBObjectStore.prototype.createIndex","IDBObjectStore.prototype.delete","IDBObjectStore.prototype.deleteIndex","IDBObjectStore.prototype.get","IDBObjectStore.prototype.index","IDBObjectStore.prototype.mozGetAll","IDBObjectStore.prototype.openCursor","IDBObjectStore.prototype.put","IDBTransaction.prototype.abort","IDBTransaction.prototype.objectStore","window.indexedDB"]},"Media Capture from DOM Elements":{"info":{"name":"Media Capture from DOM Elements","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/mediacapture-fromelement/","identifier":"Media Capture from DOM Elements"},"features":["CanvasCaptureMediaStream.prototype.requestFrame","HTMLCanvasElement.prototype.captureStream"]},"Media Capture and Streams":{"info":{"name":"Media Capture and Streams","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/mediacapture-streams/","identifier":"Media Capture and Streams"},"features":["LocalMediaStream.prototype.stop","MediaDevices.prototype.enumerateDevices","MediaDevices.prototype.getUserMedia","navigator.mediaDevices"]},"Media Source Extensions":{"info":{"name":"Media Source Extensions","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/media-source/","identifier":"Media Source Extensions"},"features":["HTMLVideoElement.prototype.getVideoPlaybackQuality","MediaSource.isTypeSupported","MediaSource.prototype.addSourceBuffer","MediaSource.prototype.endOfStream","MediaSource.prototype.removeSourceBuffer","SourceBuffer.prototype.abort","SourceBuffer.prototype.appendBuffer","SourceBuffer.prototype.remove"]},"MediaStream Recording":{"info":{"name":"MediaStream Recording","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/mediastream-recording/","identifier":"MediaStream Recording"},"features":["MediaRecorder.prototype.pause","MediaRecorder.prototype.requestData","MediaRecorder.prototype.resume","MediaRecorder.prototype.start","MediaRecorder.prototype.stop","MediaStream.prototype.getAudioTracks","MediaStream.prototype.getTracks","MediaStream.prototype.getVideoTracks","MediaStreamTrack.prototype.applyConstraints","MediaStreamTrack.prototype.stop"]},"Non-Standard":{"info":{"name":"Non-Standard","subsection_number":null,"subsection_name":null,"url":null,"identifier":"Non-Standard"},"features":["AnonymousContent.prototype.getAttributeForElement","AnonymousContent.prototype.getTextContentForElement","AnonymousContent.prototype.removeAttributeForElement","AnonymousContent.prototype.setAttributeForElement","AnonymousContent.prototype.setTextContentForElement","CommandEvent.prototype.initCommandEvent","document.embeds","Document.prototype.mozSetImageElement","Document.prototype.releaseCapture","DOMCursor.prototype.continue","DOMRequest.prototype.then","Element.prototype.releaseCapture","Element.prototype.setCapture","Event.prototype.getPreventDefault","HTMLDocument.prototype.captureEvents","HTMLDocument.prototype.releaseEvents","HTMLInputElement.prototype.mozIsTextField","HTMLPropertiesCollection.prototype.item","HTMLPropertiesCollection.prototype.namedItem","window.captureEvents","MouseEvent.prototype.initNSMouseEvent","MouseScrollEvent.prototype.initMouseScrollEvent","mozContact.prototype.init","MozPowerManager.prototype.addWakeLockListener","MozPowerManager.prototype.factoryReset","MozPowerManager.prototype.getWakeLockState","MozPowerManager.prototype.powerOff","MozPowerManager.prototype.reboot","MozPowerManager.prototype.removeWakeLockListener","navigator.buildID","navigator.oscpu","Navigator.prototype.javaEnabled","PaintRequestList.prototype.item","screen.availLeft","screen.availTop","screen.top","ScrollAreaEvent.prototype.initScrollAreaEvent","SimpleGestureEvent.prototype.initSimpleGestureEvent","window.content","window.controllers","window.dump","window.external","window.find","window.fullScreen","window.getDefaultComputedStyle","window.mozInnerScreenX","window.mozInnerScreenY","window.mozPaintCount","window.ondrop","window.releaseEvents","window.scrollByLines","window.scrollByPages","window.scrollMaxX","window.scrollMaxY","window.sidebar","window.sizeToContent","window.updateCommands","XSLTProcessor.prototype.clearParameters","XSLTProcessor.prototype.getParameter","XSLTProcessor.prototype.importStylesheet","XSLTProcessor.prototype.removeParameter","XSLTProcessor.prototype.reset","XSLTProcessor.prototype.setParameter","XSLTProcessor.prototype.transformToDocument","XSLTProcessor.prototype.transformToFragment"]},"Navigation Timing":{"info":{"name":"Navigation Timing","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/navigation-timing/","identifier":"Navigation Timing"},"features":["performance.navigation","performance.navigation.redirectCount","performance.navigation.type","performance.timing","performance.timing.connectEnd","performance.timing.connectStart","performance.timing.domainLookupEnd","performance.timing.domainLookupStart","performance.timing.domComplete","performance.timing.domContentLoadedEventEnd","performance.timing.domContentLoadedEventStart","performance.timing.domInteractive","performance.timing.domLoading","performance.timing.fetchStart","performance.timing.loadEventEnd","performance.timing.loadEventStart","performance.timing.navigationStart","performance.timing.redirectEnd","performance.timing.redirectStart","performance.timing.requestStart","performance.timing.responseEnd","performance.timing.responseStart","performance.timing.unloadEventEnd","performance.timing.unloadEventStart","window.performance"]},"Proximity Events":{"info":{"name":"Proximity Events","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/proximity/","identifier":"Proximity Events"},"features":["window.ondeviceproximity","window.onuserproximity"]},"Pointer Lock":{"info":{"name":"Pointer Lock","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/pointerlock/","identifier":"Pointer Lock"},"features":["document.mozPointerLockElement","document.onmozpointerlockchange","document.onmozpointerlockerror","Document.prototype.mozExitPointerLock","Element.prototype.mozRequestPointerLock","window.onmozpointerlockchange","window.onmozpointerlockerror"]},"Performance Timeline":{"info":{"name":"Performance Timeline","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/performance-timeline","identifier":"Performance Timeline"},"features":["Performance.prototype.getEntriesByName","Performance.prototype.getEntriesByType"]},"Performance Timeline Level 2":{"info":{"name":"Performance Timeline Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/performance-timeline","identifier":"Performance Timeline Level 2"},"features":["Performance.prototype.getEntries"]},"Page Visibility (Second Edition)":{"info":{"name":"Page Visibility (Second Edition)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/page-visibility/","identifier":"Page Visibility (Second Edition)"},"features":["document.hidden","document.mozHidden","document.mozVisibilityState","document.visibilityState"]},"Resource Timing":{"info":{"name":"Resource Timing","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/resource-timing/","identifier":"Resource Timing"},"features":["performance.onresourcetimingbufferfull","Performance.prototype.clearResourceTimings","Performance.prototype.setResourceTimingBufferSize"]},"Shadow DOM":{"info":{"name":"Shadow DOM","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/shadow-dom/","identifier":"Shadow DOM"},"features":["HTMLContentElement.prototype.getDistributedNodes"]},"Selection API":{"info":{"name":"Selection API","subsection_number":null,"subsection_name":null,"url":"http://w3c.github.io/selection-api/","identifier":"Selection API"},"features":["HTMLDocument.prototype.getSelection","Selection.prototype.addRange","Selection.prototype.collapse","Selection.prototype.collapseToEnd","Selection.prototype.collapseToStart","Selection.prototype.containsNode","Selection.prototype.deleteFromDocument","Selection.prototype.extend","Selection.prototype.getRangeAt","Selection.prototype.modify","Selection.prototype.removeAllRanges","Selection.prototype.removeRange","Selection.prototype.selectAllChildren","window.getSelection"]},"Selectors API Level 1":{"info":{"name":"Selectors API Level 1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/selectors-api","identifier":"Selectors API Level 1"},"features":["Document.prototype.querySelector","Document.prototype.querySelectorAll","DocumentFragment.prototype.querySelector","DocumentFragment.prototype.querySelectorAll","Element.prototype.querySelector","Element.prototype.querySelectorAll"]},"Screen Orientation API":{"info":{"name":"Screen Orientation API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/screen-orientation/","identifier":"Screen Orientation API"},"features":["screen.mozOrientation","screen.onmozorientationchange","screen.orientation","Screen.prototype.mozLockOrientation","Screen.prototype.mozUnlockOrientation","ScreenOrientation.prototype.lock","ScreenOrientation.prototype.unlock","window.ondevicemotion","window.ondeviceorientation"]},"Scalable Vector Graphics (SVG) 1.1 (Second Edition)":{"info":{"name":"Scalable Vector Graphics (SVG) 1.1 (Second Edition)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/SVG/","identifier":"Scalable Vector Graphics (SVG) 1.1 (Second Edition)"},"features":["HTMLEmbedElement.prototype.getSVGDocument","HTMLIFrameElement.prototype.getSVGDocument","HTMLObjectElement.prototype.getSVGDocument","SVGAngle.prototype.convertToSpecifiedUnits","SVGAngle.prototype.newValueSpecifiedUnits","SVGAnimationElement.prototype.beginElement","SVGAnimationElement.prototype.beginElementAt","SVGAnimationElement.prototype.endElement","SVGAnimationElement.prototype.endElementAt","SVGAnimationElement.prototype.getCurrentTime","SVGAnimationElement.prototype.getSimpleDuration","SVGAnimationElement.prototype.getStartTime","SVGAnimationElement.prototype.hasExtension","SVGFEDropShadowElement.prototype.setStdDeviation","SVGFEGaussianBlurElement.prototype.setStdDeviation","SVGFilterElement.apply","SVGGraphicsElement.prototype.getBBox","SVGGraphicsElement.prototype.getCTM","SVGGraphicsElement.prototype.getScreenCTM","SVGGraphicsElement.prototype.getTransformToElement","SVGGraphicsElement.prototype.hasExtension","SVGLength.prototype.convertToSpecifiedUnits","SVGLength.prototype.newValueSpecifiedUnits","SVGLengthList.prototype.appendItem","SVGLengthList.prototype.clear","SVGLengthList.prototype.getItem","SVGLengthList.prototype.initialize","SVGLengthList.prototype.insertItemBefore","SVGLengthList.prototype.removeItem","SVGLengthList.prototype.replaceItem","SVGMarkerElement.prototype.setOrientToAngle","SVGMarkerElement.prototype.setOrientToAuto","SVGMatrix.prototype.flipX","SVGMatrix.prototype.flipY","SVGMatrix.prototype.inverse","SVGMatrix.prototype.multiply","SVGMatrix.prototype.rotate","SVGMatrix.prototype.rotateFromVector","SVGMatrix.prototype.scale","SVGMatrix.prototype.scaleNonUniform","SVGMatrix.prototype.skewX","SVGMatrix.prototype.skewY","SVGMatrix.prototype.translate","SVGNumberList.prototype.appendItem","SVGNumberList.prototype.clear","SVGNumberList.prototype.getItem","SVGNumberList.prototype.initialize","SVGNumberList.prototype.insertItemBefore","SVGNumberList.prototype.removeItem","SVGNumberList.prototype.replaceItem","SVGPathElement.prototype.createSVGPathSegArcAbs","SVGPathElement.prototype.createSVGPathSegArcRel","SVGPathElement.prototype.createSVGPathSegClosePath","SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs","SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel","SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs","SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel","SVGPathElement.prototype.createSVGPathSegLinetoAbs","SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs","SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel","SVGPathElement.prototype.createSVGPathSegLinetoRel","SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs","SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel","SVGPathElement.prototype.createSVGPathSegMovetoAbs","SVGPathElement.prototype.createSVGPathSegMovetoRel","SVGPathElement.prototype.getPathSegAtLength","SVGPathElement.prototype.getPointAtLength","SVGPathElement.prototype.getTotalLength","SVGPathSegList.prototype.appendItem","SVGPathSegList.prototype.clear","SVGPathSegList.prototype.getItem","SVGPathSegList.prototype.initialize","SVGPathSegList.prototype.insertItemBefore","SVGPathSegList.prototype.removeItem","SVGPathSegList.prototype.replaceItem","SVGPoint.prototype.matrixTransform","SVGPointList.prototype.appendItem","SVGPointList.prototype.clear","SVGPointList.prototype.getItem","SVGPointList.prototype.initialize","SVGPointList.prototype.insertItemBefore","SVGPointList.prototype.removeItem","SVGPointList.prototype.replaceItem","SVGStringList.prototype.appendItem","SVGStringList.prototype.clear","SVGStringList.prototype.getItem","SVGStringList.prototype.initialize","SVGStringList.prototype.insertItemBefore","SVGStringList.prototype.removeItem","SVGStringList.prototype.replaceItem","SVGSVGElement.prototype.animationsPaused","SVGSVGElement.prototype.createSVGAngle","SVGSVGElement.prototype.createSVGLength","SVGSVGElement.prototype.createSVGMatrix","SVGSVGElement.prototype.createSVGNumber","SVGSVGElement.prototype.createSVGPoint","SVGSVGElement.prototype.createSVGRect","SVGSVGElement.prototype.createSVGTransform","SVGSVGElement.prototype.createSVGTransformFromMatrix","SVGSVGElement.prototype.deselectAll","SVGSVGElement.prototype.forceRedraw","SVGSVGElement.prototype.getCurrentTime","SVGSVGElement.prototype.getElementById","SVGSVGElement.prototype.pauseAnimations","SVGSVGElement.prototype.setCurrentTime","SVGSVGElement.prototype.suspendRedraw","SVGSVGElement.prototype.unpauseAnimations","SVGSVGElement.prototype.unsuspendRedraw","SVGSVGElement.prototype.unsuspendRedrawAll","SVGSymbolElement.prototype.hasExtension","SVGTextContentElement.prototype.getCharNumAtPosition","SVGTextContentElement.prototype.getComputedTextLength","SVGTextContentElement.prototype.getEndPositionOfChar","SVGTextContentElement.prototype.getExtentOfChar","SVGTextContentElement.prototype.getNumberOfChars","SVGTextContentElement.prototype.getRotationOfChar","SVGTextContentElement.prototype.getStartPositionOfChar","SVGTextContentElement.prototype.getSubStringLength","SVGTextContentElement.prototype.selectSubString","SVGTransform.prototype.setMatrix","SVGTransform.prototype.setRotate","SVGTransform.prototype.setScale","SVGTransform.prototype.setSkewX","SVGTransform.prototype.setSkewY","SVGTransform.prototype.setTranslate","SVGTransformList.prototype.appendItem","SVGTransformList.prototype.clear","SVGTransformList.prototype.consolidate","SVGTransformList.prototype.createSVGTransformFromMatrix","SVGTransformList.prototype.getItem","SVGTransformList.prototype.initialize","SVGTransformList.prototype.insertItemBefore","SVGTransformList.prototype.removeItem","SVGTransformList.prototype.replaceItem"]},"Service Workers":{"info":{"name":"Service Workers","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/service-workers/","identifier":"Service Workers"},"features":["Cache.prototype.add","Cache.prototype.addAll","Cache.prototype.delete","Cache.prototype.keys","Cache.prototype.match","Cache.prototype.matchAll","Cache.prototype.put","CacheStorage.prototype.delete","CacheStorage.prototype.has","CacheStorage.prototype.keys","CacheStorage.prototype.match","CacheStorage.prototype.open","window.caches"]},"Timing Control for Script-Based Animations":{"info":{"name":"Timing Control for Script-Based Animations","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/animation-timing","identifier":"Timing Control for Script-Based Animations"},"features":["window.cancelAnimationFrame"]},"Tracking Preference Expression (DNT)":{"info":{"name":"Tracking Preference Expression (DNT)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/tracking-dnt/","identifier":"Tracking Preference Expression (DNT)"},"features":["navigator.doNotTrack"]},"UI Events Specification":{"info":{"name":"UI Events Specification","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/uievents/","identifier":"UI Events Specification"},"features":["CompositionEvent.prototype.initCompositionEvent","Event.prototype.stopImmediatePropagation","KeyboardEvent.prototype.getModifierState","KeyboardEvent.prototype.initKeyEvent","MouseEvent.prototype.getModifierState","MouseEvent.prototype.initMouseEvent","MutationEvent.prototype.initMutationEvent","UIEvent.prototype.initUIEvent"]},"URL":{"info":{"name":"URL","subsection_number":null,"subsection_name":null,"url":"https://url.spec.whatwg.org/","identifier":"URL"},"features":["URLSearchParams.prototype.append","URLSearchParams.prototype.delete","URLSearchParams.prototype.get","URLSearchParams.prototype.getAll","URLSearchParams.prototype.has","URLSearchParams.prototype.set"]},"User Timing Level 2":{"info":{"name":"User Timing Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/user-timing/","identifier":"User Timing Level 2"},"features":["Performance.prototype.clearMarks","Performance.prototype.clearMeasures","Performance.prototype.mark","Performance.prototype.measure"]},"Vibration API":{"info":{"name":"Vibration API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/vibration/","identifier":"Vibration API"},"features":["Navigator.prototype.vibrate"]},"Web Cryptography API":{"info":{"name":"Web Cryptography API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/WebCryptoAPI/","identifier":"Web Cryptography API"},"features":["Crypto.prototype.getRandomValues","SubtleCrypto.prototype.decrypt","SubtleCrypto.prototype.deriveBits","SubtleCrypto.prototype.deriveKey","SubtleCrypto.prototype.digest","SubtleCrypto.prototype.encrypt","SubtleCrypto.prototype.exportKey","SubtleCrypto.prototype.generateKey","SubtleCrypto.prototype.importKey","SubtleCrypto.prototype.sign","SubtleCrypto.prototype.unwrapKey","SubtleCrypto.prototype.verify","SubtleCrypto.prototype.wrapKey","window.crypto"]},"Web Audio API":{"info":{"name":"Web Audio API","subsection_number":null,"subsection_name":null,"url":"https://webaudio.github.io/web-audio-api","identifier":"Web Audio API"},"features":["AnalyserNode.prototype.getByteFrequencyData","AnalyserNode.prototype.getByteTimeDomainData","AnalyserNode.prototype.getFloatFrequencyData","AnalyserNode.prototype.getFloatTimeDomainData","AudioBuffer.prototype.copyFromChannel","AudioBuffer.prototype.copyToChannel","AudioBuffer.prototype.getChannelData","AudioBufferSourceNode.prototype.start","AudioBufferSourceNode.prototype.stop","AudioContext.prototype.close","AudioContext.prototype.createAnalyser","AudioContext.prototype.createBiquadFilter","AudioContext.prototype.createBuffer","AudioContext.prototype.createBufferSource","AudioContext.prototype.createChannelMerger","AudioContext.prototype.createChannelSplitter","AudioContext.prototype.createConvolver","AudioContext.prototype.createDelay","AudioContext.prototype.createDynamicsCompressor","AudioContext.prototype.createGain","AudioContext.prototype.createMediaElementSource","AudioContext.prototype.createMediaStreamDestination","AudioContext.prototype.createMediaStreamSource","AudioContext.prototype.createOscillator","AudioContext.prototype.createPanner","AudioContext.prototype.createPeriodicWave","AudioContext.prototype.createScriptProcessor","AudioContext.prototype.createStereoPanner","AudioContext.prototype.createWaveShaper","AudioContext.prototype.decodeAudioData","AudioContext.prototype.resume","AudioContext.prototype.suspend","AudioListener.prototype.setOrientation","AudioListener.prototype.setPosition","AudioListener.prototype.setVelocity","AudioNode.prototype.connect","AudioNode.prototype.disconnect","AudioParam.prototype.cancelScheduledValues","AudioParam.prototype.exponentialRampToValueAtTime","AudioParam.prototype.linearRampToValueAtTime","AudioParam.prototype.setValueAtTime","AudioParam.prototype.setValueCurveAtTime","BiquadFilterNode.prototype.getFrequencyResponse","OfflineAudioContext.prototype.resume","OfflineAudioContext.prototype.startRendering","OfflineAudioContext.prototype.suspend","OscillatorNode.prototype.setPeriodicWave","OscillatorNode.prototype.start","OscillatorNode.prototype.stop","PannerNode.prototype.setOrientation","PannerNode.prototype.setPosition","PannerNode.prototype.setVelocity"]},"WebGL Specification":{"info":{"name":"WebGL Specification","subsection_number":null,"subsection_name":null,"url":"https://www.khronos.org/registry/webgl/specs/latest/1.0/","identifier":"WebGL Specification"},"features":["WebGLRenderingContext.prototype.activeTexture","WebGLRenderingContext.prototype.attachShader","WebGLRenderingContext.prototype.bindAttribLocation","WebGLRenderingContext.prototype.bindBuffer","WebGLRenderingContext.prototype.bindFramebuffer","WebGLRenderingContext.prototype.bindRenderbuffer","WebGLRenderingContext.prototype.bindTexture","WebGLRenderingContext.prototype.blendColor","WebGLRenderingContext.prototype.blendEquation","WebGLRenderingContext.prototype.blendEquationSeparate","WebGLRenderingContext.prototype.blendFunc","WebGLRenderingContext.prototype.blendFuncSeparate","WebGLRenderingContext.prototype.bufferData","WebGLRenderingContext.prototype.bufferSubData","WebGLRenderingContext.prototype.checkFramebufferStatus","WebGLRenderingContext.prototype.clear","WebGLRenderingContext.prototype.clearColor","WebGLRenderingContext.prototype.clearDepth","WebGLRenderingContext.prototype.clearStencil","WebGLRenderingContext.prototype.colorMask","WebGLRenderingContext.prototype.compileShader","WebGLRenderingContext.prototype.compressedTexImage2D","WebGLRenderingContext.prototype.compressedTexSubImage2D","WebGLRenderingContext.prototype.copyTexImage2D","WebGLRenderingContext.prototype.copyTexSubImage2D","WebGLRenderingContext.prototype.createBuffer","WebGLRenderingContext.prototype.createFramebuffer","WebGLRenderingContext.prototype.createProgram","WebGLRenderingContext.prototype.createRenderbuffer","WebGLRenderingContext.prototype.createShader","WebGLRenderingContext.prototype.createTexture","WebGLRenderingContext.prototype.cullFace","WebGLRenderingContext.prototype.deleteBuffer","WebGLRenderingContext.prototype.deleteFramebuffer","WebGLRenderingContext.prototype.deleteProgram","WebGLRenderingContext.prototype.deleteRenderbuffer","WebGLRenderingContext.prototype.deleteShader","WebGLRenderingContext.prototype.deleteTexture","WebGLRenderingContext.prototype.depthFunc","WebGLRenderingContext.prototype.depthMask","WebGLRenderingContext.prototype.depthRange","WebGLRenderingContext.prototype.detachShader","WebGLRenderingContext.prototype.disable","WebGLRenderingContext.prototype.disableVertexAttribArray","WebGLRenderingContext.prototype.drawArrays","WebGLRenderingContext.prototype.drawElements","WebGLRenderingContext.prototype.enable","WebGLRenderingContext.prototype.enableVertexAttribArray","WebGLRenderingContext.prototype.finish","WebGLRenderingContext.prototype.flush","WebGLRenderingContext.prototype.framebufferRenderbuffer","WebGLRenderingContext.prototype.framebufferTexture2D","WebGLRenderingContext.prototype.frontFace","WebGLRenderingContext.prototype.generateMipmap","WebGLRenderingContext.prototype.getActiveAttrib","WebGLRenderingContext.prototype.getActiveUniform","WebGLRenderingContext.prototype.getAttachedShaders","WebGLRenderingContext.prototype.getAttribLocation","WebGLRenderingContext.prototype.getBufferParameter","WebGLRenderingContext.prototype.getContextAttributes","WebGLRenderingContext.prototype.getError","WebGLRenderingContext.prototype.getExtension","WebGLRenderingContext.prototype.getFramebufferAttachmentParameter","WebGLRenderingContext.prototype.getParameter","WebGLRenderingContext.prototype.getProgramInfoLog","WebGLRenderingContext.prototype.getProgramParameter","WebGLRenderingContext.prototype.getRenderbufferParameter","WebGLRenderingContext.prototype.getShaderInfoLog","WebGLRenderingContext.prototype.getShaderParameter","WebGLRenderingContext.prototype.getShaderPrecisionFormat","WebGLRenderingContext.prototype.getShaderSource","WebGLRenderingContext.prototype.getSupportedExtensions","WebGLRenderingContext.prototype.getTexParameter","WebGLRenderingContext.prototype.getUniform","WebGLRenderingContext.prototype.getUniformLocation","WebGLRenderingContext.prototype.getVertexAttrib","WebGLRenderingContext.prototype.getVertexAttribOffset","WebGLRenderingContext.prototype.hint","WebGLRenderingContext.prototype.isBuffer","WebGLRenderingContext.prototype.isContextLost","WebGLRenderingContext.prototype.isEnabled","WebGLRenderingContext.prototype.isFramebuffer","WebGLRenderingContext.prototype.isProgram","WebGLRenderingContext.prototype.isRenderbuffer","WebGLRenderingContext.prototype.isShader","WebGLRenderingContext.prototype.isTexture","WebGLRenderingContext.prototype.lineWidth","WebGLRenderingContext.prototype.linkProgram","WebGLRenderingContext.prototype.pixelStorei","WebGLRenderingContext.prototype.polygonOffset","WebGLRenderingContext.prototype.readPixels","WebGLRenderingContext.prototype.renderbufferStorage","WebGLRenderingContext.prototype.sampleCoverage","WebGLRenderingContext.prototype.scissor","WebGLRenderingContext.prototype.shaderSource","WebGLRenderingContext.prototype.stencilFunc","WebGLRenderingContext.prototype.stencilFuncSeparate","WebGLRenderingContext.prototype.stencilMask","WebGLRenderingContext.prototype.stencilMaskSeparate","WebGLRenderingContext.prototype.stencilOp","WebGLRenderingContext.prototype.stencilOpSeparate","WebGLRenderingContext.prototype.texImage2D","WebGLRenderingContext.prototype.texParameterf","WebGLRenderingContext.prototype.texParameteri","WebGLRenderingContext.prototype.texSubImage2D","WebGLRenderingContext.prototype.uniform1f","WebGLRenderingContext.prototype.uniform1fv","WebGLRenderingContext.prototype.uniform1i","WebGLRenderingContext.prototype.uniform1iv","WebGLRenderingContext.prototype.uniform2f","WebGLRenderingContext.prototype.uniform2fv","WebGLRenderingContext.prototype.uniform2i","WebGLRenderingContext.prototype.uniform2iv","WebGLRenderingContext.prototype.uniform3f","WebGLRenderingContext.prototype.uniform3fv","WebGLRenderingContext.prototype.uniform3i","WebGLRenderingContext.prototype.uniform3iv","WebGLRenderingContext.prototype.uniform4f","WebGLRenderingContext.prototype.uniform4fv","WebGLRenderingContext.prototype.uniform4i","WebGLRenderingContext.prototype.uniform4iv","WebGLRenderingContext.prototype.uniformMatrix2fv","WebGLRenderingContext.prototype.uniformMatrix3fv","WebGLRenderingContext.prototype.uniformMatrix4fv","WebGLRenderingContext.prototype.useProgram","WebGLRenderingContext.prototype.validateProgram","WebGLRenderingContext.prototype.vertexAttrib1f","WebGLRenderingContext.prototype.vertexAttrib1fv","WebGLRenderingContext.prototype.vertexAttrib2f","WebGLRenderingContext.prototype.vertexAttrib2fv","WebGLRenderingContext.prototype.vertexAttrib3f","WebGLRenderingContext.prototype.vertexAttrib3fv","WebGLRenderingContext.prototype.vertexAttrib4f","WebGLRenderingContext.prototype.vertexAttrib4fv","WebGLRenderingContext.prototype.vertexAttribPointer","WebGLRenderingContext.prototype.viewport"]},"WebVTT: The Web Video Text Tracks Format":{"info":{"name":"WebVTT: The Web Video Text Tracks Format","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/webvtt/","identifier":"WebVTT: The Web Video Text Tracks Format"},"features":["VTTCue.prototype.getCueAsHTML"]},"Web Notifications":{"info":{"name":"Web Notifications","subsection_number":null,"subsection_name":null,"url":"https://notifications.spec.whatwg.org/","identifier":"Web Notifications"},"features":["DesktopNotification.prototype.show","DesktopNotificationCenter.prototype.createNotification","Notification.get","Notification.prototype.close","Notification.requestPermission"]},"WebRTC 1.0: Real-time Communication Between Browser":{"info":{"name":"WebRTC 1.0: Real-time Communication Between Browser","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/webrtc/","identifier":"WebRTC 1.0: Real-time Communication Between Browser"},"features":["DataChannel.prototype.close","DataChannel.prototype.send","mozRTCPeerConnection.generateCertificate","mozRTCPeerConnection.prototype.addIceCandidate","mozRTCPeerConnection.prototype.addStream","mozRTCPeerConnection.prototype.addTrack","mozRTCPeerConnection.prototype.close","mozRTCPeerConnection.prototype.createAnswer","mozRTCPeerConnection.prototype.createDataChannel","mozRTCPeerConnection.prototype.createOffer","mozRTCPeerConnection.prototype.getConfiguration","mozRTCPeerConnection.prototype.getIdentityAssertion","mozRTCPeerConnection.prototype.getLocalStreams","mozRTCPeerConnection.prototype.getReceivers","mozRTCPeerConnection.prototype.getRemoteStreams","mozRTCPeerConnection.prototype.getSenders","mozRTCPeerConnection.prototype.getStats","mozRTCPeerConnection.prototype.getStreamById","mozRTCPeerConnection.prototype.removeStream","mozRTCPeerConnection.prototype.removeTrack","mozRTCPeerConnection.prototype.setIdentityProvider","mozRTCPeerConnection.prototype.setLocalDescription","mozRTCPeerConnection.prototype.setRemoteDescription","mozRTCPeerConnection.prototype.updateIce","RTCRtpSender.prototype.replaceTrack","RTCStatsReport.prototype.forEach","RTCStatsReport.prototype.get","RTCStatsReport.prototype.has"]}}; \ No newline at end of file + +window.WEB_API_MANAGER.standards = {"XMLHttpRequest":{"info":{"name":"XMLHttpRequest","subsection_number":null,"subsection_name":null,"url":"https://xhr.spec.whatwg.org/","identifier":"XMLHttpRequest"},"features":["FormData.prototype.append","FormData.prototype.delete","FormData.prototype.get","FormData.prototype.getAll","FormData.prototype.has","FormData.prototype.set","XMLHttpRequest.prototype.abort","XMLHttpRequest.prototype.getAllResponseHeaders","XMLHttpRequest.prototype.getResponseHeader","XMLHttpRequest.prototype.open","XMLHttpRequest.prototype.overrideMimeType","XMLHttpRequest.prototype.send","XMLHttpRequest.prototype.setRequestHeader"]},"Ambient Light Sensor API":{"info":{"name":"Ambient Light Sensor API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/ambient-light/","identifier":"Ambient Light Sensor API"},"features":["window.ondevicelight"]},"Battery Status API":{"info":{"name":"Battery Status API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/battery-status/","identifier":"Battery Status API"},"features":["navigator.battery","Navigator.prototype.getBattery"]},"Beacon":{"info":{"name":"Beacon","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/beacon/","identifier":"Beacon"},"features":["Navigator.prototype.sendBeacon"]},"Console API":{"info":{"name":"Console API","subsection_number":null,"subsection_name":null,"url":"https://github.com/DeveloperToolsWG/console-object","identifier":"Console API"},"features":["Console.prototype.assert","Console.prototype.clear","Console.prototype.count","Console.prototype.debug","Console.prototype.dir","Console.prototype.dirxml","Console.prototype.error","Console.prototype.group","Console.prototype.groupCollapsed","Console.prototype.groupEnd","Console.prototype.info","Console.prototype.log","Console.prototype.markTimeline","Console.prototype.profile","Console.prototype.profileEnd","Console.prototype.table","Console.prototype.time","Console.prototype.timeEnd","Console.prototype.timeline","Console.prototype.timelineEnd","Console.prototype.timeStamp","Console.prototype.trace","Console.prototype.warn"]},"CSS Conditional Rules Module Level 3":{"info":{"name":"CSS Conditional Rules Module Level 3","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/css-conditional-3/","identifier":"CSS Conditional Rules Module Level 3"},"features":["CSS.supports"]},"CSS Font Loading Module Level 3":{"info":{"name":"CSS Font Loading Module Level 3","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/css-font-loading/","identifier":"CSS Font Loading Module Level 3"},"features":["document.fonts","FontFace.prototype.load","FontFaceSet.prototype.add","FontFaceSet.prototype.check","FontFaceSet.prototype.clear","FontFaceSet.prototype.delete","FontFaceSet.prototype.entries","FontFaceSet.prototype.forEach","FontFaceSet.prototype.has","FontFaceSet.prototype.keys","FontFaceSet.prototype.load","FontFaceSet.prototype.values"]},"CSS Object Model (CSSOM)":{"info":{"name":"CSS Object Model (CSSOM)","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/cssom/","identifier":"CSS Object Model (CSSOM)"},"features":["CSS.escape","Document.prototype.caretPositionFromPoint","Document.prototype.elementFromPoint","Element.prototype.getBoundingClientRect","Element.prototype.getClientRects","Element.prototype.scroll","Element.prototype.scrollBy","Element.prototype.scrollIntoView","Element.prototype.scrollTo","MediaList.prototype.appendMedium","MediaList.prototype.deleteMedium","MediaList.prototype.item","MediaQueryList.prototype.addListener","MediaQueryList.prototype.removeListener","StyleSheetList.prototype.item"]},"CSSOM View Module":{"info":{"name":"CSSOM View Module","subsection_number":null,"subsection_name":null,"url":"https://drafts.csswg.org/cssom-view/","identifier":"CSSOM View Module"},"features":["CaretPosition.prototype.getClientRect","screen.availHeight","screen.availWidth","screen.colorDepth","screen.height","screen.left","screen.pixelDepth","screen.width","window.devicePixelRatio","window.innerHeight","window.innerWidth","window.matchMedia","window.moveBy","window.moveTo","window.outerHeight","window.outerWidth","window.pageXOffset","window.pageYOffset","window.resizeBy","window.resizeTo","window.screen","window.screenX","window.screenY","window.scroll","window.scrollBy","window.scrollTo","window.scrollX","window.scrollY"]},"DeviceOrientation Event Specification":{"info":{"name":"DeviceOrientation Event Specification","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/orientation-event/","identifier":"DeviceOrientation Event Specification"},"features":["DeviceMotionEvent.prototype.initDeviceMotionEvent","DeviceOrientationEvent.prototype.initDeviceOrientationEvent"]},"DOM Parsing and Serialization":{"info":{"name":"DOM Parsing and Serialization","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/DOM-Parsing/","identifier":"DOM Parsing and Serialization"},"features":["DOMParser.prototype.parseFromString","Element.prototype.insertAdjacentHTML","XMLSerializer.prototype.serializeToString"]},"DOM":{"info":{"name":"DOM","subsection_number":null,"subsection_name":null,"url":"https://dom.spec.whatwg.org/","identifier":"DOM"},"features":["CharacterData.prototype.appendData","CharacterData.prototype.deleteData","CharacterData.prototype.insertData","CharacterData.prototype.remove","CharacterData.prototype.replaceData","CharacterData.prototype.substringData","CustomEvent.prototype.initCustomEvent","document.characterSet","document.childElementCount","document.children","document.close","document.compatMode","document.contentType","document.firstElementChild","document.inputEncoding","document.lastElementChild","Document.prototype.createAttribute","Document.prototype.createElement","Document.prototype.createProcessingInstruction","Document.prototype.getElementsByClassName","document.scripts","DocumentFragment.prototype.getElementById","DocumentType.prototype.remove","DOMImplementation.prototype.createHTMLDocument","DOMTokenList.prototype.add","DOMTokenList.prototype.contains","DOMTokenList.prototype.item","DOMTokenList.prototype.remove","DOMTokenList.prototype.toggle","Element.prototype.closest","Element.prototype.getElementsByClassName","Element.prototype.matches","Element.prototype.mozMatchesSelector","Element.prototype.remove","window.clearInterval","window.clearTimeout"]},"DOM Level 1":{"info":{"name":"DOM Level 1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/REC-DOM-Level-1/","identifier":"DOM Level 1"},"features":["Document.prototype.getElementById","Document.prototype.getElementsByTagName","Element.prototype.getAttribute","Element.prototype.getAttributeNode","Element.prototype.getElementsByTagName","Element.prototype.removeAttribute","Element.prototype.removeAttributeNode","Element.prototype.setAttribute","Element.prototype.setAttributeNode","HTMLCollection.prototype.item","HTMLCollection.prototype.namedItem","HTMLDocument.prototype.close","HTMLDocument.prototype.open","HTMLDocument.prototype.write","HTMLDocument.prototype.writeln","HTMLElement.prototype.click","HTMLElement.prototype.focus","HTMLFormElement.prototype.reset","HTMLFormElement.prototype.submit","HTMLInputElement.prototype.select","HTMLSelectElement.prototype.add","HTMLSelectElement.prototype.item","HTMLSelectElement.prototype.namedItem","HTMLSelectElement.prototype.remove","HTMLTableElement.prototype.createCaption","HTMLTableElement.prototype.createTBody","HTMLTableElement.prototype.createTFoot","HTMLTableElement.prototype.createTHead","HTMLTableElement.prototype.deleteCaption","HTMLTableElement.prototype.deleteRow","HTMLTableElement.prototype.deleteTFoot","HTMLTableElement.prototype.deleteTHead","HTMLTableElement.prototype.insertRow","HTMLTableRowElement.prototype.deleteCell","HTMLTableRowElement.prototype.insertCell","HTMLTableSectionElement.prototype.deleteRow","HTMLTableSectionElement.prototype.insertRow","HTMLTextAreaElement.prototype.select","Node.prototype.appendChild","Node.prototype.cloneNode","Node.prototype.hasChildNodes","Node.prototype.insertBefore","Node.prototype.normalize","Node.prototype.removeChild","Node.prototype.replaceChild","NodeList.prototype.item","Text.prototype.splitText"]},"DOM Level 2: Core":{"info":{"name":"DOM Level 2: Core","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Core/","identifier":"DOM Level 2: Core"},"features":["document.doctype","document.documentElement","document.domain","document.implementation","Document.prototype.createAttributeNS","Document.prototype.createCDATASection","Document.prototype.createComment","Document.prototype.createDocumentFragment","Document.prototype.createElementNS","Document.prototype.createTextNode","Document.prototype.getElementsByTagNameNS","Document.prototype.importNode","DOMImplementation.prototype.createDocument","DOMImplementation.prototype.createDocumentType","DOMImplementation.prototype.hasFeature","Element.prototype.getAttributeNodeNS","Element.prototype.getAttributeNS","Element.prototype.getElementsByTagNameNS","Element.prototype.hasAttribute","Element.prototype.hasAttributeNS","Element.prototype.hasAttributes","Element.prototype.removeAttributeNS","Element.prototype.setAttributeNodeNS","Element.prototype.setAttributeNS","NamedNodeMap.prototype.getNamedItem","NamedNodeMap.prototype.getNamedItemNS","NamedNodeMap.prototype.item","NamedNodeMap.prototype.removeNamedItem","NamedNodeMap.prototype.removeNamedItemNS","NamedNodeMap.prototype.setNamedItem","NamedNodeMap.prototype.setNamedItemNS"]},"DOM Level 2: Events":{"info":{"name":"DOM Level 2: Events","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Events/","identifier":"DOM Level 2: Events"},"features":["Document.prototype.createEvent","Event.prototype.initEvent","Event.prototype.preventDefault","Event.prototype.stopPropagation","EventTarget.prototype.addEventListener","EventTarget.prototype.dispatchEvent","EventTarget.prototype.removeEventListener"]},"DOM Level 2: HTML":{"info":{"name":"DOM Level 2: HTML","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-HTML/","identifier":"DOM Level 2: HTML"},"features":["document.cookie","document.forms","document.getElementsByName","document.open","document.referrer","document.title","document.URL","document.write","document.writeln","HTMLDocument.prototype.getElementsByName","HTMLElement.prototype.blur"]},"DOM Level 2: Style":{"info":{"name":"DOM Level 2: Style","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Style/","identifier":"DOM Level 2: Style"},"features":["CSSPrimitiveValue.prototype.getCounterValue","CSSPrimitiveValue.prototype.getFloatValue","CSSPrimitiveValue.prototype.getRectValue","CSSPrimitiveValue.prototype.getRGBColorValue","CSSPrimitiveValue.prototype.getStringValue","CSSPrimitiveValue.prototype.setFloatValue","CSSPrimitiveValue.prototype.setStringValue","CSSRuleList.prototype.item","CSSStyleDeclaration.prototype.getPropertyCSSValue","CSSStyleDeclaration.prototype.getPropertyPriority","CSSStyleDeclaration.prototype.getPropertyValue","CSSStyleDeclaration.prototype.item","CSSStyleDeclaration.prototype.removeProperty","CSSStyleDeclaration.prototype.setProperty","CSSStyleSheet.prototype.deleteRule","CSSStyleSheet.prototype.insertRule","CSSValueList.prototype.item","document.styleSheets","window.getComputedStyle"]},"DOM Level 2: Traversal and Range":{"info":{"name":"DOM Level 2: Traversal and Range","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-2-Traversal-Range/","identifier":"DOM Level 2: Traversal and Range"},"features":["Document.prototype.createNodeIterator","Document.prototype.createRange","Document.prototype.createTreeWalker","NodeIterator.prototype.detach","NodeIterator.prototype.nextNode","NodeIterator.prototype.previousNode","Range.prototype.cloneContents","Range.prototype.cloneRange","Range.prototype.collapse","Range.prototype.compareBoundaryPoints","Range.prototype.comparePoint","Range.prototype.createContextualFragment","Range.prototype.deleteContents","Range.prototype.detach","Range.prototype.extractContents","Range.prototype.getBoundingClientRect","Range.prototype.getClientRects","Range.prototype.insertNode","Range.prototype.intersectsNode","Range.prototype.isPointInRange","Range.prototype.selectNode","Range.prototype.selectNodeContents","Range.prototype.setEnd","Range.prototype.setEndAfter","Range.prototype.setEndBefore","Range.prototype.setStart","Range.prototype.setStartAfter","Range.prototype.setStartBefore","Range.prototype.surroundContents","TreeWalker.prototype.firstChild","TreeWalker.prototype.lastChild","TreeWalker.prototype.nextNode","TreeWalker.prototype.nextSibling","TreeWalker.prototype.parentNode","TreeWalker.prototype.previousNode","TreeWalker.prototype.previousSibling"]},"DOM Level 3: Core":{"info":{"name":"DOM Level 3: Core","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-3-Core/","identifier":"DOM Level 3: Core"},"features":["document.documentURI","Document.prototype.adoptNode","DOMStringList.prototype.contains","DOMStringList.prototype.item","Node.prototype.compareDocumentPosition","Node.prototype.contains","Node.prototype.isDefaultNamespace","Node.prototype.isEqualNode","Node.prototype.lookupNamespaceURI","Node.prototype.lookupPrefix"]},"DOM Level 3: XPath":{"info":{"name":"DOM Level 3: XPath","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/DOM-Level-3-XPath/","identifier":"DOM Level 3: XPath"},"features":["Document.prototype.createExpression","Document.prototype.createNSResolver","Document.prototype.evaluate","XPathEvaluator.prototype.createExpression","XPathEvaluator.prototype.createNSResolver","XPathEvaluator.prototype.evaluate","XPathExpression.prototype.evaluate","XPathResult.prototype.iterateNext","XPathResult.prototype.snapshotItem"]},"W3C DOM4":{"info":{"name":"W3C DOM4","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/dom/","identifier":"W3C DOM4"},"features":["MutationObserver.prototype.disconnect","MutationObserver.prototype.observe","MutationObserver.prototype.takeRecords"]},"Directory Upload":{"info":{"name":"Directory Upload","subsection_number":null,"subsection_name":null,"url":"https://wicg.github.io/directory-upload/proposal.html","identifier":"Directory Upload"},"features":["Directory.prototype.getFilesAndDirectories"]},"Encoding":{"info":{"name":"Encoding","subsection_number":null,"subsection_name":null,"url":"https://encoding.spec.whatwg.org/","identifier":"Encoding"},"features":["TextDecoder.prototype.decode","TextEncoder.prototype.encode"]},"execCommand":{"info":{"name":"execCommand","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/editing/execCommand.html","identifier":"execCommand"},"features":["document.execCommand","document.queryCommandEnabled","document.queryCommandIndeterm","document.queryCommandState","document.queryCommandSupported","document.queryCommandValue","HTMLDocument.prototype.execCommand","HTMLDocument.prototype.queryCommandEnabled","HTMLDocument.prototype.queryCommandIndeterm","HTMLDocument.prototype.queryCommandState","HTMLDocument.prototype.queryCommandSupported","HTMLDocument.prototype.queryCommandValue"]},"Encrypted Media Extensions":{"info":{"name":"Encrypted Media Extensions","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/encrypted-media/","identifier":"Encrypted Media Extensions"},"features":["MediaKeys.prototype.createSession","MediaKeys.prototype.setServerCertificate","MediaKeySession.prototype.close","MediaKeySession.prototype.generateRequest","MediaKeySession.prototype.load","MediaKeySession.prototype.remove","MediaKeySession.prototype.update","MediaKeyStatusMap.prototype.entries","MediaKeyStatusMap.prototype.keys","MediaKeyStatusMap.prototype.values","MediaKeySystemAccess.prototype.createMediaKeys","MediaKeySystemAccess.prototype.getConfiguration","Navigator.prototype.requestMediaKeySystemAccess"]},"Fetch":{"info":{"name":"Fetch","subsection_number":null,"subsection_name":null,"url":"https://fetch.spec.whatwg.org/","identifier":"Fetch"},"features":["Headers.prototype.append","Headers.prototype.delete","Headers.prototype.get","Headers.prototype.getAll","Headers.prototype.has","Headers.prototype.set","Request.prototype.arrayBuffer","Request.prototype.blob","Request.prototype.clone","Request.prototype.formData","Request.prototype.json","Request.prototype.text","Response.error","Response.prototype.arrayBuffer","Response.prototype.blob","Response.prototype.clone","Response.prototype.formData","Response.prototype.json","Response.prototype.text","Response.redirect","window.fetch"]},"File API":{"info":{"name":"File API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/FileAPI/","identifier":"File API"},"features":["Blob.prototype.slice","FileList.prototype.item","FileReader.prototype.abort","FileReader.prototype.readAsArrayBuffer","FileReader.prototype.readAsBinaryString","FileReader.prototype.readAsDataURL","FileReader.prototype.readAsText","URL.createObjectURL","URL.revokeObjectURL"]},"Fullscreen API":{"info":{"name":"Fullscreen API","subsection_number":null,"subsection_name":null,"url":"https://fullscreen.spec.whatwg.org/","identifier":"Fullscreen API"},"features":["document.mozFullScreen","document.mozFullScreenElement","document.mozFullScreenEnabled","document.onmozfullscreenchange","document.onmozfullscreenerror","Document.prototype.mozCancelFullScreen","Element.prototype.mozRequestFullScreen","window.onmozfullscreenchange","window.onmozfullscreenerror"]},"Geolocation API":{"info":{"name":"Geolocation API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/geolocation-API/","identifier":"Geolocation API"},"features":["navigator.geolocation","navigator.geolocation.getCurrentPosition","navigator.geolocation.watchPosition","navigator.geolocation.clearWatch"]},"Geometry Interfaces Module Level 1":{"info":{"name":"Geometry Interfaces Module Level 1","subsection_number":null,"subsection_name":null,"url":"https://drafts.fxtf.org/geometry/","identifier":"Geometry Interfaces Module Level 1"},"features":["DOMMatrix.prototype.invertSelf","DOMMatrix.prototype.multiplySelf","DOMMatrix.prototype.preMultiplySelf","DOMMatrix.prototype.rotateAxisAngleSelf","DOMMatrix.prototype.rotateFromVectorSelf","DOMMatrix.prototype.rotateSelf","DOMMatrix.prototype.scale3dSelf","DOMMatrix.prototype.scaleNonUniformSelf","DOMMatrix.prototype.scaleSelf","DOMMatrix.prototype.setMatrixValue","DOMMatrix.prototype.skewXSelf","DOMMatrix.prototype.skewYSelf","DOMMatrix.prototype.translateSelf","DOMMatrixReadOnly.prototype.flipX","DOMMatrixReadOnly.prototype.flipY","DOMMatrixReadOnly.prototype.inverse","DOMMatrixReadOnly.prototype.multiply","DOMMatrixReadOnly.prototype.rotate","DOMMatrixReadOnly.prototype.rotateAxisAngle","DOMMatrixReadOnly.prototype.rotateFromVector","DOMMatrixReadOnly.prototype.scale","DOMMatrixReadOnly.prototype.scale3d","DOMMatrixReadOnly.prototype.scaleNonUniform","DOMMatrixReadOnly.prototype.skewX","DOMMatrixReadOnly.prototype.skewY","DOMMatrixReadOnly.prototype.toFloat32Array","DOMMatrixReadOnly.prototype.toFloat64Array","DOMMatrixReadOnly.prototype.transformPoint","DOMMatrixReadOnly.prototype.translate","DOMRectList.prototype.item"]},"Gamepad":{"info":{"name":"Gamepad","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/gamepad/","identifier":"Gamepad"},"features":["Navigator.prototype.getGamepads"]},"HTML: Broadcasting":{"info":{"name":"HTML","subsection_number":"9.6","subsection_name":"Broadcasting","url":"https://html.spec.whatwg.org/multipage/comms.html#dom-broadcastchannel-postmessage","identifier":"HTML: Broadcasting"},"features":["BroadcastChannel.prototype.close","BroadcastChannel.prototype.postMessage"]},"HTML: Canvas Element":{"info":{"name":"HTML","subsection_number":"4.12.4","subsection_name":"Canvas Element","url":"https://html.spec.whatwg.org/multipage/scripting.html#the-canvas-element","identifier":"HTML: Canvas Element"},"features":["CanvasGradient.prototype.addColorStop","CanvasPattern.prototype.setTransform","CanvasRenderingContext2D.prototype.arc","CanvasRenderingContext2D.prototype.arcTo","CanvasRenderingContext2D.prototype.beginPath","CanvasRenderingContext2D.prototype.bezierCurveTo","CanvasRenderingContext2D.prototype.clearRect","CanvasRenderingContext2D.prototype.clip","CanvasRenderingContext2D.prototype.closePath","CanvasRenderingContext2D.prototype.createImageData","CanvasRenderingContext2D.prototype.createLinearGradient","CanvasRenderingContext2D.prototype.createPattern","CanvasRenderingContext2D.prototype.createRadialGradient","CanvasRenderingContext2D.prototype.drawFocusIfNeeded","CanvasRenderingContext2D.prototype.drawImage","CanvasRenderingContext2D.prototype.fill","CanvasRenderingContext2D.prototype.fillRect","CanvasRenderingContext2D.prototype.fillText","CanvasRenderingContext2D.prototype.getImageData","CanvasRenderingContext2D.prototype.getLineDash","CanvasRenderingContext2D.prototype.isPointInPath","CanvasRenderingContext2D.prototype.isPointInStroke","CanvasRenderingContext2D.prototype.lineTo","CanvasRenderingContext2D.prototype.measureText","CanvasRenderingContext2D.prototype.moveTo","CanvasRenderingContext2D.prototype.putImageData","CanvasRenderingContext2D.prototype.quadraticCurveTo","CanvasRenderingContext2D.prototype.rect","CanvasRenderingContext2D.prototype.resetTransform","CanvasRenderingContext2D.prototype.restore","CanvasRenderingContext2D.prototype.rotate","CanvasRenderingContext2D.prototype.save","CanvasRenderingContext2D.prototype.scale","CanvasRenderingContext2D.prototype.setLineDash","CanvasRenderingContext2D.prototype.setTransform","CanvasRenderingContext2D.prototype.stroke","CanvasRenderingContext2D.prototype.strokeRect","CanvasRenderingContext2D.prototype.strokeText","CanvasRenderingContext2D.prototype.transform","CanvasRenderingContext2D.prototype.translate","HTMLCanvasElement.prototype.getContext","HTMLCanvasElement.prototype.mozGetAsFile","HTMLCanvasElement.prototype.toBlob","HTMLCanvasElement.prototype.toDataURL","Path2D.prototype.addPath","Path2D.prototype.arc","Path2D.prototype.arcTo","Path2D.prototype.bezierCurveTo","Path2D.prototype.closePath","Path2D.prototype.lineTo","Path2D.prototype.moveTo","Path2D.prototype.quadraticCurveTo","Path2D.prototype.rect","window.requestAnimationFrame"]},"HTML: Channel Messaging":{"info":{"name":"HTML","subsection_number":"9.5","subsection_name":"Channel Messaging","url":"https://html.spec.whatwg.org/multipage/comms.html#channel-messaging","identifier":"HTML: Channel Messaging"},"features":["MessagePort.prototype.close","MessagePort.prototype.postMessage","MessagePort.prototype.start","window.postMessage"]},"HTML: History Interface":{"info":{"name":"HTML","subsection_number":"7.5.2","subsection_name":"History Interface","url":"https://html.spec.whatwg.org/multipage/browsers.html#the-history-interface","identifier":"HTML: History Interface"},"features":["History.prototype.back","History.prototype.forward","History.prototype.go","History.prototype.pushState","History.prototype.replaceState","window.history"]},"HTML: Plugins":{"info":{"name":"HTML","subsection_number":"8.6.1.5","subsection_name":"Plugins","url":"https://html.spec.whatwg.org/multipage/webappapis.html#plugins-2","identifier":"HTML: Plugins"},"features":["document.plugins","MimeTypeArray.prototype.item","MimeTypeArray.prototype.namedItem","navigator.mimeTypes","navigator.plugins","Plugin.prototype.item","Plugin.prototype.namedItem","PluginArray.prototype.item","PluginArray.prototype.namedItem","PluginArray.prototype.refresh"]},"HTML: Web Storage":{"info":{"name":"HTML","subsection_number":"11","subsection_name":"Web Storage","url":"https://html.spec.whatwg.org/multipage/webstorage.html","identifier":"HTML: Web Storage"},"features":["Storage.prototype.clear","Storage.prototype.getItem","Storage.prototype.key","Storage.prototype.removeItem","Storage.prototype.setItem","StorageEvent.prototype.initStorageEvent","window.localStorage","window.sessionStorage"]},"HTML: Web Sockets":{"info":{"name":"HTML","subsection_number":"9.3","subsection_name":"Web Sockets","url":"https://html.spec.whatwg.org/multipage/comms.html#network","identifier":"HTML: Web Sockets"},"features":["WebSocket.prototype.close","WebSocket.prototype.send"]},"HTML: Web Workers":{"info":{"name":"HTML","subsection_number":"10","subsection_name":"Web Workers","url":"https://html.spec.whatwg.org/multipage/workers.html","identifier":"HTML: Web Workers"},"features":["Worker.prototype.postMessage","Worker.prototype.terminate"]},"High Resolution Time Level 2":{"info":{"name":"High Resolution Time Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/hr-time/","identifier":"High Resolution Time Level 2"},"features":["Performance.prototype.now"]},"HTML":{"info":{"name":"HTML","subsection_number":null,"subsection_name":null,"url":"https://html.spec.whatwg.org","identifier":"HTML"},"features":["DataTransfer.prototype.addElement","DataTransfer.prototype.clearData","DataTransfer.prototype.getData","DataTransfer.prototype.mozClearDataAt","DataTransfer.prototype.mozGetDataAt","DataTransfer.prototype.mozSetDataAt","DataTransfer.prototype.mozTypesAt","DataTransfer.prototype.setData","DataTransfer.prototype.setDragImage","document.activeElement","document.body","document.currentScript","document.designMode","document.dir","document.getItems","document.head","document.images","document.lastModified","document.lastStyleSheetSet","document.links","document.onabort","document.onblur","document.oncanplay","document.oncanplaythrough","document.onchange","document.onclick","document.oncontextmenu","document.oncopy","document.oncut","document.ondblclick","document.ondrag","document.ondragend","document.ondragenter","document.ondragleave","document.ondragover","document.ondragstart","document.ondrop","document.ondurationchange","document.onemptied","document.onended","document.onerror","document.onfocus","document.oninput","document.oninvalid","document.onkeydown","document.onkeypress","document.onkeyup","document.onload","document.onloadeddata","document.onloadedmetadata","document.onloadstart","document.onmousedown","document.onmouseenter","document.onmouseleave","document.onmousemove","document.onmouseout","document.onmouseover","document.onmouseup","document.onpaste","document.onpause","document.onplay","document.onplaying","document.onprogress","document.onratechange","document.onreadystatechange","document.onreset","document.onresize","document.onscroll","document.onseeked","document.onseeking","document.onselect","document.onshow","document.onstalled","document.onsubmit","document.onsuspend","document.ontimeupdate","document.onvolumechange","document.onwaiting","document.onwheel","Document.prototype.enableStyleSheetsForSet","Document.prototype.hasFocus","document.selectedStyleSheetSet","document.styleSheetSets","EventSource.prototype.close","HashChangeEvent.prototype.initHashChangeEvent","HTMLAllCollection.prototype.item","HTMLAllCollection.prototype.namedItem","HTMLDocument.prototype.clear","HTMLDocument.prototype.getItems","navigator.appCodeName","navigator.appName","navigator.appVersion","navigator.cookieEnabled","navigator.onLine","navigator.platform","navigator.product","navigator.productSub","Navigator.prototype.registerContentHandler","Navigator.prototype.registerProtocolHandler","navigator.userAgent","navigator.vendor","navigator.vendorSub","PropertyNodeList.prototype.getValues","TimeRanges.prototype.end","TimeRanges.prototype.start","window.blur","window.close","window.closed","window.console","window.createImageBitmap","window.document","window.focus","window.frameElement","window.frames","window.length","window.location","window.name","window.navigator","window.onabort","window.onafterprint","window.onbeforeprint","window.onbeforeunload","window.onblur","window.oncanplay","window.oncanplaythrough","window.onchange","window.onclick","window.oncontextmenu","window.ondblclick","window.ondrag","window.ondragend","window.ondragenter","window.ondragleave","window.ondragover","window.ondragstart","window.ondurationchange","window.onemptied","window.onended","window.onerror","window.onfocus","window.onhashchange","window.oninput","window.oninvalid","window.onkeydown","window.onkeypress","window.onkeyup","window.onlanguagechange","window.onloadeddata","window.onloadedmetadata","window.onloadstart","window.onmessage","window.onmousedown","window.onmouseenter","window.onmouseleave","window.onmousemove","window.onmouseout","window.onmouseover","window.onmouseup","window.onoffline","window.ononline","window.onpagehide","window.onpageshow","window.onpause","window.onplay","window.onplaying","window.onpopstate","window.onprogress","window.onratechange","window.onreset","window.onresize","window.onscroll","window.onseeked","window.onseeking","window.onselect","window.onshow","window.onstalled","window.onsubmit","window.onsuspend","window.ontimeupdate","window.onunload","window.onvolumechange","window.onwaiting","window.onwheel","window.open","window.opener","window.parent","window.self","window.setInterval","window.setResizable","window.setTimeout","window.showModalDialog","window.stop","window.top","window.window","XMLDocument.prototype.load"]},"HTML 5":{"info":{"name":"HTML 5","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/html5/","identifier":"HTML 5"},"features":["document.defaultView","document.location","document.onafterscriptexecute","document.onbeforescriptexecute","document.preferredStyleSheetSet","document.readyState","HTMLButtonElement.prototype.checkValidity","HTMLButtonElement.prototype.setCustomValidity","HTMLFieldSetElement.prototype.checkValidity","HTMLFieldSetElement.prototype.setCustomValidity","HTMLFormControlsCollection.prototype.item","HTMLFormElement.prototype.checkValidity","HTMLInputElement.prototype.checkValidity","HTMLInputElement.prototype.setCustomValidity","HTMLInputElement.prototype.setRangeText","HTMLInputElement.prototype.setSelectionRange","HTMLInputElement.prototype.stepDown","HTMLInputElement.prototype.stepUp","HTMLMediaElement.prototype.addTextTrack","HTMLMediaElement.prototype.canPlayType","HTMLMediaElement.prototype.fastSeek","HTMLMediaElement.prototype.load","HTMLMediaElement.prototype.mozCaptureStream","HTMLMediaElement.prototype.mozCaptureStreamUntilEnded","HTMLMediaElement.prototype.mozGetMetadata","HTMLMediaElement.prototype.pause","HTMLMediaElement.prototype.play","HTMLMediaElement.prototype.setMediaKeys","HTMLObjectElement.prototype.checkValidity","HTMLObjectElement.prototype.setCustomValidity","HTMLOptionsCollection.prototype.add","HTMLOptionsCollection.prototype.remove","HTMLOutputElement.prototype.checkValidity","HTMLOutputElement.prototype.setCustomValidity","HTMLSelectElement.prototype.checkValidity","HTMLSelectElement.prototype.setCustomValidity","HTMLTextAreaElement.prototype.checkValidity","HTMLTextAreaElement.prototype.setCustomValidity","HTMLTextAreaElement.prototype.setRangeText","HTMLTextAreaElement.prototype.setSelectionRange","location.assign","location.reload","location.replace","OfflineResourceList.prototype.mozAdd","OfflineResourceList.prototype.mozHasItem","OfflineResourceList.prototype.mozItem","OfflineResourceList.prototype.mozRemove","OfflineResourceList.prototype.swapCache","OfflineResourceList.prototype.update","TextTrack.prototype.addCue","TextTrack.prototype.removeCue","TextTrackCueList.prototype.getCueById","TextTrackList.prototype.getTrackById","TimeEvent.prototype.initTimeEvent","window.alert","window.applicationCache","window.atob","window.btoa","window.confirm","window.locationbar","window.menubar","window.personalbar","window.print","window.prompt","window.scrollbars","window.status","window.statusbar","window.toolbar","location.href"]},"HTML 5.1":{"info":{"name":"HTML 5.1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/html51/","identifier":"HTML 5.1"},"features":["DragEvent.prototype.initDragEvent","External.prototype.addSearchEngine","External.prototype.AddSearchProvider","External.prototype.IsSearchProviderInstalled","navigator.language","navigator.languages"]},"Indexed Database API":{"info":{"name":"Indexed Database API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/IndexedDB/","identifier":"Indexed Database API"},"features":["IDBCursor.prototype.advance","IDBCursor.prototype.continue","IDBCursor.prototype.delete","IDBCursor.prototype.update","IDBDatabase.prototype.close","IDBDatabase.prototype.createMutableFile","IDBDatabase.prototype.createObjectStore","IDBDatabase.prototype.deleteObjectStore","IDBDatabase.prototype.mozCreateFileHandle","IDBDatabase.prototype.transaction","IDBFactory.prototype.cmp","IDBFactory.prototype.deleteDatabase","IDBFactory.prototype.open","IDBFileHandle.prototype.abort","IDBFileHandle.prototype.append","IDBFileHandle.prototype.flush","IDBFileHandle.prototype.getMetadata","IDBFileHandle.prototype.readAsArrayBuffer","IDBFileHandle.prototype.readAsText","IDBFileHandle.prototype.truncate","IDBFileHandle.prototype.write","IDBIndex.prototype.count","IDBIndex.prototype.get","IDBIndex.prototype.getKey","IDBIndex.prototype.mozGetAll","IDBIndex.prototype.mozGetAllKeys","IDBIndex.prototype.openCursor","IDBIndex.prototype.openKeyCursor","IDBKeyRange.bound","IDBKeyRange.lowerBound","IDBKeyRange.only","IDBKeyRange.upperBound","IDBMutableFile.prototype.getFile","IDBMutableFile.prototype.open","IDBObjectStore.prototype.add","IDBObjectStore.prototype.clear","IDBObjectStore.prototype.count","IDBObjectStore.prototype.createIndex","IDBObjectStore.prototype.delete","IDBObjectStore.prototype.deleteIndex","IDBObjectStore.prototype.get","IDBObjectStore.prototype.index","IDBObjectStore.prototype.mozGetAll","IDBObjectStore.prototype.openCursor","IDBObjectStore.prototype.put","IDBTransaction.prototype.abort","IDBTransaction.prototype.objectStore","window.indexedDB"]},"Media Capture from DOM Elements":{"info":{"name":"Media Capture from DOM Elements","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/mediacapture-fromelement/","identifier":"Media Capture from DOM Elements"},"features":["CanvasCaptureMediaStream.prototype.requestFrame","HTMLCanvasElement.prototype.captureStream"]},"Media Capture and Streams":{"info":{"name":"Media Capture and Streams","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/mediacapture-streams/","identifier":"Media Capture and Streams"},"features":["LocalMediaStream.prototype.stop","MediaDevices.prototype.enumerateDevices","MediaDevices.prototype.getUserMedia","navigator.mediaDevices"]},"Media Source Extensions":{"info":{"name":"Media Source Extensions","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/media-source/","identifier":"Media Source Extensions"},"features":["HTMLVideoElement.prototype.getVideoPlaybackQuality","MediaSource.isTypeSupported","MediaSource.prototype.addSourceBuffer","MediaSource.prototype.endOfStream","MediaSource.prototype.removeSourceBuffer","SourceBuffer.prototype.abort","SourceBuffer.prototype.appendBuffer","SourceBuffer.prototype.remove"]},"MediaStream Recording":{"info":{"name":"MediaStream Recording","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/mediastream-recording/","identifier":"MediaStream Recording"},"features":["MediaRecorder.prototype.pause","MediaRecorder.prototype.requestData","MediaRecorder.prototype.resume","MediaRecorder.prototype.start","MediaRecorder.prototype.stop","MediaStream.prototype.getAudioTracks","MediaStream.prototype.getTracks","MediaStream.prototype.getVideoTracks","MediaStreamTrack.prototype.applyConstraints","MediaStreamTrack.prototype.stop"]},"Non-Standard":{"info":{"name":"Non-Standard","subsection_number":null,"subsection_name":null,"url":null,"identifier":"Non-Standard"},"features":["AnonymousContent.prototype.getAttributeForElement","AnonymousContent.prototype.getTextContentForElement","AnonymousContent.prototype.removeAttributeForElement","AnonymousContent.prototype.setAttributeForElement","AnonymousContent.prototype.setTextContentForElement","CommandEvent.prototype.initCommandEvent","document.embeds","Document.prototype.mozSetImageElement","Document.prototype.releaseCapture","DOMCursor.prototype.continue","DOMRequest.prototype.then","Element.prototype.releaseCapture","Element.prototype.setCapture","Event.prototype.getPreventDefault","HTMLDocument.prototype.captureEvents","HTMLDocument.prototype.releaseEvents","HTMLInputElement.prototype.mozIsTextField","HTMLPropertiesCollection.prototype.item","HTMLPropertiesCollection.prototype.namedItem","window.captureEvents","MouseEvent.prototype.initNSMouseEvent","MouseScrollEvent.prototype.initMouseScrollEvent","mozContact.prototype.init","MozPowerManager.prototype.addWakeLockListener","MozPowerManager.prototype.factoryReset","MozPowerManager.prototype.getWakeLockState","MozPowerManager.prototype.powerOff","MozPowerManager.prototype.reboot","MozPowerManager.prototype.removeWakeLockListener","navigator.buildID","navigator.oscpu","Navigator.prototype.javaEnabled","PaintRequestList.prototype.item","screen.availLeft","screen.availTop","screen.top","ScrollAreaEvent.prototype.initScrollAreaEvent","SimpleGestureEvent.prototype.initSimpleGestureEvent","window.content","window.controllers","window.dump","window.external","window.find","window.fullScreen","window.getDefaultComputedStyle","window.mozInnerScreenX","window.mozInnerScreenY","window.mozPaintCount","window.ondrop","window.releaseEvents","window.scrollByLines","window.scrollByPages","window.scrollMaxX","window.scrollMaxY","window.sidebar","window.sizeToContent","window.updateCommands","XSLTProcessor.prototype.clearParameters","XSLTProcessor.prototype.getParameter","XSLTProcessor.prototype.importStylesheet","XSLTProcessor.prototype.removeParameter","XSLTProcessor.prototype.reset","XSLTProcessor.prototype.setParameter","XSLTProcessor.prototype.transformToDocument","XSLTProcessor.prototype.transformToFragment"]},"Navigation Timing":{"info":{"name":"Navigation Timing","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/navigation-timing/","identifier":"Navigation Timing"},"features":["performance.navigation","performance.navigation.redirectCount","performance.navigation.type","performance.timing","performance.timing.connectEnd","performance.timing.connectStart","performance.timing.domainLookupEnd","performance.timing.domainLookupStart","performance.timing.domComplete","performance.timing.domContentLoadedEventEnd","performance.timing.domContentLoadedEventStart","performance.timing.domInteractive","performance.timing.domLoading","performance.timing.fetchStart","performance.timing.loadEventEnd","performance.timing.loadEventStart","performance.timing.navigationStart","performance.timing.redirectEnd","performance.timing.redirectStart","performance.timing.requestStart","performance.timing.responseEnd","performance.timing.responseStart","performance.timing.unloadEventEnd","performance.timing.unloadEventStart","window.performance"]},"Proximity Events":{"info":{"name":"Proximity Events","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/proximity/","identifier":"Proximity Events"},"features":["window.ondeviceproximity","window.onuserproximity"]},"Pointer Lock":{"info":{"name":"Pointer Lock","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/pointerlock/","identifier":"Pointer Lock"},"features":["document.mozPointerLockElement","document.onmozpointerlockchange","document.onmozpointerlockerror","Document.prototype.mozExitPointerLock","Element.prototype.mozRequestPointerLock","window.onmozpointerlockchange","window.onmozpointerlockerror"]},"Performance Timeline":{"info":{"name":"Performance Timeline","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/performance-timeline","identifier":"Performance Timeline"},"features":["Performance.prototype.getEntriesByName","Performance.prototype.getEntriesByType"]},"Performance Timeline Level 2":{"info":{"name":"Performance Timeline Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/performance-timeline","identifier":"Performance Timeline Level 2"},"features":["Performance.prototype.getEntries"]},"Page Visibility (Second Edition)":{"info":{"name":"Page Visibility (Second Edition)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/page-visibility/","identifier":"Page Visibility (Second Edition)"},"features":["document.hidden","document.mozHidden","document.mozVisibilityState","document.visibilityState"]},"Resource Timing":{"info":{"name":"Resource Timing","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/resource-timing/","identifier":"Resource Timing"},"features":["performance.onresourcetimingbufferfull","Performance.prototype.clearResourceTimings","Performance.prototype.setResourceTimingBufferSize"]},"Shadow DOM":{"info":{"name":"Shadow DOM","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/shadow-dom/","identifier":"Shadow DOM"},"features":["HTMLContentElement.prototype.getDistributedNodes"]},"Selection API":{"info":{"name":"Selection API","subsection_number":null,"subsection_name":null,"url":"http://w3c.github.io/selection-api/","identifier":"Selection API"},"features":["HTMLDocument.prototype.getSelection","Selection.prototype.addRange","Selection.prototype.collapse","Selection.prototype.collapseToEnd","Selection.prototype.collapseToStart","Selection.prototype.containsNode","Selection.prototype.deleteFromDocument","Selection.prototype.extend","Selection.prototype.getRangeAt","Selection.prototype.modify","Selection.prototype.removeAllRanges","Selection.prototype.removeRange","Selection.prototype.selectAllChildren","window.getSelection"]},"Selectors API Level 1":{"info":{"name":"Selectors API Level 1","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/selectors-api","identifier":"Selectors API Level 1"},"features":["Document.prototype.querySelector","Document.prototype.querySelectorAll","DocumentFragment.prototype.querySelector","DocumentFragment.prototype.querySelectorAll","Element.prototype.querySelector","Element.prototype.querySelectorAll"]},"Screen Orientation API":{"info":{"name":"Screen Orientation API","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/screen-orientation/","identifier":"Screen Orientation API"},"features":["screen.mozOrientation","screen.onmozorientationchange","screen.orientation","Screen.prototype.mozLockOrientation","Screen.prototype.mozUnlockOrientation","ScreenOrientation.prototype.lock","ScreenOrientation.prototype.unlock","window.ondevicemotion","window.ondeviceorientation"]},"Scalable Vector Graphics (SVG) 1.1 (Second Edition)":{"info":{"name":"Scalable Vector Graphics (SVG) 1.1 (Second Edition)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/SVG/","identifier":"Scalable Vector Graphics (SVG) 1.1 (Second Edition)"},"features":["HTMLEmbedElement.prototype.getSVGDocument","HTMLIFrameElement.prototype.getSVGDocument","HTMLObjectElement.prototype.getSVGDocument","SVGAngle.prototype.convertToSpecifiedUnits","SVGAngle.prototype.newValueSpecifiedUnits","SVGAnimationElement.prototype.beginElement","SVGAnimationElement.prototype.beginElementAt","SVGAnimationElement.prototype.endElement","SVGAnimationElement.prototype.endElementAt","SVGAnimationElement.prototype.getCurrentTime","SVGAnimationElement.prototype.getSimpleDuration","SVGAnimationElement.prototype.getStartTime","SVGAnimationElement.prototype.hasExtension","SVGFEDropShadowElement.prototype.setStdDeviation","SVGFEGaussianBlurElement.prototype.setStdDeviation","SVGFilterElement.apply","SVGGraphicsElement.prototype.getBBox","SVGGraphicsElement.prototype.getCTM","SVGGraphicsElement.prototype.getScreenCTM","SVGGraphicsElement.prototype.getTransformToElement","SVGGraphicsElement.prototype.hasExtension","SVGLength.prototype.convertToSpecifiedUnits","SVGLength.prototype.newValueSpecifiedUnits","SVGLengthList.prototype.appendItem","SVGLengthList.prototype.clear","SVGLengthList.prototype.getItem","SVGLengthList.prototype.initialize","SVGLengthList.prototype.insertItemBefore","SVGLengthList.prototype.removeItem","SVGLengthList.prototype.replaceItem","SVGMarkerElement.prototype.setOrientToAngle","SVGMarkerElement.prototype.setOrientToAuto","SVGMatrix.prototype.flipX","SVGMatrix.prototype.flipY","SVGMatrix.prototype.inverse","SVGMatrix.prototype.multiply","SVGMatrix.prototype.rotate","SVGMatrix.prototype.rotateFromVector","SVGMatrix.prototype.scale","SVGMatrix.prototype.scaleNonUniform","SVGMatrix.prototype.skewX","SVGMatrix.prototype.skewY","SVGMatrix.prototype.translate","SVGNumberList.prototype.appendItem","SVGNumberList.prototype.clear","SVGNumberList.prototype.getItem","SVGNumberList.prototype.initialize","SVGNumberList.prototype.insertItemBefore","SVGNumberList.prototype.removeItem","SVGNumberList.prototype.replaceItem","SVGPathElement.prototype.createSVGPathSegArcAbs","SVGPathElement.prototype.createSVGPathSegArcRel","SVGPathElement.prototype.createSVGPathSegClosePath","SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs","SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel","SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs","SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs","SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel","SVGPathElement.prototype.createSVGPathSegLinetoAbs","SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs","SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel","SVGPathElement.prototype.createSVGPathSegLinetoRel","SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs","SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel","SVGPathElement.prototype.createSVGPathSegMovetoAbs","SVGPathElement.prototype.createSVGPathSegMovetoRel","SVGPathElement.prototype.getPathSegAtLength","SVGPathElement.prototype.getPointAtLength","SVGPathElement.prototype.getTotalLength","SVGPathSegList.prototype.appendItem","SVGPathSegList.prototype.clear","SVGPathSegList.prototype.getItem","SVGPathSegList.prototype.initialize","SVGPathSegList.prototype.insertItemBefore","SVGPathSegList.prototype.removeItem","SVGPathSegList.prototype.replaceItem","SVGPoint.prototype.matrixTransform","SVGPointList.prototype.appendItem","SVGPointList.prototype.clear","SVGPointList.prototype.getItem","SVGPointList.prototype.initialize","SVGPointList.prototype.insertItemBefore","SVGPointList.prototype.removeItem","SVGPointList.prototype.replaceItem","SVGStringList.prototype.appendItem","SVGStringList.prototype.clear","SVGStringList.prototype.getItem","SVGStringList.prototype.initialize","SVGStringList.prototype.insertItemBefore","SVGStringList.prototype.removeItem","SVGStringList.prototype.replaceItem","SVGSVGElement.prototype.animationsPaused","SVGSVGElement.prototype.createSVGAngle","SVGSVGElement.prototype.createSVGLength","SVGSVGElement.prototype.createSVGMatrix","SVGSVGElement.prototype.createSVGNumber","SVGSVGElement.prototype.createSVGPoint","SVGSVGElement.prototype.createSVGRect","SVGSVGElement.prototype.createSVGTransform","SVGSVGElement.prototype.createSVGTransformFromMatrix","SVGSVGElement.prototype.deselectAll","SVGSVGElement.prototype.forceRedraw","SVGSVGElement.prototype.getCurrentTime","SVGSVGElement.prototype.getElementById","SVGSVGElement.prototype.pauseAnimations","SVGSVGElement.prototype.setCurrentTime","SVGSVGElement.prototype.suspendRedraw","SVGSVGElement.prototype.unpauseAnimations","SVGSVGElement.prototype.unsuspendRedraw","SVGSVGElement.prototype.unsuspendRedrawAll","SVGSymbolElement.prototype.hasExtension","SVGTextContentElement.prototype.getCharNumAtPosition","SVGTextContentElement.prototype.getComputedTextLength","SVGTextContentElement.prototype.getEndPositionOfChar","SVGTextContentElement.prototype.getExtentOfChar","SVGTextContentElement.prototype.getNumberOfChars","SVGTextContentElement.prototype.getRotationOfChar","SVGTextContentElement.prototype.getStartPositionOfChar","SVGTextContentElement.prototype.getSubStringLength","SVGTextContentElement.prototype.selectSubString","SVGTransform.prototype.setMatrix","SVGTransform.prototype.setRotate","SVGTransform.prototype.setScale","SVGTransform.prototype.setSkewX","SVGTransform.prototype.setSkewY","SVGTransform.prototype.setTranslate","SVGTransformList.prototype.appendItem","SVGTransformList.prototype.clear","SVGTransformList.prototype.consolidate","SVGTransformList.prototype.createSVGTransformFromMatrix","SVGTransformList.prototype.getItem","SVGTransformList.prototype.initialize","SVGTransformList.prototype.insertItemBefore","SVGTransformList.prototype.removeItem","SVGTransformList.prototype.replaceItem"]},"Service Workers":{"info":{"name":"Service Workers","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/service-workers/","identifier":"Service Workers"},"features":["Cache.prototype.add","Cache.prototype.addAll","Cache.prototype.delete","Cache.prototype.keys","Cache.prototype.match","Cache.prototype.matchAll","Cache.prototype.put","CacheStorage.prototype.delete","CacheStorage.prototype.has","CacheStorage.prototype.keys","CacheStorage.prototype.match","CacheStorage.prototype.open","window.caches"]},"Timing Control for Script-Based Animations":{"info":{"name":"Timing Control for Script-Based Animations","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/animation-timing","identifier":"Timing Control for Script-Based Animations"},"features":["window.cancelAnimationFrame"]},"Tracking Preference Expression (DNT)":{"info":{"name":"Tracking Preference Expression (DNT)","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/tracking-dnt/","identifier":"Tracking Preference Expression (DNT)"},"features":["navigator.doNotTrack"]},"UI Events Specification":{"info":{"name":"UI Events Specification","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/uievents/","identifier":"UI Events Specification"},"features":["CompositionEvent.prototype.initCompositionEvent","Event.prototype.stopImmediatePropagation","KeyboardEvent.prototype.getModifierState","KeyboardEvent.prototype.initKeyEvent","MouseEvent.prototype.getModifierState","MouseEvent.prototype.initMouseEvent","MutationEvent.prototype.initMutationEvent","UIEvent.prototype.initUIEvent"]},"URL":{"info":{"name":"URL","subsection_number":null,"subsection_name":null,"url":"https://url.spec.whatwg.org/","identifier":"URL"},"features":["URLSearchParams.prototype.append","URLSearchParams.prototype.delete","URLSearchParams.prototype.get","URLSearchParams.prototype.getAll","URLSearchParams.prototype.has","URLSearchParams.prototype.set"]},"User Timing Level 2":{"info":{"name":"User Timing Level 2","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/user-timing/","identifier":"User Timing Level 2"},"features":["Performance.prototype.clearMarks","Performance.prototype.clearMeasures","Performance.prototype.mark","Performance.prototype.measure"]},"Vibration API":{"info":{"name":"Vibration API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/vibration/","identifier":"Vibration API"},"features":["Navigator.prototype.vibrate"]},"Web Cryptography API":{"info":{"name":"Web Cryptography API","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/WebCryptoAPI/","identifier":"Web Cryptography API"},"features":["Crypto.prototype.getRandomValues","SubtleCrypto.prototype.decrypt","SubtleCrypto.prototype.deriveBits","SubtleCrypto.prototype.deriveKey","SubtleCrypto.prototype.digest","SubtleCrypto.prototype.encrypt","SubtleCrypto.prototype.exportKey","SubtleCrypto.prototype.generateKey","SubtleCrypto.prototype.importKey","SubtleCrypto.prototype.sign","SubtleCrypto.prototype.unwrapKey","SubtleCrypto.prototype.verify","SubtleCrypto.prototype.wrapKey","window.crypto"]},"Web Audio API":{"info":{"name":"Web Audio API","subsection_number":null,"subsection_name":null,"url":"https://webaudio.github.io/web-audio-api","identifier":"Web Audio API"},"features":["AnalyserNode.prototype.getByteFrequencyData","AnalyserNode.prototype.getByteTimeDomainData","AnalyserNode.prototype.getFloatFrequencyData","AnalyserNode.prototype.getFloatTimeDomainData","AudioBuffer.prototype.copyFromChannel","AudioBuffer.prototype.copyToChannel","AudioBuffer.prototype.getChannelData","AudioBufferSourceNode.prototype.start","AudioBufferSourceNode.prototype.stop","AudioContext.prototype.close","AudioContext.prototype.createAnalyser","AudioContext.prototype.createBiquadFilter","AudioContext.prototype.createBuffer","AudioContext.prototype.createBufferSource","AudioContext.prototype.createChannelMerger","AudioContext.prototype.createChannelSplitter","AudioContext.prototype.createConvolver","AudioContext.prototype.createDelay","AudioContext.prototype.createDynamicsCompressor","AudioContext.prototype.createGain","AudioContext.prototype.createMediaElementSource","AudioContext.prototype.createMediaStreamDestination","AudioContext.prototype.createMediaStreamSource","AudioContext.prototype.createOscillator","AudioContext.prototype.createPanner","AudioContext.prototype.createPeriodicWave","AudioContext.prototype.createScriptProcessor","AudioContext.prototype.createStereoPanner","AudioContext.prototype.createWaveShaper","AudioContext.prototype.decodeAudioData","AudioContext.prototype.resume","AudioContext.prototype.suspend","AudioListener.prototype.setOrientation","AudioListener.prototype.setPosition","AudioListener.prototype.setVelocity","AudioNode.prototype.connect","AudioNode.prototype.disconnect","AudioParam.prototype.cancelScheduledValues","AudioParam.prototype.exponentialRampToValueAtTime","AudioParam.prototype.linearRampToValueAtTime","AudioParam.prototype.setValueAtTime","AudioParam.prototype.setValueCurveAtTime","BiquadFilterNode.prototype.getFrequencyResponse","OfflineAudioContext.prototype.resume","OfflineAudioContext.prototype.startRendering","OfflineAudioContext.prototype.suspend","OscillatorNode.prototype.setPeriodicWave","OscillatorNode.prototype.start","OscillatorNode.prototype.stop","PannerNode.prototype.setOrientation","PannerNode.prototype.setPosition","PannerNode.prototype.setVelocity"]},"WebGL Specification":{"info":{"name":"WebGL Specification","subsection_number":null,"subsection_name":null,"url":"https://www.khronos.org/registry/webgl/specs/latest/1.0/","identifier":"WebGL Specification"},"features":["WebGLRenderingContext.prototype.activeTexture","WebGLRenderingContext.prototype.attachShader","WebGLRenderingContext.prototype.bindAttribLocation","WebGLRenderingContext.prototype.bindBuffer","WebGLRenderingContext.prototype.bindFramebuffer","WebGLRenderingContext.prototype.bindRenderbuffer","WebGLRenderingContext.prototype.bindTexture","WebGLRenderingContext.prototype.blendColor","WebGLRenderingContext.prototype.blendEquation","WebGLRenderingContext.prototype.blendEquationSeparate","WebGLRenderingContext.prototype.blendFunc","WebGLRenderingContext.prototype.blendFuncSeparate","WebGLRenderingContext.prototype.bufferData","WebGLRenderingContext.prototype.bufferSubData","WebGLRenderingContext.prototype.checkFramebufferStatus","WebGLRenderingContext.prototype.clear","WebGLRenderingContext.prototype.clearColor","WebGLRenderingContext.prototype.clearDepth","WebGLRenderingContext.prototype.clearStencil","WebGLRenderingContext.prototype.colorMask","WebGLRenderingContext.prototype.compileShader","WebGLRenderingContext.prototype.compressedTexImage2D","WebGLRenderingContext.prototype.compressedTexSubImage2D","WebGLRenderingContext.prototype.copyTexImage2D","WebGLRenderingContext.prototype.copyTexSubImage2D","WebGLRenderingContext.prototype.createBuffer","WebGLRenderingContext.prototype.createFramebuffer","WebGLRenderingContext.prototype.createProgram","WebGLRenderingContext.prototype.createRenderbuffer","WebGLRenderingContext.prototype.createShader","WebGLRenderingContext.prototype.createTexture","WebGLRenderingContext.prototype.cullFace","WebGLRenderingContext.prototype.deleteBuffer","WebGLRenderingContext.prototype.deleteFramebuffer","WebGLRenderingContext.prototype.deleteProgram","WebGLRenderingContext.prototype.deleteRenderbuffer","WebGLRenderingContext.prototype.deleteShader","WebGLRenderingContext.prototype.deleteTexture","WebGLRenderingContext.prototype.depthFunc","WebGLRenderingContext.prototype.depthMask","WebGLRenderingContext.prototype.depthRange","WebGLRenderingContext.prototype.detachShader","WebGLRenderingContext.prototype.disable","WebGLRenderingContext.prototype.disableVertexAttribArray","WebGLRenderingContext.prototype.drawArrays","WebGLRenderingContext.prototype.drawElements","WebGLRenderingContext.prototype.enable","WebGLRenderingContext.prototype.enableVertexAttribArray","WebGLRenderingContext.prototype.finish","WebGLRenderingContext.prototype.flush","WebGLRenderingContext.prototype.framebufferRenderbuffer","WebGLRenderingContext.prototype.framebufferTexture2D","WebGLRenderingContext.prototype.frontFace","WebGLRenderingContext.prototype.generateMipmap","WebGLRenderingContext.prototype.getActiveAttrib","WebGLRenderingContext.prototype.getActiveUniform","WebGLRenderingContext.prototype.getAttachedShaders","WebGLRenderingContext.prototype.getAttribLocation","WebGLRenderingContext.prototype.getBufferParameter","WebGLRenderingContext.prototype.getContextAttributes","WebGLRenderingContext.prototype.getError","WebGLRenderingContext.prototype.getExtension","WebGLRenderingContext.prototype.getFramebufferAttachmentParameter","WebGLRenderingContext.prototype.getParameter","WebGLRenderingContext.prototype.getProgramInfoLog","WebGLRenderingContext.prototype.getProgramParameter","WebGLRenderingContext.prototype.getRenderbufferParameter","WebGLRenderingContext.prototype.getShaderInfoLog","WebGLRenderingContext.prototype.getShaderParameter","WebGLRenderingContext.prototype.getShaderPrecisionFormat","WebGLRenderingContext.prototype.getShaderSource","WebGLRenderingContext.prototype.getSupportedExtensions","WebGLRenderingContext.prototype.getTexParameter","WebGLRenderingContext.prototype.getUniform","WebGLRenderingContext.prototype.getUniformLocation","WebGLRenderingContext.prototype.getVertexAttrib","WebGLRenderingContext.prototype.getVertexAttribOffset","WebGLRenderingContext.prototype.hint","WebGLRenderingContext.prototype.isBuffer","WebGLRenderingContext.prototype.isContextLost","WebGLRenderingContext.prototype.isEnabled","WebGLRenderingContext.prototype.isFramebuffer","WebGLRenderingContext.prototype.isProgram","WebGLRenderingContext.prototype.isRenderbuffer","WebGLRenderingContext.prototype.isShader","WebGLRenderingContext.prototype.isTexture","WebGLRenderingContext.prototype.lineWidth","WebGLRenderingContext.prototype.linkProgram","WebGLRenderingContext.prototype.pixelStorei","WebGLRenderingContext.prototype.polygonOffset","WebGLRenderingContext.prototype.readPixels","WebGLRenderingContext.prototype.renderbufferStorage","WebGLRenderingContext.prototype.sampleCoverage","WebGLRenderingContext.prototype.scissor","WebGLRenderingContext.prototype.shaderSource","WebGLRenderingContext.prototype.stencilFunc","WebGLRenderingContext.prototype.stencilFuncSeparate","WebGLRenderingContext.prototype.stencilMask","WebGLRenderingContext.prototype.stencilMaskSeparate","WebGLRenderingContext.prototype.stencilOp","WebGLRenderingContext.prototype.stencilOpSeparate","WebGLRenderingContext.prototype.texImage2D","WebGLRenderingContext.prototype.texParameterf","WebGLRenderingContext.prototype.texParameteri","WebGLRenderingContext.prototype.texSubImage2D","WebGLRenderingContext.prototype.uniform1f","WebGLRenderingContext.prototype.uniform1fv","WebGLRenderingContext.prototype.uniform1i","WebGLRenderingContext.prototype.uniform1iv","WebGLRenderingContext.prototype.uniform2f","WebGLRenderingContext.prototype.uniform2fv","WebGLRenderingContext.prototype.uniform2i","WebGLRenderingContext.prototype.uniform2iv","WebGLRenderingContext.prototype.uniform3f","WebGLRenderingContext.prototype.uniform3fv","WebGLRenderingContext.prototype.uniform3i","WebGLRenderingContext.prototype.uniform3iv","WebGLRenderingContext.prototype.uniform4f","WebGLRenderingContext.prototype.uniform4fv","WebGLRenderingContext.prototype.uniform4i","WebGLRenderingContext.prototype.uniform4iv","WebGLRenderingContext.prototype.uniformMatrix2fv","WebGLRenderingContext.prototype.uniformMatrix3fv","WebGLRenderingContext.prototype.uniformMatrix4fv","WebGLRenderingContext.prototype.useProgram","WebGLRenderingContext.prototype.validateProgram","WebGLRenderingContext.prototype.vertexAttrib1f","WebGLRenderingContext.prototype.vertexAttrib1fv","WebGLRenderingContext.prototype.vertexAttrib2f","WebGLRenderingContext.prototype.vertexAttrib2fv","WebGLRenderingContext.prototype.vertexAttrib3f","WebGLRenderingContext.prototype.vertexAttrib3fv","WebGLRenderingContext.prototype.vertexAttrib4f","WebGLRenderingContext.prototype.vertexAttrib4fv","WebGLRenderingContext.prototype.vertexAttribPointer","WebGLRenderingContext.prototype.viewport"]},"WebVTT: The Web Video Text Tracks Format":{"info":{"name":"WebVTT: The Web Video Text Tracks Format","subsection_number":null,"subsection_name":null,"url":"https://w3c.github.io/webvtt/","identifier":"WebVTT: The Web Video Text Tracks Format"},"features":["VTTCue.prototype.getCueAsHTML"]},"Web Notifications":{"info":{"name":"Web Notifications","subsection_number":null,"subsection_name":null,"url":"https://notifications.spec.whatwg.org/","identifier":"Web Notifications"},"features":["DesktopNotification.prototype.show","DesktopNotificationCenter.prototype.createNotification","Notification.get","Notification.prototype.close","Notification.requestPermission"]},"WebRTC 1.0: Real-time Communication Between Browser":{"info":{"name":"WebRTC 1.0: Real-time Communication Between Browser","subsection_number":null,"subsection_name":null,"url":"https://www.w3.org/TR/webrtc/","identifier":"WebRTC 1.0: Real-time Communication Between Browser"},"features":["DataChannel.prototype.close","DataChannel.prototype.send","mozRTCPeerConnection.generateCertificate","mozRTCPeerConnection.prototype.addIceCandidate","mozRTCPeerConnection.prototype.addStream","mozRTCPeerConnection.prototype.addTrack","mozRTCPeerConnection.prototype.close","mozRTCPeerConnection.prototype.createAnswer","mozRTCPeerConnection.prototype.createDataChannel","mozRTCPeerConnection.prototype.createOffer","mozRTCPeerConnection.prototype.getConfiguration","mozRTCPeerConnection.prototype.getIdentityAssertion","mozRTCPeerConnection.prototype.getLocalStreams","mozRTCPeerConnection.prototype.getReceivers","mozRTCPeerConnection.prototype.getRemoteStreams","mozRTCPeerConnection.prototype.getSenders","mozRTCPeerConnection.prototype.getStats","mozRTCPeerConnection.prototype.getStreamById","mozRTCPeerConnection.prototype.removeStream","mozRTCPeerConnection.prototype.removeTrack","mozRTCPeerConnection.prototype.setIdentityProvider","mozRTCPeerConnection.prototype.setLocalDescription","mozRTCPeerConnection.prototype.setRemoteDescription","mozRTCPeerConnection.prototype.updateIce","RTCRtpSender.prototype.replaceTrack","RTCStatsReport.prototype.forEach","RTCStatsReport.prototype.get","RTCStatsReport.prototype.has"]}} diff --git a/add-on/lib/storage.js b/add-on/lib/storage.js index 9a56d27..afc95fb 100644 --- a/add-on/lib/storage.js +++ b/add-on/lib/storage.js @@ -38,4 +38,4 @@ get, set }; -}()); \ No newline at end of file +}()); diff --git a/add-on/lib/vendor/URI.js b/add-on/lib/third_party/URI.js similarity index 100% rename from add-on/lib/vendor/URI.js rename to add-on/lib/third_party/URI.js diff --git a/add-on/lib/vendor/js.cookie.js b/add-on/lib/third_party/js.cookie.js similarity index 100% rename from add-on/lib/vendor/js.cookie.js rename to add-on/lib/third_party/js.cookie.js diff --git a/add-on/lib/vendor/sjcl.js b/add-on/lib/third_party/sjcl.js similarity index 100% rename from add-on/lib/vendor/sjcl.js rename to add-on/lib/third_party/sjcl.js diff --git a/add-on/manifest.json b/add-on/manifest.json index 9f2696a..6029a0c 100644 --- a/add-on/manifest.json +++ b/add-on/manifest.json @@ -37,8 +37,8 @@ { "matches": ["*://*/*"], "js": [ - "lib/vendor/js.cookie.js", - "lib/vendor/sjcl.js", + "lib/third_party/js.cookie.js", + "lib/third_party/sjcl.js", "lib/init.js", "lib/standards.js", "lib/pack.js", @@ -52,8 +52,8 @@ ], "background": { "scripts": [ - "lib/vendor/URI.js", - "lib/vendor/sjcl.js", + "lib/third_party/URI.js", + "lib/third_party/sjcl.js", "lib/init.js", "lib/standards.js", "lib/pack.js", diff --git a/add-on/popup/js/popup.js b/add-on/popup/js/popup.js index 42827d3..4034e83 100644 --- a/add-on/popup/js/popup.js +++ b/add-on/popup/js/popup.js @@ -9,7 +9,7 @@ const configureButton = doc.getElementById("config-page-link"); const listGroupElm = doc.querySelector("ul.list-group"); - const addDomainRuleToListElm = function (hostToRuleMapping, listElm, aHostName) { + const addRuleToList = function (hostToRuleMapping, listElm, aHostName) { const domainRule = hostToRuleMapping[aHostName]; @@ -53,10 +53,10 @@ doc.body.className = "loaded"; const domainNames = Object.keys(response); - const addDomainRuleToListElmBound = addDomainRuleToListElm.bind(undefined, response, listGroupElm); + const addRuleToListBound = addRuleToList.bind(undefined, response, listGroupElm); - domainNames.forEach(addDomainRuleToListElmBound); + domainNames.forEach(addRuleToListBound); }); } ); -}()); \ No newline at end of file +}()); diff --git a/gulpfile.js b/gulpfile.js index 45ccebf..4a5e271 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,17 +1,7 @@ const gulp = require("gulp"); const fs = require("fs"); -gulp.task('default', function () { - - const isLineAComment = function (aLine) { - const lineStartsWithComment = ( - aLine.indexOf("// ") === 0 || - aLine.indexOf("/*") === 0 || - aLine.indexOf(" */") === 0 || - aLine.indexOf(" * ") === 0 - ); - return lineStartsWithComment; - }; +gulp.task("default", function () { const builtScriptComment = "/** This file is automatically generated. **/\n"; const standardsDefDir = "data/standards"; @@ -26,14 +16,20 @@ gulp.task('default', function () { const fileContents = fs.readFileSync(standardsDefDir + "/" + next, {encoding: "utf8"}); const standardContents = JSON.parse(fileContents); - const nameParts = [standardContents.info.name, standardContents.info.subsection_name].filter(part => !!part); + + const stdName = standardContents.info.name; + const stdSubName = standardContents.info.subsection_name; + const nameParts = [stdName, stdSubName].filter(part => !!part); + const standardIdentifier = nameParts.join(": ").trim(); standardContents.info.identifier = standardIdentifier; prev[standardIdentifier] = standardContents; return prev; }, {}); - const renderedStandardsModule = builtScriptComment + `window.WEB_API_MANAGER.standards = ${JSON.stringify(combinedStandards)};`; + let renderedStandardsModule = builtScriptComment + "\n"; + renderedStandardsModule += "window.WEB_API_MANAGER.standards = "; + renderedStandardsModule += JSON.stringify(combinedStandards) + ";"; fs.writeFileSync("add-on/lib/standards.js", renderedStandardsModule); }); diff --git a/package-lock.json b/package-lock.json index 690c6c8..c5a8e26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "web-api-manager", - "version": "0.9.2", + "version": "0.9.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 868ce6a..90d4bac 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "clean": "rm -Rf dist/", "bundle": "gulp && web-ext -s add-on -a dist build --overwrite-dest", "firefox": "web-ext -s add-on run", - "test:lint": "node_modules/eslint/bin/eslint.js test/functional/*.js test/functional/**/*.js add-on/background_scripts/*.js add-on/config/js/*.js add-on/config/js/components/*.js add-on/lib/*.js add-on/content_scripts/*.js", + "test:lint": "node_modules/eslint/bin/eslint.js .", + "test:lint:fix": "node_modules/eslint/bin/eslint.js --fix .", "test:func": "npm run clean; npm run bundle && ln -s `ls dist/` dist/webapi_manager.zip && node_modules/mocha/bin/mocha test/functional/*.js", "test": "npm run test:lint && npm run test:func" }, diff --git a/test.config.example.js b/test.config.example.js index 0412312..40967da 100644 --- a/test.config.example.js +++ b/test.config.example.js @@ -17,4 +17,4 @@ module.exports = { username: "", password: "" } -}; \ No newline at end of file +}; diff --git a/test/functional/block.js b/test/functional/block.js index 664272c..67950e0 100644 --- a/test/functional/block.js +++ b/test/functional/block.js @@ -72,4 +72,4 @@ describe("Basic", function () { }); }); }); -}); \ No newline at end of file +}); diff --git a/test/functional/csp.js b/test/functional/csp.js index 5f27812..66a54a8 100644 --- a/test/functional/csp.js +++ b/test/functional/csp.js @@ -14,7 +14,16 @@ describe("Content-Security-Protocol tests", function () { const [server, testUrl] = testServer.start(function (headers) { // Add the CSP header to every request - headers['Content-Security-Protocol'] = "default-src https: data: 'unsafe-inline' 'unsafe-eval'; child-src https: data: blob:; connect-src https: data: blob:; font-src https: data:; img-src https: data: blob:; media-src https: data: blob:; object-src https:; script-src https: data: blob: 'unsafe-inline' 'unsafe-eval'; style-src https: 'unsafe-inline'; block-all-mixed-content; upgrade-insecure-requests; report-uri https://capture.condenastdigital.com/csp/pitchfork;"; + const pitchforkCSP = [ + "default-src https: data: 'unsafe-inline' 'unsafe-eval';", + "child-src https: data: blob:; connect-src https: data: blob:;", + "font-src https: data:; img-src https: data: blob:;", + "media-src https: data: blob:;", + "object-src https:;", + "script-src https: data: blob: 'unsafe-inline' 'unsafe-eval';", + "style-src https: 'unsafe-inline';", + ]; + headers["Content-Security-Protocol"] = pitchforkCSP.join(" "); }); const svgTestScript = injected.testSVGTestScript(); @@ -40,4 +49,4 @@ describe("Content-Security-Protocol tests", function () { }); }); }); -}); \ No newline at end of file +}); diff --git a/test/functional/lib/injected.js b/test/functional/lib/injected.js index d288cfc..776ef4d 100644 --- a/test/functional/lib/injected.js +++ b/test/functional/lib/injected.js @@ -21,12 +21,12 @@ module.exports.temporaryAddOnInstallScript = (function () { const funcToInject = function () { const {Components, AddonManager} = window; - let fileUtils = Components.utils.import('resource://gre/modules/FileUtils.jsm'); - let FileUtils = fileUtils.FileUtils; - let callback = arguments[arguments.length - 1]; - Components.utils.import('resource://gre/modules/AddonManager.jsm'); + const fileUtils = Components.utils.import("resource://gre/modules/FileUtils.jsm"); + const FileUtils = fileUtils.FileUtils; + const callback = arguments[arguments.length - 1]; + Components.utils.import("resource://gre/modules/AddonManager.jsm"); - let listener = { + const listener = { onInstallEnded: function(install, addon) { callback([addon.id, 0]); }, @@ -39,7 +39,7 @@ module.exports.temporaryAddOnInstallScript = (function () { } }; - let file = new FileUtils.File(arguments[0]); + const file = new FileUtils.File(arguments[0]); AddonManager.addAddonListener(listener); AddonManager.installTemporaryAddon(file).catch(error => { @@ -73,7 +73,7 @@ module.exports.setStandardsAsBlockedScript = (function () { const funcSource = stripFuncFromSource(funcToInject.toString()); return function (standardsToBlock) { - return funcSource.replace('"###REPLACE###"', JSON.stringify(standardsToBlock)); + return funcSource.replace("\"###REPLACE###\"", JSON.stringify(standardsToBlock)); }; }()); @@ -89,4 +89,4 @@ module.exports.testSVGTestScript = (function () { return function () { return funcSource; }; -}()); \ No newline at end of file +}()); diff --git a/test/functional/lib/server.js b/test/functional/lib/server.js index ae84cb1..46a705f 100644 --- a/test/functional/lib/server.js +++ b/test/functional/lib/server.js @@ -20,7 +20,7 @@ module.exports.start = function (callback) { const httpServer = http.createServer(function (req, res) { - let headers = {"Content-Type": "text/html; charset=utf-8"}; + const headers = {"Content-Type": "text/html; charset=utf-8"}; if (callback !== undefined) { callback(headers); @@ -36,4 +36,4 @@ module.exports.start = function (callback) { module.exports.stop = function (server) { server.close(); -}; \ No newline at end of file +}; diff --git a/test/functional/lib/utils.js b/test/functional/lib/utils.js index 9f168bd..f9578ba 100644 --- a/test/functional/lib/utils.js +++ b/test/functional/lib/utils.js @@ -49,9 +49,7 @@ module.exports.promiseSetFormAndSubmit = function (driver, values) { module.exports.promiseAddonButton = function (driver) { driver.setContext(Context.CHROME); - return driver.wait(until.elementLocated( - by.css("[tooltiptext='WebAPI Manager']") - ), 2000); + return driver.wait(until.elementLocated(by.css("[tooltiptext='WebAPI Manager']")), 2000); }; module.exports.promiseExtensionConfigPage = function (driver) { @@ -68,9 +66,7 @@ module.exports.promiseExtensionConfigPage = function (driver) { module.exports.promiseAddonConfigButton = function (driver) { driver.setContext(Context.CHROME); - return driver.wait(until.elementLocated( - by.id("config-page-link") - ), 2000); + return driver.wait(until.elementLocated(by.id("config-page-link")), 2000); }; module.exports.promiseSetBlockingRules = function (driver, standardsToBlock) { @@ -83,18 +79,18 @@ module.exports.promiseSetBlockingRules = function (driver, standardsToBlock) { module.exports.promiseGetDriver = function () { - let driver = new webdriver.Builder() - .forBrowser('firefox') + const driver = new webdriver.Builder() + .forBrowser("firefox") .build(); driver.setContext(Context.CHROME); - let fileLocation = path.join(process.cwd(), "dist", "webapi_manager.zip"); + const fileLocation = path.join(process.cwd(), "dist", "webapi_manager.zip"); // This manually installs the add-on as a temporary add-on. // Hopefully selenium/geckodriver will get a way to do this soon: // https://bugzilla.mozilla.org/show_bug.cgi?id=1298025 - let installAddOnPromise = driver.executeAsyncScript( + const installAddOnPromise = driver.executeAsyncScript( injectedScripts.temporaryAddOnInstallScript(), fileLocation ); @@ -110,4 +106,4 @@ module.exports.promiseGetDriver = function () { driver.setContext(Context.CONTENT); return Promise.resolve(driver, result[0]); }); -}; \ No newline at end of file +}; diff --git a/test/functional/logins.js b/test/functional/logins.js index 95f5b67..6f54277 100644 --- a/test/functional/logins.js +++ b/test/functional/logins.js @@ -5,7 +5,7 @@ let testParams; try { testParams = require("../../test.config.js"); } catch (e) { - throw "Unable to load a test.config.js module in the project root. Copy test.config.example.js to test.config.js and try again"; + throw "Unable to load a test.config.js module in the project root. Copy test.config.example.js to test.config.js."; } const injected = require("./lib/injected"); const webdriver = require("selenium-webdriver"); @@ -42,15 +42,11 @@ describe("Logging into popular sites", function () { return driverReference.get("https://github.com/login"); }) .then(function () { - return driverReference.wait(until.elementLocated( - by.name("password") - ), 2000); + return driverReference.wait(until.elementLocated(by.name("password")), 2000); }) .then(() => utils.promiseSetFormAndSubmit(driverReference, formValues)) .then(function () { - return driverReference.wait(until.elementLocated( - by.css("body.logged-in") - ), 2000); + return driverReference.wait(until.elementLocated(by.css("body.logged-in")), 2000); }) .then(function () { driverReference.quit(); @@ -75,15 +71,11 @@ describe("Logging into popular sites", function () { }) .then(() => driverReference.get("https://github.com/login")) .then(function () { - return driverReference.wait(until.elementLocated( - by.name("password") - ), 2000); + return driverReference.wait(until.elementLocated(by.name("password")), 2000); }) .then(() => utils.promiseSetFormAndSubmit(driverReference, formValues)) .then(function () { - return driverReference.wait(until.elementLocated( - by.css("body.logged-in") - ), 2000); + return driverReference.wait(until.elementLocated(by.css("body.logged-in")), 2000); }) .then(() => driverReference.executeAsyncScript(svgTestScript)) .then(function () { @@ -123,15 +115,11 @@ describe("Logging into popular sites", function () { return driverReference.get("https://www.facebook.com/"); }) .then(function () { - return driverReference.wait(until.elementsLocated( - by.name("email") - ), 5000); + return driverReference.wait(until.elementsLocated(by.name("email")), 5000); }) .then(() => utils.promiseSetFormAndSubmit(driverReference, formValues)) .then(function () { - return driverReference.wait(until.elementLocated( - by.css("div[data-click='profile_icon']") - ), 10000); + return driverReference.wait(until.elementLocated(by.css("div[data-click='profile_icon']")), 10000); }) .then(function () { driverReference.quit(); @@ -158,47 +146,38 @@ describe("Logging into popular sites", function () { it("Log in", function (done) { - let driverReference; + let driver; utils.promiseGetDriver() - .then(function (driver) { - driverReference = driver; - return driverReference.get("https://www.youtube.com"); + .then(function (testDriver) { + driver = testDriver; + return driver.get("https://www.youtube.com"); }) .then(function () { - return driverReference.wait(until.elementsLocated( - by.css("#buttons ytd-button-renderer a") - ), 5000); + return driver.wait(until.elementsLocated(by.css("#buttons ytd-button-renderer a")), 5000); }) .then(anchors => anchors[anchors.length - 1].click()) .then(() => utils.pause(2000)) .then(function () { - return driverReference.wait(until.elementLocated( - by.name("identifier") - ), 5000); + return driver.wait(until.elementLocated(by.name("identifier")), 5000); }) - .then(identifierElm => driverReference.wait(until.elementIsVisible(identifierElm))) - .then(identifierElm => identifierElm.sendKeys(testParams.google.username, keys.ENTER)) + .then(idElm => driver.wait(until.elementIsVisible(idElm))) + .then(idElm => idElm.sendKeys(testParams.google.username, keys.ENTER)) .then(() => utils.pause(2000)) .then(function () { - return driverReference.wait(until.elementLocated( - by.name("password") - ), 5000); + return driver.wait(until.elementLocated(by.name("password")), 5000); }) - .then(passwordElm => driverReference.wait(until.elementIsVisible(passwordElm))) + .then(passwordElm => driver.wait(until.elementIsVisible(passwordElm))) .then(passwordElm => passwordElm.sendKeys(testParams.google.password, keys.ENTER)) .then(function () { - return driverReference.wait(until.elementLocated( - by.css("ytd-app") - ), 10000); + return driver.wait(until.elementLocated(by.css("ytd-app")), 10000); }) .then(function () { - driverReference.quit(); + driver.quit(); done(); }) - .catch(function (e) { - driverReference.quit(); - console.log(e); + .catch(function () { + driver.quit(); done(new Error("Was not able to log in")); }); });