| Index: content/browser/service_worker/service_worker_blob_reader.cc
|
| diff --git a/content/browser/service_worker/service_worker_blob_reader.cc b/content/browser/service_worker/service_worker_blob_reader.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..527b2b2978676f3e23ce68299d7756dbee2a1534
|
| --- /dev/null
|
| +++ b/content/browser/service_worker/service_worker_blob_reader.cc
|
| @@ -0,0 +1,86 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/service_worker/service_worker_blob_reader.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "storage/browser/blob/blob_data_handle.h"
|
| +#include "storage/browser/blob/blob_url_request_job_factory.h"
|
| +
|
| +namespace content {
|
| +
|
| +ServiceWorkerBlobReader::ServiceWorkerBlobReader(
|
| + ServiceWorkerURLRequestJob* owner)
|
| + : owner_(owner) {}
|
| +
|
| +ServiceWorkerBlobReader::~ServiceWorkerBlobReader() {}
|
| +
|
| +void ServiceWorkerBlobReader::Start(
|
| + std::unique_ptr<storage::BlobDataHandle> blob_data_handle,
|
| + const net::URLRequestContext* request_context) {
|
| + blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest(
|
| + std::move(blob_data_handle), request_context, this);
|
| + blob_request_->Start();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnReceivedRedirect(
|
| + net::URLRequest* request,
|
| + const net::RedirectInfo& redirect_info,
|
| + bool* defer_redirect) {
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnAuthRequired(
|
| + net::URLRequest* request,
|
| + net::AuthChallengeInfo* auth_info) {
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnCertificateRequested(
|
| + net::URLRequest* request,
|
| + net::SSLCertRequestInfo* cert_request_info) {
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnSSLCertificateError(
|
| + net::URLRequest* request,
|
| + const net::SSLInfo& ssl_info,
|
| + bool fatal) {
|
| + NOTREACHED();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnResponseStarted(net::URLRequest* request) {
|
| + // TODO(falken): This should check request->status() per URLRequest::Delegate
|
| + // contract.
|
| + // TODO(falken): Add Content-Length, Content-Type if they were not provided in
|
| + // the ServiceWorkerResponse.
|
| + owner_->OnResponseStarted();
|
| +}
|
| +
|
| +void ServiceWorkerBlobReader::OnReadCompleted(net::URLRequest* request,
|
| + int bytes_read) {
|
| + if (!request->status().is_success()) {
|
| + owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ);
|
| + } else if (bytes_read == 0) {
|
| + owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
|
| + }
|
| + net::URLRequestStatus status = request->status();
|
| + owner_->OnReadRawDataComplete(status.is_success() ? bytes_read
|
| + : status.error());
|
| +}
|
| +
|
| +int ServiceWorkerBlobReader::ReadRawData(net::IOBuffer* buf, int buf_size) {
|
| + int bytes_read = 0;
|
| + blob_request_->Read(buf, buf_size, &bytes_read);
|
| + net::URLRequestStatus status = blob_request_->status();
|
| + if (status.status() != net::URLRequestStatus::SUCCESS)
|
| + return status.error();
|
| + if (bytes_read == 0) {
|
| + owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
|
| + }
|
| + return bytes_read;
|
| +}
|
| +
|
| +} // namespace content
|
|
|