From 3106131aa7d9d7915ad843f2d67962c6ed7784b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 21:30:28 +0200 Subject: [PATCH 01/22] Extract the GlobalDataCollector class to its own file This is needed for the following patches to make sure that we don't have a circular dependency. Previously this class was only used for our own profile processing from the gecko profile data. But in the next commits I'm changing the profile importers to use this as well for easy profile shared data collection. --- src/profile-logic/global-data-collector.ts | 63 +++++++++++++++++++ src/profile-logic/process-profile.ts | 53 +--------------- .../fixtures/profiles/processed-profile.ts | 2 +- src/test/unit/process-profile.test.ts | 2 +- 4 files changed, 67 insertions(+), 53 deletions(-) create mode 100644 src/profile-logic/global-data-collector.ts diff --git a/src/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts new file mode 100644 index 0000000000..7bfec3967f --- /dev/null +++ b/src/profile-logic/global-data-collector.ts @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { StringTable } from '../utils/string-table'; +import type { + Lib, + LibMapping, + IndexIntoLibs, + RawProfileSharedData, +} from 'firefox-profiler/types'; + +/** + * GlobalDataCollector collects data which is global in the processed profile + * format but per-process or per-thread in the Gecko profile format. It + * de-duplicates elements and builds one shared list of each type. + * For now it only de-duplicates libraries, but in the future we may move more + * tables to be global. + * You could also call this class an "interner". + */ +export class GlobalDataCollector { + _libs: Lib[] = []; + _libKeyToLibIndex: Map = new Map(); + _stringArray: string[] = []; + _stringTable: StringTable = StringTable.withBackingArray(this._stringArray); + + // Return the global index for this library, adding it to the global list if + // necessary. + indexForLib(libMapping: LibMapping | Lib): IndexIntoLibs { + const { debugName, breakpadId } = libMapping; + const libKey = `${debugName}/${breakpadId}`; + let index = this._libKeyToLibIndex.get(libKey); + if (index === undefined) { + index = this._libs.length; + const { arch, name, path, debugPath, codeId } = libMapping; + this._libs.push({ + arch, + name, + path, + debugName, + debugPath, + breakpadId, + codeId: codeId ?? null, + }); + this._libKeyToLibIndex.set(libKey, index); + } + return index; + } + + getStringTable(): StringTable { + return this._stringTable; + } + + // Package up all de-duplicated global tables so that they can be embedded in + // the profile. + finish(): { libs: Lib[]; shared: RawProfileSharedData } { + const shared: RawProfileSharedData = { + stringArray: this._stringArray, + }; + + return { libs: this._libs, shared }; + } +} diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts index 63508ebab4..6bb00ae2eb 100644 --- a/src/profile-logic/process-profile.ts +++ b/src/profile-logic/process-profile.ts @@ -4,7 +4,7 @@ import { attemptToConvertChromeProfile } from './import/chrome'; import { attemptToConvertDhat } from './import/dhat'; import { AddressLocator } from './address-locator'; -import { StringTable } from '../utils/string-table'; +import { GlobalDataCollector } from './global-data-collector'; import { resourceTypes, getEmptyExtensions, @@ -38,9 +38,9 @@ import { import { computeStringIndexMarkerFieldsByDataType } from '../profile-logic/marker-schema'; import { convertJsTracerToThread } from '../profile-logic/js-tracer'; +import type { StringTable } from '../utils/string-table'; import type { Profile, - RawProfileSharedData, RawThread, RawCounter, ExtensionTable, @@ -49,7 +49,6 @@ import type { RawSamplesTable, RawStackTable, RawMarkerTable, - Lib, LibMapping, FuncTable, ResourceTable, @@ -177,54 +176,6 @@ function _cleanFunctionName(functionName: string): string { return functionName; } -/** - * GlobalDataCollector collects data which is global in the processed profile - * format but per-process or per-thread in the Gecko profile format. It - * de-duplicates elements and builds one shared list of each type. - * For now it only de-duplicates libraries, but in the future we may move more - * tables to be global. - * You could also call this class an "interner". - */ -export class GlobalDataCollector { - _libs: Lib[] = []; - _libKeyToLibIndex: Map = new Map(); - _stringArray: string[] = []; - _stringTable: StringTable = StringTable.withBackingArray(this._stringArray); - - // Return the global index for this library, adding it to the global list if - // necessary. - indexForLib(libMapping: LibMapping | Lib): IndexIntoLibs { - const { debugName, breakpadId } = libMapping; - const libKey = `${debugName}/${breakpadId}`; - let index = this._libKeyToLibIndex.get(libKey); - if (index === undefined) { - index = this._libs.length; - const { arch, name, path, debugPath, codeId } = libMapping; - this._libs.push({ - arch, - name, - path, - debugName, - debugPath, - breakpadId, - codeId: codeId ?? null, - }); - this._libKeyToLibIndex.set(libKey, index); - } - return index; - } - - getStringTable(): StringTable { - return this._stringTable; - } - - // Package up all de-duplicated global tables so that they can be embedded in - // the profile. - finish(): { libs: Lib[]; shared: RawProfileSharedData } { - return { libs: this._libs, shared: { stringArray: this._stringArray } }; - } -} - type ExtractionInfo = { funcTable: FuncTable; resourceTable: ResourceTable; diff --git a/src/test/fixtures/profiles/processed-profile.ts b/src/test/fixtures/profiles/processed-profile.ts index 0adcbd959a..02fbff6932 100644 --- a/src/test/fixtures/profiles/processed-profile.ts +++ b/src/test/fixtures/profiles/processed-profile.ts @@ -60,7 +60,7 @@ import { computeTimeColumnForRawSamplesTable, } from '../../../profile-logic/profile-data'; import { markerSchemaForTests } from './marker-schema'; -import { GlobalDataCollector } from 'firefox-profiler/profile-logic/process-profile'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { getVisualMetrics } from './gecko-profile'; // Array<[MarkerName, Milliseconds, Data]> diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index f3cf45ed6f..0dfcbd5f7a 100644 --- a/src/test/unit/process-profile.test.ts +++ b/src/test/unit/process-profile.test.ts @@ -6,8 +6,8 @@ import { processGeckoProfile, serializeProfile, unserializeProfileOfArbitraryFormat, - GlobalDataCollector, } from '../../profile-logic/process-profile'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { computeTimeColumnForRawSamplesTable } from '../../profile-logic/profile-data'; import { StringTable } from '../../utils/string-table'; import { From 377859a4c8cd98350734b28614c7f78b472da759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 13:20:59 +0200 Subject: [PATCH 02/22] Add sources table to the gecko and processed profile formats This patch adds the sources table but it doesn't use that yet. The following commits will be changing the funcTable and then start using it. Note that this gathers all sources, including the JS and native sources. This way, we have a single source of truth for them. But this will happen in the following patches. This patch: - Adds a `geckoProfile.sources` table to the gecko profile format. - Handles the processing of gecko profile -> processed profile format. --- src/profile-logic/data-structures.ts | 14 +++++ src/profile-logic/global-data-collector.ts | 46 ++++++++++++++++ src/profile-logic/import/simpleperf.ts | 2 + src/profile-logic/merge-compare.ts | 63 ++++++++++++++++++++++ src/profile-logic/process-profile.ts | 34 ++++++++++++ src/profile-logic/profile-compacting.ts | 15 ++++++ src/profile-logic/sanitize.ts | 1 + src/selectors/profile.ts | 4 ++ src/test/unit/marker-data.test.ts | 3 ++ src/types/gecko-profile.ts | 24 +++++++++ src/types/profile.ts | 18 +++++++ 11 files changed, 224 insertions(+) diff --git a/src/profile-logic/data-structures.ts b/src/profile-logic/data-structures.ts index 5a83b94db3..0e77b0d7ee 100644 --- a/src/profile-logic/data-structures.ts +++ b/src/profile-logic/data-structures.ts @@ -26,6 +26,7 @@ import type { CategoryList, JsTracerTable, CallNodeTable, + SourceTable, } from 'firefox-profiler/types'; /** @@ -370,6 +371,18 @@ export function getEmptyJsTracerTable(): JsTracerTable { }; } +export function getEmptySourceTable(): SourceTable { + return { + // Important! + // If modifying this structure, please update all callers of this function to ensure + // that they are pushing on correctly to the data structure. These pushes may not + // be caught by the type system. + uuid: [], + filename: [], + length: 0, + }; +} + export function getEmptyThread(overrides?: Partial): RawThread { const defaultThread: RawThread = { processType: 'default', @@ -427,6 +440,7 @@ export function getEmptyProfile(): Profile { pages: [], shared: { stringArray: [], + sources: getEmptySourceTable(), }, threads: [], }; diff --git a/src/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts index 7bfec3967f..10a08182e1 100644 --- a/src/profile-logic/global-data-collector.ts +++ b/src/profile-logic/global-data-collector.ts @@ -7,7 +7,10 @@ import type { Lib, LibMapping, IndexIntoLibs, + IndexIntoStringTable, + IndexIntoSourceTable, RawProfileSharedData, + SourceTable, } from 'firefox-profiler/types'; /** @@ -23,6 +26,10 @@ export class GlobalDataCollector { _libKeyToLibIndex: Map = new Map(); _stringArray: string[] = []; _stringTable: StringTable = StringTable.withBackingArray(this._stringArray); + _sources: SourceTable = { length: 0, uuid: [], filename: [] }; + _uuidToSourceIndex: Map = new Map(); + _filenameToSourceIndex: Map = + new Map(); // Return the global index for this library, adding it to the global list if // necessary. @@ -47,15 +54,54 @@ export class GlobalDataCollector { return index; } + // Return the global index for this source, adding it to the global list if + // necessary. + indexForSource(uuid: string | null, filename: string): IndexIntoSourceTable { + let index: IndexIntoSourceTable | undefined; + + if (uuid !== null) { + index = this._uuidToSourceIndex.get(uuid); + } else { + // For null UUIDs, use filename-based lookup + const filenameIndex = this._stringTable.indexForString(filename); + index = this._filenameToSourceIndex.get(filenameIndex); + } + + if (index === undefined) { + index = this._sources.length; + const filenameIndex = this._stringTable.indexForString(filename); + this._sources.uuid[index] = uuid; + this._sources.filename[index] = filenameIndex; + this._sources.length++; + + if (uuid !== null) { + this._uuidToSourceIndex.set(uuid, index); + } else { + this._filenameToSourceIndex.set(filenameIndex, index); + } + } + return index; + } + + // Get the processed source index by UUID + getSourceIndexByUuid(uuid: string): IndexIntoSourceTable | null { + return this._uuidToSourceIndex.get(uuid) ?? null; + } + getStringTable(): StringTable { return this._stringTable; } + getSources(): SourceTable { + return this._sources; + } + // Package up all de-duplicated global tables so that they can be embedded in // the profile. finish(): { libs: Lib[]; shared: RawProfileSharedData } { const shared: RawProfileSharedData = { stringArray: this._stringArray, + sources: this._sources, }; return { libs: this._libs, shared }; diff --git a/src/profile-logic/import/simpleperf.ts b/src/profile-logic/import/simpleperf.ts index cae0727740..615916504c 100644 --- a/src/profile-logic/import/simpleperf.ts +++ b/src/profile-logic/import/simpleperf.ts @@ -27,6 +27,7 @@ import { getEmptySamplesTable, getEmptyRawMarkerTable, getEmptyNativeSymbolTable, + getEmptySourceTable, } from 'firefox-profiler/profile-logic/data-structures'; import { StringTable } from 'firefox-profiler/utils/string-table'; import { ensureExists } from 'firefox-profiler/utils/types'; @@ -370,6 +371,7 @@ class FirefoxProfile { libs: [], shared: { stringArray: this.stringArray, + sources: getEmptySourceTable(), }, threads: this.threads.map((thread) => thread.toJson()), }; diff --git a/src/profile-logic/merge-compare.ts b/src/profile-logic/merge-compare.ts index 828c30a2df..773c21f200 100644 --- a/src/profile-logic/merge-compare.ts +++ b/src/profile-logic/merge-compare.ts @@ -48,6 +48,7 @@ import type { IndexIntoStackTable, IndexIntoSamplesTable, IndexIntoStringTable, + IndexIntoSourceTable, FuncTable, FrameTable, Lib, @@ -55,6 +56,7 @@ import type { ResourceTable, RawSamplesTable, RawStackTable, + SourceTable, UrlState, ImplementationFilter, TransformStacksPerThread, @@ -144,6 +146,13 @@ export function mergeProfilesForDiffing( translationMaps: translationMapForStrings, } = mergeStringArrays(profiles.map((profile) => profile.shared.stringArray)); + // Then merge sources. + const { sources: newSources, translationMaps: translationMapForSources } = + mergeSources( + profiles.map((profile) => profile.shared.sources ?? null), + translationMapForStrings + ); + // Then merge libs. const { libs: newLibs, translationMaps: translationMapsForLibs } = mergeLibs( profiles.map((profile) => profile.libs) @@ -152,6 +161,7 @@ export function mergeProfilesForDiffing( resultProfile.shared = { stringArray: newStringArray, + sources: newSources, }; // Then we loop over all profiles and do the necessary changes according @@ -416,6 +426,7 @@ type TranslationMapForFrames = Map; type TranslationMapForStacks = Map; type TranslationMapForLibs = Map; type TranslationMapForStrings = Map; +type TranslationMapForSources = Map; type TranslationMapForSamples = Map< IndexIntoSamplesTable, IndexIntoSamplesTable @@ -481,6 +492,58 @@ function mergeStringArrays(stringArraysPerProfile: Array): { return { stringArray: newStringArray, translationMaps }; } +function mergeSources( + sourcesPerProfile: Array, + translationMapsForStrings: TranslationMapForStrings[] +): { + sources: SourceTable; + translationMaps: TranslationMapForSources[]; +} { + const newSources: SourceTable = { length: 0, uuid: [], filename: [] }; + const mapOfInsertedSources: Map = new Map(); + + const translationMaps = sourcesPerProfile.map((sources, profileIndex) => { + const translationMap = new Map(); + if (!sources) { + return translationMap; + } + + const stringTranslationMap = translationMapsForStrings[profileIndex]; + + for (let i = 0; i < sources.length; i++) { + const uuid = sources.uuid[i]; + const originalUrlIndex = sources.filename[i]; + const newUrlIndex = stringTranslationMap.get(originalUrlIndex); + + if (newUrlIndex === undefined) { + throw new Error( + `String index ${originalUrlIndex} not found in translation map` + ); + } + + const sourceKey = uuid ?? `null-uuid-${newUrlIndex}`; + let insertedSourceIndex = mapOfInsertedSources.get(sourceKey); + if (insertedSourceIndex === undefined) { + // Add new source + insertedSourceIndex = newSources.length; + newSources.uuid[insertedSourceIndex] = uuid; + newSources.filename[insertedSourceIndex] = newUrlIndex; + newSources.length++; + mapOfInsertedSources.set(sourceKey, insertedSourceIndex); + } + + translationMap.set(i, insertedSourceIndex); + } + + return translationMap; + }); + + return { + sources: newSources, + translationMaps, + }; +} + /** * Adjusts the category indices in a category list using a translation map. */ diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts index 6bb00ae2eb..bd6f7f91a0 100644 --- a/src/profile-logic/process-profile.ts +++ b/src/profile-logic/process-profile.ts @@ -1627,6 +1627,37 @@ export function processGeckoOrDevToolsProfile(json: unknown): Profile { return processGeckoProfile(geckoProfile); } +/** + * Process source table from all processes and populate the global data + * collector with UUID-to-index mappings. + */ +function _processSourceTable( + geckoProfile: GeckoProfile, + globalDataCollector: GlobalDataCollector +): void { + // Process the main process sources table if it exists + if (geckoProfile.sources) { + const schema = geckoProfile.sources.schema; + for (const data of geckoProfile.sources.data) { + const uuid = data[schema.uuid]; + const filename = data[schema.filename]; + globalDataCollector.indexForSource(uuid, filename); + } + } + + // Process sources from all subprocesses + for (const subprocessProfile of geckoProfile.processes) { + if (subprocessProfile.sources) { + const schema = subprocessProfile.sources.schema; + for (const data of subprocessProfile.sources.data) { + const uuid = data[schema.uuid]; + const filename = data[schema.filename]; + globalDataCollector.indexForSource(uuid, filename); + } + } + } +} + /** * Convert a profile from the Gecko format into the processed format. * Throws an exception if it encounters an incompatible profile. @@ -1649,6 +1680,9 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { const globalDataCollector = new GlobalDataCollector(); + // Process sources from all processes (main + subprocesses) + _processSourceTable(geckoProfile, globalDataCollector); + for (const thread of geckoProfile.threads) { threads.push( _processThread( diff --git a/src/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts index 53377a07ad..f4c8e07cbd 100644 --- a/src/profile-logic/profile-compacting.ts +++ b/src/profile-logic/profile-compacting.ts @@ -82,8 +82,23 @@ function _createProfileWithTranslatedStringIndexes( ) ); + // Update sources table with translated string indexes + const newSources = { + ...profile.shared.sources, + filename: profile.shared.sources.filename.map((oldUrlIndex) => { + const newIndexPlusOne = oldStringToNewStringPlusOne[oldUrlIndex]; + if (newIndexPlusOne === 0) { + throw new Error( + `String index ${oldUrlIndex} was not found in the translation map` + ); + } + return newIndexPlusOne - 1; + }), + }; + const newShared: RawProfileSharedData = { stringArray: newStringArray, + sources: newSources, }; const newProfile: Profile = { diff --git a/src/profile-logic/sanitize.ts b/src/profile-logic/sanitize.ts index 2ff0f19fb5..5f1e14e4be 100644 --- a/src/profile-logic/sanitize.ts +++ b/src/profile-logic/sanitize.ts @@ -129,6 +129,7 @@ export function sanitizePII( pages: pages, shared: { stringArray, + sources: profile.shared.sources, }, threads: profile.threads.reduce((acc, thread, threadIndex) => { const newThread: RawThread | null = sanitizeThreadPII( diff --git a/src/selectors/profile.ts b/src/selectors/profile.ts index 13ed4a647b..edae554978 100644 --- a/src/selectors/profile.ts +++ b/src/selectors/profile.ts @@ -71,6 +71,7 @@ import type { ExtensionTable, SortedTabPageData, TimelineUnit, + SourceTable, } from 'firefox-profiler/types'; import type { ThreadActivityScore } from '../profile-logic/tracks'; @@ -247,6 +248,9 @@ export const getStringTable: Selector = createSelector( (stringArray) => StringTable.withBackingArray(stringArray as string[]) ); +export const getSourceTable: Selector = (state: State) => + getRawProfileSharedData(state).sources; + // Combine the marker schema from Gecko and the front-end. This allows the front-end // to generate markers such as the Jank markers, and display them. export const getMarkerSchema: Selector = createSelector( diff --git a/src/test/unit/marker-data.test.ts b/src/test/unit/marker-data.test.ts index c90717aa88..0f2f8d715d 100644 --- a/src/test/unit/marker-data.test.ts +++ b/src/test/unit/marker-data.test.ts @@ -33,6 +33,7 @@ import { makeEndMarker, } from '../fixtures/profiles/processed-profile'; import { storeWithProfile } from '../fixtures/stores'; +import { getEmptySourceTable } from '../../profile-logic/data-structures'; import type { IndexIntoRawMarkerTable, @@ -789,6 +790,7 @@ describe('filterRawMarkerTableToRange', () => { function setup({ start, end, markers }: TestConfig) { const shared: RawProfileSharedData = { stringArray: [], + sources: getEmptySourceTable(), }; const thread = getThreadWithRawMarkers(shared, markers); @@ -1281,6 +1283,7 @@ describe('filterRawMarkerTableToRangeWithMarkersToDelete', () => { function setup({ timeRange, markersToDelete, markers }: TestConfig) { const shared: RawProfileSharedData = { stringArray: [], + sources: getEmptySourceTable(), }; const thread = getThreadWithRawMarkers(shared, markers); diff --git a/src/types/gecko-profile.ts b/src/types/gecko-profile.ts index 98fbd8a845..7d1be14d87 100644 --- a/src/types/gecko-profile.ts +++ b/src/types/gecko-profile.ts @@ -548,6 +548,28 @@ export type ProfilingLog = { [pid: number]: ProcessProfilingLog; }; +/** + * Table containing source code file references in the Gecko profile format. + * Each entry maps a unique UUID to a filename, allowing frames to reference + * their source files for displaying source code context in the profiler UI. + * This table is optional and only present in newer Firefox versions. + * + * Note: In Gecko profiles, this table only contains sources for JavaScript code. + * The processed profile format expands this to include native code sources as well. + */ +export type GeckoSourceTable = { + schema: { + uuid: 0; + filename: 1; + }; + data: Array< + [ + string, // UUID for the source + string, // Filename of the source + ] + >; +}; + export type GeckoProfileWithMeta = { counters?: GeckoCounter[]; // Optional because older Firefox versions may not have that data and @@ -556,6 +578,8 @@ export type GeckoProfileWithMeta = { meta: Meta; libs: LibMapping[]; pages?: PageList; + // Optional because older Firefox versions may not have this table. + sources?: GeckoSourceTable; threads: GeckoThread[]; pausedRanges: PausedRange[]; processes: GeckoSubprocessProfile[]; diff --git a/src/types/profile.ts b/src/types/profile.ts index 645b21779e..cb7c2c0174 100644 --- a/src/types/profile.ts +++ b/src/types/profile.ts @@ -17,6 +17,7 @@ export type IndexIntoLibs = number; export type IndexIntoNativeSymbolTable = number; export type IndexIntoCategoryList = number; export type IndexIntoSubcategoryListForCategory = number; +export type IndexIntoSourceTable = number; export type ResourceTypeEnum = number; export type ThreadIndex = number; // The Tid is most often a number. However in some cases such as merged profiles @@ -921,10 +922,27 @@ export type ProfileMeta = { gramsOfCO2ePerKWh?: number; }; +/** + * Table containing source code file references in the processed profile format. + * Maps UUIDs to filenames for JavaScript sources, while native code sources + * have null UUIDs. Native code sources are added during the symbolication process. + * This allows the profiler to display source code context when viewing frames. + * This is an expanded version of GeckoSourceTable that includes native code sources + * in addition to JavaScript sources. + */ +export type SourceTable = { + length: number; + uuid: Array; + filename: Array; +}; + export type RawProfileSharedData = { // Strings for profiles are collected into a single table, and are referred to by // their index by other tables. stringArray: string[]; + // Optional sources table for JS source UUID to URL mapping. + // Added for UUID-based source fetching. + sources: SourceTable; }; /** From 0a6b00137617cc2ee2a2f2bffa3fb60a0b3140e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Fri, 19 Sep 2025 11:01:57 +0200 Subject: [PATCH 03/22] Add source table to the derived thread --- src/profile-logic/profile-data.ts | 4 +++- src/selectors/per-thread/thread.tsx | 1 + src/test/fixtures/utils.ts | 3 ++- src/types/profile-derived.ts | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts index 76bff5aecf..2510f8637b 100644 --- a/src/profile-logic/profile-data.ts +++ b/src/profile-logic/profile-data.ts @@ -2315,7 +2315,8 @@ export function createThreadFromDerivedTables( rawThread: RawThread, samples: SamplesTable, stackTable: StackTable, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): Thread { const { processType, @@ -2375,6 +2376,7 @@ export function createThreadFromDerivedTables( samples, stackTable, stringTable, + sources, }; return thread; } diff --git a/src/selectors/per-thread/thread.tsx b/src/selectors/per-thread/thread.tsx index 78901c348b..f6c36e389a 100644 --- a/src/selectors/per-thread/thread.tsx +++ b/src/selectors/per-thread/thread.tsx @@ -146,6 +146,7 @@ export function getBasicThreadSelectorsPerThread( getSamplesTable, getStackTable, ProfileSelectors.getStringTable, + ProfileSelectors.getSourceTable, ProfileData.createThreadFromDerivedTables ); diff --git a/src/test/fixtures/utils.ts b/src/test/fixtures/utils.ts index 580f26e21a..d1e3f4d0cd 100644 --- a/src/test/fixtures/utils.ts +++ b/src/test/fixtures/utils.ts @@ -156,7 +156,8 @@ export function computeThreadFromRawThread( rawThread, samples, stackTable, - stringTable + stringTable, + shared.sources ); } diff --git a/src/types/profile-derived.ts b/src/types/profile-derived.ts index b2e444deea..586733c777 100644 --- a/src/types/profile-derived.ts +++ b/src/types/profile-derived.ts @@ -32,6 +32,7 @@ import type { WeightType, IndexIntoFrameTable, IndexIntoSubcategoryListForCategory, + SourceTable, } from './profile'; import type { IndexedArray } from './utils'; import type { BitSet } from '../utils/bitset'; @@ -100,6 +101,9 @@ export type Thread = { // Strings for profiles are collected into a single table, and are referred to by // their index by other tables. stringTable: StringTable; + // Sources for profiles are collected into a single table, containing file sources + // with their UUIDs and filenames. + sources: SourceTable; // The stack samples collected for this thread. This field is different from // RawThread in that the `time` column is always present. samples: SamplesTable; From bc3505e972f9258b3771118d689a80475044da57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 13:20:59 +0200 Subject: [PATCH 04/22] Change funcTable fileName array into sources array Note that this gathers all sources, including the JS and native sources. This way, we have a single source of truth for them. This patch: - Changes the `thread.funcTable` to have a `source` array instead of a `fileName` array. - Changes the rest of the codebase to make sure that everything uses the new format. --- src/components/shared/CallNodeContextMenu.tsx | 25 ++++--- src/components/shared/MarkerContextMenu.tsx | 2 +- src/components/tooltip/CallNode.tsx | 7 +- src/profile-logic/call-tree.ts | 3 +- src/profile-logic/data-structures.ts | 4 +- src/profile-logic/import/chrome.ts | 30 +++++--- src/profile-logic/import/dhat.ts | 15 ++-- src/profile-logic/import/simpleperf.ts | 2 +- src/profile-logic/js-tracer.tsx | 31 +++++--- src/profile-logic/line-timings.ts | 8 +- src/profile-logic/merge-compare.ts | 31 ++++++-- src/profile-logic/process-profile.ts | 74 +++++++++++++------ src/profile-logic/profile-compacting.ts | 28 ++++--- src/profile-logic/profile-data.ts | 65 ++++++++++++---- src/profile-logic/sanitize.ts | 4 +- src/profile-logic/symbolication.ts | 34 ++++++++- src/profile-logic/transforms.ts | 3 +- src/selectors/per-thread/index.ts | 24 ++++-- src/selectors/per-thread/stack-sample.ts | 8 +- src/selectors/per-thread/thread.tsx | 11 ++- .../components/CallNodeContextMenu.test.tsx | 9 ++- src/test/components/FlameGraph.test.tsx | 27 +++++-- src/test/fixtures/profiles/call-nodes.ts | 2 +- .../fixtures/profiles/processed-profile.ts | 4 +- src/test/fixtures/utils.ts | 38 +++++++++- src/test/store/bottom-box.test.ts | 1 + src/test/store/js-tracer.test.ts | 20 +++-- src/test/store/symbolication.test.ts | 33 +++++---- src/test/store/transforms.test.ts | 17 ++++- src/test/unit/line-timings.test.ts | 15 ++-- src/test/unit/process-profile.test.ts | 10 ++- src/test/unit/profile-data.test.ts | 8 +- src/test/unit/profile-tree.test.ts | 18 +++-- src/types/profile.ts | 2 +- 34 files changed, 430 insertions(+), 183 deletions(-) diff --git a/src/components/shared/CallNodeContextMenu.tsx b/src/components/shared/CallNodeContextMenu.tsx index 997650d2d2..7e2633f6cf 100644 --- a/src/components/shared/CallNodeContextMenu.tsx +++ b/src/components/shared/CallNodeContextMenu.tsx @@ -181,15 +181,16 @@ class CallNodeContextMenuImpl extends React.PureComponent { const { callNodeIndex, - thread: { stringTable, funcTable }, + thread: { stringTable, funcTable, sources }, callNodeInfo, } = rightClickedCallNodeInfo; const funcIndex = callNodeInfo.funcForNode(callNodeIndex); - const stringIndex = funcTable.fileName[funcIndex]; - if (stringIndex === null) { + const sourceIndex = funcTable.source[funcIndex]; + if (sourceIndex === null) { return null; } + const stringIndex = sources.filename[sourceIndex]; return stringTable.getString(stringIndex); } @@ -252,7 +253,7 @@ class CallNodeContextMenuImpl extends React.PureComponent { const { callNodeIndex, - thread: { funcTable, resourceTable, stringTable }, + thread: { funcTable, resourceTable, stringTable, sources }, callNodeInfo, } = rightClickedCallNodeInfo; @@ -272,7 +273,8 @@ class CallNodeContextMenuImpl extends React.PureComponent { funcIndex, funcTable, resourceTable, - stringTable + stringTable, + sources ); return funcName + (originAnnotation ? ` [${originAnnotation}]` : ''); }) @@ -502,7 +504,7 @@ class CallNodeContextMenuImpl extends React.PureComponent { const { callNodePath, - thread: { funcTable, stringTable, resourceTable }, + thread: { funcTable, stringTable, resourceTable, sources }, } = rightClickedCallNodeInfo; const funcIndex = callNodePath[callNodePath.length - 1]; @@ -512,10 +514,13 @@ class CallNodeContextMenuImpl extends React.PureComponent { const isJS = funcTable.isJS[funcIndex]; if (isJS) { - const fileNameIndex = funcTable.fileName[funcIndex]; - return fileNameIndex === null - ? null - : stringTable.getString(fileNameIndex); + const sourceIndex = funcTable.source[funcIndex]; + if (sourceIndex === null) { + return null; + } + + const fileNameIndex = sources.filename[sourceIndex]; + return stringTable.getString(fileNameIndex); } const resourceIndex = funcTable.resource[funcIndex]; if (resourceIndex === -1) { diff --git a/src/components/shared/MarkerContextMenu.tsx b/src/components/shared/MarkerContextMenu.tsx index b38c451f63..c1243223d8 100644 --- a/src/components/shared/MarkerContextMenu.tsx +++ b/src/components/shared/MarkerContextMenu.tsx @@ -58,7 +58,7 @@ type StateProps = { readonly implementationFilter: ImplementationFilter; readonly getMarkerLabelToCopy: (param: MarkerIndex) => string; readonly profiledThreadIds: Set; - innerWindowIDToPageMap: Map | null; + readonly innerWindowIDToPageMap: Map | null; }; type DispatchProps = { diff --git a/src/components/tooltip/CallNode.tsx b/src/components/tooltip/CallNode.tsx index b150ca7b49..e77f765143 100644 --- a/src/components/tooltip/CallNode.tsx +++ b/src/components/tooltip/CallNode.tsx @@ -375,8 +375,11 @@ export class TooltipCallNode extends React.PureComponent { let fileName = null; - const fileNameIndex = thread.funcTable.fileName[funcIndex]; - if (fileNameIndex !== null) { + const sourceIndex = thread.funcTable.source[funcIndex]; + + const { sources } = thread; + if (sourceIndex !== null) { + const fileNameIndex = sources.filename[sourceIndex]; let fileNameURL = thread.stringTable.getString(fileNameIndex); // fileNameURL could be a path from symbolication (potentially using "special path" // syntax, e.g. hg:...), or it could be a URL, if the function is a JS function. diff --git a/src/profile-logic/call-tree.ts b/src/profile-logic/call-tree.ts index f1da6896e8..5802354430 100644 --- a/src/profile-logic/call-tree.ts +++ b/src/profile-logic/call-tree.ts @@ -605,7 +605,8 @@ export class CallTree { funcIndex, this._thread.funcTable, this._thread.resourceTable, - this._thread.stringTable + this._thread.stringTable, + this._thread.sources ); } diff --git a/src/profile-logic/data-structures.ts b/src/profile-logic/data-structures.ts index 0e77b0d7ee..dfb9994e8e 100644 --- a/src/profile-logic/data-structures.ts +++ b/src/profile-logic/data-structures.ts @@ -161,7 +161,7 @@ export function getEmptyFuncTable(): FuncTable { relevantForJS: [], name: [], resource: [], - fileName: [], + source: [], lineNumber: [], columnNumber: [], length: 0, @@ -178,7 +178,7 @@ export function shallowCloneFuncTable(funcTable: FuncTable): FuncTable { relevantForJS: funcTable.relevantForJS.slice(), name: funcTable.name.slice(), resource: funcTable.resource.slice(), - fileName: funcTable.fileName.slice(), + source: funcTable.source.slice(), lineNumber: funcTable.lineNumber.slice(), columnNumber: funcTable.columnNumber.slice(), length: funcTable.length, diff --git a/src/profile-logic/import/chrome.ts b/src/profile-logic/import/chrome.ts index 8038af2abd..63d2f6c2c6 100644 --- a/src/profile-logic/import/chrome.ts +++ b/src/profile-logic/import/chrome.ts @@ -13,7 +13,7 @@ import type { } from 'firefox-profiler/types'; import { getEmptyProfile, getEmptyThread } from '../data-structures'; -import { StringTable } from '../../utils/string-table'; +import type { StringTable } from '../../utils/string-table'; import { ensureExists, coerce } from '../../utils/types'; import { INSTANT, @@ -23,6 +23,7 @@ import { } from 'firefox-profiler/app-logic/constants'; import { getOrCreateURIResource, getTimeRangeForThread } from '../profile-data'; +import { GlobalDataCollector } from '../global-data-collector'; // Chrome Tracing Event Spec: // https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview @@ -501,7 +502,8 @@ async function processTracingEvents( // new samples on our target interval of 500us. profile.meta.interval = 0.5; - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); + const globalDataCollector = new GlobalDataCollector(); + const stringTable = globalDataCollector.getStringTable(); let profileEvents: (ProfileEvent | CpuProfileEvent)[] = (eventsByName.get( 'Profile' @@ -639,8 +641,8 @@ async function processTracingEvents( ) : -1 ); - funcTable.fileName.push( - isJS ? stringTable.indexForString(url || '') : null + funcTable.source.push( + isJS && url ? globalDataCollector.indexForSource(null, url) : null ); funcTable.lineNumber.push( lineNumber === undefined ? null : lineNumber @@ -718,14 +720,16 @@ async function processTracingEvents( threadInfoByThread, eventsByName, profile, - (eventsByName.get('Screenshot') ?? []) as ScreenshotEvent[] + (eventsByName.get('Screenshot') ?? []) as ScreenshotEvent[], + stringTable ); extractMarkers( threadInfoByPidAndTid, threadInfoByThread, eventsByName, - profile + profile, + stringTable ); // Figure out the profiling start and end times if they haven't been found yet. @@ -800,6 +804,10 @@ async function processTracingEvents( return threadInfoA.tieBreakerIndex - threadInfoB.tieBreakerIndex; }); + // Add string array and sources from globalDataCollector to the profile + const { shared } = globalDataCollector.finish(); + profile.shared = shared; + return profile; } @@ -808,7 +816,8 @@ async function extractScreenshots( threadInfoByThread: Map, eventsByName: Map, profile: Profile, - screenshots: ScreenshotEvent[] + screenshots: ScreenshotEvent[], + stringTable: StringTable ): Promise { if (screenshots.length === 0) { // No screenshots were found, exit early. @@ -822,8 +831,6 @@ async function extractScreenshots( screenshots[0] ); - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); - const graphicsIndex = ensureExists(profile.meta.categories).findIndex( (category) => category.name === 'Graphics' ); @@ -904,7 +911,8 @@ function extractMarkers( threadInfoByPidAndTid: Map, threadInfoByThread: Map, eventsByName: Map, - profile: Profile + profile: Profile, + stringTable: StringTable ) { const otherCategoryIndex = ensureExists(profile.meta.categories).findIndex( (category) => category.name === 'Other' @@ -913,8 +921,6 @@ function extractMarkers( throw new Error('No "Other" category in empty profile category list'); } - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); - profile.meta.markerSchema = [ { name: 'EventDispatch', diff --git a/src/profile-logic/import/dhat.ts b/src/profile-logic/import/dhat.ts index 479d17bccf..ec07e36a0c 100644 --- a/src/profile-logic/import/dhat.ts +++ b/src/profile-logic/import/dhat.ts @@ -16,7 +16,7 @@ import { getEmptyUnbalancedNativeAllocationsTable, } from 'firefox-profiler/profile-logic/data-structures'; -import { StringTable } from 'firefox-profiler/utils/string-table'; +import { GlobalDataCollector } from 'firefox-profiler/profile-logic/global-data-collector'; import { ensureExists } from 'firefox-profiler/utils/types'; /** @@ -183,7 +183,8 @@ export function attemptToConvertDhat(json: unknown): Profile | null { const profile = getEmptyProfile(); profile.meta.product = dhat.cmd + ' (dhat)'; profile.meta.importedFrom = `dhat`; - const stringTable = StringTable.withBackingArray(profile.shared.stringArray); + const globalDataCollector = new GlobalDataCollector(); + const stringTable = globalDataCollector.getStringTable(); const allocationsTable = getEmptyUnbalancedNativeAllocationsTable(); const { funcTable, stackTable, frameTable } = getEmptyThread(); @@ -200,7 +201,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { funcTable.isJS.push(false); funcTable.relevantForJS.push(false); funcTable.resource.push(-1); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); const rootFuncIndex = funcTable.length++; @@ -269,7 +270,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { funcTable.isJS.push(false); funcTable.relevantForJS.push(false); funcTable.resource.push(-1); - funcTable.fileName.push(stringTable.indexForString(fileName)); + funcTable.source.push(globalDataCollector.indexForSource(null, fileName)); funcTable.lineNumber.push(line); funcTable.columnNumber.push(column); funcIndex = funcTable.length++; @@ -379,7 +380,7 @@ export function attemptToConvertDhat(json: unknown): Profile | null { thread.funcTable.isJS = funcTable.isJS.slice(); thread.funcTable.relevantForJS = funcTable.relevantForJS.slice(); thread.funcTable.resource = funcTable.resource.slice(); - thread.funcTable.fileName = funcTable.fileName.slice(); + thread.funcTable.source = funcTable.source.slice(); thread.funcTable.lineNumber = funcTable.lineNumber.slice(); thread.funcTable.columnNumber = funcTable.columnNumber.slice(); thread.funcTable.length = funcTable.length; @@ -408,5 +409,9 @@ export function attemptToConvertDhat(json: unknown): Profile | null { return thread; }); + // Get the final shared data from GlobalDataCollector + const { shared } = globalDataCollector.finish(); + profile.shared = shared; + return profile; } diff --git a/src/profile-logic/import/simpleperf.ts b/src/profile-logic/import/simpleperf.ts index 615916504c..52fe0a9831 100644 --- a/src/profile-logic/import/simpleperf.ts +++ b/src/profile-logic/import/simpleperf.ts @@ -130,7 +130,7 @@ class FirefoxFuncTable { this.funcTable.isJS.push(false); this.funcTable.relevantForJS.push(false); this.funcTable.resource.push(resourceIndex); - this.funcTable.fileName.push(null); + this.funcTable.source.push(null); this.funcTable.lineNumber.push(null); this.funcTable.columnNumber.push(null); diff --git a/src/profile-logic/js-tracer.tsx b/src/profile-logic/js-tracer.tsx index 6ab58a111b..2a18d95e13 100644 --- a/src/profile-logic/js-tracer.tsx +++ b/src/profile-logic/js-tracer.tsx @@ -20,6 +20,7 @@ import type { CategoryList, JsTracerTiming, Microseconds, + SourceTable, } from 'firefox-profiler/types'; // See the function below for more information. @@ -33,7 +34,8 @@ type ScriptLocationToFuncIndex = Map; */ function getScriptLocationToFuncIndex( thread: RawThread, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): ScriptLocationToFuncIndex { const { funcTable } = thread; const scriptLocationToFuncIndex = new Map(); @@ -43,9 +45,10 @@ function getScriptLocationToFuncIndex( } const line = funcTable.lineNumber[funcIndex]; const column = funcTable.columnNumber[funcIndex]; - const fileNameIndex = funcTable.fileName[funcIndex]; - if (column !== null && line !== null && fileNameIndex !== null) { - const fileName = stringTable.getString(fileNameIndex); + const sourceIndex = funcTable.source[funcIndex]; + if (column !== null && line !== null && sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + const fileName = stringTable.getString(urlIndex); const key = `${fileName}:${line}:${column}`; if (scriptLocationToFuncIndex.has(key)) { // Multiple functions map to this script location. @@ -76,7 +79,8 @@ function getScriptLocationToFuncIndex( export function getJsTracerTiming( jsTracer: JsTracerTable, thread: RawThread, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): JsTracerTiming[] { const jsTracerTiming: JsTracerTiming[] = []; const { funcTable } = thread; @@ -86,7 +90,8 @@ export function getJsTracerTiming( // Just recompute it. const scriptLocationToFuncIndex = getScriptLocationToFuncIndex( thread, - stringTable + stringTable, + sources ); // Go through all of the events. @@ -496,7 +501,8 @@ export function convertJsTracerToThreadWithoutSamples( fromThread: RawThread, stringTable: StringTable, jsTracer: JsTracerFixed, - categories: CategoryList + categories: CategoryList, + sources: SourceTable ): { thread: RawThread; stackMap: Map; @@ -541,7 +547,8 @@ export function convertJsTracerToThreadWithoutSamples( } const scriptLocationToFuncIndex = getScriptLocationToFuncIndex( thread, - stringTable + stringTable, + sources ); // Go through all of the JS tracer events, and build up the func, stack, and @@ -579,7 +586,7 @@ export function convertJsTracerToThreadWithoutSamples( funcTable.isJS.push(false); funcTable.resource.push(-1); funcTable.relevantForJS.push(true); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); @@ -737,14 +744,16 @@ export function convertJsTracerToThread( fromThread: RawThread, jsTracer: JsTracerTable, categories: CategoryList, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): RawThread { const jsTracerFixed = getJsTracerFixed(jsTracer); const { thread, stackMap } = convertJsTracerToThreadWithoutSamples( fromThread, stringTable, jsTracerFixed, - categories + categories, + sources ); thread.samples = getSelfTimeSamplesFromJsTracer( stringTable, diff --git a/src/profile-logic/line-timings.ts b/src/profile-logic/line-timings.ts index 4b821ed0fd..b29617de75 100644 --- a/src/profile-logic/line-timings.ts +++ b/src/profile-logic/line-timings.ts @@ -12,6 +12,7 @@ import type { StackLineInfo, LineTimings, LineNumber, + SourceTable, } from 'firefox-profiler/types'; import { getMatchingAncestorStackForInvertedCallNode } from './profile-data'; @@ -58,7 +59,8 @@ export function getStackLineInfo( stackTable: StackTable, frameTable: FrameTable, funcTable: FuncTable, - fileNameStringIndex: IndexIntoStringTable + fileNameStringIndex: IndexIntoStringTable, + sources: SourceTable ): StackLineInfo { // "self line" == "the line which a stack's self time is contributed to" const selfLineForAllStacks = []; @@ -74,7 +76,9 @@ export function getStackLineInfo( const frame = stackTable.frame[stackIndex]; const prefixStack = stackTable.prefix[stackIndex]; const func = frameTable.func[frame]; - const fileNameStringIndexOfThisStack = funcTable.fileName[func]; + const sourceIndex = funcTable.source[func]; + const fileNameStringIndexOfThisStack = + sourceIndex !== null ? (sources.filename[sourceIndex] ?? null) : null; let selfLine: LineNumber | null = null; let totalLines: Set | null = diff --git a/src/profile-logic/merge-compare.ts b/src/profile-logic/merge-compare.ts index 773c21f200..be1bdaabdd 100644 --- a/src/profile-logic/merge-compare.ts +++ b/src/profile-logic/merge-compare.ts @@ -204,9 +204,9 @@ export function mergeProfilesForDiffing( thread.funcTable.name, translationMapForStrings[i] ), - fileName: adjustNullableStringIndexes( - thread.funcTable.fileName, - translationMapForStrings[i] + source: adjustNullableSourceIndexes( + thread.funcTable.source, + translationMapForSources[i] ), }; thread.resourceTable = { @@ -693,6 +693,27 @@ function adjustNullableStringIndexes( }); } +function adjustNullableSourceIndexes( + sourceIndexes: ReadonlyArray, + translationMap: TranslationMapForSources +): Array { + return sourceIndexes.map((sourceIndex) => { + if (sourceIndex === null) { + return null; + } + const newSourceIndex = translationMap.get(sourceIndex); + if (newSourceIndex === undefined) { + throw new Error( + stripIndent` + Source with index ${sourceIndex} hasn't been found in the translation map. + This shouldn't happen and indicates a bug in the profiler's code. + ` + ); + } + return newSourceIndex; + }); +} + /** * This combines the library lists from multiple profiles. It returns a merged * Lib array, along with a translation maps that can be used in other functions @@ -844,7 +865,7 @@ function combineFuncTables( const resourceTranslationMap = translationMapsForResources[threadIndex]; for (let i = 0; i < funcTable.length; i++) { - const fileNameIndex = funcTable.fileName[i]; + const sourceIndex = funcTable.source[i]; const resourceIndex = funcTable.resource[i]; const newResourceIndex = resourceIndex >= 0 @@ -880,7 +901,7 @@ function combineFuncTables( newFuncTable.name.push(nameIndex); newFuncTable.resource.push(newResourceIndex); newFuncTable.relevantForJS.push(funcTable.relevantForJS[i]); - newFuncTable.fileName.push(fileNameIndex); + newFuncTable.source.push(sourceIndex); newFuncTable.lineNumber.push(lineNumber); newFuncTable.columnNumber.push(funcTable.columnNumber[i]); diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts index bd6f7f91a0..ee266f75c4 100644 --- a/src/profile-logic/process-profile.ts +++ b/src/profile-logic/process-profile.ts @@ -3,8 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { attemptToConvertChromeProfile } from './import/chrome'; import { attemptToConvertDhat } from './import/dhat'; -import { AddressLocator } from './address-locator'; import { GlobalDataCollector } from './global-data-collector'; +import { AddressLocator } from './address-locator'; import { resourceTypes, getEmptyExtensions, @@ -98,6 +98,7 @@ import type { MarkerPhase, Pid, GeckoMarkerSchema, + GeckoSourceTable, } from 'firefox-profiler/types'; import { decompress, isGzip } from 'firefox-profiler/utils/gz'; @@ -190,6 +191,7 @@ type ExtractionInfo = { { funcIndex: IndexIntoFuncTable; frameAddress: Address | null } >; globalDataCollector: GlobalDataCollector; + geckoSourceTable: GeckoSourceTable | undefined; }; /** @@ -206,7 +208,8 @@ export function extractFuncsAndResourcesFromFrameLocations( geckoThreadStringArray: string[], libs: LibMapping[], extensions: ExtensionTable = getEmptyExtensions(), - globalDataCollector: GlobalDataCollector + globalDataCollector: GlobalDataCollector, + geckoSourceTable: GeckoSourceTable | undefined ): { funcTable: FuncTable; resourceTable: ResourceTable; @@ -235,6 +238,7 @@ export function extractFuncsAndResourcesFromFrameLocations( libNameToResourceIndex: new Map(), stringToNewFuncIndexAndFrameAddress: new Map(), globalDataCollector, + geckoSourceTable, }; for (let i = 0; i < extensions.length; i++) { @@ -382,7 +386,7 @@ function _extractUnsymbolicatedFunction( funcTable.resource[funcIndex] = resourceIndex; funcTable.relevantForJS[funcIndex] = false; funcTable.isJS[funcIndex] = false; - funcTable.fileName[funcIndex] = null; + funcTable.source[funcIndex] = null; funcTable.lineNumber[funcIndex] = null; funcTable.columnNumber[funcIndex] = null; return { funcIndex, frameAddress: addressRelativeToLib }; @@ -445,7 +449,7 @@ function _extractCppFunction( funcTable.resource[newFuncIndex] = resourceIndex; funcTable.relevantForJS[newFuncIndex] = false; funcTable.isJS[newFuncIndex] = false; - funcTable.fileName[newFuncIndex] = null; + funcTable.source[newFuncIndex] = null; funcTable.lineNumber[newFuncIndex] = null; funcTable.columnNumber[newFuncIndex] = null; @@ -490,23 +494,32 @@ function _extractJsFunction( ): IndexIntoFuncTable | null { // Check for a JS location string. const jsMatch: RegExpResult = - // Given: "functionName (http://script.url/:1234:1234)" - // Captures: 1^^^^^^^^^^ 2^^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ - /^(.*) \((.+?):([0-9]+)(?::([0-9]+))?\)$/.exec(locationString) || - // Given: "http://script.url/:1234:1234" - // Captures: 2^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ - /^()(.+?):([0-9]+)(?::([0-9]+))?$/.exec(locationString); + // Given: "functionName (http://script.url/:1234:1234)" or "functionName (:1234:1234)[5]" + // Captures: 1^^^^^^^^^^ 2^^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ 5^^^ + /^(.*) \((.+?):([0-9]+)(?::([0-9]+))?\)(?:\[(\d+)\])?$/.exec( + locationString + ) || + // Given: "http://script.url/:1234:1234" or "(:1234:1234)[5]" + // Captures: 2^^^^^^^^^^^^^^^^^ 3^^^ 4^^^ 5^^^ + /^()(.+?):([0-9]+)(?::([0-9]+))?(?:\[(\d+)\])?$/.exec(locationString); if (!jsMatch) { return null; } - const { funcTable, stringTable, resourceTable, originToResourceIndex } = - extractionInfo; + const { + funcTable, + stringTable, + resourceTable, + originToResourceIndex, + globalDataCollector, + geckoSourceTable, + } = extractionInfo; // Case 4: JS function - A match was found in the location string in the format // of a JS function. - const [, funcName, rawScriptURI] = jsMatch; + const [, funcName, rawScriptURI, lineNoStr, columnNoStr, sourceIndex] = + jsMatch; const scriptURI = _getRealScriptURI(rawScriptURI); const resourceIndex = getOrCreateURIResource( @@ -516,6 +529,23 @@ function _extractJsFunction( originToResourceIndex ); + // Process the source index if it's provided. + let processedSourceIndex = null; + if (sourceIndex !== undefined) { + const geckoSourceIdx = parseInt(sourceIndex, 10); + // Look up the UUID for this source index from the process's sources table + if (geckoSourceTable && geckoSourceIdx < geckoSourceTable.data.length) { + const uuidIndex = geckoSourceTable.schema.uuid; + const uuid = geckoSourceTable.data[geckoSourceIdx][uuidIndex]; + processedSourceIndex = globalDataCollector.getSourceIndexByUuid(uuid); + } + } + + // If we don't have a source index from the sources table, create one using null uuid. + if (processedSourceIndex === null) { + processedSourceIndex = globalDataCollector.indexForSource(null, scriptURI); + } + let funcNameIndex; if (funcName) { funcNameIndex = stringTable.indexForString(funcName); @@ -526,9 +556,8 @@ function _extractJsFunction( // name. funcNameIndex = stringTable.indexForString(`(root scope) ${scriptURI}`); } - const fileName = stringTable.indexForString(scriptURI); - const lineNumber = parseInt(jsMatch[3], 10); - const columnNumber = jsMatch[4] ? parseInt(jsMatch[4], 10) : null; + const lineNumber = parseInt(lineNoStr, 10); + const columnNumber = columnNoStr ? parseInt(columnNoStr, 10) : null; // Add the function to the funcTable. const funcIndex = funcTable.length++; @@ -536,7 +565,7 @@ function _extractJsFunction( funcTable.resource[funcIndex] = resourceIndex; funcTable.relevantForJS[funcIndex] = false; funcTable.isJS[funcIndex] = true; - funcTable.fileName[funcIndex] = fileName; + funcTable.source[funcIndex] = processedSourceIndex; funcTable.lineNumber[funcIndex] = lineNumber; funcTable.columnNumber[funcIndex] = columnNumber; @@ -556,7 +585,7 @@ function _extractUnknownFunctionType( funcTable.resource[index] = -1; funcTable.relevantForJS[index] = relevantForJS; funcTable.isJS[index] = false; - funcTable.fileName[index] = null; + funcTable.source[index] = null; funcTable.lineNumber[index] = null; funcTable.columnNumber[index] = null; return index; @@ -1146,7 +1175,7 @@ function _processThread( _sortMarkers(thread.markers) ); - const { libs, pausedRanges, meta } = processProfile; + const { libs, pausedRanges, meta, sources } = processProfile; const { shutdownTime } = meta; const { funcTable, resourceTable, frameFuncs, frameAddresses } = @@ -1156,7 +1185,8 @@ function _processThread( thread.stringTable, libs, extensions, - globalDataCollector + globalDataCollector, + sources ); const nativeSymbols = getEmptyNativeSymbolTable(); const frameTable: FrameTable = _processFrameTable( @@ -1835,6 +1865,7 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { const profileGatheringLog = { ...(geckoProfile.profileGatheringLog || {}) }; const stringTable = globalDataCollector.getStringTable(); + const sources = globalDataCollector.getSources(); // Convert JS tracer information into their own threads. This mutates // the threads array. @@ -1846,7 +1877,8 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { thread, jsTracer, geckoProfile.meta.categories, - stringTable + stringTable, + sources ); jsTracerThread.isJsTracer = true; jsTracerThread.name = `JS Tracer of ${friendlyThreadName}`; diff --git a/src/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts index f4c8e07cbd..fb7ef2ddfe 100644 --- a/src/profile-logic/profile-compacting.ts +++ b/src/profile-logic/profile-compacting.ts @@ -12,6 +12,7 @@ import type { FuncTable, ResourceTable, NativeSymbolTable, + SourceTable, } from 'firefox-profiler/types'; export type CompactedProfileWithTranslationMaps = { @@ -59,7 +60,8 @@ function _gatherStringReferencesInProfile( _gatherStringReferencesInThread( thread, referencedStrings, - stringIndexMarkerFieldsByDataType + stringIndexMarkerFieldsByDataType, + profile.shared.sources ?? null ); } @@ -116,7 +118,8 @@ function _createProfileWithTranslatedStringIndexes( function _gatherStringReferencesInThread( thread: RawThread, referencedStrings: Uint8Array, - stringIndexMarkerFieldsByDataType: Map + stringIndexMarkerFieldsByDataType: Map, + sources: SourceTable ) { _gatherReferencesInMarkers( thread.markers, @@ -124,7 +127,7 @@ function _gatherStringReferencesInThread( stringIndexMarkerFieldsByDataType ); - _gatherReferencesInFuncTable(thread.funcTable, referencedStrings); + _gatherReferencesInFuncTable(thread.funcTable, referencedStrings, sources); _gatherReferencesInResourceTable(thread.resourceTable, referencedStrings); _gatherReferencesInNativeSymbols(thread.nativeSymbols, referencedStrings); } @@ -236,14 +239,16 @@ function _createMarkersWithTranslatedStringIndexes( function _gatherReferencesInFuncTable( funcTable: FuncTable, - referencedStrings: Uint8Array + referencedStrings: Uint8Array, + sources: SourceTable ) { for (let i = 0; i < funcTable.length; i++) { referencedStrings[funcTable.name[i]] = 1; - const fileNameIndex = funcTable.fileName[i]; - if (fileNameIndex !== null) { - referencedStrings[fileNameIndex] = 1; + const sourceIndex = funcTable.source[i]; + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + referencedStrings[urlIndex] = 1; } } } @@ -253,20 +258,19 @@ function _createFuncTableWithTranslatedStringIndexes( oldStringToNewStringPlusOne: Int32Array ): FuncTable { const newFuncTableNameCol = funcTable.name.slice(); - const newFuncTableFileNameCol = funcTable.fileName.slice(); + const newFuncTableSourceCol = funcTable.source.slice(); for (let i = 0; i < funcTable.length; i++) { const name = funcTable.name[i]; newFuncTableNameCol[i] = oldStringToNewStringPlusOne[name] - 1; - const fileName = funcTable.fileName[i]; - newFuncTableFileNameCol[i] = - fileName !== null ? oldStringToNewStringPlusOne[fileName] - 1 : null; + // Note: source indexes don't need translation as they point to sources table, not strings + // Source table will be handled separately in _createSourcesTableWithTranslatedStringIndexes } const newFuncTable = { ...funcTable, name: newFuncTableNameCol, - fileName: newFuncTableFileNameCol, + source: newFuncTableSourceCol, }; return newFuncTable; } diff --git a/src/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts index 2510f8637b..2ab26e7868 100644 --- a/src/profile-logic/profile-data.ts +++ b/src/profile-logic/profile-data.ts @@ -95,6 +95,7 @@ import type { Bytes, ThreadWithReservedFunctions, TabID, + SourceTable, } from 'firefox-profiler/types'; import type { CallNodeInfo, SuffixOrderIndex } from './call-node-info'; @@ -1489,7 +1490,11 @@ export function filterThreadToSearchStrings( return thread; } - return searchStrings.reduce(filterThreadToSearchString, thread); + return searchStrings.reduce( + (accThread, searchString) => + filterThreadToSearchString(accThread, searchString), + thread + ); }); } @@ -1501,8 +1506,14 @@ export function filterThreadToSearchString( return thread; } const lowercaseSearchString = searchString.toLowerCase(); - const { funcTable, frameTable, stackTable, stringTable, resourceTable } = - thread; + const { + funcTable, + frameTable, + stackTable, + stringTable, + resourceTable, + sources, + } = thread; function computeFuncMatchesSearch(func: IndexIntoFuncTable) { const nameIndex = funcTable.name[func]; @@ -1511,9 +1522,10 @@ export function filterThreadToSearchString( return true; } - const fileNameIndex = funcTable.fileName[func]; - if (fileNameIndex !== null) { - const fileNameString = stringTable.getString(fileNameIndex); + const sourceIndex = funcTable.source[func]; + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + const fileNameString = stringTable.getString(urlIndex); if (fileNameString.toLowerCase().includes(lowercaseSearchString)) { return true; } @@ -2833,6 +2845,7 @@ export function getOriginAnnotationForFunc( funcTable: FuncTable, resourceTable: ResourceTable, stringTable: StringTable, + sources: SourceTable, frameLineNumber: number | null = null, frameColumnNumber: number | null = null ): string { @@ -2845,11 +2858,14 @@ export function getOriginAnnotationForFunc( origin = stringTable.getString(resourceNameIndex); } - const fileNameIndex = funcTable.fileName[funcIndex]; + const sourceIndex = funcTable.source[funcIndex]; let fileName; - if (fileNameIndex !== null) { - fileName = stringTable.getString(fileNameIndex); + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + fileName = stringTable.getString(urlIndex); + } + if (fileName) { // Strip off any filename decorations from symbolication. It could be a path // (potentially using "special path" syntax, e.g. hg:...), or it could be a // URL, if the function is a JS function. If it's a path from symbolication, @@ -2919,13 +2935,12 @@ export function reserveFunctionsInThread( const resourceType = resourceTable.type[resourceIndex]; const name = resourceTable.name[resourceIndex]; const isJS = jsResourceTypes.includes(resourceType); - const fileName = resourceType === resourceTypes.url ? name : null; const funcIndex = funcTable.length; funcTable.isJS.push(isJS); funcTable.relevantForJS.push(isJS); funcTable.name.push(name); funcTable.resource.push(resourceIndex); - funcTable.fileName.push(fileName); + funcTable.source.push(null); funcTable.lineNumber.push(null); funcTable.columnNumber.push(null); funcTable.length++; @@ -3766,12 +3781,26 @@ export function findAddressProofForFile( file: string ): AddressProof | null { const { libs } = profile; - const { stringArray } = profile.shared; + const { stringArray, sources } = profile.shared; const stringTable = StringTable.withBackingArray(stringArray); for (const thread of profile.threads) { const { frameTable, funcTable, resourceTable } = thread; const fileStringIndex = stringTable.indexForString(file); - const func = funcTable.fileName.indexOf(fileStringIndex); + + // Find func by searching through sources table + let func = -1; + if (sources) { + for (let i = 0; i < funcTable.length; i++) { + const sourceIndex = funcTable.source[i]; + if (sourceIndex !== null) { + const urlIndex = sources.filename[sourceIndex]; + if (urlIndex === fileStringIndex) { + func = i; + break; + } + } + } + } if (func === -1) { continue; } @@ -3960,11 +3989,17 @@ export function getBottomBoxInfoForCallNode( stringTable, resourceTable, nativeSymbols, + sources, } = thread; const funcIndex = callNodeInfo.funcForNode(callNodeIndex); - const fileName = funcTable.fileName[funcIndex]; - const sourceFile = fileName !== null ? stringTable.getString(fileName) : null; + const sourceIndex = funcTable.source[funcIndex]; + let sourceFile = null; + if (sourceIndex !== null) { + const fileNameIndex = sources.filename[sourceIndex]; + sourceFile = + fileNameIndex !== null ? stringTable.getString(fileNameIndex) : null; + } const resource = funcTable.resource[funcIndex]; const libIndex = resource !== -1 && resourceTable.type[resource] === resourceTypes.library diff --git a/src/profile-logic/sanitize.ts b/src/profile-logic/sanitize.ts index 5f1e14e4be..e9eefdd8f7 100644 --- a/src/profile-logic/sanitize.ts +++ b/src/profile-logic/sanitize.ts @@ -481,7 +481,7 @@ function sanitizeThreadPII( newFuncTable.isJS.push(funcTable.isJS[funcIndex]); newFuncTable.relevantForJS.push(funcTable.isJS[funcIndex]); newFuncTable.resource.push(-1); - newFuncTable.fileName.push(null); + newFuncTable.source.push(null); newFuncTable.lineNumber.push(null); newFuncTable.columnNumber.push(null); newFuncTable.length++; @@ -496,7 +496,7 @@ function sanitizeThreadPII( const name = stringTable.indexForString(``); newFuncTable.name[funcIndex] = name; - newFuncTable.fileName[funcIndex] = null; + newFuncTable.source[funcIndex] = null; if (newFuncTable.resource[funcIndex] >= 0) { resourcesToBeSanitized.add(newFuncTable.resource[funcIndex]); } diff --git a/src/profile-logic/symbolication.ts b/src/profile-logic/symbolication.ts index 830cfab668..e812602ec7 100644 --- a/src/profile-logic/symbolication.ts +++ b/src/profile-logic/symbolication.ts @@ -538,7 +538,7 @@ function _partiallyApplySymbolicationStep( IndexIntoFrameTable[] > ): RawThread { - const { stringArray } = shared; + const { stringArray, sources } = shared; const { frameTable: oldFrameTable, funcTable: oldFuncTable, @@ -731,7 +731,11 @@ function _partiallyApplySymbolicationStep( let addressResult = resultsForLib.get(address); if (addressResult === undefined) { const symbolName = nativeSymbols.name[nativeSymbolIndex]; - const fileNameIndex = funcTable.fileName[oldFunc]; + let fileNameIndex = null; + const sourceIndex = funcTable.source[oldFunc]; + if (sourceIndex !== null) { + fileNameIndex = sources.filename[sourceIndex]; + } addressResult = { symbolAddress: nativeSymbols.address[nativeSymbolIndex], name: stringTable.getString(symbolName), @@ -778,14 +782,36 @@ function _partiallyApplySymbolicationStep( funcTable.isJS[funcIndex] = false; funcTable.relevantForJS[funcIndex] = false; funcTable.resource[funcIndex] = resourceIndex; - funcTable.fileName[funcIndex] = null; + funcTable.source[funcIndex] = null; funcTable.lineNumber[funcIndex] = null; funcTable.columnNumber[funcIndex] = null; // The name field will be filled below. funcTable.length++; } funcTable.name[funcIndex] = functionStringIndex; - funcTable.fileName[funcIndex] = fileNameStringIndex; + // Store filename in sources table if we have one + if (fileNameStringIndex !== null) { + // Find or create source entry + let sourceIndex = null; + for (let i = 0; i < sources.filename.length; i++) { + if ( + sources.filename[i] === fileNameStringIndex && + sources.uuid[i] === null + ) { + sourceIndex = i; + break; + } + } + if (sourceIndex === null) { + sourceIndex = sources.filename.length; + sources.filename.push(fileNameStringIndex); + sources.uuid.push(null); + sources.length++; + } + funcTable.source[funcIndex] = sourceIndex; + } else { + funcTable.source[funcIndex] = null; + } funcKeyToFuncMap.set(funcKey, funcIndex); } inlineExpansionFuncIndexes.push(funcIndex); diff --git a/src/profile-logic/transforms.ts b/src/profile-logic/transforms.ts index 84ab9c68e0..a1f373579f 100644 --- a/src/profile-logic/transforms.ts +++ b/src/profile-logic/transforms.ts @@ -1601,7 +1601,7 @@ export function getBacktraceItemsForStack( implementationFilter: ImplementationFilter, thread: Thread ): BacktraceItem[] { - const { funcTable, stringTable, resourceTable } = thread; + const { funcTable, stringTable, resourceTable, sources } = thread; const { stackTable, frameTable } = thread; const unfilteredPath = []; @@ -1633,6 +1633,7 @@ export function getBacktraceItemsForStack( funcTable, resourceTable, stringTable, + sources, frameLine, frameColumn ), diff --git a/src/selectors/per-thread/index.ts b/src/selectors/per-thread/index.ts index 1e667cde24..895056ada3 100644 --- a/src/selectors/per-thread/index.ts +++ b/src/selectors/per-thread/index.ts @@ -241,7 +241,8 @@ export const selectedNodeSelectors: NodeSelectors = (() => { const getLib: Selector = createSelector( selectedThreadSelectors.getSelectedCallNodePath, selectedThreadSelectors.getFilteredThread, - (selectedPath, { stringTable, funcTable, resourceTable }) => { + ProfileSelectors.getSourceTable, + (selectedPath, { stringTable, funcTable, resourceTable }, sources) => { if (!selectedPath.length) { return ''; } @@ -250,7 +251,8 @@ export const selectedNodeSelectors: NodeSelectors = (() => { ProfileData.getLeafFuncIndex(selectedPath), funcTable, resourceTable, - stringTable + stringTable, + sources ); } ); @@ -272,21 +274,27 @@ export const selectedNodeSelectors: NodeSelectors = (() => { UrlState.getSourceViewFile, selectedThreadSelectors.getCallNodeInfo, selectedThreadSelectors.getSelectedCallNodeIndex, + ProfileSelectors.getSourceTable, ( { stackTable, frameTable, funcTable, stringTable }: Thread, sourceViewFile, callNodeInfo, - selectedCallNodeIndex + selectedCallNodeIndex, + sources ): StackLineInfo | null => { if (sourceViewFile === null || selectedCallNodeIndex === null) { return null; } const selectedFunc = callNodeInfo.funcForNode(selectedCallNodeIndex); - const selectedFuncFile = funcTable.fileName[selectedFunc]; - if ( - selectedFuncFile === null || - stringTable.getString(selectedFuncFile) !== sourceViewFile - ) { + const sourceIndex = funcTable.source[selectedFunc]; + let selectedFuncFile = null; + if (sourceIndex !== null && sources) { + const urlIndex = sources.filename[sourceIndex]; + selectedFuncFile = + urlIndex !== null ? stringTable.getString(urlIndex) : null; + } + // TODO: Instead of checking the file name with a string comparison, check the source index. + if (selectedFuncFile === null || selectedFuncFile !== sourceViewFile) { return null; } return getStackLineInfoForCallNode( diff --git a/src/selectors/per-thread/stack-sample.ts b/src/selectors/per-thread/stack-sample.ts index ba16f91acb..101785e265 100644 --- a/src/selectors/per-thread/stack-sample.ts +++ b/src/selectors/per-thread/stack-sample.ts @@ -141,9 +141,11 @@ export function getStackAndSampleSelectorsPerThread( createSelector( threadSelectors.getFilteredThread, UrlState.getSourceViewFile, + ProfileSelectors.getSourceTable, ( { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile + sourceViewFile, + sources ): StackLineInfo | null => { if (sourceViewFile === null) { return null; @@ -152,7 +154,8 @@ export function getStackAndSampleSelectorsPerThread( stackTable, frameTable, funcTable, - stringTable.indexForString(sourceViewFile) + stringTable.indexForString(sourceViewFile), + sources ); } ); @@ -347,6 +350,7 @@ export function getStackAndSampleSelectorsPerThread( ProfileSelectors.getCategories, getCallTreeTimings, getWeightTypeForCallTree, + ProfileSelectors.getSourceTable, CallTree.getCallTree ); diff --git a/src/selectors/per-thread/thread.tsx b/src/selectors/per-thread/thread.tsx index f6c36e389a..fc8b619b89 100644 --- a/src/selectors/per-thread/thread.tsx +++ b/src/selectors/per-thread/thread.tsx @@ -339,10 +339,16 @@ export function getBasicThreadSelectorsPerThread( getJsTracerTable, getRawThread, ProfileSelectors.getStringTable, - (jsTracerTable, thread, stringTable) => + ProfileSelectors.getSourceTable, + (jsTracerTable, thread, stringTable, sources) => jsTracerTable === null ? null - : JsTracer.getJsTracerTiming(jsTracerTable, thread, stringTable) + : JsTracer.getJsTracerTiming( + jsTracerTable, + thread, + stringTable, + sources + ) ); /** @@ -466,6 +472,7 @@ export function getThreadSelectorsWithMarkersPerThread( const getFilteredThread: Selector = createSelector( _getImplementationFilteredThread, UrlState.getSearchStrings, + ProfileSelectors.getSourceTable, ProfileData.filterThreadToSearchStrings ); diff --git a/src/test/components/CallNodeContextMenu.test.tsx b/src/test/components/CallNodeContextMenu.test.tsx index 29f86db901..d865d1b8e6 100644 --- a/src/test/components/CallNodeContextMenu.test.tsx +++ b/src/test/components/CallNodeContextMenu.test.tsx @@ -14,6 +14,7 @@ import { CallNodeContextMenu } from '../../components/shared/CallNodeContextMenu import { storeWithProfile, blankStore } from '../fixtures/stores'; import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { createGeckoProfileWithJsTimings } from '../fixtures/profiles/gecko-profile'; +import { addSourceToTable, fireFullClick } from '../fixtures/utils'; import { changeRightClickedCallNode, changeExpandedCallNodes, @@ -22,7 +23,6 @@ import { import { selectedThreadSelectors } from '../../selectors/per-thread'; import { getSourceViewFile } from '../../selectors/url-state'; import { ensureExists } from '../../utils/types'; -import { fireFullClick } from '../fixtures/utils'; import { createBrowserConnection } from '../../app-logic/browser-connection'; import { updateBrowserConnectionStatus } from 'firefox-profiler/actions/app'; import { simulateWebChannel } from '../fixtures/mocks/web-channel'; @@ -67,13 +67,16 @@ describe('calltree/CallNodeContextMenu', function () { 'https://example.com/script.js' ); + // Create a source entry + const sourceIndex = addSourceToTable(profile.shared.sources, fileNameIndex); + const funcIndexA = funcNames.indexOf('A.js'); - thread.funcTable.fileName[funcIndexA] = fileNameIndex; + thread.funcTable.source[funcIndexA] = sourceIndex; thread.funcTable.lineNumber[funcIndexA] = 1; thread.funcTable.columnNumber[funcIndexA] = 111; const funcIndexB = funcNames.indexOf('B.js'); - thread.funcTable.fileName[funcIndexB] = fileNameIndex; + thread.funcTable.source[funcIndexB] = sourceIndex; thread.funcTable.lineNumber[funcIndexB] = 2; thread.funcTable.columnNumber[funcIndexB] = 222; diff --git a/src/test/components/FlameGraph.test.tsx b/src/test/components/FlameGraph.test.tsx index 4b3bcf514e..b32f0ddad8 100644 --- a/src/test/components/FlameGraph.test.tsx +++ b/src/test/components/FlameGraph.test.tsx @@ -43,6 +43,7 @@ import { fireFullClick, fireFullContextMenu, findFillTextPositionFromDrawLog, + addSourceToTable, } from '../fixtures/utils'; import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { mockRaf } from '../fixtures/mocks/request-animation-frame'; @@ -293,18 +294,30 @@ function setupFlameGraph() { // Add some file and line number to the profile so that tooltips generate // an interesting snapshot. const { funcTable } = profile.threads[0]; + + // Create source entries. + const defaultFileIndex = stringTable.indexForString('path/to/file'); + const defaultSourceIndex = addSourceToTable( + profile.shared.sources, + defaultFileIndex + ); + + const bFileIndex = stringTable.indexForString('path/for/B'); + const bSourceIndex = addSourceToTable(profile.shared.sources, bFileIndex); + + const jFileIndex = stringTable.indexForString( + 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28' + ); + const jSourceIndex = addSourceToTable(profile.shared.sources, jFileIndex); + for (let funcIndex = 0; funcIndex < funcTable.length; funcIndex++) { funcTable.lineNumber[funcIndex] = funcIndex + 10; funcTable.columnNumber[funcIndex] = funcIndex + 100; - funcTable.fileName[funcIndex] = stringTable.indexForString('path/to/file'); + funcTable.source[funcIndex] = defaultSourceIndex; } - funcTable.fileName[funcNamesDict.B] = - stringTable.indexForString('path/for/B'); - - funcTable.fileName[funcNamesDict.J] = stringTable.indexForString( - 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28' - ); + funcTable.source[funcNamesDict.B] = bSourceIndex; + funcTable.source[funcNamesDict.J] = jSourceIndex; const store = storeWithProfile(profile); store.dispatch(changeSelectedTab('flame-graph')); diff --git a/src/test/fixtures/profiles/call-nodes.ts b/src/test/fixtures/profiles/call-nodes.ts index 0311c75220..fcc88e636b 100644 --- a/src/test/fixtures/profiles/call-nodes.ts +++ b/src/test/fixtures/profiles/call-nodes.ts @@ -51,7 +51,7 @@ export default function getProfile(): Profile { isJS: Array(funcNames.length).fill(false), resource: Array(funcNames.length).fill(-1), relevantForJS: Array(funcNames.length).fill(false), - fileName: Array(funcNames.length).fill(''), + source: Array(funcNames.length).fill(null), lineNumber: Array(funcNames.length).fill(null), columnNumber: Array(funcNames.length).fill(null), length: funcNames.length, diff --git a/src/test/fixtures/profiles/processed-profile.ts b/src/test/fixtures/profiles/processed-profile.ts index 02fbff6932..43504927cd 100644 --- a/src/test/fixtures/profiles/processed-profile.ts +++ b/src/test/fixtures/profiles/processed-profile.ts @@ -900,7 +900,7 @@ function _buildThreadFromTextOnlyStacks( // Create the FuncTable. funcNames.forEach((funcName) => { funcTable.name.push(stringTable.indexForString(funcName)); - funcTable.fileName.push(null); + funcTable.source.push(null); funcTable.relevantForJS.push(funcName.endsWith('-relevantForJS')); funcTable.isJS.push(_isJsFunctionName(funcName)); funcTable.lineNumber.push(null); @@ -955,7 +955,7 @@ function _buildThreadFromTextOnlyStacks( // Find the file name from the function name const fileName = _findFileNameFromFuncName(funcNameWithModifier); if (fileName) { - funcTable.fileName[funcIndex] = stringTable.indexForString(fileName); + funcTable.source[funcIndex] = globalDataCollector.indexForSource(null, fileName); } const category = _findCategoryFromFuncName( diff --git a/src/test/fixtures/utils.ts b/src/test/fixtures/utils.ts index d1e3f4d0cd..475cf7a3c4 100644 --- a/src/test/fixtures/utils.ts +++ b/src/test/fixtures/utils.ts @@ -34,6 +34,7 @@ import type { RawThread, IndexIntoCategoryList, SampleUnits, + SourceTable, } from 'firefox-profiler/types'; import { ensureExists } from 'firefox-profiler/utils/types'; @@ -317,8 +318,14 @@ export function formatStack( stack: IndexIntoStackTable ): string { const lines = []; - const { stackTable, frameTable, funcTable, stringTable, resourceTable } = - thread; + const { + stackTable, + frameTable, + funcTable, + stringTable, + resourceTable, + sources, + } = thread; for ( let stackIndex: IndexIntoStackTable | null = stack; stackIndex !== null; @@ -334,6 +341,7 @@ export function formatStack( funcTable, resourceTable, stringTable, + sources, frameLine, frameColumn ); @@ -609,3 +617,29 @@ function isControlInput(element: HTMLElement): boolean { ['button', 'submit', 'clear'].includes(element.type || '')) ); } + +/** + * Adds a source entry to the sources table and returns the index. + * If a source with the same URL already exists, returns the existing index. + * This is a test utility for setting up test profiles. + */ +export function addSourceToTable( + sources: SourceTable, + urlStringIndex: number, + uuid: string | null = null +): number { + // Check if source already exists + for (let i = 0; i < sources.filename.length; i++) { + if (sources.filename[i] === urlStringIndex && sources.uuid[i] === uuid) { + return i; + } + } + + // Add new source entry + const sourceIndex = sources.filename.length; + sources.filename.push(urlStringIndex); + sources.uuid.push(uuid); + sources.length = sources.filename.length; + + return sourceIndex; +} diff --git a/src/test/store/bottom-box.test.ts b/src/test/store/bottom-box.test.ts index 18de69f344..8612ae79c5 100644 --- a/src/test/store/bottom-box.test.ts +++ b/src/test/store/bottom-box.test.ts @@ -58,6 +58,7 @@ describe('bottom box', function () { funcNames: funcNamesPerThread[0], funcNamesDict: funcNamesDictPerThread[0], nativeSymbolsDict: nativeSymbolsDictPerThread[0], + sources: profile.shared.sources, }; } diff --git a/src/test/store/js-tracer.test.ts b/src/test/store/js-tracer.test.ts index 02f6a0bf51..23fbebe754 100644 --- a/src/test/store/js-tracer.test.ts +++ b/src/test/store/js-tracer.test.ts @@ -12,7 +12,7 @@ import { } from '../../profile-logic/js-tracer'; import { getEmptyProfile } from '../../profile-logic/data-structures'; import { StringTable } from '../../utils/string-table'; -import { formatTree } from '../fixtures/utils'; +import { formatTree, addSourceToTable } from '../fixtures/utils'; import { getProfileFromTextSamples, getProfileWithJsTracerEvents, @@ -137,7 +137,8 @@ describe('convertJsTracerToThread', function () { existingThread, jsTracer, categories, - stringTable + stringTable, + profile.shared.sources ), ]; const { getState } = storeWithProfile(profile); @@ -354,26 +355,23 @@ describe('selectors/getJsTracerTiming', function () { const fooColumn = 5; thread.funcTable.lineNumber[foo] = fooLine; thread.funcTable.columnNumber[foo] = fooColumn; - thread.funcTable.fileName[foo] = stringTable.indexForString( - 'https://mozilla.org' - ); + const fooUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[foo] = addSourceToTable(profile.shared.sources, fooUrlIndex); const bar = funcNamesDict['Bar.js']; const barLine = 7; const barColumn = 11; thread.funcTable.lineNumber[bar] = barLine; thread.funcTable.columnNumber[bar] = barColumn; - thread.funcTable.fileName[bar] = stringTable.indexForString( - 'https://mozilla.org' - ); + const barUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[bar] = addSourceToTable(profile.shared.sources, barUrlIndex); const baz = funcNamesDict['Baz.js']; // Use bar's line and column information. thread.funcTable.lineNumber[baz] = barLine; thread.funcTable.columnNumber[baz] = barColumn; - thread.funcTable.fileName[baz] = stringTable.indexForString( - 'https://mozilla.org' - ); + const bazUrlIndex = stringTable.indexForString('https://mozilla.org'); + thread.funcTable.source[baz] = addSourceToTable(profile.shared.sources, bazUrlIndex); // Manually update the JS tracer events to point to the right column numbers. jsTracer.line[2] = fooLine; diff --git a/src/test/store/symbolication.test.ts b/src/test/store/symbolication.test.ts index 384377341f..8f7065ec8b 100644 --- a/src/test/store/symbolication.test.ts +++ b/src/test/store/symbolication.test.ts @@ -276,8 +276,17 @@ describe('doSymbolicateProfile', function () { const thread = getThread(getState()); const { frameTable, funcTable, stringTable } = thread; + const sources = ProfileViewSelectors.getSourceTable(getState()); expect(funcTable.length).toBeGreaterThanOrEqual(4); + // Helper function to get filename from source index + const getFileName = (funcIndex: number): string | null => { + const sourceIndex = funcTable.source[funcIndex]; + if (sourceIndex === null) return null; + const urlIndex = sources.filename[sourceIndex]; + return stringTable.getString(urlIndex); + }; + const [ firstSymbolFuncIndex, secondSymbolFuncIndex, @@ -315,27 +324,19 @@ describe('doSymbolicateProfile', function () { last symbol (first_and_last.cpp)`); // The first and last symbol function should have the filename first_and_last.cpp. - expect(funcTable.fileName[firstSymbolFuncIndex]).toBe( - funcTable.fileName[lastSymbolFuncIndex] + expect(getFileName(firstSymbolFuncIndex)).toBe( + getFileName(lastSymbolFuncIndex) ); - let fileNameStringIndex = funcTable.fileName[firstSymbolFuncIndex]; - expect(fileNameStringIndex).not.toBeNull(); - let fileName = - fileNameStringIndex !== null - ? stringTable.getString(fileNameStringIndex) - : ''; + let fileName = getFileName(firstSymbolFuncIndex); + expect(fileName).not.toBeNull(); expect(fileName).toBe('first_and_last.cpp'); // The second and third symbol function should have the filename second_and_third.rs. - expect(funcTable.fileName[secondSymbolFuncIndex]).toBe( - funcTable.fileName[thirdSymbolFuncIndex] + expect(getFileName(secondSymbolFuncIndex)).toBe( + getFileName(thirdSymbolFuncIndex) ); - fileNameStringIndex = funcTable.fileName[secondSymbolFuncIndex]; - expect(fileNameStringIndex).not.toBeNull(); - fileName = - fileNameStringIndex !== null - ? stringTable.getString(fileNameStringIndex) - : ''; + fileName = getFileName(secondSymbolFuncIndex); + expect(fileName).not.toBeNull(); expect(fileName).toBe('second_and_third.rs'); // Check line numbers. diff --git a/src/test/store/transforms.test.ts b/src/test/store/transforms.test.ts index e386878699..42287d224c 100644 --- a/src/test/store/transforms.test.ts +++ b/src/test/store/transforms.test.ts @@ -26,6 +26,7 @@ import { changeCallTreeSummaryStrategy, } from '../../actions/profile-view'; import { selectedThreadSelectors } from '../../selectors/per-thread'; +import * as ProfileSelectors from '../../selectors/profile'; describe('"focus-subtree" transform', function () { describe('on a call tree', function () { @@ -1223,11 +1224,13 @@ describe('"collapse-direct-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const sources = ProfileSelectors.getSourceTable(getState()); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileStringIndex, + sources ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1405,11 +1408,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const sources = ProfileSelectors.getSourceTable(getState()); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileStringIndex, + sources ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1516,11 +1521,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const sources = ProfileSelectors.getSourceTable(getState()); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileStringIndex, + sources ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1650,11 +1657,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const sources = ProfileSelectors.getSourceTable(getState()); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileStringIndex, + sources ); const lineTimings = getLineTimings(stackLineInfo, samples); diff --git a/src/test/unit/line-timings.test.ts b/src/test/unit/line-timings.test.ts index 17de471bfc..0814474d9a 100644 --- a/src/test/unit/line-timings.test.ts +++ b/src/test/unit/line-timings.test.ts @@ -17,6 +17,7 @@ import type { CallNodePath, Thread, IndexIntoCategoryList, + SourceTable, } from 'firefox-profiler/types'; describe('getStackLineInfo', function () { @@ -35,7 +36,8 @@ describe('getStackLineInfo', function () { stackTable, frameTable, funcTable, - fileOne + fileOne, + profile.shared.sources ); // Expect the returned arrays to have the same length as the stackTable. @@ -46,14 +48,15 @@ describe('getStackLineInfo', function () { }); describe('getLineTimings for getStackLineInfo', function () { - function getTimings(thread: Thread, file: string) { + function getTimings(thread: Thread, file: string, sources: SourceTable) { const { stackTable, frameTable, funcTable, samples, stringTable } = thread; const fileStringIndex = stringTable.indexForString(file); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileStringIndex, + sources ); return getLineTimings(stackLineInfo, samples); } @@ -66,7 +69,7 @@ describe('getLineTimings for getStackLineInfo', function () { B[file:file.js][line:30] `); const [thread] = derivedThreads; - const lineTimings = getTimings(thread, 'file.js'); + const lineTimings = getTimings(thread, 'file.js', profile.shared.sources); expect(lineTimings.totalLineHits.get(20)).toBe(1); expect(lineTimings.totalLineHits.get(30)).toBe(1); expect(lineTimings.totalLineHits.size).toBe(2); // no other hits @@ -84,7 +87,7 @@ describe('getLineTimings for getStackLineInfo', function () { `); const [thread] = derivedThreads; - const lineTimingsOne = getTimings(thread, 'one.js'); + const lineTimingsOne = getTimings(thread, 'one.js', profile.shared.sources); expect(lineTimingsOne.totalLineHits.get(20)).toBe(2); expect(lineTimingsOne.totalLineHits.get(21)).toBe(1); // one.js line 30 was hit in every sample, twice in the first sample @@ -98,7 +101,7 @@ describe('getLineTimings for getStackLineInfo', function () { expect(lineTimingsOne.selfLineHits.get(30)).toBe(1); expect(lineTimingsOne.selfLineHits.size).toBe(1); // no other hits - const lineTimingsTwo = getTimings(thread, 'two.js'); + const lineTimingsTwo = getTimings(thread, 'two.js', profile.shared.sources); expect(lineTimingsTwo.totalLineHits.get(10)).toBe(1); expect(lineTimingsTwo.totalLineHits.get(11)).toBe(1); expect(lineTimingsTwo.totalLineHits.get(40)).toBe(1); diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index 0dfcbd5f7a..e93ab12944 100644 --- a/src/test/unit/process-profile.test.ts +++ b/src/test/unit/process-profile.test.ts @@ -112,9 +112,13 @@ describe('extract functions and resource from location strings', function () { geckoThreadStringArray, libs, extensions, - globalDataCollector + globalDataCollector, + undefined ); + const { + shared: { sources }, + } = globalDataCollector.finish(); const stringTable = globalDataCollector.getStringTable(); expect( @@ -125,7 +129,9 @@ describe('extract functions and resource from location strings', function () { const funcName = stringTable.getString(funcTable.name[funcIndex]); const resourceIndex = funcTable.resource[funcIndex]; const isJS = funcTable.isJS[funcIndex]; - const fileNameIndex = funcTable.fileName[funcIndex]; + const sourceIndex = funcTable.source[funcIndex]; + const fileNameIndex = + sourceIndex !== null ? sources.filename[sourceIndex] : null; const fileName = fileNameIndex === null ? null : stringTable.getString(fileNameIndex); const lineNumber = funcTable.lineNumber[funcIndex]; diff --git a/src/test/unit/profile-data.test.ts b/src/test/unit/profile-data.test.ts index 80bd0a3bb1..96bdf4e86d 100644 --- a/src/test/unit/profile-data.test.ts +++ b/src/test/unit/profile-data.test.ts @@ -261,10 +261,12 @@ describe('process-profile', function () { expect(funcTableNames[2]).toEqual('0x100001a45'); expect(funcTableNames[3]).toEqual('Startup::XRE_Main'); expect(funcTableNames[4]).toEqual('frobnicate'); - const chromeStringIndex = thread.funcTable.fileName[4]; - if (typeof chromeStringIndex !== 'number') { - throw new Error('chromeStringIndex must be a number'); + const chromeSourceIndex = thread.funcTable.source[4]; + if (typeof chromeSourceIndex !== 'number') { + throw new Error('chromeSourceIndex must be a number'); } + const chromeStringIndex = + profile.shared.sources.filename[chromeSourceIndex]; expect(shared.stringArray[chromeStringIndex]).toEqual('chrome://blargh'); expect(thread.funcTable.lineNumber[4]).toEqual(34); expect(thread.funcTable.columnNumber[4]).toEqual(35); diff --git a/src/test/unit/profile-tree.test.ts b/src/test/unit/profile-tree.test.ts index 0ea503721f..4b4c70d513 100644 --- a/src/test/unit/profile-tree.test.ts +++ b/src/test/unit/profile-tree.test.ts @@ -25,6 +25,7 @@ import { functionListTreeFromProfile, formatTree, formatTreeIncludeCategories, + addSourceToTable, } from '../fixtures/utils'; import { ensureExists } from 'firefox-profiler/utils/types'; import type { CallNodePath } from 'firefox-profiler/types'; @@ -669,9 +670,7 @@ describe('diffing trees', function () { describe('origin annotation', function () { const { - profile: { - threads: [thread], - }, + profile, stringTable, funcNamesPerThread: [funcNames], } = getProfileFromTextSamples(` @@ -680,6 +679,9 @@ describe('origin annotation', function () { C D `); + const { + threads: [thread], + } = profile; function addResource( funcName: string, @@ -690,8 +692,11 @@ describe('origin annotation', function () { const resourceIndex = thread.resourceTable.length; const funcIndex = funcNames.indexOf(funcName); thread.funcTable.resource[funcIndex] = resourceIndex; - thread.funcTable.fileName[funcIndex] = location - ? stringTable.indexForString(location) + thread.funcTable.source[funcIndex] = location + ? addSourceToTable( + profile.shared.sources, + stringTable.indexForString(location) + ) : null; thread.resourceTable.lib.push(-1); thread.resourceTable.name.push(stringTable.indexForString(name)); @@ -724,7 +729,8 @@ describe('origin annotation', function () { funcNames.indexOf(funcName), thread.funcTable, thread.resourceTable, - stringTable + stringTable, + profile.shared.sources ); } diff --git a/src/types/profile.ts b/src/types/profile.ts index cb7c2c0174..90460a31a5 100644 --- a/src/types/profile.ts +++ b/src/types/profile.ts @@ -332,7 +332,7 @@ export type FuncTable = { // location of the *start* of the JS function. As for the information about which // which lines / columns inside the function were actually hit during execution, // that information is stored in the frameTable, not in the funcTable. - fileName: Array; + source: Array; lineNumber: Array; columnNumber: Array; From cd6b09622594a4348107576e52087d935c692418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 19:07:39 +0200 Subject: [PATCH 05/22] Update the test snapshots after the new sources table and funcTable changes --- .../__snapshots__/MenuButtons.test.tsx.snap | 6 +- .../__snapshots__/profile-view.test.ts.snap | 188 +- .../profile-conversion.test.ts.snap | 36236 ++++++++-------- .../profile-upgrading.test.ts.snap | 473 +- 4 files changed, 18634 insertions(+), 18269 deletions(-) diff --git a/src/test/components/__snapshots__/MenuButtons.test.tsx.snap b/src/test/components/__snapshots__/MenuButtons.test.tsx.snap index 1ef875b51b..388a311171 100644 --- a/src/test/components/__snapshots__/MenuButtons.test.tsx.snap +++ b/src/test/components/__snapshots__/MenuButtons.test.tsx.snap @@ -2211,7 +2211,7 @@ exports[`app/MenuButtons matches the snapshot for the menu buttons and class="menuButtonsDownloadSize" > ( - 1.56 kB + 1.58 kB ) @@ -2329,7 +2329,7 @@ exports[`app/MenuButtons matches the snapshot for the opened panel for class="menuButtonsDownloadSize" > ( - 1.54 kB + 1.56 kB ) @@ -2442,7 +2442,7 @@ exports[`app/MenuButtons matches the snapshot for the opened panel for class="menuButtonsDownloadSize" > ( - 1.56 kB + 1.58 kB ) diff --git a/src/test/store/__snapshots__/profile-view.test.ts.snap b/src/test/store/__snapshots__/profile-view.test.ts.snap index 97b694c07f..62e1823aa0 100644 --- a/src/test/store/__snapshots__/profile-view.test.ts.snap +++ b/src/test/store/__snapshots__/profile-view.test.ts.snap @@ -437,6 +437,11 @@ Object { }, ], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "A", "B", @@ -567,17 +572,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -634,6 +628,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -891,13 +896,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -1179,17 +1184,6 @@ Array [ null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1246,6 +1240,17 @@ Array [ -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1503,13 +1508,13 @@ Array [ }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -2747,17 +2752,6 @@ CallTree { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2814,6 +2808,17 @@ CallTree { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -2876,6 +2881,11 @@ CallTree { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3076,17 +3086,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3143,6 +3142,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3205,6 +3215,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3483,17 +3498,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3550,6 +3554,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3606,6 +3621,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -3804,17 +3824,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3871,6 +3880,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -3933,6 +3953,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, @@ -4131,17 +4156,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -4198,6 +4212,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isJsTracer": undefined, "isMainThread": false, @@ -4260,6 +4285,11 @@ Object { "weightType": "samples", }, "showMarkersInTimeline": undefined, + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stackTable": Object { "category": Array [ 0, diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap index 51aeb0ab04..74b829562e 100644 --- a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap @@ -594,6 +594,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "com.android.internal.os.ZygoteInit.main", "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run", @@ -16851,1358 +16856,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -24964,6 +23617,1358 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -33710,17 +33715,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -33777,6 +33771,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -34521,18 +34526,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -34594,6 +34587,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35307,14 +35312,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35356,6 +35353,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35495,12 +35500,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35532,6 +35531,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35723,18 +35728,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -35796,6 +35789,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -35999,18 +36004,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -36072,6 +36065,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -36721,59 +36726,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -37040,119 +36992,172 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "GleanAPIPool", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 114.04, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1102, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "GleanAPIPool", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 114.04, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1102, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -41272,72 +41277,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -41669,42 +41608,108 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-1", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 114.075, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 472, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-1", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 114.075, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 472, + "responsiveness": Array [ null, null, null, @@ -44181,89 +44186,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -44680,6 +44602,89 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -46655,37 +46660,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -46842,6 +46816,37 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -48677,34 +48682,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -48846,6 +48823,34 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -51459,12 +51464,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -51496,6 +51495,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -51626,11 +51631,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -51657,6 +51657,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -52295,60 +52300,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -52620,42 +52571,96 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-4", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 175.88, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 460, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-4", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 175.88, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 460, + "responsiveness": Array [ null, null, null, @@ -55283,105 +55288,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -55878,211 +55784,310 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-5", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 175.892, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 459, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-5", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 175.892, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 459, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -58880,128 +58885,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -59613,6 +59496,128 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -63713,119 +63718,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -64392,6 +64284,119 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -67202,15 +67207,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -67257,6 +67253,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -69809,12 +69814,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -69846,6 +69845,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70046,18 +70051,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70119,6 +70112,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70264,12 +70269,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70301,6 +70300,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -70502,19 +70507,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -70581,6 +70573,19 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -71048,40 +71053,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -71253,6 +71224,40 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72024,66 +72029,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -72385,6 +72330,66 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72695,14 +72700,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -72744,6 +72741,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -72939,18 +72944,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -73012,6 +73005,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -74041,97 +74046,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -74588,42 +74502,133 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "pool-12-thread-1", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 856.46, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 60, - "responsiveness": Array [ + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "pool-12-thread-1", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 856.46, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 60, + "responsiveness": Array [ null, null, null, @@ -76022,72 +76027,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -76419,77 +76358,143 @@ Object { -1, -1, ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "DefaultDispatcher-worker-7", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "21491", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 887.128, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 332, - "responsiveness": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "DefaultDispatcher-worker-7", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "21491", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 887.128, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 332, + "responsiveness": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, null, @@ -77870,28 +77875,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -78003,6 +77986,28 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -79296,23 +79301,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -79399,6 +79387,23 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -80467,68 +80472,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -80840,6 +80783,68 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -82493,23 +82498,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -82596,6 +82584,23 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -82807,17 +82812,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -82874,6 +82868,17 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83028,13 +83033,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83071,6 +83069,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83214,13 +83219,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83257,6 +83255,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83400,13 +83405,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83443,6 +83441,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -83566,11 +83571,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -83597,6 +83597,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -84138,52 +84143,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -84415,6 +84374,52 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -84772,21 +84777,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -84863,6 +84853,21 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -85544,6 +85549,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "com.android.internal.os.ZygoteInit.main", "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run", @@ -119678,2848 +119688,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -136731,6 +133899,2848 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -160479,12 +160489,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -160501,375 +160505,381 @@ Object { "name": Array [ 2840, 2841, - 2842, - 2843, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "ReferenceQueueDaemon", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "15983", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 127.627, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1, - "responsiveness": Array [ - null, - ], - "stack": Array [ - 3, - ], - "timeDeltas": Array [ - 127.627, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - 3, - ], - "length": 4, - "prefix": Array [ - null, - 0, - 1, - 2, - ], - }, - "tid": 15996, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - -1, - -1, - ], - "category": Array [ - 4, - 4, - 4, - 4, - 2, - ], - "column": Array [ - null, - null, - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - 3, - 4, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - 0, - ], - "length": 5, - "line": Array [ - null, - null, - null, - null, - null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - false, - false, - ], - "length": 5, - "lineNumber": Array [ - null, - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2841, - 2844, - 2845, - 2843, + 2842, + 2843, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + ], + "source": Array [ + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "ReferenceQueueDaemon", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "15983", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 127.627, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1, + "responsiveness": Array [ + null, + ], + "stack": Array [ + 3, + ], + "timeDeltas": Array [ + 127.627, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + 3, + ], + "length": 4, + "prefix": Array [ + null, + 0, + 1, + 2, + ], + }, + "tid": 15996, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + -1, + -1, + ], + "category": Array [ + 4, + 4, + 4, + 4, + 2, + ], + "column": Array [ + null, + null, + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + 3, + 4, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + 0, + ], + "length": 5, + "line": Array [ + null, + null, + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + 0, + ], + }, + "funcTable": Object { + "columnNumber": Array [ + null, + null, + null, + null, + null, + ], + "isJS": Array [ + false, + false, + false, + false, + false, + ], + "length": 5, + "lineNumber": Array [ + null, + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2841, + 2844, + 2845, + 2843, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + -1, + ], + "source": Array [ + null, + null, + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "FinalizerWatchdogDaemon", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "15983", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": undefined, + "registerTime": 127.777, + "resourceTable": Object { + "host": Array [], + "length": 0, + "lib": Array [], + "name": Array [], + "type": Array [], + }, + "samples": Object { + "length": 1, + "responsiveness": Array [ + null, + ], + "stack": Array [ + 4, + ], + "timeDeltas": Array [ + 127.777, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + 3, + 4, + ], + "length": 5, + "prefix": Array [ + null, + 0, + 1, + 2, + 3, + ], + }, + "tid": 15998, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + -1, + ], + "category": Array [ + 4, + 4, + 4, + 1, + ], + "column": Array [ + null, + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + 3, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + ], + "length": 4, + "line": Array [ + null, + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + ], + }, + "funcTable": Object { + "columnNumber": Array [ + null, + null, + null, + null, + ], + "isJS": Array [ + false, + false, + false, + false, + ], + "length": 4, + "lineNumber": Array [ + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2841, + 2846, + 2847, ], "relevantForJS": Array [ false, false, false, false, - false, ], "resource": Array [ -1, -1, -1, -1, - -1, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "FinalizerWatchdogDaemon", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "15983", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": undefined, - "registerTime": 127.777, - "resourceTable": Object { - "host": Array [], - "length": 0, - "lib": Array [], - "name": Array [], - "type": Array [], - }, - "samples": Object { - "length": 1, - "responsiveness": Array [ - null, - ], - "stack": Array [ - 4, - ], - "timeDeltas": Array [ - 127.777, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - 3, - 4, - ], - "length": 5, - "prefix": Array [ - null, - 0, - 1, - 2, - 3, - ], - }, - "tid": 15998, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - -1, ], - "category": Array [ - 4, - 4, - 4, - 1, - ], - "column": Array [ - null, - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - 3, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - ], - "length": 4, - "line": Array [ + "source": Array [ null, null, null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - ], - "fileName": Array [ - null, - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - false, - ], - "length": 4, - "lineNumber": Array [ - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2841, - 2846, - 2847, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - ], }, "isMainThread": false, "markers": Object { @@ -161029,13 +161039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161072,6 +161075,13 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161269,18 +161279,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161342,6 +161340,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161485,12 +161495,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161522,6 +161526,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -161713,18 +161723,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -161786,6 +161784,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -162207,38 +162217,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -162400,6 +162378,38 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -174857,287 +174867,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -176544,6 +176273,287 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -187861,121 +187871,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -188552,6 +188447,121 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198266,11 +198276,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198297,6 +198302,11 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198408,10 +198418,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -198433,6 +198439,10 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198560,12 +198570,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198597,6 +198601,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -198788,18 +198798,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -198861,6 +198859,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -199064,18 +199074,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -199137,6 +199135,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -199378,20 +199388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -199463,6 +199459,20 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216483,12 +216493,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -216520,6 +216524,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216711,18 +216721,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -216784,6 +216782,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -216967,16 +216977,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -217028,6 +217028,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -218359,124 +218369,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -219068,6 +218960,124 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -228929,16 +228939,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -228990,6 +228990,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229169,16 +229179,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229230,6 +229230,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229409,16 +229419,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229470,6 +229470,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229649,16 +229659,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229710,6 +229710,16 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -229849,12 +229859,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -229886,6 +229890,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230037,14 +230047,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -230086,6 +230088,14 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230281,18 +230291,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -230354,6 +230352,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -230805,7 +230815,183 @@ Object { null, null, ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "length": 33, + "lineNumber": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + "name": Array [ + 2840, + 2850, + 2851, + 2852, + 2859, + 3150, + 2879, + 2856, + 2857, + 2843, + 2860, + 3151, + 2862, + 3152, + 3153, + 3154, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 599, + 600, + 601, + 2956, + 2957, + 2958, + 3155, + 3156, + 1158, + ], + "relevantForJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "resource": Array [ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + ], + "source": Array [ null, null, null, @@ -230840,182 +231026,6 @@ Object { null, null, ], - "isJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "length": 33, - "lineNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "name": Array [ - 2840, - 2850, - 2851, - 2852, - 2859, - 3150, - 2879, - 2856, - 2857, - 2843, - 2860, - 3151, - 2862, - 3152, - 3153, - 3154, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 599, - 600, - 601, - 2956, - 2957, - 2958, - 3155, - 3156, - 1158, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "resource": Array [ - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - ], }, "isMainThread": false, "markers": Object { @@ -237902,18 +237912,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -237975,6 +237973,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238178,18 +238188,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238251,6 +238249,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238454,18 +238464,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238527,6 +238525,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -238730,18 +238740,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -238803,6 +238801,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -239006,18 +239016,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -239079,6 +239077,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -239282,18 +239292,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -239355,6 +239353,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -241696,221 +241706,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -242987,6 +242782,221 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -253029,197 +253039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -254176,6 +253995,197 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -264032,189 +264042,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -265131,6 +264958,189 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -273194,18 +273204,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -273267,6 +273265,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -273490,20 +273500,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -273575,6 +273571,20 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -283082,18 +283092,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -283155,6 +283153,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -283358,18 +283368,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -283431,6 +283429,18 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -284242,77 +284252,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -284669,6 +284608,77 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -288748,65 +288758,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -289103,6 +289054,65 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -294377,154 +294387,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -295266,6 +295128,154 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -303597,62 +303607,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -303934,6 +303888,62 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -319161,102 +319171,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -319738,6 +319652,102 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -320823,71 +320833,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -321214,6 +321159,71 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -323210,171 +323220,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -324201,6 +324046,171 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -329500,147 +329510,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -330347,6 +330216,147 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334170,12 +334180,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -334207,6 +334211,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334341,12 +334351,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -334378,6 +334382,12 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -334643,6 +334653,15 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 4, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "(root)", "e", @@ -334744,13 +334763,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -339268,13 +339287,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345546,13 +345565,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345713,13 +345732,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -345799,13 +345818,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -346163,33 +346182,6 @@ Object { 297, null, ], - "fileName": Array [ - null, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - null, - 4, - 4, - 4, - 4, - null, - 4, - null, - 4, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -346326,6 +346318,33 @@ Object { 0, -1, ], + "source": Array [ + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + ], }, "isMainThread": true, "markers": Object { @@ -356907,13 +356926,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -358784,13 +358803,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364378,13 +364397,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364464,13 +364483,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -364757,13 +364776,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365050,13 +365069,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365343,13 +365362,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -365609,13 +365628,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -375834,13 +375853,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -383018,6 +383037,15 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 4, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "(root)", "e", @@ -383119,13 +383147,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -387643,13 +387671,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -393921,13 +393949,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394088,13 +394116,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394174,13 +394202,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -394538,33 +394566,6 @@ Object { 297, null, ], - "fileName": Array [ - null, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - null, - 4, - 4, - 4, - 4, - null, - 4, - null, - 4, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -394701,6 +394702,33 @@ Object { 0, -1, ], + "source": Array [ + null, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + null, + null, + 0, + 0, + 0, + 0, + null, + 0, + null, + 0, + 0, + 0, + null, + ], }, "isMainThread": true, "markers": Object { @@ -405282,13 +405310,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -407159,13 +407187,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -412753,13 +412781,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -412839,13 +412867,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413132,13 +413160,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413425,13 +413453,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413718,13 +413746,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -413984,13 +414012,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -424209,13 +424237,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -431393,6 +431421,19 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 5, + 7, + 13, + ], + "length": 3, + "uuid": Array [ + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -431885,49 +431926,6 @@ Object { 25, 31, ], - "fileName": Array [ - null, - null, - 5, - 7, - 5, - null, - 7, - 7, - 7, - 13, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - null, - null, - null, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 13, - 7, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - ], "isJS": Array [ false, false, @@ -432144,6 +432142,49 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + 0, + 1, + 0, + null, + 1, + 1, + 1, + 2, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + ], }, "isMainThread": true, "markers": Object { @@ -433614,13 +433655,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -434221,6 +434262,11 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "OnLibevent", "ThreadControllerImpl::RunTask", @@ -434249,13 +434295,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434650,13 +434696,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434745,13 +434791,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434840,13 +434886,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -434935,13 +434981,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": true, "markers": Object { @@ -436065,13 +436111,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436160,13 +436206,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436300,13 +436346,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436431,13 +436477,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436562,13 +436608,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436693,13 +436739,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436815,13 +436861,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436901,13 +436947,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -436987,13 +437033,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -437159,6 +437205,103 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 3, + 5, + 9, + 13, + 16, + 21, + 29, + 31, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 44, + 47, + 50, + 51, + 52, + 53, + 54, + 56, + 59, + 62, + 69, + 74, + 89, + 90, + 95, + 97, + 101, + 103, + 106, + 110, + 112, + 113, + 116, + 118, + 120, + 126, + 132, + 137, + ], + "length": 45, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -438755,125 +438898,6 @@ Object { 25, null, ], - "fileName": Array [ - null, - null, - 3, - 5, - 5, - null, - 9, - 9, - 9, - 13, - 13, - 16, - 16, - 9, - 9, - 21, - 21, - 21, - 9, - 9, - 9, - 9, - 9, - 29, - 31, - 31, - 9, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 5, - 44, - 42, - 42, - 47, - 47, - 50, - 51, - 52, - 53, - 54, - 56, - 34, - 59, - 59, - 62, - 62, - 34, - 34, - null, - 34, - 69, - 34, - 34, - 34, - 74, - 34, - 34, - 34, - 34, - 69, - 69, - null, - 69, - 56, - 69, - 69, - 56, - 34, - 34, - 89, - 90, - null, - 16, - 16, - 16, - 95, - 95, - 97, - 97, - 42, - 101, - 103, - 103, - 106, - 21, - 21, - 110, - 16, - 112, - 113, - 113, - 116, - 118, - 16, - 120, - 120, - 120, - 42, - 42, - 126, - 126, - null, - 126, - 120, - 132, - 132, - 120, - 120, - 137, - null, - ], "isJS": Array [ false, false, @@ -439470,6 +439494,125 @@ Object { 44, -1, ], + "source": Array [ + null, + null, + 0, + 1, + 1, + null, + 2, + 2, + 2, + 3, + 3, + 4, + 4, + 2, + 2, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 6, + 7, + 7, + 2, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 1, + 17, + 16, + 16, + 18, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 8, + 25, + 25, + 26, + 26, + 8, + 8, + null, + 8, + 27, + 8, + 8, + 8, + 28, + 8, + 8, + 8, + 8, + 27, + 27, + null, + 27, + 24, + 27, + 27, + 24, + 8, + 8, + 29, + 30, + null, + 4, + 4, + 4, + 31, + 31, + 32, + 32, + 16, + 33, + 34, + 34, + 35, + 5, + 5, + 36, + 4, + 37, + 38, + 38, + 39, + 40, + 4, + 41, + 41, + 41, + 16, + 16, + 42, + 42, + null, + 42, + 41, + 43, + 43, + 41, + 41, + 44, + null, + ], }, "isMainThread": false, "markers": Object { @@ -440585,6 +440728,59 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 2, + 4, + 7, + 9, + 13, + 30, + 31, + 34, + 37, + 39, + 45, + 53, + 56, + 58, + 60, + 63, + 70, + 100, + 103, + 107, + 110, + 112, + 115, + ], + "length": 23, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "applyProfile", @@ -442767,150 +442963,6 @@ Object { 40, null, ], - "fileName": Array [ - null, - 2, - 4, - 4, - 7, - 9, - 4, - 4, - 13, - 13, - 13, - 13, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 30, - 31, - 31, - 34, - 31, - 31, - 31, - 31, - 37, - null, - 31, - 39, - 39, - 39, - 39, - 39, - 31, - 31, - 31, - 45, - 45, - null, - 31, - 31, - 30, - 37, - null, - 53, - 31, - null, - 56, - 58, - 58, - 60, - 53, - 53, - 53, - 39, - 39, - 63, - 31, - null, - 39, - 39, - 39, - 70, - 70, - 4, - 9, - 4, - 4, - 70, - 70, - 70, - 70, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - null, - null, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 9, - 4, - 4, - 4, - 70, - 70, - 4, - 4, - 4, - 9, - 9, - 4, - 4, - 70, - 70, - 4, - 4, - 4, - 4, - 4, - 70, - 70, - 70, - 4, - 4, - 9, - null, - 100, - 100, - 103, - 103, - 103, - 107, - 107, - 110, - 112, - 112, - 115, - 4, - 4, - null, - ], "isJS": Array [ false, true, @@ -443632,6 +443684,150 @@ Object { 1, -1, ], + "source": Array [ + null, + 0, + 1, + 1, + 2, + 3, + 1, + 1, + 4, + 4, + 4, + 4, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 5, + 6, + 6, + 7, + 6, + 6, + 6, + 6, + 8, + null, + 6, + 9, + 9, + 9, + 9, + 9, + 6, + 6, + 6, + 10, + 10, + null, + 6, + 6, + 5, + 8, + null, + 11, + 6, + null, + 12, + 13, + 13, + 14, + 11, + 11, + 11, + 9, + 9, + 15, + 6, + null, + 9, + 9, + 9, + 16, + 16, + 1, + 3, + 1, + 1, + 16, + 16, + 16, + 16, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 3, + 1, + 1, + 1, + 16, + 16, + 1, + 1, + 1, + 3, + 3, + 1, + 1, + 16, + 16, + 1, + 1, + 1, + 1, + 1, + 16, + 16, + 16, + 1, + 1, + 3, + null, + 17, + 17, + 18, + 18, + 18, + 19, + 19, + 20, + 21, + 21, + 22, + 1, + 1, + null, + ], }, "isMainThread": false, "markers": Object { @@ -444870,13 +445066,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -445198,13 +445394,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -445589,13 +445785,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -446103,6 +446299,19 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 5, + 7, + 13, + ], + "length": 3, + "uuid": Array [ + null, + null, + null, + ], + }, "stringArray": Array [ "(root)", "(program)", @@ -446585,49 +446794,6 @@ Object { 25, 31, ], - "fileName": Array [ - null, - null, - 5, - 7, - 5, - null, - 7, - 7, - 7, - 13, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - null, - null, - null, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 13, - 7, - null, - 13, - 7, - 7, - 7, - 7, - 7, - 7, - ], "isJS": Array [ false, false, @@ -446844,6 +447010,49 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + 0, + 1, + 0, + null, + 1, + 1, + 1, + 2, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 1, + null, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + ], }, "isMainThread": false, "markers": Object { @@ -447124,6 +447333,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "_start (in /usr/lib64/ld-2.25.so)", "_start", @@ -447388,16 +447602,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -447449,6 +447653,16 @@ Object { 4, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -447631,182 +447845,177 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], - "isJS": Array [ - false, - false, - false, - ], - "length": 3, - "lineNumber": Array [ - null, - null, - null, - ], - "name": Array [ - 11, - 21, - 4, - ], - "relevantForJS": Array [ - false, - false, - false, - ], - "resource": Array [ - 0, - 1, - 2, - ], - }, - "isMainThread": false, - "markers": Object { - "category": Array [], - "data": Array [], - "endTime": Array [], - "length": 0, - "name": Array [], - "phase": Array [], - "startTime": Array [], - }, - "name": "firefox", - "nativeSymbols": Object { - "address": Array [], - "functionSize": Array [], - "length": 0, - "libIndex": Array [], - "name": Array [], - }, - "pausedRanges": Array [], - "pid": "7565", - "processName": "", - "processShutdownTime": null, - "processStartupTime": 0, - "processType": "default", - "registerTime": 0, - "resourceTable": Object { - "host": Array [ - null, - null, - null, - ], - "length": 3, - "lib": Array [ - null, - null, - null, - ], - "name": Array [ - 2, - 22, - 5, - ], - "type": Array [ - 1, - 1, - 1, - ], - }, - "samples": Object { - "length": 4, - "responsiveness": Array [ - 0, - 0, - 0, - 0, - ], - "stack": Array [ - 2, - 2, - 2, - 2, - ], - "timeDeltas": Array [ - 2574592843.004, - 0.023, - 0.008, - 0.022, - ], - "weight": null, - "weightType": "samples", - }, - "stackTable": Object { - "frame": Array [ - 0, - 1, - 2, - ], - "length": 3, - "prefix": Array [ - null, - 0, - 1, - ], - }, - "tid": 7565, - "unregisterTime": null, - }, - Object { - "eTLD+1": undefined, - "frameTable": Object { - "address": Array [ - -1, - -1, - -1, - ], - "category": Array [ - 0, - 0, - 1, - ], - "column": Array [ - null, - null, - null, - ], - "func": Array [ - 0, - 1, - 2, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - ], - "length": 3, - "line": Array [ - null, - null, - null, - ], - "nativeSymbol": Array [ - null, - null, - null, - ], - "subcategory": Array [ - null, - null, - null, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + ], + "length": 3, + "lineNumber": Array [ + null, + null, + null, + ], + "name": Array [ + 11, + 21, + 4, + ], + "relevantForJS": Array [ + false, + false, + false, + ], + "resource": Array [ + 0, + 1, + 2, + ], + "source": Array [ + null, + null, + null, + ], + }, + "isMainThread": false, + "markers": Object { + "category": Array [], + "data": Array [], + "endTime": Array [], + "length": 0, + "name": Array [], + "phase": Array [], + "startTime": Array [], + }, + "name": "firefox", + "nativeSymbols": Object { + "address": Array [], + "functionSize": Array [], + "length": 0, + "libIndex": Array [], + "name": Array [], + }, + "pausedRanges": Array [], + "pid": "7565", + "processName": "", + "processShutdownTime": null, + "processStartupTime": 0, + "processType": "default", + "registerTime": 0, + "resourceTable": Object { + "host": Array [ + null, + null, + null, + ], + "length": 3, + "lib": Array [ + null, + null, + null, + ], + "name": Array [ + 2, + 22, + 5, + ], + "type": Array [ + 1, + 1, + 1, + ], + }, + "samples": Object { + "length": 4, + "responsiveness": Array [ + 0, + 0, + 0, + 0, + ], + "stack": Array [ + 2, + 2, + 2, + 2, + ], + "timeDeltas": Array [ + 2574592843.004, + 0.023, + 0.008, + 0.022, + ], + "weight": null, + "weightType": "samples", + }, + "stackTable": Object { + "frame": Array [ + 0, + 1, + 2, + ], + "length": 3, + "prefix": Array [ + null, + 0, + 1, + ], + }, + "tid": 7565, + "unregisterTime": null, + }, + Object { + "eTLD+1": undefined, + "frameTable": Object { + "address": Array [ + -1, + -1, + -1, + ], + "category": Array [ + 0, + 0, + 1, + ], + "column": Array [ + null, + null, + null, + ], + "func": Array [ + 0, + 1, + 2, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + ], + "length": 3, + "line": Array [ + null, + null, + null, + ], + "nativeSymbol": Array [ + null, + null, + null, + ], + "subcategory": Array [ + null, + null, + null, + ], + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -447837,6 +448046,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448091,22 +448305,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448188,6 +448386,22 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448383,12 +448597,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448420,6 +448628,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448612,15 +448826,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -448667,6 +448872,15 @@ Object { 2, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448836,10 +449050,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -448861,6 +449071,10 @@ Object { 0, 1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -448999,11 +449213,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449030,6 +449239,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449174,11 +449388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449205,6 +449414,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449351,11 +449565,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449382,6 +449591,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -449536,12 +449750,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -449573,6 +449781,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -450027,40 +450241,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -450232,6 +450412,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -450736,40 +450950,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -450941,6 +451121,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -451204,144 +451418,110 @@ Object { null, null, ], - "func": Array [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - ], - "inlineDepth": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "innerWindowID": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - "length": 32, - "line": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "nativeSymbol": Array [ + "func": Array [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + ], + "inlineDepth": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "innerWindowID": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "length": 32, + "line": Array [ null, null, null, @@ -451375,7 +451555,7 @@ Object { null, null, ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -451409,9 +451589,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -451445,7 +451623,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -451650,6 +451830,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -452156,40 +452370,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -452361,6 +452541,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -452747,28 +452961,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -452880,6 +453072,28 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -453058,6 +453272,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "entry_SYSCALL_64_after_hwframe (in [kernel.kallsyms])", "entry_SYSCALL_64_after_hwframe", @@ -460418,618 +460637,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -464091,6 +463698,618 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -467948,6 +468167,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "entry_SYSCALL_64_after_hwframe (in [kernel.kallsyms])", "entry_SYSCALL_64_after_hwframe", @@ -470729,237 +470953,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -472116,6 +472109,237 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -474147,6 +474371,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "base.odex[+41107f] (in /data/app/org.mozilla.geckoview_example-1/oat/arm/base.odex)", "base.odex[+41107f]", @@ -477025,229 +477254,7 @@ Object { null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -477469,9 +477476,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -477693,7 +477698,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -479026,6 +479033,228 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -480280,92 +480509,7 @@ Object { null, null, ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ + "nativeSymbol": Array [ null, null, null, @@ -480450,9 +480594,7 @@ Object { null, null, ], - }, - "funcTable": Object { - "columnNumber": Array [ + "subcategory": Array [ null, null, null, @@ -480537,7 +480679,9 @@ Object { null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -481048,6 +481192,91 @@ Object { 5, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -482152,76 +482381,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -482573,6 +482732,76 @@ Object { 1, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -484499,137 +484728,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -485286,6 +485384,137 @@ Object { 7, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -486544,334 +486773,226 @@ Object { null, null, null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + "subcategory": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -487520,6 +487641,114 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -488446,48 +488675,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -488699,6 +488886,48 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -489359,55 +489588,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -489654,6 +489834,55 @@ Object { 1, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -490184,36 +490413,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -490365,6 +490564,36 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -490697,25 +490926,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -490812,6 +491022,25 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -491099,23 +491328,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -491202,6 +491414,23 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -491471,22 +491700,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -491568,6 +491781,22 @@ Object { 0, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -492044,43 +492273,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -492267,6 +492459,43 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -492541,6 +492770,11 @@ Object { "version": 30, }, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "/apex/com.android.runtime/lib64/bionic/libc.so", "__libc_init", @@ -495051,29 +495285,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -495190,6 +495401,29 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -495532,27 +495766,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -495659,6 +495872,27 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -495997,27 +496231,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -496124,6 +496337,27 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -510998,1478 +511232,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -519831,6 +518593,1478 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -532310,25 +532544,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -532425,6 +532640,25 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -535049,257 +535283,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -536556,6 +536539,257 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -538911,7 +539145,31 @@ Object { null, null, ], - "fileName": Array [ + "isJS": Array [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ], + "length": 21, + "lineNumber": Array [ null, null, null, @@ -538934,7 +539192,30 @@ Object { null, null, ], - "isJS": Array [ + "name": Array [ + 47, + 48, + 1870, + 1871, + 1771, + 1817, + 1834, + 1835, + 1836, + 1837, + 1838, + 1685, + 1686, + 430, + 431, + 59, + 60, + 432, + 433, + 1872, + 1873, + ], + "relevantForJS": Array [ false, false, false, @@ -538957,8 +539238,30 @@ Object { false, false, ], - "length": 21, - "lineNumber": Array [ + "resource": Array [ + 0, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 3, + 4, + 4, + 5, + 5, + 1, + 1, + 6, + 6, + 6, + 6, + 6, + 6, + ], + "source": Array [ null, null, null, @@ -538981,75 +539284,6 @@ Object { null, null, ], - "name": Array [ - 47, - 48, - 1870, - 1871, - 1771, - 1817, - 1834, - 1835, - 1836, - 1837, - 1838, - 1685, - 1686, - 430, - 431, - 59, - 60, - 432, - 433, - 1872, - 1873, - ], - "relevantForJS": Array [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - ], - "resource": Array [ - 0, - 1, - 2, - 2, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 5, - 5, - 1, - 1, - 6, - 6, - 6, - 6, - 6, - 6, - ], }, "isMainThread": false, "markers": Object { @@ -539194,13 +539428,13 @@ Object { }, "funcTable": Object { "columnNumber": Array [], - "fileName": Array [], "isJS": Array [], "length": 0, "lineNumber": Array [], "name": Array [], "relevantForJS": Array [], "resource": Array [], + "source": Array [], }, "isMainThread": false, "markers": Object { @@ -539683,49 +539917,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -539942,6 +540133,49 @@ Object { 6, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -540434,28 +540668,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -540567,6 +540779,28 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -540957,32 +541191,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -541114,6 +541322,32 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -541544,34 +541778,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -541713,6 +541919,34 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -543118,126 +543352,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -543839,6 +543953,126 @@ Object { 4, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -547060,267 +547294,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -548627,6 +548600,267 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -555377,533 +555611,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -558540,6 +558247,533 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -561610,6 +561844,11 @@ Object { "version": 30, }, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "/apex/com.android.runtime/lib64/bionic/libc.so", "__libc_init", @@ -565601,193 +565840,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -566724,6 +566776,193 @@ Object { 3, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -568604,96 +568843,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -569145,6 +569294,96 @@ Object { 1, 10, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -569870,130 +570109,90 @@ Object { null, null, null, - ], - "nativeSymbol": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - "subcategory": Array [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ], - }, - "funcTable": Object { - "columnNumber": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, + ], + "nativeSymbol": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, null, null, + null, + null, + null, + null, + ], + "subcategory": Array [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, ], - "fileName": Array [ + }, + "funcTable": Object { + "columnNumber": Array [ null, null, null, @@ -570234,6 +570433,46 @@ Object { 7, 7, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -570722,35 +570961,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -570897,6 +571107,35 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -571427,37 +571666,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -571614,6 +571822,37 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -572114,39 +572353,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -572313,6 +572519,39 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -572707,28 +572946,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -572840,6 +573057,28 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -573758,85 +573997,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -574233,6 +574393,85 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -574927,31 +575166,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -575078,6 +575292,31 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -579030,388 +579269,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -581323,6 +581180,388 @@ Object { 4, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -603641,1709 +603880,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -613860,6 +612396,1709 @@ Object { 5, 5, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -633502,6 +633741,97 @@ Object { }, "pages": Array [], "shared": Object { + "sources": Object { + "filename": Array [ + 0, + 3, + 5, + 8, + 10, + 16, + 18, + 20, + 25, + 33, + 50, + 52, + 54, + 56, + 67, + 71, + 73, + 75, + 85, + 87, + 91, + 93, + 99, + 101, + 103, + 119, + 121, + 127, + 145, + 152, + 154, + 172, + 179, + 182, + 193, + 195, + 198, + 202, + 207, + 209, + 218, + 220, + ], + "length": 42, + "uuid": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], + }, "stringArray": Array [ "target/debug/examples/work_log", "[root]", @@ -636954,195 +637284,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -638089,6 +638230,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -642759,195 +643089,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -643894,6 +644035,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -648564,195 +648894,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -649699,6 +649840,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { @@ -654369,195 +654699,6 @@ Object { 9, 9, ], - "fileName": Array [ - null, - 0, - 3, - 5, - 5, - 8, - 10, - 10, - 10, - 10, - 10, - 16, - 18, - 20, - 20, - 18, - 18, - 25, - 20, - 25, - 18, - 20, - 20, - 18, - 33, - 20, - 33, - 20, - 25, - 33, - 20, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 20, - 20, - 50, - 52, - 54, - 56, - 18, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 3, - 67, - 67, - 25, - 71, - 73, - 75, - 75, - 75, - 73, - 71, - 71, - 71, - 56, - 8, - 85, - 87, - 87, - 52, - 91, - 93, - 93, - 87, - 87, - 87, - 99, - 101, - 103, - 99, - 99, - 99, - 5, - 5, - 5, - 5, - 8, - 8, - 8, - 8, - 85, - 85, - 25, - 119, - 121, - 25, - 25, - 25, - 85, - 127, - 25, - 127, - 8, - 121, - 121, - 121, - 121, - 25, - 121, - 25, - 121, - 18, - 18, - 18, - 20, - 25, - 145, - 20, - 145, - 145, - 145, - 20, - 152, - 154, - 154, - 18, - 20, - 18, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 33, - 172, - 172, - 8, - 85, - 85, - 85, - 179, - 25, - 182, - 182, - 182, - 182, - 8, - 179, - 25, - 182, - 85, - 99, - 193, - 195, - 195, - 198, - 198, - 20, - 202, - 33, - 20, - 25, - 207, - 209, - 8, - 101, - 103, - 99, - 8, - 8, - 8, - 218, - 220, - 25, - 220, - 56, - 87, - 87, - 87, - 87, - ], "isJS": Array [ false, false, @@ -655504,6 +655645,195 @@ Object { -1, -1, ], + "source": Array [ + null, + 0, + 1, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 5, + 6, + 7, + 7, + 6, + 6, + 8, + 7, + 8, + 6, + 7, + 7, + 6, + 9, + 7, + 9, + 7, + 8, + 9, + 7, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 10, + 11, + 12, + 13, + 6, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 1, + 14, + 14, + 8, + 15, + 16, + 17, + 17, + 17, + 16, + 15, + 15, + 15, + 13, + 3, + 18, + 19, + 19, + 11, + 20, + 21, + 21, + 19, + 19, + 19, + 22, + 23, + 24, + 22, + 22, + 22, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 18, + 18, + 8, + 25, + 26, + 8, + 8, + 8, + 18, + 27, + 8, + 27, + 3, + 26, + 26, + 26, + 26, + 8, + 26, + 8, + 26, + 6, + 6, + 6, + 7, + 8, + 28, + 7, + 28, + 28, + 28, + 7, + 29, + 30, + 30, + 6, + 7, + 6, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 9, + 31, + 31, + 3, + 18, + 18, + 18, + 32, + 8, + 33, + 33, + 33, + 33, + 3, + 32, + 8, + 33, + 18, + 22, + 34, + 35, + 35, + 36, + 36, + 7, + 37, + 9, + 7, + 8, + 38, + 39, + 3, + 23, + 24, + 22, + 3, + 3, + 3, + 40, + 41, + 8, + 41, + 13, + 19, + 19, + 19, + 19, + ], }, "isMainThread": false, "markers": Object { diff --git a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap index 52b066540a..8c86108b32 100644 --- a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap @@ -61,6 +61,11 @@ Object { "profilerOverhead": Array [], "profilingLog": Object {}, "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "_start (in /usr/lib64/ld-2.25.so)", "_start", @@ -325,16 +330,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -386,6 +381,16 @@ Object { 4, 0, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -568,11 +573,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -599,6 +599,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -743,11 +748,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -774,6 +774,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1028,22 +1033,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1125,6 +1114,22 @@ Object { 6, 6, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1320,12 +1325,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1357,6 +1356,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1549,15 +1554,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1604,6 +1600,15 @@ Object { 2, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1773,10 +1778,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - ], "isJS": Array [ false, false, @@ -1798,6 +1799,10 @@ Object { 0, 1, ], + "source": Array [ + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1936,11 +1941,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1967,6 +1967,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2111,11 +2116,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2142,6 +2142,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2288,11 +2293,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2319,6 +2319,11 @@ Object { 1, 2, ], + "source": Array [ + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2473,12 +2478,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2510,6 +2509,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2964,40 +2969,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3169,6 +3140,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3673,40 +3678,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3878,6 +3849,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -4382,40 +4387,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -4587,6 +4558,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -5093,40 +5098,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -5298,6 +5269,40 @@ Object { 1, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -5684,28 +5689,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -5817,6 +5800,28 @@ Object { 2, 2, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { From aac2c134f47c2d4b9d7b5927132a8cd55c010f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 19:55:12 +0200 Subject: [PATCH 06/22] Add a processed profile upgrader after the `profile.shared.sources` addition --- docs-developer/CHANGELOG-formats.md | 4 + src/app-logic/constants.ts | 2 +- .../processed-profile-versioning.ts | 56 +++++ .../fixtures/profiles/processed-profile.ts | 5 +- .../symbolicator-cli.test.ts.snap | 230 +++++++++--------- .../__snapshots__/profile-view.test.ts.snap | 2 +- src/test/store/js-tracer.test.ts | 15 +- .../profile-conversion.test.ts.snap | 32 +-- .../profile-upgrading.test.ts.snap | 169 +++++++------ 9 files changed, 312 insertions(+), 203 deletions(-) diff --git a/docs-developer/CHANGELOG-formats.md b/docs-developer/CHANGELOG-formats.md index cd587209c2..84f6b57558 100644 --- a/docs-developer/CHANGELOG-formats.md +++ b/docs-developer/CHANGELOG-formats.md @@ -6,6 +6,10 @@ Note that this is not an exhaustive list. Processed profile format upgraders can ## Processed profile format +### Version 58 + +A new `SourceTable` has been added to `profile.shared.sources` to centralize all source file information. The `FuncTable.fileName` field has been replaced with `FuncTable.source`, which references indices in the shared sources table. This change allows storing a UUID per JS source, which will be used for fetching sources. + ### Version 57 The `searchable` property in marker schemas, originally added in version 44, is now removed again. Now all marker fields are searchable. diff --git a/src/app-logic/constants.ts b/src/app-logic/constants.ts index 4ee3d1ad56..4b7463bdb0 100644 --- a/src/app-logic/constants.ts +++ b/src/app-logic/constants.ts @@ -12,7 +12,7 @@ export const GECKO_PROFILE_VERSION = 31; // The current version of the "processed" profile format. // Please don't forget to update the processed profile format changelog in // `docs-developer/CHANGELOG-formats.md`. -export const PROCESSED_PROFILE_VERSION = 57; +export const PROCESSED_PROFILE_VERSION = 58; // The following are the margin sizes for the left and right of the timeline. Independent // components need to share these values. diff --git a/src/profile-logic/processed-profile-versioning.ts b/src/profile-logic/processed-profile-versioning.ts index c1e833dd73..2448b486e7 100644 --- a/src/profile-logic/processed-profile-versioning.ts +++ b/src/profile-logic/processed-profile-versioning.ts @@ -2637,6 +2637,62 @@ const _upgraders: { } } }, + [58]: (profile) => { + // Add sources table to profile.shared.sources to gather all the sources. + // The function table's fileName field is replaced with a source field that + // references the sources table. + + // Create the sources table + const sourceTable = { + length: 0, + uuid: [] as Array, + filename: [] as Array, + }; + + // Map from fileName string index to source index + const fileNameIndexToSourceIndex = new Map(); + + // Process all threads to migrate fileName to source references + for (const thread of profile.threads) { + const { funcTable } = thread; + + // Create the new source column. + const funcTableSourceCol = new Array(funcTable.length); + + // Process each function + for (let funcIndex = 0; funcIndex < funcTable.length; funcIndex++) { + const fileNameIndex = funcTable.fileName[funcIndex]; + + if (fileNameIndex === null) { + funcTableSourceCol[funcIndex] = null; + } else { + // Check if we already have this fileNameIndex in the sources table + let sourceIndex = fileNameIndexToSourceIndex.get(fileNameIndex); + + if (sourceIndex === undefined) { + // Add new entry to sources table + sourceIndex = sourceTable.length; + sourceTable.uuid.push(null); + sourceTable.filename.push(fileNameIndex); + sourceTable.length++; + fileNameIndexToSourceIndex.set(fileNameIndex, sourceIndex); + } + + funcTableSourceCol[funcIndex] = sourceIndex; + } + } + + // Replace fileName field with source field + funcTable.source = funcTableSourceCol; + delete funcTable.fileName; + } + + // Add sources table to profile.shared + if (!profile.shared) { + profile.shared = {}; + } + profile.shared.sources = sourceTable; + }, // If you add a new upgrader here, please document the change in // `docs-developer/CHANGELOG-formats.md`. }; diff --git a/src/test/fixtures/profiles/processed-profile.ts b/src/test/fixtures/profiles/processed-profile.ts index 43504927cd..5813a8e4e8 100644 --- a/src/test/fixtures/profiles/processed-profile.ts +++ b/src/test/fixtures/profiles/processed-profile.ts @@ -955,7 +955,10 @@ function _buildThreadFromTextOnlyStacks( // Find the file name from the function name const fileName = _findFileNameFromFuncName(funcNameWithModifier); if (fileName) { - funcTable.source[funcIndex] = globalDataCollector.indexForSource(null, fileName); + funcTable.source[funcIndex] = globalDataCollector.indexForSource( + null, + fileName + ); } const category = _findCategoryFromFuncName( diff --git a/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap b/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap index 379f1a7b3c..2e547d427a 100644 --- a/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap +++ b/src/test/integration/symbolicator-cli/__snapshots__/symbolicator-cli.test.ts.snap @@ -87,7 +87,7 @@ Object { "markerSchema": Array [], "oscpu": "macOS 14.6.1", "pausedRanges": Array [], - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "a.out", "sampleUnits": Object { @@ -104,6 +104,11 @@ Object { "pages": Array [], "profilerOverhead": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "0x6153", "0x3ec3", @@ -207,12 +212,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -244,6 +243,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -476,14 +481,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -525,6 +522,14 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -743,15 +748,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -798,6 +794,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1034,15 +1039,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1089,6 +1085,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1383,19 +1388,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1462,6 +1454,19 @@ Object { 0, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -1762,15 +1767,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -1817,6 +1813,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2103,7 +2108,7 @@ Object { "markerSchema": Array [], "oscpu": "macOS 14.6.1", "pausedRanges": Array [], - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "a.out", "sampleUnits": Object { @@ -2120,6 +2125,11 @@ Object { "pages": Array [], "profilerOverhead": Array [], "shared": Object { + "sources": Object { + "filename": Array [], + "length": 0, + "uuid": Array [], + }, "stringArray": Array [ "0x6153", "0x3ec3", @@ -2223,12 +2233,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2260,6 +2264,12 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -2492,14 +2502,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2541,6 +2543,14 @@ Object { 2, 3, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -2759,15 +2769,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -2814,6 +2815,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3050,15 +3060,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3105,6 +3106,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3399,19 +3409,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3478,6 +3475,19 @@ Object { 0, 4, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { @@ -3778,15 +3788,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - null, - null, - null, - ], "isJS": Array [ false, false, @@ -3833,6 +3834,15 @@ Object { 3, 1, ], + "source": Array [ + null, + null, + null, + null, + null, + null, + null, + ], }, "isMainThread": false, "markers": Object { diff --git a/src/test/store/__snapshots__/profile-view.test.ts.snap b/src/test/store/__snapshots__/profile-view.test.ts.snap index 62e1823aa0..8e2c6b9782 100644 --- a/src/test/store/__snapshots__/profile-view.test.ts.snap +++ b/src/test/store/__snapshots__/profile-view.test.ts.snap @@ -418,7 +418,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sourceURL": "", diff --git a/src/test/store/js-tracer.test.ts b/src/test/store/js-tracer.test.ts index 23fbebe754..6fd44b9f8b 100644 --- a/src/test/store/js-tracer.test.ts +++ b/src/test/store/js-tracer.test.ts @@ -356,7 +356,10 @@ describe('selectors/getJsTracerTiming', function () { thread.funcTable.lineNumber[foo] = fooLine; thread.funcTable.columnNumber[foo] = fooColumn; const fooUrlIndex = stringTable.indexForString('https://mozilla.org'); - thread.funcTable.source[foo] = addSourceToTable(profile.shared.sources, fooUrlIndex); + thread.funcTable.source[foo] = addSourceToTable( + profile.shared.sources, + fooUrlIndex + ); const bar = funcNamesDict['Bar.js']; const barLine = 7; @@ -364,14 +367,20 @@ describe('selectors/getJsTracerTiming', function () { thread.funcTable.lineNumber[bar] = barLine; thread.funcTable.columnNumber[bar] = barColumn; const barUrlIndex = stringTable.indexForString('https://mozilla.org'); - thread.funcTable.source[bar] = addSourceToTable(profile.shared.sources, barUrlIndex); + thread.funcTable.source[bar] = addSourceToTable( + profile.shared.sources, + barUrlIndex + ); const baz = funcNamesDict['Baz.js']; // Use bar's line and column information. thread.funcTable.lineNumber[baz] = barLine; thread.funcTable.columnNumber[baz] = barColumn; const bazUrlIndex = stringTable.indexForString('https://mozilla.org'); - thread.funcTable.source[baz] = addSourceToTable(profile.shared.sources, bazUrlIndex); + thread.funcTable.source[baz] = addSourceToTable( + profile.shared.sources, + bazUrlIndex + ); // Manually update the JS tracer events to point to the right column numbers. jsTracer.line[2] = fooLine; diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap index 74b829562e..f83d8d67cd 100644 --- a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap @@ -573,7 +573,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "ART Trace (Android)", "sampleUnits": undefined, @@ -85528,7 +85528,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "ART Trace (Android)", "sampleUnits": undefined, @@ -334639,7 +334639,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -383023,7 +383023,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -431407,7 +431407,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -434250,7 +434250,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -437191,7 +437191,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 355035987.653, @@ -440716,7 +440716,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -446285,7 +446285,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -447312,7 +447312,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -453251,7 +453251,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -468146,7 +468146,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -474350,7 +474350,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -492758,7 +492758,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -561832,7 +561832,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -633729,7 +633729,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "target/debug/examples/work_log (dhat)", "sourceURL": "", diff --git a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap index 8c86108b32..df3b0ee2c5 100644 --- a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap @@ -40,7 +40,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -9382,7 +9382,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -9391,6 +9391,15 @@ Object { "version": 3, }, "shared": Object { + "sources": Object { + "filename": Array [ + 10, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -9501,13 +9510,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9544,6 +9546,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -9859,13 +9868,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9902,6 +9904,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10217,13 +10226,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -10260,6 +10262,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10915,7 +10924,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -10924,6 +10933,15 @@ Object { "version": 4, }, "shared": Object { + "sources": Object { + "filename": Array [ + 11, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -11037,13 +11055,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11080,6 +11091,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11419,13 +11437,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11462,6 +11473,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11797,15 +11815,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - null, - null, - ], "isJS": Array [ false, false, @@ -11852,6 +11861,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -12581,7 +12599,7 @@ Object { "misc": "rv:48.0", "oscpu": "Intel Mac OS X 10.11", "platform": "Macintosh", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "stackwalk": 1, @@ -12616,6 +12634,15 @@ Object { }, ], "shared": Object { + "sources": Object { + "filename": Array [ + 12, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -12730,13 +12757,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -12773,6 +12793,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13124,13 +13151,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -13167,6 +13187,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13504,15 +13531,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - null, - null, - ], "isJS": Array [ false, false, @@ -13559,6 +13577,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { From 7afe9d6e798cd6d5eb8206ab56b43547fcae59f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Tue, 5 Aug 2025 13:02:29 +0200 Subject: [PATCH 07/22] Bump gecko profile format version for the new frameTable location format Add an upgrader for frameTable.location changes that include JS sourceIds in brackets. --- docs-developer/CHANGELOG-formats.md | 4 +++ src/app-logic/constants.ts | 2 +- src/profile-logic/gecko-profile-versioning.ts | 10 +++++++ .../__snapshots__/profile-view.test.ts.snap | 2 +- .../profile-conversion.test.ts.snap | 28 +++++++++---------- .../profile-upgrading.test.ts.snap | 6 ++-- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/docs-developer/CHANGELOG-formats.md b/docs-developer/CHANGELOG-formats.md index 84f6b57558..21c7185a5a 100644 --- a/docs-developer/CHANGELOG-formats.md +++ b/docs-developer/CHANGELOG-formats.md @@ -126,6 +126,10 @@ Older versions are not documented in this changelog but can be found in [process ## Gecko profile format +### Version 32 + +`frameTable` `location` string field was changed to include an optional `sourceIndex` at the end of the string inside brackets for JS sources. For example, new JS frames look like this: `functionName (http://script.url/:1234:1234)[1234]` with the last number being its `sourceIndex`. This index references entries in the shared `SourceTable` in `profile.sources` (added in in the same version) which centralizes all source file information. + ### Version 31 Two new marker schema field format types have been added: `flow-id` and `terminating-flow-id`, with string index values (like `unique-string`). diff --git a/src/app-logic/constants.ts b/src/app-logic/constants.ts index 4b7463bdb0..be047a25b2 100644 --- a/src/app-logic/constants.ts +++ b/src/app-logic/constants.ts @@ -7,7 +7,7 @@ import type { MarkerPhase } from 'firefox-profiler/types'; // The current version of the Gecko profile format. // Please don't forget to update the gecko profile format changelog in // `docs-developer/CHANGELOG-formats.md`. -export const GECKO_PROFILE_VERSION = 31; +export const GECKO_PROFILE_VERSION = 32; // The current version of the "processed" profile format. // Please don't forget to update the processed profile format changelog in diff --git a/src/profile-logic/gecko-profile-versioning.ts b/src/profile-logic/gecko-profile-versioning.ts index db1050fa02..d6987c52af 100644 --- a/src/profile-logic/gecko-profile-versioning.ts +++ b/src/profile-logic/gecko-profile-versioning.ts @@ -1488,6 +1488,16 @@ const _upgraders: { // marker data with the new field types data, and no modification is needed in the // frontend to display older formats. }, + [32]: (_) => { + // This version bump changes the frameTable location string to include + // optional sourceIndexes for the JS frames and adds optional source table + // to profile.sources. + // Older frontends will not be able to display these fields. + // No upgrade is needed: + // - There is no change to the JSON structure, the information is embedded + // within the existing location string. + // - The source ID is optional, so v31 profiles are valid v32 profiles. + }, // If you add a new upgrader here, please document the change in // `docs-developer/CHANGELOG-formats.md`. diff --git a/src/test/store/__snapshots__/profile-view.test.ts.snap b/src/test/store/__snapshots__/profile-view.test.ts.snap index 8e2c6b9782..a8c4c9ec9e 100644 --- a/src/test/store/__snapshots__/profile-view.test.ts.snap +++ b/src/test/store/__snapshots__/profile-view.test.ts.snap @@ -426,7 +426,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [ Object { diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap index f83d8d67cd..aa0f53fbe6 100644 --- a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap @@ -586,7 +586,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -85541,7 +85541,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -334649,7 +334649,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -383033,7 +383033,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -431417,7 +431417,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -434258,7 +434258,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -437201,7 +437201,7 @@ Object { "startTime": 1700159839203.051, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -440724,7 +440724,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -446295,7 +446295,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { @@ -447325,7 +447325,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -453264,7 +453264,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -468159,7 +468159,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -474363,7 +474363,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -633737,7 +633737,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [], "shared": Object { diff --git a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap index df3b0ee2c5..03f2801ef5 100644 --- a/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap +++ b/src/test/unit/__snapshots__/profile-upgrading.test.ts.snap @@ -53,7 +53,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -6389,7 +6389,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pausedRanges": Array [], "processes": Array [ @@ -7845,7 +7845,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pages": Array [ Object { From d200dbc8b751c7be416dd8917d3e2b16f5a4645c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 12:43:35 +0200 Subject: [PATCH 08/22] Add tests for the source table processing --- src/test/unit/process-profile.test.ts | 109 ++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index e93ab12944..5844b04eb1 100644 --- a/src/test/unit/process-profile.test.ts +++ b/src/test/unit/process-profile.test.ts @@ -897,3 +897,112 @@ describe('visualMetrics processing', function () { ); }); }); + +describe('source table processing', function () { + it('should create a global source table during profile processing', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Check that the global source table has the expected structure + expect(processedProfile.shared.sources.filename).toBeArray(); + expect(processedProfile.shared.sources.uuid).toBeArray(); + expect(processedProfile.shared.sources.length).toBeNumber(); + + // Check that source indexes are consistent + expect(processedProfile.shared.sources.filename.length).toBe( + processedProfile.shared.sources.length + ); + expect(processedProfile.shared.sources.uuid.length).toBe( + processedProfile.shared.sources.length + ); + + // Should have at least one source from the test profile + expect(processedProfile.shared.sources.length).toBeGreaterThan(0); + + // All filename indexes should be valid string table indexes + for (const filenameIndex of processedProfile.shared.sources.filename) { + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + processedProfile.shared.stringArray.length + ); + } + }); + + it('should properly construct the source references', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Check that all threads have correct funcTable.source values + expect(processedProfile.threads.length).toBeGreaterThan(0); + for (const thread of processedProfile.threads) { + expect(thread.funcTable.source).toBeArray(); + + // Should have at least some functions in the test profile + expect(thread.funcTable.length).toBeGreaterThan(0); + + // Verify that source indexes are valid + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + if (sourceIndex === null) { + // Skip the native functions that don't have sources yet. They are + // added during symbolication. + continue; + } + + expect(sourceIndex).toBeGreaterThanOrEqual(0); + expect(sourceIndex).toBeLessThan( + processedProfile.shared.sources.length + ); + + // Verify that the source points to a valid filename + const filenameIndex = + processedProfile.shared.sources.filename[sourceIndex]; + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + processedProfile.shared.stringArray.length + ); + + // Verify the filename string is not empty + const filename = processedProfile.shared.stringArray[filenameIndex]; + expect(filename).toBeString(); + expect(filename.length).toBeGreaterThan(0); + } + } + }); + + it('should handle sources with null UUIDs correctly', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Most sources in the test profile should have null UUIDs + const { sources } = processedProfile.shared; + for (let i = 0; i < sources.length; i++) { + // UUIDs can be null or string + expect( + sources.uuid[i] === null || typeof sources.uuid[i] === 'string' + ).toBe(true); + } + }); + + it('should deduplicate sources with same filename and UUID', function () { + const geckoProfile = createGeckoProfile(); + const processedProfile = processGeckoProfile(geckoProfile); + + // Count unique source files - verify no exact duplicates exist + const { sources } = processedProfile.shared; + const filenameSet = new Set(); + + for (let i = 0; i < sources.length; i++) { + const filename = processedProfile.shared.stringArray[sources.filename[i]]; + const uuid = sources.uuid[i]; + const key = `${filename}:${uuid}`; + + // Should not have exact duplicates + expect(filenameSet.has(key)).toBe(false); + filenameSet.add(key); + } + + // The test profile should have at least one source + expect(sources.length).toBeGreaterThan(0); + }); +}); From ec7ba3a19e30ae8114be8e573a7c9f86d557de89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 12:29:36 +0200 Subject: [PATCH 09/22] Add tests for GlobalDataCollector for sources --- src/test/unit/global-data-collector.test.ts | 136 ++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/test/unit/global-data-collector.test.ts diff --git a/src/test/unit/global-data-collector.test.ts b/src/test/unit/global-data-collector.test.ts new file mode 100644 index 0000000000..6f5ea4dffa --- /dev/null +++ b/src/test/unit/global-data-collector.test.ts @@ -0,0 +1,136 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { GlobalDataCollector } from '../../profile-logic/global-data-collector'; +import { StringTable } from '../../utils/string-table'; + +describe('GlobalDataCollector', function () { + describe('source table management', function () { + it('should create an empty source table', function () { + const collector = new GlobalDataCollector(); + const { shared } = collector.finish(); + + expect(shared.sources.filename).toEqual([]); + expect(shared.sources.uuid).toEqual([]); + expect(shared.sources.length).toBe(0); + }); + + it('should add unique sources and return correct indexes', function () { + const collector = new GlobalDataCollector(); + + // Add different sources + const sourceIndex1 = collector.indexForSource(null, 'file1.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'file2.js'); + // Duplicate filename but different UUID + const sourceIndex3 = collector.indexForSource('uuid3', 'file1.js'); + + expect(sourceIndex1).toBe(0); + expect(sourceIndex2).toBe(1); + expect(sourceIndex3).toBe(2); + + const { shared } = collector.finish(); + const stringTable = StringTable.withBackingArray(shared.stringArray); + + const file1Index = stringTable.indexForString('file1.js'); + const file2Index = stringTable.indexForString('file2.js'); + + expect(shared.sources.filename).toEqual([ + file1Index, + file2Index, + file1Index, + ]); + expect(shared.sources.uuid).toEqual([null, 'uuid2', 'uuid3']); + expect(shared.sources.length).toBe(3); + }); + + it('should return existing index for duplicate filename/uuid combinations', function () { + const collector = new GlobalDataCollector(); + + // Add the same source twice + const sourceIndex1 = collector.indexForSource('same-uuid', 'file1.js'); + const sourceIndex2 = collector.indexForSource('same-uuid', 'file1.js'); + + expect(sourceIndex1).toBe(sourceIndex2); + expect(sourceIndex1).toBe(0); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual(['same-uuid']); + expect(shared.sources.length).toBe(1); + }); + + it('should handle null UUIDs correctly', function () { + const collector = new GlobalDataCollector(); + + // Add the same filename with null UUID twice + const sourceIndex1 = collector.indexForSource(null, 'file1.js'); + const sourceIndex2 = collector.indexForSource(null, 'file1.js'); + + expect(sourceIndex1).toBe(sourceIndex2); + expect(sourceIndex1).toBe(0); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual([null]); + expect(shared.sources.length).toBe(1); + }); + + it('should handle different UUIDs for the same filename', function () { + const collector = new GlobalDataCollector(); + + // Add same filename with different UUIDs + const sourceIndex1 = collector.indexForSource('uuid1', 'file1.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'file1.js'); + const sourceIndex3 = collector.indexForSource(null, 'file1.js'); + + expect(sourceIndex1).toBe(0); + expect(sourceIndex2).toBe(1); + expect(sourceIndex3).toBe(2); + + const { shared } = collector.finish(); + + expect(shared.sources.uuid).toEqual(['uuid1', 'uuid2', null]); + expect(shared.sources.length).toBe(3); + }); + }); + + describe('string table integration', function () { + it('should maintain correct string table state', function () { + const collector = new GlobalDataCollector(); + + // Add sources + collector.indexForSource(null, 'first.js'); + collector.indexForSource('uuid', 'second.js'); + + const { shared } = collector.finish(); + + expect(shared.stringArray).toEqual(['first.js', 'second.js']); + const stringTable = StringTable.withBackingArray(shared.stringArray); + const firstIndex = stringTable.indexForString('first.js'); + const secondIndex = stringTable.indexForString('second.js'); + expect(shared.sources.filename).toEqual([firstIndex, secondIndex]); + }); + + it('should handle string deduplication correctly', function () { + const collector = new GlobalDataCollector(); + + // Add a source, then add another source with the same filename + const sourceIndex1 = collector.indexForSource('uuid1', 'same.js'); + const sourceIndex2 = collector.indexForSource('uuid2', 'same.js'); + + // Should be different source indexes since UUIDs are different + expect(sourceIndex1).not.toBe(sourceIndex2); + + const { shared } = collector.finish(); + + // Should have both files with the same filename string but different source entries + const stringTable = StringTable.withBackingArray(shared.stringArray); + const filenameIndex = stringTable.indexForString('same.js'); + + expect(shared.sources.filename).toEqual([filenameIndex, filenameIndex]); + expect(shared.sources.uuid).toEqual(['uuid1', 'uuid2']); + expect(shared.sources.length).toBe(2); + }); + }); +}); From 0ec93665d13eb48609b6a6d0b1aa2b81ac9dfcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 12:38:35 +0200 Subject: [PATCH 10/22] Add tests for merge-compare code with the source table --- src/test/unit/merge-compare.test.ts | 201 ++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/src/test/unit/merge-compare.test.ts b/src/test/unit/merge-compare.test.ts index a1ef1fb95c..41458861e2 100644 --- a/src/test/unit/merge-compare.test.ts +++ b/src/test/unit/merge-compare.test.ts @@ -15,6 +15,7 @@ import { import { markerSchemaForTests } from '../fixtures/profiles/marker-schema'; import { ensureExists } from 'firefox-profiler/utils/types'; import { getTimeRangeIncludingAllThreads } from 'firefox-profiler/profile-logic/profile-data'; +import { StringTable } from '../../utils/string-table'; import type { RawThread, RawProfileSharedData, @@ -612,3 +613,203 @@ describe('mergeThreads function', function () { expect(string2AfterMerge).toBe(uniqueString2); }); }); + +describe('mergeProfilesForDiffing with source tables', function () { + it('should merge source tables from multiple profiles correctly', function () { + // Create first profile with some sources + const profileA = getProfileFromTextSamples(` + A[file:one.js] A[file:one.js] + B[file:two.js] C[file:three.js] + `); + + // Create second profile with overlapping and unique sources + const profileB = getProfileFromTextSamples(` + X[file:two.js] X[file:two.js] + Y[file:four.js] Z[file:one.js] + `); + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + const { sources } = mergedProfile.shared; + const stringTable = StringTable.withBackingArray( + mergedProfile.shared.stringArray + ); + + expect(sources.length).toBe(4); + // Check that all unique sources are present + const sourceFilenames = sources.filename.map((index) => + stringTable.getString(index) + ); + + expect(sourceFilenames).toHaveLength(4); + expect(sourceFilenames).toEqual( + expect.arrayContaining(['one.js', 'two.js', 'three.js', 'four.js']) + ); + + // Check that UUIDs are properly handled (should all be null for text samples) + expect(sources.uuid).toEqual([null, null, null, null]); + + // Verify each filename index points to a valid string + for (const filenameIndex of sources.filename) { + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan(stringTable.getBackingArray().length); + const filename = stringTable.getString(filenameIndex); + expect(filename).toBeString(); + expect(filename.endsWith('.js')).toBe(true); + } + }); + + it('should handle profiles with different UUID patterns', function () { + // Create profiles with sources that have different UUIDs + const profileA = getProfileFromTextSamples(` + A[file:script.js] + `); + + const profileB = getProfileFromTextSamples(` + B[file:script.js] + `); + + // Manually modify the source tables to have UUIDs + profileA.profile.shared.sources.uuid[0] = 'uuid-a'; + profileB.profile.shared.sources.uuid[0] = 'uuid-b'; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + const { sources } = mergedProfile.shared; + const stringTable = StringTable.withBackingArray( + mergedProfile.shared.stringArray + ); + + // Should have two separate entries for the same filename with different UUIDs + const sourceFilenames = sources.filename.map((index) => + stringTable.getString(index) + ); + + expect(sources.length).toBe(2); + expect(sourceFilenames.filter((name) => name === 'script.js')).toHaveLength( + 2 + ); + expect(sources.uuid).toHaveLength(2); + expect(sources.uuid).toEqual(expect.arrayContaining(['uuid-a', 'uuid-b'])); + + // Both should point to the same filename string + const filenameIndexes = sources.filename; + expect(stringTable.getString(filenameIndexes[0])).toBe('script.js'); + expect(stringTable.getString(filenameIndexes[1])).toBe('script.js'); + }); + + it('should correctly update funcTable source references after merging', function () { + const profileA = getProfileFromTextSamples(` + A[file:first.js] + B[file:second.js] + `); + + const profileB = getProfileFromTextSamples(` + C[file:second.js] + D[file:third.js] + `); + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [profileA.profile, profileB.profile], + [profileState, profileState] + ); + + // Check that all threads have valid source references + for (const thread of mergedProfile.threads) { + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + // Source index should be valid + expect(sourceIndex).not.toBeNull(); + expect(sourceIndex).toBeGreaterThanOrEqual(0); + expect(sourceIndex).toBeLessThan(mergedProfile.shared.sources.length); + + // Should reference a valid filename in the string table + const filenameIndex = + mergedProfile.shared.sources.filename[ensureExists(sourceIndex)]; + expect(filenameIndex).toBeGreaterThanOrEqual(0); + expect(filenameIndex).toBeLessThan( + mergedProfile.shared.stringArray.length + ); + } + } + }); + + it('should preserve source information in empty profiles', function () { + // Create minimal empty profiles manually since getProfileFromTextSamples doesn't handle empty strings + const emptyProfileA = getProfileFromTextSamples('A').profile; + const emptyProfileB = getProfileFromTextSamples('B').profile; + + // Clear the threads to make them effectively empty + emptyProfileA.threads[0].samples.length = 0; + emptyProfileA.threads[0].samples.stack = []; + emptyProfileB.threads[0].samples.length = 0; + emptyProfileB.threads[0].samples.stack = []; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [emptyProfileA, emptyProfileB], + [profileState, profileState] + ); + + // Should still have some sources from the profile structure + expect(mergedProfile.shared.sources.filename).toBeArray(); + expect(mergedProfile.shared.sources.uuid).toBeArray(); + expect(mergedProfile.shared.sources.length).toBeNumber(); + expect(mergedProfile.shared.sources.length).toBeGreaterThanOrEqual(0); + }); + + it('should handle single profile merge correctly', function () { + const singleProfile = getProfileFromTextSamples(` + A[file:single.js] + B[file:single.js] + `); + + const originalSourcesLength = singleProfile.profile.shared.sources.length; + + const profileState = stateFromLocation({ + pathname: '/public/fakehash1/', + search: '?thread=0&v=3', + hash: '', + }); + + const { profile: mergedProfile } = mergeProfilesForDiffing( + [singleProfile.profile], + [profileState] + ); + + // Should preserve original source table + expect(mergedProfile.shared.sources.length).toBe(originalSourcesLength); + expect(mergedProfile.shared.sources).toEqual( + singleProfile.profile.shared.sources + ); + }); +}); From dd00c8a5951b1508e0d3e3b52ce4a7813bf7d391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Wed, 17 Sep 2025 23:49:18 +0200 Subject: [PATCH 11/22] Store sourceIndex instead of sourceFile in url state and source view states --- src/actions/code.ts | 20 +++++--- src/actions/profile-view.ts | 8 +-- src/app-logic/url-handling.ts | 14 +++--- src/components/app/BottomBox.tsx | 6 ++- src/components/app/SourceCodeFetcher.tsx | 50 ++++++++++++------- src/profile-logic/profile-data.ts | 33 ++---------- src/reducers/code.ts | 22 ++++---- src/reducers/url-state.ts | 4 +- src/selectors/code.tsx | 17 ++++--- src/selectors/per-thread/index.ts | 26 ++++------ src/selectors/per-thread/stack-sample.ts | 2 +- src/selectors/profile.ts | 23 +++++++++ src/selectors/url-state.ts | 6 ++- .../components/CallNodeContextMenu.test.tsx | 2 +- src/test/components/FlameGraph.test.tsx | 6 +-- src/test/components/StackChart.test.tsx | 10 ++-- src/test/store/bottom-box.test.ts | 14 +++--- src/test/unit/profile-data.test.ts | 22 ++++++-- src/test/url-handling.test.ts | 50 ++++++++++++------- src/types/actions.ts | 11 ++-- src/types/profile-derived.ts | 3 +- src/types/state.ts | 9 ++-- 22 files changed, 210 insertions(+), 148 deletions(-) diff --git a/src/actions/code.ts b/src/actions/code.ts index 870d4590ce..aa235e2d1e 100644 --- a/src/actions/code.ts +++ b/src/actions/code.ts @@ -6,30 +6,34 @@ import type { SourceCodeLoadingError, ApiQueryError, DecodedInstruction, + IndexIntoSourceTable, } from 'firefox-profiler/types'; export function beginLoadingSourceCodeFromUrl( - file: string, + sourceIndex: IndexIntoSourceTable, url: string ): Action { - return { type: 'SOURCE_CODE_LOADING_BEGIN_URL', file, url }; + return { type: 'SOURCE_CODE_LOADING_BEGIN_URL', sourceIndex, url }; } export function beginLoadingSourceCodeFromBrowserConnection( - file: string + sourceIndex: IndexIntoSourceTable ): Action { - return { type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION', file }; + return { type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION', sourceIndex }; } -export function finishLoadingSourceCode(file: string, code: string): Action { - return { type: 'SOURCE_CODE_LOADING_SUCCESS', file, code }; +export function finishLoadingSourceCode( + sourceIndex: IndexIntoSourceTable, + code: string +): Action { + return { type: 'SOURCE_CODE_LOADING_SUCCESS', sourceIndex, code }; } export function failLoadingSourceCode( - file: string, + sourceIndex: IndexIntoSourceTable, errors: SourceCodeLoadingError[] ): Action { - return { type: 'SOURCE_CODE_LOADING_ERROR', file, errors }; + return { type: 'SOURCE_CODE_LOADING_ERROR', sourceIndex, errors }; } export function beginLoadingAssemblyCodeFromUrl( diff --git a/src/actions/profile-view.ts b/src/actions/profile-view.ts index 43af88bb8b..9ca988d8cc 100644 --- a/src/actions/profile-view.ts +++ b/src/actions/profile-view.ts @@ -1917,7 +1917,7 @@ export function changeTableViewOptions( export function updateBottomBoxContentsAndMaybeOpen( currentTab: TabSlug, - { libIndex, sourceFile, nativeSymbols }: BottomBoxInfo + { libIndex, sourceIndex, nativeSymbols }: BottomBoxInfo ): Action { // TODO: If the set has more than one element, pick the native symbol with // the highest total sample count @@ -1926,12 +1926,12 @@ export function updateBottomBoxContentsAndMaybeOpen( return { type: 'UPDATE_BOTTOM_BOX', libIndex, - sourceFile, + sourceIndex, nativeSymbol, allNativeSymbolsForInitiatingCallNode: nativeSymbols, currentTab, - shouldOpenBottomBox: sourceFile !== null || nativeSymbol !== null, - shouldOpenAssemblyView: sourceFile === null && nativeSymbol !== null, + shouldOpenBottomBox: sourceIndex !== null || nativeSymbol !== null, + shouldOpenAssemblyView: sourceIndex === null && nativeSymbol !== null, }; } diff --git a/src/app-logic/url-handling.ts b/src/app-logic/url-handling.ts index df7b8adbae..7c481b3dee 100644 --- a/src/app-logic/url-handling.ts +++ b/src/app-logic/url-handling.ts @@ -171,7 +171,7 @@ type BaseQuery = { view: string; implementation: string; timelineType: string; - sourceView: string; + sourceViewIndex: number; assemblyView: string; }; @@ -208,7 +208,7 @@ type Query = BaseQuery & { invertCallstack?: null | undefined; ctSummary?: string; transforms?: string; - sourceView?: string; + sourceViewIndex?: number; assemblyView?: string; // StackChart specific @@ -349,8 +349,8 @@ export function getQueryStringFromUrlState(urlState: UrlState): string { urlState.profileSpecific; if (isBottomBoxOpenPerPanel[selectedTab]) { - if (sourceView.sourceFile !== null) { - query.sourceView = sourceView.sourceFile; + if (sourceView.sourceIndex !== null) { + query.sourceViewIndex = sourceView.sourceIndex; } if (assemblyView.isOpen && assemblyView.nativeSymbol !== null) { query.assemblyView = stringifyAssemblyViewSymbol( @@ -508,7 +508,7 @@ export function stateFromLocation( const sourceView: SourceViewState = { scrollGeneration: 0, libIndex: null, - sourceFile: null, + sourceIndex: null, }; const assemblyView: AssemblyViewState = { isOpen: false, @@ -518,8 +518,8 @@ export function stateFromLocation( }; const isBottomBoxOpenPerPanel: any = {}; tabSlugs.forEach((tabSlug) => (isBottomBoxOpenPerPanel[tabSlug] = false)); - if (query.sourceView) { - sourceView.sourceFile = query.sourceView; + if (query.sourceViewIndex !== undefined) { + sourceView.sourceIndex = Number(query.sourceViewIndex); isBottomBoxOpenPerPanel[selectedTab] = true; } if (query.assemblyView) { diff --git a/src/components/app/BottomBox.tsx b/src/components/app/BottomBox.tsx index bfdae26482..4f5d8d2434 100644 --- a/src/components/app/BottomBox.tsx +++ b/src/components/app/BottomBox.tsx @@ -13,7 +13,6 @@ import { IonGraphView } from '../shared/IonGraphView'; import { CodeLoadingOverlay } from './CodeLoadingOverlay'; import { CodeErrorOverlay } from './CodeErrorOverlay'; import { - getSourceViewFile, getSourceViewScrollGeneration, getAssemblyViewIsOpen, getAssemblyViewNativeSymbol, @@ -29,7 +28,10 @@ import { getSourceViewCode, getAssemblyViewCode, } from 'firefox-profiler/selectors/code'; -import { getPreviewSelectionIsBeingModified } from 'firefox-profiler/selectors/profile'; +import { + getPreviewSelectionIsBeingModified, + getSourceViewFile, +} from 'firefox-profiler/selectors/profile'; import explicitConnect from 'firefox-profiler/utils/connect'; import type { ConnectedProps } from 'firefox-profiler/utils/connect'; diff --git a/src/components/app/SourceCodeFetcher.tsx b/src/components/app/SourceCodeFetcher.tsx index f0483b969e..bc2284c4d8 100644 --- a/src/components/app/SourceCodeFetcher.tsx +++ b/src/components/app/SourceCodeFetcher.tsx @@ -8,8 +8,9 @@ import { getProfileOrNull, getSourceViewCode, getBrowserConnection, - getSourceViewFile, getSymbolServerUrl, + getSourceViewFile, + getSourceViewSourceIndex, } from 'firefox-profiler/selectors'; import { beginLoadingSourceCodeFromUrl, @@ -25,10 +26,15 @@ import { assertExhaustiveCheck } from 'firefox-profiler/utils/types'; import explicitConnect from 'firefox-profiler/utils/connect'; import type { ConnectedProps } from 'firefox-profiler/utils/connect'; -import type { SourceCodeStatus, Profile } from 'firefox-profiler/types'; +import type { + SourceCodeStatus, + Profile, + IndexIntoSourceTable, +} from 'firefox-profiler/types'; type StateProps = { readonly sourceViewFile: string | null; + readonly sourceViewSourceIndex: IndexIntoSourceTable | null; readonly sourceViewCode: SourceCodeStatus | void; readonly symbolServerUrl: string; readonly profile: Profile | null; @@ -55,15 +61,11 @@ class SourceCodeFetcherImpl extends React.PureComponent { this._triggerSourceLoadingIfNeeded(); } - _triggerSourceLoadingIfNeeded() { - const { sourceViewFile, sourceViewCode } = this.props; - if (sourceViewFile && !sourceViewCode) { - this._fetchSourceForFile(sourceViewFile); - } - } - - async _fetchSourceForFile(file: string) { + async _triggerSourceLoadingIfNeeded() { const { + sourceViewSourceIndex, + sourceViewCode, + sourceViewFile, beginLoadingSourceCodeFromUrl, beginLoadingSourceCodeFromBrowserConnection, finishLoadingSourceCode, @@ -73,23 +75,33 @@ class SourceCodeFetcherImpl extends React.PureComponent { browserConnection, } = this.props; - const addressProof = - profile !== null ? findAddressProofForFile(profile, file) : null; + if (sourceViewSourceIndex === null || sourceViewCode || !sourceViewFile) { + return; + } + + if (!profile) { + return; + } + + const addressProof = findAddressProofForFile( + profile, + sourceViewSourceIndex + ); const delegate = new RegularExternalCommunicationDelegate( browserConnection, { onBeginUrlRequest: (url: string) => { - beginLoadingSourceCodeFromUrl(file, url); + beginLoadingSourceCodeFromUrl(sourceViewSourceIndex, url); }, onBeginBrowserConnectionQuery: () => { - beginLoadingSourceCodeFromBrowserConnection(file); + beginLoadingSourceCodeFromBrowserConnection(sourceViewSourceIndex); }, } ); const fetchSourceResult = await fetchSource( - file, + sourceViewFile, symbolServerUrl, addressProof, this._archiveCache, @@ -98,10 +110,13 @@ class SourceCodeFetcherImpl extends React.PureComponent { switch (fetchSourceResult.type) { case 'SUCCESS': - finishLoadingSourceCode(file, fetchSourceResult.source); + finishLoadingSourceCode( + sourceViewSourceIndex, + fetchSourceResult.source + ); break; case 'ERROR': - failLoadingSourceCode(file, fetchSourceResult.errors); + failLoadingSourceCode(sourceViewSourceIndex, fetchSourceResult.errors); break; default: throw assertExhaustiveCheck(fetchSourceResult); @@ -116,6 +131,7 @@ class SourceCodeFetcherImpl extends React.PureComponent { export const SourceCodeFetcher = explicitConnect<{}, StateProps, DispatchProps>( { mapStateToProps: (state) => ({ + sourceViewSourceIndex: getSourceViewSourceIndex(state), sourceViewFile: getSourceViewFile(state), sourceViewCode: getSourceViewCode(state), symbolServerUrl: getSymbolServerUrl(state), diff --git a/src/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts index 2ab26e7868..7c9b4911ae 100644 --- a/src/profile-logic/profile-data.ts +++ b/src/profile-logic/profile-data.ts @@ -27,7 +27,6 @@ import { timeCode } from 'firefox-profiler/utils/time-code'; import { bisectionRight, bisectionLeft } from 'firefox-profiler/utils/bisect'; import { checkBit, makeBitSet, setBit } from 'firefox-profiler/utils/bitset'; import { parseFileNameFromSymbolication } from 'firefox-profiler/utils/special-paths'; -import { StringTable } from 'firefox-profiler/utils/string-table'; import { ensureExists, getFirstItemFromSet, @@ -39,6 +38,7 @@ import { import ExtensionFavicon from '../../res/img/svg/extension-outline.svg'; import DefaultLinkFavicon from '../../res/img/svg/globe.svg'; +import type { StringTable } from 'firefox-profiler/utils/string-table'; import type { Profile, RawProfileSharedData, @@ -96,6 +96,7 @@ import type { ThreadWithReservedFunctions, TabID, SourceTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import type { CallNodeInfo, SuffixOrderIndex } from './call-node-info'; @@ -3778,29 +3779,12 @@ export function nudgeReturnAddresses(thread: RawThread): RawThread { */ export function findAddressProofForFile( profile: Profile, - file: string + sourceIndex: IndexIntoSourceTable ): AddressProof | null { const { libs } = profile; - const { stringArray, sources } = profile.shared; - const stringTable = StringTable.withBackingArray(stringArray); for (const thread of profile.threads) { const { frameTable, funcTable, resourceTable } = thread; - const fileStringIndex = stringTable.indexForString(file); - - // Find func by searching through sources table - let func = -1; - if (sources) { - for (let i = 0; i < funcTable.length; i++) { - const sourceIndex = funcTable.source[i]; - if (sourceIndex !== null) { - const urlIndex = sources.filename[sourceIndex]; - if (urlIndex === fileStringIndex) { - func = i; - break; - } - } - } - } + const func = funcTable.source.indexOf(sourceIndex); if (func === -1) { continue; } @@ -3989,17 +3973,10 @@ export function getBottomBoxInfoForCallNode( stringTable, resourceTable, nativeSymbols, - sources, } = thread; const funcIndex = callNodeInfo.funcForNode(callNodeIndex); const sourceIndex = funcTable.source[funcIndex]; - let sourceFile = null; - if (sourceIndex !== null) { - const fileNameIndex = sources.filename[sourceIndex]; - sourceFile = - fileNameIndex !== null ? stringTable.getString(fileNameIndex) : null; - } const resource = funcTable.resource[funcIndex]; const libIndex = resource !== -1 && resourceTable.type[resource] === resourceTypes.library @@ -4023,7 +4000,7 @@ export function getBottomBoxInfoForCallNode( return { libIndex, - sourceFile, + sourceIndex, nativeSymbols: nativeSymbolInfosForCallNode, }; } diff --git a/src/reducers/code.ts b/src/reducers/code.ts index d9f8054800..3a6e863e07 100644 --- a/src/reducers/code.ts +++ b/src/reducers/code.ts @@ -7,39 +7,43 @@ import type { SourceCodeStatus, AssemblyCodeStatus, CodeState, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import { combineReducers } from 'redux'; -const sourceCodeCache: Reducer> = ( +const sourceCodeCache: Reducer> = ( state = new Map(), action ) => { switch (action.type) { case 'SOURCE_CODE_LOADING_BEGIN_URL': { - const { file, url } = action; + const { sourceIndex, url } = action; const newState = new Map(state); - newState.set(file, { type: 'LOADING', source: { type: 'URL', url } }); + newState.set(sourceIndex, { + type: 'LOADING', + source: { type: 'URL', url }, + }); return newState; } case 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION': { - const { file } = action; + const { sourceIndex } = action; const newState = new Map(state); - newState.set(file, { + newState.set(sourceIndex, { type: 'LOADING', source: { type: 'BROWSER_CONNECTION' }, }); return newState; } case 'SOURCE_CODE_LOADING_SUCCESS': { - const { file, code } = action; + const { sourceIndex, code } = action; const newState = new Map(state); - newState.set(file, { type: 'AVAILABLE', code }); + newState.set(sourceIndex, { type: 'AVAILABLE', code }); return newState; } case 'SOURCE_CODE_LOADING_ERROR': { - const { file, errors } = action; + const { sourceIndex, errors } = action; const newState = new Map(state); - newState.set(file, { type: 'ERROR', errors }); + newState.set(sourceIndex, { type: 'ERROR', errors }); return newState; } default: diff --git a/src/reducers/url-state.ts b/src/reducers/url-state.ts index 8f107727ca..9469e9a90e 100644 --- a/src/reducers/url-state.ts +++ b/src/reducers/url-state.ts @@ -561,7 +561,7 @@ const profileName: Reducer = (state = null, action) => { }; const sourceView: Reducer = ( - state = { scrollGeneration: 0, libIndex: null, sourceFile: null }, + state = { scrollGeneration: 0, libIndex: null, sourceIndex: null }, action ) => { switch (action.type) { @@ -569,7 +569,7 @@ const sourceView: Reducer = ( return { scrollGeneration: state.scrollGeneration + 1, libIndex: action.libIndex, - sourceFile: action.sourceFile, + sourceIndex: action.sourceIndex, }; } default: diff --git a/src/selectors/code.tsx b/src/selectors/code.tsx index 3a91c75223..210d102046 100644 --- a/src/selectors/code.tsx +++ b/src/selectors/code.tsx @@ -7,19 +7,24 @@ import type { Lib, SourceCodeStatus, Selector, + IndexIntoSourceTable, } from 'firefox-profiler/types'; -import { getSourceViewFile, getAssemblyViewNativeSymbol } from './url-state'; +import { + getSourceViewSourceIndex, + getAssemblyViewNativeSymbol, +} from './url-state'; import { getProfileOrNull } from './profile'; -export const getSourceCodeCache: Selector> = ( - state -) => state.code.sourceCodeCache; +export const getSourceCodeCache: Selector< + Map +> = (state) => state.code.sourceCodeCache; export const getSourceViewCode: Selector = createSelector( getSourceCodeCache, - getSourceViewFile, - (sourceCodeCache, file) => (file ? sourceCodeCache.get(file) : undefined) + getSourceViewSourceIndex, + (sourceCodeCache, sourceIndex) => + sourceIndex !== null ? sourceCodeCache.get(sourceIndex) : undefined ); export const getAssemblyCodeCache: Selector> = ( diff --git a/src/selectors/per-thread/index.ts b/src/selectors/per-thread/index.ts index 895056ada3..3fe4e3917e 100644 --- a/src/selectors/per-thread/index.ts +++ b/src/selectors/per-thread/index.ts @@ -271,30 +271,24 @@ export const selectedNodeSelectors: NodeSelectors = (() => { const getSourceViewStackLineInfo: Selector = createSelector( selectedThreadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + UrlState.getSourceViewSourceIndex, selectedThreadSelectors.getCallNodeInfo, selectedThreadSelectors.getSelectedCallNodeIndex, - ProfileSelectors.getSourceTable, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile, + { stackTable, frameTable, funcTable }: Thread, + sourceViewSourceIndex, callNodeInfo, - selectedCallNodeIndex, - sources + selectedCallNodeIndex ): StackLineInfo | null => { - if (sourceViewFile === null || selectedCallNodeIndex === null) { + if (sourceViewSourceIndex === null || selectedCallNodeIndex === null) { return null; } const selectedFunc = callNodeInfo.funcForNode(selectedCallNodeIndex); - const sourceIndex = funcTable.source[selectedFunc]; - let selectedFuncFile = null; - if (sourceIndex !== null && sources) { - const urlIndex = sources.filename[sourceIndex]; - selectedFuncFile = - urlIndex !== null ? stringTable.getString(urlIndex) : null; - } - // TODO: Instead of checking the file name with a string comparison, check the source index. - if (selectedFuncFile === null || selectedFuncFile !== sourceViewFile) { + const selectedSourceIndex = funcTable.source[selectedFunc]; + if ( + selectedSourceIndex === null || + selectedSourceIndex !== sourceViewSourceIndex + ) { return null; } return getStackLineInfoForCallNode( diff --git a/src/selectors/per-thread/stack-sample.ts b/src/selectors/per-thread/stack-sample.ts index 101785e265..20408e51e0 100644 --- a/src/selectors/per-thread/stack-sample.ts +++ b/src/selectors/per-thread/stack-sample.ts @@ -140,7 +140,7 @@ export function getStackAndSampleSelectorsPerThread( const getSourceViewStackLineInfo: Selector = createSelector( threadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + ProfileSelectors.getSourceViewFile, ProfileSelectors.getSourceTable, ( { stackTable, frameTable, funcTable, stringTable }: Thread, diff --git a/src/selectors/profile.ts b/src/selectors/profile.ts index edae554978..38d2e68e9e 100644 --- a/src/selectors/profile.ts +++ b/src/selectors/profile.ts @@ -916,3 +916,26 @@ export const getProfileUsesMultipleStackTypes: Selector = (state) => { export const getProfileExtraInfo: Selector = createSelector(getProfile, (profile) => profile.meta.extra || []); + +export const getSourceViewFile: Selector = createSelector( + getSourceTable, + getStringTable, + UrlState.getSourceViewSourceIndex, + (sources, stringTable, sourceIndex) => { + if (sourceIndex === null) { + return null; + } + + const fileNameStrIndex = sources.filename[sourceIndex]; + return fileNameStrIndex !== null + ? stringTable.getString(fileNameStrIndex) + : null; + } +); + +export const getSourceViewSourceUuid: Selector = createSelector( + getSourceTable, + UrlState.getSourceViewSourceIndex, + (sources, sourceIndex) => + sourceIndex !== null ? sources.uuid[sourceIndex] : null +); diff --git a/src/selectors/url-state.ts b/src/selectors/url-state.ts index 21b8d2892b..ecb21e6103 100644 --- a/src/selectors/url-state.ts +++ b/src/selectors/url-state.ts @@ -30,6 +30,7 @@ import type { ProfileSpecificUrlState, NativeSymbolInfo, TabID, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import type { TabSlug } from '../app-logic/tabs-handling'; @@ -69,8 +70,9 @@ export const getShowUserTimings: Selector = (state) => getProfileSpecificState(state).showUserTimings; export const getStackChartSameWidths: Selector = (state) => getProfileSpecificState(state).stackChartSameWidths; -export const getSourceViewFile: Selector = (state) => - getProfileSpecificState(state).sourceView.sourceFile; +export const getSourceViewSourceIndex: Selector = ( + state +) => getProfileSpecificState(state).sourceView.sourceIndex; export const getSourceViewScrollGeneration: Selector = (state) => getProfileSpecificState(state).sourceView.scrollGeneration; export const getAssemblyViewIsOpen: Selector = (state) => diff --git a/src/test/components/CallNodeContextMenu.test.tsx b/src/test/components/CallNodeContextMenu.test.tsx index d865d1b8e6..c6c159c0fe 100644 --- a/src/test/components/CallNodeContextMenu.test.tsx +++ b/src/test/components/CallNodeContextMenu.test.tsx @@ -21,7 +21,7 @@ import { setContextMenuVisibility, } from '../../actions/profile-view'; import { selectedThreadSelectors } from '../../selectors/per-thread'; -import { getSourceViewFile } from '../../selectors/url-state'; +import { getSourceViewFile } from '../../selectors/profile'; import { ensureExists } from '../../utils/types'; import { createBrowserConnection } from '../../app-logic/browser-connection'; import { updateBrowserConnectionStatus } from 'firefox-profiler/actions/app'; diff --git a/src/test/components/FlameGraph.test.tsx b/src/test/components/FlameGraph.test.tsx index b32f0ddad8..88bb561d8f 100644 --- a/src/test/components/FlameGraph.test.tsx +++ b/src/test/components/FlameGraph.test.tsx @@ -11,10 +11,8 @@ import copy from 'copy-to-clipboard'; import { render, act } from 'firefox-profiler/test/fixtures/testing-library'; import { FlameGraph } from '../../components/flame-graph'; import { CallNodeContextMenu } from '../../components/shared/CallNodeContextMenu'; -import { - getInvertCallstack, - getSourceViewFile, -} from '../../selectors/url-state'; +import { getInvertCallstack } from '../../selectors/url-state'; +import { getSourceViewFile } from '../../selectors/profile'; import { ensureExists } from '../../utils/types'; import { getEmptyThread, diff --git a/src/test/components/StackChart.test.tsx b/src/test/components/StackChart.test.tsx index 3181a25957..19b0a69a56 100644 --- a/src/test/components/StackChart.test.tsx +++ b/src/test/components/StackChart.test.tsx @@ -12,6 +12,7 @@ import { within, } from 'firefox-profiler/test/fixtures/testing-library'; import * as UrlStateSelectors from '../../selectors/url-state'; +import * as ProfileSelectors from '../../selectors/profile'; // This module is mocked. import copy from 'copy-to-clipboard'; @@ -195,11 +196,12 @@ describe('StackChart', function () { dispatch(changeSelectedCallNode(0, [funcNames.indexOf('A')])); }); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(UrlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); fireFullKeyPress(stackChartCanvas, { key: 'Enter' }); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe( - sourceViewFile - ); + expect( + UrlStateSelectors.getSourceViewSourceIndex(getState()) + ).not.toBeNull(); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe(sourceViewFile); }); it('can display a context menu when right clicking the chart', function () { diff --git a/src/test/store/bottom-box.test.ts b/src/test/store/bottom-box.test.ts index 8612ae79c5..2007e02f84 100644 --- a/src/test/store/bottom-box.test.ts +++ b/src/test/store/bottom-box.test.ts @@ -5,6 +5,7 @@ import { getProfileFromTextSamples } from '../fixtures/profiles/processed-profile'; import { storeWithProfile } from '../fixtures/stores'; import * as UrlStateSelectors from '../../selectors/url-state'; +import * as ProfileSelectors from '../../selectors/profile'; import { selectedThreadSelectors, selectedNodeSelectors, @@ -58,7 +59,6 @@ describe('bottom box', function () { funcNames: funcNamesPerThread[0], funcNamesDict: funcNamesDictPerThread[0], nativeSymbolsDict: nativeSymbolsDictPerThread[0], - sources: profile.shared.sources, }; } @@ -66,7 +66,7 @@ describe('bottom box', function () { const { getState } = setup(); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); expect(UrlStateSelectors.getSelectedTab(getState())).toBe('calltree'); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(UrlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect( UrlStateSelectors.getAssemblyViewNativeSymbol(getState()) @@ -103,7 +103,7 @@ describe('bottom box', function () { // Now the source view should be displayed and the assembly view should be // initialized but closed. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD @@ -127,7 +127,7 @@ describe('bottom box', function () { dispatch(changeSelectedTab('flame-graph')); expect(UrlStateSelectors.getSelectedTab(getState())).toBe('flame-graph'); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD ); @@ -189,7 +189,7 @@ describe('bottom box', function () { // Now the assembly view should be opened because there's no source to display. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(ProfileSelectors.getSourceViewFile(getState())).toBeNull(); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeTrue(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoF @@ -199,7 +199,7 @@ describe('bottom box', function () { // Double-click a node with source information again. The assembly view should remain open. dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfoD)); expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeTrue(); expect(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())).toEqual( nativeSymbolInfoD @@ -243,7 +243,7 @@ describe('bottom box', function () { // initialized but closed. The assembly view should show one of the two // native symbols. expect(UrlStateSelectors.getIsBottomBoxOpen(getState())).toBeTrue(); - expect(UrlStateSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); + expect(ProfileSelectors.getSourceViewFile(getState())).toBe('cde.cpp'); expect(UrlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); expect( ensureExists(UrlStateSelectors.getAssemblyViewNativeSymbol(getState())) diff --git a/src/test/unit/profile-data.test.ts b/src/test/unit/profile-data.test.ts index 96bdf4e86d..1d4a47ec5b 100644 --- a/src/test/unit/profile-data.test.ts +++ b/src/test/unit/profile-data.test.ts @@ -58,6 +58,7 @@ import type { RawThread, RawProfileSharedData, IndexIntoFrameTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; describe('string-table', function () { @@ -1380,9 +1381,20 @@ describe('findAddressProofForFile', function () { webrender::renderer::shade::LazilyCompiledShader::bind[lib:XUL][file:/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs][line:150][address:4a9f89b] `); + const getSourceIndex = (sourceFile: string): IndexIntoSourceTable => { + const stringTable = StringTable.withBackingArray( + profile.shared.stringArray + ); + + const sourceFileIndex = stringTable.indexForString(sourceFile); + return profile.shared.sources.filename.indexOf(sourceFileIndex); + }; + const addressProof1 = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs' + getSourceIndex( + '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs' + ) ); expect(addressProof1).toEqual({ debugName: 'XUL', @@ -1392,7 +1404,9 @@ describe('findAddressProofForFile', function () { const addressProof2 = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs' + getSourceIndex( + '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/shade.rs' + ) ); expect(addressProof2).toEqual({ debugName: 'XUL', @@ -1402,7 +1416,9 @@ describe('findAddressProofForFile', function () { const missingAddressProof = findAddressProofForFile( profile, - '/Users/mstange/code/mozilla/xpcom/threads/nsThreadUtils.cpp' + getSourceIndex( + '/Users/mstange/code/mozilla/xpcom/threads/nsThreadUtils.cpp' + ) ); expect(missingAddressProof).toBeNull(); }); diff --git a/src/test/url-handling.test.ts b/src/test/url-handling.test.ts index f8fffa76af..eb692cfb23 100644 --- a/src/test/url-handling.test.ts +++ b/src/test/url-handling.test.ts @@ -38,6 +38,7 @@ import type { Store, State, ThreadIndex, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import getNiceProfile from './fixtures/profiles/call-nodes'; import queryString from 'query-string'; @@ -54,6 +55,7 @@ import { import { getProfile } from '../selectors/profile'; import { SYMBOL_SERVER_URL } from '../app-logic/constants'; import { getThreadsKey } from '../profile-logic/profile-data'; +import { StringTable } from 'firefox-profiler/utils/string-table'; type StoreUrlSettings = { pathname?: string; @@ -1771,21 +1773,33 @@ describe('symbolServerUrl', function () { describe('URL persistence of bottom box (source view and assembly view)', function () { function setup() { const store = _getStoreWithURL(); - return store; + + const getSourceIndex = (sourceFile: string): IndexIntoSourceTable => { + const profile = getProfile(store.getState()); + const stringTable = StringTable.withBackingArray( + profile.shared.stringArray + ); + + const sourceFileIndex = stringTable.indexForString(sourceFile); + return profile.shared.sources.filename.indexOf(sourceFileIndex); + }; + + return { ...store, getSourceIndex }; } it('persists the source file shown in the source view to the URL', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); // Open the source view for 'xpcom/threads/nsThread.cpp'. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const bottomBoxInfo = { libIndex: 0, - sourceFile, + sourceIndex, nativeSymbols: [], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1794,9 +1808,9 @@ describe('URL persistence of bottom box (source view and assembly view)', functi expect( urlStateSelectors.getIsBottomBoxOpen(newStore.getState()) ).toBeTrue(); - expect(urlStateSelectors.getSourceViewFile(newStore.getState())).toBe( - sourceFile - ); + expect( + urlStateSelectors.getSourceViewSourceIndex(newStore.getState()) + ).toBe(sourceIndex); expect( urlStateSelectors.getAssemblyViewIsOpen(newStore.getState()) ).toBeFalse(); @@ -1806,17 +1820,18 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }); it('keeps a closed bottom box closed, even if a source file was loaded before', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); // Open the source view for 'xpcom/threads/nsThread.cpp'. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const bottomBoxInfo = { libIndex: 0, - sourceFile, + sourceIndex, nativeSymbols: [], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1844,7 +1859,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }; const bottomBoxInfo = { libIndex: 0, - sourceFile: null, + sourceIndex: null, nativeSymbols: [nativeSymbolInfo], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1862,10 +1877,10 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }); it('only opens the assembly view on reload if it was open before', function () { - const { dispatch, getState } = setup(); + const { dispatch, getState, getSourceIndex } = setup(); expect(urlStateSelectors.getSelectedTab(getState())).toBe('calltree'); expect(urlStateSelectors.getIsBottomBoxOpen(getState())).toBeFalse(); - expect(urlStateSelectors.getSourceViewFile(getState())).toBeNull(); + expect(urlStateSelectors.getSourceViewSourceIndex(getState())).toBeNull(); expect(urlStateSelectors.getAssemblyViewIsOpen(getState())).toBeFalse(); // Open the source view for 'xpcom/threads/nsThread.cpp' and initialize the @@ -1876,6 +1891,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi // closed even if we have a native symbol. const sourceFile = 'hg:hg.mozilla.org/mozilla-central:xpcom/threads/nsThread.cpp:5bb3e281dc9ec8a619c781d52882adb1cacf20bb'; + const sourceIndex = getSourceIndex(sourceFile); const nativeSymbolInfo = { libIndex: 0, name: 'MySymbol', @@ -1885,7 +1901,7 @@ describe('URL persistence of bottom box (source view and assembly view)', functi }; const bottomBoxInfo = { libIndex: 0, - sourceFile: sourceFile, + sourceIndex, nativeSymbols: [nativeSymbolInfo], }; dispatch(updateBottomBoxContentsAndMaybeOpen('calltree', bottomBoxInfo)); @@ -1894,9 +1910,9 @@ describe('URL persistence of bottom box (source view and assembly view)', functi expect( urlStateSelectors.getIsBottomBoxOpen(newStore.getState()) ).toBeTrue(); - expect(urlStateSelectors.getSourceViewFile(newStore.getState())).toBe( - sourceFile - ); + expect( + urlStateSelectors.getSourceViewSourceIndex(newStore.getState()) + ).toBe(sourceIndex); // The assembly view should remain closed. expect( urlStateSelectors.getAssemblyViewIsOpen(newStore.getState()) diff --git a/src/types/actions.ts b/src/types/actions.ts index d6b3e19628..9f6768b75d 100644 --- a/src/types/actions.ts +++ b/src/types/actions.ts @@ -12,6 +12,7 @@ import type { IndexIntoCategoryList, IndexIntoLibs, PageList, + IndexIntoSourceTable, } from './profile'; import type { Thread, @@ -336,7 +337,7 @@ type ProfileAction = | { readonly type: 'UPDATE_BOTTOM_BOX'; readonly libIndex: IndexIntoLibs | null; - readonly sourceFile: string | null; + readonly sourceIndex: IndexIntoSourceTable | null; readonly nativeSymbol: NativeSymbolInfo | null; readonly allNativeSymbolsForInitiatingCallNode: NativeSymbolInfo[]; readonly currentTab: TabSlug; @@ -669,21 +670,21 @@ type CurrentProfileUploadedInformationAction = { type SourcesAction = | { readonly type: 'SOURCE_CODE_LOADING_BEGIN_URL'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly url: string; } | { readonly type: 'SOURCE_CODE_LOADING_BEGIN_BROWSER_CONNECTION'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; } | { readonly type: 'SOURCE_CODE_LOADING_SUCCESS'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly code: string; } | { readonly type: 'SOURCE_CODE_LOADING_ERROR'; - readonly file: string; + readonly sourceIndex: IndexIntoSourceTable; readonly errors: SourceCodeLoadingError[]; }; diff --git a/src/types/profile-derived.ts b/src/types/profile-derived.ts index 586733c777..af23ef1028 100644 --- a/src/types/profile-derived.ts +++ b/src/types/profile-derived.ts @@ -33,6 +33,7 @@ import type { IndexIntoFrameTable, IndexIntoSubcategoryListForCategory, SourceTable, + IndexIntoSourceTable, } from './profile'; import type { IndexedArray } from './utils'; import type { BitSet } from '../utils/bitset'; @@ -772,7 +773,7 @@ export type NativeSymbolInfo = { */ export type BottomBoxInfo = { libIndex: IndexIntoLibs | null; - sourceFile: string | null; + sourceIndex: IndexIntoSourceTable | null; nativeSymbols: NativeSymbolInfo[]; }; diff --git a/src/types/state.ts b/src/types/state.ts index 59a388782a..f8839b35d7 100644 --- a/src/types/state.ts +++ b/src/types/state.ts @@ -22,6 +22,7 @@ import type { Pid, TabID, IndexIntoLibs, + IndexIntoSourceTable, } from './profile'; import type { @@ -243,9 +244,9 @@ export type SourceViewState = { // for example if the source view was opened via the URL (the source URL param // currently discards the libIndex). libIndex: IndexIntoLibs | null; - // The path to the source file. Null if a function without a file path was - // double clicked. - sourceFile: string | null; + // Index into source table. Contains information (filename and uuid) about the + // source. Null if a function without a file path was double clicked. + sourceIndex: IndexIntoSourceTable | null; }; export type AssemblyViewState = { @@ -384,7 +385,7 @@ export type PseudoStrategy = null | 'bidi' | 'accented'; export type IconsWithClassNames = Map; export type CodeState = { - readonly sourceCodeCache: Map; + readonly sourceCodeCache: Map; readonly assemblyCodeCache: Map; }; From 0d758c17cdc32b4eddf06f3c8a94fe1170582c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 11:34:45 +0200 Subject: [PATCH 12/22] Add a url upgrader for the changed sourceView query parameter --- src/app-logic/url-handling.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/app-logic/url-handling.ts b/src/app-logic/url-handling.ts index 7c481b3dee..60267bbc77 100644 --- a/src/app-logic/url-handling.ts +++ b/src/app-logic/url-handling.ts @@ -47,8 +47,9 @@ import { encodeUintSetForUrlComponent, } from '../utils/uintarray-encoding'; import { tabSlugs } from '../app-logic/tabs-handling'; +import { StringTable } from 'firefox-profiler/utils/string-table'; -export const CURRENT_URL_VERSION = 11; +export const CURRENT_URL_VERSION = 12; /** * This static piece of state might look like an anti-pattern, but it's a relatively @@ -1162,6 +1163,35 @@ const _upgraders: { processedLocation.query = {}; } }, + [12]: ( + processedLocation: ProcessedLocationBeforeUpgrade, + profile?: Profile + ) => { + // This version changes the source view parameter from 'sourceView' (filename + // string) to 'sourceViewIndex' (IndexIntoSourceTable). If we can't convert + // the filename to a source index, we just remove the sourceView parameter. + const { query } = processedLocation; + if (!('sourceView' in query) || !profile || !profile.shared.sources) { + return; + } + + // Try to find the source index for the given filename + const filename = query.sourceView; + const { sources, stringArray } = profile.shared; + const stringTable = StringTable.withBackingArray(stringArray); + + // Find the filename string index + const filenameStringIndex = stringTable.indexForString(filename); + if (filenameStringIndex !== -1) { + // Find the source index with this filename + const sourceIndex = sources.filename.indexOf(filenameStringIndex); + if (sourceIndex !== -1) { + query.sourceViewIndex = sourceIndex; + } + } + // Remove the old sourceView parameter regardless of whether we found a match + delete query.sourceView; + }, }; for (let destVersion = 1; destVersion <= CURRENT_URL_VERSION; destVersion++) { From f455e830ceb9a376bf458197c3c096e2b22a40b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 14:49:00 +0200 Subject: [PATCH 13/22] Simplify the getStackLineInfo code by passing sourceIndex instead of filename Now that we changed the place where we send information to this place, we can simplify it. --- src/profile-logic/line-timings.ts | 12 ++++-------- src/selectors/per-thread/stack-sample.ts | 18 +++++------------ src/test/store/transforms.test.ts | 25 ++++++++++++------------ src/test/unit/line-timings.test.ts | 20 +++++++++---------- 4 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/profile-logic/line-timings.ts b/src/profile-logic/line-timings.ts index b29617de75..b806654c24 100644 --- a/src/profile-logic/line-timings.ts +++ b/src/profile-logic/line-timings.ts @@ -8,11 +8,10 @@ import type { StackTable, SamplesLikeTable, IndexIntoCallNodeTable, - IndexIntoStringTable, StackLineInfo, LineTimings, LineNumber, - SourceTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import { getMatchingAncestorStackForInvertedCallNode } from './profile-data'; @@ -59,8 +58,7 @@ export function getStackLineInfo( stackTable: StackTable, frameTable: FrameTable, funcTable: FuncTable, - fileNameStringIndex: IndexIntoStringTable, - sources: SourceTable + sourceViewSourceIndex: IndexIntoSourceTable ): StackLineInfo { // "self line" == "the line which a stack's self time is contributed to" const selfLineForAllStacks = []; @@ -76,15 +74,13 @@ export function getStackLineInfo( const frame = stackTable.frame[stackIndex]; const prefixStack = stackTable.prefix[stackIndex]; const func = frameTable.func[frame]; - const sourceIndex = funcTable.source[func]; - const fileNameStringIndexOfThisStack = - sourceIndex !== null ? (sources.filename[sourceIndex] ?? null) : null; + const sourceIndexOfThisStack = funcTable.source[func]; let selfLine: LineNumber | null = null; let totalLines: Set | null = prefixStack !== null ? totalLinesForAllStacks[prefixStack] : null; - if (fileNameStringIndexOfThisStack === fileNameStringIndex) { + if (sourceIndexOfThisStack === sourceViewSourceIndex) { selfLine = frameTable.line[frame]; if (selfLine !== null) { // Add this stack's line to this stack's totalLines. The rest of this stack's diff --git a/src/selectors/per-thread/stack-sample.ts b/src/selectors/per-thread/stack-sample.ts index 20408e51e0..5b8b44b079 100644 --- a/src/selectors/per-thread/stack-sample.ts +++ b/src/selectors/per-thread/stack-sample.ts @@ -140,23 +140,15 @@ export function getStackAndSampleSelectorsPerThread( const getSourceViewStackLineInfo: Selector = createSelector( threadSelectors.getFilteredThread, - ProfileSelectors.getSourceViewFile, - ProfileSelectors.getSourceTable, + UrlState.getSourceViewSourceIndex, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile, - sources + { stackTable, frameTable, funcTable }: Thread, + sourceIndex ): StackLineInfo | null => { - if (sourceViewFile === null) { + if (sourceIndex === null) { return null; } - return getStackLineInfo( - stackTable, - frameTable, - funcTable, - stringTable.indexForString(sourceViewFile), - sources - ); + return getStackLineInfo(stackTable, frameTable, funcTable, sourceIndex); } ); diff --git a/src/test/store/transforms.test.ts b/src/test/store/transforms.test.ts index 42287d224c..c646b311ec 100644 --- a/src/test/store/transforms.test.ts +++ b/src/test/store/transforms.test.ts @@ -26,7 +26,6 @@ import { changeCallTreeSummaryStrategy, } from '../../actions/profile-view'; import { selectedThreadSelectors } from '../../selectors/per-thread'; -import * as ProfileSelectors from '../../selectors/profile'; describe('"focus-subtree" transform', function () { describe('on a call tree', function () { @@ -1224,13 +1223,13 @@ describe('"collapse-direct-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); - const sources = ProfileSelectors.getSourceTable(getState()); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex, - sources + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1408,13 +1407,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); - const sources = ProfileSelectors.getSourceTable(getState()); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex, - sources + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1521,13 +1520,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); - const sources = ProfileSelectors.getSourceTable(getState()); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex, - sources + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1657,13 +1656,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); - const sources = ProfileSelectors.getSourceTable(getState()); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex, - sources + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); diff --git a/src/test/unit/line-timings.test.ts b/src/test/unit/line-timings.test.ts index 0814474d9a..e6d096ea77 100644 --- a/src/test/unit/line-timings.test.ts +++ b/src/test/unit/line-timings.test.ts @@ -17,7 +17,6 @@ import type { CallNodePath, Thread, IndexIntoCategoryList, - SourceTable, } from 'firefox-profiler/types'; describe('getStackLineInfo', function () { @@ -31,13 +30,14 @@ describe('getStackLineInfo', function () { const [thread] = derivedThreads; const { stackTable, frameTable, funcTable, stringTable } = thread; - const fileOne = stringTable.indexForString('one.js'); + const fileOneStringIndex = stringTable.indexForString('one.js'); + const fileOneSourceIndex = + thread.sources.filename.indexOf(fileOneStringIndex); const stackLineInfoOne = getStackLineInfo( stackTable, frameTable, funcTable, - fileOne, - profile.shared.sources + fileOneSourceIndex ); // Expect the returned arrays to have the same length as the stackTable. @@ -48,15 +48,15 @@ describe('getStackLineInfo', function () { }); describe('getLineTimings for getStackLineInfo', function () { - function getTimings(thread: Thread, file: string, sources: SourceTable) { + function getTimings(thread: Thread, file: string) { const { stackTable, frameTable, funcTable, samples, stringTable } = thread; const fileStringIndex = stringTable.indexForString(file); + const fileSourceIndex = thread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex, - sources + fileSourceIndex ); return getLineTimings(stackLineInfo, samples); } @@ -69,7 +69,7 @@ describe('getLineTimings for getStackLineInfo', function () { B[file:file.js][line:30] `); const [thread] = derivedThreads; - const lineTimings = getTimings(thread, 'file.js', profile.shared.sources); + const lineTimings = getTimings(thread, 'file.js'); expect(lineTimings.totalLineHits.get(20)).toBe(1); expect(lineTimings.totalLineHits.get(30)).toBe(1); expect(lineTimings.totalLineHits.size).toBe(2); // no other hits @@ -87,7 +87,7 @@ describe('getLineTimings for getStackLineInfo', function () { `); const [thread] = derivedThreads; - const lineTimingsOne = getTimings(thread, 'one.js', profile.shared.sources); + const lineTimingsOne = getTimings(thread, 'one.js'); expect(lineTimingsOne.totalLineHits.get(20)).toBe(2); expect(lineTimingsOne.totalLineHits.get(21)).toBe(1); // one.js line 30 was hit in every sample, twice in the first sample @@ -101,7 +101,7 @@ describe('getLineTimings for getStackLineInfo', function () { expect(lineTimingsOne.selfLineHits.get(30)).toBe(1); expect(lineTimingsOne.selfLineHits.size).toBe(1); // no other hits - const lineTimingsTwo = getTimings(thread, 'two.js', profile.shared.sources); + const lineTimingsTwo = getTimings(thread, 'two.js'); expect(lineTimingsTwo.totalLineHits.get(10)).toBe(1); expect(lineTimingsTwo.totalLineHits.get(11)).toBe(1); expect(lineTimingsTwo.totalLineHits.get(40)).toBe(1); From 0f897f04bc2cc39a7450b795b9c758f443a3776c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 12:07:43 +0200 Subject: [PATCH 14/22] Add tests for the source code cache --- src/test/unit/source-code-cache.test.ts | 214 ++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 src/test/unit/source-code-cache.test.ts diff --git a/src/test/unit/source-code-cache.test.ts b/src/test/unit/source-code-cache.test.ts new file mode 100644 index 0000000000..ccfb86082a --- /dev/null +++ b/src/test/unit/source-code-cache.test.ts @@ -0,0 +1,214 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { getSourceViewCode, getSourceCodeCache } from '../../selectors/code'; +import { storeWithProfile } from '../fixtures/stores'; +import { updateUrlState } from '../../actions/app'; +import { stateFromLocation } from '../../app-logic/url-handling'; + +import type { + State, + Store, + SourceCodeStatus, + IndexIntoSourceTable, +} from 'firefox-profiler/types'; + +describe('source code cache with IndexIntoSourceTable', function () { + function setupStoreWithSourceIndex(sourceIndex: IndexIntoSourceTable | null) { + const store = storeWithProfile(); + if (sourceIndex !== null) { + const urlState = stateFromLocation({ + pathname: '/public/fakehash/', + search: `?sourceViewIndex=${sourceIndex}`, + hash: '', + }); + store.dispatch(updateUrlState(urlState)); + } + return store; + } + + function createStateWithMockCache( + store: Store, + mockCache: Map + ): State { + return { + ...store.getState(), + code: { + ...store.getState().code, + sourceCodeCache: mockCache, + }, + }; + } + + function createMockCache(): Map { + const cache = new Map(); + cache.set(0, { + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + cache.set(1, { + type: 'AVAILABLE', + code: 'function source1() { return "hello"; }', + }); + cache.set(2, { + type: 'LOADING', + source: { type: 'URL', url: 'https://example.com/source2.js' }, + }); + cache.set(3, { + type: 'ERROR', + errors: [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ], + }); + return cache; + } + + it('returns undefined when no source code is cached', function () { + const store = setupStoreWithSourceIndex(0); + const sourceViewCode = getSourceViewCode(store.getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is null', function () { + const store = setupStoreWithSourceIndex(null); + const sourceViewCode = getSourceViewCode(store.getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is not in cache', function () { + const store = setupStoreWithSourceIndex(999); // sourceIndex not in cache + const cache = createMockCache(); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toBeUndefined(); + }); + + it('retrieves cached source code for AVAILABLE status', function () { + const store = setupStoreWithSourceIndex(0); + const cache = createMockCache(); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('retrieves cached source code for LOADING status with URL', function () { + const store = setupStoreWithSourceIndex(2); + const cache = createMockCache(); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'URL', url: 'https://example.com/source2.js' }, + }); + }); + + it('retrieves cached source code for ERROR status', function () { + const store = setupStoreWithSourceIndex(3); + const cache = createMockCache(); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toEqual({ + type: 'ERROR', + errors: [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ], + }); + }); + + it('retrieves cached source code for LOADING status with BROWSER_CONNECTION', function () { + const store = setupStoreWithSourceIndex(4); + const cache = new Map(); + cache.set(4, { + type: 'LOADING', + source: { type: 'BROWSER_CONNECTION' }, + }); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'BROWSER_CONNECTION' }, + }); + }); + + describe('getSourceCodeCache selector', function () { + it('returns the cache Map directly', function () { + const store = setupStoreWithSourceIndex(null); + const cache = createMockCache(); + const state = createStateWithMockCache(store, cache); + + const result = getSourceCodeCache(state); + expect(result).toBe(cache); + expect(result.get(0)).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('returns empty Map when no cache is set', function () { + const store = setupStoreWithSourceIndex(null); + const state = store.getState(); + + const result = getSourceCodeCache(state); + expect(result).toBeInstanceOf(Map); + expect(result.size).toBe(0); + }); + }); + + describe('edge cases', function () { + it('handles different SourceCodeStatus types correctly', function () { + const cache = createMockCache(); + + // Test each type of status + expect(cache.get(0)?.type).toBe('AVAILABLE'); + expect(cache.get(2)?.type).toBe('LOADING'); + expect(cache.get(3)?.type).toBe('ERROR'); + }); + + it('handles multiple error types', function () { + const store = setupStoreWithSourceIndex(5); + const cache = new Map(); + cache.set(5, { + type: 'ERROR', + errors: [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source.js', + networkErrorMessage: 'Network failed', + }, + { type: 'NO_KNOWN_CORS_URL' }, + ], + }); + const state = createStateWithMockCache(store, cache); + + const sourceViewCode = getSourceViewCode(state); + expect(sourceViewCode).toEqual({ + type: 'ERROR', + errors: [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source.js', + networkErrorMessage: 'Network failed', + }, + { type: 'NO_KNOWN_CORS_URL' }, + ], + }); + }); + }); +}); From 372110418cc9d538e45103b6667473154917331e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 00:32:06 +0200 Subject: [PATCH 15/22] Pass sourceUuid through the source fetching pipeline --- src/components/app/SourceCodeFetcher.tsx | 5 +++++ src/test/unit/fetch-source.test.ts | 13 +++++++++++++ src/utils/fetch-source.ts | 3 +++ 3 files changed, 21 insertions(+) diff --git a/src/components/app/SourceCodeFetcher.tsx b/src/components/app/SourceCodeFetcher.tsx index bc2284c4d8..0800b3f81d 100644 --- a/src/components/app/SourceCodeFetcher.tsx +++ b/src/components/app/SourceCodeFetcher.tsx @@ -11,6 +11,7 @@ import { getSymbolServerUrl, getSourceViewFile, getSourceViewSourceIndex, + getSourceViewSourceUuid, } from 'firefox-profiler/selectors'; import { beginLoadingSourceCodeFromUrl, @@ -35,6 +36,7 @@ import type { type StateProps = { readonly sourceViewFile: string | null; readonly sourceViewSourceIndex: IndexIntoSourceTable | null; + readonly sourceViewSourceUuid: string | null; readonly sourceViewCode: SourceCodeStatus | void; readonly symbolServerUrl: string; readonly profile: Profile | null; @@ -66,6 +68,7 @@ class SourceCodeFetcherImpl extends React.PureComponent { sourceViewSourceIndex, sourceViewCode, sourceViewFile, + sourceViewSourceUuid, beginLoadingSourceCodeFromUrl, beginLoadingSourceCodeFromBrowserConnection, finishLoadingSourceCode, @@ -102,6 +105,7 @@ class SourceCodeFetcherImpl extends React.PureComponent { const fetchSourceResult = await fetchSource( sourceViewFile, + sourceViewSourceUuid, symbolServerUrl, addressProof, this._archiveCache, @@ -133,6 +137,7 @@ export const SourceCodeFetcher = explicitConnect<{}, StateProps, DispatchProps>( mapStateToProps: (state) => ({ sourceViewSourceIndex: getSourceViewSourceIndex(state), sourceViewFile: getSourceViewFile(state), + sourceViewSourceUuid: getSourceViewSourceUuid(state), sourceViewCode: getSourceViewCode(state), symbolServerUrl: getSymbolServerUrl(state), profile: getProfileOrNull(state), diff --git a/src/test/unit/fetch-source.test.ts b/src/test/unit/fetch-source.test.ts index 552737cfc8..da8207a595 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -9,6 +9,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -72,6 +73,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/lib.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, @@ -90,6 +92,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/function.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, @@ -106,6 +109,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/nonexist.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, @@ -129,6 +133,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -161,6 +166,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', @@ -199,6 +205,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'http://127.0.0.1:3000', { debugName: 'FAKE_DEBUGNAME', @@ -249,6 +256,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3001', { debugName: 'FAKE_DEBUGNAME', @@ -299,6 +307,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3002', { debugName: 'FAKE_DEBUGNAME', @@ -347,6 +356,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:github.com/rust-lang/rust:library/core/src/intrinsics.rs:acbe4443cc4c9695c0b74a7b64b60333c990a400', + null, 'http://127.0.0.1:3003', { debugName: 'FAKE_DEBUGNAME', @@ -391,6 +401,7 @@ describe('fetchSource', function () { expect( await fetchSource( 'git:git.iximeow.net/yaxpeax-arm:src/armv8/a64.rs:0663147eacdef847cc1bdc07cf89eed14b1aeaca', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -416,6 +427,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', @@ -456,6 +468,7 @@ describe('fetchSource', function () { expect( await fetchSource( '/Users/mstange/code/mozilla/gfx/wr/webrender/src/renderer/mod.rs', + null, 'https://symbolication.services.mozilla.com', { debugName: 'FAKE_DEBUGNAME', diff --git a/src/utils/fetch-source.ts b/src/utils/fetch-source.ts index b771ce9086..41c378b54c 100644 --- a/src/utils/fetch-source.ts +++ b/src/utils/fetch-source.ts @@ -28,6 +28,8 @@ export type FetchSourceResult = * then this will call `callbacks.fetchUrlResponse("https://hg.mozilla.org/mozilla-central/raw-file/997f00815e6bc28806b75448c8829f0259d2cb28/widget/cocoa/nsAppShell.mm")`. * * @param file - The path of the file that should be fetched + * @param sourceUUid - The optional UUID of the JS source file that should be + * fetched. It's null for non-JS files. * @param symbolServerUrl - The symbol server URL, used for getting source code * from local servers via the symbolication API /source/v1. * @param addressProof - An "address proof" for the requested file, if known. Otherwise null. @@ -37,6 +39,7 @@ export type FetchSourceResult = */ export async function fetchSource( file: string, + _sourceUuid: string | null, symbolServerUrl: string, addressProof: AddressProof | null, archiveCache: Map>, From 1237329720191b45283d0ca9b280633f2db70525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 18 Sep 2025 00:33:15 +0200 Subject: [PATCH 16/22] Add WebChannel API for JS source code fetching Implement browser communication to fetch JS source code using GlobalJSSourceId. This enables the profiler to retrieve original source content directly from the browser's JavaScript engine. Backend bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1916785 --- src/app-logic/browser-connection.ts | 25 +++++++++++++++++++++++++ src/app-logic/web-channel.ts | 25 ++++++++++++++++++++++++- src/test/unit/query-api.test.ts | 1 + 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/app-logic/browser-connection.ts b/src/app-logic/browser-connection.ts index 446d79b140..e9801c3dc7 100644 --- a/src/app-logic/browser-connection.ts +++ b/src/app-logic/browser-connection.ts @@ -12,6 +12,7 @@ import { querySymbolicationApiViaWebChannel, getPageFaviconsViaWebChannel, showFunctionInDevtoolsViaWebChannel, + getJSSourcesViaWebChannel, } from './web-channel'; import type { Milliseconds, @@ -83,6 +84,8 @@ export interface BrowserConnection { line: number | null, column: number | null ): Promise; + + getJSSource(sourceUuid: string): Promise; } /** @@ -98,6 +101,7 @@ class BrowserConnectionImpl implements BrowserConnection { _webChannelSupportsGetExternalMarkers: boolean; _webChannelSupportsGetPageFavicons: boolean; _webChannelSupportsOpenDebuggerInTab: boolean; + _webChannelSupportsGetJSSource: boolean; _geckoProfiler: $GeckoProfiler | undefined; constructor(webChannelVersion: number) { @@ -106,6 +110,7 @@ class BrowserConnectionImpl implements BrowserConnection { this._webChannelSupportsGetExternalMarkers = webChannelVersion >= 3; this._webChannelSupportsGetPageFavicons = webChannelVersion >= 4; this._webChannelSupportsOpenDebuggerInTab = webChannelVersion >= 5; + this._webChannelSupportsGetJSSource = webChannelVersion >= 6; } // Only called when we must obtain the profile from the browser, i.e. if we @@ -226,6 +231,26 @@ class BrowserConnectionImpl implements BrowserConnection { return []; } + + /** + * Fetches JavaScript source code from the browser using the source UUID. + * This method requires WebChannel version 6 or higher (Firefox 145+). + */ + async getJSSource(sourceUuid: string): Promise { + if (!this._webChannelSupportsGetJSSource) { + throw new Error( + "Can't use getJSSource in Firefox versions with the old WebChannel." + ); + } + + // Even though the WebChannel request for fetching JS sources supports + // fetching multiple sources, we only fetch one at a time currently. + // TODO: Change this to fetch multiple JS sources at the load time or while + // we share the profile. + return getJSSourcesViaWebChannel([sourceUuid]).then( + (sources) => sources[0] + ); + } } // Should work with: diff --git a/src/app-logic/web-channel.ts b/src/app-logic/web-channel.ts index 2dbe25fbf0..7ac33344b8 100644 --- a/src/app-logic/web-channel.ts +++ b/src/app-logic/web-channel.ts @@ -28,7 +28,8 @@ export type Request = | GetSymbolTableRequest | QuerySymbolicationApiRequest | GetPageFaviconsRequest - | OpenScriptInTabDebuggerRequest; + | OpenScriptInTabDebuggerRequest + | GetJSSourcesRequest; type StatusQueryRequest = { type: 'STATUS_QUERY' }; type EnableMenuButtonRequest = { type: 'ENABLE_MENU_BUTTON' }; @@ -64,6 +65,10 @@ type OpenScriptInTabDebuggerRequest = { line: number | null; column: number | null; }; +type GetJSSourcesRequest = { + type: 'GET_JS_SOURCES'; + sourceUuids: Array; +}; export type MessageFromBrowser = | OutOfBandErrorMessageFromBrowser @@ -128,6 +133,10 @@ type StatusQueryResponse = { // Shipped in Firefox 136. // Adds support for showing the JS script in DevTools debugger. // - OPEN_SCRIPT_IN_DEBUGGER + // Version 6: + // Shipped in Firefox 145. + // Adds support for fetching JS sources. + // - GET_JS_SOURCES version?: number; }; type EnableMenuButtonResponse = void; @@ -138,6 +147,7 @@ type GetSymbolTableResponse = SymbolTableAsTuple; type QuerySymbolicationApiResponse = string; type GetPageFaviconsResponse = Array; type OpenScriptInTabDebuggerResponse = void; +type GetJSSourcesResponse = Array; // TypeScript function overloads for request/response pairs. function _sendMessageWithResponse( @@ -167,6 +177,10 @@ function _sendMessageWithResponse( function _sendMessageWithResponse( request: OpenScriptInTabDebuggerRequest ): Promise; +function _sendMessageWithResponse( + request: GetJSSourcesRequest +): Promise; + function _sendMessageWithResponse(request: Request): Promise { const requestId = _requestId++; const type = request.type; @@ -371,6 +385,15 @@ export async function showFunctionInDevtoolsViaWebChannel( }); } +export async function getJSSourcesViaWebChannel( + sourceUuids: Array +): Promise> { + return _sendMessageWithResponse({ + type: 'GET_JS_SOURCES', + sourceUuids, + }); +} + /** * ----------------------------------------------------------------------------- * diff --git a/src/test/unit/query-api.test.ts b/src/test/unit/query-api.test.ts index 8bc98d07cc..f6f73c6e00 100644 --- a/src/test/unit/query-api.test.ts +++ b/src/test/unit/query-api.test.ts @@ -271,6 +271,7 @@ describe('RegularExternalCommunicationDelegate', function () { getSymbolTable: jest.fn(bcOverrides.getSymbolTable), getPageFavicons: jest.fn(bcOverrides.getPageFavicons), showFunctionInDevtools: jest.fn(bcOverrides.showFunctionInDevtools), + getJSSource: jest.fn(bcOverrides.getJSSource), } : null; From a705106a4d0d7fdf65ed5ab46ebca6c26fee7086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Sat, 28 Jun 2025 18:56:46 +0200 Subject: [PATCH 17/22] Fetch the JS source from the browser --- locales/en-US/app.ftl | 8 ++++ src/components/app/CodeErrorOverlay.tsx | 11 ++++++ src/test/unit/fetch-assembly.test.ts | 15 ++++++++ src/test/unit/fetch-source.test.ts | 51 +++++++++++++++++++++++-- src/test/unit/query-api.test.ts | 6 +++ src/types/state.ts | 5 +++ src/utils/fetch-source.ts | 27 ++++++++++++- src/utils/query-api.ts | 11 ++++++ 8 files changed, 130 insertions(+), 4 deletions(-) diff --git a/locales/en-US/app.ftl b/locales/en-US/app.ftl index 748963e31f..a136ef08a9 100644 --- a/locales/en-US/app.ftl +++ b/locales/en-US/app.ftl @@ -1243,6 +1243,14 @@ SourceView--not-in-archive-error-when-obtaining-source = SourceView--archive-parsing-error-when-obtaining-source = The archive at { $url } could not be parsed: { $parsingErrorMessage } +# Displayed below SourceView--cannot-obtain-source, if a JS file could not be found in +# the browser. +# Variables: +# $url (String) - The URL of the JS source file. +# $sourceUuid (number) - The UUID of the JS source file. +SourceView--not-in-browser-error-when-obtaining-js-source = + The browser was unable to obtain the source file for { $url } with sourceUuid { $sourceUuid }. + ## Toggle buttons in the top right corner of the bottom box # The toggle button for the assembly view, while the assembly view is hidden. diff --git a/src/components/app/CodeErrorOverlay.tsx b/src/components/app/CodeErrorOverlay.tsx index d3e113bd65..8e5b174d3a 100644 --- a/src/components/app/CodeErrorOverlay.tsx +++ b/src/components/app/CodeErrorOverlay.tsx @@ -112,6 +112,17 @@ export function CodeErrorOverlay({ errors }: CodeErrorOverlayProps) { ); } + case 'NOT_PRESENT_IN_BROWSER': { + const { sourceUuid, url } = error; + return ( + +
  • {`The browser was unable to obtain the source file for ${url} with sourceUuid ${sourceUuid}`}
  • +
    + ); + } default: throw assertExhaustiveCheck(error); } diff --git a/src/test/unit/fetch-assembly.test.ts b/src/test/unit/fetch-assembly.test.ts index f106f21f68..a03404d8b0 100644 --- a/src/test/unit/fetch-assembly.test.ts +++ b/src/test/unit/fetch-assembly.test.ts @@ -74,6 +74,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, }) ).toEqual({ type: 'SUCCESS', @@ -145,6 +148,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type @@ -175,6 +181,9 @@ describe('fetchAssembly', function () { } return exampleResponse; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type @@ -193,6 +202,9 @@ describe('fetchAssembly', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, }) ).toEqual({ type: 'ERROR', @@ -231,6 +243,9 @@ describe('fetchAssembly', function () { ) => { return exampleResponse; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).type diff --git a/src/test/unit/fetch-source.test.ts b/src/test/unit/fetch-source.test.ts index da8207a595..53597284ae 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -26,6 +26,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -67,6 +70,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }; + const fetchJSSourceFromBrowser = async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }; const archiveCache = new Map>(); @@ -77,7 +83,11 @@ describe('fetchSource', function () { 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -96,7 +106,11 @@ describe('fetchSource', function () { 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -113,7 +127,11 @@ describe('fetchSource', function () { 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'ERROR', @@ -148,6 +166,9 @@ describe('fetchSource', function () { // Shouldn't be called anyway because we're not providing an AddressProof. throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -192,6 +213,9 @@ describe('fetchSource', function () { source: `Fake source from browser symbolication API, for request JSON ${requestJson}`, }); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -243,6 +267,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -294,6 +321,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -343,6 +373,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -374,6 +407,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -415,6 +451,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -448,6 +487,9 @@ describe('fetchSource', function () { } return '[Invalid \\ JSON}'; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -494,6 +536,9 @@ describe('fetchSource', function () { hahaYouThoughtThereWouldBeSourceHereButNo: 42, }); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ diff --git a/src/test/unit/query-api.test.ts b/src/test/unit/query-api.test.ts index f6f73c6e00..f760d7bc35 100644 --- a/src/test/unit/query-api.test.ts +++ b/src/test/unit/query-api.test.ts @@ -29,6 +29,12 @@ describe('queryApiWithFallback', function () { throw new Error('Not implemented'); }) ), + fetchJSSourceFromBrowser: jest.fn( + overrides.fetchJSSourceFromBrowser ?? + (async () => { + throw new Error('Not implemented'); + }) + ), }; } diff --git a/src/types/state.ts b/src/types/state.ts index f8839b35d7..cd7a6e1cad 100644 --- a/src/types/state.ts +++ b/src/types/state.ts @@ -330,6 +330,11 @@ export type SourceCodeLoadingError = type: 'ARCHIVE_PARSING_ERROR'; url: string; parsingErrorMessage: string; + } + | { + type: 'NOT_PRESENT_IN_BROWSER'; + sourceUuid: string; + url: string; }; export type ProfileSpecificUrlState = { diff --git a/src/utils/fetch-source.ts b/src/utils/fetch-source.ts index 41c378b54c..b91c038138 100644 --- a/src/utils/fetch-source.ts +++ b/src/utils/fetch-source.ts @@ -39,7 +39,7 @@ export type FetchSourceResult = */ export async function fetchSource( file: string, - _sourceUuid: string | null, + sourceUuid: string | null, symbolServerUrl: string, addressProof: AddressProof | null, archiveCache: Map>, @@ -88,6 +88,31 @@ export async function fetchSource( } } + // Try to obtain the source by downloading a file from the browser if it's a + // JS source. + if (sourceUuid !== null) { + try { + const response = await delegate.fetchJSSourceFromBrowser(sourceUuid); + if (response) { + return { + type: 'SUCCESS', + source: response, + }; + } + + errors.push({ + type: 'NOT_PRESENT_IN_BROWSER', + sourceUuid, + url: file, + }); + } catch (e) { + errors.push({ + type: 'BROWSER_API_ERROR', + apiErrorMessage: e.message, + }); + } + } + // Try to obtain the source by downloading a file from the web. const parsedName = parseFileNameFromSymbolication(file); diff --git a/src/utils/query-api.ts b/src/utils/query-api.ts index ac5798b519..ad0e5d993d 100644 --- a/src/utils/query-api.ts +++ b/src/utils/query-api.ts @@ -23,6 +23,8 @@ export interface ExternalCommunicationDelegate { path: string, requestJson: string ): Promise; + + fetchJSSourceFromBrowser(source: string): Promise; } export type ApiQueryResult = @@ -160,4 +162,13 @@ export class RegularExternalCommunicationDelegate this._callbacks.onBeginBrowserConnectionQuery(); return browserConnection.querySymbolicationApi(path, requestJson); } + + fetchJSSourceFromBrowser(source: string): Promise { + const browserConnection = this._browserConnection; + if (browserConnection === null) { + throw new Error('No connection to the browser.'); + } + this._callbacks.onBeginBrowserConnectionQuery(); + return browserConnection.getJSSource(source); + } } From 059ccc24998feda31b1ba2f8f1010e699b904381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Thu, 3 Jul 2025 13:43:28 +0200 Subject: [PATCH 18/22] Add tests for JavaScript source fetching --- src/test/unit/fetch-source.test.ts | 107 +++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/src/test/unit/fetch-source.test.ts b/src/test/unit/fetch-source.test.ts index 53597284ae..324deaacc8 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -4,6 +4,8 @@ import { fetchSource } from 'firefox-profiler/utils/fetch-source'; +const TEST_SOURCE_UUID = 'ff6d24c3-b8f5-45cd-a7d3-b643b3292e41'; + describe('fetchSource', function () { it('fetches single files', async function () { expect( @@ -554,4 +556,109 @@ describe('fetchSource', function () { ], }); }); + + it('fetches JS source from browser with sourceUuid', async function () { + expect( + await fetchSource( + '/path/to/script.js', + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (_url: string, _postData?: string) => { + throw new Error('Should not fetch from URL'); + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('Should not query TEST_SOURCE_UUID API'); + }, + fetchJSSourceFromBrowser: async (sourceUuid: string) => { + if (sourceUuid === TEST_SOURCE_UUID) { + return `console.log("Hello from browser with sourceUuid ${sourceUuid}");`; + } + throw new Error(`Unexpected source: ${sourceUuid}`); + }, + } + ) + ).toEqual({ + type: 'SUCCESS', + source: `console.log("Hello from browser with sourceUuid ${TEST_SOURCE_UUID}");`, + }); + }); + + it('handles fetch JS source from browser with invalid sourceUuid', async function () { + expect( + await fetchSource( + '/path/to/script.js', + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (_url: string, _postData?: string) => { + throw new Error('Should not fetch from URL'); + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('Should not query symbolication API'); + }, + fetchJSSourceFromBrowser: async (sourceUuid: string) => { + throw new Error( + `Source not found for source with ID: ${sourceUuid}` + ); + }, + } + ) + ).toEqual({ + type: 'ERROR', + errors: [ + { + type: 'BROWSER_API_ERROR', + apiErrorMessage: `Source not found for source with ID: ${TEST_SOURCE_UUID}`, + }, + { + type: 'NO_KNOWN_CORS_URL', + }, + ], + }); + }); + + it('falls back to other methods when fetchJSSourceFromBrowser fails', async function () { + expect( + await fetchSource( + 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + // Should still try browser first but fall back to URL fetch + TEST_SOURCE_UUID, + 'https://symbolication.services.mozilla.com', + null, + new Map(), + { + fetchUrlResponse: async (url: string, _postData?: string) => { + const r = new Response(`Fallback response from ${url}`, { + status: 200, + }); + return r; + }, + queryBrowserSymbolicationApi: async ( + _path: string, + _requestJson: string + ) => { + throw new Error('No browser connection'); + }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('Source not found in browser'); + }, + } + ) + ).toEqual({ + type: 'SUCCESS', + source: + 'Fallback response from https://hg.mozilla.org/mozilla-central/raw-file/997f00815e6bc28806b75448c8829f0259d2cb28/widget/cocoa/nsAppShell.mm', + }); + }); }); From 06d187d13edab466a621d910d5a1d028d5399d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 22 Sep 2025 14:31:11 +0200 Subject: [PATCH 19/22] Change the response type of GET_JS_SOURCE and print the error to the user properly This commit changes the response type to a object, so it will be easier to expand later for the sourcemap support. --- locales/en-US/app.ftl | 3 ++- src/app-logic/browser-connection.ts | 15 ++++++++++----- src/app-logic/web-channel.ts | 5 +++-- src/components/app/CodeErrorOverlay.tsx | 6 +++--- src/test/unit/fetch-source.test.ts | 6 ++++-- src/types/state.ts | 1 + src/utils/fetch-source.ts | 8 ++------ src/utils/query-api.ts | 4 ++-- 8 files changed, 27 insertions(+), 21 deletions(-) diff --git a/locales/en-US/app.ftl b/locales/en-US/app.ftl index a136ef08a9..366729e740 100644 --- a/locales/en-US/app.ftl +++ b/locales/en-US/app.ftl @@ -1248,8 +1248,9 @@ SourceView--archive-parsing-error-when-obtaining-source = # Variables: # $url (String) - The URL of the JS source file. # $sourceUuid (number) - The UUID of the JS source file. +# $errorMessage (String) - The raw internal error message, not localized SourceView--not-in-browser-error-when-obtaining-js-source = - The browser was unable to obtain the source file for { $url } with sourceUuid { $sourceUuid }. + The browser was unable to obtain the source file for { $url } with sourceUuid { $sourceUuid }: { $errorMessage }. ## Toggle buttons in the top right corner of the bottom box diff --git a/src/app-logic/browser-connection.ts b/src/app-logic/browser-connection.ts index e9801c3dc7..8a40db9c14 100644 --- a/src/app-logic/browser-connection.ts +++ b/src/app-logic/browser-connection.ts @@ -85,7 +85,7 @@ export interface BrowserConnection { column: number | null ): Promise; - getJSSource(sourceUuid: string): Promise; + getJSSource(sourceUuid: string): Promise; } /** @@ -236,7 +236,7 @@ class BrowserConnectionImpl implements BrowserConnection { * Fetches JavaScript source code from the browser using the source UUID. * This method requires WebChannel version 6 or higher (Firefox 145+). */ - async getJSSource(sourceUuid: string): Promise { + async getJSSource(sourceUuid: string): Promise { if (!this._webChannelSupportsGetJSSource) { throw new Error( "Can't use getJSSource in Firefox versions with the old WebChannel." @@ -247,9 +247,14 @@ class BrowserConnectionImpl implements BrowserConnection { // fetching multiple sources, we only fetch one at a time currently. // TODO: Change this to fetch multiple JS sources at the load time or while // we share the profile. - return getJSSourcesViaWebChannel([sourceUuid]).then( - (sources) => sources[0] - ); + return getJSSourcesViaWebChannel([sourceUuid]).then((sources) => { + const source = sources[0]; + if ('error' in source) { + throw new Error(source.error); + } + + return source.sourceText; + }); } } diff --git a/src/app-logic/web-channel.ts b/src/app-logic/web-channel.ts index 7ac33344b8..34ba5bdf8b 100644 --- a/src/app-logic/web-channel.ts +++ b/src/app-logic/web-channel.ts @@ -147,7 +147,8 @@ type GetSymbolTableResponse = SymbolTableAsTuple; type QuerySymbolicationApiResponse = string; type GetPageFaviconsResponse = Array; type OpenScriptInTabDebuggerResponse = void; -type GetJSSourcesResponse = Array; +type GetJSSourceReponseItem = { sourceText: string } | { error: string }; +type GetJSSourcesResponse = Array; // TypeScript function overloads for request/response pairs. function _sendMessageWithResponse( @@ -387,7 +388,7 @@ export async function showFunctionInDevtoolsViaWebChannel( export async function getJSSourcesViaWebChannel( sourceUuids: Array -): Promise> { +): Promise> { return _sendMessageWithResponse({ type: 'GET_JS_SOURCES', sourceUuids, diff --git a/src/components/app/CodeErrorOverlay.tsx b/src/components/app/CodeErrorOverlay.tsx index 8e5b174d3a..29d3dfa0d4 100644 --- a/src/components/app/CodeErrorOverlay.tsx +++ b/src/components/app/CodeErrorOverlay.tsx @@ -113,13 +113,13 @@ export function CodeErrorOverlay({ errors }: CodeErrorOverlayProps) { ); } case 'NOT_PRESENT_IN_BROWSER': { - const { sourceUuid, url } = error; + const { sourceUuid, url, errorMessage } = error; return ( -
  • {`The browser was unable to obtain the source file for ${url} with sourceUuid ${sourceUuid}`}
  • +
  • {`The browser was unable to obtain the source file for ${url} with sourceUuid ${sourceUuid}: ${errorMessage}`}
  • ); } diff --git a/src/test/unit/fetch-source.test.ts b/src/test/unit/fetch-source.test.ts index 324deaacc8..7bb7b38e21 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -618,8 +618,10 @@ describe('fetchSource', function () { type: 'ERROR', errors: [ { - type: 'BROWSER_API_ERROR', - apiErrorMessage: `Source not found for source with ID: ${TEST_SOURCE_UUID}`, + type: 'NOT_PRESENT_IN_BROWSER', + sourceUuid: 'ff6d24c3-b8f5-45cd-a7d3-b643b3292e41', + url: '/path/to/script.js', + errorMessage: `Error: Source not found for source with ID: ${TEST_SOURCE_UUID}`, }, { type: 'NO_KNOWN_CORS_URL', diff --git a/src/types/state.ts b/src/types/state.ts index cd7a6e1cad..08df9b8213 100644 --- a/src/types/state.ts +++ b/src/types/state.ts @@ -335,6 +335,7 @@ export type SourceCodeLoadingError = type: 'NOT_PRESENT_IN_BROWSER'; sourceUuid: string; url: string; + errorMessage: string; }; export type ProfileSpecificUrlState = { diff --git a/src/utils/fetch-source.ts b/src/utils/fetch-source.ts index b91c038138..4ad15da0db 100644 --- a/src/utils/fetch-source.ts +++ b/src/utils/fetch-source.ts @@ -99,16 +99,12 @@ export async function fetchSource( source: response, }; } - + } catch (e) { errors.push({ type: 'NOT_PRESENT_IN_BROWSER', sourceUuid, url: file, - }); - } catch (e) { - errors.push({ - type: 'BROWSER_API_ERROR', - apiErrorMessage: e.message, + errorMessage: e.toString(), }); } } diff --git a/src/utils/query-api.ts b/src/utils/query-api.ts index ad0e5d993d..6033f182fe 100644 --- a/src/utils/query-api.ts +++ b/src/utils/query-api.ts @@ -24,7 +24,7 @@ export interface ExternalCommunicationDelegate { requestJson: string ): Promise; - fetchJSSourceFromBrowser(source: string): Promise; + fetchJSSourceFromBrowser(source: string): Promise; } export type ApiQueryResult = @@ -163,7 +163,7 @@ export class RegularExternalCommunicationDelegate return browserConnection.querySymbolicationApi(path, requestJson); } - fetchJSSourceFromBrowser(source: string): Promise { + fetchJSSourceFromBrowser(source: string): Promise { const browserConnection = this._browserConnection; if (browserConnection === null) { throw new Error('No connection to the browser.'); From 722ff877db7f29a0567f76ae21525f7a43cd71cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 22 Sep 2025 21:14:40 +0200 Subject: [PATCH 20/22] Implement compacting for the shared source table --- src/profile-logic/profile-compacting.ts | 136 ++++++++++++++++++------ src/test/unit/sanitize.test.ts | 53 +++++++++ 2 files changed, 157 insertions(+), 32 deletions(-) diff --git a/src/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts index fb7ef2ddfe..49bd963c15 100644 --- a/src/profile-logic/profile-compacting.ts +++ b/src/profile-logic/profile-compacting.ts @@ -18,17 +18,19 @@ import type { export type CompactedProfileWithTranslationMaps = { profile: Profile; oldStringToNewStringPlusOne: Int32Array; + oldSourceToNewSourcePlusOne: Int32Array; }; /** - * Returns a new profile with all unreferenced strings removed. + * Returns a new profile with all unreferenced strings and sources removed. * - * Since the string table is shared between all threads, if the user asks for a - * thread to be removed during sanitization, by default we'd keep the strings - * from the removed threads in the profile. + * Since the string table and source table are shared between all threads, if + * the user asks for a thread to be removed during sanitization, by default + * we'd keep the strings and sources from the removed threads in the profile. * - * By calling this function, you can get a profile with an adjusted string table - * where those unused strings from the removed threads have been removed. + * By calling this function, you can get a profile with adjusted string and + * source tables where those unused strings and sources from the removed + * threads have been removed. */ export function computeCompactedProfile( profile: Profile @@ -36,16 +38,20 @@ export function computeCompactedProfile( const stringIndexMarkerFieldsByDataType = computeStringIndexMarkerFieldsByDataType(profile.meta.markerSchema); - // Step 1: Gather all references. + // Step 1: Gather all references of strings. const referencedStrings = _gatherStringReferencesInProfile( profile, stringIndexMarkerFieldsByDataType ); - // Step 2: Adjust all tables to use new string indexes. - return _createProfileWithTranslatedStringIndexes( + // Step 2: Gather all references of sources. + const referencedSources = _gatherSourceReferencesInProfile(profile); + + // Step 3: Adjust all tables to use new string and source indexes. + return _createProfileWithTranslatedIndexes( profile, referencedStrings, + referencedSources, stringIndexMarkerFieldsByDataType ); } @@ -68,36 +74,53 @@ function _gatherStringReferencesInProfile( return referencedStrings; } -function _createProfileWithTranslatedStringIndexes( +function _gatherSourceReferencesInProfile(profile: Profile): Uint8Array { + const referencedSources = new Uint8Array(profile.shared.sources.length); + + for (const thread of profile.threads) { + _gatherSourceReferencesInThread(thread, referencedSources); + } + + return referencedSources; +} + +function _gatherSourceReferencesInThread( + thread: RawThread, + referencedSources: Uint8Array +) { + for (let i = 0; i < thread.funcTable.length; i++) { + const sourceIndex = thread.funcTable.source[i]; + if (sourceIndex !== null) { + referencedSources[sourceIndex] = 1; + } + } +} + +function _createProfileWithTranslatedIndexes( profile: Profile, referencedStrings: Uint8Array, + referencedSources: Uint8Array, stringIndexMarkerFieldsByDataType: Map ): CompactedProfileWithTranslationMaps { const { newStringArray, oldStringToNewStringPlusOne } = _createCompactedStringArray(profile.shared.stringArray, referencedStrings); + const { newSources, oldSourceToNewSourcePlusOne } = + _createCompactedSourceTable( + profile.shared.sources, + referencedSources, + oldStringToNewStringPlusOne + ); + const newThreads = profile.threads.map((thread) => - _createThreadWithTranslatedStringIndexes( + _createThreadWithTranslatedIndexes( thread, oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne, stringIndexMarkerFieldsByDataType ) ); - // Update sources table with translated string indexes - const newSources = { - ...profile.shared.sources, - filename: profile.shared.sources.filename.map((oldUrlIndex) => { - const newIndexPlusOne = oldStringToNewStringPlusOne[oldUrlIndex]; - if (newIndexPlusOne === 0) { - throw new Error( - `String index ${oldUrlIndex} was not found in the translation map` - ); - } - return newIndexPlusOne - 1; - }), - }; - const newShared: RawProfileSharedData = { stringArray: newStringArray, sources: newSources, @@ -112,6 +135,7 @@ function _createProfileWithTranslatedStringIndexes( return { profile: newProfile, oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne, }; } @@ -132,9 +156,10 @@ function _gatherStringReferencesInThread( _gatherReferencesInNativeSymbols(thread.nativeSymbols, referencedStrings); } -function _createThreadWithTranslatedStringIndexes( +function _createThreadWithTranslatedIndexes( thread: RawThread, oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: Int32Array, stringIndexMarkerFieldsByDataType: Map ): RawThread { const newNativeSymbols = _createNativeSymbolsWithTranslatedStringIndexes( @@ -145,9 +170,10 @@ function _createThreadWithTranslatedStringIndexes( thread.resourceTable, oldStringToNewStringPlusOne ); - const newFuncTable = _createFuncTableWithTranslatedStringIndexes( + const newFuncTable = _createFuncTableWithTranslatedIndexes( thread.funcTable, - oldStringToNewStringPlusOne + oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne ); const newMarkers = _createMarkersWithTranslatedStringIndexes( thread.markers, @@ -253,9 +279,10 @@ function _gatherReferencesInFuncTable( } } -function _createFuncTableWithTranslatedStringIndexes( +function _createFuncTableWithTranslatedIndexes( funcTable: FuncTable, - oldStringToNewStringPlusOne: Int32Array + oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: Int32Array ): FuncTable { const newFuncTableNameCol = funcTable.name.slice(); const newFuncTableSourceCol = funcTable.source.slice(); @@ -263,8 +290,12 @@ function _createFuncTableWithTranslatedStringIndexes( const name = funcTable.name[i]; newFuncTableNameCol[i] = oldStringToNewStringPlusOne[name] - 1; - // Note: source indexes don't need translation as they point to sources table, not strings - // Source table will be handled separately in _createSourcesTableWithTranslatedStringIndexes + // Translate source indexes to new compacted source table. + const sourceIndex = funcTable.source[i]; + if (sourceIndex !== null) { + const newSourceIndexPlusOne = oldSourceToNewSourcePlusOne[sourceIndex]; + newFuncTableSourceCol[i] = newSourceIndexPlusOne - 1; + } } const newFuncTable = { @@ -357,3 +388,44 @@ function _createCompactedStringArray( return { newStringArray, oldStringToNewStringPlusOne }; } + +function _createCompactedSourceTable( + sourceTable: SourceTable, + referencedSources: Uint8Array, + oldStringToNewStringPlusOne: Int32Array +): { newSources: SourceTable; oldSourceToNewSourcePlusOne: Int32Array } { + const oldSourceToNewSourcePlusOne = new Int32Array(sourceTable.length); + let nextIndex = 0; + const newUuid = []; + const newFilename = []; + + for (let i = 0; i < sourceTable.length; i++) { + if (referencedSources[i] === 0) { + continue; + } + + const newIndex = nextIndex++; + newUuid[newIndex] = sourceTable.uuid[i]; + + // Translate the filename string index + const oldFilenameIndex = sourceTable.filename[i]; + const newFilenameIndexPlusOne = + oldStringToNewStringPlusOne[oldFilenameIndex]; + if (newFilenameIndexPlusOne === 0) { + throw new Error( + `String index ${oldFilenameIndex} was not found in the translation map` + ); + } + newFilename[newIndex] = newFilenameIndexPlusOne - 1; + + oldSourceToNewSourcePlusOne[i] = newIndex + 1; + } + + const newSources: SourceTable = { + length: nextIndex, + uuid: newUuid, + filename: newFilename, + }; + + return { newSources, oldSourceToNewSourcePlusOne }; +} diff --git a/src/test/unit/sanitize.test.ts b/src/test/unit/sanitize.test.ts index c912c9dcc0..e51be4d509 100644 --- a/src/test/unit/sanitize.test.ts +++ b/src/test/unit/sanitize.test.ts @@ -1206,4 +1206,57 @@ describe('sanitizePII', function () { ]); }); }); + + it('should compact the source table when threads are removed', function () { + // Create a profile with multiple threads that reference different sources + const { profile } = getProfileFromTextSamples( + `A[file:file1.js]`, + `B[file:file2.js]`, + `C[file:file3.js]` + ); + + const originalSourcesLength = profile.shared.sources.length; + + // Verify we have sources for each thread + expect(originalSourcesLength).toEqual(3); + + // Verify that different threads reference different sources + const thread0SourceIndex = profile.threads[0].funcTable.source[0]; + const thread1SourceIndex = profile.threads[1].funcTable.source[0]; + const thread2SourceIndex = profile.threads[2].funcTable.source[0]; + + expect(thread0SourceIndex).not.toBe(thread1SourceIndex); + expect(thread1SourceIndex).not.toBe(thread2SourceIndex); + + // Remove threads 0 and 2, keeping only thread 1. + const { sanitizedProfile } = setup( + { + shouldRemoveThreads: new Set([0, 2]), + }, + profile + ); + + // The source table should be compacted to only contain sources referenced + // by remaining threads + expect(sanitizedProfile.shared.sources.length).toBeLessThan( + originalSourcesLength + ); + expect(sanitizedProfile.shared.sources.length).toEqual(1); + + // The remaining thread should still have a valid source reference + const remainingSourceIndex = + sanitizedProfile.threads[0].funcTable.source[0]; + expect(remainingSourceIndex).not.toBeNull(); + expect(remainingSourceIndex).toBeLessThan( + sanitizedProfile.shared.sources.length + ); + + // Verify that the filename string is still accessible + expect(remainingSourceIndex).not.toBeNull(); + const filenameStringIndex = + sanitizedProfile.shared.sources.filename[remainingSourceIndex!]; + expect(sanitizedProfile.shared.stringArray[filenameStringIndex]).toContain( + 'file2.js' + ); + }); }); From a4b90ed2fb34d6f20bec6bb1d0d45d300f8e07ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 22 Sep 2025 21:46:40 +0200 Subject: [PATCH 21/22] Remove _processSourceTable and only add the sources while we are processing the JS functions --- src/profile-logic/global-data-collector.ts | 5 --- src/profile-logic/process-profile.ts | 38 ++-------------------- 2 files changed, 3 insertions(+), 40 deletions(-) diff --git a/src/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts index 10a08182e1..8f9899529c 100644 --- a/src/profile-logic/global-data-collector.ts +++ b/src/profile-logic/global-data-collector.ts @@ -83,11 +83,6 @@ export class GlobalDataCollector { return index; } - // Get the processed source index by UUID - getSourceIndexByUuid(uuid: string): IndexIntoSourceTable | null { - return this._uuidToSourceIndex.get(uuid) ?? null; - } - getStringTable(): StringTable { return this._stringTable; } diff --git a/src/profile-logic/process-profile.ts b/src/profile-logic/process-profile.ts index ee266f75c4..7a363ec58d 100644 --- a/src/profile-logic/process-profile.ts +++ b/src/profile-logic/process-profile.ts @@ -536,8 +536,10 @@ function _extractJsFunction( // Look up the UUID for this source index from the process's sources table if (geckoSourceTable && geckoSourceIdx < geckoSourceTable.data.length) { const uuidIndex = geckoSourceTable.schema.uuid; + const filenameIndex = geckoSourceTable.schema.filename; const uuid = geckoSourceTable.data[geckoSourceIdx][uuidIndex]; - processedSourceIndex = globalDataCollector.getSourceIndexByUuid(uuid); + const filename = geckoSourceTable.data[geckoSourceIdx][filenameIndex]; + processedSourceIndex = globalDataCollector.indexForSource(uuid, filename); } } @@ -1657,37 +1659,6 @@ export function processGeckoOrDevToolsProfile(json: unknown): Profile { return processGeckoProfile(geckoProfile); } -/** - * Process source table from all processes and populate the global data - * collector with UUID-to-index mappings. - */ -function _processSourceTable( - geckoProfile: GeckoProfile, - globalDataCollector: GlobalDataCollector -): void { - // Process the main process sources table if it exists - if (geckoProfile.sources) { - const schema = geckoProfile.sources.schema; - for (const data of geckoProfile.sources.data) { - const uuid = data[schema.uuid]; - const filename = data[schema.filename]; - globalDataCollector.indexForSource(uuid, filename); - } - } - - // Process sources from all subprocesses - for (const subprocessProfile of geckoProfile.processes) { - if (subprocessProfile.sources) { - const schema = subprocessProfile.sources.schema; - for (const data of subprocessProfile.sources.data) { - const uuid = data[schema.uuid]; - const filename = data[schema.filename]; - globalDataCollector.indexForSource(uuid, filename); - } - } - } -} - /** * Convert a profile from the Gecko format into the processed format. * Throws an exception if it encounters an incompatible profile. @@ -1710,9 +1681,6 @@ export function processGeckoProfile(geckoProfile: GeckoProfile): Profile { const globalDataCollector = new GlobalDataCollector(); - // Process sources from all processes (main + subprocesses) - _processSourceTable(geckoProfile, globalDataCollector); - for (const thread of geckoProfile.threads) { threads.push( _processThread( From 9f0aefbe466d8b60f949d282ed5373afb71194bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Can=20Alt=C4=B1nova?= Date: Mon, 22 Sep 2025 22:08:11 +0200 Subject: [PATCH 22/22] Make the source code cache tests use the proper actions --- src/test/unit/source-code-cache.test.ts | 182 +++++++++--------------- 1 file changed, 68 insertions(+), 114 deletions(-) diff --git a/src/test/unit/source-code-cache.test.ts b/src/test/unit/source-code-cache.test.ts index ccfb86082a..26100e117f 100644 --- a/src/test/unit/source-code-cache.test.ts +++ b/src/test/unit/source-code-cache.test.ts @@ -6,13 +6,14 @@ import { getSourceViewCode, getSourceCodeCache } from '../../selectors/code'; import { storeWithProfile } from '../fixtures/stores'; import { updateUrlState } from '../../actions/app'; import { stateFromLocation } from '../../app-logic/url-handling'; +import { + beginLoadingSourceCodeFromUrl, + beginLoadingSourceCodeFromBrowserConnection, + finishLoadingSourceCode, + failLoadingSourceCode, +} from '../../actions/code'; -import type { - State, - Store, - SourceCodeStatus, - IndexIntoSourceTable, -} from 'firefox-profiler/types'; +import type { IndexIntoSourceTable } from 'firefox-profiler/types'; describe('source code cache with IndexIntoSourceTable', function () { function setupStoreWithSourceIndex(sourceIndex: IndexIntoSourceTable | null) { @@ -28,73 +29,32 @@ describe('source code cache with IndexIntoSourceTable', function () { return store; } - function createStateWithMockCache( - store: Store, - mockCache: Map - ): State { - return { - ...store.getState(), - code: { - ...store.getState().code, - sourceCodeCache: mockCache, - }, - }; - } - - function createMockCache(): Map { - const cache = new Map(); - cache.set(0, { - type: 'AVAILABLE', - code: 'console.log("Source 0");', - }); - cache.set(1, { - type: 'AVAILABLE', - code: 'function source1() { return "hello"; }', - }); - cache.set(2, { - type: 'LOADING', - source: { type: 'URL', url: 'https://example.com/source2.js' }, - }); - cache.set(3, { - type: 'ERROR', - errors: [ - { - type: 'NETWORK_ERROR', - url: 'https://example.com/source3.js', - networkErrorMessage: 'Failed to fetch', - }, - ], - }); - return cache; - } - it('returns undefined when no source code is cached', function () { - const store = setupStoreWithSourceIndex(0); - const sourceViewCode = getSourceViewCode(store.getState()); + const { getState } = setupStoreWithSourceIndex(0); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toBeUndefined(); }); it('returns undefined when sourceIndex is null', function () { - const store = setupStoreWithSourceIndex(null); - const sourceViewCode = getSourceViewCode(store.getState()); + const { getState } = setupStoreWithSourceIndex(null); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toBeUndefined(); }); it('returns undefined when sourceIndex is not in cache', function () { - const store = setupStoreWithSourceIndex(999); // sourceIndex not in cache - const cache = createMockCache(); - const state = createStateWithMockCache(store, cache); + const { getState, dispatch } = setupStoreWithSourceIndex(999); + // Add some other source to cache but not index 999 + dispatch(finishLoadingSourceCode(0, 'some code')); - const sourceViewCode = getSourceViewCode(state); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toBeUndefined(); }); it('retrieves cached source code for AVAILABLE status', function () { - const store = setupStoreWithSourceIndex(0); - const cache = createMockCache(); - const state = createStateWithMockCache(store, cache); + const { getState, dispatch } = setupStoreWithSourceIndex(0); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); - const sourceViewCode = getSourceViewCode(state); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toEqual({ type: 'AVAILABLE', code: 'console.log("Source 0");', @@ -102,11 +62,12 @@ describe('source code cache with IndexIntoSourceTable', function () { }); it('retrieves cached source code for LOADING status with URL', function () { - const store = setupStoreWithSourceIndex(2); - const cache = createMockCache(); - const state = createStateWithMockCache(store, cache); + const { getState, dispatch } = setupStoreWithSourceIndex(2); + dispatch( + beginLoadingSourceCodeFromUrl(2, 'https://example.com/source2.js') + ); - const sourceViewCode = getSourceViewCode(state); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toEqual({ type: 'LOADING', source: { type: 'URL', url: 'https://example.com/source2.js' }, @@ -114,11 +75,18 @@ describe('source code cache with IndexIntoSourceTable', function () { }); it('retrieves cached source code for ERROR status', function () { - const store = setupStoreWithSourceIndex(3); - const cache = createMockCache(); - const state = createStateWithMockCache(store, cache); + const { getState, dispatch } = setupStoreWithSourceIndex(3); + dispatch( + failLoadingSourceCode(3, [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ]) + ); - const sourceViewCode = getSourceViewCode(state); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toEqual({ type: 'ERROR', errors: [ @@ -132,15 +100,10 @@ describe('source code cache with IndexIntoSourceTable', function () { }); it('retrieves cached source code for LOADING status with BROWSER_CONNECTION', function () { - const store = setupStoreWithSourceIndex(4); - const cache = new Map(); - cache.set(4, { - type: 'LOADING', - source: { type: 'BROWSER_CONNECTION' }, - }); - const state = createStateWithMockCache(store, cache); + const { getState, dispatch } = setupStoreWithSourceIndex(4); + dispatch(beginLoadingSourceCodeFromBrowserConnection(4)); - const sourceViewCode = getSourceViewCode(state); + const sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toEqual({ type: 'LOADING', source: { type: 'BROWSER_CONNECTION' }, @@ -148,13 +111,12 @@ describe('source code cache with IndexIntoSourceTable', function () { }); describe('getSourceCodeCache selector', function () { - it('returns the cache Map directly', function () { - const store = setupStoreWithSourceIndex(null); - const cache = createMockCache(); - const state = createStateWithMockCache(store, cache); + it('returns the cache Map with cached entries', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(null); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); - const result = getSourceCodeCache(state); - expect(result).toBe(cache); + const result = getSourceCodeCache(getState()); + expect(result).toBeInstanceOf(Map); expect(result.get(0)).toEqual({ type: 'AVAILABLE', code: 'console.log("Source 0");', @@ -162,52 +124,44 @@ describe('source code cache with IndexIntoSourceTable', function () { }); it('returns empty Map when no cache is set', function () { - const store = setupStoreWithSourceIndex(null); - const state = store.getState(); + const { getState } = setupStoreWithSourceIndex(null); - const result = getSourceCodeCache(state); + const result = getSourceCodeCache(getState()); expect(result).toBeInstanceOf(Map); expect(result.size).toBe(0); }); }); - describe('edge cases', function () { - it('handles different SourceCodeStatus types correctly', function () { - const cache = createMockCache(); + describe('state transitions', function () { + it('can transition from LOADING to AVAILABLE', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(0); + dispatch(beginLoadingSourceCodeFromUrl(0, 'https://example.com/test.js')); - // Test each type of status - expect(cache.get(0)?.type).toBe('AVAILABLE'); - expect(cache.get(2)?.type).toBe('LOADING'); - expect(cache.get(3)?.type).toBe('ERROR'); - }); + let sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode?.type).toBe('LOADING'); - it('handles multiple error types', function () { - const store = setupStoreWithSourceIndex(5); - const cache = new Map(); - cache.set(5, { - type: 'ERROR', - errors: [ - { - type: 'NETWORK_ERROR', - url: 'https://example.com/source.js', - networkErrorMessage: 'Network failed', - }, - { type: 'NO_KNOWN_CORS_URL' }, - ], + dispatch(finishLoadingSourceCode(0, 'const result = 42;')); + + sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'const result = 42;', }); - const state = createStateWithMockCache(store, cache); + }); + + it('can transition from LOADING to ERROR', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(1); + dispatch(beginLoadingSourceCodeFromUrl(1, 'https://example.com/test.js')); + + let sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode?.type).toBe('LOADING'); + + dispatch(failLoadingSourceCode(1, [{ type: 'NO_KNOWN_CORS_URL' }])); - const sourceViewCode = getSourceViewCode(state); + sourceViewCode = getSourceViewCode(getState()); expect(sourceViewCode).toEqual({ type: 'ERROR', - errors: [ - { - type: 'NETWORK_ERROR', - url: 'https://example.com/source.js', - networkErrorMessage: 'Network failed', - }, - { type: 'NO_KNOWN_CORS_URL' }, - ], + errors: [{ type: 'NO_KNOWN_CORS_URL' }], }); }); });