MCPcopy Index your code
hub / github.com/angular/angular / patchClass

Function patchClass

packages/zone.js/lib/common/utils.ts:323–392  ·  view source on GitHub ↗
(className: string)

Source from the content-addressed store, hash-verified

321
322// wrap some native API on `window`
323export function patchClass(className: string) {
324 const OriginalClass = _global[className];
325 if (!OriginalClass) return;
326 // keep original class in global
327 _global[zoneSymbol(className)] = OriginalClass;
328
329 _global[className] = function () {
330 const a = bindArguments(<any>arguments, className);
331 switch (a.length) {
332 case 0:
333 this[originalInstanceKey] = new OriginalClass();
334 break;
335 case 1:
336 this[originalInstanceKey] = new OriginalClass(a[0]);
337 break;
338 case 2:
339 this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
340 break;
341 case 3:
342 this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
343 break;
344 case 4:
345 this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
346 break;
347 default:
348 throw new Error('Arg list too long.');
349 }
350 };
351
352 // attach original delegate to patched function
353 attachOriginToPatched(_global[className], OriginalClass);
354
355 const instance = new OriginalClass(function () {});
356
357 let prop;
358 for (prop in instance) {
359 // https://bugs.webkit.org/show_bug.cgi?id=44721
360 if (className === 'XMLHttpRequest' && prop === 'responseBlob') continue;
361 (function (prop) {
362 if (typeof instance[prop] === 'function') {
363 _global[className].prototype[prop] = function () {
364 return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
365 };
366 } else {
367 ObjectDefineProperty(_global[className].prototype, prop, {
368 set: function (fn) {
369 if (typeof fn === 'function') {
370 this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
371 // keep callback in wrapped function so we can
372 // use it in Function.prototype.toString to return
373 // the native one.
374 attachOriginToPatched(this[originalInstanceKey][prop], fn);
375 } else {
376 this[originalInstanceKey][prop] = fn;
377 }
378 },
379 get: function () {
380 return this[originalInstanceKey][prop];

Callers 1

patchBrowserFunction · 0.90

Calls 4

bindArgumentsFunction · 0.85
attachOriginToPatchedFunction · 0.85
wrapWithCurrentZoneFunction · 0.85
applyMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…