forked from angular/zone.js
-
Notifications
You must be signed in to change notification settings - Fork 1
/
register-element.ts
45 lines (38 loc) · 1.66 KB
/
register-element.ts
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
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {attachOriginToPatched, isBrowser, isMix, ObjectGetOwnPropertyDescriptor, wrapWithCurrentZone} from '../common/utils';
import {_redefineProperty} from './define-property';
export function registerElementPatch(_global: any) {
if ((!isBrowser && !isMix) || !('registerElement' in (<any>_global).document)) {
return;
}
const _registerElement = (<any>document).registerElement;
const callbacks =
['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
(<any>document).registerElement = function(name: any, opts: any) {
if (opts && opts.prototype) {
callbacks.forEach(function(callback) {
const source = 'Document.registerElement::' + callback;
const prototype = opts.prototype;
if (prototype.hasOwnProperty(callback)) {
const descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback);
if (descriptor && descriptor.value) {
descriptor.value = wrapWithCurrentZone(descriptor.value, source);
_redefineProperty(opts.prototype, callback, descriptor);
} else {
prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
}
} else if (prototype[callback]) {
prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
}
});
}
return _registerElement.call(document, name, opts);
};
attachOriginToPatched((<any>document).registerElement, _registerElement);
}