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