- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / identity / experimental_web_auth_flow.h
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_EXTENSIONS_API_IDENTITY_EXPERIMENTAL_WEB_AUTH_FLOW_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_EXPERIMENTAL_WEB_AUTH_FLOW_H_
7
8 #include "chrome/browser/ui/host_desktop.h"
9 #include "content/public/browser/notification_observer.h"
10 #include "content/public/browser/notification_registrar.h"
11 #include "content/public/browser/web_contents_observer.h"
12 #include "ui/gfx/rect.h"
13 #include "url/gurl.h"
14
15 class Profile;
16 class ExperimentalWebAuthFlowTest;
17
18 namespace content {
19 class NotificationDetails;
20 class NotificationSource;
21 class RenderViewHost;
22 class WebContents;
23 }
24
25 namespace extensions {
26
27 // Controller class for web based auth flows. The
28 // ExperimentalWebAuthFlow starts by navigating a WebContents to a URL
29 // specificed by the caller. Any time the WebContents navigates to a
30 // new URL, the flow's delegate is notified. The delegate is expected
31 // to delete the flow when navigation reaches a known target URL.
32 //
33 // The WebContents is not displayed until the first page load
34 // completes. This allows the flow to complete without flashing a
35 // window on screen if the provider immediately redirects to the
36 // target URL.
37 //
38 // A ExperimentalWebAuthFlow can be started in Mode::SILENT, which
39 // never displays a window. If a window would be required, the flow
40 // fails.
41 class ExperimentalWebAuthFlow : public content::NotificationObserver,
42                     public content::WebContentsObserver {
43  public:
44   enum Mode {
45     INTERACTIVE,  // Show UI to the user if necessary.
46     SILENT        // No UI should be shown.
47   };
48
49   enum Failure {
50     WINDOW_CLOSED,  // Window closed by user.
51     INTERACTION_REQUIRED  // Non-redirect page load in silent mode.
52   };
53
54   class Delegate {
55    public:
56     // Called when the auth flow fails. This means that the flow did not result
57     // in a successful redirect to a valid redirect URL.
58     virtual void OnAuthFlowFailure(Failure failure) = 0;
59     // Called on redirects and other navigations to see if the URL should stop
60     // the flow.
61     virtual void OnAuthFlowURLChange(const GURL& redirect_url) = 0;
62
63    protected:
64     virtual ~Delegate() {}
65   };
66
67   // Creates an instance with the given parameters.
68   // Caller owns |delegate|.
69   ExperimentalWebAuthFlow(Delegate* delegate,
70               Profile* profile,
71               const GURL& provider_url,
72               Mode mode,
73               const gfx::Rect& initial_bounds,
74               chrome::HostDesktopType host_desktop_type);
75   virtual ~ExperimentalWebAuthFlow();
76
77   // Starts the flow.
78   virtual void Start();
79
80   // Prevents further calls to the delegate and deletes the flow.
81   void DetachDelegateAndDelete();
82
83  protected:
84   // Overridable for testing.
85   virtual content::WebContents* CreateWebContents();
86   virtual void ShowAuthFlowPopup();
87
88  private:
89   friend class ::ExperimentalWebAuthFlowTest;
90
91   // NotificationObserver implementation.
92   virtual void Observe(int type,
93                        const content::NotificationSource& source,
94                        const content::NotificationDetails& details) OVERRIDE;
95
96   // WebContentsObserver implementation.
97   virtual void ProvisionalChangeToMainFrameUrl(
98       const GURL& url,
99       content::RenderViewHost* render_view_host) OVERRIDE;
100   virtual void DidStopLoading(
101       content::RenderViewHost* render_view_host) OVERRIDE;
102   virtual void WebContentsDestroyed(
103       content::WebContents* web_contents) OVERRIDE;
104
105   void BeforeUrlLoaded(const GURL& url);
106   void AfterUrlLoaded();
107
108   Delegate* delegate_;
109   Profile* profile_;
110   GURL provider_url_;
111   Mode mode_;
112   gfx::Rect initial_bounds_;
113   chrome::HostDesktopType host_desktop_type_;
114   bool popup_shown_;
115
116   content::WebContents* contents_;
117   content::NotificationRegistrar registrar_;
118
119   DISALLOW_COPY_AND_ASSIGN(ExperimentalWebAuthFlow);
120 };
121
122 }  // namespace extensions
123
124 #endif  // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_EXPERIMENTAL_WEB_AUTH_FLOW_H_