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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 return xmlHttpRequest.release(); | 165 return xmlHttpRequest.release(); |
166 } | 166 } |
167 | 167 |
168 XMLHttpRequest::XMLHttpRequest(ScriptExecutionContext* context, PassRefPtr<Secur ityOrigin> securityOrigin) | 168 XMLHttpRequest::XMLHttpRequest(ScriptExecutionContext* context, PassRefPtr<Secur ityOrigin> securityOrigin) |
169 : ActiveDOMObject(context) | 169 : ActiveDOMObject(context) |
170 , m_async(true) | 170 , m_async(true) |
171 , m_includeCredentials(false) | 171 , m_includeCredentials(false) |
172 , m_timeoutMilliseconds(0) | 172 , m_timeoutMilliseconds(0) |
173 , m_state(UNSENT) | 173 , m_state(UNSENT) |
174 , m_createdDocument(false) | 174 , m_createdDocument(false) |
175 , m_preventReentrant(false) | |
175 , m_error(false) | 176 , m_error(false) |
176 , m_uploadEventsAllowed(true) | 177 , m_uploadEventsAllowed(true) |
177 , m_uploadComplete(false) | 178 , m_uploadComplete(false) |
178 , m_sameOriginRequest(true) | 179 , m_sameOriginRequest(true) |
179 , m_receivedLength(0) | 180 , m_receivedLength(0) |
180 , m_lastSendLineNumber(0) | 181 , m_lastSendLineNumber(0) |
181 , m_exceptionCode(0) | 182 , m_exceptionCode(0) |
182 , m_progressEventThrottle(this) | 183 , m_progressEventThrottle(this) |
183 , m_responseTypeCode(ResponseTypeDefault) | 184 , m_responseTypeCode(ResponseTypeDefault) |
184 , m_protectionTimer(this, &XMLHttpRequest::dropProtection) | 185 , m_protectionTimer(this, &XMLHttpRequest::dropProtection) |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
474 && !name.startsWith(staticData->m_secHeaderPrefix, false); | 475 && !name.startsWith(staticData->m_secHeaderPrefix, false); |
475 } | 476 } |
476 | 477 |
477 void XMLHttpRequest::open(const String& method, const KURL& url, ExceptionState& es) | 478 void XMLHttpRequest::open(const String& method, const KURL& url, ExceptionState& es) |
478 { | 479 { |
479 open(method, url, true, es); | 480 open(method, url, true, es); |
480 } | 481 } |
481 | 482 |
482 void XMLHttpRequest::open(const String& method, const KURL& url, bool async, Exc eptionState& es) | 483 void XMLHttpRequest::open(const String& method, const KURL& url, bool async, Exc eptionState& es) |
483 { | 484 { |
485 if (m_preventReentrant) { | |
486 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("open", "XMLHttpRequest", "reentrant is not allowed.")); | |
487 return; | |
488 } | |
489 | |
484 internalAbort(); | 490 internalAbort(); |
485 State previousState = m_state; | 491 State previousState = m_state; |
486 m_state = UNSENT; | 492 m_state = UNSENT; |
487 m_error = false; | 493 m_error = false; |
488 m_uploadComplete = false; | 494 m_uploadComplete = false; |
489 | 495 |
490 // clear stuff from possible previous load | 496 // clear stuff from possible previous load |
491 clearResponse(); | 497 clearResponse(); |
492 clearRequest(); | 498 clearRequest(); |
493 | 499 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
559 { | 565 { |
560 KURL urlWithCredentials(url); | 566 KURL urlWithCredentials(url); |
561 urlWithCredentials.setUser(user); | 567 urlWithCredentials.setUser(user); |
562 urlWithCredentials.setPass(password); | 568 urlWithCredentials.setPass(password); |
563 | 569 |
564 open(method, urlWithCredentials, async, es); | 570 open(method, urlWithCredentials, async, es); |
565 } | 571 } |
566 | 572 |
567 bool XMLHttpRequest::initSend(ExceptionState& es) | 573 bool XMLHttpRequest::initSend(ExceptionState& es) |
568 { | 574 { |
575 if (m_preventReentrant) { | |
576 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("send", "XMLHttpRequest", "reentrant is not allowed.")); | |
577 return false; | |
578 } | |
579 | |
569 if (!scriptExecutionContext()) | 580 if (!scriptExecutionContext()) |
570 return false; | 581 return false; |
571 | 582 |
572 if (m_state != OPENED || m_loader) { | 583 if (m_state != OPENED || m_loader) { |
573 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("send", "XMLHttpRequest", "the object's state must be OPENED.")); | 584 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("send", "XMLHttpRequest", "the object's state must be OPENED.")); |
574 return false; | 585 return false; |
575 } | 586 } |
576 | 587 |
577 m_error = false; | 588 m_error = false; |
578 return true; | 589 return true; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 m_requestEntityBody = FormData::create(data, length); | 720 m_requestEntityBody = FormData::create(data, length); |
710 if (m_upload) | 721 if (m_upload) |
711 m_requestEntityBody->setAlwaysStream(true); | 722 m_requestEntityBody->setAlwaysStream(true); |
712 } | 723 } |
713 | 724 |
714 createRequest(es); | 725 createRequest(es); |
715 } | 726 } |
716 | 727 |
717 void XMLHttpRequest::sendForInspectorXHRReplay(PassRefPtr<FormData> formData, Ex ceptionState& es) | 728 void XMLHttpRequest::sendForInspectorXHRReplay(PassRefPtr<FormData> formData, Ex ceptionState& es) |
718 { | 729 { |
730 if (m_preventReentrant) { | |
731 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("sendForInspectorXHRReplay", "XMLHttpRequest", "reentrant is not allowed.")); | |
732 return; | |
733 } | |
734 | |
719 m_requestEntityBody = formData ? formData->deepCopy() : 0; | 735 m_requestEntityBody = formData ? formData->deepCopy() : 0; |
720 createRequest(es); | 736 createRequest(es); |
721 m_exceptionCode = es.code(); | 737 m_exceptionCode = es.code(); |
722 } | 738 } |
723 | 739 |
724 void XMLHttpRequest::createRequest(ExceptionState& es) | 740 void XMLHttpRequest::createRequest(ExceptionState& es) |
725 { | 741 { |
726 // Only GET request is supported for blob URL. | 742 // Only GET request is supported for blob URL. |
727 if (m_url.protocolIs("blob") && m_method != "GET") { | 743 if (m_url.protocolIs("blob") && m_method != "GET") { |
728 es.throwDOMException(NetworkError, ExceptionMessages::failedToExecute("s end", "XMLHttpRequest", "'GET' is the only method allowed for 'blob:' URLs.")); | 744 es.throwDOMException(NetworkError, ExceptionMessages::failedToExecute("s end", "XMLHttpRequest", "'GET' is the only method allowed for 'blob:' URLs.")); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
803 ThreadableLoader::loadResourceSynchronously(scriptExecutionContext(), re quest, *this, options); | 819 ThreadableLoader::loadResourceSynchronously(scriptExecutionContext(), re quest, *this, options); |
804 InspectorInstrumentation::didLoadXHRSynchronously(scriptExecutionContext ()); | 820 InspectorInstrumentation::didLoadXHRSynchronously(scriptExecutionContext ()); |
805 } | 821 } |
806 | 822 |
807 if (!m_exceptionCode && m_error) | 823 if (!m_exceptionCode && m_error) |
808 m_exceptionCode = NetworkError; | 824 m_exceptionCode = NetworkError; |
809 if (m_exceptionCode) | 825 if (m_exceptionCode) |
810 es.throwDOMException(m_exceptionCode); | 826 es.throwDOMException(m_exceptionCode); |
811 } | 827 } |
812 | 828 |
813 void XMLHttpRequest::abort() | 829 void XMLHttpRequest::abort(ExceptionState& es) |
814 { | 830 { |
831 if (m_preventReentrant) { | |
832 es.throwDOMException(InvalidStateError, ExceptionMessages::failedToExecu te("abort", "XMLHttpRequest", "reentrant is not allowed.")); | |
833 return; | |
834 } | |
835 | |
815 // internalAbort() calls dropProtection(), which may release the last refere nce. | 836 // internalAbort() calls dropProtection(), which may release the last refere nce. |
816 RefPtr<XMLHttpRequest> protect(this); | 837 RefPtr<XMLHttpRequest> protect(this); |
817 | 838 |
818 bool sendFlag = m_loader; | 839 bool sendFlag = m_loader; |
819 | 840 |
820 internalAbort(); | 841 internalAbort(); |
821 | 842 |
822 clearResponseBuffers(); | 843 clearResponseBuffers(); |
823 | 844 |
824 // Clear headers as required by the spec | 845 // Clear headers as required by the spec |
(...skipping 24 matching lines...) Expand all Loading... | |
849 m_decoder = 0; | 870 m_decoder = 0; |
850 | 871 |
851 InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this); | 872 InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this); |
852 | 873 |
853 if (m_responseStream && m_state != DONE) | 874 if (m_responseStream && m_state != DONE) |
854 m_responseStream->abort(); | 875 m_responseStream->abort(); |
855 | 876 |
856 if (!m_loader) | 877 if (!m_loader) |
857 return; | 878 return; |
858 | 879 |
880 m_preventReentrant = true; | |
859 m_loader->cancel(); | 881 m_loader->cancel(); |
Nate Chapin
2013/09/19 16:31:30
Is it possible to solve this similarly to http://s
| |
882 m_preventReentrant = false; | |
860 m_loader = 0; | 883 m_loader = 0; |
861 | 884 |
862 if (async == DropProtectionAsync) | 885 if (async == DropProtectionAsync) |
863 dropProtectionSoon(); | 886 dropProtectionSoon(); |
864 else | 887 else |
865 dropProtection(); | 888 dropProtection(); |
866 } | 889 } |
867 | 890 |
868 void XMLHttpRequest::clearResponse() | 891 void XMLHttpRequest::clearResponse() |
869 { | 892 { |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1294 { | 1317 { |
1295 return eventNames().interfaceForXMLHttpRequest; | 1318 return eventNames().interfaceForXMLHttpRequest; |
1296 } | 1319 } |
1297 | 1320 |
1298 ScriptExecutionContext* XMLHttpRequest::scriptExecutionContext() const | 1321 ScriptExecutionContext* XMLHttpRequest::scriptExecutionContext() const |
1299 { | 1322 { |
1300 return ActiveDOMObject::scriptExecutionContext(); | 1323 return ActiveDOMObject::scriptExecutionContext(); |
1301 } | 1324 } |
1302 | 1325 |
1303 } // namespace WebCore | 1326 } // namespace WebCore |
OLD | NEW |