blob: 4e454f2b991c87d6b34d3fe4b6a3f9a9f7e8f2bd [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
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000028 const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting);
Patrick Hulcea087f622018-05-18 00:37:53 +000029 control.element.title = runtimeSetting.description;
30 parentElement.appendChild(control.element);
31 }
32
33 /**
Patrick Hulce05c18ce2018-05-24 00:34:56 +000034 * @param {string} settingName
35 * @param {!Element} parentElement
36 */
37 _populateRuntimeSettingAsCheckbox(settingName, parentElement) {
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000038 const runtimeSetting = Audits.RuntimeSettings.find(item => item.setting.name === settingName);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000039 if (!runtimeSetting || !runtimeSetting.title)
40 throw new Error(`${settingName} is not a setting with a title`);
41
42 runtimeSetting.setting.setTitle(runtimeSetting.title);
43 const control = new UI.ToolbarSettingCheckbox(runtimeSetting.setting, runtimeSetting.description);
44 parentElement.appendChild(control.element);
45 }
46
47 /**
Patrick Hulcea087f622018-05-18 00:37:53 +000048 * @param {!UI.Fragment} fragment
49 */
50 _populateFormControls(fragment) {
51 // Populate the device type
52 const deviceTypeFormElements = fragment.$('device-type-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000053 this._populateRuntimeSettingAsRadio('audits.device_type', deviceTypeFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000054
55 // Populate the audit categories
56 const categoryFormElements = fragment.$('categories-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000057 for (const preset of Audits.Presets) {
Patrick Hulcea087f622018-05-18 00:37:53 +000058 preset.setting.setTitle(preset.title);
59 const checkbox = new UI.ToolbarSettingCheckbox(preset.setting);
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000060 const row = categoryFormElements.createChild('div', 'vbox audits-launcher-row');
Patrick Hulce05c18ce2018-05-24 00:34:56 +000061 row.title = preset.description;
Patrick Hulcea087f622018-05-18 00:37:53 +000062 row.appendChild(checkbox.element);
Patrick Hulcea087f622018-05-18 00:37:53 +000063 }
64
65 // Populate the throttling
66 const throttlingFormElements = fragment.$('throttling-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000067 this._populateRuntimeSettingAsRadio('audits.throttling', throttlingFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000068
69
70 // Populate other settings
71 const otherFormElements = fragment.$('other-form-elements');
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000072 this._populateRuntimeSettingAsCheckbox('audits.clear_storage', otherFormElements);
Patrick Hulcea087f622018-05-18 00:37:53 +000073 }
74
75 _render() {
76 this._startButton = UI.createTextButton(
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000077 ls`Run audits`, () => this._controller.dispatchEventToListeners(Audits.Events.RequestAuditStart),
78 'audits-start-button', true /* primary */);
Patrick Hulce05c18ce2018-05-24 00:34:56 +000079 this.setDefaultFocusedElement(this._startButton);
80
Patrick Hulcea087f622018-05-18 00:37:53 +000081 const deviceIcon = UI.Icon.create('largeicon-phone');
82 const categoriesIcon = UI.Icon.create('largeicon-checkmark');
83 const throttlingIcon = UI.Icon.create('largeicon-settings-gear');
Christy Chen1eea03c2019-06-26 19:31:24 +000084 const auditsDescription = ls
85 `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 +000086
87 const fragment = UI.Fragment.build`
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000088 <div class="vbox audits-start-view">
Patrick Hulcea087f622018-05-18 00:37:53 +000089 <header>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +000090 <div class="audits-logo"></div>
91 <div class="audits-start-view-text">
Christy Chen1eea03c2019-06-26 19:31:24 +000092 <h2>${ls`Audits`}</h2>
93 <p>
94 <span class="text">${auditsDescription}</span>
95 <span class="link" $="learn-more">${ls`Learn more`}</a>
96 </p>
Patrick Hulcea087f622018-05-18 00:37:53 +000097 </div>
98 </header>
99 <form>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000100 <div class="audits-form-section">
101 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000102 <i>${deviceIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000103 <div class="audits-icon-label">${ls`Device`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000104 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000105 <div class="audits-form-elements" $="device-type-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000106 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000107 <div class="audits-form-section">
108 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000109 <i>${categoriesIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000110 <div class="audits-icon-label">${ls`Audits`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000111 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000112 <div class="audits-form-elements" $="categories-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000113 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000114 <div class="audits-form-section">
115 <div class="audits-form-section-label">
Patrick Hulcea087f622018-05-18 00:37:53 +0000116 <i>${throttlingIcon}</i>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000117 <div class="audits-icon-label">${ls`Throttling`}</div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000118 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000119 <div class="audits-form-elements" $="throttling-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000120 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000121 <div class="audits-form-section">
122 <div class="audits-form-section-label"></div>
123 <div class="audits-form-elements" $="other-form-elements"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000124 </div>
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000125 <div class="audits-form-section">
126 <div class="audits-form-section-label"></div>
127 <div class="audits-form-elements audits-start-button-container hbox">
Patrick Hulcea087f622018-05-18 00:37:53 +0000128 ${this._startButton}
cjamcl@google.comaa1532c2019-05-31 03:01:24 +0000129 <div $="help-text" class="audits-help-text hidden"></div>
Patrick Hulcea087f622018-05-18 00:37:53 +0000130 </div>
131 </div>
132 </form>
133 </div>
134 `;
135
136 this._helpText = fragment.$('help-text');
137
138 const learnMoreLink = fragment.$('learn-more');
139 learnMoreLink.addEventListener(
140 'click', () => InspectorFrontendHost.openInNewTab('https://developers.google.com/web/tools/lighthouse/'));
141
142 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) {
155 if (this._helpText)
156 this._helpText.classList.toggle('hidden', isEnabled);
157
158 if (this._startButton)
159 this._startButton.disabled = !isEnabled;
160 }
161
162 /**
163 * @param {?string} text
164 */
165 setUnauditableExplanation(text) {
166 if (this._helpText)
167 this._helpText.textContent = text;
168 }
169};