• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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