log("loading chrome.csi.js"); if (!window.chrome) { // Use the exact property descriptor found in headful Chrome // fetch it via `Object.getOwnPropertyDescriptor(window, 'chrome')` Object.defineProperty(window, "chrome", { writable: true, enumerable: true, configurable: false, // note! value: {} // We'll extend that later }); } // Check if we're running headful and don't need to mock anything // Check that the Navigation Timing API v1 is available, we need that if (!("csi" in window.chrome) && window.performance?.timing) { const { csi_timing } = window.performance; log("loading chrome.csi.js"); window.chrome.csi = function() { return { onloadT: csi_timing?.domContentLoadedEventEnd, startE: csi_timing?.navigationStart, pageT: Date.now() - csi_timing?.navigationStart, tran: 15 // transition? seems constant }; }; utils.patchToString(window.chrome.csi); }