1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {binaryDecode} from '../base/string_utils'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {ChromeTracingController} from './chrome_tracing_controller'; 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard Workerlet chromeTraceController: ChromeTracingController | undefined = undefined; 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard WorkerenableOnlyOnPerfettoHost(); 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard Worker// Listen for messages from the perfetto ui. 23*6dbdd20aSAndroid Build Coastguard Worker// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions 24*6dbdd20aSAndroid Build Coastguard Workerif (globalThis.chrome) { 25*6dbdd20aSAndroid Build Coastguard Worker chrome.runtime.onConnectExternal.addListener((port) => { 26*6dbdd20aSAndroid Build Coastguard Worker chromeTraceController = new ChromeTracingController(port); 27*6dbdd20aSAndroid Build Coastguard Worker port.onMessage.addListener(onUIMessage); 28*6dbdd20aSAndroid Build Coastguard Worker }); 29*6dbdd20aSAndroid Build Coastguard Worker} 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Workerfunction onUIMessage( 32*6dbdd20aSAndroid Build Coastguard Worker message: {method: string; requestData: string}, 33*6dbdd20aSAndroid Build Coastguard Worker port: chrome.runtime.Port, 34*6dbdd20aSAndroid Build Coastguard Worker) { 35*6dbdd20aSAndroid Build Coastguard Worker if (message.method === 'ExtensionVersion') { 36*6dbdd20aSAndroid Build Coastguard Worker port.postMessage({version: chrome.runtime.getManifest().version}); 37*6dbdd20aSAndroid Build Coastguard Worker return; 38*6dbdd20aSAndroid Build Coastguard Worker } 39*6dbdd20aSAndroid Build Coastguard Worker console.assert(chromeTraceController !== undefined); 40*6dbdd20aSAndroid Build Coastguard Worker if (!chromeTraceController) return; 41*6dbdd20aSAndroid Build Coastguard Worker // ChromeExtensionConsumerPort sends the request data as string because 42*6dbdd20aSAndroid Build Coastguard Worker // chrome.runtime.port doesn't support ArrayBuffers. 43*6dbdd20aSAndroid Build Coastguard Worker const requestDataArray: Uint8Array = message.requestData 44*6dbdd20aSAndroid Build Coastguard Worker ? binaryDecode(message.requestData) 45*6dbdd20aSAndroid Build Coastguard Worker : new Uint8Array(); 46*6dbdd20aSAndroid Build Coastguard Worker chromeTraceController.handleCommand(message.method, requestDataArray); 47*6dbdd20aSAndroid Build Coastguard Worker} 48*6dbdd20aSAndroid Build Coastguard Worker 49*6dbdd20aSAndroid Build Coastguard Workerfunction enableOnlyOnPerfettoHost() { 50*6dbdd20aSAndroid Build Coastguard Worker function enableOnHostWithSuffix(suffix: string) { 51*6dbdd20aSAndroid Build Coastguard Worker return { 52*6dbdd20aSAndroid Build Coastguard Worker conditions: [ 53*6dbdd20aSAndroid Build Coastguard Worker new chrome.declarativeContent.PageStateMatcher({ 54*6dbdd20aSAndroid Build Coastguard Worker pageUrl: {hostSuffix: suffix}, 55*6dbdd20aSAndroid Build Coastguard Worker }), 56*6dbdd20aSAndroid Build Coastguard Worker ], 57*6dbdd20aSAndroid Build Coastguard Worker actions: [new chrome.declarativeContent.ShowPageAction()], 58*6dbdd20aSAndroid Build Coastguard Worker }; 59*6dbdd20aSAndroid Build Coastguard Worker } 60*6dbdd20aSAndroid Build Coastguard Worker chrome.declarativeContent.onPageChanged.removeRules(undefined, () => { 61*6dbdd20aSAndroid Build Coastguard Worker chrome.declarativeContent.onPageChanged.addRules([ 62*6dbdd20aSAndroid Build Coastguard Worker enableOnHostWithSuffix('localhost'), 63*6dbdd20aSAndroid Build Coastguard Worker enableOnHostWithSuffix('127.0.0.1'), 64*6dbdd20aSAndroid Build Coastguard Worker enableOnHostWithSuffix('.perfetto.dev'), 65*6dbdd20aSAndroid Build Coastguard Worker enableOnHostWithSuffix('.storage.googleapis.com'), 66*6dbdd20aSAndroid Build Coastguard Worker ]); 67*6dbdd20aSAndroid Build Coastguard Worker }); 68*6dbdd20aSAndroid Build Coastguard Worker} 69