summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/browser_bug1163570.js
blob: 6a77728c77184143c082ee9778d376eed51e1ca0 (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
var gTestRoot = getRootDirectory(gTestPath).replace(
  "chrome://mochitests/content/",
  "http://127.0.0.1:8888/"
);

// simple tab load helper, pilfered from browser plugin tests
function promiseTabLoad(tab, url, eventType = "load") {
  return new Promise(resolve => {
    function handle(event) {
      if (
        event.originalTarget != tab.linkedBrowser.contentDocument ||
        event.target.location.href == "about:blank" ||
        (url && event.target.location.href != url)
      ) {
        return;
      }
      tab.linkedBrowser.removeEventListener(eventType, handle, true);
      resolve(event);
    }

    tab.linkedBrowser.addEventListener(eventType, handle, true, true);
    if (url) {
      tab.linkedBrowser.loadURI(url);
    }
  });
}

// dom event listener helper
function promiseWaitForEvent(
  object,
  eventName,
  capturing = false,
  chrome = false
) {
  return new Promise(resolve => {
    function listener(event) {
      object.removeEventListener(eventName, listener, capturing, chrome);
      resolve(event);
    }
    object.addEventListener(eventName, listener, capturing, chrome);
  });
}

add_task(async function() {
  registerCleanupFunction(function() {
    window.focus();
  });
});

add_task(async function() {
  setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");

  let pluginTab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser));
  let prefTab = BrowserTestUtils.addTab(gBrowser);

  await promiseTabLoad(pluginTab, gTestRoot + "plugin_test.html");
  await promiseTabLoad(prefTab, "about:preferences");

  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
    let doc = content.document;
    let plugin = doc.getElementById("testplugin");
    Assert.ok(!!plugin, "plugin is loaded");
  });

  let ppromise = promiseWaitForEvent(window, "MozAfterPaint");
  gBrowser.selectedTab = prefTab;
  await ppromise;

  // We're going to switch tabs using actual mouse clicks, which helps
  // reproduce this bug.
  let tabStripContainer = document.getElementById("tabbrowser-tabs");

  // diagnosis if front end layout changes
  info("-> " + tabStripContainer.tagName); // tabs
  info("-> " + tabStripContainer.firstChild.tagName); // tab
  info("-> " + tabStripContainer.childNodes[0].label); // test harness tab
  info("-> " + tabStripContainer.childNodes[1].label); // plugin tab
  info("-> " + tabStripContainer.childNodes[2].label); // preferences tab

  for (let iteration = 0; iteration < 5; iteration++) {
    ppromise = promiseWaitForEvent(window, "MozAfterPaint");
    EventUtils.synthesizeMouseAtCenter(
      tabStripContainer.childNodes[1],
      {},
      window
    );
    await ppromise;

    await SpecialPowers.spawn(pluginTab.linkedBrowser, [], async function() {
      let doc = content.document;
      let plugin = doc.getElementById("testplugin");
      Assert.ok(
        XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible(),
        "plugin is visible"
      );
    });

    ppromise = promiseWaitForEvent(window, "MozAfterPaint");
    EventUtils.synthesizeMouseAtCenter(
      tabStripContainer.childNodes[2],
      {},
      window
    );
    await ppromise;

    await SpecialPowers.spawn(pluginTab.linkedBrowser, [], async function() {
      let doc = content.document;
      let plugin = doc.getElementById("testplugin");
      Assert.ok(
        !XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible(),
        "plugin is hidden"
      );
    });
  }

  gBrowser.removeTab(prefTab);
  gBrowser.removeTab(pluginTab);
});