| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 | 141 |
| 142 unsigned long long size() const override { return m_data->byteLength(); } | 142 unsigned long long size() const override { return m_data->byteLength(); } |
| 143 | 143 |
| 144 void serialize(ResourceRequest& request) const override { | 144 void serialize(ResourceRequest& request) const override { |
| 145 DCHECK(m_data); | 145 DCHECK(m_data); |
| 146 | 146 |
| 147 RefPtr<EncodedFormData> entityBody = | 147 RefPtr<EncodedFormData> entityBody = |
| 148 EncodedFormData::create(m_data->baseAddress(), m_data->byteLength()); | 148 EncodedFormData::create(m_data->baseAddress(), m_data->byteLength()); |
| 149 request.setHTTPBody(entityBody.release()); | 149 request.setHTTPBody(entityBody.release()); |
| 150 | 150 |
| 151 // FIXME: a reasonable choice, but not in the spec; should it give a default
? | 151 // FIXME: a reasonable choice, but not in the spec; should it give a |
| 152 // default? |
| 152 request.setHTTPContentType(AtomicString("application/octet-stream")); | 153 request.setHTTPContentType(AtomicString("application/octet-stream")); |
| 153 } | 154 } |
| 154 | 155 |
| 155 const AtomicString getContentType() const { return nullAtom; } | 156 const AtomicString getContentType() const { return nullAtom; } |
| 156 | 157 |
| 157 private: | 158 private: |
| 158 const Member<DOMArrayBufferView> m_data; | 159 const Member<DOMArrayBufferView> m_data; |
| 159 }; | 160 }; |
| 160 | 161 |
| 161 class BeaconFormData final : public Beacon { | 162 class BeaconFormData final : public Beacon { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 if (frame->frameScheduler()) | 262 if (frame->frameScheduler()) |
| 262 frame->frameScheduler()->didStopLoading(m_identifier); | 263 frame->frameScheduler()->didStopLoading(m_identifier); |
| 263 | 264 |
| 264 m_loader = wrapUnique(Platform::current()->createURLLoader()); | 265 m_loader = wrapUnique(Platform::current()->createURLLoader()); |
| 265 DCHECK(m_loader); | 266 DCHECK(m_loader); |
| 266 WrappedResourceRequest wrappedRequest(request); | 267 WrappedResourceRequest wrappedRequest(request); |
| 267 wrappedRequest.setAllowStoredCredentials(credentialsAllowed == | 268 wrappedRequest.setAllowStoredCredentials(credentialsAllowed == |
| 268 AllowStoredCredentials); | 269 AllowStoredCredentials); |
| 269 m_loader->loadAsynchronously(wrappedRequest, this); | 270 m_loader->loadAsynchronously(wrappedRequest, this); |
| 270 | 271 |
| 271 // If the server never responds, FrameLoader won't be able to cancel this load
and | 272 // If the server never responds, FrameLoader won't be able to cancel this load |
| 272 // we'll sit here waiting forever. Set a very generous timeout, just in case. | 273 // and we'll sit here waiting forever. Set a very generous timeout, just in |
| 274 // case. |
| 273 m_timeout.startOneShot(60000, BLINK_FROM_HERE); | 275 m_timeout.startOneShot(60000, BLINK_FROM_HERE); |
| 274 } | 276 } |
| 275 | 277 |
| 276 PingLoaderImpl::~PingLoaderImpl() { | 278 PingLoaderImpl::~PingLoaderImpl() { |
| 277 if (m_loader) | 279 if (m_loader) |
| 278 m_loader->cancel(); | 280 m_loader->cancel(); |
| 279 } | 281 } |
| 280 | 282 |
| 281 void PingLoaderImpl::dispose() { | 283 void PingLoaderImpl::dispose() { |
| 282 if (m_loader) { | 284 if (m_loader) { |
| 283 m_loader->cancel(); | 285 m_loader->cancel(); |
| 284 m_loader = nullptr; | 286 m_loader = nullptr; |
| 285 } | 287 } |
| 286 m_timeout.stop(); | 288 m_timeout.stop(); |
| 287 m_keepAlive.clear(); | 289 m_keepAlive.clear(); |
| 288 } | 290 } |
| 289 | 291 |
| 290 void PingLoaderImpl::willFollowRedirect( | 292 void PingLoaderImpl::willFollowRedirect( |
| 291 WebURLLoader*, | 293 WebURLLoader*, |
| 292 WebURLRequest& passedNewRequest, | 294 WebURLRequest& passedNewRequest, |
| 293 const WebURLResponse& passedRedirectResponse, | 295 const WebURLResponse& passedRedirectResponse, |
| 294 int64_t encodedDataLength) { | 296 int64_t encodedDataLength) { |
| 295 if (!m_isBeacon) | 297 if (!m_isBeacon) |
| 296 return; | 298 return; |
| 297 | 299 |
| 298 // TODO(tyoshino): Check if setAllowStoredCredentials() should be called | 300 // TODO(tyoshino): Check if setAllowStoredCredentials() should be called also |
| 299 // also for non beacon cases. | 301 // for non beacon cases. |
| 300 passedNewRequest.setAllowStoredCredentials(true); | 302 passedNewRequest.setAllowStoredCredentials(true); |
| 301 if (m_corsMode == NotCORSEnabled) | 303 if (m_corsMode == NotCORSEnabled) |
| 302 return; | 304 return; |
| 303 | 305 |
| 304 ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest()); | 306 ResourceRequest& newRequest(passedNewRequest.toMutableResourceRequest()); |
| 305 const ResourceResponse& redirectResponse( | 307 const ResourceResponse& redirectResponse( |
| 306 passedRedirectResponse.toResourceResponse()); | 308 passedRedirectResponse.toResourceResponse()); |
| 307 | 309 |
| 308 DCHECK(!newRequest.isNull()); | 310 DCHECK(!newRequest.isNull()); |
| 309 DCHECK(!redirectResponse.isNull()); | 311 DCHECK(!redirectResponse.isNull()); |
| 310 | 312 |
| 311 String errorDescription; | 313 String errorDescription; |
| 312 ResourceLoaderOptions options; | 314 ResourceLoaderOptions options; |
| 313 // TODO(tyoshino): Save updated data in options.securityOrigin and pass it | 315 // TODO(tyoshino): Save updated data in options.securityOrigin and pass it |
| 314 // on the next time. | 316 // on the next time. |
| 315 if (!CrossOriginAccessControl::handleRedirect( | 317 if (!CrossOriginAccessControl::handleRedirect( |
| 316 m_origin, newRequest, redirectResponse, AllowStoredCredentials, | 318 m_origin, newRequest, redirectResponse, AllowStoredCredentials, |
| 317 options, errorDescription)) { | 319 options, errorDescription)) { |
| 318 if (LocalFrame* localFrame = frame()) { | 320 if (LocalFrame* localFrame = frame()) { |
| 319 if (localFrame->document()) | 321 if (localFrame->document()) |
| 320 localFrame->document()->addConsoleMessage(ConsoleMessage::create( | 322 localFrame->document()->addConsoleMessage(ConsoleMessage::create( |
| 321 JSMessageSource, ErrorMessageLevel, errorDescription)); | 323 JSMessageSource, ErrorMessageLevel, errorDescription)); |
| 322 } | 324 } |
| 323 // Cancel the load and self destruct. | 325 // Cancel the load and self destruct. |
| 324 dispose(); | 326 dispose(); |
| 325 // Signal WebURLLoader that the redirect musn't be followed. | 327 // Signal WebURLLoader that the redirect musn't be followed. |
| 326 passedNewRequest = WebURLRequest(); | 328 passedNewRequest = WebURLRequest(); |
| 327 return; | 329 return; |
| 328 } | 330 } |
| 329 // FIXME: http://crbug.com/427429 is needed to correctly propagate | 331 // FIXME: http://crbug.com/427429 is needed to correctly propagate updates of |
| 330 // updates of Origin: following this successful redirect. | 332 // Origin: following this successful redirect. |
| 331 } | 333 } |
| 332 | 334 |
| 333 void PingLoaderImpl::didReceiveResponse(WebURLLoader*, | 335 void PingLoaderImpl::didReceiveResponse(WebURLLoader*, |
| 334 const WebURLResponse& response) { | 336 const WebURLResponse& response) { |
| 335 if (LocalFrame* frame = this->frame()) { | 337 if (LocalFrame* frame = this->frame()) { |
| 336 TRACE_EVENT_INSTANT1( | 338 TRACE_EVENT_INSTANT1( |
| 337 "devtools.timeline", "ResourceFinish", TRACE_EVENT_SCOPE_THREAD, "data", | 339 "devtools.timeline", "ResourceFinish", TRACE_EVENT_SCOPE_THREAD, "data", |
| 338 InspectorResourceFinishEvent::data(m_identifier, 0, true)); | 340 InspectorResourceFinishEvent::data(m_identifier, 0, true)); |
| 339 const ResourceResponse& resourceResponse = response.toResourceResponse(); | 341 const ResourceResponse& resourceResponse = response.toResourceResponse(); |
| 340 InspectorInstrumentation::didReceiveResourceResponse(frame, m_identifier, 0, | 342 InspectorInstrumentation::didReceiveResourceResponse(frame, m_identifier, 0, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 } | 408 } |
| 407 | 409 |
| 408 bool sendPingCommon(LocalFrame* frame, | 410 bool sendPingCommon(LocalFrame* frame, |
| 409 ResourceRequest& request, | 411 ResourceRequest& request, |
| 410 const AtomicString& initiator, | 412 const AtomicString& initiator, |
| 411 StoredCredentials credentialsAllowed, | 413 StoredCredentials credentialsAllowed, |
| 412 bool isBeacon) { | 414 bool isBeacon) { |
| 413 if (MixedContentChecker::shouldBlockFetch(frame, request, request.url())) | 415 if (MixedContentChecker::shouldBlockFetch(frame, request, request.url())) |
| 414 return false; | 416 return false; |
| 415 | 417 |
| 416 // The loader keeps itself alive until it receives a response and disposes its
elf. | 418 // The loader keeps itself alive until it receives a response and disposes |
| 419 // itself. |
| 417 PingLoaderImpl* loader = new PingLoaderImpl(frame, request, initiator, | 420 PingLoaderImpl* loader = new PingLoaderImpl(frame, request, initiator, |
| 418 AllowStoredCredentials, true); | 421 AllowStoredCredentials, true); |
| 419 DCHECK(loader); | 422 DCHECK(loader); |
| 420 | 423 |
| 421 return true; | 424 return true; |
| 422 } | 425 } |
| 423 | 426 |
| 424 bool sendBeaconCommon(LocalFrame* frame, | 427 bool sendBeaconCommon(LocalFrame* frame, |
| 425 int allowance, | 428 int allowance, |
| 426 const KURL& url, | 429 const KURL& url, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 return; | 475 return; |
| 473 | 476 |
| 474 ResourceRequest request(pingURL); | 477 ResourceRequest request(pingURL); |
| 475 request.setHTTPMethod(HTTPNames::POST); | 478 request.setHTTPMethod(HTTPNames::POST); |
| 476 request.setHTTPContentType("text/ping"); | 479 request.setHTTPContentType("text/ping"); |
| 477 request.setHTTPBody(EncodedFormData::create("PING")); | 480 request.setHTTPBody(EncodedFormData::create("PING")); |
| 478 request.setHTTPHeaderField(HTTPNames::Cache_Control, "max-age=0"); | 481 request.setHTTPHeaderField(HTTPNames::Cache_Control, "max-age=0"); |
| 479 finishPingRequestInitialization(request, frame, | 482 finishPingRequestInitialization(request, frame, |
| 480 WebURLRequest::RequestContextPing); | 483 WebURLRequest::RequestContextPing); |
| 481 | 484 |
| 482 // addAdditionalRequestHeaders() will have added a referrer for same origin re
quests, | 485 // addAdditionalRequestHeaders() will have added a referrer for same origin |
| 483 // but the spec omits the referrer. | 486 // requests, but the spec omits the referrer. |
| 484 request.clearHTTPReferrer(); | 487 request.clearHTTPReferrer(); |
| 485 | 488 |
| 486 request.setHTTPHeaderField(HTTPNames::Ping_To, | 489 request.setHTTPHeaderField(HTTPNames::Ping_To, |
| 487 AtomicString(destinationURL.getString())); | 490 AtomicString(destinationURL.getString())); |
| 488 | 491 |
| 489 RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL); | 492 RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL); |
| 490 if (protocolIs(frame->document()->url().getString(), "http") || | 493 if (protocolIs(frame->document()->url().getString(), "http") || |
| 491 frame->document()->getSecurityOrigin()->canAccess(pingOrigin.get())) | 494 frame->document()->getSecurityOrigin()->canAccess(pingOrigin.get())) |
| 492 request.setHTTPHeaderField( | 495 request.setHTTPHeaderField( |
| 493 HTTPNames::Ping_From, | 496 HTTPNames::Ping_From, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 bool PingLoader::sendBeacon(LocalFrame* frame, | 552 bool PingLoader::sendBeacon(LocalFrame* frame, |
| 550 int allowance, | 553 int allowance, |
| 551 const KURL& beaconURL, | 554 const KURL& beaconURL, |
| 552 Blob* data, | 555 Blob* data, |
| 553 int& payloadLength) { | 556 int& payloadLength) { |
| 554 BeaconBlob beacon(data); | 557 BeaconBlob beacon(data); |
| 555 return sendBeaconCommon(frame, allowance, beaconURL, beacon, payloadLength); | 558 return sendBeaconCommon(frame, allowance, beaconURL, beacon, payloadLength); |
| 556 } | 559 } |
| 557 | 560 |
| 558 } // namespace blink | 561 } // namespace blink |
| OLD | NEW |