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_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_ 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "ui/views/widget/widget_observer.h" 11 12 namespace content { 13 class WebContents; 14 } 15 16 namespace views { 17 class Widget; 18 } 19 20 namespace chromeos { 21 22 class CaptivePortalView; 23 24 // Delegate interface for CaptivePortalWindowProxy. 25 class CaptivePortalWindowProxyDelegate { 26 public: 27 // Called when a captive portal is detected. 28 virtual void OnPortalDetected() = 0; 29 30 protected: 31 virtual ~CaptivePortalWindowProxyDelegate() {} 32 }; 33 34 // Proxy which manages showing of the window for CaptivePortal sign-in. 35 class CaptivePortalWindowProxy : public views::WidgetObserver { 36 public: 37 typedef CaptivePortalWindowProxyDelegate Delegate; 38 39 CaptivePortalWindowProxy(Delegate* delegate, 40 content::WebContents* web_contents); 41 virtual ~CaptivePortalWindowProxy(); 42 43 // Shows captive portal window only after a redirection has happened. So it is 44 // safe to call this method, when the caller isn't 100% sure that the network 45 // is in the captive portal state. 46 // Subsequent call to this method would reuses existing view 47 // but reloads test page (generate_204). 48 void ShowIfRedirected(); 49 50 // Forces captive portal window show. 51 void Show(); 52 53 // Closes the window. 54 void Close(); 55 56 // Called by CaptivePortalView when URL loading was redirected from the 57 // original URL. 58 void OnRedirected(); 59 60 // Called by CaptivePortalView when origin URL is loaded without any 61 // redirections. 62 void OnOriginalURLLoaded(); 63 64 // Overridden from views::WidgetObserver: 65 virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE; 66 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; 67 virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE; 68 69 private: 70 friend class CaptivePortalWindowTest; 71 72 // Possible transitions between states: 73 // 74 // wp(ShowIfRedirected(), WAITING_FOR_REDIRECTION) = IDLE 75 // wp(Show(), DISPLAYED) = IDLE | WAITING_FOR_REDIRECTION 76 // wp(Close(), IDLE) = WAITING_FOR_REDIRECTION | DISPLAYED 77 // wp(OnRedirected(), DISPLAYED) = WAITING_FOR_REDIRECTION 78 // wp(OnOriginalURLLoaded(), IDLE) = WAITING_FOR_REDIRECTION | DISPLAYED 79 // 80 // where wp(E, S) is a weakest precondition (initial state) such 81 // that after execution of E the system will be surely in the state S. 82 enum State { 83 STATE_IDLE = 0, 84 STATE_WAITING_FOR_REDIRECTION, 85 STATE_DISPLAYED, 86 STATE_UNKNOWN 87 }; 88 89 // Initializes |captive_portal_view_| if it is not initialized and 90 // starts loading Captive Portal redirect URL. 91 void InitCaptivePortalView(); 92 93 // Returns symbolic state name based on internal state. 94 State GetState() const; 95 96 // When |widget| is not NULL and the same as |widget_| stops to observe 97 // notifications from |widget_| and resets it. 98 void DetachFromWidget(views::Widget* widget); 99 100 // Not owned by this class. 101 Delegate* delegate_; 102 // Not owned by this class. 103 views::Widget* widget_; 104 scoped_ptr<CaptivePortalView> captive_portal_view_; 105 106 // Not owned by this class. 107 content::WebContents* web_contents_; 108 109 DISALLOW_COPY_AND_ASSIGN(CaptivePortalWindowProxy); 110 }; 111 112 } // namespace chromeos 113 114 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_ 115