Home | History | Annotate | Download | only in signin
      1 // Copyright 2014 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_SIGNIN_MERGE_SESSION_THROTTLE_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_SIGNIN_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 "content/public/browser/resource_throttle.h"
     14 #include "net/base/completion_callback.h"
     15 #include "webkit/common/resource_type.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   // Passed a boolean indicating whether or not it is OK to proceed with the
     35   // page load.
     36   typedef base::Closure CompletionCallback;
     37 
     38   explicit MergeSessionThrottle(net::URLRequest* request,
     39                                 ResourceType::Type resource_type);
     40   virtual ~MergeSessionThrottle();
     41 
     42   // content::ResourceThrottle implementation:
     43   virtual void WillStartRequest(bool* defer) OVERRIDE;
     44   virtual const char* GetNameForLogging() const OVERRIDE;
     45 
     46   // Checks if session is already merged.
     47   static bool AreAllSessionMergedAlready();
     48 
     49  private:
     50 
     51   // MergeSessionLoadPage callback.
     52   void OnBlockingPageComplete();
     53 
     54   // Erase the state associated with a deferred load request.
     55   void ClearRequestInfo();
     56   bool IsRemote(const GURL& url) const;
     57 
     58   // True if we |url| loading should be delayed. The function
     59   // is safe to be called on any thread.
     60   bool ShouldDelayUrl(const GURL& url) const;
     61 
     62   // Adds/removes |profile| to/from the blocking profiles set.
     63   static void BlockProfile(Profile* profile);
     64   static void UnblockProfile(Profile* profile);
     65 
     66   // Helper method that checks if we should delay reasource loading based on
     67   // the state of the Profile that's derived from |render_process_id| and
     68   // |render_view_id|.
     69   static bool ShouldDelayRequest(int render_process_id,
     70                                  int render_view_id);
     71 
     72   // Tests merge session status and if needed generates request
     73   // waiter (for ResourceType::XHR content) or shows interstitial page
     74   // (for ResourceType::MAIN_FRAME).
     75   // The function must be called from UI thread.
     76   static void DeleayResourceLoadingOnUIThread(
     77       ResourceType::Type resource_type,
     78       int render_process_id,
     79       int render_view_id,
     80       const GURL& url,
     81       const MergeSessionThrottle::CompletionCallback& callback);
     82 
     83   net::URLRequest* request_;
     84   ResourceType::Type resource_type_;
     85 
     86   // Global counter that keeps the track of session merge status for all
     87   // encountered profiles. This is used to determine if a throttle should
     88   // even be even added to new requests. Value of 0 (initial) means that we
     89   // probably have some profiles to restore, while 1 means that all known
     90   // profiles are restored.
     91   static base::AtomicRefCount all_profiles_restored_;
     92 
     93   DISALLOW_COPY_AND_ASSIGN(MergeSessionThrottle);
     94 };
     95 
     96 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SIGNIN_MERGE_SESSION_THROTTLE_H_
     97