| Index: content/renderer/fetchers/resource_fetcher_impl.cc
|
| diff --git a/content/renderer/fetchers/resource_fetcher_impl.cc b/content/renderer/fetchers/resource_fetcher_impl.cc
|
| index a1a760fdc8eea30fd98334da65588a75f8fd4f70..8a1a979c36dae0c25decee25df129ed5d9165471 100644
|
| --- a/content/renderer/fetchers/resource_fetcher_impl.cc
|
| +++ b/content/renderer/fetchers/resource_fetcher_impl.cc
|
| @@ -4,15 +4,20 @@
|
|
|
| #include "content/renderer/fetchers/resource_fetcher_impl.h"
|
|
|
| +#include <stdint.h>
|
| +
|
| #include "base/logging.h"
|
| +#include "base/macros.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/time/time.h"
|
| #include "third_party/WebKit/public/platform/Platform.h"
|
| #include "third_party/WebKit/public/platform/WebHTTPBody.h"
|
| #include "third_party/WebKit/public/platform/WebString.h"
|
| #include "third_party/WebKit/public/platform/WebURL.h"
|
| +#include "third_party/WebKit/public/platform/WebURLError.h"
|
| #include "third_party/WebKit/public/platform/WebURLLoader.h"
|
| -#include "third_party/WebKit/public/platform/WebURLRequest.h"
|
| +#include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
|
| +#include "third_party/WebKit/public/platform/WebURLResponse.h"
|
| #include "third_party/WebKit/public/web/WebDocument.h"
|
| #include "third_party/WebKit/public/web/WebFrame.h"
|
| #include "third_party/WebKit/public/web/WebKit.h"
|
| @@ -25,12 +30,112 @@ ResourceFetcher* ResourceFetcher::Create(const GURL& url) {
|
| return new ResourceFetcherImpl(url);
|
| }
|
|
|
| +class ResourceFetcherImpl::ClientImpl : public blink::WebURLLoaderClient {
|
| + public:
|
| + ClientImpl(ResourceFetcherImpl* parent, const Callback& callback)
|
| + : parent_(parent),
|
| + completed_(false),
|
| + status_(LOADING),
|
| + callback_(callback) {}
|
| +
|
| + ~ClientImpl() override {}
|
| +
|
| + virtual void Cancel() { OnLoadCompleteInternal(LOAD_FAILED); }
|
| +
|
| + bool completed() const { return completed_; }
|
| +
|
| + private:
|
| + enum LoadStatus {
|
| + LOADING,
|
| + LOAD_FAILED,
|
| + LOAD_SUCCEEDED,
|
| + };
|
| +
|
| + void OnLoadCompleteInternal(LoadStatus status) {
|
| + DCHECK(!completed_);
|
| + DCHECK_EQ(status_, LOADING);
|
| +
|
| + completed_ = true;
|
| + status_ = status;
|
| +
|
| + parent_->OnLoadComplete();
|
| +
|
| + if (callback_.is_null())
|
| + return;
|
| +
|
| + // Take a reference to the callback as running the callback may lead to our
|
| + // destruction.
|
| + Callback callback = callback_;
|
| + callback.Run(status_ == LOAD_FAILED ? blink::WebURLResponse() : response_,
|
| + status_ == LOAD_FAILED ? std::string() : data_);
|
| + }
|
| +
|
| + // WebURLLoaderClient methods:
|
| + void didReceiveResponse(blink::WebURLLoader* loader,
|
| + const blink::WebURLResponse& response) override {
|
| + DCHECK(!completed_);
|
| +
|
| + response_ = response;
|
| + }
|
| + void didReceiveCachedMetadata(blink::WebURLLoader* loader,
|
| + const char* data,
|
| + int data_length) override {
|
| + DCHECK(!completed_);
|
| + DCHECK_GT(data_length, 0);
|
| + }
|
| + void didReceiveData(blink::WebURLLoader* loader,
|
| + const char* data,
|
| + int data_length,
|
| + int encoded_data_length,
|
| + int encoded_body_length) override {
|
| + DCHECK(!completed_);
|
| + DCHECK_GT(data_length, 0);
|
| +
|
| + data_.append(data, data_length);
|
| + }
|
| + void didFinishLoading(blink::WebURLLoader* loader,
|
| + double finishTime,
|
| + int64_t total_encoded_data_length) override {
|
| + DCHECK(!completed_);
|
| +
|
| + OnLoadCompleteInternal(LOAD_SUCCEEDED);
|
| + }
|
| + void didFail(blink::WebURLLoader* loader,
|
| + const blink::WebURLError& error) override {
|
| + OnLoadCompleteInternal(LOAD_FAILED);
|
| + }
|
| +
|
| + private:
|
| + ResourceFetcherImpl* parent_;
|
| +
|
| + // Set to true once the request is complete.
|
| + bool completed_;
|
| +
|
| + // Buffer to hold the content from the server.
|
| + std::string data_;
|
| +
|
| + // A copy of the original resource response.
|
| + blink::WebURLResponse response_;
|
| +
|
| + LoadStatus status_;
|
| +
|
| + // Callback when we're done.
|
| + Callback callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ClientImpl);
|
| +};
|
| +
|
| ResourceFetcherImpl::ResourceFetcherImpl(const GURL& url)
|
| : request_(url) {
|
| }
|
|
|
| ResourceFetcherImpl::~ResourceFetcherImpl() {
|
| - if (!completed() && loader_)
|
| + if (!loader_)
|
| + return;
|
| +
|
| + DCHECK(client_);
|
| +
|
| + if (!client_->completed())
|
| loader_->cancel();
|
| }
|
|
|
| @@ -69,58 +174,26 @@ void ResourceFetcherImpl::SetHeader(const std::string& header,
|
| }
|
| }
|
|
|
| -void ResourceFetcherImpl::SetSkipServiceWorker(
|
| - blink::WebURLRequest::SkipServiceWorker skip_service_worker) {
|
| - DCHECK(!request_.isNull());
|
| - DCHECK(!loader_);
|
| -
|
| - request_.setSkipServiceWorker(skip_service_worker);
|
| -}
|
| -
|
| -void ResourceFetcherImpl::SetCachePolicy(blink::WebCachePolicy policy) {
|
| - DCHECK(!request_.isNull());
|
| - DCHECK(!loader_);
|
| -
|
| - request_.setCachePolicy(policy);
|
| -}
|
| -
|
| -void ResourceFetcherImpl::SetLoaderOptions(
|
| - const blink::WebURLLoaderOptions& options) {
|
| - DCHECK(!request_.isNull());
|
| - DCHECK(!loader_);
|
| -
|
| - options_ = options;
|
| -}
|
| -
|
| void ResourceFetcherImpl::Start(
|
| blink::WebFrame* frame,
|
| blink::WebURLRequest::RequestContext request_context,
|
| blink::WebURLRequest::FrameType frame_type,
|
| - LoaderType loader_type,
|
| const Callback& callback) {
|
| DCHECK(!loader_);
|
| + DCHECK(!client_);
|
| DCHECK(!request_.isNull());
|
| - DCHECK(callback_.is_null());
|
| - DCHECK(!completed());
|
| if (!request_.httpBody().isNull())
|
| DCHECK_NE("GET", request_.httpMethod().utf8()) << "GETs can't have bodies.";
|
|
|
| - callback_ = callback;
|
| -
|
| request_.setRequestContext(request_context);
|
| request_.setFrameType(frame_type);
|
| request_.setFirstPartyForCookies(frame->document().firstPartyForCookies());
|
| frame->dispatchWillSendRequest(request_);
|
|
|
| - switch (loader_type) {
|
| - case PLATFORM_LOADER:
|
| - loader_.reset(blink::Platform::current()->createURLLoader());
|
| - break;
|
| - case FRAME_ASSOCIATED_LOADER:
|
| - loader_.reset(frame->createAssociatedURLLoader(options_));
|
| - break;
|
| - }
|
| - loader_->loadAsynchronously(request_, this);
|
| + client_.reset(new ClientImpl(this, callback));
|
| +
|
| + loader_.reset(blink::Platform::current()->createURLLoader());
|
| + loader_->loadAsynchronously(request_, client_.get());
|
|
|
| // No need to hold on to the request; reset it now.
|
| request_ = blink::WebURLRequest();
|
| @@ -128,26 +201,19 @@ void ResourceFetcherImpl::Start(
|
|
|
| void ResourceFetcherImpl::SetTimeout(const base::TimeDelta& timeout) {
|
| DCHECK(loader_);
|
| - DCHECK(!completed());
|
| + DCHECK(client_);
|
| + DCHECK(!client_->completed());
|
|
|
| timeout_timer_.Start(FROM_HERE, timeout, this, &ResourceFetcherImpl::Cancel);
|
| }
|
|
|
| void ResourceFetcherImpl::OnLoadComplete() {
|
| timeout_timer_.Stop();
|
| - if (callback_.is_null())
|
| - return;
|
| -
|
| - // Take a reference to the callback as running the callback may lead to our
|
| - // destruction.
|
| - Callback callback = callback_;
|
| - callback.Run(status() == LOAD_FAILED ? blink::WebURLResponse() : response(),
|
| - status() == LOAD_FAILED ? std::string() : data());
|
| }
|
|
|
| void ResourceFetcherImpl::Cancel() {
|
| loader_->cancel();
|
| - WebURLLoaderClientImpl::Cancel();
|
| + client_->Cancel();
|
| }
|
|
|
| } // namespace content
|
|
|