Commit 0c4ba8c4 authored by Roman Sorokin's avatar Roman Sorokin Committed by Chromium LUCI CQ

CrOS OOBE: Handle UpdateScreen rename between versions.

Update screen was renamed in http://crrev.com/c/2230462 in M85.
If device updates from <85 to >=85 version - pending update screen (from
local state) is not recognized. This makes Chromebooks start from the
welcome screen again.
Chromebases, Chromeboxes and Chromebits might actually suffer from the
white screen on M85 and M86. Users can't bypass the screen and have to
recover devices.
This CL handle this rename gracefully.

Fixed: 1160383
Change-Id: I1bc529791ef3072ce397cb85640416117ac85a94
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2600910Reviewed-by: default avatarDenis Kuznetsov [CET] <antrim@chromium.org>
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#839152}
parent 3a4351cb
......@@ -8,7 +8,9 @@
#include "base/macros.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
#include "chrome/browser/chromeos/login/test/local_state_mixin.h"
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/test/session_manager_state_waiter.h"
......@@ -17,8 +19,10 @@
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/update_screen_handler.h"
#include "chrome/browser/ui/webui/signin/signin_utils.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/constants/chromeos_switches.h"
#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
......@@ -126,4 +130,33 @@ IN_PROC_BROWSER_TEST_F(OobeTest, Accelerator) {
OobeScreenWaiter(EnrollmentScreenView::kScreenId).Wait();
}
// Checks that update screen is shown with both legacy and actual name stored
// in the local state.
class PendingUpdateScreenTest
: public OobeBaseTest,
public LocalStateMixin::Delegate,
public ::testing::WithParamInterface<std::string> {
protected:
// LocalStateMixin::Delegate:
void SetUpLocalState() final {
PrefService* prefs = g_browser_process->local_state();
prefs->SetString(prefs::kOobeScreenPending, GetParam());
}
LocalStateMixin local_state_mixin_{&mixin_host_, this};
};
IN_PROC_BROWSER_TEST_P(PendingUpdateScreenTest, UpdateScreenShown) {
OobeScreenWaiter(UpdateView::kScreenId).Wait();
PrefService* prefs = g_browser_process->local_state();
std::string pending_screen = prefs->GetString(prefs::kOobeScreenPending);
// Should be overwritten with actual value.
EXPECT_EQ(pending_screen, UpdateView::kScreenId.name);
}
INSTANTIATE_TEST_SUITE_P(All,
PendingUpdateScreenTest,
testing::Values("update" /* old value */,
"oobe-update" /* actual value */));
} // namespace chromeos
......@@ -204,6 +204,9 @@ const unsigned int kResolveTimeZoneTimeoutSeconds = 60;
constexpr const char kDefaultExitReason[] = "Next";
constexpr const char kResetScreenExitReason[] = "Cancel";
// TODO(https://crbug.com/1161535) Remove after stepping stone is set after M87.
constexpr char kLegacyUpdateScreenName[] = "update";
// Stores the list of all screens that should be shown when resuming OOBE.
const chromeos::StaticOobeScreenId kResumableScreens[] = {
chromeos::WelcomeView::kScreenId,
......@@ -335,6 +338,12 @@ GetSharedURLLoaderFactoryForTesting() {
return *loader;
}
chromeos::OobeScreenId PrefToScreenId(const std::string& pref_value) {
if (pref_value == kLegacyUpdateScreenName)
return chromeos::UpdateView::kScreenId;
return chromeos::OobeScreenId(pref_value);
}
} // namespace
namespace chromeos {
......@@ -463,7 +472,7 @@ void WizardController::AdvanceToScreenAfterHIDDetection(
const std::string screen_pref =
GetLocalState()->GetString(prefs::kOobeScreenPending);
if (!screen_pref.empty())
actual_first_screen = OobeScreenId(screen_pref);
actual_first_screen = PrefToScreenId(screen_pref);
else
actual_first_screen = WelcomeView::kScreenId;
}
......
......@@ -21,6 +21,9 @@ class UpdateScreen;
// representation. Owned by UpdateScreen.
class UpdateView {
public:
// The screen name must never change. It's stored into local state as a
// pending screen during OOBE update. So the value should be the same between
// versions.
constexpr static StaticOobeScreenId kScreenId{"oobe-update"};
// Enumeration of UI states. These values must be kept in sync with
......
......@@ -14,6 +14,7 @@
-All/OobeLocalizationTest.*
-All/OobeZeroTouchInteractiveUITest.*
-All/ParameterizedArcTermsOfServiceScreenTest.*
-All/PendingUpdateScreenTest.*
-All/PublicSessionOobeTest.*
-All/PublicSessionWithTermsOfServiceOobeTest.*
-All/SAMLPasswordAttributesTest.*
......
......@@ -14,6 +14,7 @@ All/OobeInteractiveUITest.*
All/OobeLocalizationTest.*
All/OobeZeroTouchInteractiveUITest.*
All/ParameterizedArcTermsOfServiceScreenTest.*
All/PendingUpdateScreenTest.*
All/PublicSessionOobeTest.*
All/PublicSessionWithTermsOfServiceOobeTest.*
All/SAMLPasswordAttributesTest.*
......
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