Skip to content

Commit d99f030

Browse files
Merge pull request #38227 from MetaMask/release/13.10.3
release: 13.10.3
2 parents b0913ae + 26c3024 commit d99f030

File tree

4 files changed

+86
-24
lines changed

4 files changed

+86
-24
lines changed

CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [13.10.3]
11+
12+
### Fixed
13+
14+
- Feature flags sidepanel context menu (#38220)
15+
1016
## [13.10.2]
1117

1218
### Fixed
1319

14-
- fixed entry modal closed error (#38188)
20+
- Fixes entry modal closed error (#38188)
1521

1622
## [13.10.1]
1723

@@ -1233,7 +1239,8 @@ authorized by the user.` error until the user fully revoked dapp
12331239
- This changelog was split off with 12.22.0
12341240
- All older changes can be found in [docs/CHANGELOG_older.md](https://github.com/MetaMask/metamask-extension/blob/main/docs/CHANGELOG_older.md)
12351241

1236-
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v13.10.2...HEAD
1242+
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v13.10.3...HEAD
1243+
[13.10.3]: https://github.com/MetaMask/metamask-extension/compare/v13.10.2...v13.10.3
12371244
[13.10.2]: https://github.com/MetaMask/metamask-extension/compare/v13.10.1...v13.10.2
12381245
[13.10.1]: https://github.com/MetaMask/metamask-extension/compare/v13.10.0...v13.10.1
12391246
[13.10.0]: https://github.com/MetaMask/metamask-extension/compare/v13.9.0...v13.10.0

app/scripts/background.js

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
CorruptionHandler,
5656
hasVault,
5757
} from './lib/state-corruption/state-corruption-recovery';
58+
import { initSidePanelContextMenu } from './lib/sidepanel-context-menu';
5859
import {
5960
backedUpStateKeys,
6061
PersistenceManager,
@@ -175,7 +176,10 @@ const ONE_SECOND_IN_MILLISECONDS = 1_000;
175176
// Timeout for initializing phishing warning page.
176177
const PHISHING_WARNING_PAGE_TIMEOUT = ONE_SECOND_IN_MILLISECONDS;
177178

178-
lazyListener.once('runtime', 'onInstalled').then(handleOnInstalled);
179+
lazyListener.once('runtime', 'onInstalled').then((details) => {
180+
handleOnInstalled(details);
181+
handleSidePanelContextMenu();
182+
});
179183

180184
/**
181185
* This deferred Promise is used to track whether initialization has finished.
@@ -1672,26 +1676,14 @@ function onInstall() {
16721676
platform.openExtensionInBrowser();
16731677
}
16741678
}
1675-
// Only register sidepanel context menu for browsers that support it (Chrome/Edge/Brave)
1676-
// and when the feature flag is enabled
1677-
if (
1678-
browser.contextMenus &&
1679-
browser.sidePanel &&
1680-
process.env.IS_SIDEPANEL?.toString() === 'true'
1681-
) {
1682-
browser.runtime.onInstalled.addListener(() => {
1683-
browser.contextMenus.create({
1684-
id: 'openSidePanel',
1685-
title: 'MetaMask Sidepanel',
1686-
contexts: ['all'],
1687-
});
1688-
});
1689-
browser.contextMenus.onClicked.addListener((info, tab) => {
1690-
if (info.menuItemId === 'openSidePanel') {
1691-
// This will open the panel in all the pages on the current window.
1692-
browser.sidePanel.open({ windowId: tab.windowId });
1693-
}
1694-
});
1679+
1680+
/**
1681+
* Handles the onInstalled event for sidepanel context menu creation.
1682+
* This is registered via lazyListener to catch the event at module load time.
1683+
*/
1684+
async function handleSidePanelContextMenu() {
1685+
await isInitialized;
1686+
await initSidePanelContextMenu(controller);
16951687
}
16961688

16971689
// // On first install, open a new tab with MetaMask
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import browser from 'webextension-polyfill';
2+
import type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';
3+
import type MetamaskController from '../metamask-controller';
4+
5+
const MENU_ITEM_ID = 'openSidePanel';
6+
7+
// Type augmentation for sidePanel API (not yet in webextension-polyfill types)
8+
type BrowserWithSidePanel = typeof browser & {
9+
sidePanel?: {
10+
open: (options: { windowId: number }) => Promise<void>;
11+
};
12+
};
13+
14+
export async function initSidePanelContextMenu(
15+
controller: MetamaskController,
16+
): Promise<void> {
17+
const browserWithSidePanel = browser as BrowserWithSidePanel;
18+
19+
if (
20+
!browser.contextMenus ||
21+
!browserWithSidePanel.sidePanel ||
22+
process.env.IS_SIDEPANEL?.toString() !== 'true'
23+
) {
24+
return;
25+
}
26+
27+
const isEnabled = (state?: {
28+
remoteFeatureFlags?: { extensionUxSidepanel?: boolean };
29+
}) => state?.remoteFeatureFlags?.extensionUxSidepanel !== false;
30+
31+
const createMenu = () => {
32+
browser.contextMenus.create({
33+
id: MENU_ITEM_ID,
34+
title: 'MetaMask Sidepanel',
35+
contexts: ['all'],
36+
});
37+
};
38+
39+
const removeMenu = () => {
40+
browser.contextMenus.remove(MENU_ITEM_ID);
41+
};
42+
43+
if (isEnabled(controller?.remoteFeatureFlagController?.state)) {
44+
createMenu();
45+
}
46+
47+
browser.contextMenus.onClicked.addListener((info, tab) => {
48+
if (info.menuItemId === MENU_ITEM_ID && tab?.windowId) {
49+
browserWithSidePanel.sidePanel?.open({ windowId: tab.windowId });
50+
}
51+
});
52+
53+
controller?.controllerMessenger?.subscribe(
54+
'RemoteFeatureFlagController:stateChange',
55+
(state: RemoteFeatureFlagControllerState) => {
56+
if (isEnabled(state)) {
57+
createMenu();
58+
} else {
59+
removeMenu();
60+
}
61+
},
62+
);
63+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "metamask-crx",
3-
"version": "13.10.2",
3+
"version": "13.10.3",
44
"private": true,
55
"repository": {
66
"type": "git",

0 commit comments

Comments
 (0)