summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/ui/webui/chromeos/add_supervision
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/ui/webui/chromeos/add_supervision')
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc14
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h9
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc5
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc91
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h12
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc242
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc35
-rw-r--r--chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h7
8 files changed, 356 insertions, 59 deletions
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
index e418a046414..626b2d4cc9a 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
@@ -11,12 +11,13 @@
#include "base/stl_util.h"
#include "chrome/browser/apps/app_service/app_service_proxy.h"
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler_utils.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h"
#include "chrome/services/app_service/public/cpp/app_registry_cache.h"
@@ -26,17 +27,20 @@
#include "components/user_manager/user_manager.h"
#include "content/public/browser/web_ui.h"
#include "google_apis/gaia/gaia_constants.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
namespace chromeos {
AddSupervisionHandler::AddSupervisionHandler(
- add_supervision::mojom::AddSupervisionHandlerRequest request,
+ mojo::PendingReceiver<add_supervision::mojom::AddSupervisionHandler>
+ receiver,
content::WebUI* web_ui,
+ signin::IdentityManager* identity_manager,
Delegate* delegate)
: web_ui_(web_ui),
- identity_manager_(
- IdentityManagerFactory::GetForProfile(Profile::FromWebUI(web_ui))),
- binding_(this, std::move(request)),
+ identity_manager_(identity_manager),
+ receiver_(this, std::move(receiver)),
delegate_(delegate) {}
AddSupervisionHandler::~AddSupervisionHandler() = default;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h
index 63db8d65ecd..8310d5bda98 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h
@@ -9,7 +9,8 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
namespace content {
class WebUI;
@@ -39,8 +40,10 @@ class AddSupervisionHandler
// |delegate| is owned by the caller and its lifetime must outlive |this|.
AddSupervisionHandler(
- add_supervision::mojom::AddSupervisionHandlerRequest request,
+ mojo::PendingReceiver<add_supervision::mojom::AddSupervisionHandler>
+ receiver,
content::WebUI* web_ui,
+ signin::IdentityManager* identity_manager,
Delegate* delegate);
~AddSupervisionHandler() override;
@@ -63,7 +66,7 @@ class AddSupervisionHandler
signin::IdentityManager* identity_manager_;
std::unique_ptr<signin::AccessTokenFetcher> oauth2_access_token_fetcher_;
- mojo::Binding<add_supervision::mojom::AddSupervisionHandler> binding_;
+ mojo::Receiver<add_supervision::mojom::AddSupervisionHandler> receiver_;
Delegate* delegate_;
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
index 3071dacac19..72e41559d58 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/constants/chromeos_features.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "content/public/test/test_web_ui.h"
namespace chromeos {
@@ -55,10 +56,12 @@ class AddSupervisionMetricsRecorderTest : public InProcessBrowserTest {
}
void NotifySupervisionEnabled() {
+ signin::IdentityTestEnvironment identity_test_env;
add_supervision::mojom::AddSupervisionHandlerRequest request;
AddSupervisionUI add_supervision_ui(&test_web_ui_);
AddSupervisionHandler add_supervision_handler(
- std::move(request), &test_web_ui_, &add_supervision_ui);
+ std::move(request), &test_web_ui_, identity_test_env.identity_manager(),
+ &add_supervision_ui);
add_supervision_handler.NotifySupervisionEnabled();
}
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
index c0c3fb9b98f..6579db46102 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
@@ -12,7 +12,10 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/supervised_user/supervised_user_service.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/ui/views/chrome_web_dialog_view.h"
+#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler_utils.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h"
@@ -22,7 +25,7 @@
#include "components/google/core/common/google_util.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/resources/grit/ui_resources.h"
#include "ui/web_dialogs/web_dialog_delegate.h"
@@ -50,22 +53,6 @@ const char kAddSupervisionDefaultURL[] =
const char kAddSupervisionFlowType[] = "1";
const char kAddSupervisionSwitch[] = "add-supervision-url";
-// Returns the URL of the Add Supervision flow from the command-line switch,
-// or the default value if it's not defined.
-GURL GetAddSupervisionURL() {
- std::string url;
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(kAddSupervisionSwitch)) {
- url = command_line->GetSwitchValueASCII(kAddSupervisionSwitch);
- } else {
- url = kAddSupervisionDefaultURL;
- }
- const GURL result(url);
- DCHECK(result.is_valid()) << "Invalid URL \"" << url << "\" for switch \""
- << kAddSupervisionSwitch << "\"";
- return result;
-}
-
} // namespace
// AddSupervisionDialog implementations.
@@ -144,6 +131,9 @@ AddSupervisionDialog::~AddSupervisionDialog() = default;
// AddSupervisionUI implementations.
+// static
+signin::IdentityManager* AddSupervisionUI::test_identity_manager_ = nullptr;
+
AddSupervisionUI::AddSupervisionUI(content::WebUI* web_ui)
: ui::MojoWebUIController(web_ui) {
// Register the Mojo API handler.
@@ -151,17 +141,47 @@ AddSupervisionUI::AddSupervisionUI(content::WebUI* web_ui)
&AddSupervisionUI::BindAddSupervisionHandler, base::Unretained(this)));
// Set up the basic page framework.
- SetupResources();
+ SetUpResources();
+}
+
+AddSupervisionUI::~AddSupervisionUI() = default;
+
+bool AddSupervisionUI::CloseDialog() {
+ bool showing_confirm_dialog = MaybeShowConfirmSignoutDialog();
+ if (!showing_confirm_dialog) {
+ // We aren't showing the confirm dialog, so close the AddSupervisionDialog.
+ AddSupervisionDialog::Close();
+ }
+ return !showing_confirm_dialog;
+}
+
+// static
+void AddSupervisionUI::SetUpForTest(signin::IdentityManager* identity_manager) {
+ test_identity_manager_ = identity_manager;
}
-void AddSupervisionUI::SetupResources() {
+void AddSupervisionUI::BindAddSupervisionHandler(
+ mojo::PendingReceiver<add_supervision::mojom::AddSupervisionHandler>
+ receiver) {
+ signin::IdentityManager* identity_manager =
+ test_identity_manager_
+ ? test_identity_manager_
+ : IdentityManagerFactory::GetForProfile(Profile::FromWebUI(web_ui()));
+
+ mojo_api_handler_ = std::make_unique<AddSupervisionHandler>(
+ std::move(receiver), web_ui(), identity_manager, this);
+}
+
+void AddSupervisionUI::SetUpResources() {
Profile* profile = Profile::FromWebUI(web_ui());
std::unique_ptr<content::WebUIDataSource> source(
content::WebUIDataSource::Create(chrome::kChromeUIAddSupervisionHost));
// Initialize supervision URL from the command-line arguments (if provided).
supervision_url_ = GetAddSupervisionURL();
- DCHECK(supervision_url_.DomainIs("google.com"));
+ if (!allow_non_google_url_for_tests_) {
+ DCHECK(supervision_url_.DomainIs("google.com"));
+ }
// Forward data to the WebUI.
source->AddResourcePath("post_message_api.js",
@@ -201,21 +221,24 @@ void AddSupervisionUI::SetupResources() {
content::WebUIDataSource::Add(profile, source.release());
}
-AddSupervisionUI::~AddSupervisionUI() = default;
-
-bool AddSupervisionUI::CloseDialog() {
- bool showing_confirm_dialog = MaybeShowConfirmSignoutDialog();
- if (!showing_confirm_dialog) {
- // We aren't showing the confirm dialog, so close the AddSupervisionDialog.
- AddSupervisionDialog::Close();
+// Returns the URL of the Add Supervision flow from the command-line switch,
+// or the default value if it's not defined.
+GURL AddSupervisionUI::GetAddSupervisionURL() {
+ std::string url;
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(kAddSupervisionSwitch)) {
+ url = command_line->GetSwitchValueASCII(kAddSupervisionSwitch);
+ // The URL should only be set on the command line for testing purposes,
+ // which may include pointing to a non-google URL (i.e. http://localhost/).
+ // Therefore, we allow non-Google URLs in this instance.
+ allow_non_google_url_for_tests_ = true;
+ } else {
+ url = kAddSupervisionDefaultURL;
}
- return !showing_confirm_dialog;
-}
-
-void AddSupervisionUI::BindAddSupervisionHandler(
- add_supervision::mojom::AddSupervisionHandlerRequest request) {
- mojo_api_handler_ = std::make_unique<AddSupervisionHandler>(
- std::move(request), web_ui(), this);
+ const GURL result(url);
+ DCHECK(result.is_valid()) << "Invalid URL \"" << url << "\" for switch \""
+ << kAddSupervisionSwitch << "\"";
+ return result;
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
index 02afc8e1d8e..a05b13f8b31 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
@@ -11,6 +11,7 @@
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/base/ui_base_types.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/controls/label.h"
@@ -64,16 +65,23 @@ class AddSupervisionUI : public ui::MojoWebUIController,
// AddSupervisionHandler::Delegate:
bool CloseDialog() override;
+ static void SetUpForTest(signin::IdentityManager* identity_manager);
+
private:
void BindAddSupervisionHandler(
- add_supervision::mojom::AddSupervisionHandlerRequest request);
- void SetupResources();
+ mojo::PendingReceiver<add_supervision::mojom::AddSupervisionHandler>
+ receiver);
+ void SetUpResources();
+ GURL GetAddSupervisionURL();
std::unique_ptr<add_supervision::mojom::AddSupervisionHandler>
mojo_api_handler_;
GURL supervision_url_;
+ static signin::IdentityManager* test_identity_manager_;
+ bool allow_non_google_url_for_tests_ = false;
+
DISALLOW_COPY_AND_ASSIGN(AddSupervisionUI);
};
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
new file mode 100644
index 00000000000..f0995d1b6d7
--- /dev/null
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui_browsertest.cc
@@ -0,0 +1,242 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/macros.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/metrics/user_action_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder.h"
+#include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h"
+#include "chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/network_connection_change_simulator.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+// NOTE: This test is flaky and therefore disabled under MSAN:
+// https://crbug.com/1002560
+#if !defined(MEMORY_SANITIZER)
+
+namespace {
+
+const char kGetAddSupervisionUIElementJS[] =
+ "document.querySelector('add-supervision-ui')";
+}
+
+// Base class for AddSupervision tests.
+class AddSupervisionBrowserTest : public InProcessBrowserTest {
+ public:
+ AddSupervisionBrowserTest() {
+ scoped_feature_list_.InitWithFeatures(
+ {chromeos::features::kParentalControlsSettings}, {});
+ }
+ ~AddSupervisionBrowserTest() override = default;
+
+ void SetUpOnMainThread() override {
+ // TODO(danan): See if this is possible to do this instead using
+ // FakeGaia.IssueOAuthToken().
+ identity_test_env_ = std::make_unique<signin::IdentityTestEnvironment>();
+ identity_test_env_->MakePrimaryAccountAvailable("example@gmail.com");
+ // This makes the identity manager return the string "access_token" for the
+ // access token.
+ identity_test_env_->SetAutomaticIssueOfAccessTokens(true);
+ AddSupervisionUI::SetUpForTest(identity_test_env_->identity_manager());
+
+ // Set start_time_ so that the DCHECK(!start_time_.is_null()) in
+ // AddSupervisionMetricsRecorder::RecordUserTime() doesn't throw.
+ AddSupervisionMetricsRecorder::GetInstance()
+ ->RecordAddSupervisionEnrollment(
+ AddSupervisionMetricsRecorder::EnrollmentState::kInitiated);
+ }
+
+ chromeos::AddSupervisionUI* GetAddSupervisionUI() {
+ return static_cast<chromeos::AddSupervisionUI*>(
+ contents()->GetWebUI()->GetController());
+ }
+
+ content::WebContents* contents() {
+ return browser()->tab_strip_model()->GetActiveWebContents();
+ }
+
+ GURL settings_webui_url() { return GURL(chrome::kChromeUISettingsURL); }
+
+ GURL add_supervision_webui_url() {
+ return GURL(chrome::kChromeUIAddSupervisionURL);
+ }
+
+ bool IsElementVisible(const std::string& element_selector) {
+ bool found;
+ bool hidden;
+ std::string script = std::string("domAutomationController.send(") +
+ element_selector + ".hidden);";
+ LOG(ERROR) << "Script: " << script;
+ found = content::ExecuteScriptAndExtractBool(contents(), script, &hidden);
+ return found && !hidden;
+ }
+
+ private:
+ base::test::ScopedFeatureList scoped_feature_list_;
+ std::unique_ptr<signin::IdentityTestEnvironment> identity_test_env_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddSupervisionBrowserTest);
+};
+
+// Disabled on ASan and LSAn builds, because it's very flaky. See
+// crbug.com/1004237
+#if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER)
+#define MAYBE_URLParameters DISABLED_URLParameters
+#else
+#define MAYBE_URLParameters URLParameters
+#endif
+IN_PROC_BROWSER_TEST_F(AddSupervisionBrowserTest, MAYBE_URLParameters) {
+ // Open the Add Supervision URL.
+ ui_test_utils::NavigateToURL(browser(), add_supervision_webui_url());
+ content::WaitForLoadStop(contents());
+
+ // Get the URL from the embedded webview.
+ std::string webview_url;
+ ASSERT_TRUE(content::ExecuteScriptAndExtractString(
+ contents(),
+ std::string("domAutomationController.send(") +
+ std::string(kGetAddSupervisionUIElementJS) +
+ ".shadowRoot.querySelector('#webview').getAttribute('src')" +
+ std::string(");"),
+ &webview_url));
+
+ GURL webview_gurl(webview_url);
+ ASSERT_TRUE(webview_gurl.has_query());
+
+ // Split the query string into a map of keys to values.
+ std::string query_str = webview_gurl.query();
+ url::Component query(0, query_str.length());
+ url::Component key;
+ url::Component value;
+ std::map<std::string, std::string> query_parts;
+ while (url::ExtractQueryKeyValue(query_str.c_str(), &query, &key, &value)) {
+ query_parts[query_str.substr(key.begin, key.len)] =
+ query_str.substr(value.begin, value.len);
+ }
+
+ // Validate the query parameters.
+ ASSERT_EQ(query_parts.at("flow_type"), "1");
+ ASSERT_EQ(query_parts.at("platform_version"),
+ base::SysInfo::OperatingSystemVersion());
+ ASSERT_EQ(query_parts.at("access_token"), "access_token");
+ ASSERT_EQ(query_parts.at("hl"), "en-US");
+}
+
+IN_PROC_BROWSER_TEST_F(AddSupervisionBrowserTest, ShowOfflineScreen) {
+ // Open the Add Supervision URL.
+ ui_test_utils::NavigateToURL(browser(), add_supervision_webui_url());
+ content::WaitForLoadStop(contents());
+
+ // Webview div should be initially visible.
+ ASSERT_TRUE(IsElementVisible(std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".webviewDiv")));
+
+ // Simulate going offline.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), "window.dispatchEvent(new CustomEvent('offline'));"));
+
+ // Ensure the offline content view is shown.
+ ASSERT_TRUE(IsElementVisible(std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".offlineContentDiv")));
+
+ // Ensure the online webview content content is hidden.
+ ASSERT_FALSE(IsElementVisible(std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".webviewDiv")));
+
+ // Simulate going online.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), "window.dispatchEvent(new CustomEvent('online'));"));
+
+ // Offline div should be hidden.
+ ASSERT_FALSE(IsElementVisible(std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".offlineContentDiv")));
+
+ // Webview div should be shown.
+ ASSERT_TRUE(IsElementVisible(std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".webviewDiv")));
+}
+
+// Disabled on ASan and LSAn builds, because it's very flaky. See
+// crbug.com/1004237
+#if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER)
+#define MAYBE_ShowConfirmSignoutDialog DISABLED_ShowConfirmSignoutDialog
+#else
+#define MAYBE_ShowConfirmSignoutDialog ShowConfirmSignoutDialog
+#endif
+IN_PROC_BROWSER_TEST_F(AddSupervisionBrowserTest,
+ MAYBE_ShowConfirmSignoutDialog) {
+ // Open the Add Supervision URL.
+ ui_test_utils::NavigateToURL(browser(), add_supervision_webui_url());
+ content::WaitForLoadStop(contents());
+
+ // Request that the dialog close before supervision has been enabled.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".server.requestClose()")));
+ // Confirm that the signout dialog isn't showing
+ ASSERT_FALSE(ConfirmSignoutDialog::IsShowing());
+
+ // Simulate supervision being enabled.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".server.notifySupervisionEnabled()")));
+
+ // Request that the dialog is closed again.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".server.requestClose()")));
+
+ // Confirm that the dialog is showing.
+ ASSERT_TRUE(ConfirmSignoutDialog::IsShowing());
+}
+
+IN_PROC_BROWSER_TEST_F(AddSupervisionBrowserTest, UMATest) {
+ base::HistogramTester histogram_tester;
+ base::UserActionTester user_action_tester;
+
+ // Should see 0 Add Supervision enrollment metrics at first.
+ histogram_tester.ExpectTotalCount("AddSupervisionDialog.Enrollment", 0);
+
+ // Should see 0 user actions at first.
+ EXPECT_EQ(user_action_tester.GetActionCount(
+ "AddSupervisionDialog_AttemptedSignoutAfterEnrollment"),
+ 0);
+
+ // Open the Add Supervision URL.
+ ui_test_utils::NavigateToURL(browser(), add_supervision_webui_url());
+ content::WaitForLoadStop(contents());
+
+ // Simulate supervision being enabled.
+ ASSERT_TRUE(content::ExecuteScript(
+ contents(), std::string(kGetAddSupervisionUIElementJS) +
+ std::string(".server.notifySupervisionEnabled()")));
+
+ // Should see 1 Add Supervision process completed.
+ histogram_tester.ExpectUniqueSample(
+ "AddSupervisionDialog.Enrollment",
+ AddSupervisionMetricsRecorder::EnrollmentState::kCompleted, 1);
+ histogram_tester.ExpectTotalCount("AddSupervisionDialog.Enrollment", 1);
+
+ // Should see 1 EnrollmentCompleted action.
+ EXPECT_EQ(user_action_tester.GetActionCount(
+ "AddSupervisionDialog_EnrollmentCompleted"),
+ 1);
+}
+
+#endif // !defined(MEMORY_SANITIZER)
+
+} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
index b0754f4a57b..f9594134ec5 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
@@ -29,6 +29,14 @@ const int kDialogBodyTextWidth = 250;
} // namespace
ConfirmSignoutDialog::ConfirmSignoutDialog() {
+ DialogDelegate::set_button_label(
+ ui::DIALOG_BUTTON_OK,
+ l10n_util::GetStringUTF16(
+ IDS_ADD_SUPERVISION_EXIT_DIALOG_SIGNOUT_BUTTON_LABEL));
+ DialogDelegate::set_button_label(
+ ui::DIALOG_BUTTON_CANCEL,
+ l10n_util::GetStringUTF16(
+ IDS_ADD_SUPERVISION_EXIT_DIALOG_CANCEL_BUTTON_LABEL));
SetLayoutManager(std::make_unique<views::FillLayout>());
SetBorder(views::CreateEmptyBorder(
views::LayoutProvider::Get()->GetDialogInsetsForContentType(
@@ -44,7 +52,9 @@ ConfirmSignoutDialog::ConfirmSignoutDialog() {
AddChildView(body);
}
-ConfirmSignoutDialog::~ConfirmSignoutDialog() = default;
+ConfirmSignoutDialog::~ConfirmSignoutDialog() {
+ ConfirmSignoutDialog::current_instance_ = nullptr;
+}
ui::ModalType ConfirmSignoutDialog::GetModalType() const {
return ui::ModalType::MODAL_TYPE_SYSTEM;
@@ -64,23 +74,22 @@ int ConfirmSignoutDialog::GetDialogButtons() const {
ui::DialogButton::DIALOG_BUTTON_CANCEL;
}
-base::string16 ConfirmSignoutDialog::GetDialogButtonLabel(
- ui::DialogButton button) const {
- if (button == ui::DialogButton::DIALOG_BUTTON_OK) {
- return l10n_util::GetStringUTF16(
- IDS_ADD_SUPERVISION_EXIT_DIALOG_SIGNOUT_BUTTON_LABEL);
- }
- return l10n_util::GetStringUTF16(
- IDS_ADD_SUPERVISION_EXIT_DIALOG_CANCEL_BUTTON_LABEL);
-}
+// static
+views::Widget* ConfirmSignoutDialog::current_instance_ = nullptr;
// static
void ConfirmSignoutDialog::Show() {
// Ownership of the ConfirmSignoutDialog is passed to the views system.
// Dialog is system-modal, so no parent window is needed.
- constrained_window::CreateBrowserModalDialogViews(new ConfirmSignoutDialog(),
- nullptr /* parent window */)
- ->Show();
+ ConfirmSignoutDialog::current_instance_ =
+ constrained_window::CreateBrowserModalDialogViews(
+ new ConfirmSignoutDialog(), nullptr /* parent window */);
+ current_instance_->Show();
+}
+
+// static
+bool ConfirmSignoutDialog::IsShowing() {
+ return ConfirmSignoutDialog::current_instance_ != nullptr;
}
} // namespace chromeos
diff --git a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
index 6e7bff69d73..c8d7a820a6b 100644
--- a/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
+++ b/chromium/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.h
@@ -9,6 +9,10 @@
#include "ui/base/ui_base_types.h"
#include "ui/views/window/dialog_delegate.h"
+namespace views {
+class Widget;
+}
+
namespace chromeos {
// Dialog shown when the user tries to close the flow when account has already
@@ -25,12 +29,13 @@ class ConfirmSignoutDialog : public views::DialogDelegateView {
// views::DialogDelegate:
bool Accept() override;
int GetDialogButtons() const override;
- base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
static void Show();
+ static bool IsShowing();
private:
ConfirmSignoutDialog();
+ static views::Widget* current_instance_;
DISALLOW_COPY_AND_ASSIGN(ConfirmSignoutDialog);
};