summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_sessions_restoreTab.js
blob: 679e1fbd6c2baabdd5d86e681b208ae948c7c367 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

ChromeUtils.defineESModuleGetters(this, {
  SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
});

/**
 This test checks that after closing an extension made tab it restores correctly.
 The tab is given an expanded triggering principal and we didn't use to serialize
 these correctly into session history.
 */

// Check that we can restore a tab modified by an extension.
add_task(async function test_restoringModifiedTab() {
  function background() {
    browser.tabs.create({ url: "http://example.com/" });
    browser.test.onMessage.addListener((msg, filter) => {
      if (msg == "change-tab") {
        browser.tabs.executeScript({ code: 'location.href += "?changedTab";' });
      }
    });
  }
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["tabs", "<all_urls>"],
    },
    browser_action: {
      default_title: "Navigate current tab via content script",
    },
    background,
  });

  const contentScriptTabURL = "http://example.com/?changedTab";

  let win = await BrowserTestUtils.openNewBrowserWindow({});

  // Open and close a tabs.
  let tabPromise = BrowserTestUtils.waitForNewTab(
    win.gBrowser,
    "http://example.com/",
    true
  );
  await extension.startup();
  let firstTab = await tabPromise;
  let locationChange = BrowserTestUtils.waitForLocationChange(
    win.gBrowser,
    contentScriptTabURL
  );
  extension.sendMessage("change-tab");
  await locationChange;
  is(
    firstTab.linkedBrowser.currentURI.spec,
    contentScriptTabURL,
    "Got expected URL"
  );

  let sessionPromise = BrowserTestUtils.waitForSessionStoreUpdate(firstTab);
  BrowserTestUtils.removeTab(firstTab);
  await sessionPromise;

  tabPromise = BrowserTestUtils.waitForNewTab(
    win.gBrowser,
    contentScriptTabURL,
    true
  );
  SessionStore.undoCloseTab(win, 0);
  let restoredTab = await tabPromise;
  ok(restoredTab, "We returned a tab here");
  is(
    restoredTab.linkedBrowser.currentURI.spec,
    contentScriptTabURL,
    "Got expected URL"
  );

  await extension.unload();
  BrowserTestUtils.removeTab(restoredTab);

  // Close the window.
  await BrowserTestUtils.closeWindow(win);
});

add_task(async function test_restoringClosedTabWithTooLargeIndex() {
  function background() {
    browser.test.onMessage.addListener(async (msg, filter) => {
      if (msg != "restoreTab") {
        return;
      }
      const recentlyClosed = await browser.sessions.getRecentlyClosed({
        maxResults: 2,
      });
      let tabWithTooLargeIndex;
      for (const info of recentlyClosed) {
        if (info.tab && info.tab.index > 1) {
          tabWithTooLargeIndex = info.tab;
          break;
        }
      }
      const onRestored = tab => {
        browser.tabs.onCreated.removeListener(onRestored);
        browser.test.sendMessage("restoredTab", tab);
      };
      browser.tabs.onCreated.addListener(onRestored);
      browser.sessions.restore(tabWithTooLargeIndex.sessionId);
    });
  }
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["tabs", "sessions"],
    },
    background,
  });

  const win = await BrowserTestUtils.openNewBrowserWindow({});
  const tabs = await Promise.all([
    BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:blank?0"),
    BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:blank?1"),
  ]);
  const promsiedSessionStored = Promise.all([
    BrowserTestUtils.waitForSessionStoreUpdate(tabs[0]),
    BrowserTestUtils.waitForSessionStoreUpdate(tabs[1]),
  ]);
  // Close the rightmost tab at first
  BrowserTestUtils.removeTab(tabs[1]);
  BrowserTestUtils.removeTab(tabs[0]);
  await promsiedSessionStored;

  await extension.startup();
  const promisedRestoredTab = extension.awaitMessage("restoredTab");
  extension.sendMessage("restoreTab");
  const restoredTab = await promisedRestoredTab;
  is(restoredTab.index, 1, "Got valid index");

  await extension.unload();
  await BrowserTestUtils.closeWindow(win);
});