11diff --git a/browser/base/content/browser-sidebar.js b/browser/base/content/browser-sidebar.js
2- index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f587815197 100644
2+ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..fa3cd3184cce8759c834fa0fadc645afde674dd8 100644
33--- a/browser/base/content/browser-sidebar.js
44+++ b/browser/base/content/browser-sidebar.js
55@@ -11,6 +11,10 @@ var SidebarUI = {
@@ -75,7 +75,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
7575 ]));
7676 },
7777
78- @@ -61,7 +97,10 @@ var SidebarUI = {
78+ @@ -61,12 +97,16 @@ var SidebarUI = {
7979 return (this._browser = document.getElementById("sidebar"));
8080 },
8181 POSITION_START_PREF: "sidebar.position_start",
@@ -86,7 +86,13 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
8686
8787 // lastOpenedId is set in show() but unlike currentID it's not cleared out on hide
8888 // and isn't persisted across windows
89- @@ -76,8 +115,13 @@ var SidebarUI = {
89+ lastOpenedId: null,
90+
91+ + /** @type {HTMLElement?} */
92+ _box: null,
93+ // The constructor of this label accesses the browser element due to the
94+ // control="sidebar" attribute, so avoid getting this label during startup.
95+ @@ -76,8 +116,13 @@ var SidebarUI = {
9096 }
9197 return (this.__title = document.getElementById("sidebar-title"));
9298 },
@@ -100,7 +106,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
100106 _reversePositionButton: null,
101107 _switcherPanel: null,
102108 _switcherTarget: null,
103- @@ -110,15 +154 ,59 @@ var SidebarUI = {
109+ @@ -110,15 +155 ,59 @@ var SidebarUI = {
104110 this._switcherTarget = document.getElementById("sidebar-switcher-target");
105111 this._switcherArrow = document.getElementById("sidebar-switcher-arrow");
106112
@@ -160,7 +166,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
160166 },
161167
162168 uninit() {
163- @@ -127,7 +215 ,10 @@ var SidebarUI = {
169+ @@ -127,7 +216 ,10 @@ var SidebarUI = {
164170 let enumerator = Services.wm.getEnumerator("navigator:browser");
165171 if (!enumerator.hasMoreElements()) {
166172 let xulStore = Services.xulStore;
@@ -172,7 +178,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
172178
173179 if (this._box.hasAttribute("positionend")) {
174180 xulStore.persist(this._box, "positionend");
175- @@ -148,6 +239 ,12 @@ var SidebarUI = {
181+ @@ -148,6 +240 ,12 @@ var SidebarUI = {
176182 xulStore.persist(this._title, "value");
177183 }
178184
@@ -185,7 +191,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
185191 Services.obs.removeObserver(this, "intl:app-locales-changed");
186192
187193 if (this._observer) {
188- @@ -159,17 +256,47 @@ var SidebarUI = {
194+ @@ -159,17 +257,62 @@ var SidebarUI = {
189195 /**
190196 * The handler for Services.obs.addObserver.
191197 **/
@@ -230,14 +236,29 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
230236+ }
231237+ }
232238+
239+ + // The sidebar depends on a browse existing. If this has been
240+ + // destroyed, we need to re-init it. Although, first we need to
241+ + // remove any possible cached value
242+ + this._browser = null
243+ + if (!this.browser) {
244+ + /** @type {HTMLElement} */
245+ + const browser = document.createXULElement('browser')
246+ + browser.setAttribute('id', 'sidebar')
247+ + browser.setAttribute('autoscroll', 'false')
248+ + browser.setAttribute('disablehistory', 'true')
249+ + browser.setAttribute('disablefullscreen', 'true')
250+ + browser.setAttribute('tooltip', 'aHTMLTooltip')
251+ + this._box.appendChild(browser)
252+ + }
253+ +
233254+ this.init();
234255+ break;
235256+ }
236257+ break;
237258 }
238259 }
239260 },
240- @@ -485,6 +612 ,9 @@ var SidebarUI = {
261+ @@ -485,6 +628 ,9 @@ var SidebarUI = {
241262 },
242263
243264 _loadSidebarExtension(commandID) {
@@ -247,15 +268,15 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
247268 let sidebar = this.sidebars.get(commandID);
248269 let { extensionId } = sidebar;
249270 if (extensionId) {
250- @@ -523,6 +653 ,7 @@ var SidebarUI = {
271+ @@ -523,6 +669 ,7 @@ var SidebarUI = {
251272 }
252273
253274 this._fireFocusedEvent();
254275+ this.loadedSidebars.push(commandID);
255276 return true;
256277 });
257278 },
258- @@ -546,10 +677 ,28 @@ var SidebarUI = {
279+ @@ -546,10 +693 ,28 @@ var SidebarUI = {
259280 }
260281 return this._show(commandID).then(() => {
261282 this._loadSidebarExtension(commandID);
@@ -284,7 +305,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
284305 /**
285306 * Implementation for show. Also used internally for sidebars that are shown
286307 * when a window is opened and we don't want to ping telemetry.
287- @@ -559,6 +708 ,29 @@ var SidebarUI = {
308+ @@ -559,6 +724 ,29 @@ var SidebarUI = {
288309 */
289310 _show(commandID) {
290311 return new Promise(resolve => {
@@ -314,7 +335,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
314335 this.selectMenuItem(commandID);
315336
316337 this._box.hidden = this._splitter.hidden = false;
317- @@ -570,13 +742 ,21 @@ var SidebarUI = {
338+ @@ -570,13 +758 ,21 @@ var SidebarUI = {
318339 this._box.setAttribute("sidebarcommand", commandID);
319340 this.lastOpenedId = commandID;
320341
@@ -338,7 +359,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
338359 this.browser.addEventListener(
339360 "load",
340361 event => {
341- @@ -615,22 +795 ,46 @@ var SidebarUI = {
362+ @@ -615,22 +811 ,46 @@ var SidebarUI = {
342363
343364 this.selectMenuItem("");
344365
@@ -392,7 +413,7 @@ index c5ac301416d2d820ba95e21c0ce1fe305e63b554..4d824259fd611e5531e35bb3d3da85f5
392413 },
393414
394415 /**
395- @@ -638,25 +842 ,121 @@ var SidebarUI = {
416+ @@ -638,25 +858 ,121 @@ var SidebarUI = {
396417 * none if the argument is an empty string.
397418 */
398419 selectMenuItem(commandID) {
0 commit comments