Home | History | Annotate | Download | only in prerender
      1 // Copyright (c) 2012 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_PRERENDER_PRERENDER_TRACKER_H_
      6 #define CHROME_BROWSER_PRERENDER_PRERENDER_TRACKER_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <utility>
     11 
     12 #include "base/containers/hash_tables.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "base/synchronization/lock.h"
     16 #include "chrome/browser/prerender/prerender_cookie_store.h"
     17 #include "content/public/browser/render_process_host_observer.h"
     18 #include "url/gurl.h"
     19 
     20 namespace net {
     21 class URLRequestContextGetter;
     22 }
     23 
     24 namespace prerender {
     25 
     26 class PrerenderPendingSwapThrottle;
     27 
     28 // Global object for maintaining various prerender state on the IO thread.
     29 class PrerenderTracker {
     30  public:
     31   typedef std::pair<int, int> ChildRouteIdPair;
     32 
     33   PrerenderTracker();
     34   virtual ~PrerenderTracker();
     35 
     36   // Returns whether or not a RenderFrame and URL are regarding a pending
     37   // prerender swap. Can only be called on the IO thread.
     38   bool IsPendingSwapRequestOnIOThread(int render_process_id,
     39                                       int render_frame_id,
     40                                       const GURL& url) const;
     41 
     42   // Called when a PrerenderPendingSwapThrottle defers a request. Cancel or
     43   // Resume will be called on |throttle| when the prerender is canceled or used,
     44   // respectively.
     45   void AddPendingSwapThrottleOnIOThread(
     46       int render_process_id, int render_frame_id, const GURL& url,
     47       const base::WeakPtr<PrerenderPendingSwapThrottle>& throttle);
     48 
     49   // Called to add throttles for a pending prerender swap.
     50   void AddPrerenderPendingSwap(
     51       const ChildRouteIdPair& render_frame_route_id_pair,
     52       const GURL& url);
     53 
     54   // Called to remove the throttles for a pending prerender swap.
     55   void RemovePrerenderPendingSwap(
     56       const ChildRouteIdPair& render_frame_route_id_pair,
     57       bool swap_successful);
     58 
     59   // Gets the Prerender Cookie Store for a specific render process, if it
     60   // is a prerender. Only to be called from the IO thread.
     61   scoped_refptr<PrerenderCookieStore> GetPrerenderCookieStoreForRenderProcess(
     62       int process_id);
     63 
     64   // Called when a given render process has changed a cookie for |url|,
     65   // in |cookie_monster|.
     66   // Only to be called from the IO thread.
     67   void OnCookieChangedForURL(int process_id,
     68                              net::CookieMonster* cookie_monster,
     69                              const GURL& url);
     70 
     71   void AddPrerenderCookieStoreOnIOThread(
     72       int process_id,
     73       scoped_refptr<net::URLRequestContextGetter> request_context,
     74       const base::Closure& cookie_conflict_cb);
     75 
     76   void RemovePrerenderCookieStoreOnIOThread(int process_id, bool was_swapped);
     77 
     78  private:
     79   // Add/remove prerenders pending swap on the IO Thread.
     80   void AddPrerenderPendingSwapOnIOThread(
     81       const ChildRouteIdPair& render_frame_route_id_pair, const GURL& url);
     82   void RemovePrerenderPendingSwapOnIOThread(
     83       const ChildRouteIdPair& render_frame_route_id_pair,
     84       bool swap_successful);
     85 
     86   struct PendingSwapThrottleData {
     87     explicit PendingSwapThrottleData(const GURL& swap_url);
     88     ~PendingSwapThrottleData();
     89     GURL url;
     90     base::WeakPtr<PrerenderPendingSwapThrottle> throttle;
     91   };
     92 
     93   // Map of pending prerender swaps and their associated throttles,
     94   // maintained on the IO thread. The key is the routing ID pair
     95   // of a RenderFrame.
     96   typedef std::map<ChildRouteIdPair, PendingSwapThrottleData>
     97       PendingSwapThrottleMap;
     98   PendingSwapThrottleMap pending_swap_throttle_map_;
     99 
    100   // Map of prerendering render process ids to PrerenderCookieStore used for
    101   // the prerender. Only to be used on the IO thread.
    102   typedef base::hash_map<int, scoped_refptr<PrerenderCookieStore> >
    103       PrerenderCookieStoreMap;
    104   PrerenderCookieStoreMap prerender_cookie_store_map_;
    105 
    106   DISALLOW_COPY_AND_ASSIGN(PrerenderTracker);
    107 };
    108 
    109 }  // namespace prerender
    110 
    111 #endif  // CHROME_BROWSER_PRERENDER_PRERENDER_TRACKER_H_
    112