Print Preview: Migrate print button, app, and sidebar tests to TS

Bug: 1245834
Change-Id: Id95a02ec2fcff4777e0963bef5cfc56435513c38
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3321297
Reviewed-by: Demetrios Papadopoulos <dpapad@chromium.org>
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/main@{#949827}
diff --git a/chrome/browser/resources/print_preview/ui/sidebar.ts b/chrome/browser/resources/print_preview/ui/sidebar.ts
index ab98ef34..3c2e856 100644
--- a/chrome/browser/resources/print_preview/ui/sidebar.ts
+++ b/chrome/browser/resources/print_preview/ui/sidebar.ts
@@ -248,5 +248,11 @@
   // </if>
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'print-preview-sidebar': PrintPreviewSidebarElement;
+  }
+}
+
 customElements.define(
     PrintPreviewSidebarElement.is, PrintPreviewSidebarElement);
diff --git a/chrome/test/data/webui/print_preview/BUILD.gn b/chrome/test/data/webui/print_preview/BUILD.gn
index d7090e7..78d9ef68 100644
--- a/chrome/test/data/webui/print_preview/BUILD.gn
+++ b/chrome/test/data/webui/print_preview/BUILD.gn
@@ -23,9 +23,9 @@
   "native_layer_stub.ts",
   "policy_test.ts",
   "preview_generation_test.ts",
-  "print_button_test.js",
-  "print_preview_app_test.js",
-  "print_preview_sidebar_test.js",
+  "print_button_test.ts",
+  "print_preview_app_test.ts",
+  "print_preview_sidebar_test.ts",
   "print_preview_test_utils.ts",
   "restore_state_test.js",
   "user_manager_test.js",
diff --git a/chrome/test/data/webui/print_preview/print_button_test.js b/chrome/test/data/webui/print_preview/print_button_test.ts
similarity index 61%
rename from chrome/test/data/webui/print_preview/print_button_test.js
rename to chrome/test/data/webui/print_preview/print_button_test.ts
index 8a004cb..4e1cd3c 100644
--- a/chrome/test/data/webui/print_preview/print_button_test.js
+++ b/chrome/test/data/webui/print_preview/print_button_test.ts
@@ -2,8 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {Destination, GooglePromotedDestinationId, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js';
+import {CrButtonElement, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement, PrintTicket} from 'chrome://print/print_preview.js';
+// <if expr="chromeos or lacros">
+import {GooglePromotedDestinationId} from 'chrome://print/print_preview.js';
+// </if>
 import {assert} from 'chrome://resources/js/assert.m.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 // <if expr="chromeos or lacros">
 import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js';
@@ -13,33 +17,28 @@
 import {getDefaultInitialSettings} from './print_preview_test_utils.js';
 import {TestPluginProxy} from './test_plugin_proxy.js';
 
-
-window.print_button_test = {};
-print_button_test.suiteName = 'PrintButtonTest';
-/** @enum {string} */
-print_button_test.TestNames = {
-  LocalPrintHidePreview: 'local print hide preview',
-  PDFPrintVisiblePreview: 'pdf print visible preview',
-  SaveToDriveVisiblePreviewCros: 'save to drive visible preview cros',
+const print_button_test = {
+  suiteName: 'PrintButtonTest',
+  TestNames: {
+    LocalPrintHidePreview: 'local print hide preview',
+    PDFPrintVisiblePreview: 'pdf print visible preview',
+    SaveToDriveVisiblePreviewCros: 'save to drive visible preview cros',
+  },
 };
 
+Object.assign(window, {print_button_test: print_button_test});
+
 suite(print_button_test.suiteName, function() {
-  /** @type {?PrintPreviewAppElement} */
-  let page = null;
+  let page: PrintPreviewAppElement;
 
-  /** @type {?NativeLayer} */
-  let nativeLayer = null;
+  let nativeLayer: NativeLayerStub;
 
-  /** @type {boolean} */
-  let printBeforePreviewReady = false;
+  let printBeforePreviewReady: boolean = false;
 
-  /** @type {boolean} */
-  let previewHidden = false;
+  let previewHidden: boolean = false;
 
-  /** @type {!NativeInitialSettings} */
-  const initialSettings = getDefaultInitialSettings();
+  const initialSettings: NativeInitialSettings = getDefaultInitialSettings();
 
-  /** @override */
   setup(function() {
     nativeLayer = new NativeLayerStub();
     NativeLayerImpl.setInstance(nativeLayer);
@@ -64,11 +63,13 @@
       // loading, since previewArea.onPluginLoadComplete_() indicates to the UI
       // that the preview is ready.
       if (printBeforePreviewReady) {
-        const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
+        const sidebar =
+            page.shadowRoot!.querySelector('print-preview-sidebar')!;
         const parentElement =
-            sidebar.shadowRoot.querySelector('print-preview-button-strip');
+            sidebar.shadowRoot!.querySelector('print-preview-button-strip')!;
         const printButton =
-            parentElement.shadowRoot.querySelector('.action-button');
+            parentElement.shadowRoot!.querySelector<CrButtonElement>(
+                '.action-button')!;
         assertFalse(printButton.disabled);
         printButton.click();
       }
@@ -80,14 +81,12 @@
     });
   });
 
-  function waitForInitialPreview() {
-    return nativeLayer.whenCalled('getInitialSettings').then(function() {
-      // Wait for the preview request.
-      return Promise.all([
-        nativeLayer.whenCalled('getPrinterCapabilities'),
-        nativeLayer.whenCalled('getPreview')
-      ]);
-    });
+  function waitForInitialPreview(): Promise<any> {
+    return Promise.all([
+      nativeLayer.whenCalled('getInitialSettings'),
+      nativeLayer.whenCalled('getPrinterCapabilities'),
+      nativeLayer.whenCalled('getPreview'),
+    ]);
   }
 
   // Tests that hidePreview() is called before print() if a local printer is
@@ -100,11 +99,12 @@
           // Wait for the print request.
           return nativeLayer.whenCalled('print');
         })
-        .then(function(printTicket) {
+        .then(function(printTicket: string) {
           assertTrue(previewHidden);
 
           // Verify that the printer name is correct.
-          assertEquals('FooDevice', JSON.parse(printTicket).deviceName);
+          assertEquals(
+              'FooDevice', (JSON.parse(printTicket) as PrintTicket).deviceName);
           return nativeLayer.whenCalled('dialogClose');
         });
   });
@@ -122,15 +122,16 @@
 
           // Select Save as PDF destination
           const destinationSettings =
-              page.shadowRoot.querySelector('print-preview-sidebar')
-                  .shadowRoot.querySelector(
-                      'print-preview-destination-settings');
+              page.shadowRoot!.querySelector('print-preview-sidebar')!
+                  .shadowRoot!.querySelector(
+                      'print-preview-destination-settings')!;
           const pdfDestination =
-              destinationSettings.destinationStore_.destinations().find(
-                  d => d.id === 'Save as PDF');
+              destinationSettings.getDestinationStoreForTest()
+                  .destinations()
+                  .find(d => d.id === 'Save as PDF');
           assertTrue(!!pdfDestination);
-          destinationSettings.destinationStore_.selectDestination(
-              pdfDestination);
+          destinationSettings.getDestinationStoreForTest().selectDestination(
+              pdfDestination!);
 
           // Reload preview and wait for print.
           return nativeLayer.whenCalled('print');
@@ -139,11 +140,14 @@
           assertFalse(previewHidden);
 
           // Verify that the printer name is correct.
-          assertEquals('Save as PDF', JSON.parse(printTicket).deviceName);
+          assertEquals(
+              'Save as PDF',
+              (JSON.parse(printTicket) as PrintTicket).deviceName);
           return nativeLayer.whenCalled('dialogClose');
         });
   });
 
+  // <if expr="chromeos or lacros">
   // Tests that hidePreview() is not called if Save to Drive is selected on
   // Chrome OS and the user clicks print while the preview is loading because
   // Save to Drive needs to be treated like Save as PDF.
@@ -160,16 +164,18 @@
 
               // Select Save as PDF destination
               const destinationSettings =
-                  page.shadowRoot.querySelector('print-preview-sidebar')
-                      .shadowRoot.querySelector(
-                          'print-preview-destination-settings');
+                  page.shadowRoot!.querySelector('print-preview-sidebar')!
+                      .shadowRoot!.querySelector(
+                          'print-preview-destination-settings')!;
               const driveDestination =
-                  destinationSettings.destinationStore_.destinations().find(
-                      d => d.id ===
-                          GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS);
+                  destinationSettings.getDestinationStoreForTest()
+                      .destinations()
+                      .find(
+                          d => d.id ===
+                              GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS);
               assertTrue(!!driveDestination);
-              destinationSettings.destinationStore_.selectDestination(
-                  driveDestination);
+              destinationSettings.getDestinationStoreForTest()
+                  .selectDestination(driveDestination!);
 
               // Reload preview and wait for print.
               return nativeLayer.whenCalled('print');
@@ -180,8 +186,9 @@
               // Verify that the printer name is correct.
               assertEquals(
                   GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS,
-                  JSON.parse(printTicket).deviceName);
+                  (JSON.parse(printTicket) as PrintTicket).deviceName);
               return nativeLayer.whenCalled('dialogClose');
             });
       });
+  // </if>
 });
diff --git a/chrome/test/data/webui/print_preview/print_preview_app_test.js b/chrome/test/data/webui/print_preview/print_preview_app_test.ts
similarity index 69%
rename from chrome/test/data/webui/print_preview/print_preview_app_test.js
rename to chrome/test/data/webui/print_preview/print_preview_app_test.ts
index 7f93eab..211c9817 100644
--- a/chrome/test/data/webui/print_preview/print_preview_app_test.js
+++ b/chrome/test/data/webui/print_preview/print_preview_app_test.ts
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CloudPrintInterfaceImpl, Destination, DuplexMode, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js';
+import {CloudPrintInterfaceImpl, DuplexMode, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement} from 'chrome://print/print_preview.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+
 import {CloudPrintInterfaceStub} from './cloud_print_interface_stub.js';
 
 // <if expr="chromeos or lacros">
@@ -17,33 +19,30 @@
 import {TestPluginProxy} from './test_plugin_proxy.js';
 
 
-window.print_preview_app_test = {};
-print_preview_app_test.suiteName = 'PrintPreviewAppTest';
-/** @enum {string} */
-print_preview_app_test.TestNames = {
-  PrintToGoogleDrive: 'print to google drive',
-  PrintPresets: 'print presets',
-  DestinationsManaged: 'destinations managed',
-  HeaderFooterManaged: 'header footer managed',
-  CssBackgroundManaged: 'css background managed',
-  SheetsManaged: 'sheets managed'
+const print_preview_app_test = {
+  suiteName: 'PrintPreviewAppTest',
+  TestNames: {
+    PrintToGoogleDrive: 'print to google drive',
+    PrintPresets: 'print presets',
+    DestinationsManaged: 'destinations managed',
+    HeaderFooterManaged: 'header footer managed',
+    CssBackgroundManaged: 'css background managed',
+    SheetsManaged: 'sheets managed'
+  },
 };
 
+Object.assign(window, {print_preview_app_test: print_preview_app_test});
+
 suite(print_preview_app_test.suiteName, function() {
-  /** @type {?PrintPreviewAppElement} */
-  let page = null;
+  let page: PrintPreviewAppElement;
 
-  /** @type {?NativeLayer} */
-  let nativeLayer = null;
+  let nativeLayer: NativeLayerStub;
 
-  /** @type {?CloudPrintInterface} */
-  let cloudPrintInterface = null;
+  let cloudPrintInterface: CloudPrintInterfaceStub;
 
-  /** @type {?TestPluginProxy} */
-  let pluginProxy = null;
+  let pluginProxy: TestPluginProxy;
 
-  /** @type {!NativeInitialSettings} */
-  const initialSettings = {
+  const initialSettings: NativeInitialSettings = {
     isInKioskAutoPrintMode: false,
     isInAppKioskMode: false,
     thousandsDelimiter: ',',
@@ -59,25 +58,25 @@
     pdfPrinterDisabled: false,
     destinationsManaged: false,
     cloudPrintURL: 'cloudprint URL',
-    userAccounts: ['foo@chromium.org'],
+    previewIsFromArc: false,
+    uiLocale: 'en-us',
   };
 
   /**
    * Set the native layer initial settings and attach the print preview app to
    * the DOM.
-   * @return {!Promise} Returns a promise that resolves when the 'getPreview'
+   * @return Returns a promise that resolves when the 'getPreview'
    *     method is called by the preview area contained inside the app.
    */
-  const initialize = () => {
+  function initialize(): Promise<void> {
     nativeLayer.setInitialSettings(initialSettings);
     nativeLayer.setLocalDestinations(
         [{deviceName: initialSettings.printerName, printerName: 'FooName'}]);
     page = document.createElement('print-preview-app');
     document.body.appendChild(page);
     return nativeLayer.whenCalled('getPreview');
-  };
+  }
 
-  /** @override */
   setup(function() {
     // Stub out the native layer, the cloud print interface, and the plugin.
     document.body.innerHTML = '';
@@ -96,13 +95,17 @@
   test(
       assert(print_preview_app_test.TestNames.PrintToGoogleDrive), async () => {
         await initialize();
+        const sidebar =
+            page.shadowRoot!.querySelector('print-preview-sidebar')!;
+        const destinationSettings = sidebar.shadowRoot!.querySelector(
+            'print-preview-destination-settings')!;
         // Set up the UI to have a cloud printer.
-        page.destination_ =
+        destinationSettings.destination =
             getCloudDestination('FooCloud', 'FooName', 'foo@chromium.org');
-        page.destination_.capabilities = getCddTemplate(page.destination_.id);
+        destinationSettings.destination.capabilities =
+            getCddTemplate(destinationSettings.destination.id)!.capabilities;
 
         // Trigger print.
-        const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
         sidebar.dispatchEvent(new CustomEvent(
             'print-requested', {composed: true, bubbles: true}));
 
@@ -123,8 +126,8 @@
     const copies = 2;
     const duplex = DuplexMode.LONG_EDGE;
     webUIListenerCallback('print-preset-options', true, copies, duplex);
-    assertEquals(copies, page.getSettingValue('copies'));
-    assertTrue(page.getSettingValue('duplex'));
+    assertEquals(copies, page.getSettingValue('copies') as number);
+    assertTrue(page.getSettingValue('duplex') as boolean);
     assertFalse(page.getSetting('duplex').setFromUi);
     assertFalse(page.getSetting('copies').setFromUi);
   });
@@ -134,7 +137,8 @@
       async () => {
         initialSettings.destinationsManaged = true;
         await initialize();
-        const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
+        const sidebar =
+            page.shadowRoot!.querySelector('print-preview-sidebar')!;
         assertTrue(sidebar.controlsManaged);
       });
 
@@ -143,7 +147,8 @@
       async () => {
         initialSettings.policies = {headerFooter: {allowedMode: true}};
         await initialize();
-        const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
+        const sidebar =
+            page.shadowRoot!.querySelector('print-preview-sidebar')!;
         assertTrue(sidebar.controlsManaged);
       });
 
@@ -152,14 +157,15 @@
       async () => {
         initialSettings.policies = {cssBackground: {allowedMode: 1}};
         await initialize();
-        const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
+        const sidebar =
+            page.shadowRoot!.querySelector('print-preview-sidebar')!;
         assertTrue(sidebar.controlsManaged);
       });
 
   test(assert(print_preview_app_test.TestNames.SheetsManaged), async () => {
     initialSettings.policies = {sheets: {value: 2}};
     await initialize();
-    const sidebar = page.shadowRoot.querySelector('print-preview-sidebar');
+    const sidebar = page.shadowRoot!.querySelector('print-preview-sidebar')!;
     assertTrue(sidebar.controlsManaged);
   });
 });
diff --git a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.js b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts
similarity index 75%
rename from chrome/test/data/webui/print_preview/print_preview_sidebar_test.js
rename to chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts
index c51aabad..e07e4a1 100644
--- a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.js
+++ b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts
@@ -4,6 +4,7 @@
 
 import {CloudPrintInterfaceImpl, NativeLayerImpl, PrintPreviewModelElement, PrintPreviewSidebarElement} from 'chrome://print/print_preview.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
+import {assertEquals} from 'chrome://webui-test/chai_assert.js';
 import {fakeDataBind} from 'chrome://webui-test/test_util.js';
 
 import {CloudPrintInterfaceStub} from './cloud_print_interface_stub.js';
@@ -15,29 +16,26 @@
 import {getCddTemplate} from './print_preview_test_utils.js';
 
 
-window.print_preview_sidebar_test = {};
-print_preview_sidebar_test.suiteName = 'PrintPreviewSidebarTest';
-/** @enum {string} */
-print_preview_sidebar_test.TestNames = {
-  SettingsSectionsVisibilityChange: 'settings sections visibility change',
-  SheetCountWithDuplex: 'sheet count with duplex',
-  SheetCountWithCopies: 'sheet count with copies',
+const print_preview_sidebar_test = {
+  suiteName: 'PrintPreviewSidebarTest',
+  TestNames: {
+    SettingsSectionsVisibilityChange: 'settings sections visibility change',
+    SheetCountWithDuplex: 'sheet count with duplex',
+    SheetCountWithCopies: 'sheet count with copies',
+  },
 };
 
+Object.assign(window, {print_preview_sidebar_test: print_preview_sidebar_test});
+
 suite(print_preview_sidebar_test.suiteName, function() {
-  /** @type {?PrintPreviewSidebarElement} */
-  let sidebar = null;
+  let sidebar: PrintPreviewSidebarElement;
 
-  /** @type {?PrintPreviewModelElement} */
-  let model = null;
+  let model: PrintPreviewModelElement;
 
-  /** @type {?NativeLayer} */
-  let nativeLayer = null;
+  let nativeLayer: NativeLayerStub;
 
-  /** @type {CloudPrintInterfaceStub} */
-  let cloudPrintInterface = null;
+  let cloudPrintInterface: CloudPrintInterfaceStub;
 
-  /** @override */
   setup(function() {
     // Stub out the native layer and cloud print interface
     nativeLayer = new NativeLayerStub();
@@ -59,7 +57,7 @@
     sidebar.pageCount = 1;
     fakeDataBind(model, sidebar, 'settings');
     document.body.appendChild(sidebar);
-    sidebar.init(false, 'FooDevice', null);
+    sidebar.init(false, 'FooDevice', null, false, true);
 
     return nativeLayer.whenCalled('getPrinterCapabilities');
   });
@@ -69,14 +67,17 @@
                  .SettingsSectionsVisibilityChange),
       function() {
         const moreSettingsElement =
-            sidebar.shadowRoot.querySelector('print-preview-more-settings');
+            sidebar.shadowRoot!.querySelector('print-preview-more-settings')!;
         moreSettingsElement.$.label.click();
-        const camelToKebab = s => s.replace(/([A-Z])/g, '-$1').toLowerCase();
+        function camelToKebab(s: string): string {
+          return s.replace(/([A-Z])/g, '-$1').toLowerCase();
+        }
+
         ['copies', 'layout', 'color', 'mediaSize', 'margins', 'dpi', 'scaling',
          'duplex', 'otherOptions']
             .forEach(setting => {
-              const element = sidebar.shadowRoot.querySelector(
-                  `print-preview-${camelToKebab(setting)}-settings`);
+              const element = sidebar.shadowRoot!.querySelector<HTMLElement>(
+                  `print-preview-${camelToKebab(setting)}-settings`)!;
               // Show, hide and reset.
               [true, false, true].forEach(value => {
                 sidebar.set(`settings.${setting}.available`, value);
@@ -91,7 +92,8 @@
   test(
       assert(print_preview_sidebar_test.TestNames.SheetCountWithDuplex),
       function() {
-        const header = sidebar.shadowRoot.querySelector('print-preview-header');
+        const header =
+            sidebar.shadowRoot!.querySelector('print-preview-header')!;
         assertEquals(1, header.sheetCount);
         sidebar.setSetting('pages', [1, 2, 3]);
         assertEquals(3, header.sheetCount);
@@ -106,7 +108,8 @@
   test(
       assert(print_preview_sidebar_test.TestNames.SheetCountWithCopies),
       function() {
-        const header = sidebar.shadowRoot.querySelector('print-preview-header');
+        const header =
+            sidebar.shadowRoot!.querySelector('print-preview-header')!;
         assertEquals(1, header.sheetCount);
         sidebar.setSetting('copies', 4);
         assertEquals(4, header.sheetCount);