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 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 flushAction = FlushDeferredProgressEvent; | 434 flushAction = FlushDeferredProgressEvent; |
435 else | 435 else |
436 flushAction = FlushProgressEvent; | 436 flushAction = FlushProgressEvent; |
437 } | 437 } |
438 m_progressEventThrottle.dispatchReadyStateChangeEvent(XMLHttpRequestProg
ressEvent::create(EventTypeNames::readystatechange), flushAction); | 438 m_progressEventThrottle.dispatchReadyStateChangeEvent(XMLHttpRequestProg
ressEvent::create(EventTypeNames::readystatechange), flushAction); |
439 } | 439 } |
440 | 440 |
441 InspectorInstrumentation::didDispatchXHRReadyStateChangeEvent(cookie); | 441 InspectorInstrumentation::didDispatchXHRReadyStateChangeEvent(cookie); |
442 if (m_state == DONE && !m_error) { | 442 if (m_state == DONE && !m_error) { |
443 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDi
spatchXHRLoadEvent(executionContext(), this); | 443 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDi
spatchXHRLoadEvent(executionContext(), this); |
444 m_progressEventThrottle.dispatchEvent(XMLHttpRequestProgressEvent::creat
e(EventTypeNames::load)); | 444 dispatchThrottledProgressEventSnapshot(EventTypeNames::load); |
445 InspectorInstrumentation::didDispatchXHRLoadEvent(cookie); | 445 InspectorInstrumentation::didDispatchXHRLoadEvent(cookie); |
446 m_progressEventThrottle.dispatchEvent(XMLHttpRequestProgressEvent::creat
e(EventTypeNames::loadend)); | 446 dispatchThrottledProgressEventSnapshot(EventTypeNames::loadend); |
447 } | 447 } |
448 } | 448 } |
449 | 449 |
450 void XMLHttpRequest::setWithCredentials(bool value, ExceptionState& exceptionSta
te) | 450 void XMLHttpRequest::setWithCredentials(bool value, ExceptionState& exceptionSta
te) |
451 { | 451 { |
452 if (m_state > OPENED || m_loader) { | 452 if (m_state > OPENED || m_loader) { |
453 exceptionState.throwDOMException(InvalidStateError, ExceptionMessages::f
ailedToSet("withCredentials", "XMLHttpRequest", "the value may only be set if th
e object's state is UNSENT or OPENED.")); | 453 exceptionState.throwDOMException(InvalidStateError, ExceptionMessages::f
ailedToSet("withCredentials", "XMLHttpRequest", "the value may only be set if th
e object's state is UNSENT or OPENED.")); |
454 return; | 454 return; |
455 } | 455 } |
456 | 456 |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 | 849 |
850 void XMLHttpRequest::abort() | 850 void XMLHttpRequest::abort() |
851 { | 851 { |
852 LOG(Network, "XMLHttpRequest %p abort()", this); | 852 LOG(Network, "XMLHttpRequest %p abort()", this); |
853 | 853 |
854 // internalAbort() calls dropProtection(), which may release the last refere
nce. | 854 // internalAbort() calls dropProtection(), which may release the last refere
nce. |
855 RefPtr<XMLHttpRequest> protect(this); | 855 RefPtr<XMLHttpRequest> protect(this); |
856 | 856 |
857 bool sendFlag = m_loader; | 857 bool sendFlag = m_loader; |
858 | 858 |
| 859 // Response is cleared next, save needed progress event data. |
| 860 long long expectedLength = m_response.expectedContentLength(); |
| 861 long long receivedLength = m_receivedLength; |
| 862 |
859 if (!internalAbort()) | 863 if (!internalAbort()) |
860 return; | 864 return; |
861 | 865 |
862 clearResponse(); | 866 clearResponse(); |
863 | 867 |
864 // Clear headers as required by the spec | 868 // Clear headers as required by the spec |
865 m_requestHeaders.clear(); | 869 m_requestHeaders.clear(); |
866 | 870 |
867 if (!((m_state <= OPENED && !sendFlag) || m_state == DONE)) { | 871 if (!((m_state <= OPENED && !sendFlag) || m_state == DONE)) { |
868 ASSERT(!m_loader); | 872 ASSERT(!m_loader); |
869 handleRequestError(0, EventTypeNames::abort); | 873 handleRequestError(0, EventTypeNames::abort, receivedLength, expectedLen
gth); |
870 } | 874 } |
871 m_state = UNSENT; | 875 m_state = UNSENT; |
872 } | 876 } |
873 | 877 |
874 void XMLHttpRequest::clearVariablesForLoading() | 878 void XMLHttpRequest::clearVariablesForLoading() |
875 { | 879 { |
876 // FIXME: when we add the support for multi-part XHR, we will have to think
be careful with this initialization. | 880 // FIXME: when we add the support for multi-part XHR, we will have to think
be careful with this initialization. |
877 m_receivedLength = 0; | 881 m_receivedLength = 0; |
878 m_decoder.clear(); | 882 m_decoder.clear(); |
879 | 883 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 } | 955 } |
952 | 956 |
953 void XMLHttpRequest::handleDidFailGeneric() | 957 void XMLHttpRequest::handleDidFailGeneric() |
954 { | 958 { |
955 clearResponse(); | 959 clearResponse(); |
956 clearRequest(); | 960 clearRequest(); |
957 | 961 |
958 m_error = true; | 962 m_error = true; |
959 } | 963 } |
960 | 964 |
961 void XMLHttpRequest::dispatchEventAndLoadEnd(const AtomicString& type) | 965 void XMLHttpRequest::dispatchEventAndLoadEnd(const AtomicString& type, long long
receivedLength, long long expectedLength) |
962 { | 966 { |
963 if (!m_uploadComplete) { | 967 bool lengthComputable = expectedLength > 0 && receivedLength <= expectedLeng
th; |
964 m_uploadComplete = true; | 968 unsigned long long loaded = receivedLength >= 0 ? static_cast<unsigned long
long>(receivedLength) : 0; |
965 if (m_upload && m_uploadEventsAllowed) | 969 unsigned long long total = lengthComputable ? static_cast<unsigned long long
>(expectedLength) : 0; |
966 m_upload->dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::creat
e(type)); | 970 |
967 } | 971 m_progressEventThrottle.dispatchEventAndLoadEnd(type, lengthComputable, load
ed, total); |
968 m_progressEventThrottle.dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent:
:create(type)); | |
969 } | 972 } |
970 | 973 |
971 void XMLHttpRequest::dispatchThrottledProgressEvent() | 974 void XMLHttpRequest::dispatchThrottledProgressEvent(const AtomicString& type, lo
ng long receivedLength, long long expectedLength) |
972 { | 975 { |
973 long long expectedLength = m_response.expectedContentLength(); | 976 bool lengthComputable = expectedLength > 0 && receivedLength <= expectedLeng
th; |
974 bool lengthComputable = expectedLength > 0 && m_receivedLength <= expectedLe
ngth; | 977 unsigned long long loaded = receivedLength >= 0 ? static_cast<unsigned long
long>(receivedLength) : 0; |
975 unsigned long long total = lengthComputable ? expectedLength : 0; | 978 unsigned long long total = lengthComputable ? static_cast<unsigned long long
>(expectedLength) : 0; |
976 | 979 |
977 m_progressEventThrottle.dispatchProgressEvent(lengthComputable, m_receivedLe
ngth, total); | 980 if (type == EventTypeNames::progress) |
| 981 m_progressEventThrottle.dispatchProgressEvent(lengthComputable, loaded,
total); |
| 982 else |
| 983 m_progressEventThrottle.dispatchEvent(XMLHttpRequestProgressEvent::creat
e(type, lengthComputable, loaded, total)); |
| 984 } |
| 985 |
| 986 void XMLHttpRequest::dispatchThrottledProgressEventSnapshot(const AtomicString&
type) |
| 987 { |
| 988 return dispatchThrottledProgressEvent(type, m_receivedLength, m_response.exp
ectedContentLength()); |
978 } | 989 } |
979 | 990 |
980 void XMLHttpRequest::handleNetworkError() | 991 void XMLHttpRequest::handleNetworkError() |
981 { | 992 { |
982 LOG(Network, "XMLHttpRequest %p handleNetworkError()", this); | 993 LOG(Network, "XMLHttpRequest %p handleNetworkError()", this); |
983 | 994 |
| 995 // Response is cleared next, save needed progress event data. |
| 996 long long expectedLength = m_response.expectedContentLength(); |
| 997 long long receivedLength = m_receivedLength; |
| 998 |
984 handleDidFailGeneric(); | 999 handleDidFailGeneric(); |
985 handleRequestError(NetworkError, EventTypeNames::error); | 1000 handleRequestError(NetworkError, EventTypeNames::error, receivedLength, expe
ctedLength); |
986 internalAbort(); | 1001 internalAbort(); |
987 } | 1002 } |
988 | 1003 |
989 void XMLHttpRequest::handleDidCancel() | 1004 void XMLHttpRequest::handleDidCancel() |
990 { | 1005 { |
991 LOG(Network, "XMLHttpRequest %p handleDidCancel()", this); | 1006 LOG(Network, "XMLHttpRequest %p handleDidCancel()", this); |
992 | 1007 |
| 1008 // Response is cleared next, save needed progress event data. |
| 1009 long long expectedLength = m_response.expectedContentLength(); |
| 1010 long long receivedLength = m_receivedLength; |
| 1011 |
993 handleDidFailGeneric(); | 1012 handleDidFailGeneric(); |
994 handleRequestError(AbortError, EventTypeNames::abort); | 1013 handleRequestError(AbortError, EventTypeNames::abort, receivedLength, expect
edLength); |
995 } | 1014 } |
996 | 1015 |
997 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi
cString& type) | 1016 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi
cString& type, long long receivedLength, long long expectedLength) |
998 { | 1017 { |
999 LOG(Network, "XMLHttpRequest %p handleRequestError()", this); | 1018 LOG(Network, "XMLHttpRequest %p handleRequestError()", this); |
1000 | 1019 |
1001 // The request error steps for event 'type' and exception 'exceptionCode'. | 1020 // The request error steps for event 'type' and exception 'exceptionCode'. |
1002 | 1021 |
1003 if (!m_async && exceptionCode) { | 1022 if (!m_async && exceptionCode) { |
1004 m_state = DONE; | 1023 m_state = DONE; |
1005 m_exceptionCode = exceptionCode; | 1024 m_exceptionCode = exceptionCode; |
1006 return; | 1025 return; |
1007 } | 1026 } |
1008 // With m_error set, the state change steps are minimal: any pending | 1027 // With m_error set, the state change steps are minimal: any pending |
1009 // progress event is flushed + a readystatechange is dispatched. | 1028 // progress event is flushed + a readystatechange is dispatched. |
1010 // No new progress events dispatched; as required, that happens at | 1029 // No new progress events dispatched; as required, that happens at |
1011 // the end here. | 1030 // the end here. |
1012 ASSERT(m_error); | 1031 ASSERT(m_error); |
1013 changeState(DONE); | 1032 changeState(DONE); |
1014 | 1033 |
1015 if (!m_uploadComplete) { | 1034 if (!m_uploadComplete) { |
1016 m_uploadComplete = true; | 1035 m_uploadComplete = true; |
1017 if (m_upload && m_uploadEventsAllowed) | 1036 if (m_upload && m_uploadEventsAllowed) |
1018 m_upload->handleRequestError(type); | 1037 m_upload->handleRequestError(type); |
1019 } | 1038 } |
1020 | 1039 |
1021 dispatchThrottledProgressEvent(); | 1040 dispatchThrottledProgressEvent(EventTypeNames::progress, receivedLength, exp
ectedLength); |
1022 m_progressEventThrottle.dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent:
:create(type)); | 1041 dispatchEventAndLoadEnd(type, receivedLength, expectedLength); |
1023 } | 1042 } |
1024 | 1043 |
1025 void XMLHttpRequest::dropProtectionSoon() | 1044 void XMLHttpRequest::dropProtectionSoon() |
1026 { | 1045 { |
1027 m_dropProtectionRunner.runAsync(); | 1046 m_dropProtectionRunner.runAsync(); |
1028 } | 1047 } |
1029 | 1048 |
1030 void XMLHttpRequest::dropProtection() | 1049 void XMLHttpRequest::dropProtection() |
1031 { | 1050 { |
1032 unsetPendingActivity(this); | 1051 unsetPendingActivity(this); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 | 1231 |
1213 if (m_error) | 1232 if (m_error) |
1214 return; | 1233 return; |
1215 | 1234 |
1216 if (m_state < HEADERS_RECEIVED) | 1235 if (m_state < HEADERS_RECEIVED) |
1217 changeState(HEADERS_RECEIVED); | 1236 changeState(HEADERS_RECEIVED); |
1218 | 1237 |
1219 if (m_decoder) | 1238 if (m_decoder) |
1220 m_responseText = m_responseText.concatenateWith(m_decoder->flush()); | 1239 m_responseText = m_responseText.concatenateWith(m_decoder->flush()); |
1221 | 1240 |
1222 clearVariablesForLoading(); | |
1223 | |
1224 if (m_responseStream) | 1241 if (m_responseStream) |
1225 m_responseStream->finalize(); | 1242 m_responseStream->finalize(); |
1226 | 1243 |
1227 InspectorInstrumentation::didFinishXHRLoading(executionContext(), this, iden
tifier, m_responseText, m_url, m_lastSendURL, m_lastSendLineNumber); | 1244 InspectorInstrumentation::didFinishXHRLoading(executionContext(), this, iden
tifier, m_responseText, m_url, m_lastSendURL, m_lastSendLineNumber); |
1228 | 1245 |
1229 // Prevent dropProtection releasing the last reference, and retain |this| un
til the end of this method. | 1246 // Prevent dropProtection releasing the last reference, and retain |this| un
til the end of this method. |
1230 RefPtr<XMLHttpRequest> protect(this); | 1247 RefPtr<XMLHttpRequest> protect(this); |
1231 | 1248 |
1232 if (m_loader) { | 1249 if (m_loader) { |
1233 m_loader = 0; | 1250 m_loader = 0; |
1234 dropProtection(); | 1251 dropProtection(); |
1235 } | 1252 } |
1236 | 1253 |
1237 changeState(DONE); | 1254 changeState(DONE); |
| 1255 |
| 1256 clearVariablesForLoading(); |
1238 } | 1257 } |
1239 | 1258 |
1240 void XMLHttpRequest::didSendData(unsigned long long bytesSent, unsigned long lon
g totalBytesToBeSent) | 1259 void XMLHttpRequest::didSendData(unsigned long long bytesSent, unsigned long lon
g totalBytesToBeSent) |
1241 { | 1260 { |
1242 LOG(Network, "XMLHttpRequest %p didSendData(%llu, %llu)", this, bytesSent, t
otalBytesToBeSent); | 1261 LOG(Network, "XMLHttpRequest %p didSendData(%llu, %llu)", this, bytesSent, t
otalBytesToBeSent); |
1243 | 1262 |
1244 if (!m_upload) | 1263 if (!m_upload) |
1245 return; | 1264 return; |
1246 | 1265 |
1247 if (m_uploadEventsAllowed) | 1266 if (m_uploadEventsAllowed) |
1248 m_upload->dispatchProgressEvent(bytesSent, totalBytesToBeSent); | 1267 m_upload->dispatchProgressEvent(bytesSent, totalBytesToBeSent); |
1249 | 1268 |
1250 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) { | 1269 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) { |
1251 m_uploadComplete = true; | 1270 m_uploadComplete = true; |
1252 if (m_uploadEventsAllowed) | 1271 if (m_uploadEventsAllowed) |
1253 m_upload->dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::creat
e(EventTypeNames::load)); | 1272 m_upload->dispatchEventAndLoadEnd(EventTypeNames::load, true, bytesS
ent, totalBytesToBeSent); |
1254 } | 1273 } |
1255 } | 1274 } |
1256 | 1275 |
1257 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource
Response& response) | 1276 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource
Response& response) |
1258 { | 1277 { |
1259 LOG(Network, "XMLHttpRequest %p didReceiveResponse(%lu)", this, identifier); | 1278 LOG(Network, "XMLHttpRequest %p didReceiveResponse(%lu)", this, identifier); |
1260 | 1279 |
1261 InspectorInstrumentation::didReceiveXHRResponse(executionContext(), identifi
er); | 1280 InspectorInstrumentation::didReceiveXHRResponse(executionContext(), identifi
er); |
1262 | 1281 |
1263 m_response = response; | 1282 m_response = response; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 m_responseStream = Stream::create(executionContext(), responseMIMETy
pe()); | 1333 m_responseStream = Stream::create(executionContext(), responseMIMETy
pe()); |
1315 m_responseStream->addData(data, len); | 1334 m_responseStream->addData(data, len); |
1316 } | 1335 } |
1317 | 1336 |
1318 if (m_error) | 1337 if (m_error) |
1319 return; | 1338 return; |
1320 | 1339 |
1321 m_receivedLength += len; | 1340 m_receivedLength += len; |
1322 | 1341 |
1323 if (m_async) | 1342 if (m_async) |
1324 dispatchThrottledProgressEvent(); | 1343 dispatchThrottledProgressEventSnapshot(EventTypeNames::progress); |
1325 | 1344 |
1326 if (m_state != LOADING) { | 1345 if (m_state != LOADING) { |
1327 changeState(LOADING); | 1346 changeState(LOADING); |
1328 } else { | 1347 } else { |
1329 // Firefox calls readyStateChanged every time it receives data. Do | 1348 // Firefox calls readyStateChanged every time it receives data. Do |
1330 // the same to align with Firefox. | 1349 // the same to align with Firefox. |
1331 // | 1350 // |
1332 // FIXME: Make our implementation and the spec consistent. This | 1351 // FIXME: Make our implementation and the spec consistent. This |
1333 // behavior was needed when the progress event was not available. | 1352 // behavior was needed when the progress event was not available. |
1334 dispatchReadyStateChangeEvent(); | 1353 dispatchReadyStateChangeEvent(); |
1335 } | 1354 } |
1336 } | 1355 } |
1337 | 1356 |
1338 void XMLHttpRequest::handleDidTimeout() | 1357 void XMLHttpRequest::handleDidTimeout() |
1339 { | 1358 { |
1340 LOG(Network, "XMLHttpRequest %p handleDidTimeout()", this); | 1359 LOG(Network, "XMLHttpRequest %p handleDidTimeout()", this); |
1341 | 1360 |
1342 // internalAbort() calls dropProtection(), which may release the last refere
nce. | 1361 // internalAbort() calls dropProtection(), which may release the last refere
nce. |
1343 RefPtr<XMLHttpRequest> protect(this); | 1362 RefPtr<XMLHttpRequest> protect(this); |
1344 | 1363 |
| 1364 // Response is cleared next, save needed progress event data. |
| 1365 long long expectedLength = m_response.expectedContentLength(); |
| 1366 long long receivedLength = m_receivedLength; |
| 1367 |
1345 if (!internalAbort()) | 1368 if (!internalAbort()) |
1346 return; | 1369 return; |
1347 | 1370 |
1348 handleDidFailGeneric(); | 1371 handleDidFailGeneric(); |
1349 handleRequestError(TimeoutError, EventTypeNames::timeout); | 1372 handleRequestError(TimeoutError, EventTypeNames::timeout, receivedLength, ex
pectedLength); |
1350 } | 1373 } |
1351 | 1374 |
1352 void XMLHttpRequest::suspend() | 1375 void XMLHttpRequest::suspend() |
1353 { | 1376 { |
1354 m_progressEventThrottle.suspend(); | 1377 m_progressEventThrottle.suspend(); |
1355 } | 1378 } |
1356 | 1379 |
1357 void XMLHttpRequest::resume() | 1380 void XMLHttpRequest::resume() |
1358 { | 1381 { |
1359 m_progressEventThrottle.resume(); | 1382 m_progressEventThrottle.resume(); |
(...skipping 14 matching lines...) Expand all Loading... |
1374 { | 1397 { |
1375 return EventTargetNames::XMLHttpRequest; | 1398 return EventTargetNames::XMLHttpRequest; |
1376 } | 1399 } |
1377 | 1400 |
1378 ExecutionContext* XMLHttpRequest::executionContext() const | 1401 ExecutionContext* XMLHttpRequest::executionContext() const |
1379 { | 1402 { |
1380 return ActiveDOMObject::executionContext(); | 1403 return ActiveDOMObject::executionContext(); |
1381 } | 1404 } |
1382 | 1405 |
1383 } // namespace WebCore | 1406 } // namespace WebCore |
OLD | NEW |