summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/browser_pluginscroll.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/plugins/test/mochitest/browser_pluginscroll.js')
-rw-r--r--dom/plugins/test/mochitest/browser_pluginscroll.js417
1 files changed, 417 insertions, 0 deletions
diff --git a/dom/plugins/test/mochitest/browser_pluginscroll.js b/dom/plugins/test/mochitest/browser_pluginscroll.js
new file mode 100644
index 0000000000..a55651b1cc
--- /dev/null
+++ b/dom/plugins/test/mochitest/browser_pluginscroll.js
@@ -0,0 +1,417 @@
+var gTestRoot = getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content/",
+ "http://127.0.0.1:8888/"
+);
+
+const { Preferences } = ChromeUtils.import(
+ "resource://gre/modules/Preferences.jsm"
+);
+
+/**
+ * tests for plugin windows and scroll
+ */
+
+function coordinatesRelativeToWindow(aX, aY, aElement) {
+ var targetWindow = aElement.ownerGlobal;
+ var scale = targetWindow.devicePixelRatio;
+ var rect = aElement.getBoundingClientRect();
+ return {
+ x: targetWindow.mozInnerScreenX + (rect.left + aX) * scale,
+ y: targetWindow.mozInnerScreenY + (rect.top + aY) * scale,
+ };
+}
+
+var apzEnabled =
+ Services.appinfo.fissionAutostart ||
+ Preferences.get("layers.async-pan-zoom.enabled", false);
+var pluginHideEnabled = Preferences.get(
+ "gfx.e10s.hide-plugins-for-scroll",
+ true
+);
+
+add_task(async function() {
+ registerCleanupFunction(function() {
+ setTestPluginEnabledState(
+ Ci.nsIPluginTag.STATE_CLICKTOPLAY,
+ "Test Plug-in"
+ );
+ });
+});
+
+add_task(async function() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["general.smoothScroll", true],
+ ["general.smoothScroll.other", true],
+ ["general.smoothScroll.mouseWheel", true],
+ ["general.smoothScroll.other.durationMaxMS", 2000],
+ ["general.smoothScroll.other.durationMinMS", 1999],
+ ["general.smoothScroll.mouseWheel.durationMaxMS", 2000],
+ ["general.smoothScroll.mouseWheel.durationMinMS", 1999],
+ ],
+ });
+});
+
+/*
+ * test plugin visibility when scrolling with scroll wheel and apz in a top level document.
+ */
+
+add_task(async function() {
+ let result;
+
+ if (!apzEnabled) {
+ ok(true, "nothing to test, need apz");
+ return;
+ }
+
+ if (!pluginHideEnabled) {
+ ok(true, "nothing to test, need gfx.e10s.hide-plugins-for-scroll");
+ return;
+ }
+
+ setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
+
+ let pluginTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ gTestRoot + "plugin_test.html"
+ );
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return !!plugin;
+ }
+ );
+ is(result, true, "plugin is loaded");
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ let nativeId = nativeVerticalWheelEventMsg();
+ let utils = SpecialPowers.getDOMWindowUtils(window);
+ let screenCoords = coordinatesRelativeToWindow(
+ 10,
+ 10,
+ gBrowser.selectedBrowser
+ );
+ utils.sendNativeMouseScrollEvent(
+ screenCoords.x,
+ screenCoords.y,
+ nativeId,
+ 0,
+ -50,
+ 0,
+ 0,
+ 0,
+ gBrowser.selectedBrowser
+ );
+
+ await waitScrollStart(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ gBrowser.removeTab(pluginTab);
+});
+
+/*
+ * test plugin visibility when scrolling with scroll wheel and apz in a sub document.
+ */
+
+add_task(async function() {
+ let result;
+
+ if (!apzEnabled) {
+ ok(true, "nothing to test, need apz");
+ return;
+ }
+
+ if (!pluginHideEnabled) {
+ ok(true, "nothing to test, need gfx.e10s.hide-plugins-for-scroll");
+ return;
+ }
+
+ setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
+
+ let pluginTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ gTestRoot + "plugin_subframe_test.html"
+ );
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return !!plugin;
+ }
+ );
+ is(result, true, "plugin is loaded");
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ let nativeId = nativeVerticalWheelEventMsg();
+ let utils = SpecialPowers.getDOMWindowUtils(window);
+ let screenCoords = coordinatesRelativeToWindow(
+ 10,
+ 10,
+ gBrowser.selectedBrowser
+ );
+ utils.sendNativeMouseScrollEvent(
+ screenCoords.x,
+ screenCoords.y,
+ nativeId,
+ 0,
+ -50,
+ 0,
+ 0,
+ 0,
+ gBrowser.selectedBrowser
+ );
+
+ await waitScrollStart(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ gBrowser.removeTab(pluginTab);
+});
+
+/*
+ * test visibility when scrolling with keyboard shortcuts for a top level document.
+ * This circumvents apz and relies on dom scroll, which is what we want to target
+ * for this test.
+ */
+
+add_task(async function() {
+ let result;
+
+ if (!pluginHideEnabled) {
+ ok(true, "nothing to test, need gfx.e10s.hide-plugins-for-scroll");
+ return;
+ }
+
+ setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
+
+ let pluginTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ gTestRoot + "plugin_test.html"
+ );
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return !!plugin;
+ }
+ );
+ is(result, true, "plugin is loaded");
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ EventUtils.synthesizeKey("KEY_End");
+
+ await waitScrollStart(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ EventUtils.synthesizeKey("KEY_Home");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ gBrowser.removeTab(pluginTab);
+});
+
+/*
+ * test visibility when scrolling with keyboard shortcuts for a sub document.
+ */
+
+add_task(async function() {
+ let result;
+
+ if (!pluginHideEnabled) {
+ ok(true, "nothing to test, need gfx.e10s.hide-plugins-for-scroll");
+ return;
+ }
+
+ setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
+
+ let pluginTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ gTestRoot + "plugin_subframe_test.html"
+ );
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return !!plugin;
+ }
+ );
+ is(result, true, "plugin is loaded");
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ EventUtils.synthesizeKey("KEY_End");
+
+ await waitScrollStart(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, false, "plugin is hidden");
+
+ EventUtils.synthesizeKey("KEY_Home");
+
+ await waitScrollFinish(gBrowser.selectedBrowser);
+
+ result = await SpecialPowers.spawn(
+ pluginTab.linkedBrowser,
+ [],
+ async function() {
+ let doc = content.document.getElementById("subframe").contentDocument;
+ let plugin = doc.getElementById("testplugin");
+ return XPCNativeWrapper.unwrap(plugin).nativeWidgetIsVisible();
+ }
+ );
+ is(result, true, "plugin is visible");
+
+ gBrowser.removeTab(pluginTab);
+});