summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/tabs/browser_e10s_chrome_process.js
blob: aa6a8933729ac9f985448b3c5a76b1374e9518f7 (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
// Returns a function suitable for add_task which loads startURL, runs
// transitionTask and waits for endURL to load, checking that the URLs were
// loaded in the correct process.
function makeTest(
  name,
  startURL,
  startProcessIsRemote,
  endURL,
  endProcessIsRemote,
  transitionTask
) {
  return async function () {
    info("Running test " + name + ", " + transitionTask.name);
    let browser = gBrowser.selectedBrowser;

    // In non-e10s nothing should be remote
    if (!gMultiProcessBrowser) {
      startProcessIsRemote = false;
      endProcessIsRemote = false;
    }

    // Load the initial URL and make sure we are in the right initial process
    info("Loading initial URL");
    BrowserTestUtils.loadURIString(browser, startURL);
    await BrowserTestUtils.browserLoaded(browser, false, startURL);

    is(browser.currentURI.spec, startURL, "Shouldn't have been redirected");
    is(
      browser.isRemoteBrowser,
      startProcessIsRemote,
      "Should be displayed in the right process"
    );

    let docLoadedPromise = BrowserTestUtils.browserLoaded(
      browser,
      false,
      endURL
    );
    await transitionTask(browser, endURL);
    await docLoadedPromise;

    is(browser.currentURI.spec, endURL, "Should have made it to the final URL");
    is(
      browser.isRemoteBrowser,
      endProcessIsRemote,
      "Should be displayed in the right process"
    );
  };
}

const PATH = (
  getRootDirectory(gTestPath) + "test_process_flags_chrome.html"
).replace("chrome://mochitests", "");

const CHROME = "chrome://mochitests" + PATH;
const CANREMOTE = "chrome://mochitests-any" + PATH;
const MUSTREMOTE = "chrome://mochitests-content" + PATH;

add_setup(async function () {
  gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {
    forceNotRemote: true,
  });
});

registerCleanupFunction(() => {
  gBrowser.removeCurrentTab();
});

add_task(async function test_chrome() {
  test_url_for_process_types({
    url: CHROME,
    chromeResult: true,
    webContentResult: false,
    privilegedAboutContentResult: false,
    privilegedMozillaContentResult: false,
    extensionProcessResult: false,
  });
});

add_task(async function test_any() {
  test_url_for_process_types({
    url: CANREMOTE,
    chromeResult: true,
    webContentResult: true,
    privilegedAboutContentResult: false,
    privilegedMozillaContentResult: false,
    extensionProcessResult: false,
  });
});

add_task(async function test_remote() {
  test_url_for_process_types({
    url: MUSTREMOTE,
    chromeResult: false,
    webContentResult: true,
    privilegedAboutContentResult: false,
    privilegedMozillaContentResult: false,
    extensionProcessResult: false,
  });
});

// The set of page transitions
var TESTS = [
  ["chrome -> chrome", CHROME, false, CHROME, false],
  ["chrome -> canremote", CHROME, false, CANREMOTE, false],
  ["chrome -> mustremote", CHROME, false, MUSTREMOTE, true],
  ["remote -> chrome", MUSTREMOTE, true, CHROME, false],
  ["remote -> canremote", MUSTREMOTE, true, CANREMOTE, true],
  ["remote -> mustremote", MUSTREMOTE, true, MUSTREMOTE, true],
];

// The different ways to transition from one page to another
var TRANSITIONS = [
  // Loads the new page by calling browser.loadURI directly
  async function loadURI(browser, uri) {
    info("Calling browser.loadURI");
    BrowserTestUtils.loadURIString(browser, uri);
  },

  // Loads the new page by finding a link with the right href in the document and
  // clicking it
  function clickLink(browser, uri) {
    info("Clicking link");
    SpecialPowers.spawn(browser, [uri], function frame_script(frameUri) {
      let link = content.document.querySelector("a[href='" + frameUri + "']");
      link.click();
    });
  },
];

// Creates a set of test tasks, one for each combination of TESTS and TRANSITIONS.
for (let test of TESTS) {
  for (let transition of TRANSITIONS) {
    add_task(makeTest(...test, transition));
  }
}