diff options
author | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-26 12:47:57 +0000 |
---|---|---|
committer | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-26 12:47:57 +0000 |
commit | 3cd992e1e7f3474f63bcca7733594c0d5d14a1d3 (patch) | |
tree | ca15522c74a19712f6e566dd69f1530b4d0e1615 | |
parent | 0df6deff79bf58ffc5dc2e6cd2f68ac0b9c0e956 (diff) | |
download | chromium_src-3cd992e1e7f3474f63bcca7733594c0d5d14a1d3.zip chromium_src-3cd992e1e7f3474f63bcca7733594c0d5d14a1d3.tar.gz chromium_src-3cd992e1e7f3474f63bcca7733594c0d5d14a1d3.tar.bz2 |
Error Screen JS logic is moved to C++ side.
* Adds --disable-fake-ethernet switch
BUG=123579
TEST=tested on Linux ChromeOS build
Review URL: https://chromiumcodereview.appspot.com/11316018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169419 0039d316-1c4b-4281-b951-d872f2087c98
20 files changed, 665 insertions, 376 deletions
diff --git a/chrome/browser/chromeos/cros/network_library_impl_stub.cc b/chrome/browser/chromeos/cros/network_library_impl_stub.cc index d6bc7e9..f3afd53 100644 --- a/chrome/browser/chromeos/cros/network_library_impl_stub.cc +++ b/chrome/browser/chromeos/cros/network_library_impl_stub.cc @@ -5,10 +5,21 @@ #include "chrome/browser/chromeos/cros/network_library_impl_stub.h" #include "base/bind.h" +#include "base/command_line.h" +#include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_thread.h" using content::BrowserThread; +namespace { + +bool IsEthernetEnabled() { + return !CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableStubEthernet); +} + +} // namespace + namespace chromeos { NetworkLibraryImplStub::NetworkLibraryImplStub() @@ -20,7 +31,10 @@ NetworkLibraryImplStub::NetworkLibraryImplStub() connect_delay_ms_(0), network_priority_order_(0) { // Emulate default setting of the CheckPortalList when OOBE is done. - check_portal_list_ = "ethernet,wifi,cellular"; + if (IsEthernetEnabled()) + check_portal_list_ = "ethernet,wifi,cellular"; + else + check_portal_list_ = "wifi,cellular"; } NetworkLibraryImplStub::~NetworkLibraryImplStub() { @@ -33,9 +47,9 @@ void NetworkLibraryImplStub::Init() { is_locked_ = false; // Devices - int devices = - (1 << TYPE_ETHERNET) | (1 << TYPE_WIFI) | (1 << TYPE_CELLULAR) | - (1 << TYPE_WIMAX); + int devices = (1 << TYPE_WIFI) | (1 << TYPE_CELLULAR) | (1 << TYPE_WIMAX); + if (IsEthernetEnabled()) + devices |= 1 << TYPE_ETHERNET; available_devices_ = devices; enabled_devices_ = devices; connected_devices_ = devices; @@ -83,11 +97,13 @@ void NetworkLibraryImplStub::Init() { // If these change, the expectations in network_library_unittest and // network_menu_icon_unittest need to be changed also. - Network* ethernet = new EthernetNetwork("eth1"); - ethernet->set_name("Fake Ethernet"); - ethernet->set_connected(); - AddStubNetwork(ethernet, PROFILE_SHARED); - ethernet->set_is_active(ethernet->connected()); + if (IsEthernetEnabled()) { + Network* ethernet = new EthernetNetwork("eth1"); + ethernet->set_name("Fake Ethernet"); + ethernet->set_connected(); + AddStubNetwork(ethernet, PROFILE_SHARED); + ethernet->set_is_active(ethernet->connected()); + } WifiNetwork* wifi1 = new WifiNetwork("wifi1"); wifi1->set_name("Fake WiFi1"); @@ -420,7 +436,7 @@ void NetworkLibraryImplStub::ConnectToNetwork(Network* network) { } // Disconnect ethernet when connecting to a new network (for UI testing). - if (network->type() != TYPE_VPN) { + if (IsEthernetEnabled() && network->type() != TYPE_VPN) { ethernet_->set_is_active(false); ethernet_->set_disconnected(); } @@ -588,7 +604,10 @@ void NetworkLibraryImplStub::SetCheckPortalList(const } void NetworkLibraryImplStub::SetDefaultCheckPortalList() { - SetCheckPortalList("ethernet,wifi,cellular"); + if (IsEthernetEnabled()) + SetCheckPortalList("ethernet,wifi,cellular"); + else + SetCheckPortalList("wifi,cellular"); } void NetworkLibraryImplStub::ChangePin(const std::string& old_pin, diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js index 6e88a3a..07fbab3 100644 --- a/chrome/browser/resources/chromeos/login/display_manager.js +++ b/chrome/browser/resources/chromeos/login/display_manager.js @@ -260,6 +260,8 @@ cr.define('cr.ui.login', function() { $('oobe').className = nextStepId; $('step-logo').hidden = newStep.classList.contains('no-logo'); + + chrome.send('updateCurrentScreen', [this.currentScreen.id]); }, /** @@ -300,7 +302,7 @@ cr.define('cr.ui.login', function() { var index = this.getScreenIndex_(screenId); if (index >= 0) this.toggleStep_(index, data); - $('error-message').update(); + chrome.send('errorScreenUpdate'); }, /** diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js index 5e276be..7216c99 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.js +++ b/chrome/browser/resources/chromeos/login/screen_error_message.js @@ -45,13 +45,6 @@ cr.define('login', function() { // Link which triggers frame reload. /** @const */ var RELOAD_PAGE_ID = 'proxy-error-retry-link'; - // Timeout used to delay first offline notification from network - // manager. - /** @const */ var OFFLINE_TIMEOUT_SEC = 5; - - // Timeout used to prevent infinite connecting to a flaky network. - /** @const */ var CONNECTING_TIMEOUT_SEC = 60; - /** * Creates a new offline message screen div. * @constructor @@ -80,28 +73,6 @@ cr.define('login', function() { }, /** - * Timer used to delay calls to updateState_ method. - */ - updateStateTimer_: undefined, - - /** - * True if updateState_ method was not called. - */ - firstUpdateStateCall_: true, - - /** - * Last network state. - */ - lastNetworkState_: NET_STATE.UNKNOWN, - - /* - * Timer which is started when network moves to the connecting - * state. If it's triggered, then it's look like the network is - * flaky and we must show offline message. - */ - connectingTimer_: undefined, - - /** * Updates localized content of the screen that is not updated via template. */ updateLocalizedContent_: function() { @@ -165,38 +136,11 @@ cr.define('login', function() { cr.ui.DropDown.hide('offline-networks-list'); }, - update: function() { - chrome.send('loginRequestNetworkState', - ['login.ErrorMessageScreen.updateState', - 'update']); - }, - - /** - * Clears |updateStateTimer_|. - * @private - */ - clearUpdateStateTimer_: function() { - if (this.updateStateTimer_) { - window.clearTimeout(this.updateStateTimer_); - this.updateStateTimer_ = undefined; - } - }, - - /** - * Clears |connectingTimer_|. - * @private - */ - clearConnectingTimer_: function() { - if (this.connectingTimer_) { - window.clearTimeout(this.connectingTimer_); - this.connectingTimer_ = undefined; - } - }, - /** * Prepares error screen to show proxy error. + * @private */ - showProxyError: function() { + showProxyError_: function() { this.classList.remove('show-offline-message'); this.classList.remove('show-captive-portal'); this.classList.add('show-proxy-error'); @@ -205,8 +149,9 @@ cr.define('login', function() { /** * Prepares error screen to show captive portal error. * @param {string} network Name of the current network + * @private */ - showCaptivePortalError: function(network) { + showCaptivePortalError_: function(network) { $(CURRENT_NETWORK_NAME_ID).textContent = network; this.classList.remove('show-offline-message'); this.classList.remove('show-proxy-error'); @@ -215,8 +160,9 @@ cr.define('login', function() { /** * Prepares error screen to show offline error. + * @private */ - showOfflineError: function() { + showOfflineError_: function() { this.classList.remove('show-captive-portal'); this.classList.remove('show-proxy-error'); this.classList.add('show-offline-message'); @@ -225,8 +171,9 @@ cr.define('login', function() { /** * Shows screen. * @param {object} screen Screen that should be shown. + * @private */ - showScreen: function(screen) { + showScreen_: function(screen) { screen.classList.remove('hidden'); screen.classList.remove('faded'); @@ -235,135 +182,16 @@ cr.define('login', function() { }, /** - * Shows or hides offline message based on network on/offline state. - * @param {number} state Current state of the network (see NET_STATE). - * @param {string} network Name of the current network. - * @param {string} reason Reason the callback was called. - * @param {number} lastNetworkType Last active network type. - * @param {boolean} opt_forceUpdate Are state should be updated in any case? + * Shows/hides offline message. + * @param {boolean} visible True to show offline message. + * @private */ - updateState_: function(state, network, reason, lastNetworkType, - opt_forceUpdate) { - console.log('updateState_: state=' + state + - ', network=' + network + ', reason=' + reason + - ', lastNetworkType=' + lastNetworkType + - ', opt_forceUpdate=' + opt_forceUpdate); - this.clearUpdateStateTimer_(); - - // Delay first notification about offline state. - if (state == NET_STATE.OFFLINE && this.firstUpdateStateCall_) { - this.firstUpdateStateCall_ = false; - this.updateStateTimer_ = window.setTimeout( - this.updateState_.bind( - this, state, network, reason, lastNetworkType, opt_forceUpdate), - OFFLINE_TIMEOUT_SEC * 1000); - return; - } - this.firstUpdateStateCall_ = false; - - // Don't show or hide error screen if we're in connecting state. - if (state == NET_STATE.CONNECTING && !opt_forceUpdate) { - if (!this.connectingTimer_) { - // First notification about CONNECTING state. - this.clearConnectingTimer_(); - this.connectingTimer_ = window.setTimeout( - this.updateState_.bind( - this, state, network, reason, lastNetworkType, true), - CONNECTING_TIMEOUT_SEC * 1000); - } - return; - } - this.clearConnectingTimer_(); - - var currentScreen = Oobe.getInstance().currentScreen; + showOfflineMessage_: function(visible) { var offlineMessage = this; - var isOnline = (state == NET_STATE.ONLINE); - var isUnderCaptivePortal = (state == NET_STATE.PORTAL); - var isProxyError = reason == ERROR_REASONS.PROXY_AUTH_CANCELLED || - reason == ERROR_REASONS.PROXY_CONNECTION_FAILED; - var shouldOverlay = MANAGED_SCREENS.indexOf(currentScreen.id) != -1 && - !currentScreen.isLocal; - var isTimeout = false; - var isShown = !offlineMessage.classList.contains('hidden') && - !offlineMessage.classList.contains('faded'); - var isGaiaSignin = (currentScreen.id == SCREEN_GAIA_SIGNIN); - var gaiaSigninReloaded = false; - - // Reload frame if network is changed. If current network is - // online, and previous network was online, frame isn't - // reloaded. - if (reason == ERROR_REASONS.NETWORK_CHANGED) { - if (state == NET_STATE.ONLINE && - this.lastNetworkState_ != NET_STATE.ONLINE && - isGaiaSignin && !gaiaSigninReloaded) { - currentScreen.doReload(); - gaiaSigninReloaded = true; - } - } - this.lastNetworkState_ = state; - - if (reason == ERROR_REASONS.PROXY_CONFIG_CHANGED && shouldOverlay && - isGaiaSignin && !gaiaSigninReloaded) { - // Schedules a immediate retry. - currentScreen.doReload(); - gaiaSigninReloaded = true; - console.log('Retry page load since proxy settings has been changed'); - } - - // Fake portal state for loading timeout. - if (reason == ERROR_REASONS.LOADING_TIMEOUT) { - isOnline = false; - isUnderCaptivePortal = true; - isTimeout = true; - } - - // Portal was detected via generate_204 redirect on Chrome side. - // Subsequent call to show dialog if it's already shown does nothing. - if (reason == ERROR_REASONS.PORTAL_DETECTED) { - isOnline = false; - isUnderCaptivePortal = true; - } - - if (!isOnline && shouldOverlay) { - console.log('Show offline message: state=' + state + - ', network=' + network + ', reason=' + reason + - ', isUnderCaptivePortal=' + isUnderCaptivePortal); - - // Clear any error messages that might still be around. - Oobe.clearErrors(); - - offlineMessage.onBeforeShow(lastNetworkType); - - if (isUnderCaptivePortal && !isProxyError) { - // Do not bother a user with obsessive captive portal showing. This - // check makes captive portal being shown only once: either when error - // screen is shown for the first time or when switching from another - // error screen (offline, proxy). - if (!isShown || - !offlineMessage.classList.contains('show-captive-portal')) { - // In case of timeout we're suspecting that network might be - // a captive portal but would like to check that first. - // Otherwise (signal from shill / generate_204 got redirected) - // show dialog right away. - if (isTimeout) - chrome.send('fixCaptivePortal'); - else - chrome.send('showCaptivePortal'); - } - } else { - chrome.send('hideCaptivePortal'); - } - - if (isUnderCaptivePortal) { - if (isProxyError) - offlineMessage.showProxyError(); - else - offlineMessage.showCaptivePortalError(network); - } else { - offlineMessage.showOfflineError(); - } + var currentScreen = Oobe.getInstance().currentScreen; - offlineMessage.showScreen(offlineMessage); + if (visible) { + this.showScreen_(offlineMessage); if (!currentScreen.classList.contains('faded')) { currentScreen.classList.add('faded'); @@ -374,44 +202,24 @@ cr.define('login', function() { currentScreen.classList.add('hidden'); }); } - chrome.send('networkErrorShown'); + // Report back error screen UI being painted. window.webkitRequestAnimationFrame(function() { chrome.send('loginVisible', ['network-error']); }); } else { - chrome.send('hideCaptivePortal'); - - if (!offlineMessage.classList.contains('faded')) { - console.log('Hide offline message. state=' + state + - ', network=' + network + ', reason=' + reason); - - offlineMessage.onBeforeHide(); - - offlineMessage.classList.add('faded'); - if (offlineMessage.classList.contains('animated')) { - offlineMessage.addEventListener('webkitTransitionEnd', - function f(e) { - offlineMessage.removeEventListener('webkitTransitionEnd', f); - if (offlineMessage.classList.contains('faded')) - offlineMessage.classList.add('hidden'); - }); - } else { - offlineMessage.classList.add('hidden'); - } - - offlineMessage.showScreen(currentScreen); - - // Forces a reload for Gaia screen on hiding error message. - if (isGaiaSignin && !gaiaSigninReloaded) { - currentScreen.doReload(); - gaiaSigninReloaded = true; - } - } else if (isGaiaSignin && currentScreen.loading) { - if (!gaiaSigninReloaded) { - currentScreen.doReload(); - gaiaSigninReloaded = true; - } + this.showScreen_(currentScreen); + + offlineMessage.classList.add('faded'); + if (offlineMessage.classList.contains('animated')) { + offlineMessage.addEventListener('webkitTransitionEnd', + function f(e) { + offlineMessage.removeEventListener('webkitTransitionEnd', f); + if (offlineMessage.classList.contains('faded')) + offlineMessage.classList.add('hidden'); + }); + } else { + offlineMessage.classList.add('hidden'); } } }, @@ -428,15 +236,41 @@ cr.define('login', function() { }; /** - * Network state changed callback. - * @param {number} state Current state of the network (see NET_STATE). - * @param {string} network Name of the current network. - * @param {string} reason Reason the callback was called. - * @param {number} lastNetworkType Last active network type. + * Prepares error screen to show proxy error. + */ + ErrorMessageScreen.showProxyError = function() { + $('error-message').showProxyError_(); + }; + + /** + * Prepares error screen to show captive portal error. + * @param {string} network Name of the current network */ - ErrorMessageScreen.updateState = function( - state, network, reason, lastNetworkType) { - $('error-message').updateState_(state, network, reason, lastNetworkType); + ErrorMessageScreen.showCaptivePortalError = function(network) { + $('error-message').showCaptivePortalError_(network); + }; + + /** + * Prepares error screen to show offline error. + */ + ErrorMessageScreen.showOfflineError = function() { + $('error-message').showOfflineError_(); + }; + + /** + * Shows/hides offline message. + * @param {boolean} visible True to show offline message. + */ + ErrorMessageScreen.showOfflineMessage = function(visible) { + $('error-message').showOfflineMessage_(visible); + }; + + ErrorMessageScreen.onBeforeShow = function(lastNetworkType) { + $('error-message').onBeforeShow(lastNetworkType); + }; + + ErrorMessageScreen.onBeforeHide = function() { + $('error-message').onBeforeHide(); }; /** @@ -476,7 +310,8 @@ cr.define('login', function() { var currentScreen = Oobe.getInstance().currentScreen; if (MANAGED_SCREENS.indexOf(currentScreen.id) != -1 && state != NET_STATE.CONNECTING) { - this.updateState(NET_STATE.PORTAL, network, reason, lastNetworkType); + chrome.send('updateState', + [NET_STATE.PORTAL, network, reason, lastNetworkType]); // Schedules a retry. currentScreen.scheduleRetry(); } diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js index ee7a99f..e9d410c 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js @@ -51,7 +51,7 @@ cr.define('login', function() { // Whether local version of Gaia page is used. // @type {boolean} - isLocal: false, + isLocal_: false, // Whether offline login is allowed. // @type {boolean} @@ -80,6 +80,23 @@ cr.define('login', function() { }, /** + * Returns true if local version of Gaia is used. + * @type {boolean} + */ + get isLocal() { + return this.isLocal_; + }, + + /** + * Sets whether local version of Gaia is used. + * @param {boolean} value Whether local version of Gaia is used. + */ + set isLocal(value) { + this.isLocal_ = value; + chrome.send('updateGaiaIsLocal', [value]); + }, + + /** * Shows/hides loading UI. * @param {boolean} show True to show loading UI. * @private @@ -298,7 +315,7 @@ cr.define('login', function() { Oobe.clearErrors(); } else if (msg.method == 'loginUILoaded') { this.loading = false; - $('error-message').update(); + chrome.send('errorScreenUpdate'); this.clearLoadingTimer_(); // Show deferred error bubble. if (this.errorBubble_) { @@ -449,6 +466,10 @@ cr.define('login', function() { $('gaia-signin').updateAuthExtension_(data); }; + GaiaSigninScreen.doReload = function() { + $('gaia-signin').doReload(); + }; + return { GaiaSigninScreen: GaiaSigninScreen }; diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc index 15f234c..0e970ad 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc @@ -32,12 +32,17 @@ namespace chromeos { CoreOobeHandler::CoreOobeHandler(OobeUI* oobe_ui) : oobe_ui_(oobe_ui), show_oobe_ui_(false), - version_info_updater_(this) { + version_info_updater_(this), + delegate_(NULL) { } CoreOobeHandler::~CoreOobeHandler() { } +void CoreOobeHandler::SetDelegate(Delegate* delegate) { + delegate_ = delegate; +} + void CoreOobeHandler::GetLocalizedStrings( base::DictionaryValue* localized_strings) { localized_strings->SetString( @@ -67,6 +72,9 @@ void CoreOobeHandler::RegisterMessages() { web_ui()->RegisterMessageCallback(kJsApiSkipUpdateEnrollAfterEula, base::Bind(&CoreOobeHandler::HandleSkipUpdateEnrollAfterEula, base::Unretained(this))); + web_ui()->RegisterMessageCallback("updateCurrentScreen", + base::Bind(&CoreOobeHandler::HandleUpdateCurrentScreen, + base::Unretained(this))); } void CoreOobeHandler::HandleInitialized(const base::ListValue* args) { @@ -81,6 +89,14 @@ void CoreOobeHandler::HandleSkipUpdateEnrollAfterEula( controller->SkipUpdateEnrollAfterEula(); } +void CoreOobeHandler::HandleUpdateCurrentScreen(const base::ListValue* args) { + DCHECK(args && args->GetSize() == 1); + + std::string screen; + if (args->GetString(0, &screen) && delegate_) + delegate_->OnCurrentScreenChanged(screen); +} + void CoreOobeHandler::ShowOobeUI(bool show) { if (show == show_oobe_ui_) return; diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h index a9642a9d..6f6b72d 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h @@ -9,7 +9,7 @@ #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" namespace base { - class ListValue; +class ListValue; } namespace chromeos { @@ -20,9 +20,17 @@ class OobeUI; class CoreOobeHandler : public BaseScreenHandler, public VersionInfoUpdater::Delegate { public: + class Delegate { + public: + // Called when current screen is changed. + virtual void OnCurrentScreenChanged(const std::string& screen) = 0; + }; + explicit CoreOobeHandler(OobeUI* oobe_ui); virtual ~CoreOobeHandler(); + void SetDelegate(Delegate* delegate); + // BaseScreenHandler implementation: virtual void GetLocalizedStrings( base::DictionaryValue* localized_strings) OVERRIDE; @@ -51,6 +59,7 @@ class CoreOobeHandler : public BaseScreenHandler, // Handlers for JS WebUI messages. void HandleInitialized(const base::ListValue* args); void HandleSkipUpdateEnrollAfterEula(const base::ListValue* args); + void HandleUpdateCurrentScreen(const base::ListValue* args); // Calls javascript to sync OOBE UI visibility with show_oobe_ui_. void UpdateOobeUIVisibility(); @@ -67,6 +76,8 @@ class CoreOobeHandler : public BaseScreenHandler, // Updates when version info is changed. VersionInfoUpdater version_info_updater_; + Delegate* delegate_; + DISALLOW_COPY_AND_ASSIGN(CoreOobeHandler); }; diff --git a/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc index 1860f32..6adbcd2 100644 --- a/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.cc @@ -14,6 +14,7 @@ #include "chrome/browser/net/gaia/gaia_oauth_fetcher.h" #include "chrome/browser/policy/message_util.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "content/public/browser/web_contents.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_constants.h" @@ -507,7 +508,7 @@ void EnterpriseOAuthEnrollmentScreenHandler::DoShow() { screen_data.SetString("test_password", test_password_); } - ShowScreen("oauth-enrollment", &screen_data); + ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data); } } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc index 0a84f42..0ca3422 100644 --- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc @@ -4,20 +4,58 @@ #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" +#include "base/bind.h" #include "base/logging.h" +#include "base/message_loop.h" +#include "base/time.h" #include "base/values.h" #include "chrome/browser/chromeos/login/captive_portal_window_proxy.h" +#include "chrome/browser/chromeos/login/webui_login_display_host.h" #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" +#include "chrome/common/chrome_notification_types.h" #include "content/public/browser/web_ui.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" namespace chromeos { +namespace { + +// Timeout to delay first notification about offline state for a +// current network. +const int kOfflineTimeoutSec = 5; + +// Timeout used to prevent infinite connecting to a flaky network. +const int kConnectingTimeoutSec = 60; + +bool IsProxyError(const std::string& reason) { + return reason == ErrorScreenHandler::kErrorReasonProxyAuthCancelled || + reason == ErrorScreenHandler::kErrorReasonProxyConnectionFailed; +} + +} // namespace + +// static +const char ErrorScreenHandler::kErrorReasonProxyAuthCancelled[] = + "frame error:111"; +const char ErrorScreenHandler::kErrorReasonProxyConnectionFailed[] = + "frame error:130"; +const char ErrorScreenHandler::kErrorReasonProxyConfigChanged[] = + "proxy changed"; +const char ErrorScreenHandler::kErrorReasonLoadingTimeout[] = "loading timeout"; +const char ErrorScreenHandler::kErrorReasonPortalDetected[] = "portal detected"; +const char ErrorScreenHandler::kErrorReasonNetworkChanged[] = "network changed"; +const char ErrorScreenHandler::kErrorReasonUpdate[] = "update"; + ErrorScreenHandler::ErrorScreenHandler( const scoped_refptr<NetworkStateInformer>& network_state_informer) - : network_state_informer_(network_state_informer), + : is_shown_(false), + is_first_update_state_call_(true), + state_(STATE_UNKNOWN), + gaia_is_local_(false), + last_network_state_(NetworkStateInformer::UNKNOWN), + network_state_informer_(network_state_informer), native_window_delegate_(NULL) { DCHECK(network_state_informer_); network_state_informer_->AddObserver(this); @@ -32,64 +70,179 @@ void ErrorScreenHandler::SetNativeWindowDelegate( native_window_delegate_ = native_window_delegate; } +void ErrorScreenHandler::Show() { + ShowOfflineMessage(true); + set_is_shown(true); + NetworkErrorShown(); +} + +void ErrorScreenHandler::Hide() { + ShowOfflineMessage(false); + set_is_shown(false); +} + void ErrorScreenHandler::UpdateState(NetworkStateInformer::State state, const std::string& network_name, const std::string& reason, ConnectionType last_network_type) { - LOG(ERROR) << "ErrorScreenHandler::UpdateState(): state=" << state << - ", network_name=" << network_name << - ", reason=" << reason << - ", last_network_type=" << last_network_type; - // TODO (ygorshenin): instead of just call JS function, move all - // logic from JS here. - base::FundamentalValue state_value(state); - base::StringValue network_value(network_name); - base::StringValue reason_value(reason); - base::FundamentalValue last_network_value(last_network_type); - web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.updateState", - state_value, network_value, reason_value, last_network_value); + VLOG(1) << "ErrorScreenHandler::UpdateState(): state=" << state << ", " + << "network_name=" << network_name << ", reason=" << reason << ", " + << "last_network_type=" << last_network_type; + UpdateStateInternal(state, network_name, reason, last_network_type, false); } -void ErrorScreenHandler::GetLocalizedStrings( - base::DictionaryValue* localized_strings) { - localized_strings->SetString("offlineMessageTitle", - l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_TITLE)); - localized_strings->SetString("offlineMessageBody", - l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_MESSAGE)); - localized_strings->SetString("captivePortalTitle", - l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE)); - localized_strings->SetString("captivePortalMessage", - l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL)); - localized_strings->SetString("captivePortalProxyMessage", - l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY)); - localized_strings->SetString("captivePortalNetworkSelect", - l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT)); - localized_strings->SetString("proxyMessageText", - l10n_util::GetStringUTF16(IDS_LOGIN_PROXY_ERROR_MESSAGE)); +void ErrorScreenHandler::UpdateStateInternal(NetworkStateInformer::State state, + std::string network_name, + std::string reason, + ConnectionType last_network_type, + bool force_update) { + update_state_closure_.Cancel(); + if (state == NetworkStateInformer::OFFLINE && is_first_update_state_call()) { + set_is_first_update_state_call(false); + update_state_closure_.Reset( + base::Bind( + &ErrorScreenHandler::UpdateStateInternal, + base::Unretained(this), + state, network_name, reason, last_network_type, force_update)); + MessageLoop::current()->PostDelayedTask( + FROM_HERE, + update_state_closure_.callback(), + base::TimeDelta::FromMilliseconds(kOfflineTimeoutSec)); + return; + } + set_is_first_update_state_call(false); + + // Don't show or hide error screen if we're in connecting state. + if (state == NetworkStateInformer::CONNECTING && !force_update) { + if (connecting_closure_.IsCancelled()) { + // First notification about CONNECTING state. + connecting_closure_.Reset( + base::Bind(&ErrorScreenHandler::UpdateStateInternal, + base::Unretained(this), + state, network_name, reason, last_network_type, true)); + MessageLoop::current()->PostDelayedTask( + FROM_HERE, + connecting_closure_.callback(), + base::TimeDelta::FromMilliseconds(kConnectingTimeoutSec)); + } + return; + } + connecting_closure_.Cancel(); + + bool is_online = (state == NetworkStateInformer::ONLINE); + bool is_under_captive_portal = + (state == NetworkStateInformer::CAPTIVE_PORTAL); + bool is_proxy_error = IsProxyError(reason); + bool is_timeout = false; + bool is_gaia_signin = (GetCurrentScreen() == OobeUI::SCREEN_GAIA_SIGNIN); + bool is_gaia_reloaded = false; + bool should_overlay = is_gaia_signin && !gaia_is_local(); + + // Reload frame if network is changed. + if (reason == kErrorReasonNetworkChanged) { + if (is_online && + last_network_state() != NetworkStateInformer::ONLINE && + is_gaia_signin && !is_gaia_reloaded) { + ReloadGaiaScreen(); + is_gaia_reloaded = true; + } + } + set_last_network_state(state); + + if (reason == kErrorReasonProxyConfigChanged && should_overlay && + is_gaia_signin && !is_gaia_reloaded) { + // Schedules a immediate retry. + ReloadGaiaScreen(); + is_gaia_reloaded = true; + VLOG(1) << "Retry page load since proxy settings has been changed"; + } + + // Fake portal state for loading timeout. + if (reason == kErrorReasonLoadingTimeout) { + is_online = false; + is_under_captive_portal = true; + is_timeout = true; + } + + // Portal was detected via generate_204 redirect on Chrome side. + // Subsequent call to show dialog if it's already shown does nothing. + if (reason == kErrorReasonPortalDetected) { + is_online = false; + is_under_captive_portal = true; + } + + if (!is_online && should_overlay) { + VLOG(1) << "Show offline message: state=" << state << ", " + << "network_name=" << network_name << ", reason=" << reason << ", " + << "is_under_captive_portal=" << is_under_captive_portal; + ClearOobeErrors(); + OnBeforeShow(last_network_type); + + if (is_under_captive_portal && !is_proxy_error) { + // Do not bother a user with obsessive captive portal showing. This + // check makes captive portal being shown only once: either when error + // screen is shown for the first time or when switching from another + // error screen (offline, proxy). + if (!is_shown() || get_state() != STATE_CAPTIVE_PORTAL_ERROR) { + // In case of timeout we're suspecting that network might be + // a captive portal but would like to check that first. + // Otherwise (signal from shill / generate_204 got redirected) + // show dialog right away. + if (is_timeout) + FixCaptivePortal(); + else + ShowCaptivePortal(); + } + } else { + HideCaptivePortal(); + } + + if (is_under_captive_portal) { + if (is_proxy_error) + ShowProxyError(); + else + ShowCaptivePortalError(network_name); + } else { + ShowOfflineError(); + } + Show(); + } else { + HideCaptivePortal(); + + if (is_shown()) { + VLOG(1) << "Hide offline message. state=" << state << ", " + << "network_name=" << network_name << ", reason=" << reason; + OnBeforeHide(); + Hide(); + + // Forces a reload for Gaia screen on hiding error message. + if (is_gaia_signin && !is_gaia_reloaded) { + ReloadGaiaScreen(); + is_gaia_reloaded = true; + } + } + } } -void ErrorScreenHandler::Initialize() { +void ErrorScreenHandler::ReloadGaiaScreen() { + web_ui()->CallJavascriptFunction("login.GaiaSigninScreen.doReload"); } -gfx::NativeWindow ErrorScreenHandler::GetNativeWindow() { - if (native_window_delegate_) - return native_window_delegate_->GetNativeWindow(); - return NULL; +void ErrorScreenHandler::ClearOobeErrors() { + web_ui()->CallJavascriptFunction("cr.ui.Oobe.clearErrors"); } -void ErrorScreenHandler::RegisterMessages() { - web_ui()->RegisterMessageCallback("fixCaptivePortal", - base::Bind(&ErrorScreenHandler::HandleFixCaptivePortal, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("showCaptivePortal", - base::Bind(&ErrorScreenHandler::HandleShowCaptivePortal, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("hideCaptivePortal", - base::Bind(&ErrorScreenHandler::HandleHideCaptivePortal, - base::Unretained(this))); +void ErrorScreenHandler::OnBeforeShow(ConnectionType last_network_type) { + base::FundamentalValue last_network_type_value(last_network_type); + web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.onBeforeShow", + last_network_type_value); } -void ErrorScreenHandler::HandleFixCaptivePortal(const base::ListValue* args) { +void ErrorScreenHandler::OnBeforeHide() { + web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.onBeforeHide"); +} + +void ErrorScreenHandler::FixCaptivePortal() { if (!native_window_delegate_) return; // TODO (ygorshenin): move error page and captive portal window @@ -103,16 +256,125 @@ void ErrorScreenHandler::HandleFixCaptivePortal(const base::ListValue* args) { captive_portal_window_proxy_->ShowIfRedirected(); } -void ErrorScreenHandler::HandleShowCaptivePortal(const base::ListValue* args) { +void ErrorScreenHandler::ShowCaptivePortal() { // This call is an explicit user action // i.e. clicking on link so force dialog show. - HandleFixCaptivePortal(args); + FixCaptivePortal(); captive_portal_window_proxy_->Show(); } -void ErrorScreenHandler::HandleHideCaptivePortal(const base::ListValue* args) { +void ErrorScreenHandler::HideCaptivePortal() { if (captive_portal_window_proxy_.get()) captive_portal_window_proxy_->Close(); } +void ErrorScreenHandler::NetworkErrorShown() { + content::NotificationService::current()->Notify( + chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, + content::NotificationService::AllSources(), + content::NotificationService::NoDetails()); +} + +void ErrorScreenHandler::ShowProxyError() { + web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.showProxyError"); + set_state(STATE_PROXY_ERROR); +} + +void ErrorScreenHandler::ShowCaptivePortalError(const std::string& network) { + base::StringValue network_value(network); + web_ui()->CallJavascriptFunction( + "login.ErrorMessageScreen.showCaptivePortalError", network_value); + set_state(STATE_CAPTIVE_PORTAL_ERROR); +} + +void ErrorScreenHandler::ShowOfflineError() { + web_ui()->CallJavascriptFunction("login.ErrorMessageScreen.showOfflineError"); + set_state(STATE_OFFLINE_ERROR); +} + +void ErrorScreenHandler::ShowOfflineMessage(bool visible) { + base::FundamentalValue visible_value(visible); + web_ui()->CallJavascriptFunction( + "login.ErrorMessageScreen.showOfflineMessage", visible_value); +} + +OobeUI::Screen ErrorScreenHandler::GetCurrentScreen() { + OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN; + OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); + if (oobe_ui) + screen = oobe_ui->current_screen(); + return screen; +} + +void ErrorScreenHandler::HandleFixCaptivePortal(const base::ListValue* args) { + FixCaptivePortal(); +} + +void ErrorScreenHandler::HandleShowCaptivePortal(const base::ListValue* args) { + ShowCaptivePortal(); +} + +void ErrorScreenHandler::HandleHideCaptivePortal(const base::ListValue* args) { + HideCaptivePortal(); +} + +void ErrorScreenHandler::HandleErrorScreenUpdate(const base::ListValue* args) { + UpdateStateInternal(network_state_informer_->state(), + network_state_informer_->network_name(), + kErrorReasonUpdate, + network_state_informer_->last_network_type(), + false); +} + +void ErrorScreenHandler::HandleUpdateGaiaIsLocal(const base::ListValue* args) { + DCHECK(args && args->GetSize() == 1); + + bool gaia_is_local = false; + if (!args->GetBoolean(0, &gaia_is_local)) + return; + set_gaia_is_local(gaia_is_local); +} + +void ErrorScreenHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback("fixCaptivePortal", + base::Bind(&ErrorScreenHandler::HandleFixCaptivePortal, + base::Unretained(this))); + web_ui()->RegisterMessageCallback("showCaptivePortal", + base::Bind(&ErrorScreenHandler::HandleShowCaptivePortal, + base::Unretained(this))); + web_ui()->RegisterMessageCallback("hideCaptivePortal", + base::Bind(&ErrorScreenHandler::HandleHideCaptivePortal, + base::Unretained(this))); + web_ui()->RegisterMessageCallback("errorScreenUpdate", + base::Bind(&ErrorScreenHandler::HandleErrorScreenUpdate, + base::Unretained(this))); +} + +void ErrorScreenHandler::GetLocalizedStrings( + base::DictionaryValue* localized_strings) { + localized_strings->SetString("offlineMessageTitle", + l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_TITLE)); + localized_strings->SetString("offlineMessageBody", + l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_MESSAGE)); + localized_strings->SetString("captivePortalTitle", + l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_TITLE)); + localized_strings->SetString("captivePortalMessage", + l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL)); + localized_strings->SetString("captivePortalProxyMessage", + l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_PROXY)); + localized_strings->SetString("captivePortalNetworkSelect", + l10n_util::GetStringUTF16(IDS_LOGIN_MAYBE_CAPTIVE_PORTAL_NETWORK_SELECT)); + localized_strings->SetString("proxyMessageText", + l10n_util::GetStringUTF16(IDS_LOGIN_PROXY_ERROR_MESSAGE)); +} + +void ErrorScreenHandler::Initialize() { +} + +gfx::NativeWindow ErrorScreenHandler::GetNativeWindow() { + if (native_window_delegate_) + return native_window_delegate_->GetNativeWindow(); + return NULL; +} + } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h index d043c94..17589de 100644 --- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h @@ -5,10 +5,13 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_ERROR_SCREEN_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_ERROR_SCREEN_HANDLER_H_ +#include "base/cancelable_callback.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" +#include "chrome/browser/chromeos/cros/network_constants.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" namespace base { class DictionaryValue; @@ -25,12 +28,35 @@ class ErrorScreenHandler : public BaseScreenHandler, public NetworkStateInformer::NetworkStateInformerObserver { public: + enum State { + STATE_UNKNOWN = 0, + STATE_PROXY_ERROR, + STATE_CAPTIVE_PORTAL_ERROR, + STATE_OFFLINE_ERROR, + }; + + // Possible error reasons. + static const char kErrorReasonProxyAuthCancelled[]; + static const char kErrorReasonProxyConnectionFailed[]; + static const char kErrorReasonProxyConfigChanged[]; + static const char kErrorReasonLoadingTimeout[]; + static const char kErrorReasonPortalDetected[]; + // Reason for a case when network manager notifies about network + // change. + static const char kErrorReasonNetworkChanged[]; + // Reason for a case when JS side requires error screen update. + static const char kErrorReasonUpdate[]; + ErrorScreenHandler( const scoped_refptr<NetworkStateInformer>& network_state_informer); virtual ~ErrorScreenHandler(); void SetNativeWindowDelegate(NativeWindowDelegate* native_window_delegate); + void Show(); + + void Hide(); + // NetworkStateInformer::NetworkStateInformerObserver implementation: virtual void UpdateState(NetworkStateInformer::State state, const std::string& network_name, @@ -38,19 +64,89 @@ class ErrorScreenHandler ConnectionType last_network_type) OVERRIDE; private: + // Shows or hides offline message based on network {on|off}line + // state and updates internal state. + void UpdateStateInternal(NetworkStateInformer::State state, + std::string network, + std::string reason, + ConnectionType last_network_type, + bool force_update); + + // Reloads gaia frame. + void ReloadGaiaScreen(); + + // Clears error bubble. + void ClearOobeErrors(); + + void OnBeforeShow(ConnectionType last_network_type); + void OnBeforeHide(); + + // Fixes captive portal dialog. + void FixCaptivePortal(); + + // Shows captive portal dialog. + void ShowCaptivePortal(); + + // Hides captive portal dialog. + void HideCaptivePortal(); + + // Sends notification that error message is shown. + void NetworkErrorShown(); + + // Each of the following methods shows corresponsing error message + // and updates internal state. + void ShowProxyError(); + void ShowCaptivePortalError(const std::string& network); + void ShowOfflineError(); + void ShowOfflineMessage(bool visible); + + OobeUI::Screen GetCurrentScreen(); + + State get_state() { return state_; } + void set_state(State state) { state_ = state; } + + bool is_shown() { return is_shown_; } + void set_is_shown(bool is_shown) { is_shown_ = is_shown; } + + bool is_first_update_state_call() { return is_first_update_state_call_; } + void set_is_first_update_state_call(bool is_first_update_state_call) { + is_first_update_state_call_ = is_first_update_state_call; + } + + bool gaia_is_local() { return gaia_is_local_; } + void set_gaia_is_local(bool gaia_is_local) { gaia_is_local_ = gaia_is_local; } + + NetworkStateInformer::State last_network_state() { + return last_network_state_; + } + void set_last_network_state(NetworkStateInformer::State state) { + last_network_state_ = state; + } + + // WebUI message handlers. + void HandleFixCaptivePortal(const base::ListValue* args); + void HandleShowCaptivePortal(const base::ListValue* args); + void HandleHideCaptivePortal(const base::ListValue* args); + void HandleErrorScreenUpdate(const base::ListValue* args); + void HandleUpdateGaiaIsLocal(const base::ListValue* args); + + // WebUIMessageHandler implementation: + virtual void RegisterMessages() OVERRIDE; + // BaseScreenHandler implementation: virtual void GetLocalizedStrings( base::DictionaryValue* localized_strings) OVERRIDE; virtual void Initialize() OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; - // WebUIMessageHandler implementation: - virtual void RegisterMessages() OVERRIDE; + bool is_shown_; + bool is_first_update_state_call_; + State state_; + bool gaia_is_local_; + NetworkStateInformer::State last_network_state_; - // WebUI message handlers. - void HandleFixCaptivePortal(const base::ListValue* args); - void HandleShowCaptivePortal(const base::ListValue* args); - void HandleHideCaptivePortal(const base::ListValue* args); + base::CancelableClosure update_state_closure_; + base::CancelableClosure connecting_closure_; // Proxy which manages showing of the window for captive portal entering. scoped_ptr<CaptivePortalWindowProxy> captive_portal_window_proxy_; diff --git a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc index 3f209f4..d59997a 100644 --- a/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/eula_screen_handler.cc @@ -11,6 +11,7 @@ #include "base/values.h" #include "chrome/browser/chromeos/login/help_app_launcher.h" #include "chrome/browser/chromeos/login/webui_login_display.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/common/url_constants.h" #include "grit/browser_resources.h" #include "grit/chromium_strings.h" @@ -18,13 +19,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/views/widget/widget.h" -namespace { - -// Eula screen id. -const char kEulaScreen[] = "eula"; - -} // namespace - namespace chromeos { EulaScreenHandler::EulaScreenHandler() @@ -44,7 +38,7 @@ void EulaScreenHandler::Show() { show_on_init_ = true; return; } - ShowScreen(kEulaScreen, NULL); + ShowScreen(OobeUI::kScreenOobeEula, NULL); } void EulaScreenHandler::Hide() { diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc index e17579a..03b98a8 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc @@ -26,9 +26,6 @@ namespace { -// Network screen id. -const char kNetworkScreen[] = "connect"; - // JS API callbacks names. const char kJsApiNetworkOnExit[] = "networkOnExit"; const char kJsApiNetworkOnLanguageChanged[] = "networkOnLanguageChanged"; @@ -66,7 +63,7 @@ void NetworkScreenHandler::Show() { return; } - ShowScreen(kNetworkScreen, NULL); + ShowScreen(OobeUI::kScreenOobeNetwork, NULL); } void NetworkScreenHandler::Hide() { diff --git a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc index 27df146..237c342 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc @@ -9,6 +9,7 @@ #include "base/message_loop.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/proxy_config_service_impl.h" +#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" #include "chrome/common/chrome_notification_types.h" #include "net/proxy/proxy_config.h" @@ -17,10 +18,6 @@ namespace { // Timeout to smooth temporary network state transitions for flaky networks. const int kNetworkStateCheckDelayMs = 5000; -const char kReasonNetworkChanged[] = "network changed"; -const char kReasonProxyChanged[] = "proxy changed"; -const char kReasonPortalDetected[] = "portal detected"; - } // namespace namespace chromeos { @@ -122,13 +119,13 @@ void NetworkStateInformer::Observe( if (type == chrome::NOTIFICATION_SESSION_STARTED) registrar_.RemoveAll(); else if (type == chrome::NOTIFICATION_LOGIN_PROXY_CHANGED) - SendStateToObservers(kReasonProxyChanged); + SendStateToObservers(ErrorScreenHandler::kErrorReasonProxyConfigChanged); else NOTREACHED() << "Unknown notification: " << type; } void NetworkStateInformer::OnPortalDetected() { - SendStateToObservers(kReasonPortalDetected); + SendStateToObservers(ErrorScreenHandler::kErrorReasonPortalDetected); } bool NetworkStateInformer::UpdateState(NetworkLibrary* cros) { @@ -161,7 +158,7 @@ void NetworkStateInformer::UpdateStateAndNotify() { check_state_.Cancel(); if (UpdateState(CrosLibrary::Get()->GetNetworkLibrary())) - SendStateToObservers(kReasonNetworkChanged); + SendStateToObservers(ErrorScreenHandler::kErrorReasonNetworkChanged); } void NetworkStateInformer::SendStateToObservers(const std::string& reason) { diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index f092454..2d74fb8 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc @@ -22,7 +22,6 @@ #include "chrome/browser/ui/webui/about_ui.h" #include "chrome/browser/ui/webui/chrome_url_data_manager.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" -#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h" #include "chrome/browser/ui/webui/chromeos/login/enterprise_oauth_enrollment_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h" @@ -122,6 +121,16 @@ std::string OobeUIHTMLSource::GetDataResource(int resource_id) const { // OobeUI ---------------------------------------------------------------------- +// static +const char OobeUI::kScreenOobeNetwork[] = "connect"; +const char OobeUI::kScreenOobeEula[] = "eula"; +const char OobeUI::kScreenOobeUpdate[] = "update"; +const char OobeUI::kScreenOobeEnrollment[] = "oauth-enrollment"; +const char OobeUI::kScreenGaiaSignin[] = "gaia-signin"; +const char OobeUI::kScreenAccountPicker[] = "account-picker"; +const char OobeUI::kScreenUserImagePicker[] = "user-image"; +const char OobeUI::kScreenTpmError[] = "tpm-error-message"; + OobeUI::OobeUI(content::WebUI* web_ui) : WebUIController(web_ui), update_screen_actor_(NULL), @@ -130,12 +139,16 @@ OobeUI::OobeUI(content::WebUI* web_ui) reset_screen_actor_(NULL), error_screen_handler_(NULL), signin_screen_handler_(NULL), - user_image_screen_actor_(NULL) { + user_image_screen_actor_(NULL), + current_screen_(SCREEN_UNKNOWN) { + InitializeScreenMap(); + network_state_informer_ = new NetworkStateInformer(); network_state_informer_->Init(); core_handler_ = new CoreOobeHandler(this); AddScreenHandler(core_handler_); + core_handler_->SetDelegate(this); AddScreenHandler(new NetworkDropdownHandler); @@ -167,14 +180,14 @@ OobeUI::OobeUI(content::WebUI* web_ui) user_image_screen_actor_ = user_image_screen_handler; AddScreenHandler(user_image_screen_handler); - error_screen_handler_ = new ErrorScreenHandler(network_state_informer_); - AddScreenHandler(error_screen_handler_); - signin_screen_handler_ = new SigninScreenHandler(network_state_informer_); AddScreenHandler(signin_screen_handler_); network_state_informer_->SetDelegate(signin_screen_handler_); + error_screen_handler_ = new ErrorScreenHandler(network_state_informer_); + AddScreenHandler(error_screen_handler_); + DictionaryValue* localized_strings = new DictionaryValue(); GetLocalizedStrings(localized_strings); @@ -206,6 +219,7 @@ OobeUI::OobeUI(content::WebUI* web_ui) } OobeUI::~OobeUI() { + core_handler_->SetDelegate(NULL); } void OobeUI::ShowScreen(WizardScreen* screen) { @@ -286,6 +300,18 @@ void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) { localized_strings->SetString("screenType", "lock"); } +void OobeUI::InitializeScreenMap() { + screen_map_.clear(); + screen_map_[kScreenOobeNetwork] = SCREEN_OOBE_NETWORK; + screen_map_[kScreenOobeEula] = SCREEN_OOBE_EULA; + screen_map_[kScreenOobeUpdate] = SCREEN_OOBE_UPDATE; + screen_map_[kScreenOobeEnrollment] = SCREEN_OOBE_ENROLLMENT; + screen_map_[kScreenGaiaSignin] = SCREEN_GAIA_SIGNIN; + screen_map_[kScreenAccountPicker] = SCREEN_ACCOUNT_PICKER; + screen_map_[kScreenUserImagePicker] = SCREEN_USER_IMAGE_PICKER; + screen_map_[kScreenTpmError] = SCREEN_TMP_ERROR; +} + void OobeUI::AddScreenHandler(BaseScreenHandler* handler) { web_ui()->AddMessageHandler(handler); handlers_.push_back(handler); @@ -319,4 +345,9 @@ void OobeUI::ResetSigninScreenHandlerDelegate() { error_screen_handler_->SetNativeWindowDelegate(NULL); } +void OobeUI::OnCurrentScreenChanged(const std::string& screen) { + if (screen_map_.count(screen)) + current_screen_ = screen_map_[screen]; +} + } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index a883c68..a45bb82 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h @@ -5,11 +5,14 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_ +#include <map> +#include <string> #include <vector> #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "chrome/browser/chromeos/login/oobe_display.h" +#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h" #include "content/public/browser/web_ui_controller.h" namespace base { @@ -33,8 +36,31 @@ namespace chromeos { // - eula screen (CrOS (+ OEM) EULA content/TPM password/crash reporting). // - update screen. class OobeUI : public OobeDisplay, - public content::WebUIController { + public content::WebUIController, + public CoreOobeHandler::Delegate { public: + enum Screen { + SCREEN_OOBE_NETWORK = 0, + SCREEN_OOBE_EULA, + SCREEN_OOBE_UPDATE, + SCREEN_OOBE_ENROLLMENT, + SCREEN_GAIA_SIGNIN, + SCREEN_ACCOUNT_PICKER, + SCREEN_USER_IMAGE_PICKER, + SCREEN_TMP_ERROR, + SCREEN_UNKNOWN + }; + + // JS oobe/login screens names. + static const char kScreenOobeNetwork[]; + static const char kScreenOobeEula[]; + static const char kScreenOobeUpdate[]; + static const char kScreenOobeEnrollment[]; + static const char kScreenGaiaSignin[]; + static const char kScreenAccountPicker[]; + static const char kScreenUserImagePicker[]; + static const char kScreenTpmError[]; + explicit OobeUI(content::WebUI* web_ui); virtual ~OobeUI(); @@ -72,9 +98,17 @@ class OobeUI : public OobeDisplay, // Resets the delegate set in ShowSigninScreen. void ResetSigninScreenHandlerDelegate(); + Screen current_screen() { return current_screen_; } + private: + // Initializes |screen_map_| structure. + void InitializeScreenMap(); + void AddScreenHandler(BaseScreenHandler* handler); + // CoreOobeHandler::Delegate implementation: + virtual void OnCurrentScreenChanged(const std::string& screen) OVERRIDE; + // Reference to NetworkStateInformer that handles changes in network // state. scoped_refptr<NetworkStateInformer> network_state_informer_; @@ -100,6 +134,12 @@ class OobeUI : public OobeDisplay, std::vector<BaseScreenHandler*> handlers_; // Non-owning pointers. + // Id of the current oobe/login screen. + Screen current_screen_; + + // Maps JS screens names to screen id. + std::map<std::string, Screen> screen_map_; + DISALLOW_COPY_AND_ASSIGN(OobeUI); }; diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index 84b34c0..54dcbad 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc @@ -28,6 +28,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -55,10 +56,6 @@ namespace { const char kDefaultDomain[] = "@gmail.com"; -// Account picker screen id. -const char kAccountPickerScreen[] = "account-picker"; -// Sign in screen id for GAIA extension hosted content. -const char kGaiaSigninScreen[] = "gaia-signin"; // Start page of GAIA authentication extension. const char kGaiaExtStartPage[] = "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/main.html"; @@ -129,13 +126,11 @@ SigninScreenHandler::SigninScreenHandler( webui_visible_(false), login_ui_active_(false) { DCHECK(network_state_informer_); - network_state_informer_->AddObserver(this); CrosSettings::Get()->AddSettingsObserver(kAccountsPrefAllowNewUser, this); CrosSettings::Get()->AddSettingsObserver(kAccountsPrefAllowGuest, this); } SigninScreenHandler::~SigninScreenHandler() { - DCHECK(network_state_informer_); weak_factory_.InvalidateWeakPtrs(); if (cookie_remover_) cookie_remover_->RemoveObserver(this); @@ -145,7 +140,6 @@ SigninScreenHandler::~SigninScreenHandler() { key_event_listener->RemoveCapsLockObserver(this); if (delegate_) delegate_->SetWebUIHandler(NULL); - network_state_informer_->RemoveObserver(this); CrosSettings::Get()->RemoveSettingsObserver(kAccountsPrefAllowNewUser, this); CrosSettings::Get()->RemoveSettingsObserver(kAccountsPrefAllowGuest, this); } @@ -231,7 +225,7 @@ void SigninScreenHandler::Show(bool oobe_ui) { DictionaryValue params; params.SetBoolean("disableAddUser", AllWhitelistedUsersPresent()); - ShowScreen(kAccountPickerScreen, ¶ms); + ShowScreen(OobeUI::kScreenAccountPicker, ¶ms); } } @@ -254,16 +248,6 @@ void SigninScreenHandler::OnNetworkReady() { MaybePreloadAuthExtension(); } -void SigninScreenHandler::UpdateState(NetworkStateInformer::State state, - const std::string& network_name, - const std::string& reason, - ConnectionType last_network_type) { - for (WebUIObservers::const_iterator it = observers_.begin(); - it != observers_.end(); ++it) { - SendState(*it, state, network_name, reason, last_network_type); - } -} - // SigninScreenHandler, private: ----------------------------------------------- void SigninScreenHandler::Initialize() { @@ -416,7 +400,7 @@ void SigninScreenHandler::OnPreferencesChanged() { HandleShowAddUser(NULL); } else { SendUserList(false); - ShowScreen(kAccountPickerScreen, NULL); + ShowScreen(OobeUI::kScreenAccountPicker, NULL); } } @@ -513,7 +497,7 @@ void SigninScreenHandler::ShowSigninScreenIfReady() { delegate_->LoadWallpaper(email_); LoadAuthExtension(!gaia_silent_load_, false, false); - ShowScreen(kGaiaSigninScreen, NULL); + ShowScreen(OobeUI::kScreenGaiaSignin, NULL); if (gaia_silent_load_) { // The variable is assigned to false because silently loaded Gaia page was @@ -658,7 +642,7 @@ void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) { // Load auth extension. Parameters are: force reload, do not load extension in // background, use offline version. LoadAuthExtension(true, false, true); - ShowScreen(kGaiaSigninScreen, NULL); + ShowScreen(OobeUI::kScreenGaiaSignin, NULL); } void SigninScreenHandler::HandleShutdownSystem(const base::ListValue* args) { @@ -861,8 +845,6 @@ void SigninScreenHandler::HandleLoginWebuiReady(const base::ListValue* args) { void SigninScreenHandler::HandleLoginRequestNetworkState( const base::ListValue* args) { - DCHECK(network_state_informer_); - std::string callback; std::string reason; if (!args->GetString(0, &callback) || !args->GetString(1, &reason)) { diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index dc23e87..63ec313 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h @@ -126,8 +126,7 @@ class SigninScreenHandler public BrowsingDataRemover::Observer, public SystemKeyEventListener::CapsLockObserver, public content::NotificationObserver, - public NetworkStateInformerDelegate, - public NetworkStateInformer::NetworkStateInformerObserver { + public NetworkStateInformerDelegate { public: SigninScreenHandler( const scoped_refptr<NetworkStateInformer>& network_state_informer); @@ -149,12 +148,6 @@ class SigninScreenHandler // NetworkStateInformerDelegate implementation: virtual void OnNetworkReady() OVERRIDE; - // NetworkStateInformer::NetworkStateInformerObserver implementation: - virtual void UpdateState(NetworkStateInformer::State state, - const std::string& network_name, - const std::string& reason, - ConnectionType last_network_type) OVERRIDE; - private: typedef base::hash_set<std::string> WebUIObservers; @@ -169,7 +162,7 @@ class SigninScreenHandler // WebUIMessageHandler implementation: virtual void RegisterMessages() OVERRIDE; - // BaseLoginUIHandler implementation. + // BaseLoginUIHandler implementation: virtual void ClearAndEnablePassword() OVERRIDE; virtual void OnLoginSuccess(const std::string& username) OVERRIDE; virtual void OnUserRemoved(const std::string& username) OVERRIDE; @@ -191,7 +184,7 @@ class SigninScreenHandler // SystemKeyEventListener::CapsLockObserver overrides. virtual void OnCapsLockChange(bool enabled) OVERRIDE; - // content::NotificationObserver implementation. + // content::NotificationObserver implementation: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; diff --git a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc index 6355379..bdece03 100644 --- a/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/update_screen_handler.cc @@ -8,18 +8,12 @@ #include "base/bind_helpers.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "content/public/browser/web_ui.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" -namespace { - -// Update screen ID. -const char kUpdateScreen[] = "update"; - -} // namespace - namespace chromeos { UpdateScreenHandler::UpdateScreenHandler() @@ -79,7 +73,7 @@ void UpdateScreenHandler::Show() { show_on_init_ = true; return; } - ShowScreen(kUpdateScreen, NULL); + ShowScreen(OobeUI::kScreenOobeUpdate, NULL); #if !defined(OFFICIAL_BUILD) web_ui()->CallJavascriptFunction("oobe.UpdateScreen.enableUpdateCancel"); #endif diff --git a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc index c9906f8..f77f489 100644 --- a/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.cc @@ -14,6 +14,7 @@ #include "chrome/browser/chromeos/login/default_user_images.h" #include "chrome/browser/chromeos/login/user.h" #include "chrome/browser/chromeos/login/webui_login_display.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/browser/ui/webui/web_ui_util.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" @@ -23,13 +24,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/views/widget/widget.h" -namespace { - -// UserImage screen ID. -const char kUserImageScreen[] = "user-image"; - -} // namespace - namespace chromeos { UserImageScreenHandler::UserImageScreenHandler() @@ -94,7 +88,7 @@ void UserImageScreenHandler::Show() { return; } screen_show_time_ = base::Time::Now(); - ShowScreen(kUserImageScreen, NULL); + ShowScreen(OobeUI::kScreenUserImagePicker, NULL); // When shown, query camera presence. CheckCameraPresence(); diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 423bcd8..ea377c4 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -1416,6 +1416,9 @@ const char kDisableNewOobe[] = "disable-new-oobe"; // Avoid doing animations upon oobe. const char kDisableOobeAnimation[] = "disable-oobe-animation"; +// Disables fake ethernet network on the login screen. +const char kDisableStubEthernet[] = "disable-stub-ethernet"; + // Enables component extension that initializes background pages of // certain hosted applications. const char kEnableBackgroundLoader[] = "enable-background-loader"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 9708577..1d31051 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -379,16 +379,17 @@ extern const char kAshEnableTabScrubbing[]; #if defined(OS_CHROMEOS) // Keep switches in alphabetical order. extern const char kAshWebUIInit[]; -extern const char kEnableCarrierSwitching[]; extern const char kDisableBootAnimation[]; extern const char kDisableChromeCaptivePortalDetector[]; -extern const char kDisableDrive[]; extern const char kDisableDrivePrefetch[]; +extern const char kDisableDrive[]; extern const char kDisableFactoryReset[]; extern const char kDisableLoginAnimations[]; extern const char kDisableNewOobe[]; extern const char kDisableOobeAnimation[]; +extern const char kDisableStubEthernet[]; extern const char kEnableBackgroundLoader[]; +extern const char kEnableCarrierSwitching[]; extern const char kEnableChromeCaptivePortalDetector[]; extern const char kEnableTouchpadThreeFingerClick[]; extern const char kEnableTouchpadThreeFingerSwipe[]; |