Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp

Issue 2325093002: Replace ASSERT*() with DCHECK*() in core/xmlhttprequest/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 // via hasPendingActivity method which returns true if 87 // via hasPendingActivity method which returns true if
88 // m_eventDispatchRecursionLevel is positive. 88 // m_eventDispatchRecursionLevel is positive.
89 class ScopedEventDispatchProtect final { 89 class ScopedEventDispatchProtect final {
90 public: 90 public:
91 explicit ScopedEventDispatchProtect(int* level) : m_level(level) 91 explicit ScopedEventDispatchProtect(int* level) : m_level(level)
92 { 92 {
93 ++*m_level; 93 ++*m_level;
94 } 94 }
95 ~ScopedEventDispatchProtect() 95 ~ScopedEventDispatchProtect()
96 { 96 {
97 ASSERT(*m_level > 0); 97 DCHECK_GT(*m_level, 0);
98 --*m_level; 98 --*m_level;
99 } 99 }
100 100
101 private: 101 private:
102 int* const m_level; 102 int* const m_level;
103 }; 103 };
104 104
105 void replaceCharsetInMediaType(String& mediaType, const String& charsetValue) 105 void replaceCharsetInMediaType(String& mediaType, const String& charsetValue)
106 { 106 {
107 unsigned pos = 0, len = 0; 107 unsigned pos = 0, len = 0;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 public: 164 public:
165 static BlobLoader* create(XMLHttpRequest* xhr, PassRefPtr<BlobDataHandle> ha ndle) 165 static BlobLoader* create(XMLHttpRequest* xhr, PassRefPtr<BlobDataHandle> ha ndle)
166 { 166 {
167 return new BlobLoader(xhr, std::move(handle)); 167 return new BlobLoader(xhr, std::move(handle));
168 } 168 }
169 169
170 // FileReaderLoaderClient functions. 170 // FileReaderLoaderClient functions.
171 void didStartLoading() override {} 171 void didStartLoading() override {}
172 void didReceiveDataForClient(const char* data, unsigned length) override 172 void didReceiveDataForClient(const char* data, unsigned length) override
173 { 173 {
174 ASSERT(length <= INT_MAX); 174 DCHECK_LE(length, static_cast<unsigned>(INT_MAX));
175 m_xhr->didReceiveData(data, length); 175 m_xhr->didReceiveData(data, length);
176 } 176 }
177 void didFinishLoading() override 177 void didFinishLoading() override
178 { 178 {
179 m_xhr->didFinishLoadingFromBlob(); 179 m_xhr->didFinishLoadingFromBlob();
180 } 180 }
181 void didFail(FileError::ErrorCode error) override 181 void didFail(FileError::ErrorCode error) override
182 { 182 {
183 m_xhr->didFailLoadingFromBlob(); 183 m_xhr->didFailLoadingFromBlob();
184 } 184 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 , m_responseTextOverflow(false) 247 , m_responseTextOverflow(false)
248 { 248 {
249 } 249 }
250 250
251 XMLHttpRequest::~XMLHttpRequest() 251 XMLHttpRequest::~XMLHttpRequest()
252 { 252 {
253 } 253 }
254 254
255 Document* XMLHttpRequest::document() const 255 Document* XMLHttpRequest::document() const
256 { 256 {
257 ASSERT(getExecutionContext()->isDocument()); 257 DCHECK(getExecutionContext()->isDocument());
258 return toDocument(getExecutionContext()); 258 return toDocument(getExecutionContext());
259 } 259 }
260 260
261 SecurityOrigin* XMLHttpRequest::getSecurityOrigin() const 261 SecurityOrigin* XMLHttpRequest::getSecurityOrigin() const
262 { 262 {
263 return m_isolatedWorldSecurityOrigin ? m_isolatedWorldSecurityOrigin.get() : getExecutionContext()->getSecurityOrigin(); 263 return m_isolatedWorldSecurityOrigin ? m_isolatedWorldSecurityOrigin.get() : getExecutionContext()->getSecurityOrigin();
264 } 264 }
265 265
266 XMLHttpRequest::State XMLHttpRequest::readyState() const 266 XMLHttpRequest::State XMLHttpRequest::readyState() const
267 { 267 {
268 return m_state; 268 return m_state;
269 } 269 }
270 270
271 ScriptString XMLHttpRequest::responseText(ExceptionState& exceptionState) 271 ScriptString XMLHttpRequest::responseText(ExceptionState& exceptionState)
272 { 272 {
273 if (m_responseTypeCode != ResponseTypeDefault && m_responseTypeCode != Respo nseTypeText) { 273 if (m_responseTypeCode != ResponseTypeDefault && m_responseTypeCode != Respo nseTypeText) {
274 exceptionState.throwDOMException(InvalidStateError, "The value is only a ccessible if the object's 'responseType' is '' or 'text' (was '" + responseType( ) + "')."); 274 exceptionState.throwDOMException(InvalidStateError, "The value is only a ccessible if the object's 'responseType' is '' or 'text' (was '" + responseType( ) + "').");
275 return ScriptString(); 275 return ScriptString();
276 } 276 }
277 if (m_error || (m_state != kLoading && m_state != kDone)) 277 if (m_error || (m_state != kLoading && m_state != kDone))
278 return ScriptString(); 278 return ScriptString();
279 return m_responseText; 279 return m_responseText;
280 } 280 }
281 281
282 ScriptString XMLHttpRequest::responseJSONSource() 282 ScriptString XMLHttpRequest::responseJSONSource()
283 { 283 {
284 ASSERT(m_responseTypeCode == ResponseTypeJSON); 284 DCHECK_EQ(m_responseTypeCode, ResponseTypeJSON);
285 285
286 if (m_error || m_state != kDone) 286 if (m_error || m_state != kDone)
287 return ScriptString(); 287 return ScriptString();
288 return m_responseText; 288 return m_responseText;
289 } 289 }
290 290
291 void XMLHttpRequest::initResponseDocument() 291 void XMLHttpRequest::initResponseDocument()
292 { 292 {
293 // The W3C spec requires the final MIME type to be some valid XML type, or t ext/html. 293 // The W3C spec requires the final MIME type to be some valid XML type, or t ext/html.
294 // If it is text/html, then the responseType of "document" must have been su pplied explicitly. 294 // If it is text/html, then the responseType of "document" must have been su pplied explicitly.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 m_responseDocument = nullptr; 332 m_responseDocument = nullptr;
333 333
334 m_parsedResponse = true; 334 m_parsedResponse = true;
335 } 335 }
336 336
337 return m_responseDocument.get(); 337 return m_responseDocument.get();
338 } 338 }
339 339
340 Blob* XMLHttpRequest::responseBlob() 340 Blob* XMLHttpRequest::responseBlob()
341 { 341 {
342 ASSERT(m_responseTypeCode == ResponseTypeBlob); 342 DCHECK_EQ(m_responseTypeCode, ResponseTypeBlob);
343 343
344 // We always return null before kDone. 344 // We always return null before kDone.
345 if (m_error || m_state != kDone) 345 if (m_error || m_state != kDone)
346 return nullptr; 346 return nullptr;
347 347
348 if (!m_responseBlob) { 348 if (!m_responseBlob) {
349 if (m_downloadingToFile) { 349 if (m_downloadingToFile) {
350 ASSERT(!m_binaryResponseBuilder); 350 DCHECK(!m_binaryResponseBuilder);
351 351
352 // When responseType is set to "blob", we redirect the downloaded 352 // When responseType is set to "blob", we redirect the downloaded
353 // data to a file-handle directly in the browser process. We get 353 // data to a file-handle directly in the browser process. We get
354 // the file-path from the ResourceResponse directly instead of 354 // the file-path from the ResourceResponse directly instead of
355 // copying the bytes between the browser and the renderer. 355 // copying the bytes between the browser and the renderer.
356 m_responseBlob = Blob::create(createBlobDataHandleFromResponse()); 356 m_responseBlob = Blob::create(createBlobDataHandleFromResponse());
357 } else { 357 } else {
358 std::unique_ptr<BlobData> blobData = BlobData::create(); 358 std::unique_ptr<BlobData> blobData = BlobData::create();
359 size_t size = 0; 359 size_t size = 0;
360 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) { 360 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) {
361 size = m_binaryResponseBuilder->size(); 361 size = m_binaryResponseBuilder->size();
362 blobData->appendBytes(m_binaryResponseBuilder->data(), size); 362 blobData->appendBytes(m_binaryResponseBuilder->data(), size);
363 blobData->setContentType(finalResponseMIMETypeWithFallback().low er()); 363 blobData->setContentType(finalResponseMIMETypeWithFallback().low er());
364 m_binaryResponseBuilder.clear(); 364 m_binaryResponseBuilder.clear();
365 } 365 }
366 m_responseBlob = Blob::create(BlobDataHandle::create(std::move(blobD ata), size)); 366 m_responseBlob = Blob::create(BlobDataHandle::create(std::move(blobD ata), size));
367 } 367 }
368 } 368 }
369 369
370 return m_responseBlob; 370 return m_responseBlob;
371 } 371 }
372 372
373 DOMArrayBuffer* XMLHttpRequest::responseArrayBuffer() 373 DOMArrayBuffer* XMLHttpRequest::responseArrayBuffer()
374 { 374 {
375 ASSERT(m_responseTypeCode == ResponseTypeArrayBuffer); 375 DCHECK_EQ(m_responseTypeCode, ResponseTypeArrayBuffer);
376 376
377 if (m_error || m_state != kDone) 377 if (m_error || m_state != kDone)
378 return nullptr; 378 return nullptr;
379 379
380 if (!m_responseArrayBuffer) { 380 if (!m_responseArrayBuffer) {
381 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) { 381 if (m_binaryResponseBuilder && m_binaryResponseBuilder->size()) {
382 DOMArrayBuffer* buffer = DOMArrayBuffer::createUninitialized(m_binar yResponseBuilder->size(), 1); 382 DOMArrayBuffer* buffer = DOMArrayBuffer::createUninitialized(m_binar yResponseBuilder->size(), 1);
383 if (!m_binaryResponseBuilder->getAsBytes(buffer->data(), static_cast <size_t>(buffer->byteLength()))) { 383 if (!m_binaryResponseBuilder->getAsBytes(buffer->data(), static_cast <size_t>(buffer->byteLength()))) {
384 // m_binaryResponseBuilder failed to allocate an ArrayBuffer. 384 // m_binaryResponseBuilder failed to allocate an ArrayBuffer.
385 // We need to crash the renderer since there's no way defined in 385 // We need to crash the renderer since there's no way defined in
386 // the spec to tell this to the user. 386 // the spec to tell this to the user.
387 CRASH(); 387 CRASH();
388 } 388 }
389 m_responseArrayBuffer = buffer; 389 m_responseArrayBuffer = buffer;
390 m_binaryResponseBuilder.clear(); 390 m_binaryResponseBuilder.clear();
391 } else { 391 } else {
392 m_responseArrayBuffer = DOMArrayBuffer::create(nullptr, 0); 392 m_responseArrayBuffer = DOMArrayBuffer::create(nullptr, 0);
393 } 393 }
394 } 394 }
395 395
396 return m_responseArrayBuffer.get(); 396 return m_responseArrayBuffer.get();
397 } 397 }
398 398
399 Stream* XMLHttpRequest::responseLegacyStream() 399 Stream* XMLHttpRequest::responseLegacyStream()
400 { 400 {
401 ASSERT(m_responseTypeCode == ResponseTypeLegacyStream); 401 DCHECK_EQ(m_responseTypeCode, ResponseTypeLegacyStream);
402 402
403 if (m_error || (m_state != kLoading && m_state != kDone)) 403 if (m_error || (m_state != kLoading && m_state != kDone))
404 return nullptr; 404 return nullptr;
405 405
406 return m_responseLegacyStream; 406 return m_responseLegacyStream;
407 } 407 }
408 408
409 void XMLHttpRequest::setTimeout(unsigned timeout, ExceptionState& exceptionState ) 409 void XMLHttpRequest::setTimeout(unsigned timeout, ExceptionState& exceptionState )
410 { 410 {
411 // FIXME: Need to trigger or update the timeout Timer here, if needed. http: //webkit.org/b/98156 411 // FIXME: Need to trigger or update the timeout Timer here, if needed. http: //webkit.org/b/98156
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 } else if (responseType == "blob") { 451 } else if (responseType == "blob") {
452 m_responseTypeCode = ResponseTypeBlob; 452 m_responseTypeCode = ResponseTypeBlob;
453 } else if (responseType == "arraybuffer") { 453 } else if (responseType == "arraybuffer") {
454 m_responseTypeCode = ResponseTypeArrayBuffer; 454 m_responseTypeCode = ResponseTypeArrayBuffer;
455 } else if (responseType == "legacystream") { 455 } else if (responseType == "legacystream") {
456 if (RuntimeEnabledFeatures::experimentalStreamEnabled()) 456 if (RuntimeEnabledFeatures::experimentalStreamEnabled())
457 m_responseTypeCode = ResponseTypeLegacyStream; 457 m_responseTypeCode = ResponseTypeLegacyStream;
458 else 458 else
459 return; 459 return;
460 } else { 460 } else {
461 ASSERT_NOT_REACHED(); 461 NOTREACHED();
462 } 462 }
463 } 463 }
464 464
465 String XMLHttpRequest::responseType() 465 String XMLHttpRequest::responseType()
466 { 466 {
467 switch (m_responseTypeCode) { 467 switch (m_responseTypeCode) {
468 case ResponseTypeDefault: 468 case ResponseTypeDefault:
469 return ""; 469 return "";
470 case ResponseTypeText: 470 case ResponseTypeText:
471 return "text"; 471 return "text";
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 if (!document()->processingBeforeUnload()) 623 if (!document()->processingBeforeUnload())
624 Deprecation::countDeprecation(getExecutionContext(), UseCounter::XML HttpRequestSynchronousInNonWorkerOutsideBeforeUnload); 624 Deprecation::countDeprecation(getExecutionContext(), UseCounter::XML HttpRequestSynchronousInNonWorkerOutsideBeforeUnload);
625 } 625 }
626 626
627 m_method = FetchUtils::normalizeMethod(method); 627 m_method = FetchUtils::normalizeMethod(method);
628 628
629 m_url = url; 629 m_url = url;
630 630
631 m_async = async; 631 m_async = async;
632 632
633 ASSERT(!m_loader); 633 DCHECK(!m_loader);
634 634
635 // Check previous state to avoid dispatching readyState event 635 // Check previous state to avoid dispatching readyState event
636 // when calling open several times in a row. 636 // when calling open several times in a row.
637 if (previousState != kOpened) 637 if (previousState != kOpened)
638 changeState(kOpened); 638 changeState(kOpened);
639 else 639 else
640 m_state = kOpened; 640 m_state = kOpened;
641 } 641 }
642 642
643 bool XMLHttpRequest::initSend(ExceptionState& exceptionState) 643 bool XMLHttpRequest::initSend(ExceptionState& exceptionState)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 if (body.isDocument()) { 688 if (body.isDocument()) {
689 send(body.getAsDocument(), exceptionState); 689 send(body.getAsDocument(), exceptionState);
690 return; 690 return;
691 } 691 }
692 692
693 if (body.isFormData()) { 693 if (body.isFormData()) {
694 send(body.getAsFormData(), exceptionState); 694 send(body.getAsFormData(), exceptionState);
695 return; 695 return;
696 } 696 }
697 697
698 ASSERT(body.isString()); 698 DCHECK(body.isString());
699 send(body.getAsString(), exceptionState); 699 send(body.getAsString(), exceptionState);
700 } 700 }
701 701
702 bool XMLHttpRequest::areMethodAndURLValidForSend() 702 bool XMLHttpRequest::areMethodAndURLValidForSend()
703 { 703 {
704 return m_method != HTTPNames::GET && m_method != HTTPNames::HEAD && m_url.pr otocolIsInHTTPFamily(); 704 return m_method != HTTPNames::GET && m_method != HTTPNames::HEAD && m_url.pr otocolIsInHTTPFamily();
705 } 705 }
706 706
707 void XMLHttpRequest::send(Document* document, ExceptionState& exceptionState) 707 void XMLHttpRequest::send(Document* document, ExceptionState& exceptionState)
708 { 708 {
709 NETWORK_DVLOG(1) << this << " send() Document " << static_cast<void*>(docume nt); 709 NETWORK_DVLOG(1) << this << " send() Document " << static_cast<void*>(docume nt);
710 710
711 ASSERT(document); 711 DCHECK(document);
712 712
713 if (!initSend(exceptionState)) 713 if (!initSend(exceptionState))
714 return; 714 return;
715 715
716 RefPtr<EncodedFormData> httpBody; 716 RefPtr<EncodedFormData> httpBody;
717 717
718 if (areMethodAndURLValidForSend()) { 718 if (areMethodAndURLValidForSend()) {
719 // FIXME: Per https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send the 719 // FIXME: Per https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send the
720 // Content-Type header and whether to serialize as HTML or XML should 720 // Content-Type header and whether to serialize as HTML or XML should
721 // depend on |document->isHTMLDocument()|. 721 // depend on |document->isHTMLDocument()|.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 773
774 // FIXME: add support for uploading bundles. 774 // FIXME: add support for uploading bundles.
775 httpBody = EncodedFormData::create(); 775 httpBody = EncodedFormData::create();
776 if (body->hasBackingFile()) { 776 if (body->hasBackingFile()) {
777 File* file = toFile(body); 777 File* file = toFile(body);
778 if (!file->path().isEmpty()) 778 if (!file->path().isEmpty())
779 httpBody->appendFile(file->path()); 779 httpBody->appendFile(file->path());
780 else if (!file->fileSystemURL().isEmpty()) 780 else if (!file->fileSystemURL().isEmpty())
781 httpBody->appendFileSystemURL(file->fileSystemURL()); 781 httpBody->appendFileSystemURL(file->fileSystemURL());
782 else 782 else
783 ASSERT_NOT_REACHED(); 783 NOTREACHED();
784 } else { 784 } else {
785 httpBody->appendBlob(body->uuid(), body->blobDataHandle()); 785 httpBody->appendBlob(body->uuid(), body->blobDataHandle());
786 } 786 }
787 } 787 }
788 788
789 createRequest(httpBody.release(), exceptionState); 789 createRequest(httpBody.release(), exceptionState);
790 } 790 }
791 791
792 void XMLHttpRequest::send(FormData* body, ExceptionState& exceptionState) 792 void XMLHttpRequest::send(FormData* body, ExceptionState& exceptionState)
793 { 793 {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 // Only GET request is supported for blob URL. 868 // Only GET request is supported for blob URL.
869 if (m_url.protocolIs("blob") && m_method != HTTPNames::GET) { 869 if (m_url.protocolIs("blob") && m_method != HTTPNames::GET) {
870 handleNetworkError(); 870 handleNetworkError();
871 871
872 if (!m_async) { 872 if (!m_async) {
873 throwForLoadFailureIfNeeded(exceptionState, "'GET' is the only metho d allowed for 'blob:' URLs."); 873 throwForLoadFailureIfNeeded(exceptionState, "'GET' is the only metho d allowed for 'blob:' URLs.");
874 } 874 }
875 return; 875 return;
876 } 876 }
877 877
878 ASSERT(getExecutionContext()); 878 DCHECK(getExecutionContext());
879 ExecutionContext& executionContext = *this->getExecutionContext(); 879 ExecutionContext& executionContext = *this->getExecutionContext();
880 880
881 // The presence of upload event listeners forces us to use preflighting beca use POSTing to an URL that does not 881 // The presence of upload event listeners forces us to use preflighting beca use POSTing to an URL that does not
882 // permit cross origin requests should look exactly like POSTing to an URL t hat does not respond at all. 882 // permit cross origin requests should look exactly like POSTing to an URL t hat does not respond at all.
883 // Also, only async requests support upload progress events. 883 // Also, only async requests support upload progress events.
884 bool uploadEvents = false; 884 bool uploadEvents = false;
885 if (m_async) { 885 if (m_async) {
886 InspectorInstrumentation::asyncTaskScheduled(&executionContext, "XMLHttp Request.send", this, true); 886 InspectorInstrumentation::asyncTaskScheduled(&executionContext, "XMLHttp Request.send", this, true);
887 dispatchProgressEvent(EventTypeNames::loadstart, 0, 0); 887 dispatchProgressEvent(EventTypeNames::loadstart, 0, 0);
888 if (httpBody && m_upload) { 888 if (httpBody && m_upload) {
(...skipping 14 matching lines...) Expand all
903 ResourceRequest request(m_url); 903 ResourceRequest request(m_url);
904 request.setHTTPMethod(m_method); 904 request.setHTTPMethod(m_method);
905 request.setRequestContext(WebURLRequest::RequestContextXMLHttpRequest); 905 request.setRequestContext(WebURLRequest::RequestContextXMLHttpRequest);
906 request.setFetchCredentialsMode(m_includeCredentials ? WebURLRequest::FetchC redentialsModeInclude : WebURLRequest::FetchCredentialsModeSameOrigin); 906 request.setFetchCredentialsMode(m_includeCredentials ? WebURLRequest::FetchC redentialsModeInclude : WebURLRequest::FetchCredentialsModeSameOrigin);
907 request.setSkipServiceWorker(m_isolatedWorldSecurityOrigin.get() ? WebURLReq uest::SkipServiceWorker::All : WebURLRequest::SkipServiceWorker::None); 907 request.setSkipServiceWorker(m_isolatedWorldSecurityOrigin.get() ? WebURLReq uest::SkipServiceWorker::All : WebURLRequest::SkipServiceWorker::None);
908 request.setExternalRequestStateFromRequestorAddressSpace(executionContext.se curityContext().addressSpace()); 908 request.setExternalRequestStateFromRequestorAddressSpace(executionContext.se curityContext().addressSpace());
909 909
910 InspectorInstrumentation::willLoadXHR(&executionContext, this, this, m_metho d, m_url, m_async, httpBody ? httpBody->deepCopy() : nullptr, m_requestHeaders, m_includeCredentials); 910 InspectorInstrumentation::willLoadXHR(&executionContext, this, this, m_metho d, m_url, m_async, httpBody ? httpBody->deepCopy() : nullptr, m_requestHeaders, m_includeCredentials);
911 911
912 if (httpBody) { 912 if (httpBody) {
913 ASSERT(m_method != HTTPNames::GET); 913 DCHECK_NE(m_method, HTTPNames::GET);
914 ASSERT(m_method != HTTPNames::HEAD); 914 DCHECK_NE(m_method, HTTPNames::HEAD);
915 request.setHTTPBody(std::move(httpBody)); 915 request.setHTTPBody(std::move(httpBody));
916 } 916 }
917 917
918 if (m_requestHeaders.size() > 0) 918 if (m_requestHeaders.size() > 0)
919 request.addHTTPHeaderFields(m_requestHeaders); 919 request.addHTTPHeaderFields(m_requestHeaders);
920 920
921 ThreadableLoaderOptions options; 921 ThreadableLoaderOptions options;
922 options.preflightPolicy = uploadEvents ? ForcePreflight : ConsiderPreflight; 922 options.preflightPolicy = uploadEvents ? ForcePreflight : ConsiderPreflight;
923 options.crossOriginRequestPolicy = UseAccessControl; 923 options.crossOriginRequestPolicy = UseAccessControl;
924 options.initiator = FetchInitiatorTypeNames::xmlhttprequest; 924 options.initiator = FetchInitiatorTypeNames::xmlhttprequest;
(...skipping 14 matching lines...) Expand all
939 } 939 }
940 940
941 m_exceptionCode = 0; 941 m_exceptionCode = 0;
942 m_error = false; 942 m_error = false;
943 943
944 if (m_async) { 944 if (m_async) {
945 UseCounter::count(&executionContext, UseCounter::XMLHttpRequestAsynchron ous); 945 UseCounter::count(&executionContext, UseCounter::XMLHttpRequestAsynchron ous);
946 if (m_upload) 946 if (m_upload)
947 request.setReportUploadProgress(true); 947 request.setReportUploadProgress(true);
948 948
949 ASSERT(!m_loader); 949 DCHECK(!m_loader);
950 m_loader = ThreadableLoader::create(executionContext, this, options, res ourceLoaderOptions); 950 m_loader = ThreadableLoader::create(executionContext, this, options, res ourceLoaderOptions);
951 m_loader->start(request); 951 m_loader->start(request);
952 952
953 return; 953 return;
954 } 954 }
955 955
956 // Use count for XHR synchronous requests. 956 // Use count for XHR synchronous requests.
957 UseCounter::count(&executionContext, UseCounter::XMLHttpRequestSynchronous); 957 UseCounter::count(&executionContext, UseCounter::XMLHttpRequestSynchronous);
958 ThreadableLoader::loadResourceSynchronously(executionContext, request, *this , options, resourceLoaderOptions); 958 ThreadableLoader::loadResourceSynchronously(executionContext, request, *this , options, resourceLoaderOptions);
959 959
(...skipping 24 matching lines...) Expand all
984 // send() call and transition to the DONE state. It's because a sync XHR 984 // send() call and transition to the DONE state. It's because a sync XHR
985 // doesn't dispatch any event between them. So, if |m_async| is false, we 985 // doesn't dispatch any event between them. So, if |m_async| is false, we
986 // can skip the "request error steps" (defined in the XHR spec) without any 986 // can skip the "request error steps" (defined in the XHR spec) without any
987 // state check. 987 // state check.
988 // 988 //
989 // FIXME: It's possible open() is invoked in internalAbort() and |m_async| 989 // FIXME: It's possible open() is invoked in internalAbort() and |m_async|
990 // becomes true by that. We should implement more reliable treatment for 990 // becomes true by that. We should implement more reliable treatment for
991 // nested method invocations at some point. 991 // nested method invocations at some point.
992 if (m_async) { 992 if (m_async) {
993 if ((m_state == kOpened && sendFlag) || m_state == kHeadersReceived || m _state == kLoading) { 993 if ((m_state == kOpened && sendFlag) || m_state == kHeadersReceived || m _state == kLoading) {
994 ASSERT(!m_loader); 994 DCHECK(!m_loader);
995 handleRequestError(0, EventTypeNames::abort, receivedLength, expecte dLength); 995 handleRequestError(0, EventTypeNames::abort, receivedLength, expecte dLength);
996 } 996 }
997 } 997 }
998 m_state = kUnsent; 998 m_state = kUnsent;
999 } 999 }
1000 1000
1001 void XMLHttpRequest::clearVariablesForLoading() 1001 void XMLHttpRequest::clearVariablesForLoading()
1002 { 1002 {
1003 if (m_blobLoader) { 1003 if (m_blobLoader) {
1004 m_blobLoader->cancel(); 1004 m_blobLoader->cancel();
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 handleRequestError(AbortError, EventTypeNames::abort, receivedLength, expect edLength); 1131 handleRequestError(AbortError, EventTypeNames::abort, receivedLength, expect edLength);
1132 } 1132 }
1133 1133
1134 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi cString& type, long long receivedLength, long long expectedLength) 1134 void XMLHttpRequest::handleRequestError(ExceptionCode exceptionCode, const Atomi cString& type, long long receivedLength, long long expectedLength)
1135 { 1135 {
1136 NETWORK_DVLOG(1) << this << " handleRequestError()"; 1136 NETWORK_DVLOG(1) << this << " handleRequestError()";
1137 1137
1138 InspectorInstrumentation::didFailXHRLoading(getExecutionContext(), this, thi s, m_method, m_url); 1138 InspectorInstrumentation::didFailXHRLoading(getExecutionContext(), this, thi s, m_method, m_url);
1139 1139
1140 if (!m_async) { 1140 if (!m_async) {
1141 ASSERT(exceptionCode); 1141 DCHECK(exceptionCode);
1142 m_state = kDone; 1142 m_state = kDone;
1143 m_exceptionCode = exceptionCode; 1143 m_exceptionCode = exceptionCode;
1144 return; 1144 return;
1145 } 1145 }
1146 1146
1147 // With m_error set, the state change steps are minimal: any pending 1147 // With m_error set, the state change steps are minimal: any pending
1148 // progress event is flushed + a readystatechange is dispatched. 1148 // progress event is flushed + a readystatechange is dispatched.
1149 // No new progress events dispatched; as required, that happens at 1149 // No new progress events dispatched; as required, that happens at
1150 // the end here. 1150 // the end here.
1151 ASSERT(m_error); 1151 DCHECK(m_error);
1152 changeState(kDone); 1152 changeState(kDone);
1153 1153
1154 if (!m_uploadComplete) { 1154 if (!m_uploadComplete) {
1155 m_uploadComplete = true; 1155 m_uploadComplete = true;
1156 if (m_upload && m_uploadEventsAllowed) 1156 if (m_upload && m_uploadEventsAllowed)
1157 m_upload->handleRequestError(type); 1157 m_upload->handleRequestError(type);
1158 } 1158 }
1159 1159
1160 // Note: The below event dispatch may be called while |hasPendingActivity() == false|, 1160 // Note: The below event dispatch may be called while |hasPendingActivity() == false|,
1161 // when |handleRequestError| is called after |internalAbort()|. 1161 // when |handleRequestError| is called after |internalAbort()|.
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 } 1403 }
1404 1404
1405 void XMLHttpRequest::didFinishLoadingInternal() 1405 void XMLHttpRequest::didFinishLoadingInternal()
1406 { 1406 {
1407 if (m_responseDocumentParser) { 1407 if (m_responseDocumentParser) {
1408 // |DocumentParser::finish()| tells the parser that we have reached end of the data. 1408 // |DocumentParser::finish()| tells the parser that we have reached end of the data.
1409 // When using |HTMLDocumentParser|, which works asynchronously, we do no t have the 1409 // When using |HTMLDocumentParser|, which works asynchronously, we do no t have the
1410 // complete document just after the |DocumentParser::finish()| call. 1410 // complete document just after the |DocumentParser::finish()| call.
1411 // Wait for the parser to call us back in |notifyParserStopped| to progr ess state. 1411 // Wait for the parser to call us back in |notifyParserStopped| to progr ess state.
1412 m_responseDocumentParser->finish(); 1412 m_responseDocumentParser->finish();
1413 ASSERT(m_responseDocument); 1413 DCHECK(m_responseDocument);
1414 return; 1414 return;
1415 } 1415 }
1416 1416
1417 if (m_decoder) { 1417 if (m_decoder) {
1418 auto text = m_decoder->flush(); 1418 auto text = m_decoder->flush();
1419 if (!text.isEmpty() && !m_responseTextOverflow) { 1419 if (!text.isEmpty() && !m_responseTextOverflow) {
1420 m_responseText = m_responseText.concatenateWith(text); 1420 m_responseText = m_responseText.concatenateWith(text);
1421 m_responseTextOverflow = m_responseText.isEmpty(); 1421 m_responseTextOverflow = m_responseText.isEmpty();
1422 } 1422 }
1423 } 1423 }
(...skipping 18 matching lines...) Expand all
1442 NETWORK_DVLOG(1) << this << " didFailLoadingFromBlob()"; 1442 NETWORK_DVLOG(1) << this << " didFailLoadingFromBlob()";
1443 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); 1443 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel);
1444 1444
1445 if (m_error) 1445 if (m_error)
1446 return; 1446 return;
1447 handleNetworkError(); 1447 handleNetworkError();
1448 } 1448 }
1449 1449
1450 PassRefPtr<BlobDataHandle> XMLHttpRequest::createBlobDataHandleFromResponse() 1450 PassRefPtr<BlobDataHandle> XMLHttpRequest::createBlobDataHandleFromResponse()
1451 { 1451 {
1452 ASSERT(m_downloadingToFile); 1452 DCHECK(m_downloadingToFile);
1453 std::unique_ptr<BlobData> blobData = BlobData::create(); 1453 std::unique_ptr<BlobData> blobData = BlobData::create();
1454 String filePath = m_response.downloadedFilePath(); 1454 String filePath = m_response.downloadedFilePath();
1455 // If we errored out or got no data, we return an empty handle. 1455 // If we errored out or got no data, we return an empty handle.
1456 if (!filePath.isEmpty() && m_lengthDownloadedToFile) { 1456 if (!filePath.isEmpty() && m_lengthDownloadedToFile) {
1457 blobData->appendFile(filePath, 0, m_lengthDownloadedToFile, invalidFileT ime()); 1457 blobData->appendFile(filePath, 0, m_lengthDownloadedToFile, invalidFileT ime());
1458 // FIXME: finalResponseMIMETypeWithFallback() defaults to 1458 // FIXME: finalResponseMIMETypeWithFallback() defaults to
1459 // text/xml which may be incorrect. Replace it with 1459 // text/xml which may be incorrect. Replace it with
1460 // finalResponseMIMEType() after compatibility investigation. 1460 // finalResponseMIMEType() after compatibility investigation.
1461 blobData->setContentType(finalResponseMIMETypeWithFallback().lower()); 1461 blobData->setContentType(finalResponseMIMETypeWithFallback().lower());
1462 } 1462 }
1463 return BlobDataHandle::create(std::move(blobData), m_lengthDownloadedToFile) ; 1463 return BlobDataHandle::create(std::move(blobData), m_lengthDownloadedToFile) ;
1464 } 1464 }
1465 1465
1466 void XMLHttpRequest::notifyParserStopped() 1466 void XMLHttpRequest::notifyParserStopped()
1467 { 1467 {
1468 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); 1468 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel);
1469 1469
1470 // This should only be called when response document is parsed asynchronousl y. 1470 // This should only be called when response document is parsed asynchronousl y.
1471 ASSERT(m_responseDocumentParser); 1471 DCHECK(m_responseDocumentParser);
1472 ASSERT(!m_responseDocumentParser->isParsing()); 1472 DCHECK(!m_responseDocumentParser->isParsing());
1473 ASSERT(!m_responseLegacyStream); 1473 DCHECK(!m_responseLegacyStream);
1474 1474
1475 // Do nothing if we are called from |internalAbort()|. 1475 // Do nothing if we are called from |internalAbort()|.
1476 if (m_error) 1476 if (m_error)
1477 return; 1477 return;
1478 1478
1479 clearVariablesForLoading(); 1479 clearVariablesForLoading();
1480 1480
1481 m_responseDocument->implicitClose(); 1481 m_responseDocument->implicitClose();
1482 1482
1483 if (!m_responseDocument->wellFormed()) 1483 if (!m_responseDocument->wellFormed())
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 1525
1526 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) { 1526 if (bytesSent == totalBytesToBeSent && !m_uploadComplete) {
1527 m_uploadComplete = true; 1527 m_uploadComplete = true;
1528 if (m_uploadEventsAllowed) 1528 if (m_uploadEventsAllowed)
1529 m_upload->dispatchEventAndLoadEnd(EventTypeNames::load, true, bytesS ent, totalBytesToBeSent); 1529 m_upload->dispatchEventAndLoadEnd(EventTypeNames::load, true, bytesS ent, totalBytesToBeSent);
1530 } 1530 }
1531 } 1531 }
1532 1532
1533 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource Response& response, std::unique_ptr<WebDataConsumerHandle> handle) 1533 void XMLHttpRequest::didReceiveResponse(unsigned long identifier, const Resource Response& response, std::unique_ptr<WebDataConsumerHandle> handle)
1534 { 1534 {
1535 ASSERT_UNUSED(handle, !handle); 1535 ALLOW_UNUSED_LOCAL(handle);
1536 DCHECK(!handle);
1536 NETWORK_DVLOG(1) << this << " didReceiveResponse(" << identifier << ")"; 1537 NETWORK_DVLOG(1) << this << " didReceiveResponse(" << identifier << ")";
1537 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); 1538 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel);
1538 1539
1539 m_response = response; 1540 m_response = response;
1540 if (!m_mimeTypeOverride.isEmpty()) { 1541 if (!m_mimeTypeOverride.isEmpty()) {
1541 m_response.setHTTPHeaderField(HTTPNames::Content_Type, m_mimeTypeOverrid e); 1542 m_response.setHTTPHeaderField(HTTPNames::Content_Type, m_mimeTypeOverrid e);
1542 m_finalResponseCharset = extractCharsetFromMediaType(m_mimeTypeOverride) ; 1543 m_finalResponseCharset = extractCharsetFromMediaType(m_mimeTypeOverride) ;
1543 } 1544 }
1544 1545
1545 if (m_finalResponseCharset.isEmpty()) 1546 if (m_finalResponseCharset.isEmpty())
1546 m_finalResponseCharset = response.textEncodingName(); 1547 m_finalResponseCharset = response.textEncodingName();
1547 } 1548 }
1548 1549
1549 void XMLHttpRequest::parseDocumentChunk(const char* data, unsigned len) 1550 void XMLHttpRequest::parseDocumentChunk(const char* data, unsigned len)
1550 { 1551 {
1551 if (!m_responseDocumentParser) { 1552 if (!m_responseDocumentParser) {
1552 ASSERT(!m_responseDocument); 1553 DCHECK(!m_responseDocument);
1553 initResponseDocument(); 1554 initResponseDocument();
1554 if (!m_responseDocument) 1555 if (!m_responseDocument)
1555 return; 1556 return;
1556 1557
1557 m_responseDocumentParser = m_responseDocument->implicitOpen(AllowAsynchr onousParsing); 1558 m_responseDocumentParser = m_responseDocument->implicitOpen(AllowAsynchr onousParsing);
1558 m_responseDocumentParser->addClient(this); 1559 m_responseDocumentParser->addClient(this);
1559 } 1560 }
1560 ASSERT(m_responseDocumentParser); 1561 DCHECK(m_responseDocumentParser);
1561 1562
1562 if (m_responseDocumentParser->needsDecoder()) 1563 if (m_responseDocumentParser->needsDecoder())
1563 m_responseDocumentParser->setDecoder(createDecoder()); 1564 m_responseDocumentParser->setDecoder(createDecoder());
1564 1565
1565 m_responseDocumentParser->appendBytes(data, len); 1566 m_responseDocumentParser->appendBytes(data, len);
1566 } 1567 }
1567 1568
1568 std::unique_ptr<TextResourceDecoder> XMLHttpRequest::createDecoder() const 1569 std::unique_ptr<TextResourceDecoder> XMLHttpRequest::createDecoder() const
1569 { 1570 {
1570 if (m_responseTypeCode == ResponseTypeJSON) 1571 if (m_responseTypeCode == ResponseTypeJSON)
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1636 } 1637 }
1637 trackProgress(len); 1638 trackProgress(len);
1638 } 1639 }
1639 1640
1640 void XMLHttpRequest::didDownloadData(int dataLength) 1641 void XMLHttpRequest::didDownloadData(int dataLength)
1641 { 1642 {
1642 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel); 1643 ScopedEventDispatchProtect protect(&m_eventDispatchRecursionLevel);
1643 if (m_error) 1644 if (m_error)
1644 return; 1645 return;
1645 1646
1646 ASSERT(m_downloadingToFile); 1647 DCHECK(m_downloadingToFile);
1647 1648
1648 if (m_state < kHeadersReceived) 1649 if (m_state < kHeadersReceived)
1649 changeState(kHeadersReceived); 1650 changeState(kHeadersReceived);
1650 1651
1651 if (!dataLength) 1652 if (!dataLength)
1652 return; 1653 return;
1653 1654
1654 // readystatechange event handler may do something to put this XHR in error 1655 // readystatechange event handler may do something to put this XHR in error
1655 // state. We need to check m_error again here. 1656 // state. We need to check m_error again here.
1656 if (m_error) 1657 if (m_error)
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1700 // |m_loader| is non-null while request is active and ThreadableLoaderClient 1701 // |m_loader| is non-null while request is active and ThreadableLoaderClient
1701 // callbacks may be called, and |m_responseDocumentParser| is non-null while 1702 // callbacks may be called, and |m_responseDocumentParser| is non-null while
1702 // DocumentParserClient callbacks may be called. 1703 // DocumentParserClient callbacks may be called.
1703 if (m_loader || m_responseDocumentParser) 1704 if (m_loader || m_responseDocumentParser)
1704 return true; 1705 return true;
1705 return m_eventDispatchRecursionLevel > 0; 1706 return m_eventDispatchRecursionLevel > 0;
1706 } 1707 }
1707 1708
1708 void XMLHttpRequest::contextDestroyed() 1709 void XMLHttpRequest::contextDestroyed()
1709 { 1710 {
1710 ASSERT(!m_loader); 1711 DCHECK(!m_loader);
1711 ActiveDOMObject::contextDestroyed(); 1712 ActiveDOMObject::contextDestroyed();
1712 } 1713 }
1713 1714
1714 const AtomicString& XMLHttpRequest::interfaceName() const 1715 const AtomicString& XMLHttpRequest::interfaceName() const
1715 { 1716 {
1716 return EventTargetNames::XMLHttpRequest; 1717 return EventTargetNames::XMLHttpRequest;
1717 } 1718 }
1718 1719
1719 ExecutionContext* XMLHttpRequest::getExecutionContext() const 1720 ExecutionContext* XMLHttpRequest::getExecutionContext() const
1720 { 1721 {
(...skipping 23 matching lines...) Expand all
1744 visitor->traceWrappers(m_responseDocument); 1745 visitor->traceWrappers(m_responseDocument);
1745 visitor->traceWrappers(m_responseArrayBuffer); 1746 visitor->traceWrappers(m_responseArrayBuffer);
1746 } 1747 }
1747 1748
1748 std::ostream& operator<<(std::ostream& ostream, const XMLHttpRequest* xhr) 1749 std::ostream& operator<<(std::ostream& ostream, const XMLHttpRequest* xhr)
1749 { 1750 {
1750 return ostream << "XMLHttpRequest " << static_cast<const void*>(xhr); 1751 return ostream << "XMLHttpRequest " << static_cast<const void*>(xhr);
1751 } 1752 }
1752 1753
1753 } // namespace blink 1754 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequestProgressEventThrottle.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698