11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_MANAGER_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_MANAGER_H_
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <map>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_common.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetcher.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass URLRequestContextGetter;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace predictors {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct NavigationID;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ResourcePrefetchPredictor;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Manages prefetches for multple navigations.
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//  - Created and owned by the resource prefetch predictor.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//  - Needs to be refcounted as it is de-referenced on two different threads.
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//  - Created on the UI thread, but most functions are called in the IO thread.
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//  - Will only allow one inflight prefresh per main frame URL.
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ResourcePrefetcherManager
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    :  public ResourcePrefetcher::Delegate,
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       public base::RefCountedThreadSafe<ResourcePrefetcherManager> {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The |predictor| should be alive till ShutdownOnIOThread is called.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourcePrefetcherManager(ResourcePrefetchPredictor* predictor,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            const ResourcePrefetchPredictorConfig& config,
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            net::URLRequestContextGetter* getter);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // UI thread.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ShutdownOnUIThread();
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // --- IO Thread methods.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The prefetchers need to be deleted on the IO thread.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ShutdownOnIOThread();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Will create a new ResourcePrefetcher for the main frame url of the input
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // navigation if there isn't one already for the same URL or host (for host
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // based).
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void MaybeAddPrefetch(const NavigationID& navigation_id,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        PrefetchKeyType key_type,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        scoped_ptr<ResourcePrefetcher::RequestVector> requests);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Stops the ResourcePrefetcher for the input navigation, if one was in
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // progress.
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void MaybeRemovePrefetch(const NavigationID& navigation_id);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ResourcePrefetcher::Delegate methods.
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ResourcePrefetcherFinished(
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourcePrefetcher* prefetcher,
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourcePrefetcher::RequestVector* requests) OVERRIDE;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class base::RefCountedThreadSafe<ResourcePrefetcherManager>;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class MockResourcePrefetcherManager;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef std::map<std::string, ResourcePrefetcher*> PrefetcherMap;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ResourcePrefetcherManager();
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // UI Thread. |predictor_| needs to be called on the UI thread.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ResourcePrefetcherFinishedOnUI(
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const NavigationID& navigation_id,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrefetchKeyType key_type,
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<ResourcePrefetcher::RequestVector> requests);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourcePrefetchPredictor* predictor_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ResourcePrefetchPredictorConfig config_;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::URLRequestContextGetter* const context_getter_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefetcherMap prefetcher_map_;  // Owns the ResourcePrefetcher pointers.
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ResourcePrefetcherManager);
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace predictors
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCHER_MANAGER_H_
88