(window: any)
| 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 |
no test coverage detected
searching dependent graphs…