| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 #include "platform/SharedBuffer.h" | 70 #include "platform/SharedBuffer.h" |
| 71 #include "platform/blob/BlobData.h" | 71 #include "platform/blob/BlobData.h" |
| 72 #include "platform/network/HTTPParsers.h" | 72 #include "platform/network/HTTPParsers.h" |
| 73 #include "platform/network/ParsedContentType.h" | 73 #include "platform/network/ParsedContentType.h" |
| 74 #include "platform/network/ResourceError.h" | 74 #include "platform/network/ResourceError.h" |
| 75 #include "platform/network/ResourceRequest.h" | 75 #include "platform/network/ResourceRequest.h" |
| 76 #include "public/platform/WebURLRequest.h" | 76 #include "public/platform/WebURLRequest.h" |
| 77 #include "wtf/Assertions.h" | 77 #include "wtf/Assertions.h" |
| 78 #include "wtf/StdLibExtras.h" | 78 #include "wtf/StdLibExtras.h" |
| 79 #include "wtf/text/CString.h" | 79 #include "wtf/text/CString.h" |
| 80 #include <memory> |
| 80 | 81 |
| 81 namespace blink { | 82 namespace blink { |
| 82 | 83 |
| 83 namespace { | 84 namespace { |
| 84 | 85 |
| 85 // This class protects the wrapper of the associated XMLHttpRequest object | 86 // This class protects the wrapper of the associated XMLHttpRequest object |
| 86 // via hasPendingActivity method which returns true if | 87 // via hasPendingActivity method which returns true if |
| 87 // m_eventDispatchRecursionLevel is positive. | 88 // m_eventDispatchRecursionLevel is positive. |
| 88 class ScopedEventDispatchProtect final { | 89 class ScopedEventDispatchProtect final { |
| 89 public: | 90 public: |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 if (!m_responseBlob) { | 328 if (!m_responseBlob) { |
| 328 if (m_downloadingToFile) { | 329 if (m_downloadingToFile) { |
| 329 ASSERT(!m_binaryResponseBuilder); | 330 ASSERT(!m_binaryResponseBuilder); |
| 330 | 331 |
| 331 // When responseType is set to "blob", we redirect the downloaded | 332 // When responseType is set to "blob", we redirect the downloaded |
| 332 // data to a file-handle directly in the browser process. We get | 333 // data to a file-handle directly in the browser process. We get |
| 333 // the file-path from the ResourceResponse directly instead of | 334 // the file-path from the ResourceResponse directly instead of |
| 334 // copying the bytes between the browser and the renderer. | 335 // copying the bytes between the browser and the renderer. |
| 335 m_responseBlob = Blob::create(createBlobDataHandleFromResponse()); | 336 m_responseBlob = Blob::create(createBlobDataHandleFromResponse()); |
| 336 } else { | 337 } else { |
| 337 OwnPtr<BlobData> blobData = BlobData::create(); | 338 std::unique_ptr<BlobData> blobData = BlobData::create(); |
| 338 size_t size = 0; | 339 size_t size = 0; |
| 339 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) { | 340 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) { |
| 340 size = m_binaryResponseBuilder->size(); | 341 size = m_binaryResponseBuilder->size(); |
| 341 blobData->appendBytes(m_binaryResponseBuilder->data(), size); | 342 blobData->appendBytes(m_binaryResponseBuilder->data(), size); |
| 342 blobData->setContentType(finalResponseMIMETypeWithFallback().low
er()); | 343 blobData->setContentType(finalResponseMIMETypeWithFallback().low
er()); |
| 343 m_binaryResponseBuilder.clear(); | 344 m_binaryResponseBuilder.clear(); |
| 344 } | 345 } |
| 345 m_responseBlob = Blob::create(BlobDataHandle::create(std::move(blobD
ata), size)); | 346 m_responseBlob = Blob::create(BlobDataHandle::create(std::move(blobD
ata), size)); |
| 346 } | 347 } |
| 347 } | 348 } |
| (...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 if (!m_loader) | 1017 if (!m_loader) |
| 1017 return true; | 1018 return true; |
| 1018 | 1019 |
| 1019 // Cancelling the ThreadableLoader m_loader may result in calling | 1020 // Cancelling the ThreadableLoader m_loader may result in calling |
| 1020 // window.onload synchronously. If such an onload handler contains open() | 1021 // window.onload synchronously. If such an onload handler contains open() |
| 1021 // call on the same XMLHttpRequest object, reentry happens. | 1022 // call on the same XMLHttpRequest object, reentry happens. |
| 1022 // | 1023 // |
| 1023 // If, window.onload contains open() and send(), m_loader will be set to | 1024 // If, window.onload contains open() and send(), m_loader will be set to |
| 1024 // non 0 value. So, we cannot continue the outer open(). In such case, | 1025 // non 0 value. So, we cannot continue the outer open(). In such case, |
| 1025 // just abort the outer open() by returning false. | 1026 // just abort the outer open() by returning false. |
| 1026 OwnPtr<ThreadableLoader> loader = std::move(m_loader); | 1027 std::unique_ptr<ThreadableLoader> loader = std::move(m_loader); |
| 1027 loader->cancel(); | 1028 loader->cancel(); |
| 1028 | 1029 |
| 1029 // If abort() called internalAbort() and a nested open() ended up | 1030 // If abort() called internalAbort() and a nested open() ended up |
| 1030 // clearing the error flag, but didn't send(), make sure the error | 1031 // clearing the error flag, but didn't send(), make sure the error |
| 1031 // flag is still set. | 1032 // flag is still set. |
| 1032 bool newLoadStarted = m_loader.get(); | 1033 bool newLoadStarted = m_loader.get(); |
| 1033 if (!newLoadStarted) | 1034 if (!newLoadStarted) |
| 1034 m_error = true; | 1035 m_error = true; |
| 1035 | 1036 |
| 1036 return !newLoadStarted; | 1037 return !newLoadStarted; |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1429 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); | 1430 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); |
| 1430 | 1431 |
| 1431 if (m_error) | 1432 if (m_error) |
| 1432 return; | 1433 return; |
| 1433 handleNetworkError(); | 1434 handleNetworkError(); |
| 1434 } | 1435 } |
| 1435 | 1436 |
| 1436 PassRefPtr<BlobDataHandle> XMLHttpRequest::createBlobDataHandleFromResponse() | 1437 PassRefPtr<BlobDataHandle> XMLHttpRequest::createBlobDataHandleFromResponse() |
| 1437 { | 1438 { |
| 1438 ASSERT(m_downloadingToFile); | 1439 ASSERT(m_downloadingToFile); |
| 1439 OwnPtr<BlobData> blobData = BlobData::create(); | 1440 std::unique_ptr<BlobData> blobData = BlobData::create(); |
| 1440 String filePath = m_response.downloadedFilePath(); | 1441 String filePath = m_response.downloadedFilePath(); |
| 1441 // If we errored out or got no data, we return an empty handle. | 1442 // If we errored out or got no data, we return an empty handle. |
| 1442 if (!filePath.isEmpty() && m_lengthDownloadedToFile) { | 1443 if (!filePath.isEmpty() && m_lengthDownloadedToFile) { |
| 1443 blobData->appendFile(filePath, 0, m_lengthDownloadedToFile, invalidFileT
ime()); | 1444 blobData->appendFile(filePath, 0, m_lengthDownloadedToFile, invalidFileT
ime()); |
| 1444 // FIXME: finalResponseMIMETypeWithFallback() defaults to | 1445 // FIXME: finalResponseMIMETypeWithFallback() defaults to |
| 1445 // text/xml which may be incorrect. Replace it with | 1446 // text/xml which may be incorrect. Replace it with |
| 1446 // finalResponseMIMEType() after compatibility investigation. | 1447 // finalResponseMIMEType() after compatibility investigation. |
| 1447 blobData->setContentType(finalResponseMIMETypeWithFallback().lower()); | 1448 blobData->setContentType(finalResponseMIMETypeWithFallback().lower()); |
| 1448 } | 1449 } |
| 1449 return BlobDataHandle::create(std::move(blobData), m_lengthDownloadedToFile)
; | 1450 return BlobDataHandle::create(std::move(blobData), m_lengthDownloadedToFile)
; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1502 if (m_uploadEventsAllowed) | 1503 if (m_uploadEventsAllowed) |
| 1503 m_upload->dispatchProgressEvent(bytesSent, totalBytesToBeSent); | 1504 m_upload->dispatchProgressEvent(bytesSent, totalBytesToBeSent); |
| 1504 | 1505 |
| 1505 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) { | 1506 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) { |
| 1506 m_uploadComplete = true; | 1507 m_uploadComplete = true; |
| 1507 if (m_uploadEventsAllowed) | 1508 if (m_uploadEventsAllowed) |
| 1508 m_upload->dispatchEventAndLoadEnd(EventTypeNames::load, true, bytesS
ent, totalBytesToBeSent); | 1509 m_upload->dispatchEventAndLoadEnd(EventTypeNames::load, true, bytesS
ent, totalBytesToBeSent); |
| 1509 } | 1510 } |
| 1510 } | 1511 } |
| 1511 | 1512 |
| 1512 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource
Response& response, PassOwnPtr<WebDataConsumerHandle> handle) | 1513 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource
Response& response, std::unique_ptr<WebDataConsumerHandle> handle) |
| 1513 { | 1514 { |
| 1514 ASSERT_UNUSED(handle, !handle); | 1515 ASSERT_UNUSED(handle, !handle); |
| 1515 WTF_LOG(Network, "XMLHttpRequest %p didReceiveResponse(%lu)", this, identifi
er); | 1516 WTF_LOG(Network, "XMLHttpRequest %p didReceiveResponse(%lu)", this, identifi
er); |
| 1516 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); | 1517 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); |
| 1517 | 1518 |
| 1518 m_response = response; | 1519 m_response = response; |
| 1519 if (!m_mimeTypeOverride.isEmpty()) { | 1520 if (!m_mimeTypeOverride.isEmpty()) { |
| 1520 m_response.setHTTPHeaderField(HTTPNames::Content_Type, m_mimeTypeOverrid
e); | 1521 m_response.setHTTPHeaderField(HTTPNames::Content_Type, m_mimeTypeOverrid
e); |
| 1521 m_finalResponseCharset = extractCharsetFromMediaType(m_mimeTypeOverride)
; | 1522 m_finalResponseCharset = extractCharsetFromMediaType(m_mimeTypeOverride)
; |
| 1522 } | 1523 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1537 m_responseDocumentParser->addClient(this); | 1538 m_responseDocumentParser->addClient(this); |
| 1538 } | 1539 } |
| 1539 ASSERT(m_responseDocumentParser); | 1540 ASSERT(m_responseDocumentParser); |
| 1540 | 1541 |
| 1541 if (m_responseDocumentParser->needsDecoder()) | 1542 if (m_responseDocumentParser->needsDecoder()) |
| 1542 m_responseDocumentParser->setDecoder(createDecoder()); | 1543 m_responseDocumentParser->setDecoder(createDecoder()); |
| 1543 | 1544 |
| 1544 m_responseDocumentParser->appendBytes(data, len); | 1545 m_responseDocumentParser->appendBytes(data, len); |
| 1545 } | 1546 } |
| 1546 | 1547 |
| 1547 PassOwnPtr<TextResourceDecoder> XMLHttpRequest::createDecoder() const | 1548 std::unique_ptr<TextResourceDecoder> XMLHttpRequest::createDecoder() const |
| 1548 { | 1549 { |
| 1549 if (m_responseTypeCode == ResponseTypeJSON) | 1550 if (m_responseTypeCode == ResponseTypeJSON) |
| 1550 return TextResourceDecoder::create("application/json", "UTF-8"); | 1551 return TextResourceDecoder::create("application/json", "UTF-8"); |
| 1551 | 1552 |
| 1552 if (!m_finalResponseCharset.isEmpty()) | 1553 if (!m_finalResponseCharset.isEmpty()) |
| 1553 return TextResourceDecoder::create("text/plain", m_finalResponseCharset)
; | 1554 return TextResourceDecoder::create("text/plain", m_finalResponseCharset)
; |
| 1554 | 1555 |
| 1555 // allow TextResourceDecoder to look inside the m_response if it's XML or HT
ML | 1556 // allow TextResourceDecoder to look inside the m_response if it's XML or HT
ML |
| 1556 if (responseIsXML()) { | 1557 if (responseIsXML()) { |
| 1557 OwnPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("appli
cation/xml"); | 1558 std::unique_ptr<TextResourceDecoder> decoder = TextResourceDecoder::crea
te("application/xml"); |
| 1558 // Don't stop on encoding errors, unlike it is done for other kinds | 1559 // Don't stop on encoding errors, unlike it is done for other kinds |
| 1559 // of XML resources. This matches the behavior of previous WebKit | 1560 // of XML resources. This matches the behavior of previous WebKit |
| 1560 // versions, Firefox and Opera. | 1561 // versions, Firefox and Opera. |
| 1561 decoder->useLenientXMLDecoding(); | 1562 decoder->useLenientXMLDecoding(); |
| 1562 | 1563 |
| 1563 return decoder; | 1564 return decoder; |
| 1564 } | 1565 } |
| 1565 | 1566 |
| 1566 if (responseIsHTML()) | 1567 if (responseIsHTML()) |
| 1567 return TextResourceDecoder::create("text/html", "UTF-8"); | 1568 return TextResourceDecoder::create("text/html", "UTF-8"); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1709 visitor->trace(m_responseArrayBuffer); | 1710 visitor->trace(m_responseArrayBuffer); |
| 1710 visitor->trace(m_progressEventThrottle); | 1711 visitor->trace(m_progressEventThrottle); |
| 1711 visitor->trace(m_upload); | 1712 visitor->trace(m_upload); |
| 1712 visitor->trace(m_blobLoader); | 1713 visitor->trace(m_blobLoader); |
| 1713 XMLHttpRequestEventTarget::trace(visitor); | 1714 XMLHttpRequestEventTarget::trace(visitor); |
| 1714 DocumentParserClient::trace(visitor); | 1715 DocumentParserClient::trace(visitor); |
| 1715 ActiveDOMObject::trace(visitor); | 1716 ActiveDOMObject::trace(visitor); |
| 1716 } | 1717 } |
| 1717 | 1718 |
| 1718 } // namespace blink | 1719 } // namespace blink |
| OLD | NEW |