chromium/third_party/blink/web_tests/webexposed/resources/element-instance-property-listing.js

(function() {

if (!window.internals) {
    testFailed('Test must be run with --expose-internals-for-testing flag.');
    return;
}

// FIXME(https://crbug.com/43394):
// These properties should live in the element prototypes instead of on the individual instances.
function listElementProperties(type, createElement) {
    debug('[' + type.toUpperCase() + ' NAMESPACE ELEMENT PROPERTIES]');
    var namespace = internals[type + 'Namespace']();
    debug('namespace ' + namespace);
    var tags = internals[type + 'Tags']().filter(tag => !(createElement(tag) instanceof HTMLUnknownElement));
    var tagProperties = {};
    var commonProperties = null; // Will be a map containing the intersection of properties across all elements as keys.
    tags.forEach(function(tag) {
        var element = createElement(tag);
        // We don't read out the property descriptors here to avoid the test timing out.
        var properties = getAllPropertyNames(element);
        tagProperties[tag] = properties;
        if (commonProperties === null) {
            commonProperties = {};
            properties.forEach(function(property) {
                commonProperties[property] = true;
            });
        } else {
            var hasProperty = {};
            properties.forEach(function(property) {
                hasProperty[property] = true;
            });
            Object.getOwnPropertyNames(commonProperties).forEach(function(property) {
                if (!hasProperty[property])
                    delete commonProperties[property];
            });
        }
    });
    debug(escapeHTML('<common>'));
    Object.getOwnPropertyNames(commonProperties).sort().forEach(function(property) {
        debug('    property ' + property);
    });
    tags.forEach(function(tag) {
        debug(type + ' element ' + tag);
        tagProperties[tag].forEach(function(property) {
            if (!(property in commonProperties))
                debug('    property ' + property);
        });
    });
}

listElementProperties('html', function (tag) { return document.createElement(tag); });
listElementProperties('svg', function (tag) { return document.createElementNS('http://www.w3.org/2000/svg', tag); });

})();