diff options
Diffstat (limited to 'dom/plugins/test/mochitest/browser_pluginscroll.js')
-rw-r--r-- | dom/plugins/test/mochitest/browser_pluginscroll.js | 417 |
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); +}); |