1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/callback_forward.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURL; 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TemplateURLService; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net { 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass URLFetcher; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass URLRequestContextGetter; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TemplateURLFetcher is responsible for downloading OpenSearch description 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// documents, creating a TemplateURL from the OSDD, and adding the TemplateURL 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the TemplateURLService. Downloading is done in the background. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TemplateURLFetcher : public KeyedService { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void( 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLFetcher* url_fetcher)> URLFetcherCustomizeCallback; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void( 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<TemplateURL> template_url)> ConfirmAddSearchProviderCallback; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ProviderType { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTODETECTED_PROVIDER, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPLICIT_PROVIDER // Supplied by Javascript. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Creates a TemplateURLFetcher. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TemplateURLFetcher(TemplateURLService* template_url_service, 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::URLRequestContextGetter* request_context); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TemplateURLFetcher(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If TemplateURLFetcher is not already downloading the OSDD for osdd_url, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is downloaded. If successful and the result can be parsed, a TemplateURL 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is added to the TemplateURLService. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |provider_type| is AUTODETECTED_PROVIDER, |keyword| must be non-empty, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and if there's already a non-replaceable TemplateURL in the model for 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |keyword|, or we're already downloading an OSDD for this keyword, no 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // download is started. If |provider_type| is EXPLICIT_PROVIDER, |keyword| is 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ignored. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If |url_fetcher_customize_callback| is not null, it's run after a 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // URLFetcher is created. This callback can be used to set additional 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // parameters on the URLFetcher. 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ScheduleDownload( 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& keyword, 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& osdd_url, 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& favicon_url, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const URLFetcherCustomizeCallback& url_fetcher_customize_callback, 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ConfirmAddSearchProviderCallback& confirm_add_callback, 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProviderType provider_type); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current number of outstanding requests. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int requests_count() const { return requests_.size(); } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A RequestDelegate is created to download each OSDD. When done downloading 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RequestCompleted is invoked back on the TemplateURLFetcher. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class RequestDelegate; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class RequestDelegate; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ScopedVector<RequestDelegate> Requests; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked from the RequestDelegate when done downloading. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestCompleted(RequestDelegate* request); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TemplateURLService* template_url_service_; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<net::URLRequestContextGetter> request_context_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In progress requests. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Requests requests_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TemplateURLFetcher); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_ 90