ramo
ramo

Reputation: 955

Open tab, wait for it to finish loading then close it

I have written my first chrome extension today. What I want it to do is open a tab in the background (pinned), and after the page in the tab finishes loading, I want the tab to close.

So far I have:

chrome.tabs.create({url: target, selected: false, pinned: true});

What the above code does is open the tab in the background, and pin it.

How do I close the tab once it has finished loading?

Upvotes: 4

Views: 6858

Answers (2)

Andrey Ptashinskiy
Andrey Ptashinskiy

Reputation: 1001

chrome.tabs.create({url: target, selected: false, pinned: true}, myTab => {
    function listener(tabId, changeInfo, tab) {
        // make sure the status is 'complete' and it's the right tab
        if (tabId === myTab.id && changeInfo.status == 'complete') {
            chrome.tabs.remove(myTab.id);
            chrome.tabs.onUpdated.removeListener(listener);
        }
    };
    chrome.tabs.onUpdated.addListener(listener);
});

Upvotes: 7

Rob W
Rob W

Reputation: 349032

You can either bind a chrome.tabs.onUpdated or a chrome.webNavigation.onCompleted event to detect that a page has finished loading, or insert a content script to close the tab.

Using the webNavigation.onCompleted event

var tabsToClose = {};
chrome.webNavigation.onCompleted.addListener(function(details) {
    if (details.frameId !== 0) return; // Only process top-frame requests
    var tabId = details.tabId;
    if (tabsToClose[tabId]) {
        delete tabsToClose[tabId];
        chrome.tabs.remove(tabId);
    }
});

chrome.tabs.create({url: target, selected: false, pinned: true}, function(tab) {
    tabsToClose[tab.id] = 1;
});

Note: I assumed that navigation will always succeed. You should also bind a webNavigation.onErrorOccurred event to close the tab on failure.

Using a content script

By using runAt: 'document_idle' (default), window.close(); will be inserted once the page has finished loading.

chrome.tabs.create({url: target, selected: false, pinned: true}, function(tab) {
    chrome.tabs.executeScript(tab.id, {
        code: 'window.close();',
        runAt: 'document_idle'
    });
});

Upvotes: 4

Related Questions