Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2993)

Unified Diff: chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc

Issue 332243002: Network connectivity errors handling (incl. CP) for enrollment flow (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix building browser_test Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index d16820ffc1c74c756b16bd6b613d966d0ec71c09..37f353befe869660be022eecc9c7adb07695e202 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -10,14 +10,19 @@
#include "base/bind_helpers.h"
#include "base/compiler_specific.h"
#include "base/message_loop/message_loop.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/browsing_data_remover.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
#include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retriever.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
#include "components/policy/core/browser/cloud/message_util.h"
#include "content/public/browser/web_contents.h"
#include "google_apis/gaia/gaia_auth_fetcher.h"
@@ -90,18 +95,41 @@ class TokenRevoker : public GaiaAuthConsumer {
// EnrollmentScreenHandler, public ------------------------------
-EnrollmentScreenHandler::EnrollmentScreenHandler()
+EnrollmentScreenHandler::EnrollmentScreenHandler(
+ const scoped_refptr<NetworkStateInformer>& network_state_informer,
+ ErrorScreenActor* error_screen_actor)
: BaseScreenHandler(kJsScreenPath),
controller_(NULL),
show_on_init_(false),
enrollment_mode_(ENROLLMENT_MODE_MANUAL),
- browsing_data_remover_(NULL) {
+ browsing_data_remover_(NULL),
+ frame_error_(net::OK),
+ network_state_informer_(network_state_informer),
+ error_screen_actor_(error_screen_actor) {
set_async_assets_load_id(OobeUI::kScreenOobeEnrollment);
+ DCHECK(network_state_informer_.get());
+ DCHECK(error_screen_actor_);
+ network_state_informer_->AddObserver(this);
+
+ if (chromeos::LoginDisplayHostImpl::default_host()) {
+ chromeos::WebUILoginView* login_view =
+ chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
+ if (login_view)
+ login_view->AddFrameObserver(this);
+ }
}
EnrollmentScreenHandler::~EnrollmentScreenHandler() {
if (browsing_data_remover_)
browsing_data_remover_->RemoveObserver(this);
+ network_state_informer_->RemoveObserver(this);
+
+ if (chromeos::LoginDisplayHostImpl::default_host()) {
+ chromeos::WebUILoginView* login_view =
+ chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
+ if (login_view)
+ login_view->RemoveFrameObserver(this);
+ }
}
// EnrollmentScreenHandler, WebUIMessageHandler implementation --
@@ -115,6 +143,8 @@ void EnrollmentScreenHandler::RegisterMessages() {
&EnrollmentScreenHandler::HandleCompleteLogin);
AddCallback("oauthEnrollRetry",
&EnrollmentScreenHandler::HandleRetry);
+ AddCallback("frameLoadingCompleted",
+ &EnrollmentScreenHandler::HandleFrameLoadingCompleted);
}
// EnrollmentScreenHandler
@@ -354,6 +384,150 @@ void EnrollmentScreenHandler::OnBrowsingDataRemoverDone() {
}
}
+OobeUI::Screen EnrollmentScreenHandler::GetCurrentScreen() const {
+ 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;
+}
+
+bool EnrollmentScreenHandler::IsOnEnrollmentScreen() const {
+ return (GetCurrentScreen() == OobeUI::SCREEN_OOBE_ENROLLMENT);
+}
+
+bool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const {
+ return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE &&
+ error_screen_actor_->parent_screen() ==
+ OobeUI::SCREEN_OOBE_ENROLLMENT);
+}
+
+void EnrollmentScreenHandler::UpdateState(
+ ErrorScreenActor::ErrorReason reason) {
+ if (!IsOnEnrollmentScreen() && !IsEnrollmentScreenHiddenByError()) {
+ return;
+ }
ygorshenin1 2014/06/18 13:11:35 nit: curly braces are redundant here.
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+
+ NetworkStateInformer::State state = network_state_informer_->state();
+ const std::string network_path = network_state_informer_->network_path();
+ const bool is_online = (state == NetworkStateInformer::ONLINE);
+ const bool is_behind_captive_portal =
+ (state == NetworkStateInformer::CAPTIVE_PORTAL);
+ const bool is_frame_error =
+ (FrameError() != net::OK) ||
+ (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
+
+ LOG(WARNING) << "EnrollmentScreenHandler::UpdateState(): "
+ << "state=" << NetworkStateInformer::StatusString(state) << ", "
+ << "reason=" << ErrorScreenActor::ErrorReasonString(reason);
+
+ if (is_online || !is_behind_captive_portal)
+ error_screen_actor_->HideCaptivePortal();
+
+ if (is_frame_error) {
+ LOG(WARNING) << "Retry page load";
+ // TODO(rsorokin): To many consecutive reloads.
ygorshenin1 2014/06/18 13:11:35 nit: s/To/Too/
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ CallJS("doReload");
+ }
+
+ if (!is_online || is_frame_error) {
ygorshenin1 2014/06/18 13:11:35 nit: curly braces are redundant here.
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ SetupAndShowOfflineMessage(state, reason);
+ } else {
+ HideOfflineMessage(state, reason);
+ }
+}
+
+// Returns network name by service path.
+std::string GetNetworkName(const std::string& service_path) {
ygorshenin1 2014/06/18 13:11:35 Move this function to the anonymous namespace.
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ const NetworkState* network =
+ NetworkHandler::Get()->network_state_handler()->GetNetworkState(
+ service_path);
+ if (!network)
+ return std::string();
+ return network->name();
+}
+
+bool IsBehindCaptivePortal(NetworkStateInformer::State state,
+ ErrorScreenActor::ErrorReason reason) {
+ return state == NetworkStateInformer::CAPTIVE_PORTAL ||
+ reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED;
+}
+
+bool IsProxyError(NetworkStateInformer::State state,
+ ErrorScreenActor::ErrorReason reason) {
+ return state == NetworkStateInformer::PROXY_AUTH_REQUIRED ||
+ reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED ||
+ reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED;
+}
+
+void EnrollmentScreenHandler::SetupAndShowOfflineMessage(
+ NetworkStateInformer::State state,
+ ErrorScreenActor::ErrorReason reason) {
+ const std::string network_path = network_state_informer_->network_path();
+ const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
+ const bool is_proxy_error = IsProxyError(state, reason);
+ const bool is_frame_error =
+ (FrameError() != net::OK) ||
+ (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
+
+ if (is_proxy_error) {
+ error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY,
+ std::string());
+ } else if (is_behind_captive_portal) {
+ // 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 (IsOnEnrollmentScreen() || (error_screen_actor_->error_state() !=
+ ErrorScreen::ERROR_STATE_PORTAL)) {
+ LOG(ERROR) << "fixcaptiveportal";
ygorshenin1 2014/06/18 13:11:35 Remove debug code.
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ error_screen_actor_->FixCaptivePortal();
+ }
+ const std::string network_name = GetNetworkName(network_path);
+ error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL,
+ network_name);
+ } else if (is_frame_error) {
+ error_screen_actor_->SetErrorState(
+ ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string());
+ } else {
+ error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE,
+ std::string());
+ }
+
+ if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) {
+ base::DictionaryValue params;
+ const std::string network_type = network_state_informer_->network_type();
+ params.SetString("lastNetworkType", network_type);
+ error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN);
+ error_screen_actor_->Show(
+ OobeUI::SCREEN_OOBE_ENROLLMENT,
+ &params,
+ base::Bind(&EnrollmentScreenHandler::DoShow, base::Unretained(this)));
+ }
+}
+
+void EnrollmentScreenHandler::HideOfflineMessage(
+ NetworkStateInformer::State state,
+ ErrorScreenActor::ErrorReason reason) {
+ if (!IsEnrollmentScreenHiddenByError())
+ return;
+
ygorshenin1 2014/06/18 13:11:35 I suggest you to inverse condition: if (IsEnrollme
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ error_screen_actor_->Hide();
+}
+
+void EnrollmentScreenHandler::DidFailProvisionalLoad(
+ int64 frame_id,
+ const base::string16& frame_unique_name,
+ bool is_main_frame,
+ const GURL& validated_url,
+ int error_code,
+ const base::string16& error_description,
+ content::RenderViewHost* render_view_host) {
+ if (!MatchPattern(frame_unique_name,
+ base::UTF8ToUTF16("*oauth-enroll-signin-frame*")))
ygorshenin1 2014/06/18 13:11:35 As condition requires 2 lines, curly braces are ne
Roman Sorokin (ftl) 2014/06/19 11:57:38 Done.
+ return;
+ HandleFrameLoadingCompleted(net::ERR_FAILED);
+}
// EnrollmentScreenHandler, private -----------------------------
void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail(
@@ -396,6 +570,18 @@ void EnrollmentScreenHandler::HandleRetry() {
controller_->OnRetry();
}
+void EnrollmentScreenHandler::HandleFrameLoadingCompleted(int status) {
+ const net::Error frame_error = static_cast<net::Error>(status);
+ frame_error_ = frame_error;
+
+ if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
+ return;
+ if (frame_error_)
+ UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
+ else
+ UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
+}
+
void EnrollmentScreenHandler::ShowStep(const char* step) {
CallJS("showStep", std::string(step));
}

Powered by Google App Engine
This is Rietveld 408576698