summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/fullscreen/browser_fullscreen_window_focus.js
blob: 5dd71e1a92c0b26d102b94711d69dd9964721832 (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
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

async function pause() {
  /* eslint-disable mozilla/no-arbitrary-setTimeout */
  return new Promise(resolve => setTimeout(resolve, 500));
}

// This test tends to trigger a race in the fullscreen time telemetry,
// where the fullscreen enter and fullscreen exit events (which use the
// same histogram ID) overlap. That causes TelemetryStopwatch to log an
// error.
SimpleTest.ignoreAllUncaughtExceptions(true);

const IFRAME_ID = "testIframe";

async function testWindowFocus(isPopup, iframeID) {
  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);

  info("Calling window.open()");
  let openedWindow = await jsWindowOpen(tab.linkedBrowser, isPopup, iframeID);
  info("Letting OOP focus to stabilize");
  await pause(); // Bug 1719659 for proper fix
  info("re-focusing main window");
  await waitForFocus(tab.linkedBrowser);

  info("Entering full-screen");
  await changeFullscreen(tab.linkedBrowser, true);

  await testExpectFullScreenExit(
    tab.linkedBrowser,
    true,
    async () => {
      info("Calling window.focus()");
      await jsWindowFocus(tab.linkedBrowser, iframeID);
    },
    () => {
      // Async fullscreen transitions will swallow the repaint of the tab,
      // preventing us from detecting that we've successfully changed
      // fullscreen. Supply an action to switch back to the tab after the
      // fullscreen event has been received, which will ensure that the
      // tab is repainted when the DOMFullscreenChild is listening for it.
      info("Calling switchTab()");
      BrowserTestUtils.switchTab(gBrowser, tab);
    }
  );

  // Cleanup
  if (isPopup) {
    openedWindow.close();
  } else {
    BrowserTestUtils.removeTab(openedWindow);
  }
  BrowserTestUtils.removeTab(tab);
}

async function testWindowElementFocus(isPopup) {
  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);

  info("Calling window.open()");
  let openedWindow = await jsWindowOpen(tab.linkedBrowser, isPopup);
  info("Letting OOP focus to stabilize");
  await pause(); // Bug 1719659 for proper fix
  info("re-focusing main window");
  await waitForFocus(tab.linkedBrowser);

  info("Entering full-screen");
  await changeFullscreen(tab.linkedBrowser, true);

  await testExpectFullScreenExit(
    tab.linkedBrowser,
    false,
    async () => {
      info("Calling element.focus() on popup");
      await ContentTask.spawn(tab.linkedBrowser, {}, async args => {
        await content.wrappedJSObject.sendMessage(
          content.wrappedJSObject.openedWindow,
          "elementfocus"
        );
      });
    },
    () => {
      // Async fullscreen transitions will swallow the repaint of the tab,
      // preventing us from detecting that we've successfully changed
      // fullscreen. Supply an action to switch back to the tab after the
      // fullscreen event has been received, which will ensure that the
      // tab is repainted when the DOMFullscreenChild is listening for it.
      info("Calling switchTab()");
      BrowserTestUtils.switchTab(gBrowser, tab);
    }
  );

  // Cleanup
  await changeFullscreen(tab.linkedBrowser, false);
  if (isPopup) {
    openedWindow.close();
  } else {
    BrowserTestUtils.removeTab(openedWindow);
  }
  BrowserTestUtils.removeTab(tab);
}

add_setup(async function () {
  await SpecialPowers.pushPrefEnv({
    set: [
      ["dom.disable_open_during_load", false], // Allow window.focus calls without user interaction
      ["browser.link.open_newwindow.disabled_in_fullscreen", false],
    ],
  });
});

add_task(function test_popupWindowFocus() {
  return testWindowFocus(true);
});

add_task(function test_iframePopupWindowFocus() {
  return testWindowFocus(true, IFRAME_ID);
});

add_task(function test_popupWindowElementFocus() {
  return testWindowElementFocus(true);
});

add_task(function test_backgroundTabFocus() {
  return testWindowFocus(false);
});

add_task(function test_iframebackgroundTabFocus() {
  return testWindowFocus(false, IFRAME_ID);
});

add_task(function test_backgroundTabElementFocus() {
  return testWindowElementFocus(false);
});