// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "ui/views/widget/widget_observer.h" namespace content { class WebContents; } namespace views { class Widget; } namespace chromeos { class CaptivePortalView; // Delegate interface for CaptivePortalWindowProxy. class CaptivePortalWindowProxyDelegate { public: // Called when a captive portal is detected. virtual void OnPortalDetected() = 0; protected: virtual ~CaptivePortalWindowProxyDelegate() {} }; // Proxy which manages showing of the window for CaptivePortal sign-in. class CaptivePortalWindowProxy : public views::WidgetObserver { public: typedef CaptivePortalWindowProxyDelegate Delegate; CaptivePortalWindowProxy(Delegate* delegate, content::WebContents* web_contents); virtual ~CaptivePortalWindowProxy(); // Shows captive portal window only after a redirection has happened. So it is // safe to call this method, when the caller isn't 100% sure that the network // is in the captive portal state. // Subsequent call to this method would reuses existing view // but reloads test page (generate_204). void ShowIfRedirected(); // Forces captive portal window show. void Show(); // Closes the window. void Close(); // Called by CaptivePortalView when URL loading was redirected from the // original URL. void OnRedirected(); // Called by CaptivePortalView when origin URL is loaded without any // redirections. void OnOriginalURLLoaded(); // Overridden from views::WidgetObserver: virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE; virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE; private: friend class CaptivePortalWindowTest; friend class SimpleWebViewDialogTest; // Possible transitions between states: // // wp(ShowIfRedirected(), WAITING_FOR_REDIRECTION) = IDLE // wp(Show(), DISPLAYED) = IDLE | WAITING_FOR_REDIRECTION // wp(Close(), IDLE) = WAITING_FOR_REDIRECTION | DISPLAYED // wp(OnRedirected(), DISPLAYED) = WAITING_FOR_REDIRECTION // wp(OnOriginalURLLoaded(), IDLE) = WAITING_FOR_REDIRECTION | DISPLAYED // // where wp(E, S) is a weakest precondition (initial state) such // that after execution of E the system will be surely in the state S. enum State { STATE_IDLE = 0, STATE_WAITING_FOR_REDIRECTION, STATE_DISPLAYED, STATE_UNKNOWN }; // Initializes |captive_portal_view_| if it is not initialized and // starts loading Captive Portal redirect URL. void InitCaptivePortalView(); // Returns symbolic state name based on internal state. State GetState() const; // When |widget| is not NULL and the same as |widget_| stops to observe // notifications from |widget_| and resets it. void DetachFromWidget(views::Widget* widget); CaptivePortalView* captive_portal_view_for_testing() { return captive_portal_view_for_testing_; } // Not owned by this class. Delegate* delegate_; // Not owned by this class. views::Widget* widget_; scoped_ptr<CaptivePortalView> captive_portal_view_; // Not owned by this class. content::WebContents* web_contents_; CaptivePortalView* captive_portal_view_for_testing_; DISALLOW_COPY_AND_ASSIGN(CaptivePortalWindowProxy); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LOGIN_CAPTIVE_PORTAL_WINDOW_PROXY_H_