OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" | 5 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
94 // Type of the login screen UI that is currently presented to user. | 94 // Type of the login screen UI that is currently presented to user. |
95 const char kSourceGaiaSignin[] = "gaia-signin"; | 95 const char kSourceGaiaSignin[] = "gaia-signin"; |
96 const char kSourceAccountPicker[] = "account-picker"; | 96 const char kSourceAccountPicker[] = "account-picker"; |
97 | 97 |
98 static bool Contains(const std::vector<std::string>& container, | 98 static bool Contains(const std::vector<std::string>& container, |
99 const std::string& value) { | 99 const std::string& value) { |
100 return std::find(container.begin(), container.end(), value) != | 100 return std::find(container.begin(), container.end(), value) != |
101 container.end(); | 101 container.end(); |
102 } | 102 } |
103 | 103 |
104 class CallOnReturn { | |
105 public: | |
106 explicit CallOnReturn(const base::Closure& callback) | |
107 : callback_(callback), call_scheduled_(false) {} | |
108 | |
109 ~CallOnReturn() { | |
110 if (call_scheduled_ && !callback_.is_null()) | |
111 callback_.Run(); | |
112 } | |
113 | |
114 void ScheduleCall() { call_scheduled_ = true; } | |
115 | |
116 private: | |
117 base::Closure callback_; | |
118 bool call_scheduled_; | |
119 | |
120 DISALLOW_COPY_AND_ASSIGN(CallOnReturn); | |
121 }; | |
122 | |
104 } // namespace | 123 } // namespace |
105 | 124 |
106 namespace chromeos { | 125 namespace chromeos { |
107 | 126 |
108 namespace { | 127 namespace { |
109 | 128 |
110 bool IsOnline(NetworkStateInformer::State state, | 129 bool IsOnline(NetworkStateInformer::State state, |
111 ErrorScreenActor::ErrorReason reason) { | 130 ErrorScreenActor::ErrorReason reason) { |
112 return state == NetworkStateInformer::ONLINE && | 131 return state == NetworkStateInformer::ONLINE && |
113 reason != ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED && | 132 reason != ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED && |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
535 (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT); | 554 (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT); |
536 const bool is_gaia_error = | 555 const bool is_gaia_error = |
537 FrameError() != net::OK && FrameError() != net::ERR_NETWORK_CHANGED; | 556 FrameError() != net::OK && FrameError() != net::ERR_NETWORK_CHANGED; |
538 const bool is_gaia_signin = IsGaiaVisible() || IsGaiaHiddenByError(); | 557 const bool is_gaia_signin = IsGaiaVisible() || IsGaiaHiddenByError(); |
539 const bool error_screen_should_overlay = | 558 const bool error_screen_should_overlay = |
540 !offline_login_active_ && IsGaiaVisible(); | 559 !offline_login_active_ && IsGaiaVisible(); |
541 const bool from_not_online_to_online_transition = | 560 const bool from_not_online_to_online_transition = |
542 is_online && last_network_state_ != NetworkStateInformer::ONLINE; | 561 is_online && last_network_state_ != NetworkStateInformer::ONLINE; |
543 last_network_state_ = state; | 562 last_network_state_ = state; |
544 | 563 |
564 CallOnReturn reload_gaia(base::Bind( | |
565 &SigninScreenHandler::ReloadGaia, weak_factory_.GetWeakPtr(), true)); | |
566 | |
545 if (is_online || !is_behind_captive_portal) | 567 if (is_online || !is_behind_captive_portal) |
546 error_screen_actor_->HideCaptivePortal(); | 568 error_screen_actor_->HideCaptivePortal(); |
547 | 569 |
548 // Hide offline message (if needed) and return if current screen is | 570 // Hide offline message (if needed) and return if current screen is |
549 // not a Gaia frame. | 571 // not a Gaia frame. |
550 if (!is_gaia_signin) { | 572 if (!is_gaia_signin) { |
551 if (!IsSigninScreenHiddenByError()) | 573 if (!IsSigninScreenHiddenByError()) |
552 HideOfflineMessage(state, reason); | 574 HideOfflineMessage(state, reason); |
553 return; | 575 return; |
554 } | 576 } |
555 | 577 |
556 // Reload frame if network state is changed from {!ONLINE} -> ONLINE state. | 578 // Reload frame if network state is changed from {!ONLINE} -> ONLINE state. |
557 if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED && | 579 if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED && |
558 from_not_online_to_online_transition) { | 580 from_not_online_to_online_transition) { |
559 // Schedules a immediate retry. | 581 // Schedules a immediate retry. |
560 LOG(WARNING) << "Retry page load since network has been changed."; | 582 LOG(WARNING) << "Retry frame load since network has been changed."; |
561 ReloadGaiaScreen(); | 583 reload_gaia.ScheduleCall(); |
562 } | 584 } |
563 | 585 |
564 if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED && | 586 if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED && |
565 error_screen_should_overlay) { | 587 error_screen_should_overlay) { |
566 // Schedules a immediate retry. | 588 // Schedules a immediate retry. |
567 LOG(WARNING) << "Retry page load since proxy settings has been changed."; | 589 LOG(WARNING) << "Retry frameload since proxy settings has been changed."; |
568 ReloadGaiaScreen(); | 590 reload_gaia.ScheduleCall(); |
569 } | 591 } |
570 | 592 |
571 if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR && | 593 if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR && |
572 !IsProxyError(state, reason, FrameError())) { | 594 !IsProxyError(state, reason, FrameError())) { |
573 LOG(WARNING) << "Retry page load due to reason: " | 595 LOG(WARNING) << "Retry frame load due to reason: " |
574 << ErrorScreenActor::ErrorReasonString(reason); | 596 << ErrorScreenActor::ErrorReasonString(reason); |
575 ReloadGaiaScreen(); | 597 reload_gaia.ScheduleCall(); |
598 } | |
599 | |
600 if (is_gaia_loading_timeout) { | |
601 LOG(WARNING) << "Retry frame load due to loading timeout."; | |
602 reload_gaia.ScheduleCall(); | |
576 } | 603 } |
577 | 604 |
578 if ((!is_online || is_gaia_loading_timeout || is_gaia_error) && | 605 if ((!is_online || is_gaia_loading_timeout || is_gaia_error) && |
579 !offline_login_active_) { | 606 !offline_login_active_) { |
580 SetupAndShowOfflineMessage(state, reason); | 607 SetupAndShowOfflineMessage(state, reason); |
581 } else { | 608 } else { |
582 HideOfflineMessage(state, reason); | 609 HideOfflineMessage(state, reason); |
583 } | 610 } |
584 } | 611 } |
585 | 612 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
638 void SigninScreenHandler::HideOfflineMessage( | 665 void SigninScreenHandler::HideOfflineMessage( |
639 NetworkStateInformer::State state, | 666 NetworkStateInformer::State state, |
640 ErrorScreenActor::ErrorReason reason) { | 667 ErrorScreenActor::ErrorReason reason) { |
641 if (!IsSigninScreenHiddenByError()) | 668 if (!IsSigninScreenHiddenByError()) |
642 return; | 669 return; |
643 | 670 |
644 error_screen_actor_->Hide(); | 671 error_screen_actor_->Hide(); |
645 | 672 |
646 // Forces a reload for Gaia screen on hiding error message. | 673 // Forces a reload for Gaia screen on hiding error message. |
647 if (IsGaiaVisible() || IsGaiaHiddenByError()) | 674 if (IsGaiaVisible() || IsGaiaHiddenByError()) |
648 ReloadGaiaScreen(); | 675 ReloadGaia(false); |
Nikita (slow)
2014/07/23 13:34:16
Comment says "Forces a reload for GAIA".
Consideri
ygorshenin1
2014/07/23 13:38:48
Not sure, because we'll try to reload already relo
Nikita (slow)
2014/07/23 13:55:41
As far as I understand in case of IsGaiaHiddenByEr
ygorshenin1
2014/07/23 13:59:12
ReloadGaia(true) means "reload gaia in any case, e
| |
649 } | 676 } |
650 | 677 |
651 void SigninScreenHandler::ReloadGaiaScreen() { | 678 void SigninScreenHandler::ReloadGaia(bool force_reload) { |
652 gaia_screen_handler_->ReloadGaia(); | 679 gaia_screen_handler_->ReloadGaia(force_reload); |
653 } | 680 } |
654 | 681 |
655 void SigninScreenHandler::Initialize() { | 682 void SigninScreenHandler::Initialize() { |
656 // If delegate_ is NULL here (e.g. WebUIScreenLocker has been destroyed), | 683 // If delegate_ is NULL here (e.g. WebUIScreenLocker has been destroyed), |
657 // don't do anything, just return. | 684 // don't do anything, just return. |
658 if (!delegate_) | 685 if (!delegate_) |
659 return; | 686 return; |
660 | 687 |
661 if (show_on_init_) { | 688 if (show_on_init_) { |
662 show_on_init_ = false; | 689 show_on_init_ = false; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
825 const content::NotificationDetails& details) { | 852 const content::NotificationDetails& details) { |
826 switch (type) { | 853 switch (type) { |
827 case chrome::NOTIFICATION_AUTH_NEEDED: { | 854 case chrome::NOTIFICATION_AUTH_NEEDED: { |
828 has_pending_auth_ui_ = true; | 855 has_pending_auth_ui_ = true; |
829 break; | 856 break; |
830 } | 857 } |
831 case chrome::NOTIFICATION_AUTH_SUPPLIED: | 858 case chrome::NOTIFICATION_AUTH_SUPPLIED: |
832 has_pending_auth_ui_ = false; | 859 has_pending_auth_ui_ = false; |
833 // Reload auth extension as proxy credentials are supplied. | 860 // Reload auth extension as proxy credentials are supplied. |
834 if (!IsSigninScreenHiddenByError() && ui_state_ == UI_STATE_GAIA_SIGNIN) | 861 if (!IsSigninScreenHiddenByError() && ui_state_ == UI_STATE_GAIA_SIGNIN) |
835 ReloadGaiaScreen(); | 862 ReloadGaia(true); |
836 update_state_closure_.Cancel(); | 863 update_state_closure_.Cancel(); |
837 break; | 864 break; |
838 case chrome::NOTIFICATION_AUTH_CANCELLED: { | 865 case chrome::NOTIFICATION_AUTH_CANCELLED: { |
839 // Don't reload auth extension if proxy auth dialog was cancelled. | 866 // Don't reload auth extension if proxy auth dialog was cancelled. |
840 has_pending_auth_ui_ = false; | 867 has_pending_auth_ui_ = false; |
841 update_state_closure_.Cancel(); | 868 update_state_closure_.Cancel(); |
842 break; | 869 break; |
843 } | 870 } |
844 default: | 871 default: |
845 NOTREACHED() << "Unexpected notification " << type; | 872 NOTREACHED() << "Unexpected notification " << type; |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1378 return gaia_screen_handler_->frame_error(); | 1405 return gaia_screen_handler_->frame_error(); |
1379 } | 1406 } |
1380 | 1407 |
1381 void SigninScreenHandler::OnCapsLockChanged(bool enabled) { | 1408 void SigninScreenHandler::OnCapsLockChanged(bool enabled) { |
1382 caps_lock_enabled_ = enabled; | 1409 caps_lock_enabled_ = enabled; |
1383 if (page_is_ready()) | 1410 if (page_is_ready()) |
1384 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); | 1411 CallJS("login.AccountPickerScreen.setCapsLockState", caps_lock_enabled_); |
1385 } | 1412 } |
1386 | 1413 |
1387 } // namespace chromeos | 1414 } // namespace chromeos |
OLD | NEW |