Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit 08b5a32

Browse files
yshterevyeelan0319
authored andcommitted
feat(auto-init): Fire event on mdcAutoInit complete (#1012)
Fix #954
1 parent 3eee2dc commit 08b5a32

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

packages/mdc-auto-init/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,10 @@ warning, you could simply pass in a nop.
160160
```
161161

162162
This will suppress any warnings about already initialized elements.
163+
164+
### Events
165+
166+
#### MDCAutoInit:End
167+
Triggered when initialization of all components is complete.
168+
169+
`document.addEventListener("MDCAutoInit:End", () => {...});`

packages/mdc-auto-init/index.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,21 @@ const registry = Object.create(null);
1818

1919
const CONSOLE_WARN = console.warn.bind(console);
2020

21+
function _emit(evtType, evtData, shouldBubble = false) {
22+
let evt;
23+
if (typeof CustomEvent === 'function') {
24+
evt = new CustomEvent(evtType, {
25+
detail: evtData,
26+
bubbles: shouldBubble,
27+
});
28+
} else {
29+
evt = document.createEvent('CustomEvent');
30+
evt.initCustomEvent(evtType, shouldBubble, false, evtData);
31+
}
32+
33+
document.dispatchEvent(evt);
34+
}
35+
2136
/**
2237
* Auto-initializes all mdc components on a page.
2338
*/
@@ -49,6 +64,8 @@ export default function mdcAutoInit(root = document, warn = CONSOLE_WARN) {
4964
configurable: true,
5065
});
5166
}
67+
68+
_emit('MDCAutoInit:End', {});
5269
}
5370

5471
mdcAutoInit.register = function(componentName, Ctor, warn = CONSOLE_WARN) {

test/unit/mdc-auto-init/mdc-auto-init.test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,46 @@ test('#register warns when registered key is being overridden', () => {
9595

9696
td.verify(warn(contains('(mdc-auto-init) Overriding registration')));
9797
});
98+
99+
test('#dispatches a MDCAutoInit:End event when all components are initialized', () => {
100+
const root = document.createElement('div');
101+
const handler = td.func('eventHandler');
102+
let evt = null;
103+
104+
td.when(handler(td.matchers.isA(Object))).thenDo((evt_) => {
105+
evt = evt_;
106+
});
107+
108+
const type = 'MDCAutoInit:End';
109+
110+
document.addEventListener(type, handler);
111+
mdcAutoInit(root);
112+
113+
assert.isOk(evt !== null);
114+
assert.equal(evt.type, type);
115+
});
116+
117+
test('#dispatches a MDCAutoInit:End event when all components are initialized - custom events not supported', () => {
118+
const root = document.createElement('div');
119+
const handler = td.func('eventHandler');
120+
let evt = null;
121+
122+
td.when(handler(td.matchers.isA(Object))).thenDo((evt_) => {
123+
evt = evt_;
124+
});
125+
126+
const type = 'MDCAutoInit:End';
127+
128+
document.addEventListener(type, handler);
129+
130+
const {CustomEvent} = window;
131+
window.CustomEvent = undefined;
132+
try {
133+
mdcAutoInit(root);
134+
} finally {
135+
window.CustomEvent = CustomEvent;
136+
}
137+
138+
assert.isOk(evt !== null);
139+
assert.equal(evt.type, type);
140+
});

0 commit comments

Comments
 (0)