[e2e] Migrate the shortcut settings test

Migrates the test and helpers to the new test runner.

Fixed: 416404619
Change-Id: I9803586659e6ec7ffe143f5b0648a671e63149d6
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6732391
Auto-Submit: Nikolay Vitkov <[email protected]>
Reviewed-by: Alex Rudenko <[email protected]>
Commit-Queue: Alex Rudenko <[email protected]>
diff --git a/test/e2e/BUILD.gn b/test/e2e/BUILD.gn
index a53522d..c8ceed5 100644
--- a/test/e2e/BUILD.gn
+++ b/test/e2e/BUILD.gn
@@ -29,7 +29,6 @@
     "panels",
     "performance",
     "security",
-    "settings",
     "sources",
   ]
   sources = [ "mocharc.ts" ]
diff --git a/test/e2e/helpers/quick_open-helpers.ts b/test/e2e/helpers/quick_open-helpers.ts
index acf3cd5..bcd2272 100644
--- a/test/e2e/helpers/quick_open-helpers.ts
+++ b/test/e2e/helpers/quick_open-helpers.ts
@@ -2,12 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {
-  drainFrontendTaskQueue,
-  getBrowserAndPages,
-  platform,
-  waitFor
-} from '../../shared/helper.js';
+import {platform} from '../../shared/helper.js';
 import {getBrowserAndPagesWrappers} from '../../shared/non_hosted_wrappers.js';
 
 import {SourceFileEvents, waitForSourceFiles} from './sources-helpers.js';
@@ -82,13 +77,13 @@
   );
 };
 
-export async function runCommandWithQuickOpen(command: string): Promise<void> {
-  const {frontend} = getBrowserAndPages();
-  await openCommandMenu();
-  await frontend.keyboard.type(command);
+export async function runCommandWithQuickOpen(
+    command: string, devtoolsPage = getBrowserAndPagesWrappers().devToolsPage): Promise<void> {
+  await openCommandMenu(devtoolsPage);
+  await devtoolsPage.page.keyboard.type(command);
   // TODO: it should actually wait for rendering to finish.
-  await drainFrontendTaskQueue();
-  await frontend.keyboard.press('Enter');
+  await devtoolsPage.drainTaskQueue();
+  await devtoolsPage.page.keyboard.press('Enter');
 }
 
 export const openGoToLineQuickOpen = async (devtoolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
@@ -141,9 +136,9 @@
   await devToolsPage.click('[aria-label="Close drawer"]');
 };
 
-export const getSelectedItemText = async () => {
-  const quickOpenElement = await waitFor(QUICK_OPEN_SELECTOR);
-  const selectedRow = await waitFor(QUICK_OPEN_SELECTED_ITEM_SELECTOR, quickOpenElement);
+export const getSelectedItemText = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const quickOpenElement = await devToolsPage.waitFor(QUICK_OPEN_SELECTOR);
+  const selectedRow = await devToolsPage.waitFor(QUICK_OPEN_SELECTED_ITEM_SELECTOR, quickOpenElement);
   const textContent = await selectedRow.getProperty('textContent');
   if (!textContent) {
     assert.fail('Quick open: could not get selected item textContent');
diff --git a/test/e2e/helpers/settings-shortcuts-helpers.ts b/test/e2e/helpers/settings-shortcuts-helpers.ts
index 196bc40..8836017 100644
--- a/test/e2e/helpers/settings-shortcuts-helpers.ts
+++ b/test/e2e/helpers/settings-shortcuts-helpers.ts
@@ -5,17 +5,10 @@
 import type {ElementHandle} from 'puppeteer-core';
 
 import {
-  $$,
-  $$textContent,
-  click,
-  clickElement,
   platform,
   selectOption,
-  waitFor,
-  waitForElementsWithTextContent,
-  waitForElementWithTextContent,
-  waitForFunction,
 } from '../../shared/helper.js';
+import {getBrowserAndPagesWrappers} from '../../shared/non_hosted_wrappers.js';
 
 const CANCEL_BUTTON_SELECTOR = '[aria-label="Discard changes"]';
 const CONFIRM_BUTTON_SELECTOR = '[aria-label="Confirm changes"]';
@@ -59,13 +52,15 @@
   CONTROL_ALT_C_SHORTCUT_INPUT_TEXT = ['Ctrl ⌥ C'];
 }
 
-export const selectKeyboardShortcutPreset = async (option: string) => {
-  const presetSelectElement = await waitForElementWithTextContent(SHORTCUT_SELECT_TEXT);
+export const selectKeyboardShortcutPreset =
+    async (option: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const presetSelectElement = await devToolsPage.waitForElementWithTextContent(SHORTCUT_SELECT_TEXT);
   await selectOption(await presetSelectElement.toElement('select'), option);
 };
 
-export const getShortcutListItemElement = async (shortcutText: string) => {
-  const textMatches = await $$textContent(shortcutText);
+export const getShortcutListItemElement =
+    async (shortcutText: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const textMatches = await devToolsPage.$$textContent(shortcutText);
   let titleElement;
   for (const matchingElement of textMatches) {
     // some actions have the same name as categories, so we have to make sure we've got the right one
@@ -78,20 +73,22 @@
     assert.fail('shortcut element not found');
   }
   const listItemElement = await titleElement.getProperty('parentElement');
-  return (listItemElement as ElementHandle).asElement();
+  return listItemElement.asElement();
 };
 
-export const editShortcutListItem = async (shortcutText: string) => {
-  const listItemElement = await getShortcutListItemElement(shortcutText) as ElementHandle;
+export const editShortcutListItem =
+    async (shortcutText: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const listItemElement = await getShortcutListItemElement(shortcutText, devToolsPage) as ElementHandle;
 
-  await clickElement(listItemElement);
-  await click(EDIT_BUTTON_SELECTOR, {root: listItemElement});
+  await devToolsPage.clickElement(listItemElement);
+  await devToolsPage.click(EDIT_BUTTON_SELECTOR, {root: listItemElement});
 
-  await waitFor(RESET_BUTTON_SELECTOR);
+  await devToolsPage.waitFor(RESET_BUTTON_SELECTOR);
 };
 
-export const shortcutsForAction = async (shortcutText: string) => {
-  const listItemElement = await getShortcutListItemElement(shortcutText);
+export const shortcutsForAction =
+    async (shortcutText: string, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const listItemElement = await getShortcutListItemElement(shortcutText, devToolsPage);
   if (!listItemElement) {
     assert.fail(`Could not find shortcut item with text ${shortcutText}`);
   }
@@ -102,8 +99,8 @@
       shortcutElementsTextContent.map(async textContent => textContent ? await textContent.jsonValue() : []));
 };
 
-export const shortcutInputValues = async () => {
-  const shortcutInputs = await $$(SHORTCUT_INPUT_SELECTOR);
+export const shortcutInputValues = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const shortcutInputs = await devToolsPage.$$(SHORTCUT_INPUT_SELECTOR);
   if (!shortcutInputs.length) {
     assert.fail('shortcut input not found');
   }
@@ -111,8 +108,8 @@
   return await Promise.all(shortcutValues.map(async value => value ? await value.jsonValue() : []));
 };
 
-export const clickAddShortcutLink = async () => {
-  const addShortcutLinkTextMatches = await waitForElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+export const clickAddShortcutLink = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const addShortcutLinkTextMatches = await devToolsPage.waitForElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
   let addShortcutLinkElement;
   // the link container and the link have the same textContent, but only the latter has a click handler
   for (const matchingElement of addShortcutLinkTextMatches) {
@@ -125,32 +122,33 @@
     assert.fail('could not find add shortcut link');
   }
 
-  await clickElement(addShortcutLinkElement);
+  await devToolsPage.clickElement(addShortcutLinkElement);
 };
 
-export const clickShortcutConfirmButton = async () => {
-  await click(CONFIRM_BUTTON_SELECTOR);
+export const clickShortcutConfirmButton = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  await devToolsPage.click(CONFIRM_BUTTON_SELECTOR);
 };
 
-export const clickShortcutCancelButton = async () => {
-  await click(CANCEL_BUTTON_SELECTOR);
+export const clickShortcutCancelButton = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  await devToolsPage.click(CANCEL_BUTTON_SELECTOR);
 };
 
-export const clickShortcutResetButton = async () => {
-  await click(RESET_BUTTON_SELECTOR);
+export const clickShortcutResetButton = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  await devToolsPage.click(RESET_BUTTON_SELECTOR);
 };
 
-export const clickShortcutDeleteButton = async (index: number) => {
-  const deleteButtons = await $$(DELETE_BUTTON_SELECTOR);
+export const clickShortcutDeleteButton =
+    async (index: number, devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  const deleteButtons = await devToolsPage.$$(DELETE_BUTTON_SELECTOR);
   if (deleteButtons.length <= index) {
     assert.fail(`shortcut delete button #${index} not found`);
   }
-  await clickElement(deleteButtons[index]);
+  await devToolsPage.clickElement(deleteButtons[index]);
 };
 
-export const waitForEmptyShortcutInput = async () => {
-  await waitForFunction(async () => {
-    const shortcutInputs = await $$(SHORTCUT_INPUT_SELECTOR);
+export const waitForEmptyShortcutInput = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
+  await devToolsPage.waitForFunction(async () => {
+    const shortcutInputs = await devToolsPage.$$(SHORTCUT_INPUT_SELECTOR);
     const shortcutInputValues = await Promise.all(shortcutInputs.map(input => input.getProperty('value')));
     const shortcutInputValueStrings =
         await Promise.all(shortcutInputValues.map(value => value ? value.jsonValue() : {}));
@@ -158,7 +156,7 @@
   });
 };
 
-export const waitForVSCodeShortcutPreset = async () => {
+export const waitForVSCodeShortcutPreset = async (devToolsPage = getBrowserAndPagesWrappers().devToolsPage) => {
   // wait for a shortcut that vsCode has but the default preset does not
-  await waitForElementWithTextContent(VS_CODE_SHORTCUTS_SHORTCUTS.join(''));
+  await devToolsPage.waitForElementWithTextContent(VS_CODE_SHORTCUTS_SHORTCUTS.join(''));
 };
diff --git a/test/e2e/lighthouse/navigation_test.ts b/test/e2e/lighthouse/navigation_test.ts
index 7872fc7..b41c93e 100644
--- a/test/e2e/lighthouse/navigation_test.ts
+++ b/test/e2e/lighthouse/navigation_test.ts
@@ -171,7 +171,7 @@
     const waitForHtml = await interceptNextFileSave();
 
     // For some reason the CDP click command doesn't work here even if the tools menu is open.
-    await reportEl.$eval('a[data-action="save-html"]:not(.hidden)', saveHtmlEl => (saveHtmlEl as HTMLElement).click());
+    await reportEl.$eval('a[data-action="save-html"]:not(.hidden)', saveHtmlEl => saveHtmlEl.click());
 
     const htmlContent = await waitForHtml();
     const iframeHandle = await renderHtmlInIframe(htmlContent);
diff --git a/test/e2e/settings/shortcut_settings_test.ts b/test/e2e/settings/shortcut_settings_test.ts
deleted file mode 100644
index 0f81db6..0000000
--- a/test/e2e/settings/shortcut_settings_test.ts
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright 2020 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.
-
-import {assert} from 'chai';
-
-import {
-  drainFrontendTaskQueue,
-  getBrowserAndPages,
-  timeout,
-  waitFor,
-  waitForFunction,
-  waitForNoElementsWithTextContent,
-} from '../../shared/helper.js';
-import {getSelectedItemText, QUICK_OPEN_SELECTOR} from '../helpers/quick_open-helpers.js';
-import {openSettingsTab} from '../helpers/settings-helpers.js';
-import {
-  ADD_SHORTCUT_LINK_TEXT,
-  clickAddShortcutLink,
-  clickShortcutCancelButton,
-  clickShortcutConfirmButton,
-  clickShortcutDeleteButton,
-  clickShortcutResetButton,
-  CONSOLE_SHORTCUT_DISPLAY_TEXT,
-  CONSOLE_SHORTCUT_INPUT_TEXT,
-  CONTROL_1_CONTROL_2_CHORD_DISPLAY_TEXT,
-  CONTROL_1_CONTROL_2_CHORD_INPUT_TEXT,
-  CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT,
-  CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT,
-  CONTROL_2_SHORTCUT_DISPLAY_TEXT,
-  CONTROL_2_SHORTCUT_INPUT_TEXT,
-  CONTROL_ALT_C_SHORTCUT_INPUT_TEXT,
-  editShortcutListItem,
-  selectKeyboardShortcutPreset,
-  SHORTCUT_CHORD_TIMEOUT,
-  shortcutInputValues,
-  shortcutsForAction,
-  VS_CODE_PAUSE_SHORTCUTS,
-  VS_CODE_SETTINGS_SHORTCUTS,
-  VS_CODE_SHORTCUTS_QUICK_OPEN_TEXT,
-  VS_CODE_SHORTCUTS_SHORTCUTS,
-  waitForEmptyShortcutInput,
-  waitForVSCodeShortcutPreset,
-} from '../helpers/settings-shortcuts-helpers.js';
-
-describe('Shortcuts Settings tab', () => {
-  it('should update when the shortcuts preset is changed ', async () => {
-    await openSettingsTab('Shortcuts');
-    await selectKeyboardShortcutPreset('vsCode');
-
-    await waitForVSCodeShortcutPreset();
-
-    const shortcutsShortcuts = await shortcutsForAction('Show Shortcuts');
-    const settingsShortcuts = await shortcutsForAction('Settings');
-    const pauseShortcuts = await shortcutsForAction('Pause script execution');
-    assert.deepEqual(shortcutsShortcuts, VS_CODE_SHORTCUTS_SHORTCUTS);
-    assert.deepEqual(settingsShortcuts, VS_CODE_SETTINGS_SHORTCUTS);
-    assert.deepEqual(pauseShortcuts, VS_CODE_PAUSE_SHORTCUTS);
-  });
-
-  it('should apply new shortcuts when the preset is changed', async () => {
-    const {frontend} = getBrowserAndPages();
-    await openSettingsTab('Shortcuts');
-    await selectKeyboardShortcutPreset('vsCode');
-
-    await waitForVSCodeShortcutPreset();
-
-    // close the settings dialog
-    await frontend.keyboard.press('Escape');
-
-    // use a newly-enabled shortcut to open the command menu
-    await frontend.keyboard.press('F1');
-    await waitFor(QUICK_OPEN_SELECTOR);
-
-    // make sure the command menu reflects the new shortcuts
-    await frontend.keyboard.type('Show Shortcuts');
-    await drainFrontendTaskQueue();
-    const shortcutsItemText = await getSelectedItemText();
-
-    assert.strictEqual(shortcutsItemText, VS_CODE_SHORTCUTS_QUICK_OPEN_TEXT);
-  });
-
-  it('should allow users to open the shortcut editor and view the current shortcut', async () => {
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONSOLE_SHORTCUT_INPUT_TEXT);
-  });
-
-  it('should allow users to open the shortcut editor and change and add shortcuts', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-
-    await clickAddShortcutLink();
-    await waitForEmptyShortcutInput();
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Toggle Console');
-    assert.deepEqual(shortcuts, CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT);
-  });
-
-  it('should allow users to open shortcut editor and change and reset shortcuts', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    const defaultShortcuts = await shortcutsForAction('Start recording events');
-
-    await editShortcutListItem('Start recording events');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-
-    await clickAddShortcutLink();
-    await waitForEmptyShortcutInput();
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const modifiedShortcuts = await shortcutsForAction('Start recording events');
-    assert.deepEqual(modifiedShortcuts, CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT);
-
-    await editShortcutListItem('Start recording events');
-    await clickShortcutResetButton();
-
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Start recording events');
-    assert.deepEqual(shortcuts, defaultShortcuts, 'Default shortcuts weren\'t restored correctly');
-  });
-
-  it('should allow users to open the shortcut editor and delete and reset shortcuts', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-
-    await clickAddShortcutLink();
-    await waitForEmptyShortcutInput();
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
-
-    await clickShortcutDeleteButton(0);
-    let shortcutInputTextAfterDeletion;
-    await waitForFunction(async () => {
-      shortcutInputTextAfterDeletion = await shortcutInputValues();
-      return shortcutInputTextAfterDeletion.length === 1;
-    });
-    assert.deepEqual(shortcutInputTextAfterDeletion, CONTROL_2_SHORTCUT_INPUT_TEXT);
-
-    await clickShortcutResetButton();
-    const shortcutInputTextAfterReset = await shortcutInputValues();
-    assert.deepEqual(shortcutInputTextAfterReset, CONSOLE_SHORTCUT_INPUT_TEXT);
-
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Toggle Console');
-    assert.deepEqual(shortcuts, CONSOLE_SHORTCUT_DISPLAY_TEXT);
-  });
-
-  it('should allow users to cancel an edit and discard their changes to shortcuts', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-
-    await clickAddShortcutLink();
-    await waitForEmptyShortcutInput();
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
-    await clickShortcutCancelButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Toggle Console');
-    assert.deepEqual(shortcuts, CONSOLE_SHORTCUT_DISPLAY_TEXT);
-  });
-
-  it('should allow users to set a multi-keypress shortcut (chord)', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_CHORD_INPUT_TEXT);
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Toggle Console');
-    assert.deepEqual(shortcuts, CONTROL_1_CONTROL_2_CHORD_DISPLAY_TEXT);
-  });
-
-  it('should display the physical key that is pressed rather than special characters', async () => {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.down('Alt');
-    await frontend.keyboard.press('c');
-    await frontend.keyboard.up('Alt');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_ALT_C_SHORTCUT_INPUT_TEXT);
-  });
-
-  it('should allow users to set a new shortcut after the chord timeout', async function() {
-    const {frontend} = getBrowserAndPages();
-
-    await openSettingsTab('Shortcuts');
-    await editShortcutListItem('Toggle Console');
-
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('1');
-    await frontend.keyboard.up('Control');
-    await timeout(SHORTCUT_CHORD_TIMEOUT * 1.2);
-    await frontend.keyboard.down('Control');
-    await frontend.keyboard.press('2');
-    await frontend.keyboard.up('Control');
-
-    const shortcutInputsText = await shortcutInputValues();
-    assert.deepEqual(shortcutInputsText, CONTROL_2_SHORTCUT_INPUT_TEXT);
-    await clickShortcutConfirmButton();
-    await waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
-
-    const shortcuts = await shortcutsForAction('Toggle Console');
-    assert.deepEqual(shortcuts, CONTROL_2_SHORTCUT_DISPLAY_TEXT);
-  });
-});
diff --git a/test/e2e_non_hosted/BUILD.gn b/test/e2e_non_hosted/BUILD.gn
index 3725bf0..97ff69c 100644
--- a/test/e2e_non_hosted/BUILD.gn
+++ b/test/e2e_non_hosted/BUILD.gn
@@ -39,6 +39,7 @@
     "search",
     "security",
     "sensors",
+    "settings",
     "snippets",
     "sources",
     "targets",
diff --git a/test/e2e/settings/BUILD.gn b/test/e2e_non_hosted/settings/BUILD.gn
similarity index 84%
rename from test/e2e/settings/BUILD.gn
rename to test/e2e_non_hosted/settings/BUILD.gn
index e71eafb..aa2a8b9 100644
--- a/test/e2e/settings/BUILD.gn
+++ b/test/e2e_non_hosted/settings/BUILD.gn
@@ -4,11 +4,11 @@
 
 import("../../../scripts/build/typescript/typescript.gni")
 
-node_ts_library("settings") {
+ts_e2e_library("settings") {
   sources = [ "shortcut_settings_test.ts" ]
 
   deps = [
+    "../../e2e/helpers",
     "../../shared",
-    "../helpers",
   ]
 }
diff --git a/test/e2e_non_hosted/settings/shortcut_settings_test.ts b/test/e2e_non_hosted/settings/shortcut_settings_test.ts
new file mode 100644
index 0000000..df0f345
--- /dev/null
+++ b/test/e2e_non_hosted/settings/shortcut_settings_test.ts
@@ -0,0 +1,250 @@
+// Copyright 2020 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.
+
+import {assert} from 'chai';
+
+import {getSelectedItemText, QUICK_OPEN_SELECTOR} from '../../e2e/helpers/quick_open-helpers.js';
+import {openSettingsTab} from '../../e2e/helpers/settings-helpers.js';
+import {
+  ADD_SHORTCUT_LINK_TEXT,
+  clickAddShortcutLink,
+  clickShortcutCancelButton,
+  clickShortcutConfirmButton,
+  clickShortcutDeleteButton,
+  clickShortcutResetButton,
+  CONSOLE_SHORTCUT_DISPLAY_TEXT,
+  CONSOLE_SHORTCUT_INPUT_TEXT,
+  CONTROL_1_CONTROL_2_CHORD_DISPLAY_TEXT,
+  CONTROL_1_CONTROL_2_CHORD_INPUT_TEXT,
+  CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT,
+  CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT,
+  CONTROL_2_SHORTCUT_DISPLAY_TEXT,
+  CONTROL_2_SHORTCUT_INPUT_TEXT,
+  CONTROL_ALT_C_SHORTCUT_INPUT_TEXT,
+  editShortcutListItem,
+  selectKeyboardShortcutPreset,
+  SHORTCUT_CHORD_TIMEOUT,
+  shortcutInputValues,
+  shortcutsForAction,
+  VS_CODE_PAUSE_SHORTCUTS,
+  VS_CODE_SETTINGS_SHORTCUTS,
+  VS_CODE_SHORTCUTS_QUICK_OPEN_TEXT,
+  VS_CODE_SHORTCUTS_SHORTCUTS,
+  waitForEmptyShortcutInput,
+  waitForVSCodeShortcutPreset,
+} from '../../e2e/helpers/settings-shortcuts-helpers.js';
+
+describe('Shortcuts Settings tab', () => {
+  it('should update when the shortcuts preset is changed ', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await selectKeyboardShortcutPreset('vsCode', devToolsPage);
+
+    await waitForVSCodeShortcutPreset(devToolsPage);
+
+    const shortcutsShortcuts = await shortcutsForAction('Show Shortcuts', devToolsPage);
+    const settingsShortcuts = await shortcutsForAction('Settings', devToolsPage);
+    const pauseShortcuts = await shortcutsForAction('Pause script execution', devToolsPage);
+    assert.deepEqual(shortcutsShortcuts, VS_CODE_SHORTCUTS_SHORTCUTS);
+    assert.deepEqual(settingsShortcuts, VS_CODE_SETTINGS_SHORTCUTS);
+    assert.deepEqual(pauseShortcuts, VS_CODE_PAUSE_SHORTCUTS);
+  });
+
+  it('should apply new shortcuts when the preset is changed', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await selectKeyboardShortcutPreset('vsCode', devToolsPage);
+
+    await waitForVSCodeShortcutPreset(devToolsPage);
+
+    // close the settings dialog
+    await devToolsPage.page.keyboard.press('Escape');
+
+    // use a newly-enabled shortcut to open the command menu
+    await devToolsPage.page.keyboard.press('F1');
+    await devToolsPage.waitFor(QUICK_OPEN_SELECTOR);
+
+    // make sure the command menu reflects the new shortcuts
+    await devToolsPage.page.keyboard.type('Show Shortcuts');
+    await devToolsPage.drainTaskQueue();
+    const shortcutsItemText = await getSelectedItemText(devToolsPage);
+
+    assert.strictEqual(shortcutsItemText, VS_CODE_SHORTCUTS_QUICK_OPEN_TEXT);
+  });
+
+  it('should allow users to open the shortcut editor and view the current shortcut', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONSOLE_SHORTCUT_INPUT_TEXT);
+  });
+
+  it('should allow users to open the shortcut editor and change and add shortcuts', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+
+    await clickAddShortcutLink(devToolsPage);
+    await waitForEmptyShortcutInput(devToolsPage);
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Toggle Console', devToolsPage);
+    assert.deepEqual(shortcuts, CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT);
+  });
+
+  it('should allow users to open shortcut editor and change and reset shortcuts', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    const defaultShortcuts = await shortcutsForAction('Start recording events', devToolsPage);
+
+    await editShortcutListItem('Start recording events', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+
+    await clickAddShortcutLink(devToolsPage);
+    await waitForEmptyShortcutInput(devToolsPage);
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const modifiedShortcuts = await shortcutsForAction('Start recording events', devToolsPage);
+    assert.deepEqual(modifiedShortcuts, CONTROL_1_CONTROL_2_SHORTCUT_DISPLAY_TEXT);
+
+    await editShortcutListItem('Start recording events', devToolsPage);
+    await clickShortcutResetButton(devToolsPage);
+
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Start recording events', devToolsPage);
+    assert.deepEqual(shortcuts, defaultShortcuts, 'Default shortcuts weren\'t restored correctly');
+  });
+
+  it('should allow users to open the shortcut editor and delete and reset shortcuts', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+
+    await clickAddShortcutLink(devToolsPage);
+    await waitForEmptyShortcutInput(devToolsPage);
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
+
+    await clickShortcutDeleteButton(0, devToolsPage);
+    let shortcutInputTextAfterDeletion;
+    await devToolsPage.waitForFunction(async () => {
+      shortcutInputTextAfterDeletion = await shortcutInputValues(devToolsPage);
+      return shortcutInputTextAfterDeletion.length === 1;
+    });
+    assert.deepEqual(shortcutInputTextAfterDeletion, CONTROL_2_SHORTCUT_INPUT_TEXT);
+
+    await clickShortcutResetButton(devToolsPage);
+    const shortcutInputTextAfterReset = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputTextAfterReset, CONSOLE_SHORTCUT_INPUT_TEXT);
+
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Toggle Console', devToolsPage);
+    assert.deepEqual(shortcuts, CONSOLE_SHORTCUT_DISPLAY_TEXT);
+  });
+
+  it('should allow users to cancel an edit and discard their changes to shortcuts', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+
+    await clickAddShortcutLink(devToolsPage);
+    await waitForEmptyShortcutInput(devToolsPage);
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_SHORTCUT_INPUTS_TEXT);
+    await clickShortcutCancelButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Toggle Console', devToolsPage);
+    assert.deepEqual(shortcuts, CONSOLE_SHORTCUT_DISPLAY_TEXT);
+  });
+
+  it('should allow users to set a multi-keypress shortcut (chord)', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_1_CONTROL_2_CHORD_INPUT_TEXT);
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Toggle Console', devToolsPage);
+    assert.deepEqual(shortcuts, CONTROL_1_CONTROL_2_CHORD_DISPLAY_TEXT);
+  });
+
+  it('should display the physical key that is pressed rather than special characters', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.down('Alt');
+    await devToolsPage.page.keyboard.press('c');
+    await devToolsPage.page.keyboard.up('Alt');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_ALT_C_SHORTCUT_INPUT_TEXT);
+  });
+
+  it('should allow users to set a new shortcut after the chord timeout', async ({devToolsPage}) => {
+    await openSettingsTab('Shortcuts', devToolsPage);
+    await editShortcutListItem('Toggle Console', devToolsPage);
+
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('1');
+    await devToolsPage.page.keyboard.up('Control');
+    await devToolsPage.timeout(SHORTCUT_CHORD_TIMEOUT * 1.2);
+    await devToolsPage.page.keyboard.down('Control');
+    await devToolsPage.page.keyboard.press('2');
+    await devToolsPage.page.keyboard.up('Control');
+
+    const shortcutInputsText = await shortcutInputValues(devToolsPage);
+    assert.deepEqual(shortcutInputsText, CONTROL_2_SHORTCUT_INPUT_TEXT);
+    await clickShortcutConfirmButton(devToolsPage);
+    await devToolsPage.waitForNoElementsWithTextContent(ADD_SHORTCUT_LINK_TEXT);
+
+    const shortcuts = await shortcutsForAction('Toggle Console', devToolsPage);
+    assert.deepEqual(shortcuts, CONTROL_2_SHORTCUT_DISPLAY_TEXT);
+  });
+});