diff options
12 files changed, 68 insertions, 94 deletions
diff --git a/chrome/browser/chromeos/login/captive_portal_window_browsertest.cc b/chrome/browser/chromeos/login/captive_portal_window_browsertest.cc index cccf9ae..23b2d1f 100644 --- a/chrome/browser/chromeos/login/captive_portal_window_browsertest.cc +++ b/chrome/browser/chromeos/login/captive_portal_window_browsertest.cc @@ -199,6 +199,10 @@ class CaptivePortalWindowCtorDtorTest : public LoginManagerTest { return network_portal_detector_; } + PortalDetectorStrategy::StrategyId strategy_id() { + return network_portal_detector_->strategy_id(); + } + private: NetworkPortalDetectorTestImpl* network_portal_detector_; @@ -210,16 +214,22 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalWindowCtorDtorTest, PRE_OpenPortalDialog) { } IN_PROC_BROWSER_TEST_F(CaptivePortalWindowCtorDtorTest, OpenPortalDialog) { - network_portal_detector()->NotifyObserversForTesting(); - OobeScreenWaiter(OobeDisplay::SCREEN_ERROR_MESSAGE).Wait(); LoginDisplayHostImpl* host = static_cast<LoginDisplayHostImpl*>(LoginDisplayHostImpl::default_host()); - ASSERT_TRUE(host); OobeUI* oobe = host->GetOobeUI(); ASSERT_TRUE(oobe); ErrorScreenActor* actor = oobe->GetErrorScreenActor(); ASSERT_TRUE(actor); + + // Error screen asks portal detector to change detection strategy. + ErrorScreen error_screen(NULL, actor); + + ASSERT_EQ(PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN, strategy_id()); + network_portal_detector()->NotifyObserversForTesting(); + OobeScreenWaiter(OobeDisplay::SCREEN_ERROR_MESSAGE).Wait(); + ASSERT_EQ(PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN, strategy_id()); + actor->ShowCaptivePortal(); } diff --git a/chrome/browser/chromeos/login/screens/error_screen.cc b/chrome/browser/chromeos/login/screens/error_screen.cc index a7a7bab..2aedaca 100644 --- a/chrome/browser/chromeos/login/screens/error_screen.cc +++ b/chrome/browser/chromeos/login/screens/error_screen.cc @@ -10,6 +10,7 @@ #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/net/network_portal_detector.h" +#include "chrome/browser/chromeos/net/network_portal_detector_strategy.h" #include "chrome/browser/chromeos/settings/cros_settings.h" namespace chromeos { @@ -22,22 +23,10 @@ ErrorScreen::ErrorScreen(ScreenObserver* screen_observer, weak_factory_(this) { DCHECK(actor_); actor_->SetDelegate(this); - AddObserver(NetworkPortalDetector::Get()); } ErrorScreen::~ErrorScreen() { actor_->SetDelegate(NULL); - RemoveObserver(NetworkPortalDetector::Get()); -} - -void ErrorScreen::AddObserver(Observer* observer) { - if (observer) - observers_.AddObserver(observer); -} - -void ErrorScreen::RemoveObserver(Observer* observer) { - if (observer) - observers_.RemoveObserver(observer); } void ErrorScreen::PrepareToShow() { @@ -58,11 +47,13 @@ std::string ErrorScreen::GetName() const { } void ErrorScreen::OnErrorShow() { - FOR_EACH_OBSERVER(Observer, observers_, OnErrorScreenShow()); + NetworkPortalDetector::Get()->SetStrategy( + PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN); } void ErrorScreen::OnErrorHide() { - FOR_EACH_OBSERVER(Observer, observers_, OnErrorScreenHide()); + NetworkPortalDetector::Get()->SetStrategy( + PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); } void ErrorScreen::OnLaunchOobeGuestSession() { diff --git a/chrome/browser/chromeos/login/screens/error_screen.h b/chrome/browser/chromeos/login/screens/error_screen.h index bd20d81..66cb770 100644 --- a/chrome/browser/chromeos/login/screens/error_screen.h +++ b/chrome/browser/chromeos/login/screens/error_screen.h @@ -9,7 +9,6 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/observer_list.h" #include "chrome/browser/chromeos/login/login_performer.h" #include "chrome/browser/chromeos/login/oobe_display.h" #include "chrome/browser/chromeos/login/screens/error_screen_actor_delegate.h" @@ -25,13 +24,6 @@ class ErrorScreen : public WizardScreen, public ErrorScreenActorDelegate, public LoginPerformer::Delegate { public: - class Observer { - public: - virtual ~Observer() {} - virtual void OnErrorScreenShow() = 0; - virtual void OnErrorScreenHide() = 0; - }; - enum UIState { UI_STATE_UNKNOWN = 0, UI_STATE_UPDATE, @@ -54,9 +46,6 @@ class ErrorScreen : public WizardScreen, ErrorScreen(ScreenObserver* screen_observer, ErrorScreenActor* actor); virtual ~ErrorScreen(); - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - // WizardScreen implementation. virtual void PrepareToShow() OVERRIDE; virtual void Show() OVERRIDE; @@ -117,12 +106,10 @@ class ErrorScreen : public WizardScreen, OobeDisplay::Screen parent_screen_; - base::WeakPtrFactory<ErrorScreen> weak_factory_; - - ObserverList<Observer> observers_; - scoped_ptr<LoginPerformer> guest_login_performer_; + base::WeakPtrFactory<ErrorScreen> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(ErrorScreen); }; diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc index 7f27162..f9c557b 100644 --- a/chrome/browser/chromeos/login/user_manager_impl.cc +++ b/chrome/browser/chromeos/login/user_manager_impl.cc @@ -40,6 +40,8 @@ #include "chrome/browser/chromeos/login/supervised_user_manager_impl.h" #include "chrome/browser/chromeos/login/user_image_manager_impl.h" #include "chrome/browser/chromeos/login/wizard_controller.h" +#include "chrome/browser/chromeos/net/network_portal_detector.h" +#include "chrome/browser/chromeos/net/network_portal_detector_strategy.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/device_local_account.h" #include "chrome/browser/chromeos/profiles/multiprofiles_session_aborted_dialog.h" @@ -1570,6 +1572,11 @@ void UserManagerImpl::NotifyOnLogin() { // Indicate to DeviceSettingsService that the owner key may have become // available. DeviceSettingsService::Get()->SetUsername(active_user_->email()); + + if (NetworkPortalDetector::IsInitialized()) { + NetworkPortalDetector::Get()->SetStrategy( + PortalDetectorStrategy::STRATEGY_ID_SESSION); + } } } diff --git a/chrome/browser/chromeos/net/network_portal_detector.cc b/chrome/browser/chromeos/net/network_portal_detector.cc index 3a4c465..53ae3f8 100644 --- a/chrome/browser/chromeos/net/network_portal_detector.cc +++ b/chrome/browser/chromeos/net/network_portal_detector.cc @@ -47,6 +47,8 @@ class NetworkPortalDetectorStubImpl : public NetworkPortalDetector { virtual bool IsEnabled() OVERRIDE { return false; } virtual void Enable(bool /* start_detection */) OVERRIDE {} virtual bool StartDetectionIfIdle() OVERRIDE { return false; } + virtual void SetStrategy( + PortalDetectorStrategy::StrategyId /* id */) OVERRIDE {} }; } // namespace diff --git a/chrome/browser/chromeos/net/network_portal_detector.h b/chrome/browser/chromeos/net/network_portal_detector.h index 1add8ee..4a5872f 100644 --- a/chrome/browser/chromeos/net/network_portal_detector.h +++ b/chrome/browser/chromeos/net/network_portal_detector.h @@ -6,7 +6,7 @@ #define CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_H_ #include "base/basictypes.h" -#include "chrome/browser/chromeos/login/screens/error_screen.h" +#include "chrome/browser/chromeos/net/network_portal_detector_strategy.h" #include "net/url_request/url_fetcher.h" namespace chromeos { @@ -16,7 +16,7 @@ class NetworkState; // This class handles all notifications about network changes from // NetworkStateHandler and delegates portal detection for the active // network to CaptivePortalService. -class NetworkPortalDetector : public ErrorScreen::Observer { +class NetworkPortalDetector { public: enum CaptivePortalStatus { CAPTIVE_PORTAL_STATUS_UNKNOWN = 0, @@ -96,8 +96,9 @@ class NetworkPortalDetector : public ErrorScreen::Observer { // started. virtual bool StartDetectionIfIdle() = 0; - virtual void OnErrorScreenShow() OVERRIDE {} - virtual void OnErrorScreenHide() OVERRIDE {} + // Sets current strategy according to |id|. If current detection id + // doesn't equal to |id|, detection is restarted. + virtual void SetStrategy(PortalDetectorStrategy::StrategyId id) = 0; // Initializes network portal detector for testing. The // |network_portal_detector| will be owned by the internal pointer diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl.cc b/chrome/browser/chromeos/net/network_portal_detector_impl.cc index b05c749..a94e559 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl.cc +++ b/chrome/browser/chromeos/net/network_portal_detector_impl.cc @@ -156,8 +156,7 @@ NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( weak_factory_(this), attempt_count_(0), strategy_(PortalDetectorStrategy::CreateById( - PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN)), - error_screen_displayed_(false) { + PortalDetectorStrategy::STRATEGY_ID_COUNT)) { captive_portal_detector_.reset(new CaptivePortalDetector(request_context)); strategy_->set_delegate(this); @@ -170,12 +169,9 @@ NetworkPortalDetectorImpl::NetworkPortalDetectorImpl( registrar_.Add(this, chrome::NOTIFICATION_AUTH_CANCELLED, content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_LOGIN_USER_CHANGED, - content::NotificationService::AllSources()); NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE); - UpdateCurrentStrategy(); + SetStrategy(PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); } NetworkPortalDetectorImpl::~NetworkPortalDetectorImpl() { @@ -252,6 +248,16 @@ bool NetworkPortalDetectorImpl::StartDetectionIfIdle() { return true; } +void NetworkPortalDetectorImpl::SetStrategy( + PortalDetectorStrategy::StrategyId id) { + if (id == strategy_->Id()) + return; + strategy_.reset(PortalDetectorStrategy::CreateById(id).release()); + strategy_->set_delegate(this); + StopDetection(); + StartDetectionIfIdle(); +} + void NetworkPortalDetectorImpl::DefaultNetworkChanged( const NetworkState* default_network) { DCHECK(CalledOnValidThread()); @@ -307,15 +313,6 @@ base::TimeTicks NetworkPortalDetectorImpl::GetCurrentTimeTicks() { return time_ticks_for_testing_; } -void NetworkPortalDetectorImpl::OnErrorScreenShow() { - error_screen_displayed_ = true; - UpdateCurrentStrategy(); -} - -void NetworkPortalDetectorImpl::OnErrorScreenHide() { - error_screen_displayed_ = false; - UpdateCurrentStrategy(); -} //////////////////////////////////////////////////////////////////////////////// // NetworkPortalDetectorImpl, private: @@ -472,8 +469,6 @@ void NetworkPortalDetectorImpl::Observe( return; StopDetection(); ScheduleAttempt(base::TimeDelta::FromSeconds(kProxyChangeDelaySec)); - } else if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED) { - UpdateCurrentStrategy(); } } @@ -561,26 +556,4 @@ void NetworkPortalDetectorImpl::RecordDetectionStats( } } -void NetworkPortalDetectorImpl::UpdateCurrentStrategy() { - if (InSession()) { - SetStrategy(PortalDetectorStrategy::STRATEGY_ID_SESSION); - return; - } - if (error_screen_displayed_) { - SetStrategy(PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN); - return; - } - SetStrategy(PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); -} - -void NetworkPortalDetectorImpl::SetStrategy( - PortalDetectorStrategy::StrategyId id) { - if (id == strategy_->Id()) - return; - strategy_.reset(PortalDetectorStrategy::CreateById(id).release()); - strategy_->set_delegate(this); - StopDetection(); - StartDetectionIfIdle(); -} - } // namespace chromeos diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl.h b/chrome/browser/chromeos/net/network_portal_detector_impl.h index 3f9aade..5a46362 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl.h +++ b/chrome/browser/chromeos/net/network_portal_detector_impl.h @@ -73,6 +73,7 @@ class NetworkPortalDetectorImpl virtual bool IsEnabled() OVERRIDE; virtual void Enable(bool start_detection) OVERRIDE; virtual bool StartDetectionIfIdle() OVERRIDE; + virtual void SetStrategy(PortalDetectorStrategy::StrategyId id) OVERRIDE; // NetworkStateHandlerObserver implementation: virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE; @@ -82,10 +83,6 @@ class NetworkPortalDetectorImpl virtual base::TimeTicks AttemptStartTime() OVERRIDE; virtual base::TimeTicks GetCurrentTimeTicks() OVERRIDE; - // ErrorScreen::Observer implementation: - virtual void OnErrorScreenShow() OVERRIDE; - virtual void OnErrorScreenHide() OVERRIDE; - private: friend class NetworkPortalDetectorImplTest; friend class NetworkPortalDetectorImplBrowserTest; @@ -140,14 +137,6 @@ class NetworkPortalDetectorImpl void NotifyDetectionCompleted(const NetworkState* network, const CaptivePortalState& state); - // Updates current detection strategy according to the curren state: - // error screen, login screen or user session. - void UpdateCurrentStrategy(); - - // Sets current strategy according to |id|. If current detection id - // doesn't equal to |id|, detection is restarted. - void SetStrategy(PortalDetectorStrategy::StrategyId id); - State state() const { return state_; } bool is_idle() const { @@ -237,9 +226,6 @@ class NetworkPortalDetectorImpl // Current detection strategy. scoped_ptr<PortalDetectorStrategy> strategy_; - // True when error screen is displayed. - bool error_screen_displayed_; - // UI notification controller about captive portal state. NetworkPortalNotificationController notification_controller_; diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc index 20fb4b9..d83eaae 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc +++ b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc @@ -14,6 +14,7 @@ #include "base/metrics/statistics_recorder.h" #include "base/run_loop.h" #include "chrome/browser/chromeos/net/network_portal_detector_impl.h" +#include "chrome/browser/chromeos/net/network_portal_detector_strategy.h" #include "chrome/browser/chromeos/net/network_portal_detector_test_utils.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/chromeos_switches.h" @@ -134,11 +135,13 @@ class NetworkPortalDetectorImplTest } void enable_error_screen_strategy() { - network_portal_detector()->OnErrorScreenShow(); + network_portal_detector()->SetStrategy( + PortalDetectorStrategy::STRATEGY_ID_ERROR_SCREEN); } void disable_error_screen_strategy() { - network_portal_detector()->OnErrorScreenHide(); + network_portal_detector()->SetStrategy( + PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN); } void stop_detection() { network_portal_detector()->StopDetection(); } diff --git a/chrome/browser/chromeos/net/network_portal_detector_strategy.h b/chrome/browser/chromeos/net/network_portal_detector_strategy.h index 36706da..a57e85b 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_strategy.h +++ b/chrome/browser/chromeos/net/network_portal_detector_strategy.h @@ -18,6 +18,7 @@ class PortalDetectorStrategy { STRATEGY_ID_LOGIN_SCREEN, STRATEGY_ID_ERROR_SCREEN, STRATEGY_ID_SESSION, + STRATEGY_ID_COUNT }; class Delegate { diff --git a/chrome/browser/chromeos/net/network_portal_detector_test_impl.cc b/chrome/browser/chromeos/net/network_portal_detector_test_impl.cc index 0943b4a..ca2980a 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_test_impl.cc +++ b/chrome/browser/chromeos/net/network_portal_detector_test_impl.cc @@ -8,7 +8,9 @@ namespace chromeos { -NetworkPortalDetectorTestImpl::NetworkPortalDetectorTestImpl() {} +NetworkPortalDetectorTestImpl::NetworkPortalDetectorTestImpl() + : strategy_id_(PortalDetectorStrategy::STRATEGY_ID_LOGIN_SCREEN) { +} NetworkPortalDetectorTestImpl::~NetworkPortalDetectorTestImpl() { } @@ -83,4 +85,9 @@ bool NetworkPortalDetectorTestImpl::StartDetectionIfIdle() { return false; } +void NetworkPortalDetectorTestImpl::SetStrategy( + PortalDetectorStrategy::StrategyId id) { + strategy_id_ = id; +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/net/network_portal_detector_test_impl.h b/chrome/browser/chromeos/net/network_portal_detector_test_impl.h index 7ca0592..a176ba2 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_test_impl.h +++ b/chrome/browser/chromeos/net/network_portal_detector_test_impl.h @@ -36,14 +36,20 @@ class NetworkPortalDetectorTestImpl : public NetworkPortalDetector { virtual void Enable(bool start_detection) OVERRIDE; virtual bool StartDetectionIfIdle() OVERRIDE; + virtual void SetStrategy(PortalDetectorStrategy::StrategyId id) OVERRIDE; + + PortalDetectorStrategy::StrategyId strategy_id() const { + return strategy_id_; + } + private: typedef std::string NetworkId; typedef base::hash_map<NetworkId, CaptivePortalState> CaptivePortalStateMap; - ObserverList<Observer> observers_; scoped_ptr<NetworkState> default_network_; CaptivePortalStateMap portal_state_map_; + PortalDetectorStrategy::StrategyId strategy_id_; DISALLOW_COPY_AND_ASSIGN(NetworkPortalDetectorTestImpl); }; |