[GM3Restyling] Update coverage panel

Before: https://imgur.com/a/wjucuQY
After: https://imgur.com/a/6T8Aix0
Bug: 325443331
Change-Id: I6c3520910aed19b72093476cac744cf7ebe89a81
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6263085
Reviewed-by: Kateryna Prokopenko <kprokopenko@chromium.org>
Commit-Queue: Kim-Anh Tran <kimanh@chromium.org>
diff --git a/front_end/panels/coverage/CoverageView.test.ts b/front_end/panels/coverage/CoverageView.test.ts
index 225ab27..a275580 100644
--- a/front_end/panels/coverage/CoverageView.test.ts
+++ b/front_end/panels/coverage/CoverageView.test.ts
@@ -6,15 +6,17 @@
 import * as Protocol from '../../generated/protocol.js';
 import * as Bindings from '../../models/bindings/bindings.js';
 import * as Workspace from '../../models/workspace/workspace.js';
+import {dispatchClickEvent} from '../../testing/DOMHelpers.js';
 import {createTarget, registerNoopActions} from '../../testing/EnvironmentHelpers.js';
 import {describeWithMockConnection} from '../../testing/MockConnection.js';
 import {activate, getMainFrame, navigate} from '../../testing/ResourceTreeHelpers.js';
 import * as RenderCoordinator from '../../ui/components/render_coordinator/render_coordinator.js';
+import * as UI from '../../ui/legacy/legacy.js';
 
 import * as Coverage from './coverage.js';
 
 const isShowingLandingPage = (view: Coverage.CoverageView.CoverageView) => {
-  return Boolean(view.contentElement.querySelector('.landing-page'));
+  return Boolean(view.contentElement.querySelector('.empty-state'));
 };
 
 const isShowingResults = (view: Coverage.CoverageView.CoverageView) => {
@@ -91,6 +93,22 @@
     ]);
   });
 
+  it('dispatches a record/reload action when the button is clicked', () => {
+    const view = Coverage.CoverageView.CoverageView.instance();
+    assert.isTrue(isShowingLandingPage(view));
+
+    const button = view.contentElement.querySelector('.empty-state devtools-button');
+    assert.exists(button);
+
+    const toggleSpy =
+        sinon.spy(UI.ActionRegistry.ActionRegistry.instance().getAction('coverage.toggle-recording'), 'execute');
+    const reloadSpy =
+        sinon.spy(UI.ActionRegistry.ActionRegistry.instance().getAction('coverage.start-with-reload'), 'execute');
+
+    dispatchClickEvent(button);
+    assert.isTrue(toggleSpy.calledOnce || reloadSpy.calledOnce);
+  });
+
   it('can handle back/forward cache navigations', async () => {
     const {startSpy, stopSpy, target} = setupTargetAndModels();
     const view = Coverage.CoverageView.CoverageView.instance();
diff --git a/front_end/panels/coverage/CoverageView.ts b/front_end/panels/coverage/CoverageView.ts
index 310e9e8..0dcaa69 100644
--- a/front_end/panels/coverage/CoverageView.ts
+++ b/front_end/panels/coverage/CoverageView.ts
@@ -11,6 +11,7 @@
 import * as SDK from '../../core/sdk/sdk.js';
 import * as Bindings from '../../models/bindings/bindings.js';
 import * as Workspace from '../../models/workspace/workspace.js';
+import * as Buttons from '../../ui/components/buttons/buttons.js';
 import * as UI from '../../ui/legacy/legacy.js';
 import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
 
@@ -63,14 +64,27 @@
   contentScripts: 'Content scripts',
   /**
    *@description Message in Coverage View of the Coverage tab
-   *@example {record button icon} PH1
    */
-  clickTheReloadButtonSToReloadAnd: 'Click the reload button {PH1} to reload and start capturing coverage.',
+  noCoverageData: 'No coverage data',
   /**
    *@description Message in Coverage View of the Coverage tab
-   *@example {record button icon} PH1
    */
-  clickTheRecordButtonSToStart: 'Click the record button {PH1} to start capturing coverage.',
+  reloadPage: 'Reload page',
+  /**
+   *@description Message in Coverage View of the Coverage tab
+   */
+  startRecording: 'Start recording',
+
+  /**
+   *@description Message in Coverage View of the Coverage tab
+   *@example {Reload page} PH1
+   */
+  clickTheReloadButtonSToReloadAnd: 'Click the "{PH1}" button to reload and start capturing coverage.',
+  /**
+   *@description Message in Coverage View of the Coverage tab
+   *@example {Start recording} PH1
+   */
+  clickTheRecordButtonSToStart: 'Click the "{PH1}" button to start capturing coverage.',
   /**
    *@description Message in the Coverage View explaining that DevTools could not capture coverage.
    */
@@ -257,21 +271,24 @@
   }
 
   private buildLandingPage(): UI.Widget.VBox {
-    const widget = new UI.Widget.VBox();
-    let message;
+    const widget = new UI.EmptyWidget.EmptyWidget(i18nString(UIStrings.noCoverageData), '');
+    widget.appendLink('https://developer.chrome.com/docs/devtools/coverage' as Platform.DevToolsPath.UrlString);
     if (this.startWithReloadButton) {
-      this.inlineReloadButton =
-          UI.UIUtils.createInlineButton(UI.Toolbar.Toolbar.createActionButton('coverage.start-with-reload'));
-      message = i18n.i18n.getFormatLocalizedString(
-          str_, UIStrings.clickTheReloadButtonSToReloadAnd, {PH1: this.inlineReloadButton});
+      const action = UI.ActionRegistry.ActionRegistry.instance().getAction('coverage.start-with-reload');
+      if (action) {
+        widget.text = i18nString(UIStrings.clickTheReloadButtonSToReloadAnd, {PH1: i18nString(UIStrings.reloadPage)});
+        const button = UI.UIUtils.createTextButton(
+            i18nString(UIStrings.reloadPage), () => action.execute(),
+            {jslogContext: action.id(), variant: Buttons.Button.Variant.TONAL});
+        widget.contentElement.append(button);
+      }
     } else {
-      const recordButton =
-          UI.UIUtils.createInlineButton(UI.Toolbar.Toolbar.createActionButton(this.toggleRecordAction));
-      message = i18n.i18n.getFormatLocalizedString(str_, UIStrings.clickTheRecordButtonSToStart, {PH1: recordButton});
+      widget.text = i18nString(UIStrings.clickTheRecordButtonSToStart, {PH1: i18nString(UIStrings.startRecording)});
+      const button = UI.UIUtils.createTextButton(
+          i18nString(UIStrings.startRecording), () => this.toggleRecordAction.execute(),
+          {jslogContext: this.toggleRecordAction.id(), variant: Buttons.Button.Variant.TONAL});
+      widget.contentElement.append(button);
     }
-    message.classList.add('message');
-    widget.contentElement.appendChild(message);
-    widget.element.classList.add('landing-page');
     return widget;
   }
 
diff --git a/front_end/panels/coverage/coverageView.css b/front_end/panels/coverage/coverageView.css
index 1f52ae8..a76eb5c 100644
--- a/front_end/panels/coverage/coverageView.css
+++ b/front_end/panels/coverage/coverageView.css
@@ -41,7 +41,6 @@
   flex: auto;
 }
 
-.landing-page,
 .bfcache-page,
 .prerender-page {
   justify-content: center;
@@ -49,7 +48,6 @@
   padding: 20px;
 }
 
-.landing-page .message,
 .bfcache-page .message,
 .prerender-page .message {
   white-space: pre-line;
diff --git a/test/e2e/helpers/coverage-helpers.ts b/test/e2e/helpers/coverage-helpers.ts
index 338e292..2dcf324 100644
--- a/test/e2e/helpers/coverage-helpers.ts
+++ b/test/e2e/helpers/coverage-helpers.ts
@@ -13,7 +13,7 @@
   // Open panel and wait for content
   await openPanelViaMoreTools('Coverage');
   await waitFor('div[aria-label="Coverage panel"]');
-  await waitFor('.coverage-results .landing-page');
+  await waitFor('.coverage-results .empty-state');
 }
 
 export async function navigateToCoverageTestSite() {
@@ -22,7 +22,7 @@
 
 export async function startInstrumentingCoverage() {
   await click(START_INSTRUMENTING_BUTTON);
-  await waitForNone('.coverage-results .landing-page');
+  await waitForNone('.coverage-results .empty-state');
 }
 
 export async function stopInstrumentingCoverage() {
@@ -32,12 +32,7 @@
 
 export async function clearCoverageContent() {
   await click('devtools-button[aria-label="Clear coverage"]');
-  await waitFor('.coverage-results .landing-page');
-}
-
-export async function getMessageContents() {
-  const messageElement = await waitFor('.coverage-results .landing-page .message');
-  return messageElement.evaluate(node => (node as HTMLElement).innerText);
+  await waitFor('.coverage-results .empty-state');
 }
 
 export async function getCoverageData(expectedCount: number) {