Commit 1241847a authored by markusheintz's avatar markusheintz Committed by Commit bot

Simplify the ImageDataFetcher code.

BUG=609127

Review-Url: https://codereview.chromium.org/2073753002
Cr-Commit-Position: refs/heads/master@{#400642}
parent 6a85b3b9
......@@ -6,7 +6,6 @@
#include "net/base/load_flags.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context_getter.h"
#include "net/url_request/url_request_status.h"
......@@ -14,71 +13,23 @@
namespace image_fetcher {
// An active image URL fetcher request. The class contains any related request
// state and logic for handling a single image url request.
class ImageDataFetcher::ImageDataFetcherRequest
: public net::URLFetcherDelegate {
public:
ImageDataFetcherRequest(const GURL& url,
const ImageDataFetcherCallback& callback,
ImageDataFetcher* image_url_fetcher);
~ImageDataFetcherRequest() override {}
// An active image URL fetcher request. The struct contains the related requests
// state.
struct ImageDataFetcher::ImageDataFetcherRequest {
ImageDataFetcherRequest(const ImageDataFetcherCallback& callback,
std::unique_ptr<net::URLFetcher> url_fetcher)
: callback(callback),
url_fetcher(std::move(url_fetcher)) {}
// Sends the URL requests.
void Start(net::URLRequestContextGetter* request_context);
private:
// Method inherited from URLFetcherDelegate
void OnURLFetchComplete(const net::URLFetcher* source) override;
// The URL of the image to fetch.
const GURL url_;
~ImageDataFetcherRequest() {}
// The callback to run after the image data was fetched. The callback will
// be run even if the image data could not be fetched successfully.
ImageDataFetcherCallback callback_;
// The ImageDataFetcher that owns the ImageDataFetcherRequest.
ImageDataFetcher* image_url_fetcher_;
ImageDataFetcherCallback callback;
std::unique_ptr<net::URLFetcher> url_fetcher_;
DISALLOW_COPY_AND_ASSIGN(ImageDataFetcherRequest);
std::unique_ptr<net::URLFetcher> url_fetcher;
};
ImageDataFetcher::ImageDataFetcherRequest::ImageDataFetcherRequest(
const GURL& url,
const ImageDataFetcherCallback& callback,
ImageDataFetcher* image_url_fetcher)
: url_(url),
callback_(callback),
image_url_fetcher_(image_url_fetcher) {
}
void ImageDataFetcher::ImageDataFetcherRequest::Start(
net::URLRequestContextGetter* request_context) {
DCHECK(!url_fetcher_);
url_fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this);
url_fetcher_->SetRequestContext(request_context);
url_fetcher_->Start();
}
void ImageDataFetcher::ImageDataFetcherRequest::OnURLFetchComplete(
const net::URLFetcher* source) {
// An empty string is passed to the callback in case on an unsuccessfull URL
// request.
std::string image_data;
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS) {
source->GetResponseAsString(&image_data);
}
callback_.Run(image_data);
// Remove the completed ImageDataFetcherRequest from the internal request
// queue. This must be last in the method.
image_url_fetcher_->RemoveImageDataFetcherRequest(url_);
}
ImageDataFetcher::ImageDataFetcher(
net::URLRequestContextGetter* url_request_context_getter)
: url_request_context_getter_(url_request_context_getter) {}
......@@ -87,15 +38,29 @@ ImageDataFetcher::~ImageDataFetcher() {}
void ImageDataFetcher::FetchImageData(
const GURL& url, const ImageDataFetcherCallback& callback) {
std::unique_ptr<net::URLFetcher> url_fetcher =
net::URLFetcher::Create(url, net::URLFetcher::GET, this);
std::unique_ptr<ImageDataFetcherRequest> request(
new ImageDataFetcherRequest(url, callback, this));
request->Start(url_request_context_getter_.get());
pending_requests_[url] = std::move(request);
new ImageDataFetcherRequest(callback, std::move(url_fetcher)));
request->url_fetcher->SetRequestContext(url_request_context_getter_.get());
request->url_fetcher->Start();
pending_requests_[request->url_fetcher.get()] = std::move(request);
}
void ImageDataFetcher::RemoveImageDataFetcherRequest(const GURL& image_url) {
size_t count = pending_requests_.erase(image_url);
DCHECK(count);
void ImageDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
auto request_iter = pending_requests_.find(source);
DCHECK(request_iter != pending_requests_.end());
std::string image_data;
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS) {
source->GetResponseAsString(&image_data);
}
request_iter->second->callback.Run(image_data);
// Remove the finished request.
pending_requests_.erase(request_iter);
}
} // namespace image_fetcher
......@@ -12,22 +12,24 @@
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h"
namespace net {
class URLFetcher;
class URLRequestContextGetter;
} // namespace net
namespace image_fetcher {
class ImageDataFetcher {
class ImageDataFetcher : public net::URLFetcherDelegate {
public:
using ImageDataFetcherCallback =
base::Callback<void(const std::string& image_data)>;
explicit ImageDataFetcher(
net::URLRequestContextGetter* url_request_context_getter);
~ImageDataFetcher();
~ImageDataFetcher() override;
// Fetches the raw image bytes from the given |image_url| and calls the given
// |callback|. The callback is run even if fetching the URL fails. In case
......@@ -36,14 +38,13 @@ class ImageDataFetcher {
const ImageDataFetcherCallback& callback);
private:
class ImageDataFetcherRequest;
struct ImageDataFetcherRequest;
// Removes the ImageDataFetcherRequest for the given |image_url| from the
// internal request queue.
void RemoveImageDataFetcherRequest(const GURL& image_url);
// Method inherited from URLFetcherDelegate
void OnURLFetchComplete(const net::URLFetcher* source) override;
// All active image url requests.
std::map<const GURL, std::unique_ptr<ImageDataFetcherRequest>>
std::map<const net::URLFetcher*, std::unique_ptr<ImageDataFetcherRequest>>
pending_requests_;
scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment