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 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 WTF_LOG(Network, "XMLHttpRequest %p open('%s', '%s', %d)", this, method.utf8
().data(), url.elidedString().utf8().data(), async); | 536 WTF_LOG(Network, "XMLHttpRequest %p open('%s', '%s', %d)", this, method.utf8
().data(), url.elidedString().utf8().data(), async); |
537 | 537 |
538 if (!internalAbort()) | 538 if (!internalAbort()) |
539 return; | 539 return; |
540 | 540 |
541 State previousState = m_state; | 541 State previousState = m_state; |
542 m_state = UNSENT; | 542 m_state = UNSENT; |
543 m_error = false; | 543 m_error = false; |
544 m_uploadComplete = false; | 544 m_uploadComplete = false; |
545 | 545 |
546 // clear stuff from possible previous load | |
547 clearResponse(); | |
548 clearRequest(); | |
549 | |
550 ASSERT(m_state == UNSENT); | |
551 | |
552 if (!isValidHTTPToken(method)) { | 546 if (!isValidHTTPToken(method)) { |
553 exceptionState.throwDOMException(SyntaxError, "'" + method + "' is not a
valid HTTP method."); | 547 exceptionState.throwDOMException(SyntaxError, "'" + method + "' is not a
valid HTTP method."); |
554 return; | 548 return; |
555 } | 549 } |
556 | 550 |
557 if (FetchUtils::isForbiddenMethod(method)) { | 551 if (FetchUtils::isForbiddenMethod(method)) { |
558 exceptionState.throwSecurityError("'" + method + "' HTTP method is unsup
ported."); | 552 exceptionState.throwSecurityError("'" + method + "' HTTP method is unsup
ported."); |
559 return; | 553 return; |
560 } | 554 } |
561 | 555 |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 | 883 |
890 bool sendFlag = m_loader; | 884 bool sendFlag = m_loader; |
891 | 885 |
892 // Response is cleared next, save needed progress event data. | 886 // Response is cleared next, save needed progress event data. |
893 long long expectedLength = m_response.expectedContentLength(); | 887 long long expectedLength = m_response.expectedContentLength(); |
894 long long receivedLength = m_receivedLength; | 888 long long receivedLength = m_receivedLength; |
895 | 889 |
896 if (!internalAbort()) | 890 if (!internalAbort()) |
897 return; | 891 return; |
898 | 892 |
899 clearResponse(); | |
900 | |
901 // Clear headers as required by the spec | |
902 m_requestHeaders.clear(); | |
903 | |
904 if (!((m_state <= OPENED && !sendFlag) || m_state == DONE)) { | 893 if (!((m_state <= OPENED && !sendFlag) || m_state == DONE)) { |
905 ASSERT(!m_loader); | 894 ASSERT(!m_loader); |
906 handleRequestError(0, EventTypeNames::abort, receivedLength, expectedLen
gth); | 895 handleRequestError(0, EventTypeNames::abort, receivedLength, expectedLen
gth); |
907 } | 896 } |
908 m_state = UNSENT; | 897 m_state = UNSENT; |
909 } | 898 } |
910 | 899 |
911 void XMLHttpRequest::clearVariablesForLoading() | 900 void XMLHttpRequest::clearVariablesForLoading() |
912 { | 901 { |
913 m_decoder.clear(); | 902 m_decoder.clear(); |
(...skipping 23 matching lines...) Expand all Loading... |
937 if (m_responseLegacyStream && m_state != DONE) | 926 if (m_responseLegacyStream && m_state != DONE) |
938 m_responseLegacyStream->abort(); | 927 m_responseLegacyStream->abort(); |
939 | 928 |
940 if (m_responseStream) { | 929 if (m_responseStream) { |
941 // When the stream is already closed (including canceled from the | 930 // When the stream is already closed (including canceled from the |
942 // user), |error| does nothing. | 931 // user), |error| does nothing. |
943 // FIXME: Create a more specific error. | 932 // FIXME: Create a more specific error. |
944 m_responseStream->error(DOMException::create(!m_async && m_exceptionCode
? m_exceptionCode : AbortError, "XMLHttpRequest::abort")); | 933 m_responseStream->error(DOMException::create(!m_async && m_exceptionCode
? m_exceptionCode : AbortError, "XMLHttpRequest::abort")); |
945 } | 934 } |
946 | 935 |
| 936 clearResponse(); |
| 937 clearRequest(); |
| 938 |
947 if (!m_loader) | 939 if (!m_loader) |
948 return true; | 940 return true; |
949 | 941 |
950 // Cancelling the ThreadableLoader m_loader may result in calling | 942 // Cancelling the ThreadableLoader m_loader may result in calling |
951 // window.onload synchronously. If such an onload handler contains open() | 943 // window.onload synchronously. If such an onload handler contains open() |
952 // call on the same XMLHttpRequest object, reentry happens. | 944 // call on the same XMLHttpRequest object, reentry happens. |
953 // | 945 // |
954 // If, window.onload contains open() and send(), m_loader will be set to | 946 // If, window.onload contains open() and send(), m_loader will be set to |
955 // non 0 value. So, we cannot continue the outer open(). In such case, | 947 // non 0 value. So, we cannot continue the outer open(). In such case, |
956 // just abort the outer open() by returning false. | 948 // just abort the outer open() by returning false. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 // this only when we clear the response holder variables above. | 983 // this only when we clear the response holder variables above. |
992 m_binaryResponseBuilder.clear(); | 984 m_binaryResponseBuilder.clear(); |
993 m_responseArrayBuffer.clear(); | 985 m_responseArrayBuffer.clear(); |
994 } | 986 } |
995 | 987 |
996 void XMLHttpRequest::clearRequest() | 988 void XMLHttpRequest::clearRequest() |
997 { | 989 { |
998 m_requestHeaders.clear(); | 990 m_requestHeaders.clear(); |
999 } | 991 } |
1000 | 992 |
1001 void XMLHttpRequest::handleDidFailGeneric() | |
1002 { | |
1003 clearResponse(); | |
1004 clearRequest(); | |
1005 | |
1006 m_error = true; | |
1007 } | |
1008 | |
1009 void XMLHttpRequest::dispatchProgressEvent(const AtomicString& type, long long r
eceivedLength, long long expectedLength) | 993 void XMLHttpRequest::dispatchProgressEvent(const AtomicString& type, long long r
eceivedLength, long long expectedLength) |
1010 { | 994 { |
1011 bool lengthComputable = expectedLength > 0 && receivedLength <= expectedLeng
th; | 995 bool lengthComputable = expectedLength > 0 && receivedLength <= expectedLeng
th; |
1012 unsigned long long loaded = receivedLength >= 0 ? static_cast<unsigned long
long>(receivedLength) : 0; | 996 unsigned long long loaded = receivedLength >= 0 ? static_cast<unsigned long
long>(receivedLength) : 0; |
1013 unsigned long long total = lengthComputable ? static_cast<unsigned long long
>(expectedLength) : 0; | 997 unsigned long long total = lengthComputable ? static_cast<unsigned long long
>(expectedLength) : 0; |
1014 | 998 |
1015 m_progressEventThrottle.dispatchProgressEvent(type, lengthComputable, loaded
, total); | 999 m_progressEventThrottle.dispatchProgressEvent(type, lengthComputable, loaded
, total); |
1016 | 1000 |
1017 if (type == EventTypeNames::loadend) | 1001 if (type == EventTypeNames::loadend) |
1018 InspectorInstrumentation::didDispatchXHRLoadendEvent(executionContext(),
this); | 1002 InspectorInstrumentation::didDispatchXHRLoadendEvent(executionContext(),
this); |
1019 } | 1003 } |
1020 | 1004 |
1021 void XMLHttpRequest::dispatchProgressEventFromSnapshot(const AtomicString& type) | 1005 void XMLHttpRequest::dispatchProgressEventFromSnapshot(const AtomicString& type) |
1022 { | 1006 { |
1023 dispatchProgressEvent(type, m_receivedLength, m_response.expectedContentLeng
th()); | 1007 dispatchProgressEvent(type, m_receivedLength, m_response.expectedContentLeng
th()); |
1024 } | 1008 } |
1025 | 1009 |
1026 void XMLHttpRequest::handleNetworkError() | 1010 void XMLHttpRequest::handleNetworkError() |
1027 { | 1011 { |
1028 WTF_LOG(Network, "XMLHttpRequest %p handleNetworkError()", this); | 1012 WTF_LOG(Network, "XMLHttpRequest %p handleNetworkError()", this); |
1029 | 1013 |
1030 // Response is cleared next, save needed progress event data. | 1014 // Response is cleared next, save needed progress event data. |
1031 long long expectedLength = m_response.expectedContentLength(); | 1015 long long expectedLength = m_response.expectedContentLength(); |
1032 long long receivedLength = m_receivedLength; | 1016 long long receivedLength = m_receivedLength; |
1033 | 1017 |
1034 if (!internalAbort()) | 1018 if (!internalAbort()) |
1035 return; | 1019 return; |
1036 | 1020 |
1037 handleDidFailGeneric(); | |
1038 handleRequestError(NetworkError, EventTypeNames::error, receivedLength, expe
ctedLength); | 1021 handleRequestError(NetworkError, EventTypeNames::error, receivedLength, expe
ctedLength); |
1039 } | 1022 } |
1040 | 1023 |
1041 void XMLHttpRequest::handleDidCancel() | 1024 void XMLHttpRequest::handleDidCancel() |
1042 { | 1025 { |
1043 WTF_LOG(Network, "XMLHttpRequest %p handleDidCancel()", this); | 1026 WTF_LOG(Network, "XMLHttpRequest %p handleDidCancel()", this); |
1044 | 1027 |
1045 // Response is cleared next, save needed progress event data. | 1028 // Response is cleared next, save needed progress event data. |
1046 long long expectedLength = m_response.expectedContentLength(); | 1029 long long expectedLength = m_response.expectedContentLength(); |
1047 long long receivedLength = m_receivedLength; | 1030 long long receivedLength = m_receivedLength; |
1048 | 1031 |
1049 handleDidFailGeneric(); | 1032 if (!internalAbort()) |
| 1033 return; |
| 1034 |
1050 handleRequestError(AbortError, EventTypeNames::abort, receivedLength, expect
edLength); | 1035 handleRequestError(AbortError, EventTypeNames::abort, receivedLength, expect
edLength); |
1051 } | 1036 } |
1052 | 1037 |
1053 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi
cString& type, long long receivedLength, long long expectedLength) | 1038 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi
cString& type, long long receivedLength, long long expectedLength) |
1054 { | 1039 { |
1055 WTF_LOG(Network, "XMLHttpRequest %p handleRequestError()", this); | 1040 WTF_LOG(Network, "XMLHttpRequest %p handleRequestError()", this); |
1056 | 1041 |
1057 // The request error steps for event 'type' and exception 'exceptionCode'. | 1042 // The request error steps for event 'type' and exception 'exceptionCode'. |
1058 | 1043 |
1059 if (!m_async && exceptionCode) { | 1044 if (!m_async && exceptionCode) { |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 { | 1475 { |
1491 WTF_LOG(Network, "XMLHttpRequest %p handleDidTimeout()", this); | 1476 WTF_LOG(Network, "XMLHttpRequest %p handleDidTimeout()", this); |
1492 | 1477 |
1493 // Response is cleared next, save needed progress event data. | 1478 // Response is cleared next, save needed progress event data. |
1494 long long expectedLength = m_response.expectedContentLength(); | 1479 long long expectedLength = m_response.expectedContentLength(); |
1495 long long receivedLength = m_receivedLength; | 1480 long long receivedLength = m_receivedLength; |
1496 | 1481 |
1497 if (!internalAbort()) | 1482 if (!internalAbort()) |
1498 return; | 1483 return; |
1499 | 1484 |
1500 handleDidFailGeneric(); | |
1501 handleRequestError(TimeoutError, EventTypeNames::timeout, receivedLength, ex
pectedLength); | 1485 handleRequestError(TimeoutError, EventTypeNames::timeout, receivedLength, ex
pectedLength); |
1502 } | 1486 } |
1503 | 1487 |
1504 void XMLHttpRequest::suspend() | 1488 void XMLHttpRequest::suspend() |
1505 { | 1489 { |
1506 m_progressEventThrottle.suspend(); | 1490 m_progressEventThrottle.suspend(); |
1507 } | 1491 } |
1508 | 1492 |
1509 void XMLHttpRequest::resume() | 1493 void XMLHttpRequest::resume() |
1510 { | 1494 { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 visitor->trace(m_responseStream); | 1531 visitor->trace(m_responseStream); |
1548 visitor->trace(m_streamSource); | 1532 visitor->trace(m_streamSource); |
1549 visitor->trace(m_responseDocument); | 1533 visitor->trace(m_responseDocument); |
1550 visitor->trace(m_responseDocumentParser); | 1534 visitor->trace(m_responseDocumentParser); |
1551 visitor->trace(m_progressEventThrottle); | 1535 visitor->trace(m_progressEventThrottle); |
1552 visitor->trace(m_upload); | 1536 visitor->trace(m_upload); |
1553 XMLHttpRequestEventTarget::trace(visitor); | 1537 XMLHttpRequestEventTarget::trace(visitor); |
1554 } | 1538 } |
1555 | 1539 |
1556 } // namespace blink | 1540 } // namespace blink |
OLD | NEW |