Home | History | Annotate | Download | only in instant
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_INSTANT_INSTANT_LOADER_MANAGER_H_
      6 #define CHROME_BROWSER_INSTANT_INSTANT_LOADER_MANAGER_H_
      7 #pragma once
      8 
      9 #include <map>
     10 
     11 #include "base/memory/scoped_ptr.h"
     12 #include "chrome/browser/search_engines/template_url_id.h"
     13 
     14 class InstantLoader;
     15 class InstantLoaderDelegate;
     16 
     17 // InstantLoaderManager is responsible for maintaining the InstantLoaders for
     18 // InstantController. InstantLoaderManager keeps track of one loader for loading
     19 // non-instant urls, and a loader per TemplateURLID for loading instant urls. A
     20 // loader per TemplateURLID is necessitated due to not knowing in advance if a
     21 // site really supports instant (for example, the user might have opted out even
     22 // though it's supported).
     23 //
     24 // Users of InstantLoaderManager need only concern themselves with the current
     25 // and pending loaders. The current loader is the loader that if ready is shown
     26 // by InstantController. The pending loader is used if the current loader is
     27 // ready and update is invoked with a different id. In this case the current
     28 // loader is left as current (and it's preview contents stopped) and the newly
     29 // created loader is set to pending.  Once the pending loader is ready
     30 // MakePendingCurrent should be invoked to make the pending the current loader.
     31 //
     32 // InstantLoader owns all the InstantLoaders returned. You can take
     33 // ownership of the current loader by invoking ReleaseCurrentLoader.
     34 class InstantLoaderManager {
     35  public:
     36   explicit InstantLoaderManager(InstantLoaderDelegate* loader_delegate);
     37   ~InstantLoaderManager();
     38 
     39   // Updates the current loader. If the current loader is replaced and should be
     40   // deleted it is set in |old_loader|. This is done to allow the caller to
     41   // notify delegates before the old loader is destroyed. This returns the
     42   // active InstantLoader that should be used.
     43   InstantLoader* UpdateLoader(TemplateURLID instant_id,
     44                               scoped_ptr<InstantLoader>* old_loader);
     45 
     46   // Returns true if invoking |UpdateLoader| with |instant_id| would change the
     47   // active loader.
     48   bool WillUpateChangeActiveLoader(TemplateURLID instant_id);
     49 
     50   // Makes the pending loader the current loader. If ownership of the old
     51   // loader is to pass to the caller |old_loader| is set appropriately.
     52   void MakePendingCurrent(scoped_ptr<InstantLoader>* old_loader);
     53 
     54   // Returns the current loader and clears internal references to it.  This
     55   // should be used prior to destroying the InstantLoaderManager when the owner
     56   // of InstantLoaderManager wants to take ownership of the loader.
     57   InstantLoader* ReleaseCurrentLoader();
     58 
     59   // Destroys the specified loader.
     60   void DestroyLoader(InstantLoader* loader);
     61 
     62   // Removes references to loader.
     63   InstantLoader* ReleaseLoader(InstantLoader* loader);
     64 
     65   // If |loader| is in |instant_loaders_| it is removed.
     66   void RemoveLoaderFromInstant(InstantLoader* loader);
     67 
     68   // Returns the current loader, may be null.
     69   InstantLoader* current_loader() const { return current_loader_; }
     70 
     71   // Returns the pending loader, may be null.
     72   InstantLoader* pending_loader() const { return pending_loader_; }
     73 
     74   // The active loader is the loader that should be used for new loads. It is
     75   // either the pending loader or the current loader.
     76   InstantLoader* active_loader() const {
     77     return pending_loader_ ? pending_loader_ : current_loader_;
     78   }
     79 
     80   // Returns the number of instant loaders.
     81   // This is exposed for tests.
     82   size_t num_instant_loaders() const { return instant_loaders_.size(); }
     83 
     84  private:
     85   typedef std::map<TemplateURLID, InstantLoader*> Loaders;
     86 
     87   // Creates a loader and if |id| is non-zero registers it in instant_loaders_.
     88   InstantLoader* CreateLoader(TemplateURLID id);
     89 
     90   // Returns the loader for loading instant results with the specified id. If
     91   // there is no loader for the specified id a new one is created.
     92   InstantLoader* GetInstantLoader(TemplateURLID id);
     93 
     94   InstantLoaderDelegate* loader_delegate_;
     95 
     96   // The current loader.
     97   InstantLoader* current_loader_;
     98 
     99   // Loader we want to use as soon as ready. This is only non-null if
    100   // current_loader_ is ready and Update is invoked with a different template
    101   // url id.
    102   InstantLoader* pending_loader_;
    103 
    104   // Maps for template url id to loader used for that template url id.
    105   Loaders instant_loaders_;
    106 
    107   DISALLOW_COPY_AND_ASSIGN(InstantLoaderManager);
    108 };
    109 
    110 #endif  // CHROME_BROWSER_INSTANT_INSTANT_LOADER_MANAGER_H_
    111