diff --git a/docs-developer/CHANGELOG-formats.md b/docs-developer/CHANGELOG-formats.md index cd587209c2..21c7185a5a 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. @@ -122,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/locales/en-US/app.ftl b/locales/en-US/app.ftl index 748963e31f..366729e740 100644 --- a/locales/en-US/app.ftl +++ b/locales/en-US/app.ftl @@ -1243,6 +1243,15 @@ 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. +# $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 }: { $errorMessage }. + ## 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/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/browser-connection.ts b/src/app-logic/browser-connection.ts index 446d79b140..8a40db9c14 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,31 @@ 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) => { + const source = sources[0]; + if ('error' in source) { + throw new Error(source.error); + } + + return source.sourceText; + }); + } } // Should work with: diff --git a/src/app-logic/constants.ts b/src/app-logic/constants.ts index 4ee3d1ad56..be047a25b2 100644 --- a/src/app-logic/constants.ts +++ b/src/app-logic/constants.ts @@ -7,12 +7,12 @@ 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 // `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/app-logic/url-handling.ts b/src/app-logic/url-handling.ts index df7b8adbae..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 @@ -171,7 +172,7 @@ type BaseQuery = { view: string; implementation: string; timelineType: string; - sourceView: string; + sourceViewIndex: number; assemblyView: string; }; @@ -208,7 +209,7 @@ type Query = BaseQuery & { invertCallstack?: null | undefined; ctSummary?: string; transforms?: string; - sourceView?: string; + sourceViewIndex?: number; assemblyView?: string; // StackChart specific @@ -349,8 +350,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 +509,7 @@ export function stateFromLocation( const sourceView: SourceViewState = { scrollGeneration: 0, libIndex: null, - sourceFile: null, + sourceIndex: null, }; const assemblyView: AssemblyViewState = { isOpen: false, @@ -518,8 +519,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) { @@ -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++) { diff --git a/src/app-logic/web-channel.ts b/src/app-logic/web-channel.ts index 2dbe25fbf0..34ba5bdf8b 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,8 @@ type GetSymbolTableResponse = SymbolTableAsTuple; type QuerySymbolicationApiResponse = string; type GetPageFaviconsResponse = Array; type OpenScriptInTabDebuggerResponse = void; +type GetJSSourceReponseItem = { sourceText: string } | { error: string }; +type GetJSSourcesResponse = Array; // TypeScript function overloads for request/response pairs. function _sendMessageWithResponse( @@ -167,6 +178,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 +386,15 @@ export async function showFunctionInDevtoolsViaWebChannel( }); } +export async function getJSSourcesViaWebChannel( + sourceUuids: Array +): Promise> { + return _sendMessageWithResponse({ + type: 'GET_JS_SOURCES', + sourceUuids, + }); +} + /** * ----------------------------------------------------------------------------- * 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/CodeErrorOverlay.tsx b/src/components/app/CodeErrorOverlay.tsx index d3e113bd65..29d3dfa0d4 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, errorMessage } = error; + return ( + +
  • {`The browser was unable to obtain the source file for ${url} with sourceUuid ${sourceUuid}: ${errorMessage}`}
  • +
    + ); + } default: throw assertExhaustiveCheck(error); } diff --git a/src/components/app/SourceCodeFetcher.tsx b/src/components/app/SourceCodeFetcher.tsx index f0483b969e..0800b3f81d 100644 --- a/src/components/app/SourceCodeFetcher.tsx +++ b/src/components/app/SourceCodeFetcher.tsx @@ -8,8 +8,10 @@ import { getProfileOrNull, getSourceViewCode, getBrowserConnection, - getSourceViewFile, getSymbolServerUrl, + getSourceViewFile, + getSourceViewSourceIndex, + getSourceViewSourceUuid, } from 'firefox-profiler/selectors'; import { beginLoadingSourceCodeFromUrl, @@ -25,10 +27,16 @@ 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 sourceViewSourceUuid: string | null; readonly sourceViewCode: SourceCodeStatus | void; readonly symbolServerUrl: string; readonly profile: Profile | null; @@ -55,15 +63,12 @@ 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, + sourceViewSourceUuid, beginLoadingSourceCodeFromUrl, beginLoadingSourceCodeFromBrowserConnection, finishLoadingSourceCode, @@ -73,23 +78,34 @@ 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, + sourceViewSourceUuid, symbolServerUrl, addressProof, this._archiveCache, @@ -98,10 +114,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,7 +135,9 @@ class SourceCodeFetcherImpl extends React.PureComponent { 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/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 5a83b94db3..dfb9994e8e 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'; /** @@ -160,7 +161,7 @@ export function getEmptyFuncTable(): FuncTable { relevantForJS: [], name: [], resource: [], - fileName: [], + source: [], lineNumber: [], columnNumber: [], length: 0, @@ -177,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, @@ -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/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/profile-logic/global-data-collector.ts b/src/profile-logic/global-data-collector.ts new file mode 100644 index 0000000000..8f9899529c --- /dev/null +++ b/src/profile-logic/global-data-collector.ts @@ -0,0 +1,104 @@ +/* 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, + IndexIntoStringTable, + IndexIntoSourceTable, + RawProfileSharedData, + SourceTable, +} 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); + _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. + 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; + } + + // 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; + } + + 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/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 cae0727740..52fe0a9831 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'; @@ -129,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); @@ -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/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..b806654c24 100644 --- a/src/profile-logic/line-timings.ts +++ b/src/profile-logic/line-timings.ts @@ -8,10 +8,10 @@ import type { StackTable, SamplesLikeTable, IndexIntoCallNodeTable, - IndexIntoStringTable, StackLineInfo, LineTimings, LineNumber, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import { getMatchingAncestorStackForInvertedCallNode } from './profile-data'; @@ -58,7 +58,7 @@ export function getStackLineInfo( stackTable: StackTable, frameTable: FrameTable, funcTable: FuncTable, - fileNameStringIndex: IndexIntoStringTable + sourceViewSourceIndex: IndexIntoSourceTable ): StackLineInfo { // "self line" == "the line which a stack's self time is contributed to" const selfLineForAllStacks = []; @@ -74,13 +74,13 @@ export function getStackLineInfo( const frame = stackTable.frame[stackIndex]; const prefixStack = stackTable.prefix[stackIndex]; const func = frameTable.func[frame]; - const fileNameStringIndexOfThisStack = funcTable.fileName[func]; + 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/profile-logic/merge-compare.ts b/src/profile-logic/merge-compare.ts index 828c30a2df..be1bdaabdd 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 @@ -194,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 = { @@ -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. */ @@ -630,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 @@ -781,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 @@ -817,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 63508ebab4..7a363ec58d 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 { GlobalDataCollector } from './global-data-collector'; import { AddressLocator } from './address-locator'; -import { StringTable } from '../utils/string-table'; 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, @@ -99,6 +98,7 @@ import type { MarkerPhase, Pid, GeckoMarkerSchema, + GeckoSourceTable, } from 'firefox-profiler/types'; import { decompress, isGzip } from 'firefox-profiler/utils/gz'; @@ -177,54 +177,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; @@ -239,6 +191,7 @@ type ExtractionInfo = { { funcIndex: IndexIntoFuncTable; frameAddress: Address | null } >; globalDataCollector: GlobalDataCollector; + geckoSourceTable: GeckoSourceTable | undefined; }; /** @@ -255,7 +208,8 @@ export function extractFuncsAndResourcesFromFrameLocations( geckoThreadStringArray: string[], libs: LibMapping[], extensions: ExtensionTable = getEmptyExtensions(), - globalDataCollector: GlobalDataCollector + globalDataCollector: GlobalDataCollector, + geckoSourceTable: GeckoSourceTable | undefined ): { funcTable: FuncTable; resourceTable: ResourceTable; @@ -284,6 +238,7 @@ export function extractFuncsAndResourcesFromFrameLocations( libNameToResourceIndex: new Map(), stringToNewFuncIndexAndFrameAddress: new Map(), globalDataCollector, + geckoSourceTable, }; for (let i = 0; i < extensions.length; i++) { @@ -431,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 }; @@ -494,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; @@ -539,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( @@ -565,6 +529,25 @@ 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 filenameIndex = geckoSourceTable.schema.filename; + const uuid = geckoSourceTable.data[geckoSourceIdx][uuidIndex]; + const filename = geckoSourceTable.data[geckoSourceIdx][filenameIndex]; + processedSourceIndex = globalDataCollector.indexForSource(uuid, filename); + } + } + + // 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); @@ -575,9 +558,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++; @@ -585,7 +567,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; @@ -605,7 +587,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; @@ -1195,7 +1177,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 } = @@ -1205,7 +1187,8 @@ function _processThread( thread.stringTable, libs, extensions, - globalDataCollector + globalDataCollector, + sources ); const nativeSymbols = getEmptyNativeSymbolTable(); const frameTable: FrameTable = _processFrameTable( @@ -1850,6 +1833,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. @@ -1861,7 +1845,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/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/profile-logic/profile-compacting.ts b/src/profile-logic/profile-compacting.ts index 53377a07ad..49bd963c15 100644 --- a/src/profile-logic/profile-compacting.ts +++ b/src/profile-logic/profile-compacting.ts @@ -12,22 +12,25 @@ import type { FuncTable, ResourceTable, NativeSymbolTable, + SourceTable, } from 'firefox-profiler/types'; 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 @@ -35,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 ); } @@ -59,31 +66,64 @@ function _gatherStringReferencesInProfile( _gatherStringReferencesInThread( thread, referencedStrings, - stringIndexMarkerFieldsByDataType + stringIndexMarkerFieldsByDataType, + profile.shared.sources ?? null ); } 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 ) ); const newShared: RawProfileSharedData = { stringArray: newStringArray, + sources: newSources, }; const newProfile: Profile = { @@ -95,13 +135,15 @@ function _createProfileWithTranslatedStringIndexes( return { profile: newProfile, oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne, }; } function _gatherStringReferencesInThread( thread: RawThread, referencedStrings: Uint8Array, - stringIndexMarkerFieldsByDataType: Map + stringIndexMarkerFieldsByDataType: Map, + sources: SourceTable ) { _gatherReferencesInMarkers( thread.markers, @@ -109,14 +151,15 @@ function _gatherStringReferencesInThread( stringIndexMarkerFieldsByDataType ); - _gatherReferencesInFuncTable(thread.funcTable, referencedStrings); + _gatherReferencesInFuncTable(thread.funcTable, referencedStrings, sources); _gatherReferencesInResourceTable(thread.resourceTable, referencedStrings); _gatherReferencesInNativeSymbols(thread.nativeSymbols, referencedStrings); } -function _createThreadWithTranslatedStringIndexes( +function _createThreadWithTranslatedIndexes( thread: RawThread, oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: Int32Array, stringIndexMarkerFieldsByDataType: Map ): RawThread { const newNativeSymbols = _createNativeSymbolsWithTranslatedStringIndexes( @@ -127,9 +170,10 @@ function _createThreadWithTranslatedStringIndexes( thread.resourceTable, oldStringToNewStringPlusOne ); - const newFuncTable = _createFuncTableWithTranslatedStringIndexes( + const newFuncTable = _createFuncTableWithTranslatedIndexes( thread.funcTable, - oldStringToNewStringPlusOne + oldStringToNewStringPlusOne, + oldSourceToNewSourcePlusOne ); const newMarkers = _createMarkersWithTranslatedStringIndexes( thread.markers, @@ -221,37 +265,43 @@ 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; } } } -function _createFuncTableWithTranslatedStringIndexes( +function _createFuncTableWithTranslatedIndexes( funcTable: FuncTable, - oldStringToNewStringPlusOne: Int32Array + oldStringToNewStringPlusOne: Int32Array, + oldSourceToNewSourcePlusOne: 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; + // 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 = { ...funcTable, name: newFuncTableNameCol, - fileName: newFuncTableFileNameCol, + source: newFuncTableSourceCol, }; return newFuncTable; } @@ -338,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/profile-logic/profile-data.ts b/src/profile-logic/profile-data.ts index 76bff5aecf..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, @@ -95,6 +95,8 @@ import type { Bytes, ThreadWithReservedFunctions, TabID, + SourceTable, + IndexIntoSourceTable, } from 'firefox-profiler/types'; import type { CallNodeInfo, SuffixOrderIndex } from './call-node-info'; @@ -1489,7 +1491,11 @@ export function filterThreadToSearchStrings( return thread; } - return searchStrings.reduce(filterThreadToSearchString, thread); + return searchStrings.reduce( + (accThread, searchString) => + filterThreadToSearchString(accThread, searchString), + thread + ); }); } @@ -1501,8 +1507,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 +1523,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; } @@ -2315,7 +2328,8 @@ export function createThreadFromDerivedTables( rawThread: RawThread, samples: SamplesTable, stackTable: StackTable, - stringTable: StringTable + stringTable: StringTable, + sources: SourceTable ): Thread { const { processType, @@ -2375,6 +2389,7 @@ export function createThreadFromDerivedTables( samples, stackTable, stringTable, + sources, }; return thread; } @@ -2831,6 +2846,7 @@ export function getOriginAnnotationForFunc( funcTable: FuncTable, resourceTable: ResourceTable, stringTable: StringTable, + sources: SourceTable, frameLineNumber: number | null = null, frameColumnNumber: number | null = null ): string { @@ -2843,11 +2859,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, @@ -2917,13 +2936,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++; @@ -3761,15 +3779,12 @@ export function nudgeReturnAddresses(thread: RawThread): RawThread { */ export function findAddressProofForFile( profile: Profile, - file: string + sourceIndex: IndexIntoSourceTable ): AddressProof | null { const { libs } = profile; - const { stringArray } = 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); + const func = funcTable.source.indexOf(sourceIndex); if (func === -1) { continue; } @@ -3961,8 +3976,7 @@ export function getBottomBoxInfoForCallNode( } = thread; const funcIndex = callNodeInfo.funcForNode(callNodeIndex); - const fileName = funcTable.fileName[funcIndex]; - const sourceFile = fileName !== null ? stringTable.getString(fileName) : null; + const sourceIndex = funcTable.source[funcIndex]; const resource = funcTable.resource[funcIndex]; const libIndex = resource !== -1 && resourceTable.type[resource] === resourceTypes.library @@ -3986,7 +4000,7 @@ export function getBottomBoxInfoForCallNode( return { libIndex, - sourceFile, + sourceIndex, nativeSymbols: nativeSymbolInfosForCallNode, }; } diff --git a/src/profile-logic/sanitize.ts b/src/profile-logic/sanitize.ts index 2ff0f19fb5..e9eefdd8f7 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( @@ -480,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++; @@ -495,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/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 1e667cde24..3fe4e3917e 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 ); } ); @@ -269,23 +271,23 @@ export const selectedNodeSelectors: NodeSelectors = (() => { const getSourceViewStackLineInfo: Selector = createSelector( selectedThreadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + UrlState.getSourceViewSourceIndex, selectedThreadSelectors.getCallNodeInfo, selectedThreadSelectors.getSelectedCallNodeIndex, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile, + { stackTable, frameTable, funcTable }: Thread, + sourceViewSourceIndex, callNodeInfo, selectedCallNodeIndex ): StackLineInfo | null => { - if (sourceViewFile === null || selectedCallNodeIndex === null) { + if (sourceViewSourceIndex === null || selectedCallNodeIndex === null) { return null; } const selectedFunc = callNodeInfo.funcForNode(selectedCallNodeIndex); - const selectedFuncFile = funcTable.fileName[selectedFunc]; + const selectedSourceIndex = funcTable.source[selectedFunc]; if ( - selectedFuncFile === null || - stringTable.getString(selectedFuncFile) !== sourceViewFile + selectedSourceIndex === null || + selectedSourceIndex !== sourceViewSourceIndex ) { return null; } diff --git a/src/selectors/per-thread/stack-sample.ts b/src/selectors/per-thread/stack-sample.ts index ba16f91acb..5b8b44b079 100644 --- a/src/selectors/per-thread/stack-sample.ts +++ b/src/selectors/per-thread/stack-sample.ts @@ -140,20 +140,15 @@ export function getStackAndSampleSelectorsPerThread( const getSourceViewStackLineInfo: Selector = createSelector( threadSelectors.getFilteredThread, - UrlState.getSourceViewFile, + UrlState.getSourceViewSourceIndex, ( - { stackTable, frameTable, funcTable, stringTable }: Thread, - sourceViewFile + { stackTable, frameTable, funcTable }: Thread, + sourceIndex ): StackLineInfo | null => { - if (sourceViewFile === null) { + if (sourceIndex === null) { return null; } - return getStackLineInfo( - stackTable, - frameTable, - funcTable, - stringTable.indexForString(sourceViewFile) - ); + return getStackLineInfo(stackTable, frameTable, funcTable, sourceIndex); } ); @@ -347,6 +342,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 78901c348b..fc8b619b89 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 ); @@ -338,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 + ) ); /** @@ -465,6 +472,7 @@ export function getThreadSelectorsWithMarkersPerThread( const getFilteredThread: Selector = createSelector( _getImplementationFilteredThread, UrlState.getSearchStrings, + ProfileSelectors.getSourceTable, ProfileData.filterThreadToSearchStrings ); diff --git a/src/selectors/profile.ts b/src/selectors/profile.ts index 13ed4a647b..38d2e68e9e 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( @@ -912,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 29f86db901..c6c159c0fe 100644 --- a/src/test/components/CallNodeContextMenu.test.tsx +++ b/src/test/components/CallNodeContextMenu.test.tsx @@ -14,15 +14,15 @@ 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, 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 { 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..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, @@ -43,6 +41,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 +292,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/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/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/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 0adcbd959a..5813a8e4e8 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]> @@ -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,10 @@ 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 580f26e21a..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'; @@ -156,7 +157,8 @@ export function computeThreadFromRawThread( rawThread, samples, stackTable, - stringTable + stringTable, + shared.sources ); } @@ -316,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; @@ -333,6 +341,7 @@ export function formatStack( funcTable, resourceTable, stringTable, + sources, frameLine, frameColumn ); @@ -608,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/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 97b694c07f..a8c4c9ec9e 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": "", @@ -426,7 +426,7 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "pages": Array [ Object { @@ -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/store/bottom-box.test.ts b/src/test/store/bottom-box.test.ts index 18de69f344..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, @@ -65,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()) @@ -102,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 @@ -126,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 ); @@ -188,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 @@ -198,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 @@ -242,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/store/js-tracer.test.ts b/src/test/store/js-tracer.test.ts index 02f6a0bf51..6fd44b9f8b 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,8 +355,10 @@ 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']; @@ -363,16 +366,20 @@ describe('selectors/getJsTracerTiming', function () { 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. 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..c646b311ec 100644 --- a/src/test/store/transforms.test.ts +++ b/src/test/store/transforms.test.ts @@ -1223,11 +1223,13 @@ describe('"collapse-direct-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1405,11 +1407,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1516,11 +1520,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); @@ -1650,11 +1656,13 @@ describe('"collapse-recursion" transform', function () { const { stackTable, frameTable, funcTable, samples, stringTable } = filteredThread; const fileStringIndex = stringTable.indexForString('b'); + const fileSourceIndex = + filteredThread.sources.filename.indexOf(fileStringIndex); const stackLineInfo = getStackLineInfo( stackTable, frameTable, funcTable, - fileStringIndex + fileSourceIndex ); const lineTimings = getLineTimings(stackLineInfo, samples); diff --git a/src/test/unit/__snapshots__/profile-conversion.test.ts.snap b/src/test/unit/__snapshots__/profile-conversion.test.ts.snap index 51aeb0ab04..aa0f53fbe6 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, @@ -586,7 +586,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -85523,7 +85528,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "ART Trace (Android)", "sampleUnits": undefined, @@ -85536,7 +85541,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -334629,7 +334639,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -334639,10 +334649,19 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -383004,7 +383023,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 119159778.026, @@ -383014,10 +383033,19 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -431379,7 +431407,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -431389,10 +431417,23 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -434209,7 +434250,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -434217,10 +434258,15 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -437145,7 +437191,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 355035987.653, @@ -437155,10 +437201,107 @@ Object { "startTime": 1700159839203.051, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -440573,7 +440716,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "sourceURL": "", @@ -440581,10 +440724,63 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -446089,7 +446285,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Chrome Trace", "profilingEndTime": 66155012.423, @@ -446099,10 +446295,23 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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 { @@ -447103,7 +447312,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -447116,7 +447325,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -453037,7 +453251,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -453050,7 +453264,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -467927,7 +468146,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -467940,7 +468159,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -474126,7 +474350,7 @@ Object { "oscpu": undefined, "physicalCPUs": undefined, "platform": undefined, - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "Firefox", "sampleUnits": undefined, @@ -474139,7 +474363,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -492529,7 +492758,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -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 { @@ -561598,7 +561832,7 @@ Object { "keepProfileThreadOrder": true, "markerSchema": Array [], "platform": "Android", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "com.example.sampleapplication", "sourceCodeIsNotOnSearchfox": true, @@ -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 { @@ -633490,7 +633729,7 @@ Object { "oscpu": "", "physicalCPUs": 0, "platform": "", - "preprocessedProfileVersion": 57, + "preprocessedProfileVersion": 58, "processType": 0, "product": "target/debug/examples/work_log (dhat)", "sourceURL": "", @@ -633498,10 +633737,101 @@ Object { "startTime": 0, "symbolicated": true, "toolkit": "", - "version": 31, + "version": 32, }, "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..03f2801ef5 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, @@ -53,7 +53,7 @@ Object { "symbolicated": true, "toolkit": undefined, "updateChannel": undefined, - "version": 31, + "version": 32, "visualMetrics": undefined, }, "pages": Array [], @@ -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 { @@ -6384,7 +6389,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pausedRanges": Array [], "processes": Array [ @@ -7840,7 +7845,7 @@ Object { "stackwalk": 1, "startTime": 1460221352723.438, "toolkit": "cocoa", - "version": 31, + "version": 32, }, "pages": Array [ Object { @@ -9377,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, @@ -9386,6 +9391,15 @@ Object { "version": 3, }, "shared": Object { + "sources": Object { + "filename": Array [ + 10, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -9496,13 +9510,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9539,6 +9546,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -9854,13 +9868,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -9897,6 +9904,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10212,13 +10226,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 10, - ], "isJS": Array [ false, false, @@ -10255,6 +10262,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -10910,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, @@ -10919,6 +10933,15 @@ Object { "version": 4, }, "shared": Object { + "sources": Object { + "filename": Array [ + 11, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -11032,13 +11055,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11075,6 +11091,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11414,13 +11437,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - ], "isJS": Array [ false, false, @@ -11457,6 +11473,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -11792,15 +11815,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 11, - null, - null, - ], "isJS": Array [ false, false, @@ -11847,6 +11861,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { @@ -12576,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, @@ -12611,6 +12634,15 @@ Object { }, ], "shared": Object { + "sources": Object { + "filename": Array [ + 12, + ], + "length": 1, + "uuid": Array [ + null, + ], + }, "stringArray": Array [ "VsyncTimestamp", "Reflow", @@ -12725,13 +12757,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -12768,6 +12793,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13119,13 +13151,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - ], "isJS": Array [ false, false, @@ -13162,6 +13187,13 @@ Object { -1, 1, ], + "source": Array [ + null, + null, + null, + null, + 0, + ], }, "isMainThread": true, "markers": Object { @@ -13499,15 +13531,6 @@ Object { null, null, ], - "fileName": Array [ - null, - null, - null, - null, - 12, - null, - null, - ], "isJS": Array [ false, false, @@ -13554,6 +13577,15 @@ Object { -1, -1, ], + "source": Array [ + null, + null, + null, + null, + 0, + null, + null, + ], }, "isMainThread": true, "markers": Object { 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 552737cfc8..7bb7b38e21 100644 --- a/src/test/unit/fetch-source.test.ts +++ b/src/test/unit/fetch-source.test.ts @@ -4,11 +4,14 @@ 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( await fetchSource( 'hg:hg.mozilla.org/mozilla-central:widget/cocoa/nsAppShell.mm:997f00815e6bc28806b75448c8829f0259d2cb28', + null, 'https://symbolication.services.mozilla.com', null, new Map(), @@ -25,6 +28,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -66,16 +72,24 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }; + const fetchJSSourceFromBrowser = async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }; const archiveCache = new Map>(); expect( await fetchSource( 'cargo:github.com-1ecc6299db9ec823:addr2line-0.17.0:src/lib.rs', + null, 'https://symbolication.services.mozilla.com', null, archiveCache, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -90,10 +104,15 @@ 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, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'SUCCESS', @@ -106,10 +125,15 @@ 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, - { fetchUrlResponse, queryBrowserSymbolicationApi } + { + fetchUrlResponse, + queryBrowserSymbolicationApi, + fetchJSSourceFromBrowser, + } ) ).toEqual({ type: 'ERROR', @@ -129,6 +153,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(), @@ -143,6 +168,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({ @@ -161,6 +189,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', @@ -186,6 +215,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({ @@ -199,6 +231,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', @@ -236,6 +269,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -249,6 +285,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', @@ -286,6 +323,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -299,6 +339,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', @@ -334,6 +375,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -347,6 +391,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', @@ -364,6 +409,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -391,6 +439,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(), @@ -404,6 +453,9 @@ describe('fetchSource', function () { ) => { throw new Error('No browser connection'); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -416,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', @@ -436,6 +489,9 @@ describe('fetchSource', function () { } return '[Invalid \\ JSON}'; }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -456,6 +512,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', @@ -481,6 +538,9 @@ describe('fetchSource', function () { hahaYouThoughtThereWouldBeSourceHereButNo: 42, }); }, + fetchJSSourceFromBrowser: async (_sourceUuid: string) => { + throw new Error('No browser connection'); + }, } ) ).toEqual({ @@ -496,4 +556,111 @@ 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: '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', + }, + ], + }); + }); + + 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', + }); + }); }); 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); + }); + }); +}); diff --git a/src/test/unit/line-timings.test.ts b/src/test/unit/line-timings.test.ts index 17de471bfc..e6d096ea77 100644 --- a/src/test/unit/line-timings.test.ts +++ b/src/test/unit/line-timings.test.ts @@ -30,12 +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 + fileOneSourceIndex ); // Expect the returned arrays to have the same length as the stackTable. @@ -49,11 +51,12 @@ describe('getLineTimings for getStackLineInfo', function () { 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 + fileSourceIndex ); return getLineTimings(stackLineInfo, samples); } 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/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 + ); + }); +}); diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index f3cf45ed6f..5844b04eb1 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 { @@ -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]; @@ -891,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); + }); +}); diff --git a/src/test/unit/profile-data.test.ts b/src/test/unit/profile-data.test.ts index 80bd0a3bb1..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 () { @@ -261,10 +262,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); @@ -1378,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', @@ -1390,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', @@ -1400,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/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/test/unit/query-api.test.ts b/src/test/unit/query-api.test.ts index 8bc98d07cc..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'); + }) + ), }; } @@ -271,6 +277,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; 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' + ); + }); }); 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..26100e117f --- /dev/null +++ b/src/test/unit/source-code-cache.test.ts @@ -0,0 +1,168 @@ +/* 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 { + beginLoadingSourceCodeFromUrl, + beginLoadingSourceCodeFromBrowserConnection, + finishLoadingSourceCode, + failLoadingSourceCode, +} from '../../actions/code'; + +import type { 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; + } + + it('returns undefined when no source code is cached', function () { + const { getState } = setupStoreWithSourceIndex(0); + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is null', function () { + const { getState } = setupStoreWithSourceIndex(null); + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('returns undefined when sourceIndex is not in cache', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(999); + // Add some other source to cache but not index 999 + dispatch(finishLoadingSourceCode(0, 'some code')); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toBeUndefined(); + }); + + it('retrieves cached source code for AVAILABLE status', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(0); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('retrieves cached source code for LOADING status with URL', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(2); + dispatch( + beginLoadingSourceCodeFromUrl(2, 'https://example.com/source2.js') + ); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'URL', url: 'https://example.com/source2.js' }, + }); + }); + + it('retrieves cached source code for ERROR status', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(3); + dispatch( + failLoadingSourceCode(3, [ + { + type: 'NETWORK_ERROR', + url: 'https://example.com/source3.js', + networkErrorMessage: 'Failed to fetch', + }, + ]) + ); + + const sourceViewCode = getSourceViewCode(getState()); + 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 { getState, dispatch } = setupStoreWithSourceIndex(4); + dispatch(beginLoadingSourceCodeFromBrowserConnection(4)); + + const sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'LOADING', + source: { type: 'BROWSER_CONNECTION' }, + }); + }); + + describe('getSourceCodeCache selector', function () { + it('returns the cache Map with cached entries', function () { + const { getState, dispatch } = setupStoreWithSourceIndex(null); + dispatch(finishLoadingSourceCode(0, 'console.log("Source 0");')); + + const result = getSourceCodeCache(getState()); + expect(result).toBeInstanceOf(Map); + expect(result.get(0)).toEqual({ + type: 'AVAILABLE', + code: 'console.log("Source 0");', + }); + }); + + it('returns empty Map when no cache is set', function () { + const { getState } = setupStoreWithSourceIndex(null); + + const result = getSourceCodeCache(getState()); + expect(result).toBeInstanceOf(Map); + expect(result.size).toBe(0); + }); + }); + + 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')); + + let sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode?.type).toBe('LOADING'); + + dispatch(finishLoadingSourceCode(0, 'const result = 42;')); + + sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'AVAILABLE', + code: 'const result = 42;', + }); + }); + + 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' }])); + + sourceViewCode = getSourceViewCode(getState()); + expect(sourceViewCode).toEqual({ + type: 'ERROR', + errors: [{ type: 'NO_KNOWN_CORS_URL' }], + }); + }); + }); +}); 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/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-derived.ts b/src/types/profile-derived.ts index b2e444deea..af23ef1028 100644 --- a/src/types/profile-derived.ts +++ b/src/types/profile-derived.ts @@ -32,6 +32,8 @@ import type { WeightType, IndexIntoFrameTable, IndexIntoSubcategoryListForCategory, + SourceTable, + IndexIntoSourceTable, } from './profile'; import type { IndexedArray } from './utils'; import type { BitSet } from '../utils/bitset'; @@ -100,6 +102,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; @@ -768,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/profile.ts b/src/types/profile.ts index 645b21779e..90460a31a5 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 @@ -331,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; @@ -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; }; /** diff --git a/src/types/state.ts b/src/types/state.ts index 59a388782a..08df9b8213 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 = { @@ -329,6 +330,12 @@ export type SourceCodeLoadingError = type: 'ARCHIVE_PARSING_ERROR'; url: string; parsingErrorMessage: string; + } + | { + type: 'NOT_PRESENT_IN_BROWSER'; + sourceUuid: string; + url: string; + errorMessage: string; }; export type ProfileSpecificUrlState = { @@ -384,7 +391,7 @@ export type PseudoStrategy = null | 'bidi' | 'accented'; export type IconsWithClassNames = Map; export type CodeState = { - readonly sourceCodeCache: Map; + readonly sourceCodeCache: Map; readonly assemblyCodeCache: Map; }; diff --git a/src/utils/fetch-source.ts b/src/utils/fetch-source.ts index b771ce9086..4ad15da0db 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>, @@ -85,6 +88,27 @@ 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, + }; + } + } catch (e) { + errors.push({ + type: 'NOT_PRESENT_IN_BROWSER', + sourceUuid, + url: file, + errorMessage: e.toString(), + }); + } + } + // 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..6033f182fe 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); + } }