Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2013 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_CHROMEOS_LOGIN_MERGE_SESSION_THROTTLE_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_MERGE_SESSION_THROTTLE_H_
      7 
      8 #include <set>
      9 
     10 #include "base/atomic_ref_count.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "chrome/browser/chromeos/login/merge_session_load_page.h"
     14 #include "content/public/browser/resource_throttle.h"
     15 #include "net/base/completion_callback.h"
     16 
     17 class Profile;
     18 
     19 namespace net {
     20 class URLRequest;
     21 }
     22 
     23 namespace chromeos {
     24 class OAuth2LoginManager;
     25 }
     26 
     27 // Used to show an interstitial page while merge session process (cookie
     28 // reconstruction from OAuth2 refresh token in ChromeOS login) is still in
     29 // progress while we are attempting to load a google property.
     30 class MergeSessionThrottle
     31     : public content::ResourceThrottle,
     32       public base::SupportsWeakPtr<MergeSessionThrottle> {
     33  public:
     34   explicit MergeSessionThrottle(net::URLRequest* request);
     35   virtual ~MergeSessionThrottle();
     36 
     37   // content::ResourceThrottle implementation:
     38   virtual void WillStartRequest(bool* defer) OVERRIDE;
     39   virtual const char* GetNameForLogging() const OVERRIDE;
     40 
     41   // Checks if session is already merged.
     42   static bool AreAllSessionMergedAlready();
     43 
     44  private:
     45 
     46   // MergeSessionLoadPage callback.
     47   void OnBlockingPageComplete();
     48 
     49   // Erase the state associated with a deferred load request.
     50   void ClearRequestInfo();
     51   bool IsRemote(const GURL& url) const;
     52 
     53   // True if we should show the merge session in progress page. The function
     54   // is safe to be called on any thread.
     55   bool ShouldShowMergeSessionPage(const GURL& url) const;
     56 
     57   // Adds/removes |profile| to/from the blocking profiles set.
     58   static void BlockProfile(Profile* profile);
     59   static void UnblockProfile(Profile* profile);
     60 
     61   // Helper method that checks if we should show interstitial page based on
     62   // the state of the Profile that's derived from |render_process_id| and
     63   // |render_view_id|.
     64   static bool ShouldShowInterstitialPage(int render_process_id,
     65                                          int render_view_id);
     66 
     67   // Tests merge session status and if needed shows interstitial page.
     68   // The function must be called from UI thread.
     69   static void ShowDeleayedLoadingPageOnUIThread(
     70       int render_process_id,
     71       int render_view_id,
     72       const GURL& url,
     73       const chromeos::MergeSessionLoadPage::CompletionCallback& callback);
     74 
     75   net::URLRequest* request_;
     76 
     77   // Global counter that keeps the track of session merge status for all
     78   // encountered profiles. This is used to determine if a throttle should
     79   // even be even added to new requests. Value of 0 (initial) means that we
     80   // probably have some profiles to restore, while 1 means that all known
     81   // profiles are restored.
     82   static base::AtomicRefCount all_profiles_restored_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(MergeSessionThrottle);
     85 };
     86 
     87 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_MERGE_SESSION_THROTTLE_H_
     88