Test name | Executions per second |
---|---|
while loop + tagName check | 745.3 Ops/sec |
event propagation | 137.5 Ops/sec |
event propagation with callback | 193.8 Ops/sec |
<context-provider id="provider">
<div>
<div></div>
<div></div>
<div></div>
<div></div>
<div>
<div>
<span>
<span>
<span>abc</span>
</span>
def
<span>
<span id="foo"></span>
</span>
</span>
</div>
ghi
</div>
</div>
</context-provider>
var context = document.getElementById('provider');
var element = document.getElementById('foo');
var SimpleContextEvent = class SimpleContextEvent extends Event {
data = null;
callback = null;
constructor(callback) {
super('context-request', {bubbles: true, composed: true});
this.callback = callback;
}
};
context.addEventListener('context-request', event => {
if (event.callback) {
event.callback(context);
} else {
event.data = context;
}
event.stopPropagation();
});
var i = 5000;
while (i--) {
let ctx = element;
while (ctx && ctx.nodeName !== 'CONTEXT-PROVIDER') {
ctx = ctx.assignedSlot || ctx.parentNode || ctx.host;
}
if (ctx !== context) {
throw new Error('mismatch');
}
}
var i = 5000;
while (i--) {
let ctxEvent = new SimpleContextEvent();
element.dispatchEvent(ctxEvent);
let ctx = ctxEvent.data;
if (ctx !== context) {
throw new Error('mismatch');
}
}
var i = 5000;
var ctx;
var ctxEvent = new SimpleContextEvent(reply => {ctx = reply;});
while (i--) {
ctx = null;
element.dispatchEvent(ctxEvent);
if (ctx !== context) {
throw new Error('mismatch');
}
}