Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 44 additions & 39 deletions src/browserlib/extract-events.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -72,45 +72,6 @@ export default function (spec) {

let events = [];

// Look for definitions in event-definition tables
// (used in Pointer Events and UI Events)
[...document.querySelectorAll('table.event-definition')].forEach(table => {
const properties = [...table.querySelectorAll('tr')]
.map(line => {
const nameEl = line.querySelector('th');
const valueEl = line.querySelector('td');
if (!nameEl || !valueEl) {
return null;
}
let name = nameEl.textContent.trim().toLowerCase();
let value = valueEl.textContent.trim();
if (name === 'trusted targets') {
name = 'targets';
value = value.split(',').map(v => v.trim());
}
if (['type', 'interface', 'targets'].includes(name)) {
return { name, value };
}
else if (['bubbles', 'cancelable'].includes(name)) {
return { name, value: value.toLowerCase() === 'yes' ? true : false };
}
else {
return null;
}
})
.filter(prop => !!prop);
const event = {};
for (const prop of properties) {
event[prop.name] = prop.value;
}
event.src = {
format: 'event table',
href: href(table.closest('*[id]'))
},
events.push(event);
});


// Look for event summary tables
// ignore DOM spec which uses a matching table format
// to map to legacy event types
Expand Down Expand Up @@ -205,6 +166,50 @@ export default function (spec) {
}
});
}

// Look for definitions in event-definition tables
// (used in Pointer Events and UI Events)
[...document.querySelectorAll('table.event-definition')].forEach(table => {
const properties = [...table.querySelectorAll('tr')]
.map(line => {
const nameEl = line.querySelector('th');
const valueEl = line.querySelector('td');
if (!nameEl || !valueEl) {
return null;
}
let name = nameEl.textContent.trim().toLowerCase();
let value = valueEl.textContent.trim();
if (name === 'trusted targets') {
name = 'targets';
value = value.split(',').map(v => v.trim());
}
if (['type', 'interface', 'targets'].includes(name)) {
return { name, value };
}
else if (['bubbles', 'cancelable'].includes(name)) {
return { name, value: value.toLowerCase() === 'yes' ? true : false };
}
else {
return null;
}
})
.filter(prop => !!prop);
const event = {};
for (const prop of properties) {
event[prop.name] = prop.value;
}
event.src = {
format: 'event table',
href: href(table.closest('*[id]'))
};
// Prefer summary table to definition in an event table if both exist
// because the latter may include prose around the interface and target
// names that make it harder to extract meaningful values.
if (!events.find(e => isSameEvent(e, event))) {
events.push(event);
}
});

// Look for the DOM-suggested sentence "Fire an event named X"
// or the Service Worker extension of "fire (a) functional event named"
const isFiringLink = a => a.href === "https://dom.spec.whatwg.org/#concept-event-fire" ||
Expand Down
32 changes: 32 additions & 0 deletions test/extract-events.js
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,38 @@ ${defaultIdl}`,
cancelable: true
}
]
},
{
title: "prefers info in summary table to that an event-definition table",
html: `<table>
<thead>
<tr><th>Event type</th><th>Interface</th><th>Bubbles</th><th>Cancelable</th></tr>
</thead>
<tbody>
<tr><th><dfn id=success>success</dfn></th><td><a href=''>SuccessEvent</a></td><td>Yes</td><td>✓</td></tr>
<tr><th><dfn id=error>error</dfn></th><td><a href=''>ErrorEvent</a></td><td>No</td><td>No</td></tr>
</tbody></table>${defaultIdl}
<section id="events">
<div class="header-wrapper">
<h4>
<bdi class="secno">4.4.1<!---0.614927%--> </bdi>
<dfn class="export" data-dfn-type="event" data-export="" id="dfn-success">success</dfn>
</h4>
</div>
<table class="event-definition">
<tbody>
<tr>
<th>Type</th>
<td><strong><code>success</code></strong></td>
</tr>
<tr>
<th>Interface</th>
<td><code>SuccessEvent</code></td>
</tr>
</tbody>
</table>
</section>`,
res: defaultResults("summary table")
}
];

Expand Down