blob: cfe9efe867361705d06ffce0785b11f6060d35f3 [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371// Copyright 2014 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/* eslint-disable indent */
5(function(window) {
6
7 // DevToolsAPI ----------------------------------------------------------------
8
Blink Reformat4c46d092018-04-07 15:32:379 const DevToolsAPIImpl = class {
10 constructor() {
11 /**
12 * @type {number}
13 */
14 this._lastCallId = 0;
15
16 /**
17 * @type {!Object.<number, function(?Object)>}
18 */
19 this._callbacks = {};
Jeff Fisherac799a52019-06-25 21:47:0620
21 /**
22 * @type {!Array.<!ExtensionDescriptor>}
23 */
24 this._pendingExtensionDescriptors = [];
25
26 /**
27 * @type {?function(!ExtensionDescriptor)}
28 */
29 this._addExtensionCallback = null;
Andrey Kosyakovad413282021-08-31 18:53:4330
31 /**
Danil Somsikov1f747672022-02-02 10:44:4432 * @type {!Array<string>}
33 */
34 this._originsForbiddenForExtensions = [];
35
36 /**
Andrey Kosyakovad413282021-08-31 18:53:4337 * @type {!Promise<string>}
38 */
39 this._initialTargetIdPromise = new Promise(resolve => {
40 this._setInitialTargetId = resolve;
41 });
Blink Reformat4c46d092018-04-07 15:32:3742 }
43
44 /**
45 * @param {number} id
46 * @param {?Object} arg
47 */
48 embedderMessageAck(id, arg) {
49 const callback = this._callbacks[id];
50 delete this._callbacks[id];
Tim van der Lippe1d6e57a2019-09-30 11:55:3451 if (callback) {
Blink Reformat4c46d092018-04-07 15:32:3752 callback(arg);
Tim van der Lippe1d6e57a2019-09-30 11:55:3453 }
Blink Reformat4c46d092018-04-07 15:32:3754 }
55
56 /**
57 * @param {string} method
58 * @param {!Array.<*>} args
59 * @param {?function(?Object)} callback
60 */
61 sendMessageToEmbedder(method, args, callback) {
62 const callId = ++this._lastCallId;
Tim van der Lippe1d6e57a2019-09-30 11:55:3463 if (callback) {
Blink Reformat4c46d092018-04-07 15:32:3764 this._callbacks[callId] = callback;
Tim van der Lippe1d6e57a2019-09-30 11:55:3465 }
Blink Reformat4c46d092018-04-07 15:32:3766 const message = {'id': callId, 'method': method};
Tim van der Lippe1d6e57a2019-09-30 11:55:3467 if (args.length) {
Blink Reformat4c46d092018-04-07 15:32:3768 message.params = args;
Tim van der Lippe1d6e57a2019-09-30 11:55:3469 }
Blink Reformat4c46d092018-04-07 15:32:3770 DevToolsHost.sendMessageToEmbedder(JSON.stringify(message));
71 }
72
73 /**
74 * @param {string} method
75 * @param {!Array<*>} args
76 */
77 _dispatchOnInspectorFrontendAPI(method, args) {
78 const inspectorFrontendAPI = /** @type {!Object<string, function()>} */ (window['InspectorFrontendAPI']);
79 inspectorFrontendAPI[method].apply(inspectorFrontendAPI, args);
80 }
81
82 // API methods below this line --------------------------------------------
83
84 /**
85 * @param {!Array.<!ExtensionDescriptor>} extensions
86 */
87 addExtensions(extensions) {
88 // Support for legacy front-ends (<M41).
89 if (window['WebInspector'] && window['WebInspector']['addExtensions']) {
90 window['WebInspector']['addExtensions'](extensions);
Jeff Fisherac799a52019-06-25 21:47:0691 } else {
Blink Reformat4c46d092018-04-07 15:32:3792 // The addExtensions command is sent as the onload event happens for
Jeff Fisherac799a52019-06-25 21:47:0693 // DevTools front-end. We should buffer this command until the frontend
94 // is ready for it.
Tim van der Lippe1d6e57a2019-09-30 11:55:3495 if (this._addExtensionCallback) {
Jeff Fisherac799a52019-06-25 21:47:0696 extensions.forEach(this._addExtensionCallback);
Tim van der Lippe1d6e57a2019-09-30 11:55:3497 } else {
Simon Zünd1facecf2020-01-16 08:08:3598 this._pendingExtensionDescriptors.push(...extensions);
Tim van der Lippe1d6e57a2019-09-30 11:55:3499 }
Blink Reformat4c46d092018-04-07 15:32:37100 }
101 }
102
103 /**
Danil Somsikov1f747672022-02-02 10:44:44104 * @param {!Array<string>} forbiddenOrigins
105 */
106 setOriginsForbiddenForExtensions(forbiddenOrigins) {
107 this._originsForbiddenForExtensions = forbiddenOrigins;
108 }
109
110 /**
111 * @return {!Array<string>}
112 */
113 getOriginsForbiddenForExtensions() {
114 return this._originsForbiddenForExtensions;
115 }
116
117 /**
Blink Reformat4c46d092018-04-07 15:32:37118 * @param {string} url
119 */
120 appendedToURL(url) {
121 this._dispatchOnInspectorFrontendAPI('appendedToURL', [url]);
122 }
123
124 /**
125 * @param {string} url
126 */
127 canceledSaveURL(url) {
128 this._dispatchOnInspectorFrontendAPI('canceledSaveURL', [url]);
129 }
130
131 contextMenuCleared() {
132 this._dispatchOnInspectorFrontendAPI('contextMenuCleared', []);
133 }
134
135 /**
136 * @param {string} id
137 */
138 contextMenuItemSelected(id) {
139 this._dispatchOnInspectorFrontendAPI('contextMenuItemSelected', [id]);
140 }
141
142 /**
143 * @param {number} count
144 */
145 deviceCountUpdated(count) {
146 this._dispatchOnInspectorFrontendAPI('deviceCountUpdated', [count]);
147 }
148
149 /**
150 * @param {!Adb.Config} config
151 */
152 devicesDiscoveryConfigChanged(config) {
153 this._dispatchOnInspectorFrontendAPI('devicesDiscoveryConfigChanged', [config]);
154 }
155
156 /**
157 * @param {!Adb.PortForwardingStatus} status
158 */
159 devicesPortForwardingStatusChanged(status) {
160 this._dispatchOnInspectorFrontendAPI('devicesPortForwardingStatusChanged', [status]);
161 }
162
163 /**
164 * @param {!Array.<!Adb.Device>} devices
165 */
166 devicesUpdated(devices) {
167 this._dispatchOnInspectorFrontendAPI('devicesUpdated', [devices]);
168 }
169
170 /**
171 * @param {string} message
172 */
173 dispatchMessage(message) {
174 this._dispatchOnInspectorFrontendAPI('dispatchMessage', [message]);
175 }
176
177 /**
178 * @param {string} messageChunk
179 * @param {number} messageSize
180 */
181 dispatchMessageChunk(messageChunk, messageSize) {
182 this._dispatchOnInspectorFrontendAPI('dispatchMessageChunk', [messageChunk, messageSize]);
183 }
184
185 enterInspectElementMode() {
186 this._dispatchOnInspectorFrontendAPI('enterInspectElementMode', []);
187 }
188
189 /**
190 * @param {!{r: number, g: number, b: number, a: number}} color
191 */
192 eyeDropperPickedColor(color) {
193 this._dispatchOnInspectorFrontendAPI('eyeDropperPickedColor', [color]);
194 }
195
196 /**
197 * @param {!Array.<!{fileSystemName: string, rootURL: string, fileSystemPath: string}>} fileSystems
198 */
199 fileSystemsLoaded(fileSystems) {
200 this._dispatchOnInspectorFrontendAPI('fileSystemsLoaded', [fileSystems]);
201 }
202
203 /**
204 * @param {string} fileSystemPath
205 */
206 fileSystemRemoved(fileSystemPath) {
207 this._dispatchOnInspectorFrontendAPI('fileSystemRemoved', [fileSystemPath]);
208 }
209
210 /**
211 * @param {?string} error
212 * @param {?{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} fileSystem
213 */
214 fileSystemAdded(error, fileSystem) {
215 this._dispatchOnInspectorFrontendAPI('fileSystemAdded', [error, fileSystem]);
216 }
217
218 /**
219 * @param {!Array<string>} changedPaths
220 * @param {!Array<string>} addedPaths
221 * @param {!Array<string>} removedPaths
222 */
223 fileSystemFilesChangedAddedRemoved(changedPaths, addedPaths, removedPaths) {
224 // Support for legacy front-ends (<M58)
225 if (window['InspectorFrontendAPI'] && window['InspectorFrontendAPI']['fileSystemFilesChanged']) {
226 this._dispatchOnInspectorFrontendAPI(
227 'fileSystemFilesChanged', [changedPaths.concat(addedPaths).concat(removedPaths)]);
228 } else {
229 this._dispatchOnInspectorFrontendAPI(
230 'fileSystemFilesChangedAddedRemoved', [changedPaths, addedPaths, removedPaths]);
231 }
232 }
233
234 /**
235 * @param {number} requestId
236 * @param {string} fileSystemPath
237 * @param {number} totalWork
238 */
239 indexingTotalWorkCalculated(requestId, fileSystemPath, totalWork) {
240 this._dispatchOnInspectorFrontendAPI('indexingTotalWorkCalculated', [requestId, fileSystemPath, totalWork]);
241 }
242
243 /**
244 * @param {number} requestId
245 * @param {string} fileSystemPath
246 * @param {number} worked
247 */
248 indexingWorked(requestId, fileSystemPath, worked) {
249 this._dispatchOnInspectorFrontendAPI('indexingWorked', [requestId, fileSystemPath, worked]);
250 }
251
252 /**
253 * @param {number} requestId
254 * @param {string} fileSystemPath
255 */
256 indexingDone(requestId, fileSystemPath) {
257 this._dispatchOnInspectorFrontendAPI('indexingDone', [requestId, fileSystemPath]);
258 }
259
260 /**
261 * @param {{type: string, key: string, code: string, keyCode: number, modifiers: number}} event
262 */
263 keyEventUnhandled(event) {
264 event.keyIdentifier = keyCodeToKeyIdentifier(event.keyCode);
265 this._dispatchOnInspectorFrontendAPI('keyEventUnhandled', [event]);
266 }
267
268 /**
Jeff Fisherac799a52019-06-25 21:47:06269 * @param {function(!ExtensionDescriptor)} callback
270 */
271 setAddExtensionCallback(callback) {
272 this._addExtensionCallback = callback;
273 if (this._pendingExtensionDescriptors.length) {
274 this._pendingExtensionDescriptors.forEach(this._addExtensionCallback);
275 this._pendingExtensionDescriptors = [];
276 }
277 }
278
Adithya Srinivasan7a133d22019-10-09 00:27:48279 reattachMainTarget() {
280 this._dispatchOnInspectorFrontendAPI('reattachMainTarget', []);
281 }
282
Jeff Fisherac799a52019-06-25 21:47:06283 /**
Blink Reformat4c46d092018-04-07 15:32:37284 * @param {boolean} hard
285 */
286 reloadInspectedPage(hard) {
287 this._dispatchOnInspectorFrontendAPI('reloadInspectedPage', [hard]);
288 }
289
290 /**
291 * @param {string} url
292 * @param {number} lineNumber
293 * @param {number} columnNumber
294 */
295 revealSourceLine(url, lineNumber, columnNumber) {
296 this._dispatchOnInspectorFrontendAPI('revealSourceLine', [url, lineNumber, columnNumber]);
297 }
298
299 /**
300 * @param {string} url
301 * @param {string=} fileSystemPath
302 */
303 savedURL(url, fileSystemPath) {
304 this._dispatchOnInspectorFrontendAPI('savedURL', [url, fileSystemPath]);
305 }
306
307 /**
308 * @param {number} requestId
309 * @param {string} fileSystemPath
310 * @param {!Array.<string>} files
311 */
312 searchCompleted(requestId, fileSystemPath, files) {
313 this._dispatchOnInspectorFrontendAPI('searchCompleted', [requestId, fileSystemPath, files]);
314 }
315
316 /**
317 * @param {string} tabId
318 */
319 setInspectedTabId(tabId) {
Tim van der Lippe647e33b2019-11-04 19:02:31320 this._inspectedTabIdValue = tabId;
321
Blink Reformat4c46d092018-04-07 15:32:37322 // Support for legacy front-ends (<M41).
Tim van der Lippe1d6e57a2019-09-30 11:55:34323 if (window['WebInspector'] && window['WebInspector']['setInspectedTabId']) {
Blink Reformat4c46d092018-04-07 15:32:37324 window['WebInspector']['setInspectedTabId'](tabId);
Tim van der Lippe1d6e57a2019-09-30 11:55:34325 } else {
Blink Reformat4c46d092018-04-07 15:32:37326 this._dispatchOnInspectorFrontendAPI('setInspectedTabId', [tabId]);
Tim van der Lippe1d6e57a2019-09-30 11:55:34327 }
Blink Reformat4c46d092018-04-07 15:32:37328 }
329
330 /**
Andrey Kosyakovad413282021-08-31 18:53:43331 * @param {string} targetId
332 */
333 setInitialTargetId(targetId) {
334 this._setInitialTargetId(targetId);
335 }
336
337 /**
Tim van der Lippe647e33b2019-11-04 19:02:31338 * @return {string|undefined}
339 */
340 getInspectedTabId() {
341 return this._inspectedTabIdValue;
342 }
343
344 /**
Blink Reformat4c46d092018-04-07 15:32:37345 * @param {boolean} useSoftMenu
346 */
347 setUseSoftMenu(useSoftMenu) {
348 this._dispatchOnInspectorFrontendAPI('setUseSoftMenu', [useSoftMenu]);
349 }
350
351 /**
352 * @param {string} panelName
353 */
354 showPanel(panelName) {
355 this._dispatchOnInspectorFrontendAPI('showPanel', [panelName]);
356 }
357
358 /**
359 * @param {number} id
360 * @param {string} chunk
361 * @param {boolean} encoded
362 */
363 streamWrite(id, chunk, encoded) {
364 this._dispatchOnInspectorFrontendAPI('streamWrite', [id, encoded ? this._decodeBase64(chunk) : chunk]);
365 }
366
367 /**
368 * @param {string} chunk
369 * @return {string}
370 */
371 _decodeBase64(chunk) {
372 const request = new XMLHttpRequest();
373 request.open('GET', 'data:text/plain;base64,' + chunk, false);
374 request.send(null);
375 if (request.status === 200) {
376 return request.responseText;
Blink Reformat4c46d092018-04-07 15:32:37377 }
Mathias Bynensf06e8c02020-02-28 13:58:28378 console.error('Error while decoding chunk in streamWrite');
379 return '';
Blink Reformat4c46d092018-04-07 15:32:37380 }
381 };
382
383 const DevToolsAPI = new DevToolsAPIImpl();
384 window.DevToolsAPI = DevToolsAPI;
385
386 // InspectorFrontendHostImpl --------------------------------------------------
387
388 /**
Sigurd Schneiderf8d81c42020-07-02 07:32:58389 * Enum for recordPerformanceHistogram
Changhao Han45d84732020-11-27 11:04:08390 * Warning: There is another definition of this enum in the DevTools code
Changhao Han03c48382020-09-14 21:17:50391 * base, keep them in sync:
Danil Somsikovf7c7c922021-09-30 13:25:14392 * front_end/core/host/InspectorFrontendHostAPI.ts
Sigurd Schneiderf8d81c42020-07-02 07:32:58393 * @readonly
394 * @enum {string}
395 */
396 const EnumeratedHistogram = {
397 ActionTaken: 'DevTools.ActionTaken',
Jose Leal Chapa1e1d9582020-07-30 18:39:25398 PanelClosed: 'DevTools.PanelClosed',
Sigurd Schneiderf8d81c42020-07-02 07:32:58399 PanelShown: 'DevTools.PanelShown',
Changhao Hanf51d0792020-08-26 11:30:15400 SidebarPaneShown: 'DevTools.SidebarPaneShown',
Sigurd Schneiderf8d81c42020-07-02 07:32:58401 KeyboardShortcutFired: 'DevTools.KeyboardShortcutFired',
Wolfgang Beyera175e1f2020-12-14 09:41:54402 IssueCreated: 'DevTools.IssueCreated',
Jesus David Garcia Gomez0c37bf02020-09-10 16:10:19403 IssuesPanelIssueExpanded: 'DevTools.IssuesPanelIssueExpanded',
Sigurd Schneiderf8d81c42020-07-02 07:32:58404 IssuesPanelOpenedFrom: 'DevTools.IssuesPanelOpenedFrom',
Jesus David Garcia Gomez0c37bf02020-09-10 16:10:19405 IssuesPanelResourceOpened: 'DevTools.IssuesPanelResourceOpened',
Sigurd Schneiderf8d81c42020-07-02 07:32:58406 KeybindSetSettingChanged: 'DevTools.KeybindSetSettingChanged',
Brandon Goddard413d1722020-08-10 17:51:26407 ExperimentEnabledAtLaunch: 'DevTools.ExperimentEnabledAtLaunch',
408 ExperimentEnabled: 'DevTools.ExperimentEnabled',
409 ExperimentDisabled: 'DevTools.ExperimentDisabled',
Sigurd Schneider8d627692021-01-12 12:25:31410 DeveloperResourceLoaded: 'DevTools.DeveloperResourceLoaded',
Sigurd Schneidera7099742021-01-20 08:22:36411 DeveloperResourceScheme: 'DevTools.DeveloperResourceScheme',
Benedikt Meurer55398c02021-03-02 08:15:15412 LinearMemoryInspectorRevealedFrom: 'DevTools.LinearMemoryInspector.RevealedFrom',
413 LinearMemoryInspectorTarget: 'DevTools.LinearMemoryInspector.Target',
Simon Zündf6a47f02021-08-25 07:22:53414 Language: 'DevTools.Language',
Danil Somsikovf7c7c922021-09-30 13:25:14415 ConsoleShowsCorsErrors: 'DevTools.ConsoleShowsCorsErrors',
Alex Rudenkoe3c100e2021-11-08 14:16:38416 RecordingEdited: 'DevTools.RecordingEdited',
417 RecordingExported: 'DevTools.RecordingExported',
418 RecordingReplayFinished: 'DevTools.RecordingReplayFinished',
419 RecordingReplayStarted: 'DevTools.RecordingReplayStarted',
420 RecordingToggled: 'DevTools.RecordingToggled',
Simon Zündda9ff392021-12-01 08:10:21421 SyncSetting: 'DevTools.SyncSetting',
Sigurd Schneiderf8d81c42020-07-02 07:32:58422 };
423
424 /**
Blink Reformat4c46d092018-04-07 15:32:37425 * @implements {InspectorFrontendHostAPI}
Blink Reformat4c46d092018-04-07 15:32:37426 */
427 const InspectorFrontendHostImpl = class {
428 /**
Blink Reformat4c46d092018-04-07 15:32:37429 * @return {string}
430 */
431 getSelectionBackgroundColor() {
Pavel Feldman33b40912018-12-22 01:08:02432 return '#6e86ff';
Blink Reformat4c46d092018-04-07 15:32:37433 }
434
435 /**
Blink Reformat4c46d092018-04-07 15:32:37436 * @return {string}
437 */
438 getSelectionForegroundColor() {
Pavel Feldman33b40912018-12-22 01:08:02439 return '#ffffff';
Blink Reformat4c46d092018-04-07 15:32:37440 }
441
442 /**
Blink Reformat4c46d092018-04-07 15:32:37443 * @return {string}
444 */
445 getInactiveSelectionBackgroundColor() {
Pavel Feldman33b40912018-12-22 01:08:02446 return '#c9c8c8';
Blink Reformat4c46d092018-04-07 15:32:37447 }
448
449 /**
Blink Reformat4c46d092018-04-07 15:32:37450 * @return {string}
451 */
452 getInactiveSelectionForegroundColor() {
Pavel Feldman33b40912018-12-22 01:08:02453 return '#323232';
Blink Reformat4c46d092018-04-07 15:32:37454 }
455
456 /**
457 * @override
458 * @return {string}
459 */
460 platform() {
461 return DevToolsHost.platform();
462 }
463
464 /**
465 * @override
466 */
467 loadCompleted() {
468 DevToolsAPI.sendMessageToEmbedder('loadCompleted', [], null);
469 // Support for legacy (<57) frontends.
470 if (window.Runtime && window.Runtime.queryParam) {
471 const panelToOpen = window.Runtime.queryParam('panel');
Tim van der Lippe1d6e57a2019-09-30 11:55:34472 if (panelToOpen) {
Blink Reformat4c46d092018-04-07 15:32:37473 window.DevToolsAPI.showPanel(panelToOpen);
Tim van der Lippe1d6e57a2019-09-30 11:55:34474 }
Blink Reformat4c46d092018-04-07 15:32:37475 }
476 }
477
478 /**
479 * @override
480 */
481 bringToFront() {
482 DevToolsAPI.sendMessageToEmbedder('bringToFront', [], null);
483 }
484
485 /**
486 * @override
487 */
488 closeWindow() {
489 DevToolsAPI.sendMessageToEmbedder('closeWindow', [], null);
490 }
491
492 /**
493 * @override
494 * @param {boolean} isDocked
495 * @param {function()} callback
496 */
497 setIsDocked(isDocked, callback) {
498 DevToolsAPI.sendMessageToEmbedder('setIsDocked', [isDocked], callback);
499 }
500
501 /**
Peter Marshall355af6a2020-10-30 14:00:40502 * @override
503 * @param {string} trigger
504 * @param {function(!InspectorFrontendHostAPI.ShowSurveyResult): void} callback
505 */
506 showSurvey(trigger, callback) {
507 DevToolsAPI.sendMessageToEmbedder('showSurvey', [trigger], /** @type {function(?Object)} */ (callback));
508 }
509
510 /**
511 * @override
512 * @param {string} trigger
513 * @param {function(!InspectorFrontendHostAPI.CanShowSurveyResult): void} callback
514 */
515 canShowSurvey(trigger, callback) {
516 DevToolsAPI.sendMessageToEmbedder('canShowSurvey', [trigger], /** @type {function(?Object)} */ (callback));
517 }
518
519 /**
Blink Reformat4c46d092018-04-07 15:32:37520 * Requests inspected page to be placed atop of the inspector frontend with specified bounds.
521 * @override
522 * @param {{x: number, y: number, width: number, height: number}} bounds
523 */
524 setInspectedPageBounds(bounds) {
525 DevToolsAPI.sendMessageToEmbedder('setInspectedPageBounds', [bounds], null);
526 }
527
528 /**
529 * @override
530 */
531 inspectElementCompleted() {
532 DevToolsAPI.sendMessageToEmbedder('inspectElementCompleted', [], null);
533 }
534
535 /**
536 * @override
537 * @param {string} url
538 * @param {string} headers
539 * @param {number} streamId
Peter Marshall355af6a2020-10-30 14:00:40540 * @param {function(!InspectorFrontendHostAPI.LoadNetworkResourceResult): void} callback
Blink Reformat4c46d092018-04-07 15:32:37541 */
542 loadNetworkResource(url, headers, streamId, callback) {
543 DevToolsAPI.sendMessageToEmbedder(
544 'loadNetworkResource', [url, headers, streamId], /** @type {function(?Object)} */ (callback));
545 }
546
547 /**
548 * @override
Simon Zünd2e067132021-09-30 09:01:13549 * @param {string} name
550 * @param {!{synced: (boolean|undefined)}} options
551 */
552 registerPreference(name, options) {
553 DevToolsAPI.sendMessageToEmbedder('registerPreference', [name, options], null);
554 }
555
556 /**
557 * @override
Blink Reformat4c46d092018-04-07 15:32:37558 * @param {function(!Object<string, string>)} callback
559 */
560 getPreferences(callback) {
561 DevToolsAPI.sendMessageToEmbedder('getPreferences', [], /** @type {function(?Object)} */ (callback));
562 }
563
564 /**
565 * @override
566 * @param {string} name
Alex Rudenkoa9a491e2022-01-11 09:39:35567 * @param {function(string)} callback
568 */
569 getPreference(name, callback) {
570 DevToolsAPI.sendMessageToEmbedder('getPreference', [name], /** @type {function(string)} */ (callback));
571 }
572
573 /**
574 * @override
575 * @param {string} name
Blink Reformat4c46d092018-04-07 15:32:37576 * @param {string} value
577 */
578 setPreference(name, value) {
579 DevToolsAPI.sendMessageToEmbedder('setPreference', [name, value], null);
580 }
581
582 /**
583 * @override
584 * @param {string} name
585 */
586 removePreference(name) {
587 DevToolsAPI.sendMessageToEmbedder('removePreference', [name], null);
588 }
589
590 /**
591 * @override
592 */
593 clearPreferences() {
594 DevToolsAPI.sendMessageToEmbedder('clearPreferences', [], null);
595 }
596
597 /**
598 * @override
Simon Zünd21ec5df2021-10-11 08:14:34599 * @param {!function(!InspectorFrontendHostAPI.SyncInformation):void} callback
600 */
601 getSyncInformation(callback) {
602 DevToolsAPI.sendMessageToEmbedder('getSyncInformation', [], callback);
603 }
604
605 /**
606 * @override
Blink Reformat4c46d092018-04-07 15:32:37607 * @param {string} origin
608 * @param {string} script
609 */
610 setInjectedScriptForOrigin(origin, script) {
611 DevToolsAPI.sendMessageToEmbedder('registerExtensionsAPI', [origin, script], null);
612 }
613
614 /**
615 * @override
616 * @param {string} url
617 */
618 inspectedURLChanged(url) {
619 DevToolsAPI.sendMessageToEmbedder('inspectedURLChanged', [url], null);
620 }
621
622 /**
623 * @override
624 * @param {string} text
625 */
626 copyText(text) {
627 DevToolsHost.copyText(text);
628 }
629
630 /**
631 * @override
632 * @param {string} url
633 */
634 openInNewTab(url) {
635 DevToolsAPI.sendMessageToEmbedder('openInNewTab', [url], null);
636 }
637
638 /**
639 * @override
640 * @param {string} fileSystemPath
641 */
642 showItemInFolder(fileSystemPath) {
643 DevToolsAPI.sendMessageToEmbedder('showItemInFolder', [fileSystemPath], null);
644 }
645
646 /**
647 * @override
648 * @param {string} url
649 * @param {string} content
650 * @param {boolean} forceSaveAs
651 */
652 save(url, content, forceSaveAs) {
653 DevToolsAPI.sendMessageToEmbedder('save', [url, content, forceSaveAs], null);
654 }
655
656 /**
657 * @override
658 * @param {string} url
659 * @param {string} content
660 */
661 append(url, content) {
662 DevToolsAPI.sendMessageToEmbedder('append', [url, content], null);
663 }
664
665 /**
666 * @override
Pavel Feldmanf1a36ee2018-07-28 16:10:25667 * @param {string} url
668 */
669 close(url) {
670 }
671
672 /**
673 * @override
Blink Reformat4c46d092018-04-07 15:32:37674 * @param {string} message
675 */
676 sendMessageToBackend(message) {
677 DevToolsAPI.sendMessageToEmbedder('dispatchProtocolMessage', [message], null);
678 }
679
680 /**
681 * @override
Sigurd Schneiderf8d81c42020-07-02 07:32:58682 * @param {!InspectorFrontendHostAPI.EnumeratedHistogram} actionName
Blink Reformat4c46d092018-04-07 15:32:37683 * @param {number} actionCode
684 * @param {number} bucketSize
685 */
686 recordEnumeratedHistogram(actionName, actionCode, bucketSize) {
Sigurd Schneiderf8d81c42020-07-02 07:32:58687 if (!Object.values(EnumeratedHistogram).includes(actionName)) {
Blink Reformat4c46d092018-04-07 15:32:37688 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34689 }
Blink Reformat4c46d092018-04-07 15:32:37690 DevToolsAPI.sendMessageToEmbedder('recordEnumeratedHistogram', [actionName, actionCode, bucketSize], null);
691 }
692
693 /**
694 * @override
James Lissiakd2f1a2f2019-03-26 17:36:51695 * @param {string} histogramName
696 * @param {number} duration
697 */
698 recordPerformanceHistogram(histogramName, duration) {
699 DevToolsAPI.sendMessageToEmbedder('recordPerformanceHistogram', [histogramName, duration], null);
700 }
701
702 /**
703 * @override
James Lissiake21c97b2019-04-29 17:36:43704 * @param {string} umaName
705 */
706 recordUserMetricsAction(umaName) {
707 DevToolsAPI.sendMessageToEmbedder('recordUserMetricsAction', [umaName], null);
708 }
709
710 /**
711 * @override
Blink Reformat4c46d092018-04-07 15:32:37712 */
713 requestFileSystems() {
714 DevToolsAPI.sendMessageToEmbedder('requestFileSystems', [], null);
715 }
716
717 /**
718 * @override
719 * @param {string=} type
720 */
721 addFileSystem(type) {
722 DevToolsAPI.sendMessageToEmbedder('addFileSystem', [type || ''], null);
723 }
724
725 /**
726 * @override
727 * @param {string} fileSystemPath
728 */
729 removeFileSystem(fileSystemPath) {
730 DevToolsAPI.sendMessageToEmbedder('removeFileSystem', [fileSystemPath], null);
731 }
732
733 /**
734 * @override
735 * @param {string} fileSystemId
736 * @param {string} registeredName
Tim van der Lipped71c22d2020-03-19 12:29:19737 * @return {?FileSystem}
Blink Reformat4c46d092018-04-07 15:32:37738 */
739 isolatedFileSystem(fileSystemId, registeredName) {
740 return DevToolsHost.isolatedFileSystem(fileSystemId, registeredName);
741 }
742
743 /**
744 * @override
745 * @param {!FileSystem} fileSystem
746 */
747 upgradeDraggedFileSystemPermissions(fileSystem) {
748 DevToolsHost.upgradeDraggedFileSystemPermissions(fileSystem);
749 }
750
751 /**
752 * @override
753 * @param {number} requestId
754 * @param {string} fileSystemPath
755 * @param {string} excludedFolders
756 */
757 indexPath(requestId, fileSystemPath, excludedFolders) {
758 // |excludedFolders| added in M67. For backward compatibility,
759 // pass empty array.
760 excludedFolders = excludedFolders || '[]';
761 DevToolsAPI.sendMessageToEmbedder('indexPath', [requestId, fileSystemPath, excludedFolders], null);
762 }
763
764 /**
765 * @override
766 * @param {number} requestId
767 */
768 stopIndexing(requestId) {
769 DevToolsAPI.sendMessageToEmbedder('stopIndexing', [requestId], null);
770 }
771
772 /**
773 * @override
774 * @param {number} requestId
775 * @param {string} fileSystemPath
776 * @param {string} query
777 */
778 searchInPath(requestId, fileSystemPath, query) {
779 DevToolsAPI.sendMessageToEmbedder('searchInPath', [requestId, fileSystemPath, query], null);
780 }
781
782 /**
783 * @override
784 * @return {number}
785 */
786 zoomFactor() {
787 return DevToolsHost.zoomFactor();
788 }
789
790 /**
791 * @override
792 */
793 zoomIn() {
794 DevToolsAPI.sendMessageToEmbedder('zoomIn', [], null);
795 }
796
797 /**
798 * @override
799 */
800 zoomOut() {
801 DevToolsAPI.sendMessageToEmbedder('zoomOut', [], null);
802 }
803
804 /**
805 * @override
806 */
807 resetZoom() {
808 DevToolsAPI.sendMessageToEmbedder('resetZoom', [], null);
809 }
810
811 /**
812 * @override
813 * @param {string} shortcuts
814 */
815 setWhitelistedShortcuts(shortcuts) {
816 DevToolsAPI.sendMessageToEmbedder('setWhitelistedShortcuts', [shortcuts], null);
817 }
818
819 /**
820 * @override
821 * @param {boolean} active
822 */
823 setEyeDropperActive(active) {
824 DevToolsAPI.sendMessageToEmbedder('setEyeDropperActive', [active], null);
825 }
826
827 /**
828 * @override
829 * @param {!Array<string>} certChain
830 */
831 showCertificateViewer(certChain) {
832 DevToolsAPI.sendMessageToEmbedder('showCertificateViewer', [JSON.stringify(certChain)], null);
833 }
834
835 /**
Connor Clarkca8905e2019-08-23 18:35:10836 * Only needed to run Lighthouse on old devtools.
Blink Reformat4c46d092018-04-07 15:32:37837 * @override
838 * @param {function()} callback
839 */
840 reattach(callback) {
841 DevToolsAPI.sendMessageToEmbedder('reattach', [], callback);
842 }
843
844 /**
845 * @override
846 */
847 readyForTest() {
848 DevToolsAPI.sendMessageToEmbedder('readyForTest', [], null);
849 }
850
851 /**
852 * @override
853 */
854 connectionReady() {
855 DevToolsAPI.sendMessageToEmbedder('connectionReady', [], null);
856 }
857
858 /**
859 * @override
860 * @param {boolean} value
861 */
862 setOpenNewWindowForPopups(value) {
863 DevToolsAPI.sendMessageToEmbedder('setOpenNewWindowForPopups', [value], null);
864 }
865
866 /**
867 * @override
868 * @param {!Adb.Config} config
869 */
870 setDevicesDiscoveryConfig(config) {
871 DevToolsAPI.sendMessageToEmbedder(
872 'setDevicesDiscoveryConfig',
873 [
874 config.discoverUsbDevices, config.portForwardingEnabled, JSON.stringify(config.portForwardingConfig),
875 config.networkDiscoveryEnabled, JSON.stringify(config.networkDiscoveryConfig)
876 ],
877 null);
878 }
879
880 /**
881 * @override
882 * @param {boolean} enabled
883 */
884 setDevicesUpdatesEnabled(enabled) {
885 DevToolsAPI.sendMessageToEmbedder('setDevicesUpdatesEnabled', [enabled], null);
886 }
887
888 /**
889 * @override
890 * @param {string} pageId
891 * @param {string} action
892 */
893 performActionOnRemotePage(pageId, action) {
894 DevToolsAPI.sendMessageToEmbedder('performActionOnRemotePage', [pageId, action], null);
895 }
896
897 /**
898 * @override
899 * @param {string} browserId
900 * @param {string} url
901 */
902 openRemotePage(browserId, url) {
903 DevToolsAPI.sendMessageToEmbedder('openRemotePage', [browserId, url], null);
904 }
905
906 /**
907 * @override
908 */
909 openNodeFrontend() {
910 DevToolsAPI.sendMessageToEmbedder('openNodeFrontend', [], null);
911 }
912
913 /**
914 * @override
915 * @param {number} x
916 * @param {number} y
917 * @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
918 * @param {!Document} document
919 */
920 showContextMenuAtPoint(x, y, items, document) {
921 DevToolsHost.showContextMenuAtPoint(x, y, items, document);
922 }
923
924 /**
925 * @override
926 * @return {boolean}
927 */
928 isHostedMode() {
929 return DevToolsHost.isHostedMode();
930 }
931
Jeff Fisherac799a52019-06-25 21:47:06932 /**
933 * @override
934 * @param {function(!ExtensionDescriptor)} callback
935 */
936 setAddExtensionCallback(callback) {
937 DevToolsAPI.setAddExtensionCallback(callback);
938 }
939
Blink Reformat4c46d092018-04-07 15:32:37940 // Backward-compatible methods below this line --------------------------------------------
941
942 /**
943 * Support for legacy front-ends (<M65).
944 * @return {boolean}
945 */
946 isUnderTest() {
947 return false;
948 }
949
950 /**
951 * Support for legacy front-ends (<M50).
952 * @param {string} message
953 */
954 sendFrontendAPINotification(message) {
955 }
956
957 /**
958 * Support for legacy front-ends (<M41).
959 * @return {string}
960 */
961 port() {
962 return 'unknown';
963 }
964
965 /**
966 * Support for legacy front-ends (<M38).
967 * @param {number} zoomFactor
968 */
969 setZoomFactor(zoomFactor) {
970 }
971
972 /**
973 * Support for legacy front-ends (<M34).
974 */
975 sendMessageToEmbedder() {
976 }
977
978 /**
979 * Support for legacy front-ends (<M34).
980 * @param {string} dockSide
981 */
982 requestSetDockSide(dockSide) {
983 DevToolsAPI.sendMessageToEmbedder('setIsDocked', [dockSide !== 'undocked'], null);
984 }
985
986 /**
987 * Support for legacy front-ends (<M34).
988 * @return {boolean}
989 */
990 supportsFileSystems() {
991 return true;
992 }
993
994 /**
Blink Reformat4c46d092018-04-07 15:32:37995 * Support for legacy front-ends (<M44).
996 * @param {number} actionCode
997 */
998 recordActionTaken(actionCode) {
Sigurd Schneider7c3f3a62020-06-30 13:17:44999 // Do not record actions, as that may crash the DevTools renderer.
Blink Reformat4c46d092018-04-07 15:32:371000 }
1001
1002 /**
1003 * Support for legacy front-ends (<M44).
1004 * @param {number} panelCode
1005 */
1006 recordPanelShown(panelCode) {
Sigurd Schneider7c3f3a62020-06-30 13:17:441007 // Do not record actions, as that may crash the DevTools renderer.
Blink Reformat4c46d092018-04-07 15:32:371008 }
Andrey Kosyakovad413282021-08-31 18:53:431009
1010 /**
1011 * @return {!Promise<string>}
1012 */
1013 initialTargetId() {
1014 return DevToolsAPI._initialTargetIdPromise;
1015 }
Blink Reformat4c46d092018-04-07 15:32:371016 };
1017
1018 window.InspectorFrontendHost = new InspectorFrontendHostImpl();
1019
1020 // DevToolsApp ---------------------------------------------------------------
1021
1022 function installObjectObserve() {
1023 /** @type {!Array<string>} */
1024 const properties = [
1025 'advancedSearchConfig',
1026 'auditsPanelSplitViewState',
1027 'auditsSidebarWidth',
1028 'blockedURLs',
1029 'breakpoints',
1030 'cacheDisabled',
1031 'colorFormat',
1032 'consoleHistory',
1033 'consoleTimestampsEnabled',
1034 'cpuProfilerView',
1035 'cssSourceMapsEnabled',
1036 'currentDockState',
1037 'customColorPalette',
1038 'customDevicePresets',
1039 'customEmulatedDeviceList',
1040 'customFormatters',
1041 'customUserAgent',
1042 'databaseTableViewVisibleColumns',
1043 'dataGrid-cookiesTable',
1044 'dataGrid-DOMStorageItemsView',
1045 'debuggerSidebarHidden',
Blink Reformat4c46d092018-04-07 15:32:371046 'disablePausedStateOverlay',
1047 'domBreakpoints',
1048 'domWordWrap',
1049 'elementsPanelSplitViewState',
1050 'elementsSidebarWidth',
1051 'emulation.deviceHeight',
1052 'emulation.deviceModeValue',
1053 'emulation.deviceOrientationOverride',
1054 'emulation.deviceScale',
1055 'emulation.deviceScaleFactor',
1056 'emulation.deviceUA',
1057 'emulation.deviceWidth',
Mathias Bynens4e1cc672020-03-25 06:53:181058 'emulation.locationOverride',
Blink Reformat4c46d092018-04-07 15:32:371059 'emulation.showDeviceMode',
1060 'emulation.showRulers',
1061 'enableAsyncStackTraces',
1062 'eventListenerBreakpoints',
1063 'fileMappingEntries',
1064 'fileSystemMapping',
1065 'FileSystemViewSidebarWidth',
1066 'fileSystemViewSplitViewState',
1067 'filterBar-consoleView',
1068 'filterBar-networkPanel',
1069 'filterBar-promisePane',
1070 'filterBar-timelinePanel',
1071 'frameViewerHideChromeWindow',
1072 'heapSnapshotRetainersViewSize',
1073 'heapSnapshotSplitViewState',
1074 'hideCollectedPromises',
1075 'hideNetworkMessages',
1076 'highlightNodeOnHoverInOverlay',
Blink Reformat4c46d092018-04-07 15:32:371077 'inlineVariableValues',
1078 'Inspector.drawerSplitView',
1079 'Inspector.drawerSplitViewState',
1080 'InspectorView.panelOrder',
1081 'InspectorView.screencastSplitView',
1082 'InspectorView.screencastSplitViewState',
1083 'InspectorView.splitView',
1084 'InspectorView.splitViewState',
1085 'javaScriptDisabled',
1086 'jsSourceMapsEnabled',
1087 'lastActivePanel',
1088 'lastDockState',
1089 'lastSelectedSourcesSidebarPaneTab',
1090 'lastSnippetEvaluationIndex',
1091 'layerDetailsSplitView',
1092 'layerDetailsSplitViewState',
1093 'layersPanelSplitViewState',
1094 'layersShowInternalLayers',
1095 'layersSidebarWidth',
1096 'messageLevelFilters',
1097 'messageURLFilters',
1098 'monitoringXHREnabled',
1099 'navigatorGroupByFolder',
1100 'navigatorHidden',
1101 'networkColorCodeResourceTypes',
1102 'networkConditions',
1103 'networkConditionsCustomProfiles',
1104 'networkHideDataURL',
1105 'networkLogColumnsVisibility',
1106 'networkLogLargeRows',
1107 'networkLogShowOverview',
1108 'networkPanelSplitViewState',
1109 'networkRecordFilmStripSetting',
1110 'networkResourceTypeFilters',
1111 'networkShowPrimaryLoadWaterfall',
1112 'networkSidebarWidth',
1113 'openLinkHandler',
1114 'pauseOnCaughtException',
1115 'pauseOnExceptionEnabled',
1116 'preserveConsoleLog',
1117 'prettyPrintInfobarDisabled',
1118 'previouslyViewedFiles',
1119 'profilesPanelSplitViewState',
1120 'profilesSidebarWidth',
1121 'promiseStatusFilters',
1122 'recordAllocationStacks',
1123 'requestHeaderFilterSetting',
1124 'request-info-formData-category-expanded',
1125 'request-info-general-category-expanded',
1126 'request-info-queryString-category-expanded',
1127 'request-info-requestHeaders-category-expanded',
1128 'request-info-requestPayload-category-expanded',
1129 'request-info-responseHeaders-category-expanded',
1130 'resources',
1131 'resourcesLastSelectedItem',
1132 'resourcesPanelSplitViewState',
1133 'resourcesSidebarWidth',
1134 'resourceViewTab',
1135 'savedURLs',
1136 'screencastEnabled',
1137 'scriptsPanelNavigatorSidebarWidth',
1138 'searchInContentScripts',
1139 'selectedAuditCategories',
1140 'selectedColorPalette',
1141 'selectedProfileType',
1142 'shortcutPanelSwitch',
1143 'showAdvancedHeapSnapshotProperties',
1144 'showEventListenersForAncestors',
1145 'showFrameowkrListeners',
1146 'showHeaSnapshotObjectsHiddenProperties',
1147 'showInheritedComputedStyleProperties',
1148 'showMediaQueryInspector',
1149 'showNativeFunctionsInJSProfile',
1150 'showUAShadowDOM',
1151 'showWhitespacesInEditor',
1152 'sidebarPosition',
1153 'skipContentScripts',
1154 'skipStackFramesPattern',
1155 'sourceMapInfobarDisabled',
1156 'sourcesPanelDebuggerSidebarSplitViewState',
1157 'sourcesPanelNavigatorSplitViewState',
1158 'sourcesPanelSplitSidebarRatio',
1159 'sourcesPanelSplitViewState',
1160 'sourcesSidebarWidth',
1161 'standardEmulatedDeviceList',
1162 'StylesPaneSplitRatio',
1163 'stylesPaneSplitViewState',
1164 'textEditorAutocompletion',
1165 'textEditorAutoDetectIndent',
1166 'textEditorBracketMatching',
1167 'textEditorIndent',
Junyi Xiao89142cf2019-04-11 16:01:381168 'textEditorTabMovesFocus',
Blink Reformat4c46d092018-04-07 15:32:371169 'timelineCaptureFilmStrip',
1170 'timelineCaptureLayersAndPictures',
1171 'timelineCaptureMemory',
1172 'timelineCaptureNetwork',
1173 'timeline-details',
1174 'timelineEnableJSSampling',
1175 'timelineOverviewMode',
1176 'timelinePanelDetailsSplitViewState',
1177 'timelinePanelRecorsSplitViewState',
1178 'timelinePanelTimelineStackSplitViewState',
1179 'timelinePerspective',
1180 'timeline-split',
1181 'timelineTreeGroupBy',
1182 'timeline-view',
1183 'timelineViewMode',
1184 'uiTheme',
1185 'watchExpressions',
1186 'WebInspector.Drawer.lastSelectedView',
1187 'WebInspector.Drawer.showOnLoad',
1188 'workspaceExcludedFolders',
1189 'workspaceFolderExcludePattern',
1190 'workspaceInfobarDisabled',
1191 'workspaceMappingInfobarDisabled',
1192 'xhrBreakpoints'
1193 ];
1194
1195 /**
1196 * @this {!{_storage: Object, _name: string}}
1197 */
1198 function settingRemove() {
1199 this._storage[this._name] = undefined;
1200 }
1201
1202 /**
1203 * @param {!Object} object
1204 * @param {function(!Array<!{name: string}>)} observer
1205 */
1206 function objectObserve(object, observer) {
1207 if (window['WebInspector']) {
1208 const settingPrototype = /** @type {!Object} */ (window['WebInspector']['Setting']['prototype']);
Tim van der Lippe1d6e57a2019-09-30 11:55:341209 if (typeof settingPrototype['remove'] === 'function') {
Blink Reformat4c46d092018-04-07 15:32:371210 settingPrototype['remove'] = settingRemove;
Tim van der Lippe1d6e57a2019-09-30 11:55:341211 }
Blink Reformat4c46d092018-04-07 15:32:371212 }
1213 /** @type {!Set<string>} */
1214 const changedProperties = new Set();
1215 let scheduled = false;
1216
1217 function scheduleObserver() {
Tim van der Lippe1d6e57a2019-09-30 11:55:341218 if (scheduled) {
Blink Reformat4c46d092018-04-07 15:32:371219 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:341220 }
Blink Reformat4c46d092018-04-07 15:32:371221 scheduled = true;
Mathias Bynensa0d60452020-11-30 11:45:331222 queueMicrotask(callObserver);
Blink Reformat4c46d092018-04-07 15:32:371223 }
1224
1225 function callObserver() {
1226 scheduled = false;
1227 const changes = /** @type {!Array<!{name: string}>} */ ([]);
1228 changedProperties.forEach(function(name) {
1229 changes.push({name: name});
1230 });
1231 changedProperties.clear();
1232 observer.call(null, changes);
1233 }
1234
1235 /** @type {!Map<string, *>} */
1236 const storage = new Map();
1237
1238 /**
1239 * @param {string} property
1240 */
1241 function defineProperty(property) {
1242 if (property in object) {
1243 storage.set(property, object[property]);
1244 delete object[property];
1245 }
1246
1247 Object.defineProperty(object, property, {
1248 /**
1249 * @return {*}
1250 */
1251 get: function() {
1252 return storage.get(property);
1253 },
1254
1255 /**
1256 * @param {*} value
1257 */
1258 set: function(value) {
1259 storage.set(property, value);
1260 changedProperties.add(property);
1261 scheduleObserver();
1262 }
1263 });
1264 }
1265
Tim van der Lippe1d6e57a2019-09-30 11:55:341266 for (let i = 0; i < properties.length; ++i) {
Blink Reformat4c46d092018-04-07 15:32:371267 defineProperty(properties[i]);
Tim van der Lippe1d6e57a2019-09-30 11:55:341268 }
Blink Reformat4c46d092018-04-07 15:32:371269 }
1270
1271 window.Object.observe = objectObserve;
1272 }
1273
1274 /** @type {!Map<number, string>} */
1275 const staticKeyIdentifiers = new Map([
1276 [0x12, 'Alt'],
1277 [0x11, 'Control'],
1278 [0x10, 'Shift'],
1279 [0x14, 'CapsLock'],
1280 [0x5b, 'Win'],
1281 [0x5c, 'Win'],
1282 [0x0c, 'Clear'],
1283 [0x28, 'Down'],
1284 [0x23, 'End'],
1285 [0x0a, 'Enter'],
1286 [0x0d, 'Enter'],
1287 [0x2b, 'Execute'],
1288 [0x70, 'F1'],
1289 [0x71, 'F2'],
1290 [0x72, 'F3'],
1291 [0x73, 'F4'],
1292 [0x74, 'F5'],
1293 [0x75, 'F6'],
1294 [0x76, 'F7'],
1295 [0x77, 'F8'],
1296 [0x78, 'F9'],
1297 [0x79, 'F10'],
1298 [0x7a, 'F11'],
1299 [0x7b, 'F12'],
1300 [0x7c, 'F13'],
1301 [0x7d, 'F14'],
1302 [0x7e, 'F15'],
1303 [0x7f, 'F16'],
1304 [0x80, 'F17'],
1305 [0x81, 'F18'],
1306 [0x82, 'F19'],
1307 [0x83, 'F20'],
1308 [0x84, 'F21'],
1309 [0x85, 'F22'],
1310 [0x86, 'F23'],
1311 [0x87, 'F24'],
1312 [0x2f, 'Help'],
1313 [0x24, 'Home'],
1314 [0x2d, 'Insert'],
1315 [0x25, 'Left'],
1316 [0x22, 'PageDown'],
1317 [0x21, 'PageUp'],
1318 [0x13, 'Pause'],
1319 [0x2c, 'PrintScreen'],
1320 [0x27, 'Right'],
1321 [0x91, 'Scroll'],
1322 [0x29, 'Select'],
1323 [0x26, 'Up'],
1324 [0x2e, 'U+007F'], // Standard says that DEL becomes U+007F.
1325 [0xb0, 'MediaNextTrack'],
1326 [0xb1, 'MediaPreviousTrack'],
1327 [0xb2, 'MediaStop'],
1328 [0xb3, 'MediaPlayPause'],
1329 [0xad, 'VolumeMute'],
1330 [0xae, 'VolumeDown'],
1331 [0xaf, 'VolumeUp'],
1332 ]);
1333
1334 /**
1335 * @param {number} keyCode
1336 * @return {string}
1337 */
1338 function keyCodeToKeyIdentifier(keyCode) {
1339 let result = staticKeyIdentifiers.get(keyCode);
Tim van der Lippe1d6e57a2019-09-30 11:55:341340 if (result !== undefined) {
Blink Reformat4c46d092018-04-07 15:32:371341 return result;
Tim van der Lippe1d6e57a2019-09-30 11:55:341342 }
Blink Reformat4c46d092018-04-07 15:32:371343 result = 'U+';
1344 const hexString = keyCode.toString(16).toUpperCase();
Tim van der Lippe1d6e57a2019-09-30 11:55:341345 for (let i = hexString.length; i < 4; ++i) {
Blink Reformat4c46d092018-04-07 15:32:371346 result += '0';
Tim van der Lippe1d6e57a2019-09-30 11:55:341347 }
Blink Reformat4c46d092018-04-07 15:32:371348 result += hexString;
1349 return result;
1350 }
1351
1352 function installBackwardsCompatibility() {
Joel Einbinderf55cc942018-10-30 01:59:531353 const majorVersion = getRemoteMajorVersion();
Tim van der Lippe1d6e57a2019-09-30 11:55:341354 if (!majorVersion) {
Blink Reformat4c46d092018-04-07 15:32:371355 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:341356 }
Blink Reformat4c46d092018-04-07 15:32:371357
Joel Einbinderf55cc942018-10-30 01:59:531358 /** @type {!Array<string>} */
1359 const styleRules = [];
Joel Einbinder82b1d8e2018-12-08 01:01:371360 // Shadow DOM V0 polyfill
1361 if (majorVersion <= 73 && !Element.prototype.createShadowRoot) {
1362 Element.prototype.createShadowRoot = function() {
1363 try {
1364 return this.attachShadow({mode: 'open'});
1365 } catch (e) {
1366 // some elements we use to add shadow roots can no
1367 // longer have shadow roots.
1368 const fakeShadowHost = document.createElement('span');
1369 this.appendChild(fakeShadowHost);
1370 fakeShadowHost.className = 'fake-shadow-host';
1371 return fakeShadowHost.createShadowRoot();
1372 }
1373 };
1374
1375 const origAdd = DOMTokenList.prototype.add;
1376 DOMTokenList.prototype.add = function(...tokens) {
Tim van der Lippe1d6e57a2019-09-30 11:55:341377 if (tokens[0].startsWith('insertion-point') || tokens[0].startsWith('tabbed-pane-header')) {
Joel Einbinder82b1d8e2018-12-08 01:01:371378 this._myElement.slot = '.' + tokens[0];
Tim van der Lippe1d6e57a2019-09-30 11:55:341379 }
Joel Einbinder82b1d8e2018-12-08 01:01:371380 return origAdd.apply(this, tokens);
1381 };
1382
1383 const origCreateElement = Document.prototype.createElement;
1384 Document.prototype.createElement = function(tagName, ...rest) {
Tim van der Lippe1d6e57a2019-09-30 11:55:341385 if (tagName === 'content') {
Joel Einbinder82b1d8e2018-12-08 01:01:371386 tagName = 'slot';
Tim van der Lippe1d6e57a2019-09-30 11:55:341387 }
Joel Einbinder82b1d8e2018-12-08 01:01:371388 const element = origCreateElement.call(this, tagName, ...rest);
1389 element.classList._myElement = element;
1390 return element;
1391 };
1392
1393 Object.defineProperty(HTMLSlotElement.prototype, 'select', {
Paul Lewis90faf092020-09-02 07:50:341394 set(selector) {
Joel Einbinder82b1d8e2018-12-08 01:01:371395 this.name = selector;
1396 }
1397 });
Joel Einbinderb948ebc2018-12-12 02:01:121398 }
1399
1400 // Custom Elements V0 polyfill
Tim van der Lippeffa78622019-09-16 12:07:121401 if (majorVersion <= 73 && !Document.prototype.hasOwnProperty('registerElement')) {
Joel Einbinderb948ebc2018-12-12 02:01:121402 const fakeRegistry = new Map();
1403 Document.prototype.registerElement = function(typeExtension, options) {
1404 const {prototype, extends: localName} = options;
1405 const document = this;
1406 const callback = function() {
1407 const element = document.createElement(localName || typeExtension);
1408 const skip = new Set(['constructor', '__proto__']);
1409 for (const key of Object.keys(Object.getOwnPropertyDescriptors(prototype.__proto__ || {}))) {
Tim van der Lippe1d6e57a2019-09-30 11:55:341410 if (skip.has(key)) {
Joel Einbinderb948ebc2018-12-12 02:01:121411 continue;
Tim van der Lippe1d6e57a2019-09-30 11:55:341412 }
Joel Einbinderb948ebc2018-12-12 02:01:121413 element[key] = prototype[key];
1414 }
1415 element.setAttribute('is', typeExtension);
Tim van der Lippe1d6e57a2019-09-30 11:55:341416 if (element['createdCallback']) {
Joel Einbinderb948ebc2018-12-12 02:01:121417 element['createdCallback']();
Tim van der Lippe1d6e57a2019-09-30 11:55:341418 }
Joel Einbinderb948ebc2018-12-12 02:01:121419 return element;
1420 };
1421 fakeRegistry.set(typeExtension, callback);
1422 return callback;
1423 };
1424
1425 const origCreateElement = Document.prototype.createElement;
1426 Document.prototype.createElement = function(tagName, fakeCustomElementType) {
1427 const fakeConstructor = fakeRegistry.get(fakeCustomElementType);
Tim van der Lippe1d6e57a2019-09-30 11:55:341428 if (fakeConstructor) {
Joel Einbinderb948ebc2018-12-12 02:01:121429 return fakeConstructor();
Tim van der Lippe1d6e57a2019-09-30 11:55:341430 }
Joel Einbinderb948ebc2018-12-12 02:01:121431 return origCreateElement.call(this, tagName, fakeCustomElementType);
Joel Einbinder82b1d8e2018-12-08 01:01:371432 };
Pavel Feldman876d7182018-12-14 00:11:051433
1434 // DevTools front-ends mistakenly assume that
1435 // classList.toggle('a', undefined) works as
1436 // classList.toggle('a', false) rather than as
1437 // classList.toggle('a');
1438 const originalDOMTokenListToggle = DOMTokenList.prototype.toggle;
1439 DOMTokenList.prototype.toggle = function(token, force) {
Tim van der Lippe1d6e57a2019-09-30 11:55:341440 if (arguments.length === 1) {
Pavel Feldman876d7182018-12-14 00:11:051441 force = !this.contains(token);
Tim van der Lippe1d6e57a2019-09-30 11:55:341442 }
Tim van der Lipped7cfd142021-01-07 12:17:241443 return originalDOMTokenListToggle.call(this, token, Boolean(force));
Pavel Feldman876d7182018-12-14 00:11:051444 };
Joel Einbinder82b1d8e2018-12-08 01:01:371445 }
Blink Reformat4c46d092018-04-07 15:32:371446
Joel Einbinderf55cc942018-10-30 01:59:531447 if (majorVersion <= 66) {
1448 /** @type {(!function(number, number):Element|undefined)} */
1449 ShadowRoot.prototype.__originalShadowRootElementFromPoint;
1450
1451 if (!ShadowRoot.prototype.__originalShadowRootElementFromPoint) {
1452 ShadowRoot.prototype.__originalShadowRootElementFromPoint = ShadowRoot.prototype.elementFromPoint;
1453 /**
1454 * @param {number} x
1455 * @param {number} y
1456 * @return {Element}
1457 */
1458 ShadowRoot.prototype.elementFromPoint = function(x, y) {
1459 const originalResult = ShadowRoot.prototype.__originalShadowRootElementFromPoint.apply(this, arguments);
Tim van der Lippe1d6e57a2019-09-30 11:55:341460 if (this.host && originalResult === this.host) {
Joel Einbinderf55cc942018-10-30 01:59:531461 return null;
Tim van der Lippe1d6e57a2019-09-30 11:55:341462 }
Joel Einbinderf55cc942018-10-30 01:59:531463 return originalResult;
1464 };
1465 }
Blink Reformat4c46d092018-04-07 15:32:371466 }
1467
Joel Einbinderf55cc942018-10-30 01:59:531468 if (majorVersion <= 53) {
Blink Reformat4c46d092018-04-07 15:32:371469 Object.defineProperty(window.KeyboardEvent.prototype, 'keyIdentifier', {
1470 /**
1471 * @return {string}
1472 * @this {KeyboardEvent}
1473 */
1474 get: function() {
1475 return keyCodeToKeyIdentifier(this.keyCode);
1476 }
1477 });
1478 }
1479
Tim van der Lippe1d6e57a2019-09-30 11:55:341480 if (majorVersion <= 50) {
Joel Einbinderf55cc942018-10-30 01:59:531481 installObjectObserve();
Tim van der Lippe1d6e57a2019-09-30 11:55:341482 }
Blink Reformat4c46d092018-04-07 15:32:371483
Joel Einbinderf55cc942018-10-30 01:59:531484 if (majorVersion <= 45) {
1485 /**
1486 * @param {string} property
1487 * @return {!CSSValue|null}
1488 * @this {CSSStyleDeclaration}
1489 */
1490 function getValue(property) {
1491 // Note that |property| comes from another context, so we can't use === here.
1492 // eslint-disable-next-line eqeqeq
1493 if (property == 'padding-left') {
1494 return /** @type {!CSSValue} */ ({
1495 /**
1496 * @return {number}
1497 * @this {!{__paddingLeft: number}}
1498 */
1499 getFloatValue: function() {
1500 return this.__paddingLeft;
1501 },
1502 __paddingLeft: parseFloat(this.paddingLeft)
1503 });
1504 }
1505 throw new Error('getPropertyCSSValue is undefined');
Blink Reformat4c46d092018-04-07 15:32:371506 }
Joel Einbinderf55cc942018-10-30 01:59:531507
1508 window.CSSStyleDeclaration.prototype.getPropertyCSSValue = getValue;
1509
1510 function CSSPrimitiveValue() {
1511 }
1512 CSSPrimitiveValue.CSS_PX = 5;
1513 window.CSSPrimitiveValue = CSSPrimitiveValue;
Blink Reformat4c46d092018-04-07 15:32:371514 }
1515
Tim van der Lippe1d6e57a2019-09-30 11:55:341516 if (majorVersion <= 45) {
Joel Einbinderf55cc942018-10-30 01:59:531517 styleRules.push('* { min-width: 0; min-height: 0; }');
Tim van der Lippe1d6e57a2019-09-30 11:55:341518 }
Blink Reformat4c46d092018-04-07 15:32:371519
Christian Biesinger2d1b2e92018-11-06 01:18:251520 if (majorVersion <= 71) {
1521 styleRules.push(
1522 '.coverage-toolbar-container, .animation-timeline-toolbar-container, .computed-properties { flex-basis: auto; }');
1523 }
Blink Reformat4c46d092018-04-07 15:32:371524
Tim van der Lippe1d6e57a2019-09-30 11:55:341525 if (majorVersion <= 50) {
Joel Einbinderf55cc942018-10-30 01:59:531526 Event.prototype.deepPath = undefined;
Tim van der Lippe1d6e57a2019-09-30 11:55:341527 }
Blink Reformat4c46d092018-04-07 15:32:371528
Joel Einbinderf55cc942018-10-30 01:59:531529 if (majorVersion <= 54) {
1530 window.FileError = /** @type {!function (new: FileError) : ?} */ ({
1531 NOT_FOUND_ERR: DOMException.NOT_FOUND_ERR,
1532 ABORT_ERR: DOMException.ABORT_ERR,
1533 INVALID_MODIFICATION_ERR: DOMException.INVALID_MODIFICATION_ERR,
1534 NOT_READABLE_ERR: 0 // No matching DOMException, so code will be 0.
1535 });
1536 }
Blink Reformat4c46d092018-04-07 15:32:371537
Joel Einbinderf55cc942018-10-30 01:59:531538 installExtraStyleRules(styleRules);
1539 }
Blink Reformat4c46d092018-04-07 15:32:371540
Joel Einbinderf55cc942018-10-30 01:59:531541 /**
1542 * @return {?number}
1543 */
1544 function getRemoteMajorVersion() {
1545 try {
Joel Einbinder09f48742019-02-28 01:34:421546 const remoteVersion = new URLSearchParams(window.location.search).get('remoteVersion');
Tim van der Lippe1d6e57a2019-09-30 11:55:341547 if (!remoteVersion) {
Joel Einbinderf55cc942018-10-30 01:59:531548 return null;
Tim van der Lippe1d6e57a2019-09-30 11:55:341549 }
Joel Einbinderf55cc942018-10-30 01:59:531550 const majorVersion = parseInt(remoteVersion.split('.')[0], 10);
1551 return majorVersion;
Joel Einbinder31904782018-11-02 20:52:271552 } catch (e) {
Joel Einbinderf55cc942018-10-30 01:59:531553 return null;
1554 }
1555 }
1556
1557 /**
1558 * @param {!Array<string>} styleRules
1559 */
1560 function installExtraStyleRules(styleRules) {
Tim van der Lippe1d6e57a2019-09-30 11:55:341561 if (!styleRules.length) {
Joel Einbinderf55cc942018-10-30 01:59:531562 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:341563 }
Joel Einbinderf55cc942018-10-30 01:59:531564 const styleText = styleRules.join('\n');
1565 document.head.appendChild(createStyleElement(styleText));
1566
1567 const origCreateShadowRoot = HTMLElement.prototype.createShadowRoot;
1568 HTMLElement.prototype.createShadowRoot = function(...args) {
1569 const shadowRoot = origCreateShadowRoot.call(this, ...args);
1570 shadowRoot.appendChild(createStyleElement(styleText));
1571 return shadowRoot;
1572 };
1573 }
1574
1575 /**
1576 * @param {string} styleText
1577 * @return {!Element}
1578 */
1579 function createStyleElement(styleText) {
1580 const style = document.createElement('style');
Joel Einbinderf55cc942018-10-30 01:59:531581 style.textContent = styleText;
1582 return style;
Blink Reformat4c46d092018-04-07 15:32:371583 }
1584
Joel Einbinderb948ebc2018-12-12 02:01:121585 installBackwardsCompatibility();
Blink Reformat4c46d092018-04-07 15:32:371586
Blink Reformat4c46d092018-04-07 15:32:371587})(window);