From 38ebe91674f37251cdbaaab6194a4d316b8b3076 Mon Sep 17 00:00:00 2001 From: Vedaant Rajoo Date: Sat, 15 Nov 2025 17:56:05 -0800 Subject: [PATCH] fix: Add null checks for tab permissions and conversions in TabManagerBase, ensuring stability with empty tabs, p=#11302 --- .../extensions/parent/ext-tabs-base-js.patch | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/toolkit/components/extensions/parent/ext-tabs-base-js.patch diff --git a/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch b/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch new file mode 100644 index 000000000..b050c0b92 --- /dev/null +++ b/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch @@ -0,0 +1,64 @@ +diff --git a/toolkit/components/extensions/parent/ext-tabs-base.js b/toolkit/components/extensions/parent/ext-tabs-base.js +index d3c2d62406d17a14b0288752c34b6dd4350f032a..2f970d41b8ada9a13fc18b8d2a6607b973983072 100644 +--- a/toolkit/components/extensions/parent/ext-tabs-base.js ++++ b/toolkit/components/extensions/parent/ext-tabs-base.js +@@ -1942,6 +1942,7 @@ class TabManagerBase { + */ + addActiveTabPermission(nativeTab) { + let tab = this.getWrapper(nativeTab); ++ if (!tab) return; // Empty tabs aren't tracked, nothing to add + if ( + this.extension.hasPermission("activeTab") || + (this.extension.originControls && +@@ -1963,7 +1964,9 @@ class TabManagerBase { + * The native tab for which to revoke permissions. + */ + revokeActiveTabPermission(nativeTab) { +- this.getWrapper(nativeTab).activeTabWindowID = null; ++ let wrapper = this.getWrapper(nativeTab); ++ if (!wrapper) return; // Empty tabs arent tracked, nothing to revoke ++ wrapper.activeTabWindowID = null; + } + + /** +@@ -1976,7 +1979,9 @@ class TabManagerBase { + * True if the extension has activeTab permissions for this tab. + */ + hasActiveTabPermission(nativeTab) { +- return this.getWrapper(nativeTab).hasActiveTabPermission; ++ let wrapper = this.getWrapper(nativeTab); ++ if (!wrapper) return false; // Empty tabs arent tracked, nothing to check ++ return wrapper.hasActiveTabPermission; + } + + /** +@@ -1987,6 +1992,7 @@ class TabManagerBase { + */ + activateScripts(nativeTab) { + let tab = this.getWrapper(nativeTab); ++ if (!tab) return; // Empty tabs aren't tracked, nothing to activate + if ( + this.extension.originControls && + !tab.matchesHostPermission && +@@ -2019,7 +2025,9 @@ class TabManagerBase { + * True if the extension has permissions for this tab. + */ + hasTabPermission(nativeTab) { +- return this.getWrapper(nativeTab).hasTabPermission; ++ let wrapper = this.getWrapper(nativeTab); ++ if (!wrapper) return false; // Empty tabs arent tracked, nothing to check ++ return wrapper.hasTabPermission; + } + + /** +@@ -2066,7 +2074,9 @@ class TabManagerBase { + * @returns {object} + */ + convert(nativeTab, fallbackTabSize = null) { +- return this.getWrapper(nativeTab).convert(fallbackTabSize); ++ let wrapper = this.getWrapper(nativeTab); ++ if (!wrapper) return null; // Empty tabs aren't tracked, can't convert ++ return wrapper.convert(fallbackTabSize); + } + + /**