Open Bug 1287906 Opened 4 years ago Updated 2 years ago

SessionHistory.jsm creates many large duplicate large strings in .owner_b64 attributes

Categories

(Firefox :: Session Restore, defect, P3)

defect

Tracking

()

People

(Reporter: bkelly, Unassigned)

Details

(Whiteboard: [MemShrink:P2])

Attachments

(1 file, 1 obsolete file)

After browsing for a few hours I find I have many relatively large and duplicate strings in my parent process:

│   │  │  │   ├──0.49 MB (00.19%) ++ string(length=6764, copies=63, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAAAAAAQnZ7Rrl1EAEv+Anzrkj2ayzxMCuvV5MrYfgjSENuz+fAd6UctCANBHTk5kAEEug/UCSBzpUbXhPMJE6uHGBMgjGAAAAAv////8AAAG7AQAAABRodHRwczovL3R3aXR0ZXIuY29tLwAAAAAAAAAFAAAACAAAAAsAAAAI/////wAAAAj/////AAAACAAAAAsAAAATAAAAAQAAABMAAAABAAAAEwAAAAEAAAAUAAAAAAAAABT/////AAAAAP////8AAAAT/////wAAABP/////AQAAAAAAAAAAAAEAAAABAAAJBwBzAGMAcgBpAHAAdAAtAHMAcgBjACAAaAB0AHQAcABzADoALwAvAGMAbwBuAG4AZQBjAHQALgBmAGEAYwBlAGIAbwBvAGsALgBuAGUAdAAgAGgAdAB0AHAAcwA6AC8ALwBjAG0ALgBnAC4AZABvAHUAYgBsAGUAYwBsAGkAYwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AcwBzAGwALgBnAG8AbwBnAGwAZQAtAGEAbgBhAGwAeQB0AGkAYwBzAC4AYwBvAG0AIABoAHQAdABwAHMAOgAvAC8AZwByAGEAcABoAC4AZgBhAGMAZQBiAG8AbwBrAC4AYwBvAG0AIABoAHQAdABwAHMAOgAvAC8AdAB3AGkAdAB0AGUAcgAuAGMAbwBtACAAJwB1AG4AcwBhAGYAZQAtAGUAdgB" (truncated))
│   │  │  │   ├──0.46 MB (00.17%) ++ string(<non-notable strings>)
│   │  │  │   ├──0.33 MB (00.12%) ── string(length=4, copies=14401, "sync")/gc-heap/latin1
│   │  │  │   ├──0.14 MB (00.05%) ++ string(length=6764, copies=18, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAf/////AAAAB/////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAE/////8AAAAA/////wAAABL/////AAAAEv////8BAAAAAAAAAAAAAQAAAAAAAQnZ7Rrl1EAEv+Anzrkj2ayzxMCuvV5MrYfgjSENuz+fAd6UctCANBHTk5kAEEug/UCSBzpUbXhPMJE6uHGBMgjGAAAAAv////8AAAG7AQAAABRodHRwczovL3R3aXR0ZXIuY29tLwAAAAAAAAAFAAAACAAAAAsAAAAH/////wAAAAf/////AAAACAAAAAsAAAATAAAAAQAAABMAAAABAAAAEwAAAAEAAAAUAAAAAAAAABP/////AAAAAP////8AAAAS/////wAAABL/////AQAAAAAAAAAAAAEAAAABAAAJBwBzAGMAcgBpAHAAdAAtAHMAcgBjACAAaAB0AHQAcABzADoALwAvAGMAbwBuAG4AZQBjAHQALgBmAGEAYwBlAGIAbwBvAGsALgBuAGUAdAAgAGgAdAB0AHAAcwA6AC8ALwBjAG0ALgBnAC4AZABvAHUAYgBsAGUAYwBsAGkAYwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AcwBzAGwALgBnAG8AbwBnAGwAZQAtAGEAbgBhAGwAeQB0AGkAYwBzAC4AYwBvAG0AIABoAHQAdABwAHMAOgAvAC8AZwByAGEAcABoAC4AZgBhAGMAZQBiAG8AbwBrAC4AYwBvAG0AIABoAHQAdABwAHMAOgAvAC8AdAB3AGkAdAB0AGUAcgAuAGMAbwBtACAAJwBuAG8AbgBjAGUALQBrAGYATwB" (truncated))
│   │  │  │   ├──0.07 MB (00.03%) ++ string(length=6856, copies=9, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAN2h0dHBzOi8vdHdpdHRlci5jb20vYW1iZXJ0cnVlL3N0YXR1cy83NTU0NTA0ODI1ODAwNzA0MDEAAAAAAAAABQAAAAgAAAALAAAACP////8AAAAI/////wAAAAgAAAALAAAAEwAAACQAAAATAAAAJAAAABMAAAASAAAAJQAAABIAAAAl/////wAAAAD/////AAAAE/////8AAAAT/////wEAAAAAAAAAAAABAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAN2h0dHBzOi8vdHdpdHRlci5jb20vYW1iZXJ0cnVlL3N0YXR1cy83NTU0NTA0ODI1ODAwNzA0MDEAAAAAAAAABQAAAAgAAAALAAAACP////8AAAAI/////wAAAAgAAAALAAAAEwAAACQAAAATAAAAJAAAABMAAAASAAAAJQAAABIAAAAl/////wAAAAD/////AAAAE/////8AAAAT/////wEAAAAAAAAAAAABAAAAAQAACQcAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawA" (truncated))
│   │  │  │   ├──0.07 MB (00.03%) ++ string(length=6860, copies=9, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAOWh0dHBzOi8vdHdpdHRlci5jb20

Over time these seems to grow.

I took a gc/cc log and traced them to the .owner_b64 attributes being created by SessionStore:

https://dxr.mozilla.org/mozilla-central/source/mobile/android/components/SessionStore.js#1136
Component: General → Session Restore
I think I am triggering this because I have certain tabs I keep open for long periods and navigate a lot within them on the same origin.  For example, twitter, gmail, and irccloud.
Since twitter creates an iframe for every tweet in your timeline it tends to hit this code *a lot*.
Summary: SessionStore.js creates many large duplicate large strings in .owner_b64 attributes → SessionHistory.jsm creates many large duplicate large strings in .owner_b64 attributes
Assignee: nobody → bkelly
Status: NEW → ASSIGNED
To further illustrate what happens over time, I have string entries like this after a day or two of using twitter:

2.75 MB (01.01%) -- string(length=6764, copies=351, "ZT4OT...
1.06 MB (00.39%) ++ string(length=6764, copies=135, "ZT4OTT...
0.42 MB (00.16%) ++ string(length=6764, copies=54, "ZT4OT...
Alternatively, we sometimes don't seem to retain these strings at all.  It might be when we don't have a previous session to restore.  I'm not sure, though.  Not retaining them would clearly be better...
Whiteboard: [MemShrink] → [MemShrink:P2]
I'm not working this at the moment.
Assignee: bkelly → nobody
Status: ASSIGNED → NEW
Who will?
Flags: needinfo?(bkelly)
I don't know.  Its also not a major problem, to be honest.  We could be more memory efficient here, but its not at crisis levels.  Overall I think we need an owner for session store and a concerted project to improve it.
Flags: needinfo?(bkelly)
Alright. I'm the owner and a concerted project to improve it is being booted up.
Awesome! Is there a meta bug for new efforts here?
I forwarded you a write-up of what we're planning to do, meta bugs are planned for this week.
FWIW, I'm still seeing this on FF58:

│   │  │  │  ├───8.61 MB (02.86%) ++ string(length=13960, copies=550, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAE5YAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│   │  │  │  ├───6.89 MB (02.29%) ++ string(length=13960, copies=440, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAE5YAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│   │  │  │  ├───4.48 MB (01.49%) ++ string(length=13960, copies=286, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAE5YAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│   │  │  │  ├───3.61 MB (01.20%) ++ string(<non-notable strings>)
│   │  │  │  └───3.44 MB (01.14%) ++ string(length=13960, copies=220, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAA

Note, these are using much more memory than in comment 0.

I wonder if we could change session store code to use transferable ArrayBuffers instead of strings.  I think we do a lot of copying to the session store worker as well.
Main Process
Explicit Allocations

1,129.03 MB (100.0%) -- explicit
├────840.51 MB (74.45%) -- js-non-window
│    ├──794.82 MB (70.40%) -- zones
│    │  ├──785.04 MB (69.53%) -- zone(0x213c422b000)
│    │  │  ├──666.14 MB (59.00%) -- strings
│    │  │  │  ├──286.07 MB (25.34%) -- string(length=13972, copies=18282, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAHGh0dHBzOi8vdHdpdHRlci5jb20veWFuYW5hbl8AAAAAAAAABQAAAAgAAAALAAAAB/////8AAAAH/////wAAAAgAAAALAAAAEwAAAAkAAAATAAAACQAAABMAAAABAAAAFAAAAAgAAAAT/////wAAAAD/////AAAAEv////8AAAAS/////wEAAAAAAAAAAAAAAAEJ2e0a5dRABL/gJ865I9mss8TArr1eTK2H4I0hDbs/nwHelHLQgDQR05OZABBLoP1Akgc6VG14TzCROrhxgTIIxgAAAAL/////AAABuwEAAAAcaHR0cHM6Ly90d2l0dGVyLmNvbS95YW5hbmFuXwAAAAAAAAAFAAAACAAAAAsAAAAH/////wAAAAf/////AAAACAAAAAsAAAATAAAACQAAABMAAAAJAAAAEwAAAAEAAAAUAAAACAAAABP/////AAAAAP////8AAAAS/////wAAABL/////AQAAAAAAAAAAAAEAABOTAHMAYwByAGkAcAB0AC0AcwByAGMAIAAnAHUAbgBzAGEAZgBlAC0AaQBuAGwAaQBuAGUAJwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwB" (truncated))
│    │  │  │  │  ├──285.66 MB (25.30%) ── malloc-heap/latin1
│    │  │  │  │  └────0.42 MB (00.04%) ── gc-heap/latin1
│    │  │  │  ├──183.56 MB (16.26%) ++ (1475 tiny)
│    │  │  │  ├──179.70 MB (15.92%) -- string(length=14020, copies=11484, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAALmh0dHBzOi8vdHdpdHRlci5jb20vc2VhcmNoLWFkdmFuY2VkP2xhbmc9emgtY24AAAAAAAAABQAAAAgAAAALAAAACP////8AAAAI/////wAAAAgAAAALAAAAEwAAABsAAAATAAAAEAAAABMAAAABAAAAFAAAAA8AAAAU/////wAAAAD/////AAAAJAAAAAoAAAAT/////wEAAAAAAAAAAAAAAAEJ2e0a5dRABL/gJ865I9mss8TArr1eTK2H4I0hDbs/nwHelHLQgDQR05OZABBLoP1Akgc6VG14TzCROrhxgTIIxgAAAAL/////AAABuwEAAAAuaHR0cHM6Ly90d2l0dGVyLmNvbS9zZWFyY2gtYWR2YW5jZWQ/bGFuZz16aC1jbgAAAAAAAAAFAAAACAAAAAsAAAAI/////wAAAAj/////AAAACAAAAAsAAAATAAAAGwAAABMAAAAQAAAAEwAAAAEAAAAUAAAADwAAABT/////AAAAAP////8AAAAkAAAACgAAABP/////AQAAAAAAAAAAAAEAABOTAHMAYwByAGkAcAB0AC0AcwByAGMAIAAnAHUAbgBzAGEAZgBlAC0AaQBuAGwAaQBuAGUAJwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgB" (truncated))
│    │  │  │  │  ├──179.44 MB (15.89%) ── malloc-heap/latin1
│    │  │  │  │  └────0.26 MB (00.02%) ── gc-heap/latin1
│    │  │  │  └───16.81 MB (01.49%) ++ string(<non-notable strings>)

after long run (some hours) in Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0 ID:20171002220204.

Probably useful: bug 1388239; https://addons.mozilla.org/firefox/addon/undoclosetabbutton/ 4.0.0 installed.
Long-running Firefox sessions with modern websites can accumulate
numerous serialized principal strings for session history.  Even short
sessions can accumulate ~10MB of duplicated strings, and users have
reported 10s or even 100s of MB of duplicated strings.  Let's cache the
string we generate for a given principal so we don't wind up with a
bunch of duplicate strings.

This patch essentially updates bkelly's patch for the code moving around; using
a WeakMap also seemed more idiomatic.
Attachment #8966708 - Flags: review?(mdeboer)
Attachment #8772999 - Attachment is obsolete: true
Just to provide more data points, from my current Nightly:

│  │  │  │    ├──551.27 MB (06.57%) -- (2735 tiny)
│  │  │  │    │  ├───78.68 MB (00.94%) ++ string(<non-notable strings>)
│  │  │  │    │  ├───53.20 MB (00.63%) ++ string(length=13240, copies=680, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEogAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│  │  │  │    │  ├───38.55 MB (00.46%) ++ string(length=20213393, copies=1, "{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/C%2B%2B_Portability_Guide","title":"C++ portability guide - Mozilla | MDN","ID":2865455139,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":1,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code | MDN","ID":2865455140,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":2,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code - Mozilla | MDN","ID":2865455141,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","originalURI":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","resultPrincipalURI":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","loadReplace":true,"loadReplace2":true,"principalToInher" (truncated))
│  │  │  │    │  ├───38.55 MB (00.46%) ++ string(length=20213403, copies=1, "{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/C%2B%2B_Portability_Guide","title":"C++ portability guide - Mozilla | MDN","ID":2865455139,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":1,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code | MDN","ID":2865455140,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":2,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code - Mozilla | MDN","ID":2865455141,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","originalURI":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","resultPrincipalURI":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","loadReplace":true,"loadReplace2":true,"principalToInher" (truncated))
│  │  │  │    │  ├───38.55 MB (00.46%) ++ string(length=20210533, copies=1, "{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/C%2B%2B_Portability_Guide","title":"C++ portability guide - Mozilla | MDN","ID":2865455139,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":1,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code | MDN","ID":2865455140,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":2,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code - Mozilla | MDN","ID":2865455141,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","originalURI":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","resultPrincipalURI":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","loadReplace":true,"loadReplace2":true,"principalToInher" (truncated))
│  │  │  │    │  ├───38.55 MB (00.46%) ++ string(length=20208496, copies=1, "{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/C%2B%2B_Portability_Guide","title":"C++ portability guide - Mozilla | MDN","ID":2865455139,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":1,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code | MDN","ID":2865455140,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":2,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code - Mozilla | MDN","ID":2865455141,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","originalURI":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","resultPrincipalURI":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","loadReplace":true,"loadReplace2":true,"principalToInher" (truncated))
│  │  │  │    │  ├───17.56 MB (00.21%) ++ string(length=13224, copies=1122, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEoIAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│  │  │  │    │  ├───17.56 MB (00.21%) ++ string(length=14088, copies=1122, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAIGh0dHBzOi8vdHdpdHRlci5jb20vZGF2aWRfc2Fua2VsAAAAAAAAAAUAAAAIAAAACwAAAAf/////AAAAB/////8AAAAIAAAACwAAABMAAAANAAAAEwAAAA0AAAATAAAAAQAAABQAAAAMAAAAE/////8AAAAA/////wAAABL/////AAAAEv////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAIGh0dHBzOi8vdHdpdHRlci5jb20vZGF2aWRfc2Fua2VsAAAAAAAAAAUAAAAIAAAACwAAAAf/////AAAAB/////8AAAAIAAAACwAAABMAAAANAAAAEwAAAA0AAAATAAAAAQAAABQAAAAMAAAAE/////8AAAAA/////wAAABL/////AAAAEv////8BAAAAAAAAAAAAAQAAE7oAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQB" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=12600, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAOGh0dHBzOi8vdHdpdHRlci5jb20vU2h1dFVwU2hvdy9zdGF0dXMvODk4NTkwMDY4MTg4ODcyNzA0AAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAAlAAAAEwAAACUAAAATAAAAEwAAACYAAAASAAAAJv////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAOGh0dHBzOi8vdHdpdHRlci5jb20vU2h1dFVwU2hvdy9zdGF0dXMvODk4NTkwMDY4MTg4ODcyNzA0AAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAAlAAAAEwAAACUAAAATAAAAEwAAACYAAAASAAAAJv////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEXQAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwB" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=13224, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEoIAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAJwBuAG8AbgBjAGUALQBBAEYAaAA2AEkALwByADEAdQBMAHkAWgA0AEwAbgBHADQASgA0AHoAWgB3AD0APQAnACAAaAB" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=13224, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEoIAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAJwBuAG8AbgBjAGUALQB5AHQARwBwAFYARAA2AHMATwBJADcAUwBMAEMAaABCAFcAMQBUAFEANABnAD0APQAnACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=13224, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEoIAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAJwBuAG8AbgBjAGUALQBUAG8AMwBJAGUAMABmAGoAawA2AHgAVQBmAFEAUwB3AGsAVgAvAGkATgBnAD0APQAnACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=13240, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEogAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAA" (truncated))
│  │  │  │    │  ├────5.85 MB (00.07%) ++ string(length=13312, copies=374, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAANWh0dHBzOi8vdHdpdHRlci5jb20vcGF0aW8xMS9zdGF0dXMvOTM2NjE1MDQzMTI2MzcwMzA2AAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAAiAAAAEwAAACIAAAATAAAAEAAAACMAAAASAAAAI/////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAANWh0dHBzOi8vdHdpdHRlci5jb20vcGF0aW8xMS9zdGF0dXMvOTM2NjE1MDQzMTI2MzcwMzA2AAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAAiAAAAEwAAACIAAAATAAAAEAAAACMAAAASAAAAI/////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEoIAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB" (truncated))
│  │  │  │    │  ├────5.32 MB (00.06%) ++ string(length=13240, copies=340, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAFGh0dHBzOi8vdHdpdHRlci5jb20vAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAABAAAAEwAAAAEAAAATAAAAAQAAABQAAAAAAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEogAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAdQBuAHMAYQBmAGUALQBlAHYAYQBsACcAIAB" (truncated))
│  │  │  │    │  ├────5.32 MB (00.06%) ++ string(length=13272, copies=340, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAIGh0dHBzOi8vdHdpdHRlci5jb20vc3R5bGV3YXJuaW5nAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAANAAAAEwAAAA0AAAATAAAAAQAAABQAAAAMAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAIGh0dHBzOi8vdHdpdHRlci5jb20vc3R5bGV3YXJuaW5nAAAAAAAAAAUAAAAIAAAACwAAAAj/////AAAACP////8AAAAIAAAACwAAABMAAAANAAAAEwAAAA0AAAATAAAAAQAAABQAAAAMAAAAFP////8AAAAA/////wAAABP/////AAAAE/////8BAAAAAAAAAAAAAQAAEogAcwBjAHIAaQBwAHQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwBjAG8AbgBuAGUAYwB0AC4AZgBhAGMAZQBiAG8AbwBrAC4AbgBlAHQAIABoAHQAdABwAHMAOgAvAC8AYwBtAC4AZwAuAGQAbwB1AGIAbABlAGMAbABpAGMAawAuAG4AZQB0ACAAaAB0AHQAcABzADoALwAvAHMAcwBsAC4AZwBvAG8AZwBsAGUALQBhAG4AYQBsAHkAdABpAGMAcwAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAGcAcgBhAHAAaAAuAGYAYQBjAGUAYgBvAG8AawAuAGMAbwBtACAAaAB0AHQAcABzADoALwAvAHQAdwBpAHQAdABlAHIALgBjAG8AbQAgACcAbgB" (truncated))
│  │  │  │    │  ├────2.27 MB (00.03%) ++ string(length=26, copies=42510, "triggeringPrincipal_base64")
│  │  │  │    │  ├────2.18 MB (00.03%) ++ string(length=44, copies=31705, "SmIS26zLEdO3ZQBgsLbOywAAAAAAAAAAwAAAAAAAAEY=")
│  │  │  │    │  ├────1.98 MB (00.02%) ++ string(length=25, copies=37116, "principalToInherit_base64")
│  │  │  │    │  ├────1.70 MB (00.02%) ++ string(length=580, copies=1700, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAA7Gh0dHBzOi8vbWFpbC5nb29nbGUuY29tL18vc2NzL21haWwtc3RhdGljL18vanMvaz1nbWFpbC5tYWluLmVuLmxyLU5kcW1PVFVzLk8vbT1wZHMscGRsLHBkaXQsbV9pLHBkdCx0L2FtPXZ2Y0UyQUY1LXdFRUFMUWpERHRJU0NzUVp2N1BNVXNUZUprQk1mN192d2NBQnFrQndCWEEzOXdIMURrQUFBQUFBQUFBQUFBQUFBQUFBQURBZ3NJbi9ydD1oL2Q9MS9ycz1BSEdXcTlDclFzY3VBenItenk0UVhUN0NSOHpPYkVpSDdBAAAAAAAAAAUAAAAIAAAADwAAAAj/////AAAACP////8AAAAIAAAADwAAABcAAADVAAAAFwAAANUAAAAXAAAAsAAAAMcAAAAlAAAAx/////8AAAAA/////wAAABf/////AAAAF/////8BAAAAAAAAAAAAAAAA")
│  │  │  │    │  ├────1.26 MB (00.02%) ++ string(length=360, copies=3368, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAFABAAAAR2h0dHA6Ly93d3cubmV3c2JsdXIuY29tL3NpdGUvMTQ4ODEwNC9mZWVkcy5mZWVkYnVybmVyLmNvbWJldHdlZW4yd29ybGRzAAAAAAAAAAQAAAAHAAAAEAAAAAf/////AAAAB/////8AAAAHAAAAEAAAABcAAAAwAAAAFwAAADAAAAAXAAAADgAAACUAAAAQAAAANgAAABEAAAAA/////wAAABf/////AAAAF/////8BAAAAAAAAAAAAAAAA")
│  │  │  │    │  ├────1.21 MB (00.01%) ── string(length=18, copies=39516, "resultPrincipalURI")/gc-heap/latin1
│  │  │  │    │  ├────1.11 MB (00.01%) ── string(length=6, copies=48316, "scroll")/gc-heap/latin1
│  │  │  │    │  ├────1.07 MB (00.01%) ++ string(length=3292, copies=272, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAOGh0dHBzOi8vZ2l0aHViLmNvbS9sdXNlci9ydXN0LWdkYi1yZW1vdGUtcHJvdG9jb2wvcHVsbC8yAAAAAAAAAAUAAAAIAAAACgAAAAj/////AAAACP////8AAAAIAAAACgAAABIAAAAmAAAAEgAAACYAAAASAAAAJQAAADcAAAABAAAAN/////8AAAAA/////wAAABL/////AAAAEv////8BAAAAAAAAAAAAAAABCdntGuXUQAS/4CfOuSPZrLPEwK69Xkyth+CNIQ27P58B3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAOGh0dHBzOi8vZ2l0aHViLmNvbS9sdXNlci9ydXN0LWdkYi1yZW1vdGUtcHJvdG9jb2wvcHVsbC8yAAAAAAAAAAUAAAAIAAAACgAAAAj/////AAAACP////8AAAAIAAAACgAAABIAAAAmAAAAEgAAACYAAAASAAAAJQAAADcAAAABAAAAN/////8AAAAA/////wAAABL/////AAAAEv////8BAAAAAAAAAAAAAQAAA9IAZABlAGYAYQB1AGwAdAAtAHMAcgBjACAAJwBuAG8AbgBlACcAOwAgAGIAYQBzAGUALQB1AHIAaQAgAGgAdAB0AHAAcwA6AC8ALwBnAGkAdABoAHUAYgAuAGMAbwBtADsAIABjAGgAaQBsAGQALQBzAHIAYwAgAGgAdAB0AHAAcwA6AC8ALwByAGUAbgBkAGUAcgAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtADsAIABjAG8AbgBuAGUAYwB0AC0AcwByAGMAIABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQA" (truncated))
│  │  │  │    │  ├────1.06 MB (00.01%) ++ string(length=15796, copies=17, "["dom","<style>.fade #center_col,.fade #rhs,.fade #leftnav,.fade #brs,.fade #footcnt{filter:alpha(opacity=33.3);opacity:0.333}.fade-hidden #center_col,.fade-hidden #rhs,.fade-hidden #leftnav{visibility:hidden}.flyr-o,.flyr-w{position:absolute;background-color:#fff;z-index:3;display:block;}.flyr-o{filter:alpha(opacity=66.6);opacity:0.666}.flyr-w{filter:alpha(opacity=20.0);opacity:0.2}.flyr-h{filter:alpha(opacity=0);opacity:0}.flyr-c{display:none}.flt,.flt u,a.fl{text-decoration:none}.flt:hover,.flt:hover u,a.fl:hover{text-decoration:underline}#knavm{color:#4273db;display:inline;font:11px arial,sans-serif !important;left:-13px;position:absolute;top:2px;z-index:2}#pnprev #knavm{bottom:1px;top:auto}#pnnext #knavm{bottom:1px;left:40px;top:auto}a.noline{outline:0}.y.yp{display:none}.y.yf,.y.ys{display:block}.yi{}._Rm{font-size:14px;}.kv,.slp{display:block;}.f,.f a:link{color:#808080}.a,cite,cite a:link,cite a:visited,.cite,.cite:link,#_bGc>i,.bc a:link{color:#006621;font-style:normal}a.fl:link,.fl a,.flt,a.flt,.gl" (truncated))
│  │  │  │    │  ├────1.04 MB (00.01%) ++ string(length=376, copies=2669, "ZT4OTT7kRfqycpfCC8AeuAAAAAAAAAAAwAAAAAAAAEYB3pRy0IA0EdOTmQAQS6D9QJIHOlRteE8wkTq4cYEyCMYAAAAC/////wAAAbsBAAAAU2h0dHBzOi8vaXJjY2xvdWQubW96aWxsYS5jb20vIyEvaXJjczovL2lyYzEuZG16LnNjbDMubW96aWxsYS5jb206NjY5Ny8lMjNkZXZlbG9wZXJzAAAAAAAAAAUAAAAIAAAAFAAAAAj/////AAAACP////8AAAAIAAAAFAAAABwAAAA3AAAAHAAAAAEAAAAcAAAAAQAAAB0AAAAAAAAAHf////8AAAAA/////wAAABz/////AAAAHgAAADUBAAAAAAAAAAAAAAAA")
│  │  │  │    │  ├────1.03 MB (00.01%) ── string(length=5, copies=45120, "title")/gc-heap/latin1
│  │  │  │    │  ├────1.03 MB (00.01%) ── string(length=3, copies=45066, "url")/gc-heap/latin1

and:

│  │  │  │    └──115.64 MB (01.38%) -- string(length=20208488, copies=1, "{"version":["sessionrestore",1],"windows":[{"tabs":[{"entries":[{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/C%2B%2B_Portability_Guide","title":"C++ portability guide - Mozilla | MDN","ID":2865455139,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":1,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code | MDN","ID":2865455140,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","resultPrincipalURI":null,"docIdentifier":2,"persist":true},{"url":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","title":"Using C++ in Mozilla code - Mozilla | MDN","ID":2865455141,"docshellUUID":"{35bc7f9d-f0c1-4ba6-bffe-e0194a06e1f0}","originalURI":"https://developer.mozilla.org/en-US/docs/Using_CXX_in_Mozilla_code","resultPrincipalURI":"https://developer.mozilla.org/en-US/docs/Mozilla/Using_CXX_in_Mozilla_code","loadReplace":true,"loadReplace2":true,"principalToInher" (truncated))
│  │  │  │       ├──115.64 MB (01.38%) ── malloc-heap/two-byte [3]
│  │  │  │       └────0.00 MB (00.00%) ── gc-heap/two-byte [3]

This seems a little out of control.
Comment on attachment 8966708 [details] [diff] [review]
deduplicate serialized principal strings in sessionstore's Utils.jsm

Review of attachment 8966708 [details] [diff] [review]:
-----------------------------------------------------------------

Thanks!
Attachment #8966708 - Flags: review?(mdeboer) → review+
Pushed by nfroyd@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/bc424899c8f8
deduplicate serialized principal strings in sessionstore's Utils.jsm; r=mikedeboer
I have zero idea why that test would fail, and why it would only fail on Windows and OSX.
Flags: needinfo?(nfroyd)
OK, it turns out that trying to use principals as weak map keys doesn't work:

Utils: Failed to serialize principal '[xpconnect wrapped (nsISupports, nsIPrincipal, nsISerializable) @ 0x203e0270ac0 (native @ 0x203d3b4f9e0)]' TypeError: cannot use the given object as a weak map key

which I guess is a good thing?

I'm not sure where to go from here.  I don't think the array-backed patch works very well with the current structure of the code.
Well, I guess what we could do is:

1. See if we _can_ use a regular `Map`. Otherwise we try an Array, but hmmmkay.
2. Then make the caching behavior opt-in:


```js
  get cacheSerializedPrincipals() {
    return !!this._cacheSerializedPrincipals;
  },

  set cacheSerializedPrincipals(val) {
    this._cacheSerializePrincipals = !!val;
    // Clear the cache when caching is disabled. This flip typically happens on
    // application shutdown, to prevent leaks.
    if (!this._cacheSerializePrincipals)
      this._serializedPrincipals.clear();
  },
```

And SessionStore.jsm does `Utils.cacheSerializedPrincipals = true;` on startup and `Utils.cacheSerializedPrincipals = false;` on shutdown, meaning it'll be in charge of the cache's lifecycle.

What do you think?
Priority: -- → P3
The problem is not so much the cache's lifecycle as the lifecycle of the things stored in the cache.  We don't want to permanently store the serialized principal strings; we want them to be dropped when we no longer need them.  The benefit of using principals as keys into the cache is that the entries in the cache (i.e. the cached strings) are tied to the lifetime of the individual principals.  When the principals go away (presumably when all pages associated with the principal do), the cache entries can be dropped.

But that doesn't work, as comment 21 says.  And I don't know how to tie the lifetime of the cached strings to the lifetime of the page(s) that need them.

Unless we cached the strings directly in the principal?  I think principals are immutable, so we can always return the same cached string once it's cached.  Does that seem workable, or garbage?
Flags: needinfo?(kmaglione+bmo)
(In reply to Nathan Froyd [:froydnj] from comment #23)
> Unless we cached the strings directly in the principal?  I think principals
> are immutable, so we can always return the same cached string once it's
> cached.  Does that seem workable, or garbage?

This sounds great!

Otherwise we might have to think up something a bit messier using `Cu.getWeakReference()`, perhaps?
One nice thing about bug 903519 is that it should make this happen automatically. When nursery strings become tenured, they get atomized, so they're automatically de-duplicated.

(In reply to Nathan Froyd [:froydnj] from comment #23)
> Unless we cached the strings directly in the principal?  I think principals
> are immutable, so we can always return the same cached string once it's
> cached.  Does that seem workable, or garbage?

Yes, they're immutable. We could certainly atomize the serialized strings when we generate them. We already do that for origin strings. The main problem is that when we convert them to JS strings, they'd almost certainly get copied rather than turned into external strings, so we'd still wind up with duplicated string data on the JS side.

There's also the problem that nsISerializable doesn't really know about strings. It just writes data to an output stream. I'm not sure how we'd make the serialization helper cache-aware.
Flags: needinfo?(kmaglione+bmo)
Incidentally... It would probably be a good idea to LZ4 compress serialized data. 6K for a serialized principal is kind of crazy. And there's really no good reason for it to be base64-encoded...
(In reply to Kris Maglione [:kmag] (long backlog; ping on IRC if you're blocked) from comment #25)
> One nice thing about bug 903519 is that it should make this happen
> automatically. When nursery strings become tenured, they get atomized, so
> they're automatically de-duplicated.

This would help, yes!  My day-old (2 days?  3?) session does not display a massive amount of strings in the session restore worker...I don't know whether it's due to that bug or due to the usage pattern not reproducing the conditions shown in earlier reports.

> (In reply to Nathan Froyd [:froydnj] from comment #23)
> > Unless we cached the strings directly in the principal?  I think principals
> > are immutable, so we can always return the same cached string once it's
> > cached.  Does that seem workable, or garbage?
> 
> Yes, they're immutable. We could certainly atomize the serialized strings
> when we generate them. We already do that for origin strings. The main
> problem is that when we convert them to JS strings, they'd almost certainly
> get copied rather than turned into external strings, so we'd still wind up
> with duplicated string data on the JS side.

WebIDL attempts to hand out refcounted buffers when possible IIRC; I guess xpconnect doesn't try similarly hard to do that?

> There's also the problem that nsISerializable doesn't really know about
> strings. It just writes data to an output stream. I'm not sure how we'd make
> the serialization helper cache-aware.

I think we'd provide a separate interface somewhere for principals to serialize to a string (nsICachingSerializable?), and then either use that directly or make the serialization helper aware of that.  But if the deduplication of strings is indeed working as expected, then perhaps there's not that much gain from trying to add a caching layer.

(In reply to Kris Maglione [:kmag] (long backlog; ping on IRC if you're blocked) from comment #26)
> Incidentally... It would probably be a good idea to LZ4 compress serialized
> data. 6K for a serialized principal is kind of crazy. And there's really no
> good reason for it to be base64-encoded...

Though perhaps we should see about trying to reduce this somewhat in a different bug?
(In reply to Nathan Froyd [:froydnj] from comment #27)
> WebIDL attempts to hand out refcounted buffers when possible IIRC; I guess
> xpconnect doesn't try similarly hard to do that?

It does. They actually use the same helpers for exporting strings to JS. But we currently only create external strings for UTF-16 strings, not CStrings, as far as I know. We may want to change that now that the JS engine supports latin1 strings, but I don't know how much work that would be.

Atom strings would at least be UTF-16, but I'm not sure whether they can be used as external strings, and returning base64 strings as UTF-16 is not great.

> > There's also the problem that nsISerializable doesn't really know about
> > strings. It just writes data to an output stream. I'm not sure how we'd make
> > the serialization helper cache-aware.
> 
> I think we'd provide a separate interface somewhere for principals to
> serialize to a string (nsICachingSerializable?), and then either use that
> directly or make the serialization helper aware of that.  But if the
> deduplication of strings is indeed working as expected, then perhaps there's
> not that much gain from trying to add a caching layer.

I think we should probably wait for nursery strings to be enabled and then decide after that whether it's still necessary.

> (In reply to Kris Maglione [:kmag] (long backlog; ping on IRC if you're
> blocked) from comment #26)
> > Incidentally... It would probably be a good idea to LZ4 compress serialized
> > data. 6K for a serialized principal is kind of crazy. And there's really no
> > good reason for it to be base64-encoded...
> 
> Though perhaps we should see about trying to reduce this somewhat in a
> different bug?

Yeah, I'll file a bug for it.
(In reply to Nathan Froyd [:froydnj] from comment #21)
> OK, it turns out that trying to use principals as weak map keys doesn't work

This should start working after I finish bug 1351501.
(In reply to Kris Maglione [:kmag] from comment #28)
> Yeah, I'll file a bug for it.

Kris, did end up filing this bug?
Flags: needinfo?(kmaglione+bmo)
Andrew, it looks like this patch still throws the following error:

Utils: Failed to serialize principal '[xpconnect wrapped (nsISupports, nsIPrincipal, nsISerializable)]' TypeError: cannot use the given object as a weak map key

...according to the try push in comment 30. Is there more to do perhaps, or are principals not cycle collected WebIDL objects?
Flags: needinfo?(continuation)
Ah, I didn't look at the original error closely enough. Yeah, my patch doesn't affect nsISupports things. I'm not sure how that can fail, though. Boris, do you know how an nsIPrincipal could end up causing TryPreserveWrapper to return false?
Flags: needinfo?(continuation) → needinfo?(bzbarsky)
It does look like the system principal at least is not wrapper cached, so I could see why it should fail here, but I'm not sure how that actually happens to fail in TryPreserveWrapper.
Principals are not on WebIDL bindings, so don't even end up in TryPreserveWrapper, because IsDOMObject(obj) tests false in PreserveWrapper.
Flags: needinfo?(bzbarsky)
(In reply to Boris Zbarsky [:bzbarsky, bz on IRC] from comment #35)
> Principals are not on WebIDL bindings, so don't even end up in
> TryPreserveWrapper, because IsDOMObject(obj) tests false in PreserveWrapper.

Ahh, right! I looked at the JS layer and the DOM layer, but I forgot about the XPConnect layer. Right, we gave up on supporting non-WebIDL things, or something like that.
One thing we could do, I guess, is come up with a scriptable API that takes a principal and hands out a (can-be-external) UTF-16 string.

Another thing we could do is add support for external nsCString and add a C++ principal-to-serialization cache that principal clear out when they go away.  Or we could have that cache store 2-byte strings.
(In reply to Boris Zbarsky [:bzbarsky, bz on IRC] from comment #37)
> Another thing we could do is add support for external nsCString and add a
> C++ principal-to-serialization cache that principal clear out when they go
> away.

External latin1 nsCStrings would probably be a big enough win on its own to justify the work.
Flags: needinfo?(kmaglione+bmo)
You need to log in before you can comment on or make changes to this bug.