123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506 |
- // Copyright 2014 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- /* eslint-disable indent */
- (function(window) {
- // DevToolsAPI ----------------------------------------------------------------
- /**
- * @unrestricted
- */
- const DevToolsAPIImpl = class {
- constructor() {
- /**
- * @type {number}
- */
- this._lastCallId = 0;
- /**
- * @type {!Object.<number, function(?Object)>}
- */
- this._callbacks = {};
- /**
- * @type {!Array.<!ExtensionDescriptor>}
- */
- this._pendingExtensionDescriptors = [];
- /**
- * @type {?function(!ExtensionDescriptor)}
- */
- this._addExtensionCallback = null;
- }
- /**
- * @param {number} id
- * @param {?Object} arg
- */
- embedderMessageAck(id, arg) {
- const callback = this._callbacks[id];
- delete this._callbacks[id];
- if (callback) {
- callback(arg);
- }
- }
- /**
- * @param {string} method
- * @param {!Array.<*>} args
- * @param {?function(?Object)} callback
- */
- sendMessageToEmbedder(method, args, callback) {
- const callId = ++this._lastCallId;
- if (callback) {
- this._callbacks[callId] = callback;
- }
- const message = {'id': callId, 'method': method};
- if (args.length) {
- message.params = args;
- }
- DevToolsHost.sendMessageToEmbedder(JSON.stringify(message));
- }
- /**
- * @param {string} method
- * @param {!Array<*>} args
- */
- _dispatchOnInspectorFrontendAPI(method, args) {
- const inspectorFrontendAPI = /** @type {!Object<string, function()>} */ (window['InspectorFrontendAPI']);
- inspectorFrontendAPI[method].apply(inspectorFrontendAPI, args);
- }
- // API methods below this line --------------------------------------------
- /**
- * @param {!Array.<!ExtensionDescriptor>} extensions
- */
- addExtensions(extensions) {
- // Support for legacy front-ends (<M41).
- if (window['WebInspector'] && window['WebInspector']['addExtensions']) {
- window['WebInspector']['addExtensions'](extensions);
- } else {
- // The addExtensions command is sent as the onload event happens for
- // DevTools front-end. We should buffer this command until the frontend
- // is ready for it.
- if (this._addExtensionCallback) {
- extensions.forEach(this._addExtensionCallback);
- } else {
- this._pendingExtensionDescriptors.pushAll(extensions);
- }
- }
- }
- /**
- * @param {string} url
- */
- appendedToURL(url) {
- this._dispatchOnInspectorFrontendAPI('appendedToURL', [url]);
- }
- /**
- * @param {string} url
- */
- canceledSaveURL(url) {
- this._dispatchOnInspectorFrontendAPI('canceledSaveURL', [url]);
- }
- contextMenuCleared() {
- this._dispatchOnInspectorFrontendAPI('contextMenuCleared', []);
- }
- /**
- * @param {string} id
- */
- contextMenuItemSelected(id) {
- this._dispatchOnInspectorFrontendAPI('contextMenuItemSelected', [id]);
- }
- /**
- * @param {number} count
- */
- deviceCountUpdated(count) {
- this._dispatchOnInspectorFrontendAPI('deviceCountUpdated', [count]);
- }
- /**
- * @param {!Adb.Config} config
- */
- devicesDiscoveryConfigChanged(config) {
- this._dispatchOnInspectorFrontendAPI('devicesDiscoveryConfigChanged', [config]);
- }
- /**
- * @param {!Adb.PortForwardingStatus} status
- */
- devicesPortForwardingStatusChanged(status) {
- this._dispatchOnInspectorFrontendAPI('devicesPortForwardingStatusChanged', [status]);
- }
- /**
- * @param {!Array.<!Adb.Device>} devices
- */
- devicesUpdated(devices) {
- this._dispatchOnInspectorFrontendAPI('devicesUpdated', [devices]);
- }
- /**
- * @param {string} message
- */
- dispatchMessage(message) {
- this._dispatchOnInspectorFrontendAPI('dispatchMessage', [message]);
- }
- /**
- * @param {string} messageChunk
- * @param {number} messageSize
- */
- dispatchMessageChunk(messageChunk, messageSize) {
- this._dispatchOnInspectorFrontendAPI('dispatchMessageChunk', [messageChunk, messageSize]);
- }
- enterInspectElementMode() {
- this._dispatchOnInspectorFrontendAPI('enterInspectElementMode', []);
- }
- /**
- * @param {!{r: number, g: number, b: number, a: number}} color
- */
- eyeDropperPickedColor(color) {
- this._dispatchOnInspectorFrontendAPI('eyeDropperPickedColor', [color]);
- }
- /**
- * @param {!Array.<!{fileSystemName: string, rootURL: string, fileSystemPath: string}>} fileSystems
- */
- fileSystemsLoaded(fileSystems) {
- this._dispatchOnInspectorFrontendAPI('fileSystemsLoaded', [fileSystems]);
- }
- /**
- * @param {string} fileSystemPath
- */
- fileSystemRemoved(fileSystemPath) {
- this._dispatchOnInspectorFrontendAPI('fileSystemRemoved', [fileSystemPath]);
- }
- /**
- * @param {?string} error
- * @param {?{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} fileSystem
- */
- fileSystemAdded(error, fileSystem) {
- this._dispatchOnInspectorFrontendAPI('fileSystemAdded', [error, fileSystem]);
- }
- /**
- * @param {!Array<string>} changedPaths
- * @param {!Array<string>} addedPaths
- * @param {!Array<string>} removedPaths
- */
- fileSystemFilesChangedAddedRemoved(changedPaths, addedPaths, removedPaths) {
- // Support for legacy front-ends (<M58)
- if (window['InspectorFrontendAPI'] && window['InspectorFrontendAPI']['fileSystemFilesChanged']) {
- this._dispatchOnInspectorFrontendAPI(
- 'fileSystemFilesChanged', [changedPaths.concat(addedPaths).concat(removedPaths)]);
- } else {
- this._dispatchOnInspectorFrontendAPI(
- 'fileSystemFilesChangedAddedRemoved', [changedPaths, addedPaths, removedPaths]);
- }
- }
- /**
- * @param {number} requestId
- * @param {string} fileSystemPath
- * @param {number} totalWork
- */
- indexingTotalWorkCalculated(requestId, fileSystemPath, totalWork) {
- this._dispatchOnInspectorFrontendAPI('indexingTotalWorkCalculated', [requestId, fileSystemPath, totalWork]);
- }
- /**
- * @param {number} requestId
- * @param {string} fileSystemPath
- * @param {number} worked
- */
- indexingWorked(requestId, fileSystemPath, worked) {
- this._dispatchOnInspectorFrontendAPI('indexingWorked', [requestId, fileSystemPath, worked]);
- }
- /**
- * @param {number} requestId
- * @param {string} fileSystemPath
- */
- indexingDone(requestId, fileSystemPath) {
- this._dispatchOnInspectorFrontendAPI('indexingDone', [requestId, fileSystemPath]);
- }
- /**
- * @param {{type: string, key: string, code: string, keyCode: number, modifiers: number}} event
- */
- keyEventUnhandled(event) {
- event.keyIdentifier = keyCodeToKeyIdentifier(event.keyCode);
- this._dispatchOnInspectorFrontendAPI('keyEventUnhandled', [event]);
- }
- /**
- * @param {function(!ExtensionDescriptor)} callback
- */
- setAddExtensionCallback(callback) {
- this._addExtensionCallback = callback;
- if (this._pendingExtensionDescriptors.length) {
- this._pendingExtensionDescriptors.forEach(this._addExtensionCallback);
- this._pendingExtensionDescriptors = [];
- }
- }
- reattachMainTarget() {
- this._dispatchOnInspectorFrontendAPI('reattachMainTarget', []);
- }
- /**
- * @param {boolean} hard
- */
- reloadInspectedPage(hard) {
- this._dispatchOnInspectorFrontendAPI('reloadInspectedPage', [hard]);
- }
- /**
- * @param {string} url
- * @param {number} lineNumber
- * @param {number} columnNumber
- */
- revealSourceLine(url, lineNumber, columnNumber) {
- this._dispatchOnInspectorFrontendAPI('revealSourceLine', [url, lineNumber, columnNumber]);
- }
- /**
- * @param {string} url
- * @param {string=} fileSystemPath
- */
- savedURL(url, fileSystemPath) {
- this._dispatchOnInspectorFrontendAPI('savedURL', [url, fileSystemPath]);
- }
- /**
- * @param {number} requestId
- * @param {string} fileSystemPath
- * @param {!Array.<string>} files
- */
- searchCompleted(requestId, fileSystemPath, files) {
- this._dispatchOnInspectorFrontendAPI('searchCompleted', [requestId, fileSystemPath, files]);
- }
- /**
- * @param {string} tabId
- */
- setInspectedTabId(tabId) {
- this._inspectedTabIdValue = tabId;
- // Support for legacy front-ends (<M41).
- if (window['WebInspector'] && window['WebInspector']['setInspectedTabId']) {
- window['WebInspector']['setInspectedTabId'](tabId);
- } else {
- this._dispatchOnInspectorFrontendAPI('setInspectedTabId', [tabId]);
- }
- }
- /**
- * @return {string|undefined}
- */
- getInspectedTabId() {
- return this._inspectedTabIdValue;
- }
- /**
- * @param {boolean} useSoftMenu
- */
- setUseSoftMenu(useSoftMenu) {
- this._dispatchOnInspectorFrontendAPI('setUseSoftMenu', [useSoftMenu]);
- }
- /**
- * @param {string} panelName
- */
- showPanel(panelName) {
- this._dispatchOnInspectorFrontendAPI('showPanel', [panelName]);
- }
- /**
- * @param {number} id
- * @param {string} chunk
- * @param {boolean} encoded
- */
- streamWrite(id, chunk, encoded) {
- this._dispatchOnInspectorFrontendAPI('streamWrite', [id, encoded ? this._decodeBase64(chunk) : chunk]);
- }
- /**
- * @param {string} chunk
- * @return {string}
- */
- _decodeBase64(chunk) {
- const request = new XMLHttpRequest();
- request.open('GET', 'data:text/plain;base64,' + chunk, false);
- request.send(null);
- if (request.status === 200) {
- return request.responseText;
- } else {
- console.error('Error while decoding chunk in streamWrite');
- return '';
- }
- }
- };
- const DevToolsAPI = new DevToolsAPIImpl();
- window.DevToolsAPI = DevToolsAPI;
- // InspectorFrontendHostImpl --------------------------------------------------
- /**
- * @implements {InspectorFrontendHostAPI}
- * @unrestricted
- */
- const InspectorFrontendHostImpl = class {
- /**
- * @return {string}
- */
- getSelectionBackgroundColor() {
- return '#6e86ff';
- }
- /**
- * @return {string}
- */
- getSelectionForegroundColor() {
- return '#ffffff';
- }
- /**
- * @return {string}
- */
- getInactiveSelectionBackgroundColor() {
- return '#c9c8c8';
- }
- /**
- * @return {string}
- */
- getInactiveSelectionForegroundColor() {
- return '#323232';
- }
- /**
- * @override
- * @return {string}
- */
- platform() {
- return DevToolsHost.platform();
- }
- /**
- * @override
- */
- loadCompleted() {
- DevToolsAPI.sendMessageToEmbedder('loadCompleted', [], null);
- // Support for legacy (<57) frontends.
- if (window.Runtime && window.Runtime.queryParam) {
- const panelToOpen = window.Runtime.queryParam('panel');
- if (panelToOpen) {
- window.DevToolsAPI.showPanel(panelToOpen);
- }
- }
- }
- /**
- * @override
- */
- bringToFront() {
- DevToolsAPI.sendMessageToEmbedder('bringToFront', [], null);
- }
- /**
- * @override
- */
- closeWindow() {
- DevToolsAPI.sendMessageToEmbedder('closeWindow', [], null);
- }
- /**
- * @override
- * @param {boolean} isDocked
- * @param {function()} callback
- */
- setIsDocked(isDocked, callback) {
- DevToolsAPI.sendMessageToEmbedder('setIsDocked', [isDocked], callback);
- }
- /**
- * Requests inspected page to be placed atop of the inspector frontend with specified bounds.
- * @override
- * @param {{x: number, y: number, width: number, height: number}} bounds
- */
- setInspectedPageBounds(bounds) {
- DevToolsAPI.sendMessageToEmbedder('setInspectedPageBounds', [bounds], null);
- }
- /**
- * @override
- */
- inspectElementCompleted() {
- DevToolsAPI.sendMessageToEmbedder('inspectElementCompleted', [], null);
- }
- /**
- * @override
- * @param {string} url
- * @param {string} headers
- * @param {number} streamId
- * @param {function(!InspectorFrontendHostAPI.LoadNetworkResourceResult)} callback
- */
- loadNetworkResource(url, headers, streamId, callback) {
- DevToolsAPI.sendMessageToEmbedder(
- 'loadNetworkResource', [url, headers, streamId], /** @type {function(?Object)} */ (callback));
- }
- /**
- * @override
- * @param {function(!Object<string, string>)} callback
- */
- getPreferences(callback) {
- DevToolsAPI.sendMessageToEmbedder('getPreferences', [], /** @type {function(?Object)} */ (callback));
- }
- /**
- * @override
- * @param {string} name
- * @param {string} value
- */
- setPreference(name, value) {
- DevToolsAPI.sendMessageToEmbedder('setPreference', [name, value], null);
- }
- /**
- * @override
- * @param {string} name
- */
- removePreference(name) {
- DevToolsAPI.sendMessageToEmbedder('removePreference', [name], null);
- }
- /**
- * @override
- */
- clearPreferences() {
- DevToolsAPI.sendMessageToEmbedder('clearPreferences', [], null);
- }
- /**
- * @override
- * @param {string} origin
- * @param {string} script
- */
- setInjectedScriptForOrigin(origin, script) {
- DevToolsAPI.sendMessageToEmbedder('registerExtensionsAPI', [origin, script], null);
- }
- /**
- * @override
- * @param {string} url
- */
- inspectedURLChanged(url) {
- DevToolsAPI.sendMessageToEmbedder('inspectedURLChanged', [url], null);
- }
- /**
- * @override
- * @param {string} text
- */
- copyText(text) {
- DevToolsHost.copyText(text);
- }
- /**
- * @override
- * @param {string} url
- */
- openInNewTab(url) {
- DevToolsAPI.sendMessageToEmbedder('openInNewTab', [url], null);
- }
- /**
- * @override
- * @param {string} fileSystemPath
- */
- showItemInFolder(fileSystemPath) {
- DevToolsAPI.sendMessageToEmbedder('showItemInFolder', [fileSystemPath], null);
- }
- /**
- * @override
- * @param {string} url
- * @param {string} content
- * @param {boolean} forceSaveAs
- */
- save(url, content, forceSaveAs) {
- DevToolsAPI.sendMessageToEmbedder('save', [url, content, forceSaveAs], null);
- }
- /**
- * @override
- * @param {string} url
- * @param {string} content
- */
- append(url, content) {
- DevToolsAPI.sendMessageToEmbedder('append', [url, content], null);
- }
- /**
- * @override
- * @param {string} url
- */
- close(url) {
- }
- /**
- * @override
- * @param {string} message
- */
- sendMessageToBackend(message) {
- DevToolsAPI.sendMessageToEmbedder('dispatchProtocolMessage', [message], null);
- }
- /**
- * @override
- * @param {string} actionName
- * @param {number} actionCode
- * @param {number} bucketSize
- */
- recordEnumeratedHistogram(actionName, actionCode, bucketSize) {
- // Support for M49 frontend.
- if (actionName === 'DevTools.DrawerShown') {
- return;
- }
- DevToolsAPI.sendMessageToEmbedder('recordEnumeratedHistogram', [actionName, actionCode, bucketSize], null);
- }
- /**
- * @override
- * @param {string} histogramName
- * @param {number} duration
- */
- recordPerformanceHistogram(histogramName, duration) {
- DevToolsAPI.sendMessageToEmbedder('recordPerformanceHistogram', [histogramName, duration], null);
- }
- /**
- * @override
- * @param {string} umaName
- */
- recordUserMetricsAction(umaName) {
- DevToolsAPI.sendMessageToEmbedder('recordUserMetricsAction', [umaName], null);
- }
- /**
- * @override
- */
- requestFileSystems() {
- DevToolsAPI.sendMessageToEmbedder('requestFileSystems', [], null);
- }
- /**
- * @override
- * @param {string=} type
- */
- addFileSystem(type) {
- DevToolsAPI.sendMessageToEmbedder('addFileSystem', [type || ''], null);
- }
- /**
- * @override
- * @param {string} fileSystemPath
- */
- removeFileSystem(fileSystemPath) {
- DevToolsAPI.sendMessageToEmbedder('removeFileSystem', [fileSystemPath], null);
- }
- /**
- * @override
- * @param {string} fileSystemId
- * @param {string} registeredName
- * @return {?DOMFileSystem}
- */
- isolatedFileSystem(fileSystemId, registeredName) {
- return DevToolsHost.isolatedFileSystem(fileSystemId, registeredName);
- }
- /**
- * @override
- * @param {!FileSystem} fileSystem
- */
- upgradeDraggedFileSystemPermissions(fileSystem) {
- DevToolsHost.upgradeDraggedFileSystemPermissions(fileSystem);
- }
- /**
- * @override
- * @param {number} requestId
- * @param {string} fileSystemPath
- * @param {string} excludedFolders
- */
- indexPath(requestId, fileSystemPath, excludedFolders) {
- // |excludedFolders| added in M67. For backward compatibility,
- // pass empty array.
- excludedFolders = excludedFolders || '[]';
- DevToolsAPI.sendMessageToEmbedder('indexPath', [requestId, fileSystemPath, excludedFolders], null);
- }
- /**
- * @override
- * @param {number} requestId
- */
- stopIndexing(requestId) {
- DevToolsAPI.sendMessageToEmbedder('stopIndexing', [requestId], null);
- }
- /**
- * @override
- * @param {number} requestId
- * @param {string} fileSystemPath
- * @param {string} query
- */
- searchInPath(requestId, fileSystemPath, query) {
- DevToolsAPI.sendMessageToEmbedder('searchInPath', [requestId, fileSystemPath, query], null);
- }
- /**
- * @override
- * @return {number}
- */
- zoomFactor() {
- return DevToolsHost.zoomFactor();
- }
- /**
- * @override
- */
- zoomIn() {
- DevToolsAPI.sendMessageToEmbedder('zoomIn', [], null);
- }
- /**
- * @override
- */
- zoomOut() {
- DevToolsAPI.sendMessageToEmbedder('zoomOut', [], null);
- }
- /**
- * @override
- */
- resetZoom() {
- DevToolsAPI.sendMessageToEmbedder('resetZoom', [], null);
- }
- /**
- * @override
- * @param {string} shortcuts
- */
- setWhitelistedShortcuts(shortcuts) {
- DevToolsAPI.sendMessageToEmbedder('setWhitelistedShortcuts', [shortcuts], null);
- }
- /**
- * @override
- * @param {boolean} active
- */
- setEyeDropperActive(active) {
- DevToolsAPI.sendMessageToEmbedder('setEyeDropperActive', [active], null);
- }
- /**
- * @override
- * @param {!Array<string>} certChain
- */
- showCertificateViewer(certChain) {
- DevToolsAPI.sendMessageToEmbedder('showCertificateViewer', [JSON.stringify(certChain)], null);
- }
- /**
- * Only needed to run Lighthouse on old devtools.
- * @override
- * @param {function()} callback
- */
- reattach(callback) {
- DevToolsAPI.sendMessageToEmbedder('reattach', [], callback);
- }
- /**
- * @override
- */
- readyForTest() {
- DevToolsAPI.sendMessageToEmbedder('readyForTest', [], null);
- }
- /**
- * @override
- */
- connectionReady() {
- DevToolsAPI.sendMessageToEmbedder('connectionReady', [], null);
- }
- /**
- * @override
- * @param {boolean} value
- */
- setOpenNewWindowForPopups(value) {
- DevToolsAPI.sendMessageToEmbedder('setOpenNewWindowForPopups', [value], null);
- }
- /**
- * @override
- * @param {!Adb.Config} config
- */
- setDevicesDiscoveryConfig(config) {
- DevToolsAPI.sendMessageToEmbedder(
- 'setDevicesDiscoveryConfig',
- [
- config.discoverUsbDevices, config.portForwardingEnabled, JSON.stringify(config.portForwardingConfig),
- config.networkDiscoveryEnabled, JSON.stringify(config.networkDiscoveryConfig)
- ],
- null);
- }
- /**
- * @override
- * @param {boolean} enabled
- */
- setDevicesUpdatesEnabled(enabled) {
- DevToolsAPI.sendMessageToEmbedder('setDevicesUpdatesEnabled', [enabled], null);
- }
- /**
- * @override
- * @param {string} pageId
- * @param {string} action
- */
- performActionOnRemotePage(pageId, action) {
- DevToolsAPI.sendMessageToEmbedder('performActionOnRemotePage', [pageId, action], null);
- }
- /**
- * @override
- * @param {string} browserId
- * @param {string} url
- */
- openRemotePage(browserId, url) {
- DevToolsAPI.sendMessageToEmbedder('openRemotePage', [browserId, url], null);
- }
- /**
- * @override
- */
- openNodeFrontend() {
- DevToolsAPI.sendMessageToEmbedder('openNodeFrontend', [], null);
- }
- /**
- * @override
- * @param {number} x
- * @param {number} y
- * @param {!Array.<!InspectorFrontendHostAPI.ContextMenuDescriptor>} items
- * @param {!Document} document
- */
- showContextMenuAtPoint(x, y, items, document) {
- DevToolsHost.showContextMenuAtPoint(x, y, items, document);
- }
- /**
- * @override
- * @return {boolean}
- */
- isHostedMode() {
- return DevToolsHost.isHostedMode();
- }
- /**
- * @override
- * @param {function(!ExtensionDescriptor)} callback
- */
- setAddExtensionCallback(callback) {
- DevToolsAPI.setAddExtensionCallback(callback);
- }
- // Backward-compatible methods below this line --------------------------------------------
- /**
- * Support for legacy front-ends (<M65).
- * @return {boolean}
- */
- isUnderTest() {
- return false;
- }
- /**
- * Support for legacy front-ends (<M50).
- * @param {string} message
- */
- sendFrontendAPINotification(message) {
- }
- /**
- * Support for legacy front-ends (<M41).
- * @return {string}
- */
- port() {
- return 'unknown';
- }
- /**
- * Support for legacy front-ends (<M38).
- * @param {number} zoomFactor
- */
- setZoomFactor(zoomFactor) {
- }
- /**
- * Support for legacy front-ends (<M34).
- */
- sendMessageToEmbedder() {
- }
- /**
- * Support for legacy front-ends (<M34).
- * @param {string} dockSide
- */
- requestSetDockSide(dockSide) {
- DevToolsAPI.sendMessageToEmbedder('setIsDocked', [dockSide !== 'undocked'], null);
- }
- /**
- * Support for legacy front-ends (<M34).
- * @return {boolean}
- */
- supportsFileSystems() {
- return true;
- }
- /**
- * Support for legacy front-ends (<M44).
- * @param {number} actionCode
- */
- recordActionTaken(actionCode) {
- this.recordEnumeratedHistogram('DevTools.ActionTaken', actionCode, 100);
- }
- /**
- * Support for legacy front-ends (<M44).
- * @param {number} panelCode
- */
- recordPanelShown(panelCode) {
- this.recordEnumeratedHistogram('DevTools.PanelShown', panelCode, 20);
- }
- };
- window.InspectorFrontendHost = new InspectorFrontendHostImpl();
- // DevToolsApp ---------------------------------------------------------------
- function installObjectObserve() {
- /** @type {!Array<string>} */
- const properties = [
- 'advancedSearchConfig',
- 'auditsPanelSplitViewState',
- 'auditsSidebarWidth',
- 'blockedURLs',
- 'breakpoints',
- 'cacheDisabled',
- 'colorFormat',
- 'consoleHistory',
- 'consoleTimestampsEnabled',
- 'cpuProfilerView',
- 'cssSourceMapsEnabled',
- 'currentDockState',
- 'customColorPalette',
- 'customDevicePresets',
- 'customEmulatedDeviceList',
- 'customFormatters',
- 'customUserAgent',
- 'databaseTableViewVisibleColumns',
- 'dataGrid-cookiesTable',
- 'dataGrid-DOMStorageItemsView',
- 'debuggerSidebarHidden',
- 'disableDataSaverInfobar',
- 'disablePausedStateOverlay',
- 'domBreakpoints',
- 'domWordWrap',
- 'elementsPanelSplitViewState',
- 'elementsSidebarWidth',
- 'emulation.deviceHeight',
- 'emulation.deviceModeValue',
- 'emulation.deviceOrientationOverride',
- 'emulation.deviceScale',
- 'emulation.deviceScaleFactor',
- 'emulation.deviceUA',
- 'emulation.deviceWidth',
- 'emulation.geolocationOverride',
- 'emulation.showDeviceMode',
- 'emulation.showRulers',
- 'enableAsyncStackTraces',
- 'eventListenerBreakpoints',
- 'fileMappingEntries',
- 'fileSystemMapping',
- 'FileSystemViewSidebarWidth',
- 'fileSystemViewSplitViewState',
- 'filterBar-consoleView',
- 'filterBar-networkPanel',
- 'filterBar-promisePane',
- 'filterBar-timelinePanel',
- 'frameViewerHideChromeWindow',
- 'heapSnapshotRetainersViewSize',
- 'heapSnapshotSplitViewState',
- 'hideCollectedPromises',
- 'hideNetworkMessages',
- 'highlightNodeOnHoverInOverlay',
- 'highResolutionCpuProfiling',
- 'inlineVariableValues',
- 'Inspector.drawerSplitView',
- 'Inspector.drawerSplitViewState',
- 'InspectorView.panelOrder',
- 'InspectorView.screencastSplitView',
- 'InspectorView.screencastSplitViewState',
- 'InspectorView.splitView',
- 'InspectorView.splitViewState',
- 'javaScriptDisabled',
- 'jsSourceMapsEnabled',
- 'lastActivePanel',
- 'lastDockState',
- 'lastSelectedSourcesSidebarPaneTab',
- 'lastSnippetEvaluationIndex',
- 'layerDetailsSplitView',
- 'layerDetailsSplitViewState',
- 'layersPanelSplitViewState',
- 'layersShowInternalLayers',
- 'layersSidebarWidth',
- 'messageLevelFilters',
- 'messageURLFilters',
- 'monitoringXHREnabled',
- 'navigatorGroupByFolder',
- 'navigatorHidden',
- 'networkColorCodeResourceTypes',
- 'networkConditions',
- 'networkConditionsCustomProfiles',
- 'networkHideDataURL',
- 'networkLogColumnsVisibility',
- 'networkLogLargeRows',
- 'networkLogShowOverview',
- 'networkPanelSplitViewState',
- 'networkRecordFilmStripSetting',
- 'networkResourceTypeFilters',
- 'networkShowPrimaryLoadWaterfall',
- 'networkSidebarWidth',
- 'openLinkHandler',
- 'pauseOnCaughtException',
- 'pauseOnExceptionEnabled',
- 'preserveConsoleLog',
- 'prettyPrintInfobarDisabled',
- 'previouslyViewedFiles',
- 'profilesPanelSplitViewState',
- 'profilesSidebarWidth',
- 'promiseStatusFilters',
- 'recordAllocationStacks',
- 'requestHeaderFilterSetting',
- 'request-info-formData-category-expanded',
- 'request-info-general-category-expanded',
- 'request-info-queryString-category-expanded',
- 'request-info-requestHeaders-category-expanded',
- 'request-info-requestPayload-category-expanded',
- 'request-info-responseHeaders-category-expanded',
- 'resources',
- 'resourcesLastSelectedItem',
- 'resourcesPanelSplitViewState',
- 'resourcesSidebarWidth',
- 'resourceViewTab',
- 'savedURLs',
- 'screencastEnabled',
- 'scriptsPanelNavigatorSidebarWidth',
- 'searchInContentScripts',
- 'selectedAuditCategories',
- 'selectedColorPalette',
- 'selectedProfileType',
- 'shortcutPanelSwitch',
- 'showAdvancedHeapSnapshotProperties',
- 'showEventListenersForAncestors',
- 'showFrameowkrListeners',
- 'showHeaSnapshotObjectsHiddenProperties',
- 'showInheritedComputedStyleProperties',
- 'showMediaQueryInspector',
- 'showNativeFunctionsInJSProfile',
- 'showUAShadowDOM',
- 'showWhitespacesInEditor',
- 'sidebarPosition',
- 'skipContentScripts',
- 'skipStackFramesPattern',
- 'sourceMapInfobarDisabled',
- 'sourcesPanelDebuggerSidebarSplitViewState',
- 'sourcesPanelNavigatorSplitViewState',
- 'sourcesPanelSplitSidebarRatio',
- 'sourcesPanelSplitViewState',
- 'sourcesSidebarWidth',
- 'standardEmulatedDeviceList',
- 'StylesPaneSplitRatio',
- 'stylesPaneSplitViewState',
- 'textEditorAutocompletion',
- 'textEditorAutoDetectIndent',
- 'textEditorBracketMatching',
- 'textEditorIndent',
- 'textEditorTabMovesFocus',
- 'timelineCaptureFilmStrip',
- 'timelineCaptureLayersAndPictures',
- 'timelineCaptureMemory',
- 'timelineCaptureNetwork',
- 'timeline-details',
- 'timelineEnableJSSampling',
- 'timelineOverviewMode',
- 'timelinePanelDetailsSplitViewState',
- 'timelinePanelRecorsSplitViewState',
- 'timelinePanelTimelineStackSplitViewState',
- 'timelinePerspective',
- 'timeline-split',
- 'timelineTreeGroupBy',
- 'timeline-view',
- 'timelineViewMode',
- 'uiTheme',
- 'watchExpressions',
- 'WebInspector.Drawer.lastSelectedView',
- 'WebInspector.Drawer.showOnLoad',
- 'workspaceExcludedFolders',
- 'workspaceFolderExcludePattern',
- 'workspaceInfobarDisabled',
- 'workspaceMappingInfobarDisabled',
- 'xhrBreakpoints'
- ];
- /**
- * @this {!{_storage: Object, _name: string}}
- */
- function settingRemove() {
- this._storage[this._name] = undefined;
- }
- /**
- * @param {!Object} object
- * @param {function(!Array<!{name: string}>)} observer
- */
- function objectObserve(object, observer) {
- if (window['WebInspector']) {
- const settingPrototype = /** @type {!Object} */ (window['WebInspector']['Setting']['prototype']);
- if (typeof settingPrototype['remove'] === 'function') {
- settingPrototype['remove'] = settingRemove;
- }
- }
- /** @type {!Set<string>} */
- const changedProperties = new Set();
- let scheduled = false;
- function scheduleObserver() {
- if (scheduled) {
- return;
- }
- scheduled = true;
- setImmediate(callObserver);
- }
- function callObserver() {
- scheduled = false;
- const changes = /** @type {!Array<!{name: string}>} */ ([]);
- changedProperties.forEach(function(name) {
- changes.push({name: name});
- });
- changedProperties.clear();
- observer.call(null, changes);
- }
- /** @type {!Map<string, *>} */
- const storage = new Map();
- /**
- * @param {string} property
- */
- function defineProperty(property) {
- if (property in object) {
- storage.set(property, object[property]);
- delete object[property];
- }
- Object.defineProperty(object, property, {
- /**
- * @return {*}
- */
- get: function() {
- return storage.get(property);
- },
- /**
- * @param {*} value
- */
- set: function(value) {
- storage.set(property, value);
- changedProperties.add(property);
- scheduleObserver();
- }
- });
- }
- for (let i = 0; i < properties.length; ++i) {
- defineProperty(properties[i]);
- }
- }
- window.Object.observe = objectObserve;
- }
- /** @type {!Map<number, string>} */
- const staticKeyIdentifiers = new Map([
- [0x12, 'Alt'],
- [0x11, 'Control'],
- [0x10, 'Shift'],
- [0x14, 'CapsLock'],
- [0x5b, 'Win'],
- [0x5c, 'Win'],
- [0x0c, 'Clear'],
- [0x28, 'Down'],
- [0x23, 'End'],
- [0x0a, 'Enter'],
- [0x0d, 'Enter'],
- [0x2b, 'Execute'],
- [0x70, 'F1'],
- [0x71, 'F2'],
- [0x72, 'F3'],
- [0x73, 'F4'],
- [0x74, 'F5'],
- [0x75, 'F6'],
- [0x76, 'F7'],
- [0x77, 'F8'],
- [0x78, 'F9'],
- [0x79, 'F10'],
- [0x7a, 'F11'],
- [0x7b, 'F12'],
- [0x7c, 'F13'],
- [0x7d, 'F14'],
- [0x7e, 'F15'],
- [0x7f, 'F16'],
- [0x80, 'F17'],
- [0x81, 'F18'],
- [0x82, 'F19'],
- [0x83, 'F20'],
- [0x84, 'F21'],
- [0x85, 'F22'],
- [0x86, 'F23'],
- [0x87, 'F24'],
- [0x2f, 'Help'],
- [0x24, 'Home'],
- [0x2d, 'Insert'],
- [0x25, 'Left'],
- [0x22, 'PageDown'],
- [0x21, 'PageUp'],
- [0x13, 'Pause'],
- [0x2c, 'PrintScreen'],
- [0x27, 'Right'],
- [0x91, 'Scroll'],
- [0x29, 'Select'],
- [0x26, 'Up'],
- [0x2e, 'U+007F'], // Standard says that DEL becomes U+007F.
- [0xb0, 'MediaNextTrack'],
- [0xb1, 'MediaPreviousTrack'],
- [0xb2, 'MediaStop'],
- [0xb3, 'MediaPlayPause'],
- [0xad, 'VolumeMute'],
- [0xae, 'VolumeDown'],
- [0xaf, 'VolumeUp'],
- ]);
- /**
- * @param {number} keyCode
- * @return {string}
- */
- function keyCodeToKeyIdentifier(keyCode) {
- let result = staticKeyIdentifiers.get(keyCode);
- if (result !== undefined) {
- return result;
- }
- result = 'U+';
- const hexString = keyCode.toString(16).toUpperCase();
- for (let i = hexString.length; i < 4; ++i) {
- result += '0';
- }
- result += hexString;
- return result;
- }
- function installBackwardsCompatibility() {
- const majorVersion = getRemoteMajorVersion();
- if (!majorVersion) {
- return;
- }
- /** @type {!Array<string>} */
- const styleRules = [];
- // Shadow DOM V0 polyfill
- if (majorVersion <= 73 && !Element.prototype.createShadowRoot) {
- Element.prototype.createShadowRoot = function() {
- try {
- return this.attachShadow({mode: 'open'});
- } catch (e) {
- // some elements we use to add shadow roots can no
- // longer have shadow roots.
- const fakeShadowHost = document.createElement('span');
- this.appendChild(fakeShadowHost);
- fakeShadowHost.className = 'fake-shadow-host';
- return fakeShadowHost.createShadowRoot();
- }
- };
- const origAdd = DOMTokenList.prototype.add;
- DOMTokenList.prototype.add = function(...tokens) {
- if (tokens[0].startsWith('insertion-point') || tokens[0].startsWith('tabbed-pane-header')) {
- this._myElement.slot = '.' + tokens[0];
- }
- return origAdd.apply(this, tokens);
- };
- const origCreateElement = Document.prototype.createElement;
- Document.prototype.createElement = function(tagName, ...rest) {
- if (tagName === 'content') {
- tagName = 'slot';
- }
- const element = origCreateElement.call(this, tagName, ...rest);
- element.classList._myElement = element;
- return element;
- };
- Object.defineProperty(HTMLSlotElement.prototype, 'select', {
- async set(selector) {
- this.name = selector;
- }
- });
- function overrideCreateElementWithClass() {
- window.removeEventListener('DOMContentLoaded', overrideCreateElementWithClass);
- const origCreateElementWithClass = Document.prototype.createElementWithClass;
- Document.prototype.createElementWithClass = function(tagName, className, ...rest) {
- if (tagName !== 'button' || (className !== 'soft-dropdown' && className !== 'dropdown-button')) {
- return origCreateElementWithClass.call(this, tagName, className, ...rest);
- }
- const element = origCreateElementWithClass.call(this, 'div', className, ...rest);
- element.tabIndex = 0;
- element.role = 'button';
- return element;
- };
- }
- // Document.prototype.createElementWithClass is a DevTools method, so we
- // need to wait for DOMContentLoaded in order to override it.
- if (window.document.head &&
- (window.document.readyState === 'complete' || window.document.readyState === 'interactive')) {
- overrideCreateElementWithClass();
- } else {
- window.addEventListener('DOMContentLoaded', overrideCreateElementWithClass);
- }
- }
- // Custom Elements V0 polyfill
- if (majorVersion <= 73 && !Document.prototype.hasOwnProperty('registerElement')) {
- const fakeRegistry = new Map();
- Document.prototype.registerElement = function(typeExtension, options) {
- const {prototype, extends: localName} = options;
- const document = this;
- const callback = function() {
- const element = document.createElement(localName || typeExtension);
- const skip = new Set(['constructor', '__proto__']);
- for (const key of Object.keys(Object.getOwnPropertyDescriptors(prototype.__proto__ || {}))) {
- if (skip.has(key)) {
- continue;
- }
- element[key] = prototype[key];
- }
- element.setAttribute('is', typeExtension);
- if (element['createdCallback']) {
- element['createdCallback']();
- }
- return element;
- };
- fakeRegistry.set(typeExtension, callback);
- return callback;
- };
- const origCreateElement = Document.prototype.createElement;
- Document.prototype.createElement = function(tagName, fakeCustomElementType) {
- const fakeConstructor = fakeRegistry.get(fakeCustomElementType);
- if (fakeConstructor) {
- return fakeConstructor();
- }
- return origCreateElement.call(this, tagName, fakeCustomElementType);
- };
- // DevTools front-ends mistakenly assume that
- // classList.toggle('a', undefined) works as
- // classList.toggle('a', false) rather than as
- // classList.toggle('a');
- const originalDOMTokenListToggle = DOMTokenList.prototype.toggle;
- DOMTokenList.prototype.toggle = function(token, force) {
- if (arguments.length === 1) {
- force = !this.contains(token);
- }
- return originalDOMTokenListToggle.call(this, token, !!force);
- };
- }
- if (majorVersion <= 66) {
- /** @type {(!function(number, number):Element|undefined)} */
- ShadowRoot.prototype.__originalShadowRootElementFromPoint;
- if (!ShadowRoot.prototype.__originalShadowRootElementFromPoint) {
- ShadowRoot.prototype.__originalShadowRootElementFromPoint = ShadowRoot.prototype.elementFromPoint;
- /**
- * @param {number} x
- * @param {number} y
- * @return {Element}
- */
- ShadowRoot.prototype.elementFromPoint = function(x, y) {
- const originalResult = ShadowRoot.prototype.__originalShadowRootElementFromPoint.apply(this, arguments);
- if (this.host && originalResult === this.host) {
- return null;
- }
- return originalResult;
- };
- }
- }
- if (majorVersion <= 53) {
- Object.defineProperty(window.KeyboardEvent.prototype, 'keyIdentifier', {
- /**
- * @return {string}
- * @this {KeyboardEvent}
- */
- get: function() {
- return keyCodeToKeyIdentifier(this.keyCode);
- }
- });
- }
- if (majorVersion <= 50) {
- installObjectObserve();
- }
- if (majorVersion <= 45) {
- /**
- * @param {string} property
- * @return {!CSSValue|null}
- * @this {CSSStyleDeclaration}
- */
- function getValue(property) {
- // Note that |property| comes from another context, so we can't use === here.
- // eslint-disable-next-line eqeqeq
- if (property == 'padding-left') {
- return /** @type {!CSSValue} */ ({
- /**
- * @return {number}
- * @this {!{__paddingLeft: number}}
- */
- getFloatValue: function() {
- return this.__paddingLeft;
- },
- __paddingLeft: parseFloat(this.paddingLeft)
- });
- }
- throw new Error('getPropertyCSSValue is undefined');
- }
- window.CSSStyleDeclaration.prototype.getPropertyCSSValue = getValue;
- function CSSPrimitiveValue() {
- }
- CSSPrimitiveValue.CSS_PX = 5;
- window.CSSPrimitiveValue = CSSPrimitiveValue;
- }
- if (majorVersion <= 45) {
- styleRules.push('* { min-width: 0; min-height: 0; }');
- }
- if (majorVersion <= 51) {
- // Support for quirky border-image behavior (<M51), see:
- // https://bugs.chromium.org/p/chromium/issues/detail?id=559258
- styleRules.push('.cm-breakpoint .CodeMirror-linenumber { border-style: solid !important; }');
- styleRules.push(
- '.cm-breakpoint.cm-breakpoint-conditional .CodeMirror-linenumber { border-style: solid !important; }');
- }
- if (majorVersion <= 71) {
- styleRules.push(
- '.coverage-toolbar-container, .animation-timeline-toolbar-container, .computed-properties { flex-basis: auto; }');
- }
- if (majorVersion <= 50) {
- Event.prototype.deepPath = undefined;
- }
- if (majorVersion <= 54) {
- window.FileError = /** @type {!function (new: FileError) : ?} */ ({
- NOT_FOUND_ERR: DOMException.NOT_FOUND_ERR,
- ABORT_ERR: DOMException.ABORT_ERR,
- INVALID_MODIFICATION_ERR: DOMException.INVALID_MODIFICATION_ERR,
- NOT_READABLE_ERR: 0 // No matching DOMException, so code will be 0.
- });
- }
- installExtraStyleRules(styleRules);
- }
- /**
- * @return {?number}
- */
- function getRemoteMajorVersion() {
- try {
- const remoteVersion = new URLSearchParams(window.location.search).get('remoteVersion');
- if (!remoteVersion) {
- return null;
- }
- const majorVersion = parseInt(remoteVersion.split('.')[0], 10);
- return majorVersion;
- } catch (e) {
- return null;
- }
- }
- /**
- * @param {!Array<string>} styleRules
- */
- function installExtraStyleRules(styleRules) {
- if (!styleRules.length) {
- return;
- }
- const styleText = styleRules.join('\n');
- document.head.appendChild(createStyleElement(styleText));
- const origCreateShadowRoot = HTMLElement.prototype.createShadowRoot;
- HTMLElement.prototype.createShadowRoot = function(...args) {
- const shadowRoot = origCreateShadowRoot.call(this, ...args);
- shadowRoot.appendChild(createStyleElement(styleText));
- return shadowRoot;
- };
- }
- /**
- * @param {string} styleText
- * @return {!Element}
- */
- function createStyleElement(styleText) {
- const style = document.createElement('style');
- style.textContent = styleText;
- return style;
- }
- installBackwardsCompatibility();
- })(window);
|