-
Notifications
You must be signed in to change notification settings - Fork 60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sidePanel
API: lifecycle events
#517
Comments
+1 🙏. Here are my similar requests - https://groups.google.com/a/chromium.org/g/chromium-extensions/c/cJmdMLmpbjg |
Any tricks of trying to track the visibility of our extension in the side panel via document.hidden or via clients.matchAll() didn't work. When the user switches between OS applications or minimizes the browser, we get a message that the document is invisible, which makes sense. So we need a native sidepanel API method to report show/hide and window Id accurately. |
Yep, this, this is not so critical. Although I would like to have such a common event for all contexts that may occur in chrome.runtime.getContext - https://developer.chrome.com/docs/extensions/reference/api/runtime#method-getContexts For now, it’s easier to use a poll every 5 seconds. |
Polling is not an alternative. By that suggestion, you don't need almost any events, you can just poll it. Events are useful specifically because they let you avoid polling. That's the whole point of events: you want to respond to changes immediately without continuously waking up the background worker. |
The life cycle events of SidePanel are so important that I searched a lot of information to find it here. I look forward to its early release. |
FYI #752 was discussed today and marked as a duplicate of this issue because this is a more general version of the request for a The meeting notes are pending review at #753 and once merged will be available at https://github.com/w3c/webextensions/blob/main/_minutes/2025-01-30-wecg.md Next step is for @twschiller and @mukul-p to come up with a concrete proposal to cover the relevant lifecycle events. |
Here's some initial thinking for the events. I have some questions on side panel lifecycle when the browser/another extension opens its side panel. I'll follow up with my team and @mukul-p to map out additional considerations Open Questions
Permissions
Excluded Events
Typescript Definitionsdeclare namespace browser.sidePanel {
interface PanelOpenInfo {
position: "right" | "left";
path: string;
}
interface PanelChangeInfo {
/** The panel's new active state, e.g., if a native (e.g., Reading Mode) was opened. Or is the panel closed when a new side panel is opened? **/
active?: boolean;
/** The panel's new position. Occurs if the user updates their Appearances settings **/
position?: "right" | "left";
/** The panel's new path. Is this necessary given that only the extension can update the path? **/
path?: string;
}
interface Event<T extends (...args: any[]) => any> {
addListener(callback: T, ...params: unknown[]): void;
removeListener(callback: T): void;
hasListener(callback: T): boolean;
}
// Match terminology of the `browser.sidePanel.open` method
export const onOpened: Event<[tabId: number, panelInfo: PanelOpenInfo]>;
// Closed might be a misleading name if this event is used instead of PanelChangeInfo.active for when the panel is replaced
export const onClosed: Event<[tabId: number]>;
// TODO: depending on side panel lifecycle, determine if onReplaced is more appropriate than PanelChangeInfo.active or onClosed to represent another panel being opened
export const onReplaced: Event<[tabId: number]>;
// Would only be fired if the panel is open. E.g., will not fire if the panel position is configured when no panels are open
export const onUpdated: Event<[tabId: number, changeInfo: PanelChangeInfo]>;
} |
I think that:
IIRC there's always one |
@mukul-p @oliverdunk is there documentation on the conceptual/specification for how browsers handle another extension or the browser replacing an extension's side panel? Does it close or just become inactive? |
I'm not aware of anything right now I'm afraid. It does seem like something we should try to document. |
Our extension uses sidebar to display extra content about the current website, the content script communicates to the sidebar, acting as a controller.
It would be useful to have more control over it, specifically, to only do operations when the sidebar is open or know when it's opened/closed.
Proposal: lifecycle events
Some example useful events could be:
.sendMessage
to all the relevant contextschrome.runtime.connect
'sonDisconnect
event if there are multiple sidebars open, because the connection is preserved across instances: https://stackoverflow.com/a/36465331onbeforeunload
because.sendMessage
doesn't completeSome other more specific events could be:
visibilitychange
, the current extension's sidePanel is shown)These two are less important, I suppose a local
visibilitychange
+runtime.sendMessage
could work as well.The text was updated successfully, but these errors were encountered: