Search code examples
javascriptgoogle-chromegoogle-chrome-extensiondom-eventschromium

Detect Tab duplication events


I'm developing a Chrome extension;

I need to detect when a tab is duplicated, I'm looking for a tab detection event like onduplicate.addListener()?

Is that possible with the Chrome extension API?


Solution

  • This is the closest implementation:

    const newTabsId = new Set();
    
    // Observe all new tabs with opener ID
    chrome.tabs.onCreated.addListener(tab => {
        if(tab.openerTabId) {
            newTabsId.add(tab.id);
        }
    });
    
    // Waiting for a new tab completeness
    chrome.tabs.onUpdated.addListener((tabId, changes, tab) => {
        if(newTabsId.has(tabId) && changes.status === 'complete') { 
            if(!tab.openerTabId) {
                return;
            }
            // Retrieve opener (original) tab
            getTabById(tab.openerTabId)
                .then(originalTab => {
                    if(
                        originalTab.url === tab.url &&          // original and new tab should have same URL
                        originalTab.index + 1 === tab.index &&  // new tab should have next index
                        tab.active && tab.selected              // new tab should be active and selected
                                                                // also we may compare scroll from top, but for that we need to use content-script
                    ) {
                        console.log('Duplicate:', tab);
                    }
                });
            // Remove this tab from observable list
            newTabsId.delete(tabId);
        }
    });
    
    // Syntax sugar
    function getTabById(id) {
        return new Promise((resolve, reject) => {
            chrome.tabs.get(id, resolve);
        });
    }
    
    // Cleanup memory: remove from observables if tab has been closed
    chrome.tabs.onRemoved.addListener(tabId => {
        newTabsId.delete(tabId);
    });
    

    EDIT 1: But yeah, there is no clear solution now to detect real duplicate