Recipes

Cross-tab Communication

You can send a message to another tab/window using chrome.runtime.sendMessage and init.

export default <IPluginBase & IPlugin>{
    ...PluginBase, ...{
        niceName: 'Spotify',
        init: function () {
            // since we have a global command, init will be run on every page,
            // but we don't want this listener on non-spotify pages
            if (spotifyPlayerUrlRegexMatch.test(window.location.origin)) {
                chrome.runtime.onMessage.addListener((msg) => {
                    if (msg.type === 'lsSpotify') {
                        switch (msg.control) {
                            case SpotifyControlButtons.Play: {
                                clickButton(SpotifyControlButtons.Play);
                                break;
                            }
                        }
                    }
                });
            }
        },

        commands: [
            {
                name: 'spotify play',
                description: 'Play the Spotify web player.',
                global: true,
                match: 'spotify play',
                fn: function () {
                    const control = SpotifyControlButtons.Play; 
                    return new Promise(resolve => {
                        chrome.tabs.query({url: spotifyPlayerUrlMatch}, (tabs) => {
                            const tab = tabs.length ? tabs[0] : null;
                            if (tab) {
                                chrome.tabs.sendMessage(tab.id, {type: 'lsSpotify', control}, () => {
                                    resolve();
                                });
                            } else {
                                resolve();
                            }
                        });
                    });
                }
            },
        ]
    }
}

keywords: talking with another tab, inactive tab, message passing