15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_WEB_RESOURCE_WEB_RESOURCE_SERVICE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_WEB_RESOURCE_WEB_RESOURCE_SERVICE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/json_asynchronous_unpacker.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/web_resource/resource_request_allowed_notifier.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WebResourceService fetches JSON data from a web server and periodically 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// refreshes it. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebResourceService 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public net::URLFetcherDelegate, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public JSONAsynchronousUnpackerDelegate, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::RefCountedThreadSafe<WebResourceService>, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ResourceRequestAllowedNotifier::Observer { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebResourceService(PrefService* prefs, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& web_resource_server, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool apply_locale_to_url_, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* last_update_time_pref_name, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_fetch_delay_ms, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_update_delay_ms); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sleep until cache needs to be updated, but always for at least 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |start_fetch_delay_ms| so we don't interfere with startup. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then begin updating resources. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartAfterDelay(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JSONAsynchronousUnpackerDelegate methods. 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnUnpackFinished( 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& parsed_json) OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUnpackError(const std::string& error_message) OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebResourceService(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the subclasses to process the result of a fetch. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Unpack(const base::DictionaryValue& parsed_json) = 0; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class UnpackerClient; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<WebResourceService>; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::URLFetcherDelegate implementation: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a fetch after |delay_ms| milliseconds. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleFetch(int64 delay_ms); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts fetching data from the server. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFetch(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set |in_fetch_| to false, clean up temp directories (in the future). 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndFetch(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Implements ResourceRequestAllowedNotifier::Observer. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnResourceRequestsAllowed() OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper class used to tell this service if it's allowed to make network 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resource requests. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceRequestAllowedNotifier resource_request_allowed_notifier_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tool that fetches the url data from the server. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLFetcher> url_fetcher_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tool that parses and transforms the json data. Weak reference as it 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deletes itself once the unpack is done. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONAsynchronousUnpacker* json_unpacker_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we are currently fetching or unpacking data. If we are asked to 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // start a fetch when we are still fetching resource data, schedule another 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one in |cache_update_delay_ms_| time, and silently exit. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool in_fetch_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL that hosts the web resource. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL web_resource_server_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether we should append locale to the web resource server URL. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool apply_locale_to_url_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pref name to store the last update's time. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* last_update_time_pref_name_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delay on first fetch so we don't interfere with startup. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_fetch_delay_ms_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delay between calls to update the web resource cache. This delay may be 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different for different builds of Chrome. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_update_delay_ms_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // So that we can delay our start so as not to affect start-up time; also, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that we can schedule future cache updates. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<WebResourceService> weak_ptr_factory_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebResourceService); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_WEB_RESOURCE_WEB_RESOURCE_SERVICE_H_ 120