blob: c2c05ed4bd57168c5d7a16a33cc42890310200c7 [file] [log] [blame]
// Copyright 2014 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 <memory>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_vector.h"
#include "base/strings/string16.h"
#include "components/keyed_service/core/keyed_service.h"
class GURL;
class TemplateURL;
class TemplateURLService;
namespace net {
class URLFetcher;
class URLRequestContextGetter;
// TemplateURLFetcher is responsible for downloading OpenSearch description
// documents, creating a TemplateURL from the OSDD, and adding the TemplateURL
// to the TemplateURLService. Downloading is done in the background.
class TemplateURLFetcher : public KeyedService {
typedef base::Callback<void(
net::URLFetcher* url_fetcher)> URLFetcherCustomizeCallback;
// Creates a TemplateURLFetcher.
TemplateURLFetcher(TemplateURLService* template_url_service,
net::URLRequestContextGetter* request_context);
~TemplateURLFetcher() override;
// If TemplateURLFetcher is not already downloading the OSDD for osdd_url,
// it is downloaded. If successful and the result can be parsed, a TemplateURL
// is added to the TemplateURLService.
// |keyword| must be non-empty. If there's already a non-replaceable
// TemplateURL in the model for |keyword|, or we're already downloading an
// OSDD for this keyword, no download is started.
// If |url_fetcher_customize_callback| is not null, it's run after a
// URLFetcher is created. This callback can be used to set additional
// parameters on the URLFetcher.
void ScheduleDownload(
const base::string16& keyword,
const GURL& osdd_url,
const GURL& favicon_url,
const URLFetcherCustomizeCallback& url_fetcher_customize_callback);
// The current number of outstanding requests.
int requests_count() const { return requests_.size(); }
// A RequestDelegate is created to download each OSDD. When done downloading
// RequestCompleted is invoked back on the TemplateURLFetcher.
class RequestDelegate;
// Invoked from the RequestDelegate when done downloading. Virtual for tests.
virtual void RequestCompleted(RequestDelegate* request);
friend class RequestDelegate;
TemplateURLService* template_url_service_;
scoped_refptr<net::URLRequestContextGetter> request_context_;
// In progress requests.
std::vector<std::unique_ptr<RequestDelegate>> requests_;