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

Function patchXHR

packages/zone.js/lib/browser/browser.ts:107–289  ·  view source on GitHub ↗
(window: any)

Source from the content-addressed store, hash-verified

105 }
106
107 function patchXHR(window: any) {
108 const XMLHttpRequest = window['XMLHttpRequest'];
109 if (!XMLHttpRequest) {
110 // XMLHttpRequest is not available in service worker
111 return;
112 }
113 const XMLHttpRequestPrototype: any = XMLHttpRequest.prototype;
114
115 function findPendingTask(target: any) {
116 return target[XHR_TASK];
117 }
118
119 let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
120 let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
121 if (!oriAddListener) {
122 const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
123 if (XMLHttpRequestEventTarget) {
124 const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
125 oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
126 oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
127 }
128 }
129
130 const READY_STATE_CHANGE = 'readystatechange';
131 const SCHEDULED = 'scheduled';
132
133 function scheduleTask(task: Task) {
134 const data = <XHROptions>task.data;
135 const target = data.target;
136 target[XHR_SCHEDULED] = false;
137 target[XHR_ERROR_BEFORE_SCHEDULED] = false;
138 // remove existing event listener
139 const listener = target[XHR_LISTENER];
140 if (!oriAddListener) {
141 oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
142 oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
143 }
144
145 if (listener) {
146 oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
147 }
148 const newListener = (target[XHR_LISTENER] = () => {
149 if (target.readyState === target.DONE) {
150 // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with
151 // readyState=4 multiple times, so we need to check task state here
152 if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
153 // check whether the xhr has registered onload listener
154 // if that is the case, the task should invoke after all
155 // onload listeners finish.
156 // Also if the request failed without response (status = 0), the load event handler
157 // will not be triggered, in that case, we should also invoke the placeholder callback
158 // to close the XMLHttpRequest::send macroTask.
159 // https://github.com/angular/angular/issues/38795
160 const loadTasks = target[Zone.__symbol__('loadfalse')];
161 if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
162 const oriInvoke = task.invoke;
163 task.invoke = function () {
164 // need to load the tasks again, because in other

Callers 1

patchBrowserFunction · 0.85

Calls 6

patchMethodFunction · 0.90
findPendingTaskFunction · 0.85
applyMethod · 0.65
invokeMethod · 0.65
cancelTaskMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…