Simplified version of @m-sarabi code.
func allows to return result, so no messaging is needed.
Requires scripting, activeTab (+ contextMenus for menu) permissions
// background.js
chrome.scripting.executeScript({
target: { tabId: tab?.id || 0 },
func: () => document?.getSelection?.()?.toString()
}).then(result => {
doWork(result[0].result)
})