| 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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 ReadableStreamSource(XMLHttpRequest* owner, PassOwnPtr<WebDataConsumerHandle
> body) | 154 ReadableStreamSource(XMLHttpRequest* owner, PassOwnPtr<WebDataConsumerHandle
> body) |
| 155 : m_owner(owner) | 155 : m_owner(owner) |
| 156 , m_body(body) | 156 , m_body(body) |
| 157 , m_needsMore(false) | 157 , m_needsMore(false) |
| 158 , m_hasReadBody(false) | 158 , m_hasReadBody(false) |
| 159 , m_hasGotDidFinishLoading(false) | 159 , m_hasGotDidFinishLoading(false) |
| 160 { | 160 { |
| 161 if (m_body) { | 161 if (m_body) { |
| 162 // |m_body| has |this| as a raw pointer, but it is not a problem | 162 // |m_body| has |this| as a raw pointer, but it is not a problem |
| 163 // because |this| owns |m_body|. | 163 // because |this| owns |m_body|. |
| 164 m_body->registerClient(this); | 164 m_reader = m_body->obtainReader(this); |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 ~ReadableStreamSource() override { } | 167 ~ReadableStreamSource() override { } |
| 168 | 168 |
| 169 WebDataConsumerHandle* body() { return m_body.get(); } | 169 WebDataConsumerHandle* body() { return m_body.get(); } |
| 170 | 170 |
| 171 // UnderlyingSource | 171 // UnderlyingSource |
| 172 void pullSource() override | 172 void pullSource() override |
| 173 { | 173 { |
| 174 if (m_body) { | 174 if (m_body) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 UnderlyingSource::trace(visitor); | 222 UnderlyingSource::trace(visitor); |
| 223 } | 223 } |
| 224 | 224 |
| 225 private: | 225 private: |
| 226 void enqueueToStreamFromHandle() | 226 void enqueueToStreamFromHandle() |
| 227 { | 227 { |
| 228 ASSERT(m_body); | 228 ASSERT(m_body); |
| 229 while (m_needsMore) { | 229 while (m_needsMore) { |
| 230 const void* buffer = nullptr; | 230 const void* buffer = nullptr; |
| 231 size_t size = 0; | 231 size_t size = 0; |
| 232 Result result = m_body->beginRead(&buffer, WebDataConsumerHandle::Fl
agNone, &size); | 232 Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::
FlagNone, &size); |
| 233 if (result == WebDataConsumerHandle::ShouldWait) | 233 if (result == WebDataConsumerHandle::ShouldWait) |
| 234 return; | 234 return; |
| 235 if (result == WebDataConsumerHandle::Done) { | 235 if (result == WebDataConsumerHandle::Done) { |
| 236 m_hasReadBody = true; | 236 m_hasReadBody = true; |
| 237 if (m_hasGotDidFinishLoading) { | 237 if (m_hasGotDidFinishLoading) { |
| 238 // If we got didFinishLoading, we should close the stream | 238 // If we got didFinishLoading, we should close the stream |
| 239 // here. If we didn't, it's possible that the loading | 239 // here. If we didn't, it's possible that the loading |
| 240 // actually failed and didFail will be notified, so we | 240 // actually failed and didFail will be notified, so we |
| 241 // don't close the stream. | 241 // don't close the stream. |
| 242 m_stream->close(); | 242 m_stream->close(); |
| 243 } | 243 } |
| 244 m_needsMore = false; | 244 m_needsMore = false; |
| 245 return; | 245 return; |
| 246 } | 246 } |
| 247 if (result != WebDataConsumerHandle::Ok) { | 247 if (result != WebDataConsumerHandle::Ok) { |
| 248 m_stream->error(DOMException::create(NetworkError)); | 248 m_stream->error(DOMException::create(NetworkError)); |
| 249 m_owner->abort(); | 249 m_owner->abort(); |
| 250 m_needsMore = false; | 250 m_needsMore = false; |
| 251 return; | 251 return; |
| 252 } | 252 } |
| 253 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(size, 1)
; | 253 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(size, 1)
; |
| 254 memcpy(arrayBuffer->data(), buffer, size); | 254 memcpy(arrayBuffer->data(), buffer, size); |
| 255 result = m_body->endRead(size); | 255 result = m_reader->endRead(size); |
| 256 if (result != WebDataConsumerHandle::Ok) { | 256 if (result != WebDataConsumerHandle::Ok) { |
| 257 m_stream->error(DOMException::create(NetworkError)); | 257 m_stream->error(DOMException::create(NetworkError)); |
| 258 m_owner->abort(); | 258 m_owner->abort(); |
| 259 m_needsMore = false; | 259 m_needsMore = false; |
| 260 return; | 260 return; |
| 261 } | 261 } |
| 262 m_needsMore = m_stream->enqueue(DOMUint8Array::create(arrayBuffer.re
lease(), 0, size)); | 262 m_needsMore = m_stream->enqueue(DOMUint8Array::create(arrayBuffer.re
lease(), 0, size)); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 | 265 |
| 266 // This is RawPtr in non-oilpan build to avoid the reference cycle. To | 266 // This is RawPtr in non-oilpan build to avoid the reference cycle. To |
| 267 // avoid use-after free, the associated ReadableStream must be closed | 267 // avoid use-after free, the associated ReadableStream must be closed |
| 268 // or errored when m_owner is gone. | 268 // or errored when m_owner is gone. |
| 269 RawPtrWillBeMember<XMLHttpRequest> m_owner; | 269 RawPtrWillBeMember<XMLHttpRequest> m_owner; |
| 270 Member<ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBufferView>>
> m_stream; | 270 Member<ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBufferView>>
> m_stream; |
| 271 OwnPtr<WebDataConsumerHandle> m_body; | 271 OwnPtr<WebDataConsumerHandle> m_body; |
| 272 OwnPtr<WebDataConsumerHandle::Reader> m_reader; |
| 272 bool m_needsMore; | 273 bool m_needsMore; |
| 273 bool m_hasReadBody; | 274 bool m_hasReadBody; |
| 274 bool m_hasGotDidFinishLoading; | 275 bool m_hasGotDidFinishLoading; |
| 275 }; | 276 }; |
| 276 | 277 |
| 277 class XMLHttpRequest::BlobLoader final : public GarbageCollectedFinalized<XMLHtt
pRequest::BlobLoader>, public FileReaderLoaderClient { | 278 class XMLHttpRequest::BlobLoader final : public GarbageCollectedFinalized<XMLHtt
pRequest::BlobLoader>, public FileReaderLoaderClient { |
| 278 public: | 279 public: |
| 279 static BlobLoader* create(XMLHttpRequest* xhr, PassRefPtr<BlobDataHandle> ha
ndle) | 280 static BlobLoader* create(XMLHttpRequest* xhr, PassRefPtr<BlobDataHandle> ha
ndle) |
| 280 { | 281 { |
| 281 return new BlobLoader(xhr, handle); | 282 return new BlobLoader(xhr, handle); |
| (...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1864 visitor->trace(m_responseDocumentParser); | 1865 visitor->trace(m_responseDocumentParser); |
| 1865 visitor->trace(m_progressEventThrottle); | 1866 visitor->trace(m_progressEventThrottle); |
| 1866 visitor->trace(m_upload); | 1867 visitor->trace(m_upload); |
| 1867 visitor->trace(m_blobLoader); | 1868 visitor->trace(m_blobLoader); |
| 1868 XMLHttpRequestEventTarget::trace(visitor); | 1869 XMLHttpRequestEventTarget::trace(visitor); |
| 1869 DocumentParserClient::trace(visitor); | 1870 DocumentParserClient::trace(visitor); |
| 1870 ActiveDOMObject::trace(visitor); | 1871 ActiveDOMObject::trace(visitor); |
| 1871 } | 1872 } |
| 1872 | 1873 |
| 1873 } // namespace blink | 1874 } // namespace blink |
| OLD | NEW |