Add demo apps disclaimer to Demo Mode ARC++ setup

Bug: 945438
Change-Id: I314f5aecb5e12fa17fc033b51af0305c80039b47
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1568310
Reviewed-by: Toni Baržić <tbarzic@chromium.org>
Reviewed-by: Aga Wronska <agawronska@chromium.org>
Commit-Queue: Michael Giuffrida <michaelpg@chromium.org>
Auto-Submit: Michael Giuffrida <michaelpg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652626}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index c9cdb4a3..89f4542 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -2870,6 +2870,9 @@
   <message name="IDS_ARC_OOBE_TERMS_DIALOG_METRICS_DISABLED_CHILD" desc="Message in the Arc Terms OOBE dialog in case metrics disabled on the device, and a child account is in use.">
     Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device, and app usage data to Google. This won't be used to identify your child and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &#38; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-metrics"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
+  <message name="IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS" desc="Addendum to the metrics disclaimer in the Arc Terms OOBE dialog during Demo Mode setup explaining that demo apps have their own policies for data collection.">
+    Note that Android, Play, and associated apps are governed by their own data collection and use policies.
+  </message>
   <message name="IDS_ARC_OPT_IN_LOCATION_SETTING" desc="Message in the opt-in dialog for Android apps for the user to turn on Google location services.">
     Use location. Allow apps and services with location permission to use your device’s location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services. <ph name="BEGIN_LINK1">&lt;a href="#" id="learn-more-link-location-service"&gt;</ph>Learn More<ph name="END_LINK1">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS.png.sha1
new file mode 100644
index 0000000..9188d038
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS.png.sha1
@@ -0,0 +1 @@
+c06a1511e87abcc0711c42bb16cb486fa5cd78b8
\ No newline at end of file
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
index 213ba5f..cece5ff 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_browsertest.cc
@@ -71,7 +71,7 @@
 enum class OobeButton { kBack, kNext, kText };
 
 // Dialogs that are a part of Demo Mode setup screens.
-enum class DemoSetupDialog { kNetwork, kEula, kProgress, kError };
+enum class DemoSetupDialog { kNetwork, kEula, kArcTos, kProgress, kError };
 
 // Returns the tag of the given |button| type.
 std::string ButtonToTag(OobeButton button) {
@@ -94,6 +94,8 @@
       return "networkDialog";
     case DemoSetupDialog::kEula:
       return "eulaDialog";
+    case DemoSetupDialog::kArcTos:
+      return "arc-tos-dialog";
     case DemoSetupDialog::kProgress:
       return "demoSetupProgressDialog";
     case DemoSetupDialog::kError:
@@ -169,23 +171,37 @@
     return !test::OobeJS().GetBool(kIsConfirmationDialogHiddenQuery);
   }
 
+  // TODO(michaelpg): Replace this with IsScreenDialogElementVisible, which is
+  // more robust because it checks whether the element is actually rendered.
+  // Do this after a branch in case it introduces flakiness.
   bool IsScreenDialogElementShown(OobeScreen screen,
                                   DemoSetupDialog dialog,
                                   const std::string& element_selector) {
     const std::string element = base::StrCat(
-        {ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
-         ".querySelector('", element_selector, "')"});
+        {ScreenToContentQuery(screen), ".$['", DialogToStringId(dialog),
+         "'].querySelector('", element_selector, "')"});
     const std::string query =
         base::StrCat({"!!", element, " && !", element, ".hidden"});
     return test::OobeJS().GetBool(query);
   }
 
+  bool IsScreenDialogElementVisible(OobeScreen screen,
+                                    DemoSetupDialog dialog,
+                                    const std::string& element_selector) {
+    const std::string element = base::StrCat(
+        {ScreenToContentQuery(screen), ".$['", DialogToStringId(dialog),
+         "'].querySelector('", element_selector, "')"});
+    const std::string query =
+        base::StrCat({"!!", element, " && ", element, ".offsetHeight > 0"});
+    return test::OobeJS().GetBool(query);
+  }
+
   bool IsScreenDialogElementEnabled(OobeScreen screen,
                                     DemoSetupDialog dialog,
                                     const std::string& element_selector) {
     const std::string element = base::StrCat(
-        {ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
-         ".querySelector('", element_selector, "')"});
+        {ScreenToContentQuery(screen), ".$['", DialogToStringId(dialog),
+         "'].querySelector('", element_selector, "')"});
     const std::string query =
         base::StrCat({"!!", element, " && !", element, ".disabled"});
     return test::OobeJS().GetBool(query);
@@ -210,8 +226,8 @@
   bool IsErrorMessageShown(int error_message_id, int recovery_message_id) {
     const std::string element_selector =
         base::StrCat({ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP),
-                      ".$.", DialogToStringId(DemoSetupDialog::kError),
-                      ".querySelector('div[slot=subtitle]')"});
+                      ".$['", DialogToStringId(DemoSetupDialog::kError),
+                      "'].querySelector('div[slot=subtitle]')"});
     const std::string query = base::StrCat(
         {"!!", element_selector, " && ", element_selector, ".innerHTML == '",
          l10n_util::GetStringUTF8(error_message_id), " ",
@@ -297,8 +313,8 @@
                                            const std::string& button_selector,
                                            JSExecution execution) {
     const std::string query = base::StrCat(
-        {ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
-         ".querySelector('", button_selector, "').click();"});
+        {ScreenToContentQuery(screen), ".$['", DialogToStringId(dialog),
+         "'].querySelector('", button_selector, "').click();"});
     switch (execution) {
       case JSExecution::kAsync:
         test::ExecuteOobeJSAsync(query);
@@ -345,8 +361,8 @@
 
   void WaitForScreenDialog(OobeScreen screen, DemoSetupDialog dialog) {
     const std::string query =
-        base::StrCat({"!", ScreenToContentQuery(screen), ".$.",
-                      DialogToStringId(dialog), ".hidden"});
+        base::StrCat({"!", ScreenToContentQuery(screen), ".$['",
+                      DialogToStringId(dialog), "'].hidden"});
     WaitForJsCondition(query);
   }
 
@@ -540,6 +556,11 @@
   EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
 
   SetPlayStoreTermsForTesting();
+
+  EXPECT_TRUE(IsScreenDialogElementVisible(
+      OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE, DemoSetupDialog::kArcTos,
+      "#arc-tos-metrics-demo-apps"));
+
   ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
                               "#arc-tos-next-button", JSExecution::kSync);
   ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
@@ -893,6 +914,11 @@
   EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
 
   SetPlayStoreTermsForTesting();
+
+  EXPECT_TRUE(IsScreenDialogElementVisible(
+      OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE, DemoSetupDialog::kArcTos,
+      "#arc-tos-metrics-demo-apps"));
+
   ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
                               "#arc-tos-next-button", JSExecution::kSync);
   ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.css b/chrome/browser/resources/chromeos/login/arc_terms_of_service.css
index 7f14054..f732a77 100644
--- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.css
+++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.css
@@ -46,7 +46,8 @@
   display: none;
 }
 
-#arc-tos-dialog:not(.arc-tos-for-demo-mode) #arc-tos-back-button {
+#arc-tos-dialog:not(.arc-tos-for-demo-mode) #arc-tos-back-button,
+#arc-tos-dialog:not(.arc-tos-for-demo-mode) #arc-tos-metrics-demo-apps {
   display: none;
 }
 
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
index 7193b7b2..ce8cad4 100644
--- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
+++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
@@ -26,6 +26,10 @@
         <div class="parameter-section arc-tos-content">
           <p id="arc-text-metrics"></p>
         </div>
+        <div id="arc-tos-metrics-demo-apps"
+            class="parameter-section arc-tos-content">
+          <p i18n-content="arcTextMetricsDemoApps"></p>
+        </div>
         <div id="arc-backup-service" class="parameter-section arc-tos-content">
           <cr-checkbox id="arc-enable-backup-restore">
             <p i18n-values=".innerHTML:arcTextBackupRestore"></p>
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index 94db4b0..65e6694 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -133,6 +133,7 @@
   builder->Add("arcTextReviewSettings", IDS_ARC_REVIEW_SETTINGS);
   builder->Add("arcTextMetricsManagedEnabled",
                IDS_ARC_OOBE_TERMS_DIALOG_METRICS_MANAGED_ENABLED);
+  builder->Add("arcTextMetricsDemoApps", IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS);
   builder->Add("arcAcceptAndContinueGoogleServiceConfirmation",
                IDS_ARC_OPT_IN_ACCEPT_AND_CONTINUE_GOOGLE_SERVICE_CONFIRMATION);
   builder->Add("arcLearnMoreStatistics",