diff options
Diffstat (limited to 'webkit/glue/resource_fetcher.cc')
-rw-r--r-- | webkit/glue/resource_fetcher.cc | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/webkit/glue/resource_fetcher.cc b/webkit/glue/resource_fetcher.cc new file mode 100644 index 0000000..186092b --- /dev/null +++ b/webkit/glue/resource_fetcher.cc @@ -0,0 +1,129 @@ +// Copyright (c) 2006-2008 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 "webkit/glue/resource_fetcher.h" + +#include "base/logging.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebKit.h" +#include "third_party/WebKit/WebKit/chromium/public/WebKitClient.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURLError.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURLLoader.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURLRequest.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURL.h" + +using base::TimeDelta; +using WebKit::WebFrame; +using WebKit::WebURLError; +using WebKit::WebURLLoader; +using WebKit::WebURLRequest; +using WebKit::WebURLResponse; + +namespace webkit_glue { + +ResourceFetcher::ResourceFetcher(const GURL& url, WebFrame* frame, + Callback* c) + : url_(url), + callback_(c), + completed_(false) { + // Can't do anything without a frame. However, delegate can be NULL (so we + // can do a http request and ignore the results). + DCHECK(frame); + Start(frame); +} + +ResourceFetcher::~ResourceFetcher() { + if (!completed_ && loader_.get()) + loader_->cancel(); +} + +void ResourceFetcher::Cancel() { + if (!completed_) { + loader_->cancel(); + completed_ = true; + } +} + +void ResourceFetcher::Start(WebFrame* frame) { + WebURLRequest request(url_); + frame->dispatchWillSendRequest(request); + + loader_.reset(WebKit::webKitClient()->createURLLoader()); + loader_->loadAsynchronously(request, this); +} + +///////////////////////////////////////////////////////////////////////////// +// WebURLLoaderClient methods + +void ResourceFetcher::willSendRequest( + WebURLLoader* loader, WebURLRequest& new_request, + const WebURLResponse& redirect_response) { +} + +void ResourceFetcher::didSendData( + WebURLLoader* loader, unsigned long long bytes_sent, + unsigned long long total_bytes_to_be_sent) { +} + +void ResourceFetcher::didReceiveResponse( + WebURLLoader* loader, const WebURLResponse& response) { + DCHECK(!completed_); + response_ = response; +} + +void ResourceFetcher::didReceiveData( + WebURLLoader* loader, const char* data, int data_length) { + DCHECK(!completed_); + DCHECK(data_length > 0); + + data_.append(data, data_length); +} + +void ResourceFetcher::didReceiveCachedMetadata( + WebURLLoader* loader, const char* data, int data_length) { + DCHECK(!completed_); + DCHECK(data_length > 0); + + metadata_.assign(data, data_length); +} + +void ResourceFetcher::didFinishLoading(WebURLLoader* loader) { + DCHECK(!completed_); + completed_ = true; + + if (callback_.get()) { + callback_->Run(response_, data_); + callback_.reset(); + } +} + +void ResourceFetcher::didFail(WebURLLoader* loader, const WebURLError& error) { + DCHECK(!completed_); + completed_ = true; + + // Go ahead and tell our delegate that we're done. + if (callback_.get()) { + callback_->Run(WebURLResponse(), std::string()); + callback_.reset(); + } +} + +///////////////////////////////////////////////////////////////////////////// +// A resource fetcher with a timeout + +ResourceFetcherWithTimeout::ResourceFetcherWithTimeout( + const GURL& url, WebFrame* frame, int timeout_secs, Callback* c) + : ResourceFetcher(url, frame, c) { + timeout_timer_.Start(TimeDelta::FromSeconds(timeout_secs), this, + &ResourceFetcherWithTimeout::TimeoutFired); +} + +void ResourceFetcherWithTimeout::TimeoutFired() { + if (!completed_) { + loader_->cancel(); + didFail(NULL, WebURLError()); + } +} + +} // namespace webkit_glue |