| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /**
- * @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
- */
- // we have to patch the instance since the proto is non-configurable
- export function apply(api: _ZonePrivate, _global: any) {
- const {ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR} = api.getGlobalObjects()!;
- const WS = (<any>_global).WebSocket;
- // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
- // On older Chrome, no need since EventTarget was already patched
- if (!(<any>_global).EventTarget) {
- api.patchEventTarget(_global, [WS.prototype]);
- }
- (<any>_global).WebSocket = function(x: any, y: any) {
- const socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
- let proxySocket: any;
- let proxySocketProto: any;
- // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
- const onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
- if (onmessageDesc && onmessageDesc.configurable === false) {
- proxySocket = api.ObjectCreate(socket);
- // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
- // but proxySocket not, so we will keep socket as prototype and pass it to
- // patchOnProperties method
- proxySocketProto = socket;
- [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function(
- propName) {
- proxySocket[propName] = function() {
- const args = api.ArraySlice.call(arguments);
- if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
- const eventName = args.length > 0 ? args[0] : undefined;
- if (eventName) {
- const propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
- socket[propertySymbol] = proxySocket[propertySymbol];
- }
- }
- return socket[propName].apply(socket, args);
- };
- });
- } else {
- // we can patch the real socket
- proxySocket = socket;
- }
- api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
- return proxySocket;
- };
- const globalWebSocket = _global['WebSocket'];
- for (const prop in WS) {
- globalWebSocket[prop] = WS[prop];
- }
- }
|