tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit ae7ec10a5d3a1cd52d0fc6051d92573d1749e6ec
parent 805b956f6fdc25da671e567a178cf405313ee46d
Author: Nazım Can Altınova <canaltinova@gmail.com>
Date:   Tue, 21 Oct 2025 21:15:36 +0000

Bug 1979114 - Convert the JS sources into JS objects in additionalInfo r=mstange,profiler-reviewers,iain

We convert the JS sources into an object of objects that can hold
`uuid -> source text` map. That way we can keep this object
inside the JS codebase.

Differential Revision: https://phabricator.services.mozilla.com/D259268

Diffstat:
Mdevtools/client/performance-new/@types/gecko.d.ts | 5+++++
Mtools/profiler/core/ProfileAdditionalInformation.cpp | 36++++++++++++++++++++++++++++++++++++
Mtools/profiler/public/ProfileAdditionalInformation.h | 6++++++
3 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/devtools/client/performance-new/@types/gecko.d.ts b/devtools/client/performance-new/@types/gecko.d.ts @@ -160,8 +160,13 @@ declare namespace MockedExports { arch: string; } + type JSSources = Partial<{ + [sourceUuid: string]: string; + }>; + interface ProfileGenerationAdditionalInformation { sharedLibraries: SharedLibrary[]; + jsSources: JSSources; } interface ProfileAndAdditionalInformation { diff --git a/tools/profiler/core/ProfileAdditionalInformation.cpp b/tools/profiler/core/ProfileAdditionalInformation.cpp @@ -16,6 +16,26 @@ #ifdef MOZ_GECKO_PROFILER # include "platform.h" +JSString* +mozilla::ProfileGenerationAdditionalInformation::CreateJSStringFromSourceData( + JSContext* aCx, const ProfilerJSSourceData& aSourceData) const { + return aSourceData.data().match( + [&](const ProfilerJSSourceData::SourceTextUTF16& srcText) -> JSString* { + return JS_NewUCStringCopyN(aCx, srcText.chars().get(), + srcText.length()); + }, + [&](const ProfilerJSSourceData::SourceTextUTF8& srcText) -> JSString* { + return JS_NewStringCopyN(aCx, srcText.chars().get(), srcText.length()); + }, + [&](const ProfilerJSSourceData::RetrievableFile&) -> JSString* { + // FIXME: Implement this later. + return JS_NewStringCopyZ(aCx, "[unavailable]"); + }, + [&](const ProfilerJSSourceData::Unavailable&) -> JSString* { + return JS_NewStringCopyZ(aCx, "[unavailable]"); + }); +} + void mozilla::ProfileGenerationAdditionalInformation::ToJSValue( JSContext* aCx, JS::MutableHandle<JS::Value> aRetVal) const { // Get the shared libraries array. @@ -32,8 +52,24 @@ void mozilla::ProfileGenerationAdditionalInformation::ToJSValue( buffer16.Length(), &sharedLibrariesVal)); } + // Create jsSources object, which is UUID to source text mapping for + // WebChannel. + JS::Rooted<JSObject*> jsSourcesObj(aCx, JS_NewPlainObject(aCx)); + if (jsSourcesObj) { + for (const auto& entry : mJSSourceEntries) { + JSString* sourceStr = CreateJSStringFromSourceData(aCx, entry.sourceData); + if (sourceStr) { + JS::Rooted<JS::Value> sourceVal(aCx, JS::StringValue(sourceStr)); + JS_SetProperty(aCx, jsSourcesObj, PromiseFlatCString(entry.uuid).get(), + sourceVal); + } + } + } + JS::Rooted<JSObject*> additionalInfoObj(aCx, JS_NewPlainObject(aCx)); + JS::Rooted<JS::Value> jsSourcesVal(aCx, JS::ObjectValue(*jsSourcesObj)); JS_SetProperty(aCx, additionalInfoObj, "sharedLibraries", sharedLibrariesVal); + JS_SetProperty(aCx, additionalInfoObj, "jsSources", jsSourcesVal); aRetVal.setObject(*additionalInfoObj); } #endif // MOZ_GECKO_PROFILER diff --git a/tools/profiler/public/ProfileAdditionalInformation.h b/tools/profiler/public/ProfileAdditionalInformation.h @@ -81,6 +81,12 @@ struct ProfileGenerationAdditionalInformation { void ToJSValue(JSContext* aCx, JS::MutableHandle<JS::Value> aRetVal) const; + friend IPC::ParamTraits<mozilla::ProfileGenerationAdditionalInformation>; + + private: + JSString* CreateJSStringFromSourceData( + JSContext* aCx, const ProfilerJSSourceData& aSourceData) const; + SharedLibraryInfo mSharedLibraries; nsTArray<JSSourceEntry> mJSSourceEntries; };