blob: 9944c70d872bda2b6080afd0e98d45a4c8741f6b [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 <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string16.h"
#include "components/keyed_service/core/keyed_service.h"
class GURL;
class TemplateURL;
class TemplateURLService;
namespace network {
namespace mojom {
class URLLoaderFactory;
} // namespace network
namespace url {
class Origin;
// 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 {
// Creates a TemplateURLFetcher.
explicit TemplateURLFetcher(TemplateURLService* template_url_service);
~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.
void ScheduleDownload(const base::string16& keyword,
const GURL& osdd_url,
const GURL& favicon_url,
const url::Origin& initiator,
network::mojom::URLLoaderFactory* url_loader_factory,
int render_frame_id,
int resource_type);
// 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_;
// In progress requests.
std::vector<std::unique_ptr<RequestDelegate>> requests_;