blob: b17f92a37da46c9bd078934fc6343264084081b8 [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
21 * @param {!Element} parentElement
22 */
Patrick Hulce05c18ce2018-05-24 00:34:56 +000023 _populateRuntimeSettingAsRadio(settingName, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000024 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000025 if (!runtimeSetting || !runtimeSetting.options)
26 throw new Error(`${settingName} is not a setting with options`);
27
John Emau84ddefb2019-07-16 19:25:56 +000028 const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting, runtimeSetting.description);
Patrick Hulcea087f622018-05-18 00:37:53 +000029 parentElement.appendChild(control.element);
30 }
31
32 /**
Patrick Hulce05c18ce2018-05-24 00:34:56 +000033 * @param {string} settingName
34 * @param {!Element} parentElement
35 */
36 _populateRuntimeSettingAsCheckbox(settingName, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000037 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000038 if (!runtimeSetting || !runtimeSetting.title)
39 throw new Error(`${settingName} is not a setting with a title`);
40
41 runtimeSetting.setting.setTitle(runtimeSetting.title);
42 const control = new UI.ToolbarSettingCheckbox(runtimeSetting.setting, runtimeSetting.description);
43 parentElement.appendChild(control.element);
44 }
45
46 /**
Patrick Hulcea087f622018-05-18 00:37:53 +000047 * @param {!UI.Fragment} fragment
48 */
49 _populateFormControls(fragment) {
50 // Populate the device type
51 const deviceTypeFormElements = fragment.$('device-type-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000052 this._populateRuntimeSettingAsRadio('audits.device_type', deviceTypeFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000053
54 // Populate the audit categories
55 const categoryFormElements = fragment.$('categories-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000056 for (const preset of Audits.Presets) {
Patrick Hulcea087f622018-05-18 00:37:53 +000057 preset.setting.setTitle(preset.title);
58 const checkbox = new UI.ToolbarSettingCheckbox(preset.setting);
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000059 const row = categoryFormElements.createChild('div', 'vbox audits-launcher-row');
Patrick Hulce05c18ce2018-05-24 00:34:56 +000060 row.title = preset.description;
Patrick Hulcea087f622018-05-18 00:37:53 +000061 row.appendChild(checkbox.element);
Patrick Hulcea087f622018-05-18 00:37:53 +000062 }
63
64 // Populate the throttling
65 const throttlingFormElements = fragment.$('throttling-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000066 this._populateRuntimeSettingAsRadio('audits.throttling', throttlingFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000067
68
69 // Populate other settings
70 const otherFormElements = fragment.$('other-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000071 this._populateRuntimeSettingAsCheckbox('audits.clear_storage', otherFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000072 }
73
74 _render() {
75 this._startButton = UI.createTextButton(
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000076 ls`Run audits`, () => this._controller.dispatchEventToListeners(Audits.Events.RequestAuditStart),
77 'audits-start-button', true /* primary */);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000078 this.setDefaultFocusedElement(this._startButton);
79
Patrick Hulcea087f622018-05-18 00:37:53 +000080 const deviceIcon = UI.Icon.create('largeicon-phone');
81 const categoriesIcon = UI.Icon.create('largeicon-checkmark');
82 const throttlingIcon = UI.Icon.create('largeicon-settings-gear');
Christy Chen1eea03c2019-06-26 19:31:24 +000083 const auditsDescription = ls
84 `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 +000085
86 const fragment = UI.Fragment.build`
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000087 <div class="vbox audits-start-view">
Patrick Hulcea087f622018-05-18 00:37:53 +000088 <header>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000089 <div class="audits-logo"></div>
90 <div class="audits-start-view-text">
Christy Chen1eea03c2019-06-26 19:31:24 +000091 <h2>${ls`Audits`}</h2>
92 <p>
93 <span class="text">${auditsDescription}</span>
John Emau97832ab2019-07-16 00:37:34 +000094 ${UI.XLink.create('https://developers.google.com/web/tools/lighthouse/', ls`Learn more`)}
Christy Chen1eea03c2019-06-26 19:31:24 +000095 </p>
Patrick Hulcea087f622018-05-18 00:37:53 +000096 </div>
97 </header>
98 <form>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000099 <div class="audits-form-section">
100 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000101 <i>${deviceIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000102 <div class="audits-icon-label">${ls`Device`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000103 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000104 <div class="audits-form-elements" $="device-type-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000105 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000106 <div class="audits-form-section">
107 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000108 <i>${categoriesIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000109 <div class="audits-icon-label">${ls`Audits`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000110 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000111 <div class="audits-form-elements" $="categories-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000112 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000113 <div class="audits-form-section">
114 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000115 <i>${throttlingIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000116 <div class="audits-icon-label">${ls`Throttling`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000117 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000118 <div class="audits-form-elements" $="throttling-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000119 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000120 <div class="audits-form-section">
121 <div class="audits-form-section-label"></div>
122 <div class="audits-form-elements" $="other-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000123 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000124 <div class="audits-form-section">
125 <div class="audits-form-section-label"></div>
126 <div class="audits-form-elements audits-start-button-container hbox">
Patrick Hulcea087f622018-05-18 00:37:53 +0000127 ${this._startButton}
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000128 <div $="help-text" class="audits-help-text hidden"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000129 </div>
130 </div>
131 </form>
132 </div>
133 `;
134
135 this._helpText = fragment.$('help-text');
Patrick Hulcea087f622018-05-18 00:37:53 +0000136 this._populateFormControls(fragment);
137 this.contentElement.appendChild(fragment.element());
138 this.contentElement.style.overflow = 'auto';
139 }
140
Patrick Hulce8d387f12018-05-29 18:54:54 +0000141 focusStartButton() {
142 this._startButton.focus();
143 }
144
Patrick Hulcea087f622018-05-18 00:37:53 +0000145 /**
146 * @param {boolean} isEnabled
147 */
148 setStartButtonEnabled(isEnabled) {
149 if (this._helpText)
150 this._helpText.classList.toggle('hidden', isEnabled);
151
152 if (this._startButton)
153 this._startButton.disabled = !isEnabled;
154 }
155
156 /**
157 * @param {?string} text
158 */
159 setUnauditableExplanation(text) {
160 if (this._helpText)
161 this._helpText.textContent = text;
162 }
163};