blob: f26f26e42b99ed5e4d7584370479843b5d6356cf [file] [log] [blame]
Patrick Hulcea087f622018-05-18 00:37:53 +00001// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * @unrestricted
7 */
cjamcl@google.comaa1532c2019-05-31 03:01:24 +00008Audits.StartView = class extends UI.Widget {
Patrick Hulcea087f622018-05-18 00:37:53 +00009 /**
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000010 * @param {!Audits.AuditController} controller
Patrick Hulcea087f622018-05-18 00:37:53 +000011 */
12 constructor(controller) {
13 super();
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000014 this.registerRequiredCSS('audits/auditsStartView.css');
Patrick Hulcea087f622018-05-18 00:37:53 +000015 this._controller = controller;
16 this._render();
17 }
18
19 /**
20 * @param {string} settingName
John Emau73477162019-07-17 00:30:51 +000021 * @param {string} label
Patrick Hulcea087f622018-05-18 00:37:53 +000022 * @param {!Element} parentElement
23 */
John Emau73477162019-07-17 00:30:51 +000024 _populateRuntimeSettingAsRadio(settingName, label, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000025 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000026 if (!runtimeSetting || !runtimeSetting.options) {
Patrick Hulce05c18ce2018-05-24 00:34:56 +000027 throw new Error(`${settingName} is not a setting with options`);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000028 }
Patrick Hulce05c18ce2018-05-24 00:34:56 +000029
John Emau84ddefb2019-07-16 19:25:56 +000030 const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting, runtimeSetting.description);
Patrick Hulcea087f622018-05-18 00:37:53 +000031 parentElement.appendChild(control.element);
John Emau73477162019-07-17 00:30:51 +000032 UI.ARIAUtils.setAccessibleName(control.element, label);
Patrick Hulcea087f622018-05-18 00:37:53 +000033 }
34
35 /**
Patrick Hulce05c18ce2018-05-24 00:34:56 +000036 * @param {string} settingName
37 * @param {!Element} parentElement
38 */
39 _populateRuntimeSettingAsCheckbox(settingName, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000040 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000041 if (!runtimeSetting || !runtimeSetting.title) {
Patrick Hulce05c18ce2018-05-24 00:34:56 +000042 throw new Error(`${settingName} is not a setting with a title`);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000043 }
Patrick Hulce05c18ce2018-05-24 00:34:56 +000044
45 runtimeSetting.setting.setTitle(runtimeSetting.title);
46 const control = new UI.ToolbarSettingCheckbox(runtimeSetting.setting, runtimeSetting.description);
47 parentElement.appendChild(control.element);
48 }
49
50 /**
Patrick Hulcea087f622018-05-18 00:37:53 +000051 * @param {!UI.Fragment} fragment
52 */
53 _populateFormControls(fragment) {
54 // Populate the device type
55 const deviceTypeFormElements = fragment.$('device-type-form-elements');
John Emau73477162019-07-17 00:30:51 +000056 this._populateRuntimeSettingAsRadio('audits.device_type', ls`Device`, deviceTypeFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000057
58 // Populate the audit categories
59 const categoryFormElements = fragment.$('categories-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000060 for (const preset of Audits.Presets) {
Patrick Hulcea087f622018-05-18 00:37:53 +000061 preset.setting.setTitle(preset.title);
62 const checkbox = new UI.ToolbarSettingCheckbox(preset.setting);
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000063 const row = categoryFormElements.createChild('div', 'vbox audits-launcher-row');
Patrick Hulce05c18ce2018-05-24 00:34:56 +000064 row.title = preset.description;
Patrick Hulcea087f622018-05-18 00:37:53 +000065 row.appendChild(checkbox.element);
Patrick Hulcea087f622018-05-18 00:37:53 +000066 }
John Emau62fdcee2019-10-16 00:08:52 +000067 UI.ARIAUtils.markAsGroup(categoryFormElements);
68 UI.ARIAUtils.setAccessibleName(categoryFormElements, ls`Audits`);
Patrick Hulcea087f622018-05-18 00:37:53 +000069
70 // Populate the throttling
71 const throttlingFormElements = fragment.$('throttling-form-elements');
John Emau73477162019-07-17 00:30:51 +000072 this._populateRuntimeSettingAsRadio('audits.throttling', ls`Throttling`, throttlingFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000073
74
75 // Populate other settings
76 const otherFormElements = fragment.$('other-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000077 this._populateRuntimeSettingAsCheckbox('audits.clear_storage', otherFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000078 }
79
80 _render() {
81 this._startButton = UI.createTextButton(
vidorteg6afbe792019-09-04 19:00:37 +000082 ls`Run audits`, () => this._controller.dispatchEventToListeners(Audits.Events.RequestAuditStart), '',
83 true /* primary */);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000084 this.setDefaultFocusedElement(this._startButton);
85
Patrick Hulcea087f622018-05-18 00:37:53 +000086 const deviceIcon = UI.Icon.create('largeicon-phone');
87 const categoriesIcon = UI.Icon.create('largeicon-checkmark');
88 const throttlingIcon = UI.Icon.create('largeicon-settings-gear');
Christy Chen1eea03c2019-06-26 19:31:24 +000089 const auditsDescription = ls
90 `Identify and fix common problems that affect your site's performance, accessibility, and user experience.`; // crbug.com/972969
Patrick Hulcea087f622018-05-18 00:37:53 +000091
92 const fragment = UI.Fragment.build`
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000093 <div class="vbox audits-start-view">
Patrick Hulcea087f622018-05-18 00:37:53 +000094 <header>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000095 <div class="audits-logo"></div>
96 <div class="audits-start-view-text">
John Emau0c453872019-07-17 06:33:22 +000097 <h1>${ls`Audits`}</h1>
Christy Chen1eea03c2019-06-26 19:31:24 +000098 <p>
99 <span class="text">${auditsDescription}</span>
John Emau97832ab2019-07-16 00:37:34 +0000100 ${UI.XLink.create('https://developers.google.com/web/tools/lighthouse/', ls`Learn more`)}
Christy Chen1eea03c2019-06-26 19:31:24 +0000101 </p>
Patrick Hulcea087f622018-05-18 00:37:53 +0000102 </div>
103 </header>
104 <form>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000105 <div class="audits-form-section">
106 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000107 <i>${deviceIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000108 <div class="audits-icon-label">${ls`Device`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000109 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000110 <div class="audits-form-elements" $="device-type-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000111 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000112 <div class="audits-form-section">
113 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000114 <i>${categoriesIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000115 <div class="audits-icon-label">${ls`Audits`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000116 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000117 <div class="audits-form-elements" $="categories-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000118 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000119 <div class="audits-form-section">
120 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000121 <i>${throttlingIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000122 <div class="audits-icon-label">${ls`Throttling`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000123 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000124 <div class="audits-form-elements" $="throttling-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000125 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000126 <div class="audits-form-section">
127 <div class="audits-form-section-label"></div>
128 <div class="audits-form-elements" $="other-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000129 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000130 <div class="audits-form-section">
131 <div class="audits-form-section-label"></div>
132 <div class="audits-form-elements audits-start-button-container hbox">
Patrick Hulcea087f622018-05-18 00:37:53 +0000133 ${this._startButton}
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000134 <div $="help-text" class="audits-help-text hidden"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000135 </div>
136 </div>
137 </form>
138 </div>
139 `;
140
141 this._helpText = fragment.$('help-text');
Patrick Hulcea087f622018-05-18 00:37:53 +0000142 this._populateFormControls(fragment);
143 this.contentElement.appendChild(fragment.element());
144 this.contentElement.style.overflow = 'auto';
145 }
146
Patrick Hulce8d387f12018-05-29 18:54:54 +0000147 focusStartButton() {
148 this._startButton.focus();
149 }
150
Patrick Hulcea087f622018-05-18 00:37:53 +0000151 /**
152 * @param {boolean} isEnabled
153 */
154 setStartButtonEnabled(isEnabled) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000155 if (this._helpText) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000156 this._helpText.classList.toggle('hidden', isEnabled);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000157 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000158
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000159 if (this._startButton) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000160 this._startButton.disabled = !isEnabled;
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000161 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000162 }
163
164 /**
165 * @param {?string} text
166 */
167 setUnauditableExplanation(text) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000168 if (this._helpText) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000169 this._helpText.textContent = text;
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000170 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000171 }
172};