blob: 034387b5e791d45e6148a8f7c8b71d6b2a84ce99 [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;
Connor Clarke66080e2019-11-06 16:35:51 -080016 this._settingsToolbar = new UI.Toolbar('');
Patrick Hulcea087f622018-05-18 00:37:53 +000017 this._render();
18 }
19
20 /**
Connor Clarke66080e2019-11-06 16:35:51 -080021 * @return {!UI.Toolbar}
22 */
23 settingsToolbar() {
24 return this._settingsToolbar;
25 }
26
27 /**
Patrick Hulcea087f622018-05-18 00:37:53 +000028 * @param {string} settingName
John Emau73477162019-07-17 00:30:51 +000029 * @param {string} label
Patrick Hulcea087f622018-05-18 00:37:53 +000030 * @param {!Element} parentElement
31 */
John Emau73477162019-07-17 00:30:51 +000032 _populateRuntimeSettingAsRadio(settingName, label, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000033 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000034 if (!runtimeSetting || !runtimeSetting.options) {
Patrick Hulce05c18ce2018-05-24 00:34:56 +000035 throw new Error(`${settingName} is not a setting with options`);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000036 }
Patrick Hulce05c18ce2018-05-24 00:34:56 +000037
John Emau84ddefb2019-07-16 19:25:56 +000038 const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting, runtimeSetting.description);
Patrick Hulcea087f622018-05-18 00:37:53 +000039 parentElement.appendChild(control.element);
John Emau73477162019-07-17 00:30:51 +000040 UI.ARIAUtils.setAccessibleName(control.element, label);
Patrick Hulcea087f622018-05-18 00:37:53 +000041 }
42
43 /**
Patrick Hulce05c18ce2018-05-24 00:34:56 +000044 * @param {string} settingName
Connor Clarke66080e2019-11-06 16:35:51 -080045 * @param {!UI.Toolbar} toolbar
Patrick Hulce05c18ce2018-05-24 00:34:56 +000046 */
Connor Clarke66080e2019-11-06 16:35:51 -080047 _populateRuntimeSettingAsToolbarCheckbox(settingName, toolbar) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000048 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000049 if (!runtimeSetting || !runtimeSetting.title) {
Patrick Hulce05c18ce2018-05-24 00:34:56 +000050 throw new Error(`${settingName} is not a setting with a title`);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +000051 }
Patrick Hulce05c18ce2018-05-24 00:34:56 +000052
53 runtimeSetting.setting.setTitle(runtimeSetting.title);
54 const control = new UI.ToolbarSettingCheckbox(runtimeSetting.setting, runtimeSetting.description);
Connor Clarke66080e2019-11-06 16:35:51 -080055 toolbar.appendToolbarItem(control);
56 if (runtimeSetting.learnMore) {
57 const link = UI.XLink.create(runtimeSetting.learnMore, ls`Learn more`, 'audits-learn-more');
58 link.style.padding = '5px';
59 control.element.appendChild(link);
60 }
Patrick Hulce05c18ce2018-05-24 00:34:56 +000061 }
62
63 /**
Patrick Hulcea087f622018-05-18 00:37:53 +000064 * @param {!UI.Fragment} fragment
65 */
66 _populateFormControls(fragment) {
67 // Populate the device type
68 const deviceTypeFormElements = fragment.$('device-type-form-elements');
John Emau73477162019-07-17 00:30:51 +000069 this._populateRuntimeSettingAsRadio('audits.device_type', ls`Device`, deviceTypeFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000070
Connor Clarke66080e2019-11-06 16:35:51 -080071 // Populate the categories
Patrick Hulcea087f622018-05-18 00:37:53 +000072 const categoryFormElements = fragment.$('categories-form-elements');
Connor Clark3ee5ac72019-11-07 15:11:58 -080073 const pluginFormElements = fragment.$('plugins-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000074 for (const preset of Audits.Presets) {
Connor Clark3ee5ac72019-11-07 15:11:58 -080075 const formElements = preset.plugin ? pluginFormElements : categoryFormElements;
Patrick Hulcea087f622018-05-18 00:37:53 +000076 preset.setting.setTitle(preset.title);
77 const checkbox = new UI.ToolbarSettingCheckbox(preset.setting);
Connor Clark3ee5ac72019-11-07 15:11:58 -080078 const row = formElements.createChild('div', 'vbox audits-launcher-row');
Patrick Hulce05c18ce2018-05-24 00:34:56 +000079 row.title = preset.description;
Patrick Hulcea087f622018-05-18 00:37:53 +000080 row.appendChild(checkbox.element);
Patrick Hulcea087f622018-05-18 00:37:53 +000081 }
John Emau62fdcee2019-10-16 00:08:52 +000082 UI.ARIAUtils.markAsGroup(categoryFormElements);
Connor Clarke66080e2019-11-06 16:35:51 -080083 UI.ARIAUtils.setAccessibleName(categoryFormElements, ls`Categories`);
Connor Clark3ee5ac72019-11-07 15:11:58 -080084 UI.ARIAUtils.markAsGroup(pluginFormElements);
85 UI.ARIAUtils.setAccessibleName(pluginFormElements, ls`Community Plugins (beta)`);
Patrick Hulcea087f622018-05-18 00:37:53 +000086 }
87
88 _render() {
Connor Clarke66080e2019-11-06 16:35:51 -080089 this._populateRuntimeSettingAsToolbarCheckbox('audits.clear_storage', this._settingsToolbar);
90 this._populateRuntimeSettingAsToolbarCheckbox('audits.throttling', this._settingsToolbar);
91
Patrick Hulcea087f622018-05-18 00:37:53 +000092 this._startButton = UI.createTextButton(
Connor Clarke66080e2019-11-06 16:35:51 -080093 ls`Generate report`, () => this._controller.dispatchEventToListeners(Audits.Events.RequestAuditStart), '',
vidorteg6afbe792019-09-04 19:00:37 +000094 true /* primary */);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000095 this.setDefaultFocusedElement(this._startButton);
96
Christy Chen1eea03c2019-06-26 19:31:24 +000097 const auditsDescription = ls
98 `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 +000099
100 const fragment = UI.Fragment.build`
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000101 <div class="vbox audits-start-view">
Patrick Hulcea087f622018-05-18 00:37:53 +0000102 <header>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000103 <div class="audits-logo"></div>
Connor Clarke66080e2019-11-06 16:35:51 -0800104 <div class="audits-start-button-container hbox">
105 ${this._startButton}
106 </div>
107 <div $="help-text" class="audits-help-text hidden"></div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000108 <div class="audits-start-view-text">
Connor Clarke66080e2019-11-06 16:35:51 -0800109 <span>${auditsDescription}</span>
John Emau97832ab2019-07-16 00:37:34 +0000110 ${UI.XLink.create('https://developers.google.com/web/tools/lighthouse/', ls`Learn more`)}
Patrick Hulcea087f622018-05-18 00:37:53 +0000111 </div>
112 </header>
113 <form>
Connor Clark3ee5ac72019-11-07 15:11:58 -0800114 <div class="audits-form-categories">
115 <div class="audits-form-section">
116 <div class="audits-form-section-label">
117 ${ls`Categories`}
118 </div>
119 <div class="audits-form-elements" $="categories-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000120 </div>
Connor Clark3ee5ac72019-11-07 15:11:58 -0800121 <div class="audits-form-section">
122 <div class="audits-form-section-label">
123 <div class="audits-icon-label">${ls`Community Plugins (beta)`}</div>
124 </div>
125 <div class="audits-form-elements" $="plugins-form-elements"></div>
126 </div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000127 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000128 <div class="audits-form-section">
129 <div class="audits-form-section-label">
Connor Clarke66080e2019-11-06 16:35:51 -0800130 ${ls`Device`}
Patrick Hulcea087f622018-05-18 00:37:53 +0000131 </div>
Connor Clarke66080e2019-11-06 16:35:51 -0800132 <div class="audits-form-elements" $="device-type-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000133 </div>
134 </form>
135 </div>
136 `;
137
138 this._helpText = fragment.$('help-text');
Patrick Hulcea087f622018-05-18 00:37:53 +0000139 this._populateFormControls(fragment);
140 this.contentElement.appendChild(fragment.element());
141 this.contentElement.style.overflow = 'auto';
142 }
143
Connor Clarke66080e2019-11-06 16:35:51 -0800144 /**
145 * @override
146 */
147 onResize() {
148 const useNarrowLayout = this.contentElement.offsetWidth < 560;
149 const startViewEl = this.contentElement.querySelector('.audits-start-view');
150 startViewEl.classList.toggle('hbox', !useNarrowLayout);
151 startViewEl.classList.toggle('vbox', useNarrowLayout);
152 }
153
Patrick Hulce8d387f12018-05-29 18:54:54 +0000154 focusStartButton() {
155 this._startButton.focus();
156 }
157
Patrick Hulcea087f622018-05-18 00:37:53 +0000158 /**
159 * @param {boolean} isEnabled
160 */
161 setStartButtonEnabled(isEnabled) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000162 if (this._helpText) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000163 this._helpText.classList.toggle('hidden', isEnabled);
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000164 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000165
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000166 if (this._startButton) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000167 this._startButton.disabled = !isEnabled;
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000168 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000169 }
170
171 /**
172 * @param {?string} text
173 */
174 setUnauditableExplanation(text) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000175 if (this._helpText) {
Patrick Hulcea087f622018-05-18 00:37:53 +0000176 this._helpText.textContent = text;
Tim van der Lippe1d6e57a2019-09-30 11:55:34 +0000177 }
Patrick Hulcea087f622018-05-18 00:37:53 +0000178 }
179};