chromium/chrome/test/data/extensions/api_test/service_worker/worker_based_background/tabs_events/service_worker_background.js

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var tabProps = [];
const NEW_TAB_URL = 'chrome://newtab/';

chrome.test.runTests([
  // Get the info for any tabs already exist.
  function testTabQueryInitial() {
    try {
      chrome.tabs.query({currentWindow: true}, function(tabs) {
        chrome.test.assertEq(1, tabs.length);
        tabProps.push({id: tabs[0].id, url: tabs[0].url});
        chrome.test.succeed();
      });
    } catch(e) {
      chrome.test.fail(e);
    }
  },
  // Create a new tab. Use an onCreated listener to update the array of open
  // tabs. Use an onUpdatedListener to make sure the next test doesn't start
  // before the onUpdated events for the create call are finished.
  function testTabCreate() {
    chrome.tabs.onCreated.addListener(function localListener(tab) {
      chrome.test.assertEq(NEW_TAB_URL, tab.pendingUrl);
      tabProps.push({id: tab.id, url: tab.pendingUrl});
      chrome.tabs.onCreated.removeListener(localListener);
    });
    chrome.tabs.onUpdated.addListener(function localListener (
        tabId, changeInfo, tab) {
      if (changeInfo.status === 'complete') {
        chrome.tabs.onUpdated.removeListener(localListener);
        chrome.test.succeed();
      }
    });
    try {
      // Create the tab inactive, so we can activate it later.
      chrome.tabs.create({url: NEW_TAB_URL, active: false});
    } catch (e) {
      chrome.test.fail(e);
    }
  },
  // Test the chrome.tabs.onUpdated listener through the loading cycle.
  function testTabOnUpdatedListener() {
    var newUrl = 'chrome://version/';
    var gotLoading = false;
    chrome.tabs.onUpdated.addListener(function localListener(
        tabId, changeInfo, tab) {
      if (changeInfo.status === 'loading') {
        chrome.test.assertFalse(gotLoading);
        gotLoading = true;
        chrome.test.assertEq(tabProps[1].id, tabId);
        chrome.test.assertEq(newUrl, changeInfo.url);
      } else if (changeInfo.status === 'complete') {
        chrome.test.assertTrue(gotLoading);
        chrome.tabs.onUpdated.removeListener(localListener);
        chrome.test.succeed();
      }
    });
    try {
      chrome.tabs.update(tabProps[1].id, {url: newUrl});
      tabProps[1].url = newUrl;
    } catch(e) {
      chrome.test.fail(e);
    }
  },
  // Check the chrome.tabs.onMoved listener.
  function testTabMove() {
    var expectedId = tabProps[0].id
    chrome.test.listenOnce(chrome.tabs.onMoved,
                           function localListener(tabId, moveInfo) {
      chrome.test.assertEq(expectedId, tabId);
    });
    try {
      chrome.tabs.move(expectedId, {index: -1});
    } catch(e) {
      chrome.test.fail(e);
    }
  },
  // Check the chrome.tabs.onActivated listener.
  function testTabActivated() {
    var tabId = tabProps[1].id;
    chrome.tabs.onActivated.addListener(function localListener(activeInfo) {
      chrome.tabs.onActivated.removeListener(localListener);
      chrome.test.assertEq(tabId, activeInfo.tabId);
      chrome.test.succeed();
    });
    try {
      // Make an existing tab active.
      chrome.tabs.update(tabId, {active: true});
    } catch(e) {
      chrome.test.fail(e);
    }
  },
  // Check the chrome.tabs.onRemoved listener.
  function testTabRemoved() {
    var tabIdToClose = tabProps[1].id;
    chrome.tabs.onRemoved.addListener(function localListener(
        tabId, removeInfo) {
      chrome.tabs.onRemoved.removeListener(localListener);
      chrome.test.assertEq(tabIdToClose, tabId);
      chrome.test.assertFalse(removeInfo.isWindowClosing);
      chrome.test.succeed();
    });
    try {
      // Remove the tab.
      chrome.tabs.remove(tabIdToClose);
    } catch(e) {
      chrome.test.fail(e);
    }
  },
]);