OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2005-2007 Alexey Proskuryakov <ap@webkit.org> | 3 * Copyright (C) 2005-2007 Alexey Proskuryakov <ap@webkit.org> |
4 * Copyright (C) 2007, 2008 Julien Chaffraix <jchaffraix@webkit.org> | 4 * Copyright (C) 2007, 2008 Julien Chaffraix <jchaffraix@webkit.org> |
5 * Copyright (C) 2008, 2011 Google Inc. All rights reserved. | 5 * Copyright (C) 2008, 2011 Google Inc. All rights reserved. |
6 * Copyright (C) 2012 Intel Corporation | 6 * Copyright (C) 2012 Intel Corporation |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Lesser General Public | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 && !name.startsWith(staticData->m_secHeaderPrefix, false); | 443 && !name.startsWith(staticData->m_secHeaderPrefix, false); |
444 } | 444 } |
445 | 445 |
446 void XMLHttpRequest::open(const String& method, const KURL& url, ExceptionState&
es) | 446 void XMLHttpRequest::open(const String& method, const KURL& url, ExceptionState&
es) |
447 { | 447 { |
448 open(method, url, true, es); | 448 open(method, url, true, es); |
449 } | 449 } |
450 | 450 |
451 void XMLHttpRequest::open(const String& method, const KURL& url, bool async, Exc
eptionState& es) | 451 void XMLHttpRequest::open(const String& method, const KURL& url, bool async, Exc
eptionState& es) |
452 { | 452 { |
453 internalAbort(); | 453 if (!internalAbort()) |
| 454 return; |
| 455 |
454 State previousState = m_state; | 456 State previousState = m_state; |
455 m_state = UNSENT; | 457 m_state = UNSENT; |
456 m_error = false; | 458 m_error = false; |
457 m_uploadComplete = false; | 459 m_uploadComplete = false; |
458 | 460 |
459 // clear stuff from possible previous load | 461 // clear stuff from possible previous load |
460 clearResponse(); | 462 clearResponse(); |
461 clearRequest(); | 463 clearRequest(); |
462 | 464 |
463 ASSERT(m_state == UNSENT); | 465 ASSERT(m_state == UNSENT); |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 es.throwDOMException(m_exceptionCode); | 778 es.throwDOMException(m_exceptionCode); |
777 } | 779 } |
778 | 780 |
779 void XMLHttpRequest::abort() | 781 void XMLHttpRequest::abort() |
780 { | 782 { |
781 // internalAbort() calls dropProtection(), which may release the last refere
nce. | 783 // internalAbort() calls dropProtection(), which may release the last refere
nce. |
782 RefPtr<XMLHttpRequest> protect(this); | 784 RefPtr<XMLHttpRequest> protect(this); |
783 | 785 |
784 bool sendFlag = m_loader; | 786 bool sendFlag = m_loader; |
785 | 787 |
786 internalAbort(); | 788 if (!internalAbort()) |
| 789 return; |
787 | 790 |
788 clearResponseBuffers(); | 791 clearResponseBuffers(); |
789 | 792 |
790 // Clear headers as required by the spec | 793 // Clear headers as required by the spec |
791 m_requestHeaders.clear(); | 794 m_requestHeaders.clear(); |
792 | 795 |
793 if ((m_state <= OPENED && !sendFlag) || m_state == DONE) | 796 if ((m_state <= OPENED && !sendFlag) || m_state == DONE) |
794 m_state = UNSENT; | 797 m_state = UNSENT; |
795 else { | 798 else { |
796 ASSERT(!m_loader); | 799 ASSERT(!m_loader); |
797 changeState(DONE); | 800 changeState(DONE); |
798 m_state = UNSENT; | 801 m_state = UNSENT; |
799 } | 802 } |
800 | 803 |
801 m_progressEventThrottle.dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent:
:create(eventNames().abortEvent)); | 804 m_progressEventThrottle.dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent:
:create(eventNames().abortEvent)); |
802 if (!m_uploadComplete) { | 805 if (!m_uploadComplete) { |
803 m_uploadComplete = true; | 806 m_uploadComplete = true; |
804 if (m_upload && m_uploadEventsAllowed) | 807 if (m_upload && m_uploadEventsAllowed) |
805 m_upload->dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::creat
e(eventNames().abortEvent)); | 808 m_upload->dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::creat
e(eventNames().abortEvent)); |
806 } | 809 } |
807 } | 810 } |
808 | 811 |
809 void XMLHttpRequest::internalAbort() | 812 bool XMLHttpRequest::internalAbort() |
810 { | 813 { |
811 bool hadLoader = m_loader; | 814 bool hadLoader = m_loader; |
812 | 815 |
813 m_error = true; | 816 m_error = true; |
814 | 817 |
815 // FIXME: when we add the support for multi-part XHR, we will have to think
be careful with this initialization. | 818 // FIXME: when we add the support for multi-part XHR, we will have to think
be careful with this initialization. |
816 m_receivedLength = 0; | 819 m_receivedLength = 0; |
817 | 820 |
818 if (hadLoader) { | 821 if (hadLoader) { |
819 m_loader->cancel(); | 822 // Cancelling the ThreadableLoader m_loader may result in calling |
820 m_loader = 0; | 823 // window.onload synchronously. If such an onload handler contains |
| 824 // open() call on the same XMLHttpRequest object, reentry happens. If |
| 825 // m_loader is left to be non 0, internalAbort() call for the inner |
| 826 // open() makes an extra dropProtection() call (when we're back to the |
| 827 // outer open(), we'll call dropProtection()). To avoid that, clears |
| 828 // m_loader before calling cancel. |
| 829 // |
| 830 // If, window.onload contains open() and send(), m_loader will be set to |
| 831 // non 0 value. So, we cannot continue the outer open(). In such case, |
| 832 // just abort the outer open() by returning false. |
| 833 RefPtr<ThreadableLoader> loader = m_loader.release(); |
| 834 loader->cancel(); |
821 } | 835 } |
822 | 836 |
823 m_decoder = 0; | 837 m_decoder = 0; |
824 | 838 |
825 InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this); | 839 InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this); |
826 | 840 |
827 if (hadLoader) | 841 if (hadLoader) |
828 dropProtectionSoon(); | 842 dropProtectionSoon(); |
| 843 |
| 844 return !m_loader; |
829 } | 845 } |
830 | 846 |
831 void XMLHttpRequest::clearResponse() | 847 void XMLHttpRequest::clearResponse() |
832 { | 848 { |
833 m_response = ResourceResponse(); | 849 m_response = ResourceResponse(); |
834 clearResponseBuffers(); | 850 clearResponseBuffers(); |
835 } | 851 } |
836 | 852 |
837 void XMLHttpRequest::clearResponseBuffers() | 853 void XMLHttpRequest::clearResponseBuffers() |
838 { | 854 { |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1179 else | 1195 else |
1180 // Firefox calls readyStateChanged every time it receives data, 4449
442 | 1196 // Firefox calls readyStateChanged every time it receives data, 4449
442 |
1181 callReadyStateChangeListener(); | 1197 callReadyStateChangeListener(); |
1182 } | 1198 } |
1183 } | 1199 } |
1184 | 1200 |
1185 void XMLHttpRequest::didTimeout() | 1201 void XMLHttpRequest::didTimeout() |
1186 { | 1202 { |
1187 // internalAbort() calls dropProtection(), which may release the last refere
nce. | 1203 // internalAbort() calls dropProtection(), which may release the last refere
nce. |
1188 RefPtr<XMLHttpRequest> protect(this); | 1204 RefPtr<XMLHttpRequest> protect(this); |
1189 internalAbort(); | 1205 if (!internalAbort()) |
| 1206 return; |
1190 | 1207 |
1191 clearResponse(); | 1208 clearResponse(); |
1192 clearRequest(); | 1209 clearRequest(); |
1193 | 1210 |
1194 m_error = true; | 1211 m_error = true; |
1195 m_exceptionCode = TimeoutError; | 1212 m_exceptionCode = TimeoutError; |
1196 | 1213 |
1197 if (!m_async) { | 1214 if (!m_async) { |
1198 m_state = DONE; | 1215 m_state = DONE; |
1199 m_exceptionCode = TimeoutError; | 1216 m_exceptionCode = TimeoutError; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 { | 1267 { |
1251 return &m_eventTargetData; | 1268 return &m_eventTargetData; |
1252 } | 1269 } |
1253 | 1270 |
1254 EventTargetData* XMLHttpRequest::ensureEventTargetData() | 1271 EventTargetData* XMLHttpRequest::ensureEventTargetData() |
1255 { | 1272 { |
1256 return &m_eventTargetData; | 1273 return &m_eventTargetData; |
1257 } | 1274 } |
1258 | 1275 |
1259 } // namespace WebCore | 1276 } // namespace WebCore |
OLD | NEW |