tenfourfox/browser/base/content/test/plugins/browser_CTP_data_urls.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

255 lines
10 KiB
JavaScript

var rootDir = getRootDirectory(gTestPath);
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
var gPluginHost = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost);
var gTestBrowser = null;
add_task(function* () {
registerCleanupFunction(function () {
clearAllPluginPermissions();
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
Services.prefs.clearUserPref("plugins.click_to_play");
Services.prefs.clearUserPref("extensions.blocklist.suppressUI");
gBrowser.removeCurrentTab();
window.focus();
gTestBrowser = null;
});
gBrowser.selectedTab = gBrowser.addTab();
gTestBrowser = gBrowser.selectedBrowser;
Services.prefs.setBoolPref("plugins.click_to_play", true);
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Second Test Plug-in");
});
// Test that the click-to-play doorhanger still works when navigating to data URLs
add_task(function* () {
yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_data_url.html");
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(popupNotification, "Test 1a, Should have a click-to-play notification");
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 1a, plugin should not be activated");
let loadPromise = promiseTabLoadEvent(gBrowser.selectedTab);
yield ContentTask.spawn(gTestBrowser, {}, function* () {
// navigate forward to a page with 'test' in it
content.document.getElementById("data-link-1").click();
});
yield loadPromise;
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(popupNotification, "Test 1b, Should have a click-to-play notification");
pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 1b, plugin should not be activated");
let promise = promisePopupNotification("click-to-play-plugins");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
let bounds = plugin.getBoundingClientRect();
let left = (bounds.left + bounds.right) / 2;
let top = (bounds.top + bounds.bottom) / 2;
let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
});
yield promise;
// Simulate clicking the "Allow Always" button.
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
PopupNotifications.panel.firstChild;
yield promiseForCondition(condition);
PopupNotifications.panel.firstChild._primaryButton.click();
// check plugin state
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 1b, plugin should be activated");
});
// Test that the click-to-play notification doesn't break when navigating
// to data URLs with multiple plugins.
add_task(function* () {
// We click activated above
clearAllPluginPermissions();
yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_data_url.html");
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 2a, Should have a click-to-play notification");
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 2a, plugin should not be activated");
let loadPromise = promiseTabLoadEvent(gBrowser.selectedTab);
yield ContentTask.spawn(gTestBrowser, {}, function* () {
// navigate forward to a page with 'test1' & 'test2' in it
content.document.getElementById("data-link-2").click();
});
yield loadPromise;
// Work around for delayed PluginBindingAttached
yield ContentTask.spawn(gTestBrowser, {}, function* () {
content.document.getElementById("test1").clientTop;
content.document.getElementById("test2").clientTop;
});
pluginInfo = yield promiseForPluginInfo("test1");
ok(!pluginInfo.activated, "Test 2a, test1 should not be activated");
pluginInfo = yield promiseForPluginInfo("test2");
ok(!pluginInfo.activated, "Test 2a, test2 should not be activated");
notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 2b, Should have a click-to-play notification");
yield promiseForNotificationShown(notification);
// Simulate choosing "Allow now" for the test plugin
is(notification.options.pluginData.size, 2, "Test 2b, Should have two types of plugin in the notification");
let centerAction = null;
for (let action of notification.options.pluginData.values()) {
if (action.pluginName == "Test") {
centerAction = action;
break;
}
}
ok(centerAction, "Test 2b, found center action for the Test plugin");
let centerItem = null;
for (let item of PopupNotifications.panel.firstChild.childNodes) {
is(item.value, "block", "Test 2b, all plugins should start out blocked");
if (item.action == centerAction) {
centerItem = item;
break;
}
}
ok(centerItem, "Test 2b, found center item for the Test plugin");
// "click" the button to activate the Test plugin
centerItem.value = "allownow";
PopupNotifications.panel.firstChild._primaryButton.click();
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
// check plugin state
pluginInfo = yield promiseForPluginInfo("test1");
ok(pluginInfo.activated, "Test 2b, plugin should be activated");
});
add_task(function* () {
// We click activated above
clearAllPluginPermissions();
yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_data_url.html");
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
});
// Test that when navigating to a data url, the plugin permission is inherited
add_task(function* () {
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 3a, Should have a click-to-play notification");
// check plugin state
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 3a, plugin should not be activated");
let promise = promisePopupNotification("click-to-play-plugins");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
let bounds = plugin.getBoundingClientRect();
let left = (bounds.left + bounds.right) / 2;
let top = (bounds.top + bounds.bottom) / 2;
let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
});
yield promise;
// Simulate clicking the "Allow Always" button.
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
PopupNotifications.panel.firstChild;
yield promiseForCondition(condition);
PopupNotifications.panel.firstChild._primaryButton.click();
// check plugin state
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 3a, plugin should be activated");
let loadPromise = promiseTabLoadEvent(gBrowser.selectedTab);
yield ContentTask.spawn(gTestBrowser, {}, function* () {
// navigate forward to a page with 'test' in it
content.document.getElementById("data-link-1").click();
});
yield loadPromise;
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
// check plugin state
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 3b, plugin should be activated");
clearAllPluginPermissions();
});
// Test that the click-to-play doorhanger still works
// when directly navigating to data URLs.
// Fails, bug XXX. Plugins plus a data url don't fire a load event.
/*
add_task(function* () {
yield promiseTabLoadEvent(gBrowser.selectedTab,
"data:text/html,Hi!<embed id='test' style='width:200px; height:200px' type='application/x-test'/>");
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 4a, Should have a click-to-play notification");
// check plugin state
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 4a, plugin should not be activated");
let promise = promisePopupNotification("click-to-play-plugins");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
let bounds = plugin.getBoundingClientRect();
let left = (bounds.left + bounds.right) / 2;
let top = (bounds.top + bounds.bottom) / 2;
let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
});
yield promise;
// Simulate clicking the "Allow Always" button.
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
PopupNotifications.panel.firstChild;
yield promiseForCondition(condition);
PopupNotifications.panel.firstChild._primaryButton.click();
// check plugin state
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 4a, plugin should be activated");
});
*/