blob: 649c200045c022950a91cea259ea51ecae3aaf4f [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371// Copyright (c) 2015 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
Tim van der Lippe0ed1d2b2020-02-04 13:45:135import * as Common from '../common/common.js';
6import * as MobileThrottling from '../mobile_throttling/mobile_throttling.js';
7import * as SDK from '../sdk/sdk.js';
8import * as UI from '../ui/ui.js';
9
10export class NetworkConfigView extends UI.Widget.VBox {
Blink Reformat4c46d092018-04-07 15:32:3711 constructor() {
12 super(true);
13 this.registerRequiredCSS('network/networkConfigView.css');
14 this.contentElement.classList.add('network-config');
15
16 this._createCacheSection();
17 this.contentElement.createChild('div').classList.add('panel-section-separator');
18 this._createNetworkThrottlingSection();
19 this.contentElement.createChild('div').classList.add('panel-section-separator');
20 this._createUserAgentSection();
21 }
22
23 /**
Chandani Shrestha13ec5332019-06-05 22:27:0024 * @param {string} title
Michael Liao9c1e0ce2019-10-21 22:42:2325 * @return {{select: !Element, input: !Element, error: !Element}}
Blink Reformat4c46d092018-04-07 15:32:3726 */
Chandani Shrestha13ec5332019-06-05 22:27:0027 static createUserAgentSelectAndInput(title) {
Paul Lewis6bcdb182020-01-23 11:08:0528 const userAgentSetting = self.Common.settings.createSetting('customUserAgent', '');
Blink Reformat4c46d092018-04-07 15:32:3729 const userAgentSelectElement = createElement('select');
Chandani Shrestha13ec5332019-06-05 22:27:0030 UI.ARIAUtils.setAccessibleName(userAgentSelectElement, title);
Blink Reformat4c46d092018-04-07 15:32:3731
Tim van der Lippe0ed1d2b2020-02-04 13:45:1332 const customOverride = {title: Common.UIString.UIString('Custom...'), value: 'custom'};
Blink Reformat4c46d092018-04-07 15:32:3733 userAgentSelectElement.appendChild(new Option(customOverride.title, customOverride.value));
34
Tim van der Lippe119690c2020-01-13 12:31:3035 for (const userAgentDescriptor of userAgentGroups) {
Blink Reformat4c46d092018-04-07 15:32:3736 const groupElement = userAgentSelectElement.createChild('optgroup');
37 groupElement.label = userAgentDescriptor.title;
38 for (const userAgentVersion of userAgentDescriptor.values) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:1339 const userAgentValue =
40 SDK.NetworkManager.MultitargetNetworkManager.patchUserAgentWithChromeVersion(userAgentVersion.value);
Blink Reformat4c46d092018-04-07 15:32:3741 groupElement.appendChild(new Option(userAgentVersion.title, userAgentValue));
42 }
43 }
44
45 userAgentSelectElement.selectedIndex = 0;
46
Tim van der Lippe0ed1d2b2020-02-04 13:45:1347 const otherUserAgentElement = UI.UIUtils.createInput('', 'text');
Blink Reformat4c46d092018-04-07 15:32:3748 otherUserAgentElement.value = userAgentSetting.get();
49 otherUserAgentElement.title = userAgentSetting.get();
Tim van der Lippe0ed1d2b2020-02-04 13:45:1350 otherUserAgentElement.placeholder = Common.UIString.UIString('Enter a custom user agent');
Blink Reformat4c46d092018-04-07 15:32:3751 otherUserAgentElement.required = true;
Chandani Shrestha13ec5332019-06-05 22:27:0052 UI.ARIAUtils.setAccessibleName(otherUserAgentElement, otherUserAgentElement.placeholder);
Blink Reformat4c46d092018-04-07 15:32:3753
Michael Liao9c1e0ce2019-10-21 22:42:2354 const errorElement = createElementWithClass('div', 'network-config-input-validation-error');
55 UI.ARIAUtils.markAsAlert(errorElement);
56 if (!otherUserAgentElement.value) {
57 errorElement.textContent = ls`Custom user agent field is required`;
58 }
59
Blink Reformat4c46d092018-04-07 15:32:3760 settingChanged();
61 userAgentSelectElement.addEventListener('change', userAgentSelected, false);
62 otherUserAgentElement.addEventListener('input', applyOtherUserAgent, false);
63
64 function userAgentSelected() {
65 const value = userAgentSelectElement.options[userAgentSelectElement.selectedIndex].value;
66 if (value !== customOverride.value) {
67 userAgentSetting.set(value);
68 otherUserAgentElement.value = value;
69 otherUserAgentElement.title = value;
70 } else {
71 otherUserAgentElement.select();
72 }
Michael Liao9c1e0ce2019-10-21 22:42:2373 errorElement.textContent = '';
Blink Reformat4c46d092018-04-07 15:32:3774 }
75
76 function settingChanged() {
77 const value = userAgentSetting.get();
78 const options = userAgentSelectElement.options;
79 let selectionRestored = false;
80 for (let i = 0; i < options.length; ++i) {
81 if (options[i].value === value) {
82 userAgentSelectElement.selectedIndex = i;
83 selectionRestored = true;
84 break;
85 }
86 }
87
Tim van der Lippe1d6e57a2019-09-30 11:55:3488 if (!selectionRestored) {
Blink Reformat4c46d092018-04-07 15:32:3789 userAgentSelectElement.selectedIndex = 0;
Tim van der Lippe1d6e57a2019-09-30 11:55:3490 }
Blink Reformat4c46d092018-04-07 15:32:3791 }
92
93 function applyOtherUserAgent() {
94 if (userAgentSetting.get() !== otherUserAgentElement.value) {
Michael Liao9c1e0ce2019-10-21 22:42:2395 if (!otherUserAgentElement.value) {
96 errorElement.textContent = ls`Custom user agent field is required`;
97 } else {
98 errorElement.textContent = '';
99 }
Blink Reformat4c46d092018-04-07 15:32:37100 userAgentSetting.set(otherUserAgentElement.value);
101 otherUserAgentElement.title = otherUserAgentElement.value;
102 settingChanged();
103 }
104 }
105
Michael Liao9c1e0ce2019-10-21 22:42:23106 return {select: userAgentSelectElement, input: otherUserAgentElement, error: errorElement};
Blink Reformat4c46d092018-04-07 15:32:37107 }
108
109 /**
110 * @param {string} title
111 * @param {string=} className
112 * @return {!Element}
113 */
114 _createSection(title, className) {
115 const section = this.contentElement.createChild('section', 'network-config-group');
Tim van der Lippe1d6e57a2019-09-30 11:55:34116 if (className) {
Blink Reformat4c46d092018-04-07 15:32:37117 section.classList.add(className);
Tim van der Lippe1d6e57a2019-09-30 11:55:34118 }
Blink Reformat4c46d092018-04-07 15:32:37119 section.createChild('div', 'network-config-title').textContent = title;
120 return section.createChild('div', 'network-config-fields');
121 }
122
123 _createCacheSection() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13124 const section = this._createSection(Common.UIString.UIString('Caching'), 'network-config-disable-cache');
Blink Reformat4c46d092018-04-07 15:32:37125 section.appendChild(UI.SettingsUI.createSettingCheckbox(
Tim van der Lippe0ed1d2b2020-02-04 13:45:13126 Common.UIString.UIString('Disable cache'), self.Common.settings.moduleSetting('cacheDisabled'), true));
Blink Reformat4c46d092018-04-07 15:32:37127 }
128
129 _createNetworkThrottlingSection() {
Chandani Shrestha13ec5332019-06-05 22:27:00130 const title = ls`Network throttling`;
131 const section = this._createSection(title, 'network-config-throttling');
Blink Reformat4c46d092018-04-07 15:32:37132 const networkThrottlingSelect =
133 /** @type {!HTMLSelectElement} */ (section.createChild('select', 'chrome-select'));
Tim van der Lippe0ed1d2b2020-02-04 13:45:13134 MobileThrottling.ThrottlingManager.throttlingManager().decorateSelectWithNetworkThrottling(networkThrottlingSelect);
Chandani Shrestha13ec5332019-06-05 22:27:00135 UI.ARIAUtils.setAccessibleName(networkThrottlingSelect, title);
Blink Reformat4c46d092018-04-07 15:32:37136 }
137
138 _createUserAgentSection() {
Chandani Shrestha13ec5332019-06-05 22:27:00139 const title = ls`User agent`;
140 const section = this._createSection(title, 'network-config-ua');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13141 const checkboxLabel = UI.UIUtils.CheckboxLabel.create(Common.UIString.UIString('Select automatically'), true);
Blink Reformat4c46d092018-04-07 15:32:37142 section.appendChild(checkboxLabel);
143 const autoCheckbox = checkboxLabel.checkboxElement;
144
Paul Lewis6bcdb182020-01-23 11:08:05145 const customUserAgentSetting = self.Common.settings.createSetting('customUserAgent', '');
Blink Reformat4c46d092018-04-07 15:32:37146 customUserAgentSetting.addChangeListener(() => {
Tim van der Lippe1d6e57a2019-09-30 11:55:34147 if (autoCheckbox.checked) {
Blink Reformat4c46d092018-04-07 15:32:37148 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34149 }
Paul Lewis5a922e72020-01-24 11:58:08150 self.SDK.multitargetNetworkManager.setCustomUserAgentOverride(customUserAgentSetting.get());
Blink Reformat4c46d092018-04-07 15:32:37151 });
152 const customUserAgentSelectBox = section.createChild('div', 'network-config-ua-custom');
153 autoCheckbox.addEventListener('change', userAgentSelectBoxChanged);
Tim van der Lippe119690c2020-01-13 12:31:30154 const customSelectAndInput = NetworkConfigView.createUserAgentSelectAndInput(title);
Blink Reformat4c46d092018-04-07 15:32:37155 customSelectAndInput.select.classList.add('chrome-select');
156 customUserAgentSelectBox.appendChild(customSelectAndInput.select);
157 customUserAgentSelectBox.appendChild(customSelectAndInput.input);
Michael Liao9c1e0ce2019-10-21 22:42:23158 customUserAgentSelectBox.appendChild(customSelectAndInput.error);
Blink Reformat4c46d092018-04-07 15:32:37159 userAgentSelectBoxChanged();
160
161 function userAgentSelectBoxChanged() {
162 const useCustomUA = !autoCheckbox.checked;
163 customUserAgentSelectBox.classList.toggle('checked', useCustomUA);
164 customSelectAndInput.select.disabled = !useCustomUA;
165 customSelectAndInput.input.disabled = !useCustomUA;
Michael Liao9c1e0ce2019-10-21 22:42:23166 customSelectAndInput.error.hidden = !useCustomUA;
Blink Reformat4c46d092018-04-07 15:32:37167 const customUA = useCustomUA ? customUserAgentSetting.get() : '';
Paul Lewis5a922e72020-01-24 11:58:08168 self.SDK.multitargetNetworkManager.setCustomUserAgentOverride(customUA);
Blink Reformat4c46d092018-04-07 15:32:37169 }
170 }
Paul Lewis56509652019-12-06 12:51:58171}
Blink Reformat4c46d092018-04-07 15:32:37172
173/** @type {!Array.<{title: string, values: !Array.<{title: string, value: string}>}>} */
Tim van der Lippe119690c2020-01-13 12:31:30174export const userAgentGroups = [
Blink Reformat4c46d092018-04-07 15:32:37175 {
Christy Chend0ae96c2019-09-24 19:05:17176 title: ls`Android`,
Blink Reformat4c46d092018-04-07 15:32:37177 values: [
178 {
Christy Chend0ae96c2019-09-24 19:05:17179 title: ls`Android (4.0.2) Browser \u2014 Galaxy Nexus`,
Blink Reformat4c46d092018-04-07 15:32:37180 value:
181 'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
182 },
183 {
Christy Chend0ae96c2019-09-24 19:05:17184 title: ls`Android (2.3) Browser \u2014 Nexus S`,
Blink Reformat4c46d092018-04-07 15:32:37185 value:
186 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
187 }
188 ]
189 },
190 {
Christy Chend0ae96c2019-09-24 19:05:17191 title: ls`BlackBerry`,
Blink Reformat4c46d092018-04-07 15:32:37192 values: [
193 {
Christy Chend0ae96c2019-09-24 19:05:17194 title: ls`BlackBerry \u2014 BB10`,
Blink Reformat4c46d092018-04-07 15:32:37195 value:
196 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+'
197 },
198 {
Christy Chend0ae96c2019-09-24 19:05:17199 title: ls`BlackBerry \u2014 PlayBook 2.1`,
Blink Reformat4c46d092018-04-07 15:32:37200 value:
201 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+'
202 },
203 {
Christy Chend0ae96c2019-09-24 19:05:17204 title: ls`BlackBerry \u2014 9900`,
Blink Reformat4c46d092018-04-07 15:32:37205 value:
206 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+'
207 }
208 ]
209 },
210 {
Christy Chend0ae96c2019-09-24 19:05:17211 title: ls`Chrome`,
Blink Reformat4c46d092018-04-07 15:32:37212 values: [
213 {
Christy Chend0ae96c2019-09-24 19:05:17214 title: ls`Chrome \u2014 Android Mobile`,
Blink Reformat4c46d092018-04-07 15:32:37215 value:
216 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36'
217 },
218 {
Mathias Bynensfbf36962019-12-03 12:14:59219 title: ls`Chrome \u2014 Android Mobile (high-end)`,
220 value:
221 'Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36'
222 },
223 {
Christy Chend0ae96c2019-09-24 19:05:17224 title: ls`Chrome \u2014 Android Tablet`,
Blink Reformat4c46d092018-04-07 15:32:37225 value:
226 'Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
227 },
228 {
Christy Chend0ae96c2019-09-24 19:05:17229 title: ls`Chrome \u2014 iPhone`,
Blink Reformat4c46d092018-04-07 15:32:37230 value:
Mathias Bynensfbf36962019-12-03 12:14:59231 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/%s Mobile/15E148 Safari/604.1'
Blink Reformat4c46d092018-04-07 15:32:37232 },
233 {
Christy Chend0ae96c2019-09-24 19:05:17234 title: ls`Chrome \u2014 iPad`,
Blink Reformat4c46d092018-04-07 15:32:37235 value:
Mathias Bynensfbf36962019-12-03 12:14:59236 'Mozilla/5.0 (iPad; CPU OS 13_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/%s Mobile/15E148 Safari/604.1'
Blink Reformat4c46d092018-04-07 15:32:37237 },
238 {
Christy Chend0ae96c2019-09-24 19:05:17239 title: ls`Chrome \u2014 Chrome OS`,
Blink Reformat4c46d092018-04-07 15:32:37240 value: 'Mozilla/5.0 (X11; CrOS x86_64 10066.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
241 },
242 {
Christy Chend0ae96c2019-09-24 19:05:17243 title: ls`Chrome \u2014 Mac`,
Blink Reformat4c46d092018-04-07 15:32:37244 value:
Mathias Bynensfbf36962019-12-03 12:14:59245 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
Blink Reformat4c46d092018-04-07 15:32:37246 },
247 {
Christy Chend0ae96c2019-09-24 19:05:17248 title: ls`Chrome \u2014 Windows`,
Blink Reformat4c46d092018-04-07 15:32:37249 value: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
250 }
251 ]
252 },
253 {
Christy Chend0ae96c2019-09-24 19:05:17254 title: ls`Firefox`,
Blink Reformat4c46d092018-04-07 15:32:37255 values: [
256 {
Christy Chend0ae96c2019-09-24 19:05:17257 title: ls`Firefox \u2014 Android Mobile`,
Mathias Bynensf05ffb22019-11-29 13:56:36258 value: 'Mozilla/5.0 (Android 4.4; Mobile; rv:70.0) Gecko/70.0 Firefox/70.0'
Blink Reformat4c46d092018-04-07 15:32:37259 },
260 {
Christy Chend0ae96c2019-09-24 19:05:17261 title: ls`Firefox \u2014 Android Tablet`,
Mathias Bynensf05ffb22019-11-29 13:56:36262 value: 'Mozilla/5.0 (Android 4.4; Tablet; rv:70.0) Gecko/70.0 Firefox/70.0'
Blink Reformat4c46d092018-04-07 15:32:37263 },
264 {
Christy Chend0ae96c2019-09-24 19:05:17265 title: ls`Firefox \u2014 iPhone`,
Blink Reformat4c46d092018-04-07 15:32:37266 value:
267 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4'
268 },
269 {
Christy Chend0ae96c2019-09-24 19:05:17270 title: ls`Firefox \u2014 iPad`,
Blink Reformat4c46d092018-04-07 15:32:37271 value:
272 'Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4'
273 },
274 {
Christy Chend0ae96c2019-09-24 19:05:17275 title: ls`Firefox \u2014 Mac`,
Mathias Bynensfbf36962019-12-03 12:14:59276 value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0'
Blink Reformat4c46d092018-04-07 15:32:37277 },
278 {
Christy Chend0ae96c2019-09-24 19:05:17279 title: ls`Firefox \u2014 Windows`,
Mathias Bynensf05ffb22019-11-29 13:56:36280 value: 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0'
Blink Reformat4c46d092018-04-07 15:32:37281 }
282 ]
283 },
284 {
Christy Chend0ae96c2019-09-24 19:05:17285 title: ls`Googlebot`,
Blink Reformat4c46d092018-04-07 15:32:37286 values: [
Christy Chend0ae96c2019-09-24 19:05:17287 {title: ls`Googlebot`, value: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'}, {
Zoe Clifford0734a8b2019-12-03 22:36:47288 title: ls`Googlebot Desktop`,
289 value:
290 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/%s Safari/537.36'
291 },
292 {
Christy Chend0ae96c2019-09-24 19:05:17293 title: ls`Googlebot Smartphone`,
Blink Reformat4c46d092018-04-07 15:32:37294 value:
Zoe Clifford0734a8b2019-12-03 22:36:47295 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
Blink Reformat4c46d092018-04-07 15:32:37296 }
297 ]
298 },
299 {
Christy Chend0ae96c2019-09-24 19:05:17300 title: ls`Internet Explorer`,
Blink Reformat4c46d092018-04-07 15:32:37301 values: [
Christy Chend0ae96c2019-09-24 19:05:17302 {title: ls`Internet Explorer 11`, value: 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'},
303 {
304 title: ls`Internet Explorer 10`,
305 value: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
306 },
307 {title: ls`Internet Explorer 9`, value: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'},
308 {title: ls`Internet Explorer 8`, value: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'},
309 {title: ls`Internet Explorer 7`, value: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
Blink Reformat4c46d092018-04-07 15:32:37310 ]
311 },
312 {
Christy Chend0ae96c2019-09-24 19:05:17313 title: ls`Microsoft Edge`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16314 values: [
315 {
Christy Chend0ae96c2019-09-24 19:05:17316 title: ls`Microsoft Edge (Chromium) \u2014 Windows`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16317 value:
318 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36 Edg/%s'
319 },
320 {
Christy Chend0ae96c2019-09-24 19:05:17321 title: ls`Microsoft Edge (Chromium) \u2014 Mac`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16322 value:
Mathias Bynensfbf36962019-12-03 12:14:59323 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Chrome/%s Safari/604.1 Edg/%s'
Mike Jacksonc8f2c9e2019-08-08 22:51:16324 },
325 {
Christy Chend0ae96c2019-09-24 19:05:17326 title: ls`Microsoft Edge \u2014 iPhone`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16327 value:
328 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 EdgiOS/44.5.0.10 Mobile/15E148 Safari/604.1'
329 },
330 {
Christy Chend0ae96c2019-09-24 19:05:17331 title: ls`Microsoft Edge \u2014 iPad`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16332 value:
333 'Mozilla/5.0 (iPad; CPU OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/44.5.2 Mobile/15E148 Safari/605.1.15'
334 },
335 {
Christy Chend0ae96c2019-09-24 19:05:17336 title: ls`Microsoft Edge \u2014 Android Mobile`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16337 value:
338 'Mozilla/5.0 (Linux; Android 8.1.0; Pixel Build/OPM4.171019.021.D1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 EdgA/42.0.0.2057'
339 },
340 {
Christy Chend0ae96c2019-09-24 19:05:17341 title: ls`Microsoft Edge \u2014 Android Tablet`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16342 value:
343 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Safari/537.36 EdgA/42.0.0.2057'
344 },
345 {
Christy Chend0ae96c2019-09-24 19:05:17346 title: ls`Microsoft Edge (EdgeHTML) \u2014 Windows`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16347 value:
348 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'
349 },
350 {
Christy Chend0ae96c2019-09-24 19:05:17351 title: ls`Microsoft Edge (EdgeHTML) \u2014 XBox`,
Mike Jacksonc8f2c9e2019-08-08 22:51:16352 value:
353 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'
354 }
355 ]
356 },
357 {
Christy Chend0ae96c2019-09-24 19:05:17358 title: ls`Opera`,
Blink Reformat4c46d092018-04-07 15:32:37359 values: [
360 {
Christy Chend0ae96c2019-09-24 19:05:17361 title: ls`Opera \u2014 Mac`,
Blink Reformat4c46d092018-04-07 15:32:37362 value:
Mathias Bynensfbf36962019-12-03 12:14:59363 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 OPR/65.0.3467.48'
Blink Reformat4c46d092018-04-07 15:32:37364 },
365 {
Christy Chend0ae96c2019-09-24 19:05:17366 title: ls`Opera \u2014 Windows`,
Blink Reformat4c46d092018-04-07 15:32:37367 value:
Mathias Bynensfbf36962019-12-03 12:14:59368 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 OPR/65.0.3467.48'
Blink Reformat4c46d092018-04-07 15:32:37369 },
370 {
Christy Chend0ae96c2019-09-24 19:05:17371 title: ls`Opera (Presto) \u2014 Mac`,
Blink Reformat4c46d092018-04-07 15:32:37372 value: 'Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16'
373 },
Christy Chend0ae96c2019-09-24 19:05:17374 {title: ls`Opera (Presto) \u2014 Windows`, value: 'Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16'}, {
375 title: ls`Opera Mobile \u2014 Android Mobile`,
Blink Reformat4c46d092018-04-07 15:32:37376 value: 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02'
377 },
378 {
Christy Chend0ae96c2019-09-24 19:05:17379 title: ls`Opera Mini \u2014 iOS`,
Blink Reformat4c46d092018-04-07 15:32:37380 value: 'Opera/9.80 (iPhone; Opera Mini/8.0.0/34.2336; U; en) Presto/2.8.119 Version/11.10'
381 }
382 ]
383 },
384 {
Christy Chend0ae96c2019-09-24 19:05:17385 title: ls`Safari`,
Blink Reformat4c46d092018-04-07 15:32:37386 values: [
387 {
Mathias Bynensd5698062019-12-04 09:08:14388 title: ls`Safari \u2014 iPad iOS 13.2`,
Blink Reformat4c46d092018-04-07 15:32:37389 value:
Mathias Bynensd5698062019-12-04 09:08:14390 'Mozilla/5.0 (iPad; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
Blink Reformat4c46d092018-04-07 15:32:37391 },
392 {
Mathias Bynensd5698062019-12-04 09:08:14393 title: ls`Safari \u2014 iPhone iOS 13.2`,
Blink Reformat4c46d092018-04-07 15:32:37394 value:
Mathias Bynensd5698062019-12-04 09:08:14395 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
Blink Reformat4c46d092018-04-07 15:32:37396 },
397 {
Christy Chend0ae96c2019-09-24 19:05:17398 title: ls`Safari \u2014 Mac`,
Blink Reformat4c46d092018-04-07 15:32:37399 value:
Mathias Bynensd5698062019-12-04 09:08:14400 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Safari/605.1.15'
Blink Reformat4c46d092018-04-07 15:32:37401 }
402 ]
403 },
404 {
Christy Chend0ae96c2019-09-24 19:05:17405 title: ls`UC Browser`,
Blink Reformat4c46d092018-04-07 15:32:37406 values: [
407 {
Christy Chend0ae96c2019-09-24 19:05:17408 title: ls`UC Browser \u2014 Android Mobile`,
Blink Reformat4c46d092018-04-07 15:32:37409 value:
Erik Luo4da6ecb2019-04-11 21:39:04410 'Mozilla/5.0 (Linux; U; Android 8.1.0; en-US; Nexus 6P Build/OPM7.181205.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.11.1.1197 Mobile Safari/537.36'
Blink Reformat4c46d092018-04-07 15:32:37411 },
412 {
Christy Chend0ae96c2019-09-24 19:05:17413 title: ls`UC Browser \u2014 iOS`,
Erik Luo4da6ecb2019-04-11 21:39:04414 value:
415 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/16B92 UCBrowser/12.1.7.1109 Mobile AliApp(TUnionSDK/0.1.20.3)'
Blink Reformat4c46d092018-04-07 15:32:37416 },
417 {
Christy Chend0ae96c2019-09-24 19:05:17418 title: ls`UC Browser \u2014 Windows Phone`,
Blink Reformat4c46d092018-04-07 15:32:37419 value:
Erik Luo4da6ecb2019-04-11 21:39:04420 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile'
Blink Reformat4c46d092018-04-07 15:32:37421 }
422 ]
423 }
424];