Fixed Gaia reloading.

Previously in the case of auth frame loading timeout auth frame was not reloaded, since we expected that frame will send an error to SigninScreenHandler. Current implementation explicitly reloads web frame when timeout happens.

BUG=394970
TEST=manual
NOTRY=true

Review URL: https://codereview.chromium.org/416493002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284976 0039d316-1c4b-4281-b951-d872f2087c98
parent 891cda4e
...@@ -182,9 +182,11 @@ void GaiaScreenHandler::UpdateGaia(const GaiaContext& context) { ...@@ -182,9 +182,11 @@ void GaiaScreenHandler::UpdateGaia(const GaiaContext& context) {
CallJS("updateAuthExtension", params); CallJS("updateAuthExtension", params);
} }
void GaiaScreenHandler::ReloadGaia() { void GaiaScreenHandler::ReloadGaia(bool force_reload) {
if (frame_state_ == FRAME_STATE_LOADING) if (frame_state_ == FRAME_STATE_LOADING && !force_reload) {
VLOG(1) << "Skipping reloading of Gaia since gaia is loading.";
return; return;
}
NetworkStateInformer::State state = network_state_informer_->state(); NetworkStateInformer::State state = network_state_informer_->state();
if (state != NetworkStateInformer::ONLINE) { if (state != NetworkStateInformer::ONLINE) {
VLOG(1) << "Skipping reloading of Gaia since network state=" VLOG(1) << "Skipping reloading of Gaia since network state="
......
...@@ -57,7 +57,11 @@ class GaiaScreenHandler : public BaseScreenHandler { ...@@ -57,7 +57,11 @@ class GaiaScreenHandler : public BaseScreenHandler {
void LoadGaia(const GaiaContext& context); void LoadGaia(const GaiaContext& context);
void UpdateGaia(const GaiaContext& context); void UpdateGaia(const GaiaContext& context);
void ReloadGaia();
// Sends request to reload Gaia. If |force_reload| is true, request
// will be sent in any case, otherwise it will be sent only when Gaia is
// not loading right now.
void ReloadGaia(bool force_reload);
FrameState frame_state() const { return frame_state_; } FrameState frame_state() const { return frame_state_; }
net::Error frame_error() const { return frame_error_; } net::Error frame_error() const { return frame_error_; }
......
...@@ -101,6 +101,25 @@ static bool Contains(const std::vector<std::string>& container, ...@@ -101,6 +101,25 @@ static bool Contains(const std::vector<std::string>& container,
container.end(); container.end();
} }
class CallOnReturn {
public:
explicit CallOnReturn(const base::Closure& callback)
: callback_(callback), call_scheduled_(false) {}
~CallOnReturn() {
if (call_scheduled_ && !callback_.is_null())
callback_.Run();
}
void ScheduleCall() { call_scheduled_ = true; }
private:
base::Closure callback_;
bool call_scheduled_;
DISALLOW_COPY_AND_ASSIGN(CallOnReturn);
};
} // namespace } // namespace
namespace chromeos { namespace chromeos {
...@@ -542,6 +561,9 @@ void SigninScreenHandler::UpdateStateInternal( ...@@ -542,6 +561,9 @@ void SigninScreenHandler::UpdateStateInternal(
is_online && last_network_state_ != NetworkStateInformer::ONLINE; is_online && last_network_state_ != NetworkStateInformer::ONLINE;
last_network_state_ = state; last_network_state_ = state;
CallOnReturn reload_gaia(base::Bind(
&SigninScreenHandler::ReloadGaia, weak_factory_.GetWeakPtr(), true));
if (is_online || !is_behind_captive_portal) if (is_online || !is_behind_captive_portal)
error_screen_actor_->HideCaptivePortal(); error_screen_actor_->HideCaptivePortal();
...@@ -557,22 +579,27 @@ void SigninScreenHandler::UpdateStateInternal( ...@@ -557,22 +579,27 @@ void SigninScreenHandler::UpdateStateInternal(
if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED && if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED &&
from_not_online_to_online_transition) { from_not_online_to_online_transition) {
// Schedules a immediate retry. // Schedules a immediate retry.
LOG(WARNING) << "Retry page load since network has been changed."; LOG(WARNING) << "Retry frame load since network has been changed.";
ReloadGaiaScreen(); reload_gaia.ScheduleCall();
} }
if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED && if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED &&
error_screen_should_overlay) { error_screen_should_overlay) {
// Schedules a immediate retry. // Schedules a immediate retry.
LOG(WARNING) << "Retry page load since proxy settings has been changed."; LOG(WARNING) << "Retry frameload since proxy settings has been changed.";
ReloadGaiaScreen(); reload_gaia.ScheduleCall();
} }
if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR && if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR &&
!IsProxyError(state, reason, FrameError())) { !IsProxyError(state, reason, FrameError())) {
LOG(WARNING) << "Retry page load due to reason: " LOG(WARNING) << "Retry frame load due to reason: "
<< ErrorScreenActor::ErrorReasonString(reason); << ErrorScreenActor::ErrorReasonString(reason);
ReloadGaiaScreen(); reload_gaia.ScheduleCall();
}
if (is_gaia_loading_timeout) {
LOG(WARNING) << "Retry frame load due to loading timeout.";
reload_gaia.ScheduleCall();
} }
if ((!is_online || is_gaia_loading_timeout || is_gaia_error) && if ((!is_online || is_gaia_loading_timeout || is_gaia_error) &&
...@@ -645,11 +672,11 @@ void SigninScreenHandler::HideOfflineMessage( ...@@ -645,11 +672,11 @@ void SigninScreenHandler::HideOfflineMessage(
// Forces a reload for Gaia screen on hiding error message. // Forces a reload for Gaia screen on hiding error message.
if (IsGaiaVisible() || IsGaiaHiddenByError()) if (IsGaiaVisible() || IsGaiaHiddenByError())
ReloadGaiaScreen(); ReloadGaia(false);
} }
void SigninScreenHandler::ReloadGaiaScreen() { void SigninScreenHandler::ReloadGaia(bool force_reload) {
gaia_screen_handler_->ReloadGaia(); gaia_screen_handler_->ReloadGaia(force_reload);
} }
void SigninScreenHandler::Initialize() { void SigninScreenHandler::Initialize() {
...@@ -832,7 +859,7 @@ void SigninScreenHandler::Observe(int type, ...@@ -832,7 +859,7 @@ void SigninScreenHandler::Observe(int type,
has_pending_auth_ui_ = false; has_pending_auth_ui_ = false;
// Reload auth extension as proxy credentials are supplied. // Reload auth extension as proxy credentials are supplied.
if (!IsSigninScreenHiddenByError() && ui_state_ == UI_STATE_GAIA_SIGNIN) if (!IsSigninScreenHiddenByError() && ui_state_ == UI_STATE_GAIA_SIGNIN)
ReloadGaiaScreen(); ReloadGaia(true);
update_state_closure_.Cancel(); update_state_closure_.Cancel();
break; break;
case chrome::NOTIFICATION_AUTH_CANCELLED: { case chrome::NOTIFICATION_AUTH_CANCELLED: {
......
...@@ -262,7 +262,7 @@ class SigninScreenHandler ...@@ -262,7 +262,7 @@ class SigninScreenHandler
ErrorScreenActor::ErrorReason reason); ErrorScreenActor::ErrorReason reason);
void HideOfflineMessage(NetworkStateInformer::State state, void HideOfflineMessage(NetworkStateInformer::State state,
ErrorScreenActor::ErrorReason reason); ErrorScreenActor::ErrorReason reason);
void ReloadGaiaScreen(); void ReloadGaia(bool force_reload);
// BaseScreenHandler implementation: // BaseScreenHandler implementation:
virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE; virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment