init commit

This commit is contained in:
Peter Snyder 2017-09-12 17:34:25 -05:00
commit f45b899f7d
No known key found for this signature in database
GPG key ID: 7566BC078DEC9B93
85 changed files with 2036 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
node_modules/
.DS_Store
*.swp

25
background_scripts/bootstrap.js vendored Normal file
View file

@ -0,0 +1,25 @@
/*jslint es6: true*/
/*global chrome*/
(function () {
"use strict";
let onMsgHandler;
onMsgHandler = function (request, ignore, sendResponse) {
let requestingDoman = request.domain;
if (request.request !== "rules") {
sendResponse(null);
return false;
}
sendResponse({
rules: ["fetch"]
});
return false;
};
chrome.runtime.peteStuff = "P";
chrome.runtime.onMessage.addListener(onMsgHandler);
}());

View file

@ -0,0 +1,8 @@
/**
* This file defines default blocking rules for domains that haven't been
* overwritten, either by the extension user, or by a subscribed policy
* list.
*/
window.WEB_API_MANAGER.defaults = [
"MediaStream Recording",
];

3
content_scripts/init.js Normal file
View file

@ -0,0 +1,3 @@
// Initial content script for the Web API manager extension, that creates
// the "namespace" we'll use for all the content scripts in the extension.
window.WEB_API_MANAGER = {};

137
content_scripts/injected.js Normal file
View file

@ -0,0 +1,137 @@
/*jslint es6: true, browser: true*/
/*global window*/
(function () {
"use strict";
const settings = window.WEB_API_MANAGER_PAGE;
const shouldLog = settings.shouldLog;
const standardsToBlock = settings.toBlock;
const standardDefinitions = settings.standards;
const defaultFunction = function () {};
const funcPropNames = Object.getOwnPropertyNames(defaultFunction);
const unconfigurablePropNames = funcPropNames.filter(function (propName) {
const possiblePropDesc = Object.getOwnPropertyDescriptor(defaultFunction, propName);
return (possiblePropDesc && !possiblePropDesc.configurable);
});
const featuresToBlock = standardsToBlock.reduce(function (prev, cur) {
return prev.concat(standardDefinitions[cur].features);
}, []);
const toPrimitiveFunc = function (hint) {
if (hint === "number" || hint === "default") {
return 0;
}
if (hint === "string") {
return "";
}
return undefined;
};
const keyPathToRefPath = function (keyPath) {
const keyParts = keyPath.split(".");
return keyParts.reduce(function (prev, cur) {
if (prev === undefined) {
return undefined;
}
const numNodes = prev.length;
const currentLeaf = (numNodes === 0)
? window
: prev[numNodes - 1];
const nextLeaf = currentLeaf[cur];
if (nextLeaf === undefined) {
return undefined;
}
return prev.concat([nextLeaf]);
}, []);
};
const createBlockingProxy = function (keyPath) {
let hasBeenLogged = false;
const logKeyPath = function () {
if (keyPath !== undefined && hasBeenLogged === false) {
hasBeenLogged = true;
console.info(keyPath);
}
};
let blockingProxy;
blockingProxy = new Proxy(defaultFunction, {
get: function (ignore, property) {
logKeyPath();
if (property === Symbol.toPrimitive) {
return toPrimitiveFunc;
}
if (property === "valueOf") {
return toPrimitiveFunc;
}
return blockingProxy;
},
set: function () {
logKeyPath();
return blockingProxy;
},
apply: function () {
logKeyPath();
return blockingProxy;
},
ownKeys: function (ignore) {
return unconfigurablePropNames;
},
has: function (ignore, property) {
return (unconfigurablePropNames.indexOf(property) > -1);
},
getOwnPropertyDescriptor: function (ignore, property) {
if (unconfigurablePropNames.indexOf(property) === -1) {
return undefined;
}
return Object.getOwnPropertyDescriptor(defaultFunction, property);
}
});
return blockingProxy;
};
const defaultBlockingProxy = createBlockingProxy();
const blockFeatureAtKeyPath = function (keyPath) {
const propertyRefs = keyPathToRefPath(keyPath);
// If we weren't able to turn the key path into an array of references,
// then it means that the property doesn't exist in this DOM /
// environment, so there is nothing to block.
if (propertyRefs === undefined) {
return false;
}
const keyPathSegments = keyPath.split(".");
const lastPropertyName = keyPathSegments[keyPathSegments.length - 1];
const leafRef = propertyRefs[propertyRefs.length - 1];
const parentRef = propertyRefs[propertyRefs.length - 2];
// At least for now, only interpose on methods.
if (typeof leafRef !== "function") {
return false;
}
if (shouldLog === true) {
parentRef[lastPropertyName] = createBlockingProxy(keyPath);
return true;
}
parentRef[lastPropertyName] = defaultBlockingProxy;
return true;
};
featuresToBlock.forEach(blockFeatureAtKeyPath);
}());

File diff suppressed because one or more lines are too long

155
content_scripts/stub.js Normal file
View file

@ -0,0 +1,155 @@
/*jslint es6: true, browser: true*/
/*global chrome, window*/
(function () {
"use strict";
let script = document.createElement('script');
let rootElm = document.head || document.documentElement;
let code = `
window.WEB_API_MANAGER_PAGE = {
standards: ${JSON.stringify(window.WEB_API_MANAGER.standards)},
toBlock: ${JSON.stringify(window.WEB_API_MANAGER.defaults)},
shouldLog: true
};
/*jslint es6: true, browser: true*/
/*global window*/
(function () {
"use strict";
const settings = window.WEB_API_MANAGER_PAGE;
const shouldLog = settings.shouldLog;
const standardsToBlock = settings.toBlock;
const standardDefinitions = settings.standards;
const defaultFunction = function () {};
const funcPropNames = Object.getOwnPropertyNames(defaultFunction);
const unconfigurablePropNames = funcPropNames.filter(function (propName) {
const possiblePropDesc = Object.getOwnPropertyDescriptor(defaultFunction, propName);
return (possiblePropDesc && !possiblePropDesc.configurable);
});
const featuresToBlock = standardsToBlock.reduce(function (prev, cur) {
return prev.concat(standardDefinitions[cur].features);
}, []);
const toPrimitiveFunc = function (hint) {
if (hint === "number" || hint === "default") {
return 0;
}
if (hint === "string") {
return "";
}
return undefined;
};
const keyPathToRefPath = function (keyPath) {
const keyParts = keyPath.split(".");
return keyParts.reduce(function (prev, cur) {
if (prev === undefined) {
return undefined;
}
const numNodes = prev.length;
const currentLeaf = (numNodes === 0)
? window
: prev[numNodes - 1];
const nextLeaf = currentLeaf[cur];
if (nextLeaf === undefined) {
return undefined;
}
return prev.concat([nextLeaf]);
}, []);
};
const createBlockingProxy = function (keyPath) {
let hasBeenLogged = false;
const logKeyPath = function () {
if (keyPath !== undefined && hasBeenLogged === false) {
hasBeenLogged = true;
console.info(keyPath);
}
};
let blockingProxy;
blockingProxy = new Proxy(defaultFunction, {
get: function (ignore, property) {
logKeyPath();
if (property === Symbol.toPrimitive) {
return toPrimitiveFunc;
}
if (property === "valueOf") {
return toPrimitiveFunc;
}
return blockingProxy;
},
set: function () {
logKeyPath();
return blockingProxy;
},
apply: function () {
logKeyPath();
return blockingProxy;
},
ownKeys: function (ignore) {
return unconfigurablePropNames;
},
has: function (ignore, property) {
return (unconfigurablePropNames.indexOf(property) > -1);
},
getOwnPropertyDescriptor: function (ignore, property) {
if (unconfigurablePropNames.indexOf(property) === -1) {
return undefined;
}
return Object.getOwnPropertyDescriptor(defaultFunction, property);
}
});
return blockingProxy;
};
const defaultBlockingProxy = createBlockingProxy();
const blockFeatureAtKeyPath = function (keyPath) {
const propertyRefs = keyPathToRefPath(keyPath);
// If we weren't able to turn the key path into an array of references,
// then it means that the property doesn't exist in this DOM /
// environment, so there is nothing to block.
if (propertyRefs === undefined) {
return false;
}
const keyPathSegments = keyPath.split(".");
const lastPropertyName = keyPathSegments[keyPathSegments.length - 1];
const leafRef = propertyRefs[propertyRefs.length - 1];
const parentRef = propertyRefs[propertyRefs.length - 2];
// At least for now, only interpose on methods.
if (typeof leafRef !== "function") {
return false;
}
if (shouldLog === true) {
parentRef[lastPropertyName] = createBlockingProxy(keyPath);
return true;
}
parentRef[lastPropertyName] = defaultBlockingProxy;
return true;
};
featuresToBlock.forEach(blockFeatureAtKeyPath);
}());
`;
script.appendChild(document.createTextNode(code));
rootElm.appendChild(script);
}());

1
data/standards/AJAX.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "XMLHttpRequest", "subsection_number": null, "subsection_name": null, "url": "https://xhr.spec.whatwg.org/"}, "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"]}

1
data/standards/ALS.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Ambient Light Sensor API", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/ambient-light/"}, "features": ["window.ondevicelight"]}

1
data/standards/BA.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Battery Status API", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/battery-status/"}, "features": ["navigator.battery", "Navigator.prototype.getBattery"]}

1
data/standards/BE.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Beacon", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/beacon/"}, "features": ["Navigator.prototype.sendBeacon"]}

1
data/standards/CO.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Console API", "subsection_number": null, "subsection_name": null, "url": "https://github.com/DeveloperToolsWG/console-object"}, "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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "CSS Conditional Rules Module Level 3", "subsection_number": null, "subsection_name": null, "url": "https://drafts.csswg.org/css-conditional-3/"}, "features": ["CSS.supports"]}

View file

@ -0,0 +1 @@
{"info": {"name": "CSS Font Loading Module Level 3", "subsection_number": null, "subsection_name": null, "url": "https://drafts.csswg.org/css-font-loading/"}, "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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "CSS Object Model (CSSOM)", "subsection_number": null, "subsection_name": null, "url": "https://drafts.csswg.org/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "CSSOM View Module", "subsection_number": null, "subsection_name": null, "url": "https://drafts.csswg.org/cssom-view/"}, "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"]}

1
data/standards/DO.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "DeviceOrientation Event Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/orientation-event/"}, "features": ["DeviceMotionEvent.prototype.initDeviceMotionEvent", "DeviceOrientationEvent.prototype.initDeviceOrientationEvent"]}

View file

@ -0,0 +1 @@
{"info": {"name": "DOM Parsing and Serialization", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/DOM-Parsing/"}, "features": ["DOMParser.prototype.parseFromString", "Element.prototype.insertAdjacentHTML", "XMLSerializer.prototype.serializeToString"]}

1
data/standards/DOM.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "DOM", "subsection_number": null, "subsection_name": null, "url": "https://dom.spec.whatwg.org/"}, "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"]}

1
data/standards/DOM1.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 1 Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/REC-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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 2 Core Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 2 Events Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 2 HTML Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 2 Style Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 2 Traversal and Range Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/DOM-Level-2-Traversal-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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 3 Core Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "Document Object Model (DOM) Level 3 XPath Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

1
data/standards/DOM4.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "W3C DOM4", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/dom/"}, "features": ["MutationObserver.prototype.disconnect", "MutationObserver.prototype.observe", "MutationObserver.prototype.takeRecords"]}

1
data/standards/DU.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Directory Upload", "subsection_number": null, "subsection_name": null, "url": "https://wicg.github.io/directory-upload/proposal.html"}, "features": ["Directory.prototype.getFilesAndDirectories"]}

1
data/standards/E.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Encoding", "subsection_number": null, "subsection_name": null, "url": "https://encoding.spec.whatwg.org/"}, "features": ["TextDecoder.prototype.decode", "TextEncoder.prototype.encode"]}

1
data/standards/EC.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "execCommand", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/editing/execCommand.html"}, "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"]}

1
data/standards/EME.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Encrypted Media Extensions", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/encrypted-media/"}, "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"]}

1
data/standards/F.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Fetch", "subsection_number": null, "subsection_name": null, "url": "https://fetch.spec.whatwg.org/"}, "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"]}

1
data/standards/FA.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "File API", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/FileAPI/"}, "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"]}

1
data/standards/FULL.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Fullscreen API", "subsection_number": null, "subsection_name": null, "url": "https://fullscreen.spec.whatwg.org/"}, "features": ["document.mozFullScreen", "document.mozFullScreenElement", "document.mozFullScreenEnabled", "document.onmozfullscreenchange", "document.onmozfullscreenerror", "Document.prototype.mozCancelFullScreen", "Element.prototype.mozRequestFullScreen", "window.onmozfullscreenchange", "window.onmozfullscreenerror"]}

1
data/standards/GEO.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Geolocation API Specification", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/geolocation-API/"}, "features": ["navigator.geolocation", "navigator.geolocation.getCurrentPosition", "navigator.geolocation.watchPosition", "navigator.geolocation.clearWatch"]}

1
data/standards/GIM.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Geometry Interfaces Module Level 1", "subsection_number": null, "subsection_name": null, "url": "https://drafts.fxtf.org/geometry/"}, "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"]}

1
data/standards/GP.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Gamepad", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/gamepad/"}, "features": ["Navigator.prototype.getGamepads"]}

1
data/standards/H-B.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "9.6", "subsection_name": "Broadcasting to other browsing contexts", "url": "https://html.spec.whatwg.org/multipage/comms.html#dom-broadcastchannel-postmessage"}, "features": ["BroadcastChannel.prototype.close", "BroadcastChannel.prototype.postMessage"]}

1
data/standards/H-C.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "4.12.4", "subsection_name": "The canvas element", "url": "https://html.spec.whatwg.org/multipage/scripting.html#the-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"]}

1
data/standards/H-CM.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "9.5", "subsection_name": "Channel Messaging", "url": "https://html.spec.whatwg.org/multipage/comms.html#channel-messaging"}, "features": ["MessagePort.prototype.close", "MessagePort.prototype.postMessage", "MessagePort.prototype.start", "window.postMessage"]}

1
data/standards/H-HI.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "7.5.2", "subsection_name": "History Interface", "url": "https://html.spec.whatwg.org/multipage/browsers.html#the-history-interface"}, "features": ["History.prototype.back", "History.prototype.forward", "History.prototype.go", "History.prototype.pushState", "History.prototype.replaceState", "window.history"]}

1
data/standards/H-P.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "8.6.1.5", "subsection_name": "Plugins", "url": "https://html.spec.whatwg.org/multipage/webappapis.html#plugins-2"}, "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"]}

1
data/standards/H-WB.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "11", "subsection_name": "Web Storage", "url": "https://html.spec.whatwg.org/multipage/webstorage.html"}, "features": ["Storage.prototype.clear", "Storage.prototype.getItem", "Storage.prototype.key", "Storage.prototype.removeItem", "Storage.prototype.setItem", "StorageEvent.prototype.initStorageEvent", "window.localStorage", "window.sessionStorage"]}

1
data/standards/H-WS.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "9.3", "subsection_name": "Web Sockets", "url": "https://html.spec.whatwg.org/multipage/comms.html#network"}, "features": ["WebSocket.prototype.close", "WebSocket.prototype.send"]}

1
data/standards/H-WW.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": "10", "subsection_name": "Web Workers", "url": "https://html.spec.whatwg.org/multipage/workers.html"}, "features": ["Worker.prototype.postMessage", "Worker.prototype.terminate"]}

1
data/standards/HRT.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "High Resolution Time Level 2", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/hr-time/"}, "features": ["Performance.prototype.now"]}

1
data/standards/HTML.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "HTML", "subsection_number": null, "subsection_name": null, "url": "https://html.spec.whatwg.org"}, "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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "HTML 5", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/html5/"}, "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"]}

View file

@ -0,0 +1 @@
{"info": {"name": "HTML 5.1", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/html51/"}, "features": ["DragEvent.prototype.initDragEvent", "External.prototype.addSearchEngine", "External.prototype.AddSearchProvider", "External.prototype.IsSearchProviderInstalled", "navigator.language", "navigator.languages"]}

1
data/standards/IDB.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Indexed Database API", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/IndexedDB/"}, "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"]}

1
data/standards/MCD.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Media Capture from DOM Elements", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/mediacapture-fromelement/"}, "features": ["CanvasCaptureMediaStream.prototype.requestFrame", "HTMLCanvasElement.prototype.captureStream"]}

1
data/standards/MCS.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Media Capture and Streams", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/mediacapture-streams/"}, "features": ["LocalMediaStream.prototype.stop", "MediaDevices.prototype.enumerateDevices", "MediaDevices.prototype.getUserMedia", "navigator.mediaDevices"]}

1
data/standards/MSE.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Media Source Extensions", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/media-source/"}, "features": ["HTMLVideoElement.prototype.getVideoPlaybackQuality", "MediaSource.isTypeSupported", "MediaSource.prototype.addSourceBuffer", "MediaSource.prototype.endOfStream", "MediaSource.prototype.removeSourceBuffer", "SourceBuffer.prototype.abort", "SourceBuffer.prototype.appendBuffer", "SourceBuffer.prototype.remove"]}

1
data/standards/MSR.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "MediaStream Recording", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

1
data/standards/NS.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Non-Standard", "subsection_number": null, "subsection_name": null, "url": null}, "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"]}

1
data/standards/NT.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Navigation Timing", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

1
data/standards/PE.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Proximity Events", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/proximity/"}, "features": ["window.ondeviceproximity", "window.onuserproximity"]}

1
data/standards/PL.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Pointer Lock", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/pointerlock/"}, "features": ["document.mozPointerLockElement", "document.onmozpointerlockchange", "document.onmozpointerlockerror", "Document.prototype.mozExitPointerLock", "Element.prototype.mozRequestPointerLock", "window.onmozpointerlockchange", "window.onmozpointerlockerror"]}

1
data/standards/PT.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Performance Timeline", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/performance-timeline"}, "features": ["Performance.prototype.getEntriesByName", "Performance.prototype.getEntriesByType"]}

1
data/standards/PT2.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Performance Timeline Level 2", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/performance-timeline"}, "features": ["Performance.prototype.getEntries"]}

1
data/standards/PV.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Page Visibility (Second Edition)", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/page-visibility/"}, "features": ["document.hidden", "document.mozHidden", "document.mozVisibilityState", "document.visibilityState"]}

1
data/standards/RT.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Resource Timing", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/resource-timing/"}, "features": ["performance.onresourcetimingbufferfull", "Performance.prototype.clearResourceTimings", "Performance.prototype.setResourceTimingBufferSize"]}

1
data/standards/SD.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Shadow DOM", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/shadow-dom/"}, "features": ["HTMLContentElement.prototype.getDistributedNodes"]}

1
data/standards/SEL.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Selection API", "subsection_number": null, "subsection_name": null, "url": "http://w3c.github.io/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"]}

1
data/standards/SLC.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Selectors API Level 1", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/selectors-api"}, "features": ["Document.prototype.querySelector", "Document.prototype.querySelectorAll", "DocumentFragment.prototype.querySelector", "DocumentFragment.prototype.querySelectorAll", "Element.prototype.querySelector", "Element.prototype.querySelectorAll"]}

1
data/standards/SO.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "The Screen Orientation API", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/screen-orientation/"}, "features": ["screen.mozOrientation", "screen.onmozorientationchange", "screen.orientation", "Screen.prototype.mozLockOrientation", "Screen.prototype.mozUnlockOrientation", "ScreenOrientation.prototype.lock", "ScreenOrientation.prototype.unlock", "window.ondevicemotion", "window.ondeviceorientation"]}

1
data/standards/SVG.json Normal file

File diff suppressed because one or more lines are too long

1
data/standards/SW.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Service Workers", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/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"]}

1
data/standards/TC.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Timing control for script-based animations", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/animation-timing"}, "features": ["window.cancelAnimationFrame"]}

1
data/standards/TPE.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Tracking Preference Expression (DNT)", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/tracking-dnt/"}, "features": ["navigator.doNotTrack"]}

1
data/standards/UIE.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "UI Events Specification", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/uievents/"}, "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"]}

1
data/standards/URL.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "URL", "subsection_number": null, "subsection_name": null, "url": "https://url.spec.whatwg.org/"}, "features": ["URLSearchParams.prototype.append", "URLSearchParams.prototype.delete", "URLSearchParams.prototype.get", "URLSearchParams.prototype.getAll", "URLSearchParams.prototype.has", "URLSearchParams.prototype.set"]}

1
data/standards/UTL.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "User Timing Level 2", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/user-timing/"}, "features": ["Performance.prototype.clearMarks", "Performance.prototype.clearMeasures", "Performance.prototype.mark", "Performance.prototype.measure"]}

1
data/standards/V.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Vibration API", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/vibration/"}, "features": ["Navigator.prototype.vibrate"]}

1
data/standards/WCR.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Web Cryptography API", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/WebCryptoAPI/"}, "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"]}

1
data/standards/WEBA.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Web Audio API", "subsection_number": null, "subsection_name": null, "url": "https://webaudio.github.io/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"]}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
{"info": {"name": "WebVTT: The Web Video Text Tracks Format", "subsection_number": null, "subsection_name": null, "url": "https://w3c.github.io/webvtt/"}, "features": ["VTTCue.prototype.getCueAsHTML"]}

1
data/standards/WN.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "Web Notifications", "subsection_number": null, "subsection_name": null, "url": "https://notifications.spec.whatwg.org/"}, "features": ["DesktopNotification.prototype.show", "DesktopNotificationCenter.prototype.createNotification", "Notification.get", "Notification.prototype.close", "Notification.requestPermission"]}

1
data/standards/WRTC.json Normal file
View file

@ -0,0 +1 @@
{"info": {"name": "WebRTC 1.0: Real-time Communication Between Browser", "subsection_number": null, "subsection_name": null, "url": "https://www.w3.org/TR/webrtc/"}, "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"]}

25
gulpfile.js Normal file
View file

@ -0,0 +1,25 @@
let gulp = require('gulp');
let fs = require('fs');
gulp.task('default', function () {
let standardsDefDir = "data/standards";
// Build all the standards listings into a single features.js file.
let combinedStandards = fs.readdirSync(standardsDefDir)
.reduce(function (prev, next) {
if (next.indexOf(".json") === -1) {
return prev;
}
let fileContents = fs.readFileSync(standardsDefDir + "/" + next, {encoding: "utf8"});
let standardContents = JSON.parse(fileContents);
prev[standardContents.info.name] = standardContents;
return prev;
}, {});
let renderedStandardsModule = "window.WEB_API_MANAGER.standards = " + JSON.stringify(combinedStandards) + ";";
fs.writeFileSync("content_scripts/standards.js", renderedStandardsModule);
});

29
manifest.json Normal file
View file

@ -0,0 +1,29 @@
{
"manifest_version": 2,
"name": "WebAPI Manager",
"version": "0.1",
"description": "Improves browser security by restricting page access to parts of the Web API.",
"permissions": [
"*://*/*",
"webNavigation",
"storage"
],
"content_scripts": [
{
"matches": ["*://*/*"],
"js": [
"content_scripts/init.js",
"content_scripts/standards.js",
"content_scripts/defaults.js",
"content_scripts/stub.js"
],
"all_frames": true,
"run_at": "document_start"
}
],
"background": {
"scripts": [
"background_scripts/bootstrap.js"
]
}
}

1562
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

14
package.json Normal file
View file

@ -0,0 +1,14 @@
{
"name": "web-api-manager",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"gulp": "^3.9.1"
}
}