forked from ampproject/amphtml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresize-observer-stub.js
68 lines (60 loc) · 1.47 KB
/
resize-observer-stub.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* @param {!Object} sandbox
* @param {!Window} window
* @return {!ResizeObservers}
*/
export function installResizeObserverStub(sandbox, win) {
return new ResizeObservers(sandbox, win);
}
class ResizeObservers {
constructor(sandbox, win) {
const observers = new Set();
this.observers = observers;
sandbox.stub(win, 'ResizeObserver').value(function (callback) {
const observer = new ResizeObserverStub(callback, () => {
observers.delete(observer);
});
observers.add(observer);
return observer;
});
}
/**
* @param {!Element} target
* @return {boolean}
*/
isObserved(target) {
return Array.from(this.observers).some((observer) =>
observer.elements.has(target)
);
}
notifySync(entryOrEntries) {
const entries = Array.isArray(entryOrEntries)
? entryOrEntries
: [entryOrEntries];
this.observers.forEach((observer) => {
const subEntries = entries.filter(({target}) =>
observer.elements.has(target)
);
if (subEntries.length > 0) {
observer.callback(subEntries);
}
});
}
}
class ResizeObserverStub {
constructor(callback, onDisconnect) {
this.onDisconnect_ = onDisconnect;
this.callback = callback;
this.elements = new Set();
}
disconnect() {
const onDisconnect = this.onDisconnect_;
onDisconnect();
}
observe(element) {
this.elements.add(element);
}
unobserve(element) {
this.elements.delete(element);
}
}