зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to inbound. a=merge CLOSED TREE
This commit is contained in:
Коммит
04b5e02692
|
@ -15,6 +15,12 @@ ipc/testshell/.*
|
|||
js/src/builtin/intl/TimeZoneDataGenerated.h
|
||||
js/src/jsapi-tests/.*
|
||||
|
||||
# Generated by js/src/util/make_unicode.py
|
||||
js/src/irregexp/RegExpCharacters-inl.h
|
||||
js/src/irregexp/RegExpCharacters.cpp
|
||||
js/src/util/Unicode.cpp
|
||||
js/src/util/UnicodeNonBMP.h
|
||||
|
||||
# Ignored because of bug 1506117 & 1342657
|
||||
layout/style/nsCSSAnonBoxList.h
|
||||
layout/style/nsCSSCounterDescList.h
|
||||
|
@ -53,8 +59,6 @@ dom/media/platforms/ffmpeg/ffmpeg58/.*
|
|||
dom/media/platforms/ffmpeg/libav53/.*
|
||||
dom/media/platforms/ffmpeg/libav54/.*
|
||||
dom/media/platforms/ffmpeg/libav55/.*
|
||||
dom/media/webaudio/FFTBlock.cpp
|
||||
dom/media/webaudio/blink/.*
|
||||
dom/media/webspeech/recognition/endpointer.cc
|
||||
dom/media/webspeech/recognition/endpointer.h
|
||||
dom/media/webspeech/recognition/energy_endpointer.cc
|
||||
|
|
|
@ -481,11 +481,9 @@ AccessibleWrap::ToBundle(const uint64_t aState,
|
|||
nodeInfo, "roleDescription", jni::StringParam(roleDescription));
|
||||
GECKOBUNDLE_PUT(nodeInfo, "geckoRole", jni::StringParam(geckoRole));
|
||||
|
||||
nsAutoString viewIdResourceName;
|
||||
WrapperDOMNodeID(viewIdResourceName);
|
||||
if (!viewIdResourceName.IsEmpty()) {
|
||||
if (!aDOMNodeID.IsEmpty()) {
|
||||
GECKOBUNDLE_PUT(
|
||||
nodeInfo, "viewIdResourceName", jni::StringParam(viewIdResourceName));
|
||||
nodeInfo, "viewIdResourceName", jni::StringParam(aDOMNodeID));
|
||||
}
|
||||
|
||||
nsIntRect bounds = Bounds();
|
||||
|
|
|
@ -157,6 +157,11 @@
|
|||
testName("toolbaritem_hboxbutton", "ooospspss");
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// name from label inside toolbar button
|
||||
testName("toolbarbuttonwithlabel", "I am the button");
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Name from children
|
||||
|
||||
|
@ -323,6 +328,7 @@
|
|||
tooltiptext="tooltiptext label"/>
|
||||
|
||||
<!-- the name from @title of toolbaritem -->
|
||||
<!-- and the name from label of a toolbarbutton -->
|
||||
<toolbar>
|
||||
<toolbaritem title="ooospspss">
|
||||
<textbox id="toolbaritem_textbox"
|
||||
|
@ -334,6 +340,9 @@
|
|||
</hbox>
|
||||
</textbox>
|
||||
</toolbaritem>
|
||||
<toolbarbutton id="toolbarbuttonwithlabel">
|
||||
<label flex="1">I am the button</label>
|
||||
</toolbarbutton>
|
||||
</toolbar>
|
||||
|
||||
<!-- name from children -->
|
||||
|
|
|
@ -37,7 +37,10 @@
|
|||
var accTree = {
|
||||
role: ROLE_PUSHBUTTON,
|
||||
name: "hello",
|
||||
children: [ ]
|
||||
children: [ {
|
||||
role: ROLE_LABEL,
|
||||
name: "hello"
|
||||
} ]
|
||||
};
|
||||
testAccessibleTree("button2", accTree);
|
||||
|
||||
|
|
|
@ -62,7 +62,12 @@
|
|||
{
|
||||
role: ROLE_PUSHBUTTON,
|
||||
name: "hello",
|
||||
children: [ ]
|
||||
children: [
|
||||
{
|
||||
role: ROLE_LABEL,
|
||||
name: "hello"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
@ -77,7 +82,12 @@
|
|||
{
|
||||
role: ROLE_PUSHBUTTON,
|
||||
name: "hello",
|
||||
children: [ ]
|
||||
children: [
|
||||
{
|
||||
role: ROLE_LABEL,
|
||||
name: "hello"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
|
@ -35,10 +35,21 @@
|
|||
|
||||
this.invoke = function openMenu_invoke()
|
||||
{
|
||||
var tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [ ] }
|
||||
] };
|
||||
var tree = {};
|
||||
if (this.button.name === "toolbarbutton") {
|
||||
tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [ ] },
|
||||
{ LABEL: [
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
} else {
|
||||
tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [ ] }
|
||||
] };
|
||||
}
|
||||
testAccessibleTree(this.button, tree);
|
||||
|
||||
this.__proto__.invoke();
|
||||
|
@ -46,13 +57,27 @@
|
|||
|
||||
this.finalCheck = function openMenu_finalCheck()
|
||||
{
|
||||
var tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [
|
||||
{ role: menuItemRole, children: [ ] },
|
||||
{ role: menuItemRole, children: [ ] }
|
||||
] }
|
||||
] };
|
||||
var tree = {};
|
||||
if (this.button.name === "toolbarbutton") {
|
||||
tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [
|
||||
{ role: menuItemRole, children: [ ] },
|
||||
{ role: menuItemRole, children: [ ] }
|
||||
] },
|
||||
{ LABEL: [
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
} else {
|
||||
tree =
|
||||
{ PUSHBUTTON: [
|
||||
{ MENUPOPUP: [
|
||||
{ role: menuItemRole, children: [ ] },
|
||||
{ role: menuItemRole, children: [ ] }
|
||||
] }
|
||||
] };
|
||||
}
|
||||
testAccessibleTree(this.button, tree);
|
||||
|
||||
synthesizeKey("KEY_Escape");
|
||||
|
|
|
@ -468,6 +468,20 @@ XULToolbarButtonAccessible::IsSeparator(Accessible* aAccessible)
|
|||
nsGkAtoms::toolbarspring);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// XULToolbarButtonAccessible: Widgets
|
||||
|
||||
bool
|
||||
XULToolbarButtonAccessible::IsAcceptableChild(nsIContent* aEl) const
|
||||
{
|
||||
// In general XUL button has not accessible children. Nevertheless menu
|
||||
// buttons can have popup accessibles (@type="menu" or columnpicker).
|
||||
// Also: Toolbar buttons can have labels as children.
|
||||
return aEl->IsXULElement(nsGkAtoms::menupopup) ||
|
||||
aEl->IsXULElement(nsGkAtoms::popup) ||
|
||||
aEl->IsXULElement(nsGkAtoms::label);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// XULToolbarAccessible
|
||||
|
|
|
@ -154,6 +154,9 @@ public:
|
|||
|
||||
// nsXULToolbarButtonAccessible
|
||||
static bool IsSeparator(Accessible* aAccessible);
|
||||
|
||||
// Widgets
|
||||
virtual bool IsAcceptableChild(nsIContent* aEl) const override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -695,13 +695,15 @@ class ContextMenuChild extends ActorChild {
|
|||
|
||||
let node = aEvent.composedTarget;
|
||||
|
||||
// Set the node to containing <video>/<audio> if the node
|
||||
// is in the videocontrols UA Widget.
|
||||
// Set the node to containing <video>/<audio>/<embed>/<object> if the node
|
||||
// is in the videocontrols/pluginProblem UA Widget.
|
||||
if (this.content.ShadowRoot) {
|
||||
let n = node;
|
||||
while (n) {
|
||||
if (n instanceof this.content.ShadowRoot) {
|
||||
if (n.host instanceof this.content.HTMLMediaElement) {
|
||||
if (n.host instanceof this.content.HTMLMediaElement ||
|
||||
n.host instanceof this.content.HTMLEmbedElement ||
|
||||
n.host instanceof this.content.HTMLObjectElement) {
|
||||
node = n.host;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -121,8 +121,12 @@ class PluginChild extends ActorChild {
|
|||
}
|
||||
|
||||
getPluginUI(plugin, anonid) {
|
||||
if (plugin.openOrClosedShadowRoot &&
|
||||
plugin.openOrClosedShadowRoot.isUAWidget()) {
|
||||
return plugin.openOrClosedShadowRoot.getElementById(anonid);
|
||||
}
|
||||
return plugin.ownerDocument.
|
||||
getAnonymousElementByAttribute(plugin, "anonid", anonid);
|
||||
getAnonymousElementByAttribute(plugin, "anonid", anonid);
|
||||
}
|
||||
|
||||
_getPluginInfo(pluginElement) {
|
||||
|
@ -632,7 +636,8 @@ class PluginChild extends ActorChild {
|
|||
let overlay = this.getPluginUI(plugin, "main");
|
||||
// Have to check that the target is not the link to update the plugin
|
||||
if (!(ChromeUtils.getClassName(event.originalTarget) === "HTMLAnchorElement") &&
|
||||
(event.originalTarget.getAttribute("anonid") != "closeIcon") &&
|
||||
event.originalTarget.getAttribute("anonid") != "closeIcon" &&
|
||||
event.originalTarget.id != "closeIcon" &&
|
||||
!overlay.hasAttribute("dismissed") &&
|
||||
event.button == 0 &&
|
||||
event.isTrusted) {
|
||||
|
|
|
@ -1274,6 +1274,16 @@ pref("browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts",
|
|||
pref("browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts", false);
|
||||
#endif
|
||||
|
||||
// ASRouter provider configuration
|
||||
#if defined(NIGHTLY_BUILD)
|
||||
pref("browser.newtabpage.activity-stream.asrouter.providers.snippets", "{\"id\":\"snippets\",\"enabled\":true,\"type\":\"remote\",\"url\":\"https://snippets.cdn.mozilla.net/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/\",\"updateCycleInMs\":14400000}");
|
||||
pref("browser.newtabpage.activity-stream.asrouter.providers.cfr", "{\"id\":\"cfr\",\"enabled\":true,\"type\":\"local\",\"localProvider\":\"CFRMessageProvider\",\"frequency\":{\"custom\":[{\"period\":\"daily\",\"cap\":1}]}}");
|
||||
#else
|
||||
pref("browser.newtabpage.activity-stream.asrouter.providers.snippets", "{\"id\":\"snippets\",\"enabled\":false,\"type\":\"remote\",\"url\":\"https://snippets.cdn.mozilla.net/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/\",\"updateCycleInMs\":14400000}");
|
||||
pref("browser.newtabpage.activity-stream.asrouter.providers.cfr", "{\"id\":\"cfr\",\"enabled\":false,\"type\":\"local\",\"localProvider\":\"CFRMessageProvider\",\"frequency\":{\"custom\":[{\"period\":\"daily\",\"cap\":1}]}}");
|
||||
#endif
|
||||
|
||||
|
||||
// Enable the DOM fullscreen API.
|
||||
pref("full-screen-api.enabled", true);
|
||||
|
||||
|
|
|
@ -597,7 +597,13 @@ var FullScreen = {
|
|||
// Wait for at least a frame to give it a chance to be passed down to
|
||||
// the content.
|
||||
requestAnimationFrame(() => {
|
||||
setTimeout(() => this.hideNavToolbox(aAnimate), 0);
|
||||
setTimeout(() => {
|
||||
// In the meantime, it's possible that we exited fullscreen somehow,
|
||||
// so only hide the toolbox if we're still in fullscreen mode.
|
||||
if (window.fullScreen) {
|
||||
this.hideNavToolbox(aAnimate);
|
||||
}
|
||||
}, 0);
|
||||
});
|
||||
window.removeEventListener("keypress", retryHideNavToolbox);
|
||||
window.removeEventListener("click", retryHideNavToolbox);
|
||||
|
|
|
@ -445,7 +445,7 @@ var gPluginHandler = {
|
|||
|
||||
// Configure the notification bar
|
||||
let priority = notificationBox.PRIORITY_WARNING_MEDIUM;
|
||||
let iconURL = "chrome://mozapps/skin/plugins/pluginGeneric.svg";
|
||||
let iconURL = "chrome://global/skin/plugins/pluginGeneric.svg";
|
||||
let reloadLabel = gNavigatorBundle.getString("crashedpluginsMessage.reloadButton.label");
|
||||
let reloadKey = gNavigatorBundle.getString("crashedpluginsMessage.reloadButton.accesskey");
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
/* eslint-env mozilla/browser-window */
|
||||
|
||||
{ // start private scope for gBrowser
|
||||
|
||||
/**
|
||||
* A set of known icons to use for internal pages. These are hardcoded so we can
|
||||
* start loading them faster than ContentLinkHandler would normally find them.
|
||||
|
@ -5252,6 +5254,8 @@ TabProgressListener.prototype.QueryInterface = ChromeUtils.generateQI(
|
|||
"nsIWebProgressListener2",
|
||||
"nsISupportsWeakReference"]);
|
||||
|
||||
} // end private scope for gBrowser
|
||||
|
||||
var StatusPanel = {
|
||||
get panel() {
|
||||
window.addEventListener("resize", this);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[DEFAULT]
|
||||
prefs = dom.ua_widget.enabled=true
|
||||
support-files =
|
||||
blocklist_proxy.js
|
||||
blockNoPlugins.xml
|
||||
|
|
|
@ -96,10 +96,8 @@ add_task(async function() {
|
|||
} catch (e) {
|
||||
}
|
||||
|
||||
let doc = plugin.ownerDocument;
|
||||
|
||||
let getUI = (anonid) => {
|
||||
return doc.getAnonymousElementByAttribute(plugin, "anonid", anonid);
|
||||
let getUI = (id) => {
|
||||
return plugin.openOrClosedShadowRoot.getElementById(id);
|
||||
};
|
||||
|
||||
// Now wait until the plugin crash report UI shows itself, which is
|
||||
|
|
|
@ -33,8 +33,8 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
let closeIcon = plugin.openOrClosedShadowRoot.getElementById("closeIcon");
|
||||
let bounds = closeIcon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
|
@ -59,8 +59,8 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
let closeIcon = plugin.openOrClosedShadowRoot.getElementById("closeIcon");
|
||||
let closeIconBounds = closeIcon.getBoundingClientRect();
|
||||
let overlayBounds = overlay.getBoundingClientRect();
|
||||
let overlayLeft = (overlayBounds.left + overlayBounds.right) / 2;
|
||||
|
|
|
@ -29,11 +29,11 @@ add_task(async function() {
|
|||
let frame = content.document.getElementById("frame");
|
||||
let doc = frame.contentDocument;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(plugin && overlay.classList.contains("visible"),
|
||||
"Test 1, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let closeIcon = plugin.openOrClosedShadowRoot.getElementById("closeIcon");
|
||||
let bounds = closeIcon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
|
|
|
@ -55,8 +55,7 @@ add_task(async function() {
|
|||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible") &&
|
||||
overlay.getAttribute("sizing") != "blank",
|
||||
"Test 2, overlay should be visible.");
|
||||
|
@ -85,8 +84,7 @@ add_task(async function() {
|
|||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible") &&
|
||||
overlay.getAttribute("sizing") != "blank",
|
||||
"Test 3, overlay should be visible.");
|
||||
|
@ -114,8 +112,7 @@ add_task(async function() {
|
|||
await promisePopupNotification("click-to-play-plugins");
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 4, overlay should be blank.");
|
||||
});
|
||||
|
|
|
@ -75,7 +75,7 @@ add_task(async function() {
|
|||
|
||||
for (let testcaseId of Object.keys(testcases)) {
|
||||
let plugin = doc.querySelector(`#${testcaseId} > object`);
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay, `overlay exists in ${testcaseId}`);
|
||||
|
||||
let expectations = testcases[testcaseId];
|
||||
|
|
|
@ -45,7 +45,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 2, overlay should be blank.");
|
||||
});
|
||||
|
@ -63,7 +63,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 3, overlay should be blank.");
|
||||
});
|
||||
|
@ -83,7 +83,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.getAttribute("sizing") != "blank",
|
||||
"Test 4, overlay should be visible.");
|
||||
});
|
||||
|
@ -103,7 +103,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 5, overlay should be blank.");
|
||||
});
|
||||
|
@ -123,7 +123,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.getAttribute("sizing") != "blank",
|
||||
"Test 6, overlay should be visible.");
|
||||
});
|
||||
|
|
|
@ -51,7 +51,7 @@ add_task(async function() {
|
|||
let plugin = testcase.querySelector("object");
|
||||
Assert.ok(plugin, `plugin exists in ${testcase.id}`);
|
||||
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay, `overlay exists in ${testcase.id}`);
|
||||
|
||||
let expectedVisibility = (testcase.getAttribute("shouldshow") == "true");
|
||||
|
|
|
@ -52,7 +52,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, { count }, async function(args) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Overlay should be visible for zoom change count " + args.count);
|
||||
});
|
||||
|
|
|
@ -55,11 +55,11 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18a, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
let updateLink = plugin.openOrClosedShadowRoot.getElementById("checkForUpdatesLink");
|
||||
Assert.ok(updateLink.style.visibility != "hidden",
|
||||
"Test 18a, Plugin should have an update link");
|
||||
});
|
||||
|
@ -69,7 +69,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
let updateLink = plugin.openOrClosedShadowRoot.getElementById("checkForUpdatesLink");
|
||||
let bounds = updateLink.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
|
@ -94,7 +94,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18b, Plugin overlay should exist, not be hidden");
|
||||
});
|
||||
|
@ -122,11 +122,11 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18c, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
let updateLink = plugin.openOrClosedShadowRoot.getElementById("checkForUpdatesLink");
|
||||
Assert.ok(updateLink && updateLink.style.display != "block",
|
||||
"Test 18c, Plugin should not have an update link");
|
||||
});
|
||||
|
|
|
@ -63,10 +63,10 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
let submitButton = doc.getAnonymousElementByAttribute(plugin, "anonid", "submitButton");
|
||||
let pleaseSubmit = plugin.openOrClosedShadowRoot.getElementById("pleaseSubmit");
|
||||
let submitButton = plugin.openOrClosedShadowRoot.getElementById("submitButton");
|
||||
// Test that we don't send the URL when urlOptIn is false.
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
plugin.openOrClosedShadowRoot.getElementById("submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
submitButton.click();
|
||||
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
|
||||
|
@ -100,11 +100,11 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
let submitButton = doc.getAnonymousElementByAttribute(plugin, "anonid", "submitButton");
|
||||
let pleaseSubmit = plugin.openOrClosedShadowRoot.getElementById("pleaseSubmit");
|
||||
let submitButton = plugin.openOrClosedShadowRoot.getElementById("submitButton");
|
||||
// Test that we send the URL when urlOptIn is true.
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitComment").value = aConfig.comment;
|
||||
plugin.openOrClosedShadowRoot.getElementById("submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
plugin.openOrClosedShadowRoot.getElementById("submitComment").value = aConfig.comment;
|
||||
submitButton.click();
|
||||
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
|
||||
|
@ -171,7 +171,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
let pleaseSubmit = plugin.openOrClosedShadowRoot.getElementById("pleaseSubmit");
|
||||
Assert.equal(!!pleaseSubmit && content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "Plugin crash UI should not be visible");
|
||||
});
|
||||
|
|
|
@ -59,9 +59,8 @@ function preparePlugin(browser, pluginFallbackState) {
|
|||
// state.
|
||||
let statusDiv;
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
statusDiv = plugin.openOrClosedShadowRoot.getElementById("submitStatus");
|
||||
|
||||
return statusDiv && statusDiv.getAttribute("status") == "please";
|
||||
}, "Timed out waiting for plugin to be in crash report state");
|
||||
|
||||
|
@ -158,9 +157,7 @@ add_task(async function testChromeHearsPluginCrashFirst() {
|
|||
// the PluginCrashed event.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
let statusDiv = plugin.openOrClosedShadowRoot.getElementById("submitStatus");
|
||||
|
||||
if (statusDiv.getAttribute("status") == "please") {
|
||||
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
|
||||
|
@ -220,9 +217,7 @@ add_task(async function testContentHearsCrashFirst() {
|
|||
// we're not showing the plugin crash report UI.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
let statusDiv = plugin.openOrClosedShadowRoot.getElementById("submitStatus");
|
||||
|
||||
if (statusDiv.getAttribute("status") == "please") {
|
||||
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
|
||||
|
@ -255,9 +250,7 @@ add_task(async function testContentHearsCrashFirst() {
|
|||
// crash report UI now.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
let statusDiv = plugin.openOrClosedShadowRoot.getElementById("submitStatus");
|
||||
|
||||
Assert.equal(statusDiv.getAttribute("status"), "please",
|
||||
"Should have been showing crash report UI");
|
||||
|
|
|
@ -90,7 +90,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let bounds = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
|
||||
let bounds = plugin.openOrClosedShadowRoot.getElementById("main").getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
|
@ -195,7 +195,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let mainBox = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!!mainBox, "Test 15, Plugin overlay should exist");
|
||||
});
|
||||
});
|
||||
|
@ -230,7 +230,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let icon = doc.getAnonymousElementByAttribute(plugin, "class", "icon");
|
||||
let icon = plugin.openOrClosedShadowRoot.getElementById("icon");
|
||||
let bounds = icon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
|
@ -259,7 +259,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let text = doc.getAnonymousElementByAttribute(plugin, "class", "msg msgClickToPlay");
|
||||
let text = plugin.openOrClosedShadowRoot.getElementById("clickToPlay");
|
||||
let bounds = text.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
|
@ -319,14 +319,14 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlay = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
Assert.ok(!!overlay, "Test 20a, Plugin overlay should exist");
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let mainBox = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
let overlayRect = mainBox.getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
|
||||
"Test 20a, plugin should have an overlay with 0px width and height");
|
||||
|
@ -351,7 +351,7 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let mainBox = plugin.openOrClosedShadowRoot.getElementById("main");
|
||||
let overlayRect = mainBox.getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 200 && overlayRect.height == 200,
|
||||
"Test 20c, plugin should have overlay dims of 200px");
|
||||
|
@ -383,9 +383,8 @@ add_task(async function() {
|
|||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
|
||||
"Test 20c, plugin should have overlay dims of 0px");
|
||||
Assert.ok(!plugin.openOrClosedShadowRoot,
|
||||
"Test 20c, CTP UA Widget Shadow Root is removed");
|
||||
});
|
||||
|
||||
clearAllPluginPermissions();
|
||||
|
|
|
@ -200,13 +200,12 @@ add_task(async function test3d() {
|
|||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
let doc = gPrivateWindow.document;
|
||||
for (let item of gPrivateWindow.PopupNotifications.panel.firstElementChild.children) {
|
||||
let allowalways = doc.getAnonymousElementByAttribute(item, "anonid", "allowalways");
|
||||
let allowalways = item.openOrClosedShadowRoot.getElementById("allowalways");
|
||||
ok(allowalways, "Test 3d, should have list item for allow always");
|
||||
let allownow = doc.getAnonymousElementByAttribute(item, "anonid", "allownow");
|
||||
let allownow = item.openOrClosedShadowRoot.getElementById("allownow");
|
||||
ok(allownow, "Test 3d, should have list item for allow now");
|
||||
let block = doc.getAnonymousElementByAttribute(item, "anonid", "block");
|
||||
let block = item.openOrClosedShadowRoot.getElementById("block");
|
||||
ok(block, "Test 3d, should have list item for block");
|
||||
|
||||
if (item.action.pluginName === "Test") {
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
"extends": [
|
||||
"plugin:mozilla/browser-test"
|
||||
]
|
||||
};
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1336406310001">
|
||||
<emItems>
|
||||
</emItems>
|
||||
<pluginItems>
|
||||
</pluginItems>
|
||||
</blocklist>
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1336406310000">
|
||||
<emItems>
|
||||
</emItems>
|
||||
<pluginItems>
|
||||
<pluginItem blockID="p9999">
|
||||
<match name="filename" exp="libnptest\.so|nptest\.dll|Test\.plugin" />
|
||||
<versionRange severity="2"></versionRange>
|
||||
</pluginItem>
|
||||
</pluginItems>
|
||||
</blocklist>
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1336406310000">
|
||||
<emItems>
|
||||
</emItems>
|
||||
<pluginItems>
|
||||
<pluginItem blockID="p9999">
|
||||
<match name="filename" exp="libnptest\.so|nptest\.dll|Test\.plugin" />
|
||||
<versionRange severity="2"></versionRange>
|
||||
<infoURL>http://test.url.com/</infoURL>
|
||||
</pluginItem>
|
||||
</pluginItems>
|
||||
</blocklist>
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1336406310000">
|
||||
<emItems>
|
||||
</emItems>
|
||||
<pluginItems>
|
||||
<pluginItem blockID="p9999">
|
||||
<match name="filename" exp="libnptest\.so|nptest\.dll|Test\.plugin" />
|
||||
<versionRange severity="0" vulnerabilitystatus="2"></versionRange>
|
||||
</pluginItem>
|
||||
</pluginItems>
|
||||
</blocklist>
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1336406310000">
|
||||
<emItems>
|
||||
</emItems>
|
||||
<pluginItems>
|
||||
<pluginItem blockID="p9999">
|
||||
<match name="filename" exp="libnptest\.so|nptest\.dll|Test\.plugin" />
|
||||
<versionRange severity="0" vulnerabilitystatus="1"></versionRange>
|
||||
</pluginItem>
|
||||
</pluginItems>
|
||||
</blocklist>
|
|
@ -0,0 +1,69 @@
|
|||
var Cm = Components.manager;
|
||||
|
||||
const kBlocklistServiceUUID = "{66354bc9-7ed1-4692-ae1d-8da97d6b205e}";
|
||||
const kBlocklistServiceContractID = "@mozilla.org/extensions/blocklist;1";
|
||||
const kBlocklistServiceFactory = Cm.getClassObject(Cc[kBlocklistServiceContractID], Ci.nsIFactory);
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
ChromeUtils.import("resource://gre/modules/Timer.jsm");
|
||||
|
||||
SimpleTest.requestFlakyTimeout("Need to simulate blocklist calls actually taking non-0 time to return");
|
||||
|
||||
/*
|
||||
* A lightweight blocklist proxy for the testing purposes.
|
||||
*/
|
||||
var BlocklistProxy = {
|
||||
_uuid: null,
|
||||
|
||||
QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver,
|
||||
Ci.nsIBlocklistService,
|
||||
Ci.nsITimerCallback]),
|
||||
|
||||
init() {
|
||||
if (!this._uuid) {
|
||||
this._uuid =
|
||||
Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator)
|
||||
.generateUUID();
|
||||
Cm.nsIComponentRegistrar.registerFactory(this._uuid, "",
|
||||
"@mozilla.org/extensions/blocklist;1",
|
||||
this);
|
||||
}
|
||||
},
|
||||
|
||||
uninit() {
|
||||
if (this._uuid) {
|
||||
Cm.nsIComponentRegistrar.unregisterFactory(this._uuid, this);
|
||||
Cm.nsIComponentRegistrar.registerFactory(Components.ID(kBlocklistServiceUUID),
|
||||
"Blocklist Service",
|
||||
"@mozilla.org/extensions/blocklist;1",
|
||||
kBlocklistServiceFactory);
|
||||
this._uuid = null;
|
||||
}
|
||||
},
|
||||
|
||||
notify(aTimer) {
|
||||
},
|
||||
|
||||
observe(aSubject, aTopic, aData) {
|
||||
},
|
||||
|
||||
async getAddonBlocklistState(aAddon, aAppVersion, aToolkitVersion) {
|
||||
await new Promise(r => setTimeout(r, 150));
|
||||
return 0; // STATE_NOT_BLOCKED
|
||||
},
|
||||
|
||||
async getPluginBlocklistState(aPluginTag, aAppVersion, aToolkitVersion) {
|
||||
await new Promise(r => setTimeout(r, 150));
|
||||
return 0; // STATE_NOT_BLOCKED
|
||||
},
|
||||
|
||||
async getPluginBlockURL(aPluginTag) {
|
||||
await new Promise(r => setTimeout(r, 150));
|
||||
return "";
|
||||
},
|
||||
};
|
||||
|
||||
BlocklistProxy.init();
|
||||
addEventListener("unload", () => {
|
||||
BlocklistProxy.uninit();
|
||||
});
|
|
@ -0,0 +1,98 @@
|
|||
[DEFAULT]
|
||||
prefs = dom.ua_widget.enabled=false
|
||||
support-files =
|
||||
blocklist_proxy.js
|
||||
blockNoPlugins.xml
|
||||
blockPluginHard.xml
|
||||
blockPluginInfoURL.xml
|
||||
blockPluginVulnerableNoUpdate.xml
|
||||
blockPluginVulnerableUpdatable.xml
|
||||
browser_clearplugindata.html
|
||||
browser_clearplugindata_noage.html
|
||||
empty_file.html
|
||||
../head.js
|
||||
plugin_add_dynamically.html
|
||||
plugin_alternate_content.html
|
||||
plugin_big.html
|
||||
plugin_both.html
|
||||
plugin_both2.html
|
||||
plugin_bug744745.html
|
||||
plugin_bug749455.html
|
||||
plugin_bug787619.html
|
||||
plugin_bug797677.html
|
||||
plugin_bug820497.html
|
||||
plugin_clickToPlayAllow.html
|
||||
plugin_clickToPlayDeny.html
|
||||
plugin_favorfallback.html
|
||||
plugin_hidden_to_visible.html
|
||||
plugin_iframe.html
|
||||
plugin_outsideScrollArea.html
|
||||
plugin_overlay_styles.html
|
||||
plugin_simple_blank.swf
|
||||
plugin_shouldShowOverlay.html
|
||||
plugin_small.html
|
||||
plugin_small_2.html
|
||||
plugin_syncRemoved.html
|
||||
plugin_test.html
|
||||
plugin_test2.html
|
||||
plugin_test3.html
|
||||
plugin_two_types.html
|
||||
plugin_unknown.html
|
||||
plugin_crashCommentAndURL.html
|
||||
plugin_zoom.html
|
||||
|
||||
[browser_bug743421.js]
|
||||
tags = blocklist
|
||||
[browser_bug744745.js]
|
||||
[browser_bug787619.js]
|
||||
[browser_bug797677.js]
|
||||
[browser_bug812562.js]
|
||||
tags = blocklist
|
||||
[browser_bug818118.js]
|
||||
[browser_bug820497.js]
|
||||
[browser_clearplugindata.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_context_menu.js]
|
||||
skip-if = toolkit == "gtk3" # fails intermittently on Linux (bug 909342)
|
||||
tags = blocklist
|
||||
[browser_CTP_crashreporting.js]
|
||||
skip-if = !crashreporter || verify
|
||||
tags = blocklist
|
||||
[browser_CTP_drag_drop.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_favorfallback.js]
|
||||
[browser_CTP_hide_overlay.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_iframe.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_nonplugins.js]
|
||||
skip-if = verify
|
||||
tags = blocklist
|
||||
[browser_CTP_outsideScrollArea.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_overlay_styles.js]
|
||||
[browser_CTP_resize.js]
|
||||
tags = blocklist
|
||||
[browser_CTP_shouldShowOverlay.js]
|
||||
[browser_CTP_zoom.js]
|
||||
tags = blocklist
|
||||
[browser_blocking.js]
|
||||
tags = blocklist
|
||||
[browser_iterate_hidden_plugins.js]
|
||||
[browser_pluginnotification.js]
|
||||
tags = blocklist
|
||||
[browser_plugin_reloading.js]
|
||||
tags = blocklist
|
||||
[browser_blocklist_content.js]
|
||||
skip-if = !e10s
|
||||
tags = blocklist
|
||||
[browser_enable_DRM_prompt.js]
|
||||
[browser_private_browsing_eme_persistent_state.js]
|
||||
[browser_globalplugin_crashinfobar.js]
|
||||
skip-if = !crashreporter
|
||||
[browser_pluginCrashCommentAndURL.js]
|
||||
skip-if = !crashreporter
|
||||
[browser_pluginCrashReportNonDeterminism.js]
|
||||
skip-if = !crashreporter
|
||||
[browser_private_clicktoplay.js]
|
||||
[browser_subframe_access_hidden_plugins.js]
|
|
@ -0,0 +1,70 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
add_task(async 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();
|
||||
});
|
||||
});
|
||||
|
||||
// Test that the activate action in content menus for CTP plugins works
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
let bindingPromise = BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "PluginBindingAttached", true, null, true);
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
await bindingPromise;
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
ok(popupNotification, "Test 1, Should have a click-to-play notification");
|
||||
|
||||
// check plugin state
|
||||
let pluginInfo = await promiseForPluginInfo("test", gBrowser.selectedBrowser);
|
||||
ok(!pluginInfo.activated, "plugin should not be activated");
|
||||
|
||||
// Display a context menu on the test plugin so we can test
|
||||
// activation menu options.
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, {}, async 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.windowUtils;
|
||||
utils.sendMouseEvent("contextmenu", left, top, 2, 1, 0);
|
||||
});
|
||||
|
||||
popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
ok(popupNotification, "Should have a click-to-play notification");
|
||||
ok(popupNotification.dismissed, "notification should be dismissed");
|
||||
|
||||
// fixes a occasional test timeout on win7 opt
|
||||
await promiseForCondition(() => document.getElementById("context-ctp-play"));
|
||||
|
||||
let actMenuItem = document.getElementById("context-ctp-play");
|
||||
ok(actMenuItem, "Should have a context menu entry for activating the plugin");
|
||||
|
||||
// Activate the plugin via the context menu
|
||||
EventUtils.synthesizeMouseAtCenter(actMenuItem, {});
|
||||
|
||||
await promiseForCondition(() => !PopupNotifications.panel.dismissed && PopupNotifications.panel.firstElementChild);
|
||||
|
||||
// Activate the plugin
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
// check plugin state
|
||||
pluginInfo = await promiseForPluginInfo("test", gBrowser.selectedBrowser);
|
||||
ok(pluginInfo.activated, "plugin should not be activated");
|
||||
});
|
|
@ -0,0 +1,234 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
const SERVER_URL = "http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs";
|
||||
const PLUGIN_PAGE = gTestRoot + "plugin_big.html";
|
||||
const PLUGIN_SMALL_PAGE = gTestRoot + "plugin_small.html";
|
||||
|
||||
/**
|
||||
* Takes an nsIPropertyBag and converts it into a JavaScript Object. It
|
||||
* will also convert any nsIPropertyBag's within the nsIPropertyBag
|
||||
* recursively.
|
||||
*
|
||||
* @param aBag
|
||||
* The nsIPropertyBag to convert.
|
||||
* @return Object
|
||||
* Keyed on the names of the nsIProperty's within the nsIPropertyBag,
|
||||
* and mapping to their values.
|
||||
*/
|
||||
function convertPropertyBag(aBag) {
|
||||
let result = {};
|
||||
for (let { name, value } of aBag.enumerator) {
|
||||
if (value instanceof Ci.nsIPropertyBag) {
|
||||
value = convertPropertyBag(value);
|
||||
}
|
||||
result[name] = value;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
add_task(async function setup() {
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
// The test harness sets MOZ_CRASHREPORTER_NO_REPORT, which disables plugin
|
||||
// crash reports. This test needs them enabled. The test also needs a mock
|
||||
// report server, and fortunately one is already set up by toolkit/
|
||||
// crashreporter/test/Makefile.in. Assign its URL to MOZ_CRASHREPORTER_URL,
|
||||
// which CrashSubmit.jsm uses as a server override.
|
||||
let env = Cc["@mozilla.org/process/environment;1"].
|
||||
getService(Ci.nsIEnvironment);
|
||||
let noReport = env.get("MOZ_CRASHREPORTER_NO_REPORT");
|
||||
let serverURL = env.get("MOZ_CRASHREPORTER_URL");
|
||||
env.set("MOZ_CRASHREPORTER_NO_REPORT", "");
|
||||
env.set("MOZ_CRASHREPORTER_URL", SERVER_URL);
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
registerCleanupFunction(function cleanUp() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
env.set("MOZ_CRASHREPORTER_NO_REPORT", noReport);
|
||||
env.set("MOZ_CRASHREPORTER_URL", serverURL);
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
Services.prefs.clearUserPref("extensions.blocklist.suppressUI");
|
||||
window.focus();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Test that plugin crash submissions still work properly after
|
||||
* click-to-play activation.
|
||||
*/
|
||||
add_task(async function() {
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: PLUGIN_PAGE,
|
||||
}, async function(browser) {
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(browser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test", browser);
|
||||
ok(!pluginInfo.activated, "Plugin should not be activated");
|
||||
|
||||
// Simulate clicking the "Allow Always" button.
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", browser);
|
||||
await promiseForNotificationShown(notification, browser);
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
// Prepare a crash report topic observer that only returns when
|
||||
// the crash report has been successfully sent.
|
||||
let crashReportChecker = (subject, data) => {
|
||||
return (data == "success");
|
||||
};
|
||||
let crashReportPromise = TestUtils.topicObserved("crash-report-status",
|
||||
crashReportChecker);
|
||||
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
return plugin.activated;
|
||||
}, "Waited too long for plugin to activate.");
|
||||
|
||||
try {
|
||||
Cu.waiveXrays(plugin).crash();
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
let doc = plugin.ownerDocument;
|
||||
|
||||
let getUI = (anonid) => {
|
||||
return doc.getAnonymousElementByAttribute(plugin, "anonid", anonid);
|
||||
};
|
||||
|
||||
// Now wait until the plugin crash report UI shows itself, which is
|
||||
// asynchronous.
|
||||
let statusDiv;
|
||||
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
statusDiv = getUI("submitStatus");
|
||||
return statusDiv.getAttribute("status") == "please";
|
||||
}, "Waited too long for plugin to show crash report UI");
|
||||
|
||||
// Make sure the UI matches our expectations...
|
||||
let style = content.getComputedStyle(getUI("pleaseSubmit"));
|
||||
if (style.display != "block") {
|
||||
throw new Error(`Submission UI visibility is not correct. ` +
|
||||
`Expected block style, got ${style.display}.`);
|
||||
}
|
||||
|
||||
// Fill the crash report in with some test values that we'll test for in
|
||||
// the parent.
|
||||
getUI("submitComment").value = "a test comment";
|
||||
let optIn = getUI("submitURLOptIn");
|
||||
if (!optIn.checked) {
|
||||
throw new Error("URL opt-in should default to true.");
|
||||
}
|
||||
|
||||
// Submit the report.
|
||||
optIn.click();
|
||||
getUI("submitButton").click();
|
||||
|
||||
// And wait for the parent to say that the crash report was submitted
|
||||
// successfully. This can take time on debug builds.
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
return statusDiv.getAttribute("status") == "success";
|
||||
}, "Timed out waiting for plugin binding to be in success state",
|
||||
100, 200);
|
||||
});
|
||||
|
||||
let [subject ] = await crashReportPromise;
|
||||
|
||||
ok(subject instanceof Ci.nsIPropertyBag,
|
||||
"The crash report subject should be an nsIPropertyBag.");
|
||||
|
||||
let crashData = convertPropertyBag(subject);
|
||||
ok(crashData.serverCrashID, "Should have a serverCrashID set.");
|
||||
|
||||
// Remove the submitted report file after ensuring it exists.
|
||||
let file = Cc["@mozilla.org/file/local;1"]
|
||||
.createInstance(Ci.nsIFile);
|
||||
file.initWithPath(Services.crashmanager._submittedDumpsDir);
|
||||
file.append(crashData.serverCrashID + ".txt");
|
||||
ok(file.exists(), "Submitted report file should exist");
|
||||
file.remove(false);
|
||||
|
||||
ok(crashData.extra, "Extra data should exist");
|
||||
is(crashData.extra.PluginUserComment, "a test comment",
|
||||
"Comment in extra data should match comment in textbox");
|
||||
|
||||
is(crashData.extra.PluginContentURL, undefined,
|
||||
"URL should be absent from extra data when opt-in not checked");
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Test that plugin crash submissions still work properly after
|
||||
* click-to-play with the notification bar.
|
||||
*/
|
||||
add_task(async function() {
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: PLUGIN_SMALL_PAGE,
|
||||
}, async function(browser) {
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(browser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test", browser);
|
||||
ok(pluginInfo.activated, "Plugin should be activated from previous test");
|
||||
|
||||
// Prepare a crash report topic observer that only returns when
|
||||
// the crash report has been successfully sent.
|
||||
let crashReportChecker = (subject, data) => {
|
||||
return (data == "success");
|
||||
};
|
||||
let crashReportPromise = TestUtils.topicObserved("crash-report-status",
|
||||
crashReportChecker);
|
||||
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
return plugin.activated;
|
||||
}, "Waited too long for plugin to activate.");
|
||||
|
||||
try {
|
||||
Cu.waiveXrays(plugin).crash();
|
||||
} catch (e) {}
|
||||
});
|
||||
|
||||
// Wait for the notification bar to be displayed.
|
||||
let notification = await waitForNotificationBar("plugin-crashed", browser);
|
||||
|
||||
// Then click the button to submit the crash report.
|
||||
let buttons = notification.querySelectorAll(".notification-button");
|
||||
is(buttons.length, 2, "Should have two buttons.");
|
||||
|
||||
// The "Submit Crash Report" button should be the second one.
|
||||
let submitButton = buttons[1];
|
||||
submitButton.click();
|
||||
|
||||
let [subject ] = await crashReportPromise;
|
||||
|
||||
ok(subject instanceof Ci.nsIPropertyBag,
|
||||
"The crash report subject should be an nsIPropertyBag.");
|
||||
|
||||
let crashData = convertPropertyBag(subject);
|
||||
ok(crashData.serverCrashID, "Should have a serverCrashID set.");
|
||||
|
||||
// Remove the submitted report file after ensuring it exists.
|
||||
let file = Cc["@mozilla.org/file/local;1"]
|
||||
.createInstance(Ci.nsIFile);
|
||||
file.initWithPath(Services.crashmanager._submittedDumpsDir);
|
||||
file.append(crashData.serverCrashID + ".txt");
|
||||
ok(file.exists(), "Submitted report file should exist");
|
||||
file.remove(false);
|
||||
|
||||
is(crashData.extra.PluginContentURL, undefined,
|
||||
"URL should be absent from extra data when opt-in not checked");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,97 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gNewWindow = null;
|
||||
|
||||
add_task(async 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");
|
||||
gNewWindow.close();
|
||||
gNewWindow = null;
|
||||
window.focus();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gNewWindow = gBrowser.replaceTabWithWindow(gBrowser.selectedTab);
|
||||
|
||||
// XXX technically can't load fire before we get this call???
|
||||
await BrowserTestUtils.waitForEvent(gNewWindow, "load", true);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser);
|
||||
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser), "Should have a click-to-play notification in the tab in the new window");
|
||||
ok(!PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser), "Should not have a click-to-play notification in the old window now");
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gBrowser.swapBrowsersAndCloseOther(gBrowser.selectedTab, gNewWindow.gBrowser.selectedTab);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser), "Should have a click-to-play notification in the initial tab again");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
gNewWindow = gBrowser.replaceTabWithWindow(gBrowser.selectedTab);
|
||||
|
||||
await promiseWaitForFocus(gNewWindow);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser);
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser), "Should have a click-to-play notification in the tab in the new window");
|
||||
ok(!PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser), "Should not have a click-to-play notification in the old window now");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test", gNewWindow.gBrowser.selectedBrowser);
|
||||
ok(!pluginInfo.activated, "plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gNewWindow.gBrowser.selectedBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let bounds = plugin.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gNewWindow.gBrowser.selectedBrowser).dismissed && gNewWindow.PopupNotifications.panel.firstElementChild;
|
||||
await promiseForCondition(condition);
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
// Click the activate button on doorhanger to make sure it works
|
||||
gNewWindow.PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test", gNewWindow.gBrowser.selectedBrowser);
|
||||
ok(pluginInfo.activated, "plugin should be activated");
|
||||
});
|
|
@ -0,0 +1,86 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Shockwave Flash");
|
||||
Services.prefs.clearUserPref("plugins.favorfallback.mode");
|
||||
Services.prefs.clearUserPref("plugins.favorfallback.rules");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setCharPref("plugins.favorfallback.mode", "follow-ctp");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Shockwave Flash");
|
||||
});
|
||||
|
||||
/* The expected behavior of each testcase is documented with its markup
|
||||
* in plugin_favorfallback.html.
|
||||
*
|
||||
* - "name" is the name of the testcase in the test file.
|
||||
* - "rule" is how the plugins.favorfallback.rules must be configured
|
||||
* for this testcase.
|
||||
*/
|
||||
const testcases = [
|
||||
{
|
||||
name: "video",
|
||||
rule: "video",
|
||||
},
|
||||
|
||||
{
|
||||
name: "nosrc",
|
||||
rule: "nosrc",
|
||||
},
|
||||
|
||||
{
|
||||
name: "embed",
|
||||
rule: "embed,true",
|
||||
},
|
||||
|
||||
{
|
||||
name: "adobelink",
|
||||
rule: "adobelink,true",
|
||||
},
|
||||
|
||||
{
|
||||
name: "installinstructions",
|
||||
rule: "installinstructions,true",
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
add_task(async function() {
|
||||
for (let testcase of Object.values(testcases)) {
|
||||
info(`Running testcase ${testcase.name}`);
|
||||
|
||||
Services.prefs.setCharPref("plugins.favorfallback.rules", testcase.rule);
|
||||
|
||||
let tab = await BrowserTestUtils.openNewForegroundTab(
|
||||
gBrowser,
|
||||
`${gTestRoot}plugin_favorfallback.html?testcase=${testcase.name}`
|
||||
);
|
||||
|
||||
await ContentTask.spawn(tab.linkedBrowser, testcase.name, async function testPlugins(name) {
|
||||
let testcaseDiv = content.document.getElementById(`testcase_${name}`);
|
||||
let ctpPlugins = testcaseDiv.querySelectorAll(".expected_ctp");
|
||||
|
||||
for (let ctpPlugin of ctpPlugins) {
|
||||
ok(ctpPlugin instanceof Ci.nsIObjectLoadingContent, "This is a plugin object");
|
||||
is(ctpPlugin.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY, "Plugin is CTP");
|
||||
}
|
||||
|
||||
let fallbackPlugins = testcaseDiv.querySelectorAll(".expected_fallback");
|
||||
|
||||
for (let fallbackPlugin of fallbackPlugins) {
|
||||
ok(fallbackPlugin instanceof Ci.nsIObjectLoadingContent, "This is a plugin object");
|
||||
is(fallbackPlugin.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_ALTERNATE, "Plugin fallback content was used");
|
||||
}
|
||||
});
|
||||
|
||||
BrowserTestUtils.removeTab(tab);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,88 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
add_task(async 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();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Second Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
|
||||
// Tests that the overlay can be hidden for plugins using the close icon.
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let bounds = closeIcon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
|
||||
Assert.ok(!overlay.classList.contains("visible"), "overlay should be hidden.");
|
||||
});
|
||||
});
|
||||
|
||||
// Test that the overlay cannot be interacted with after the user closes the overlay
|
||||
add_task(async function() {
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Second Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let closeIconBounds = closeIcon.getBoundingClientRect();
|
||||
let overlayBounds = overlay.getBoundingClientRect();
|
||||
let overlayLeft = (overlayBounds.left + overlayBounds.right) / 2;
|
||||
let overlayTop = (overlayBounds.left + overlayBounds.right) / 2 ;
|
||||
let closeIconLeft = (closeIconBounds.left + closeIconBounds.right) / 2;
|
||||
let closeIconTop = (closeIconBounds.top + closeIconBounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
// Simulate clicking on the close icon.
|
||||
utils.sendMouseEvent("mousedown", closeIconLeft, closeIconTop, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", closeIconLeft, closeIconTop, 0, 1, 0, false, 0, 0);
|
||||
|
||||
// Simulate clicking on the overlay.
|
||||
utils.sendMouseEvent("mousedown", overlayLeft, overlayTop, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", overlayLeft, overlayTop, 0, 1, 0, false, 0, 0);
|
||||
|
||||
Assert.ok(overlay.hasAttribute("dismissed") && !overlay.classList.contains("visible"),
|
||||
"Overlay should be hidden");
|
||||
});
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins");
|
||||
|
||||
ok(notification.dismissed, "No notification should be shown");
|
||||
});
|
|
@ -0,0 +1,49 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
add_task(async 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();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_iframe.html");
|
||||
|
||||
// Tests that the overlays are visible and actionable if the plugin is in an iframe.
|
||||
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, null, async function() {
|
||||
let frame = content.document.getElementById("frame");
|
||||
let doc = frame.contentDocument;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(plugin && overlay.classList.contains("visible"),
|
||||
"Test 1, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
|
||||
let bounds = closeIcon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = doc.defaultView.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
Assert.ok(!overlay.classList.contains("visible"),
|
||||
"Test 1, Plugin overlay should exist, be hidden");
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
add_task(async 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();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_DISABLED, "Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_two_types.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gBrowser.selectedBrowser);
|
||||
|
||||
// Test that the click-to-play notification is not shown for non-plugin object elements
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
ok(popupNotification, "Test 1, Should have a click-to-play notification");
|
||||
|
||||
let pluginRemovedPromise = BrowserTestUtils.waitForContentEvent(gBrowser.selectedBrowser, "PluginRemoved", true, null, true);
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("secondtestA");
|
||||
plugin.remove();
|
||||
plugin = content.document.getElementById("secondtestB");
|
||||
plugin.remove();
|
||||
|
||||
let image = content.document.createElement("object");
|
||||
image.type = "image/png";
|
||||
image.data = "moz.png";
|
||||
content.document.body.appendChild(image);
|
||||
});
|
||||
await pluginRemovedPromise;
|
||||
|
||||
popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
ok(popupNotification, "Test 2, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gBrowser.selectedBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.remove();
|
||||
});
|
||||
|
||||
popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gBrowser.selectedBrowser);
|
||||
ok(popupNotification, "Test 3, Should still have a click-to-play notification");
|
||||
});
|
|
@ -0,0 +1,124 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
add_task(async 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;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
let newTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gBrowser.selectedTab = newTab;
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "Test 1, Should not have a click-to-play notification");
|
||||
});
|
||||
|
||||
// Test that the click-to-play overlay is not hidden for elements
|
||||
// partially or fully outside the viewport.
|
||||
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let p = doc.createElement("embed");
|
||||
|
||||
p.setAttribute("id", "test");
|
||||
p.setAttribute("type", "application/x-test");
|
||||
p.style.left = "0";
|
||||
p.style.bottom = "200px";
|
||||
|
||||
doc.getElementById("container").appendChild(p);
|
||||
});
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible") &&
|
||||
overlay.getAttribute("sizing") != "blank",
|
||||
"Test 2, overlay should be visible.");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let p = doc.createElement("embed");
|
||||
|
||||
p.setAttribute("id", "test");
|
||||
p.setAttribute("type", "application/x-test");
|
||||
p.style.left = "0";
|
||||
p.style.bottom = "-410px";
|
||||
|
||||
doc.getElementById("container").appendChild(p);
|
||||
});
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible") &&
|
||||
overlay.getAttribute("sizing") != "blank",
|
||||
"Test 3, overlay should be visible.");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_outsideScrollArea.html");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let p = doc.createElement("embed");
|
||||
|
||||
p.setAttribute("id", "test");
|
||||
p.setAttribute("type", "application/x-test");
|
||||
p.style.left = "-600px";
|
||||
p.style.bottom = "0";
|
||||
|
||||
doc.getElementById("container").appendChild(p);
|
||||
});
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let doc = content.document;
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 4, overlay should be blank.");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,95 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
/* This test ensures that the click-to-play "Activate Plugin" overlay
|
||||
* is shown in the right style (which is dependent on its size).
|
||||
*/
|
||||
|
||||
const rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
var gTestBrowser = null;
|
||||
|
||||
const gTestcases = {
|
||||
|
||||
// 10x10
|
||||
testcase1: {
|
||||
sizing: "blank",
|
||||
notext: null,
|
||||
},
|
||||
|
||||
// 40x40
|
||||
testcase2: {
|
||||
sizing: "tiny",
|
||||
notext: "notext",
|
||||
},
|
||||
|
||||
// 100x70
|
||||
testcase3: {
|
||||
sizing: "reduced",
|
||||
notext: "notext",
|
||||
},
|
||||
|
||||
// 200x200
|
||||
testcase4: {
|
||||
sizing: null,
|
||||
notext: "notext",
|
||||
},
|
||||
|
||||
// 300x300
|
||||
testcase5: {
|
||||
sizing: null,
|
||||
notext: null,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "Sanity check, should not have a click-to-play notification");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_overlay_styles.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, gTestcases, async function(testcases) {
|
||||
let doc = content.document;
|
||||
|
||||
for (let testcaseId of Object.keys(testcases)) {
|
||||
let plugin = doc.querySelector(`#${testcaseId} > object`);
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay, `overlay exists in ${testcaseId}`);
|
||||
|
||||
let expectations = testcases[testcaseId];
|
||||
|
||||
Assert.ok(overlay.classList.contains("visible"),
|
||||
`The expected visibility is correct in ${testcaseId}`);
|
||||
|
||||
Assert.ok(overlay.getAttribute("sizing") == expectations.sizing,
|
||||
`The expected sizing is correct in ${testcaseId}`);
|
||||
|
||||
Assert.ok(overlay.getAttribute("notext") == expectations.notext,
|
||||
`The expected notext is correct in ${testcaseId}`);
|
||||
}
|
||||
});
|
||||
});
|
|
@ -0,0 +1,132 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async 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;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
let newTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gBrowser.selectedTab = newTab;
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "Test 1, Should not have a click-to-play notification");
|
||||
|
||||
await promiseTabLoadEvent(newTab, gTestRoot + "plugin_small.html"); // 10x10 plugin
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
});
|
||||
|
||||
// Test that the overlay is hidden for "small" plugin elements and is shown
|
||||
// once they are resized to a size that can hold the overlay
|
||||
add_task(async function() {
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "Test 2, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 2, overlay should be blank.");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.style.width = "300px";
|
||||
});
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 3, overlay should be blank.");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.style.height = "300px";
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
content.document.getElementById("test").clientTop;
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.getAttribute("sizing") != "blank",
|
||||
"Test 4, overlay should be visible.");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.style.width = "10px";
|
||||
plugin.style.height = "10px";
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
content.document.getElementById("test").clientTop;
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!overlay || overlay.getAttribute("sizing") == "blank",
|
||||
"Test 5, overlay should be blank.");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
plugin.style.height = "300px";
|
||||
plugin.style.width = "300px";
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
content.document.getElementById("test").clientTop;
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.getAttribute("sizing") != "blank",
|
||||
"Test 6, overlay should be visible.");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,64 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
/* This test ensures that the click-to-play "Activate Plugin" overlay
|
||||
* is shown when expected.
|
||||
* All testcases are in the plugin_shouldShowOverlay.html file.
|
||||
*
|
||||
* Note: Technically, the overlay is *always* shown. When this test was
|
||||
* originally written, the meaning of "shown" was "shown with the contents",
|
||||
* as opposed to "shown as blank". The behavior hasn't changed, but the naming
|
||||
* has: now, a "shown as blank" overlay no longer receives a ".hidden" class.
|
||||
* It receives a sizing="blank" attribute.
|
||||
*/
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "Sanity check, should not have a click-to-play notification");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_shouldShowOverlay.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let testcases = doc.querySelectorAll(".testcase");
|
||||
|
||||
for (let testcase of testcases) {
|
||||
let plugin = testcase.querySelector("object");
|
||||
Assert.ok(plugin, `plugin exists in ${testcase.id}`);
|
||||
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay, `overlay exists in ${testcase.id}`);
|
||||
|
||||
let expectedVisibility = (testcase.getAttribute("shouldshow") == "true");
|
||||
Assert.ok((overlay.getAttribute("sizing") != "blank") == expectedVisibility,
|
||||
`The expected visibility is correct in ${testcase.id}`);
|
||||
}
|
||||
});
|
||||
});
|
|
@ -0,0 +1,64 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
"use strict";
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async 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");
|
||||
FullZoom.reset(); // must be called before closing the tab we zoomed!
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "Test 1, Should not have a click-to-play notification");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_zoom.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
});
|
||||
|
||||
// Enlarges the zoom level 4 times and tests that the overlay is
|
||||
// visible after each enlargement.
|
||||
add_task(async function() {
|
||||
for (let count = 0; count < 4; count++) {
|
||||
|
||||
FullZoom.enlarge();
|
||||
|
||||
// Reload the page
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_zoom.html");
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
await ContentTask.spawn(gTestBrowser, { count }, async function(args) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Overlay should be visible for zoom change count " + args.count);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -0,0 +1,309 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
function updateAllTestPlugins(aState) {
|
||||
setTestPluginEnabledState(aState, "Test Plug-in");
|
||||
setTestPluginEnabledState(aState, "Second Test Plug-in");
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
Services.prefs.clearUserPref("extensions.blocklist.suppressUI");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
// Prime the content process
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>hi</html>");
|
||||
});
|
||||
|
||||
// Tests a vulnerable, updatable plugin
|
||||
|
||||
add_task(async function() {
|
||||
// enable hard blocklisting of test
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginVulnerableUpdatable.xml", gTestBrowser);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE,
|
||||
"Test 18a, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
|
||||
ok(!pluginInfo.activated, "Test 18a, Plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18a, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
Assert.ok(updateLink.style.visibility != "hidden",
|
||||
"Test 18a, Plugin should have an update link");
|
||||
});
|
||||
|
||||
let promise = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabOpen", true);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
let bounds = updateLink.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
await promise;
|
||||
|
||||
promise = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabClose", true);
|
||||
gBrowser.removeCurrentTab();
|
||||
await promise;
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
// clicking the update link should not activate the plugin
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE,
|
||||
"Test 18a, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
|
||||
ok(!pluginInfo.activated, "Test 18b, Plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18b, Plugin overlay should exist, not be hidden");
|
||||
});
|
||||
});
|
||||
|
||||
// Tests a vulnerable plugin with no update
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginVulnerableNoUpdate.xml", gTestBrowser);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 18c, Should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE,
|
||||
"Test 18c, plugin fallback type should be PLUGIN_VULNERABLE_NO_UPDATE");
|
||||
ok(!pluginInfo.activated, "Test 18c, Plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(overlay && overlay.classList.contains("visible"),
|
||||
"Test 18c, Plugin overlay should exist, not be hidden");
|
||||
|
||||
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
|
||||
Assert.ok(updateLink && updateLink.style.display != "block",
|
||||
"Test 18c, Plugin should not have an update link");
|
||||
});
|
||||
|
||||
// check that click "Allow" works with blocked plugins
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE,
|
||||
"Test 18c, plugin fallback type should be PLUGIN_VULNERABLE_NO_UPDATE");
|
||||
ok(pluginInfo.activated, "Test 18c, Plugin should be activated");
|
||||
let enabledState = getTestPluginEnabledState();
|
||||
ok(enabledState, "Test 18c, Plugin enabled state should be STATE_CLICKTOPLAY");
|
||||
});
|
||||
|
||||
// continue testing "Always allow", make sure it sticks.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 18d, Waited too long for plugin to activate");
|
||||
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// clicking the in-content overlay of a vulnerable plugin should bring
|
||||
// up the notification and not directly activate the plugin
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 18f, Should have a click-to-play notification");
|
||||
ok(notification.dismissed, "Test 18f, notification should start dismissed");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 18f, Waited too long for plugin to activate");
|
||||
|
||||
var oldEventCallback = notification.options.eventCallback;
|
||||
let promise = promiseForCondition(() => oldEventCallback == null);
|
||||
notification.options.eventCallback = function() {
|
||||
if (oldEventCallback) {
|
||||
oldEventCallback();
|
||||
}
|
||||
oldEventCallback = null;
|
||||
};
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let bounds = plugin.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
await promise;
|
||||
|
||||
ok(notification, "Test 18g, Should have a click-to-play notification");
|
||||
ok(!notification.dismissed, "Test 18g, notification should be open");
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 18g, Plugin should not be activated");
|
||||
});
|
||||
|
||||
// Test that "always allow"-ing a plugin will not allow it when it becomes
|
||||
// blocklisted.
|
||||
add_task(async function() {
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 24a, Should have a click-to-play notification");
|
||||
|
||||
// Plugin should start as CTP
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
|
||||
"Test 24a, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
|
||||
ok(!pluginInfo.activated, "Test 24a, Plugin should not be active.");
|
||||
|
||||
// simulate "allow"
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 24a, Plugin should be active.");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginVulnerableUpdatable.xml", gTestBrowser);
|
||||
});
|
||||
|
||||
// the plugin is now blocklisted, so it should not automatically load
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 24b, Should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE,
|
||||
"Test 24b, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
|
||||
ok(!pluginInfo.activated, "Test 24b, Plugin should not be active.");
|
||||
|
||||
// simulate "allow"
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 24b, Plugin should be active.");
|
||||
|
||||
clearAllPluginPermissions();
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
});
|
||||
|
||||
// Plugin sync removal test. Note this test produces a notification drop down since
|
||||
// the plugin we add has zero dims.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_syncRemoved.html");
|
||||
|
||||
// Maybe there some better trick here, we need to wait for the page load, then
|
||||
// wait for the js to execute in the page.
|
||||
await waitForMs(500);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins");
|
||||
ok(notification, "Test 25: There should be a plugin notification even if the plugin was immediately removed");
|
||||
ok(notification.dismissed, "Test 25: The notification should be dismissed by default");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>hi</html>");
|
||||
});
|
||||
|
||||
// Tests a page with a blocked plugin in it and make sure the infoURL property
|
||||
// the blocklist file gets used.
|
||||
add_task(async function() {
|
||||
clearAllPluginPermissions();
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginInfoURL.xml", gTestBrowser);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins");
|
||||
|
||||
// Since the plugin notification is dismissed by default, reshow it.
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_BLOCKLISTED,
|
||||
"Test 26, plugin fallback type should be PLUGIN_BLOCKLISTED");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(!objLoadingContent.activated, "Plugin should not be activated.");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,104 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestBrowser = null;
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gChromeRoot = getRootDirectory(gTestPath);
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("extensions.blocklist.suppressUI");
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
|
||||
// Prime the blocklist service, the remote service doesn't launch on startup.
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let test = content.document.getElementById("test");
|
||||
Assert.ok(test.activated, "task 1a: test plugin should be activated!");
|
||||
});
|
||||
});
|
||||
|
||||
// Load a fresh page, load a new plugin blocklist, then load the same page again.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>GO!</html>");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginHard.xml", gTestBrowser);
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let test = content.document.getElementById("test");
|
||||
ok(!test.activated, "task 2a: test plugin shouldn't activate!");
|
||||
});
|
||||
});
|
||||
|
||||
// Unload the block list and lets do this again, only this time lets
|
||||
// hack around in the content blocklist service maliciously.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>GO!</html>");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
|
||||
// Hack the planet! Load our blocklist shim, so we can mess with blocklist
|
||||
// return results in the content process. Active until we close our tab.
|
||||
let mm = gTestBrowser.messageManager;
|
||||
info("test 3a: loading " + gChromeRoot + "blocklist_proxy.js\n");
|
||||
mm.loadFrameScript(gChromeRoot + "blocklist_proxy.js", true);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let test = content.document.getElementById("test");
|
||||
Assert.ok(test.activated, "task 3a: test plugin should be activated!");
|
||||
});
|
||||
});
|
||||
|
||||
// Load a fresh page, load a new plugin blocklist, then load the same page again.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>GO!</html>");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginHard.xml", gTestBrowser);
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let test = content.document.getElementById("test");
|
||||
Assert.ok(!test.activated, "task 4a: test plugin shouldn't activate!");
|
||||
});
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
});
|
|
@ -0,0 +1,118 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
let newTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gBrowser.selectedTab = newTab;
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Second Test Plug-in");
|
||||
|
||||
// Prime the blocklist service, the remote service doesn't launch on startup.
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
});
|
||||
|
||||
// Tests that navigation within the page and the window.history API doesn't break click-to-play state.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_add_dynamically.html");
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!notification, "Test 1a, Should not have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
|
||||
});
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementsByTagName("embed")[0];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(!objLoadingContent.activated, "Test 1b, Plugin should not be activated");
|
||||
});
|
||||
|
||||
// Click the activate button on doorhanger to make sure it works
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementsByTagName("embed")[0];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated, "Test 1b, Plugin should be activated");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 1c, Should still have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
|
||||
let plugin = content.document.getElementsByTagName("embed")[1];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated,
|
||||
"Test 1c, Newly inserted plugin in activated page should be activated");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementsByTagName("embed")[1];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated, "Test 1d, Plugin should be activated");
|
||||
|
||||
let promise = ContentTaskUtils.waitForEvent(content, "hashchange");
|
||||
content.location += "#anchorNavigation";
|
||||
await promise;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
|
||||
let plugin = content.document.getElementsByTagName("embed")[2];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated, "Test 1e, Plugin should be activated");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementsByTagName("embed")[2];
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated, "Test 1f, Plugin should be activated");
|
||||
|
||||
content.history.replaceState({}, "", "replacedState");
|
||||
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
|
||||
plugin = content.document.getElementsByTagName("embed")[3];
|
||||
objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
Assert.ok(objLoadingContent.activated, "Test 1g, Plugin should be activated");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gNumPluginBindingsAttached = 0;
|
||||
|
||||
function pluginBindingAttached() {
|
||||
gNumPluginBindingsAttached++;
|
||||
if (gNumPluginBindingsAttached != 1) {
|
||||
ok(false, "if we've gotten here, something is quite wrong");
|
||||
}
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
gTestBrowser.removeEventListener("PluginBindingAttached", pluginBindingAttached, true, true);
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
BrowserTestUtils.addContentEventListener(gTestBrowser, "PluginBindingAttached", pluginBindingAttached, true, null, true);
|
||||
|
||||
let testRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, testRoot + "plugin_bug744745.html");
|
||||
|
||||
await promiseForCondition(function() { return gNumPluginBindingsAttached == 1; });
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
if (!plugin) {
|
||||
Assert.ok(false, "plugin element not available.");
|
||||
return;
|
||||
}
|
||||
// We can't use MochiKit's routine
|
||||
let style = content.getComputedStyle(plugin);
|
||||
Assert.ok(("opacity" in style) && style.opacity == 1, "plugin style properly configured.");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,66 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gWrapperClickCount = 0;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
let testRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, testRoot + "plugin_bug787619.html");
|
||||
|
||||
// Due to layout being async, "PluginBindAttached" may trigger later.
|
||||
// This forces a layout flush, thus triggering it, and schedules the
|
||||
// test so it is definitely executed afterwards.
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
// check plugin state
|
||||
let pluginInfo = await promiseForPluginInfo("plugin");
|
||||
ok(!pluginInfo.activated, "1a plugin should not be activated");
|
||||
|
||||
// click the overlay to prompt
|
||||
let promise = promisePopupNotification("click-to-play-plugins");
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
let bounds = plugin.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
await promise;
|
||||
|
||||
// check plugin state
|
||||
pluginInfo = await promiseForPluginInfo("plugin");
|
||||
ok(!pluginInfo.activated, "1b plugin should not be activated");
|
||||
|
||||
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
|
||||
PopupNotifications.panel.firstElementChild;
|
||||
await promiseForCondition(condition);
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
// check plugin state
|
||||
pluginInfo = await promiseForPluginInfo("plugin");
|
||||
ok(pluginInfo.activated, "plugin should be activated");
|
||||
|
||||
is(gWrapperClickCount, 0, "wrapper should not have received any clicks");
|
||||
});
|
|
@ -0,0 +1,40 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gConsoleErrors = 0;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
Services.console.unregisterListener(errorListener);
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
let errorListener = {
|
||||
observe(aMessage) {
|
||||
if (aMessage.message.includes("NS_ERROR_FAILURE"))
|
||||
gConsoleErrors++;
|
||||
},
|
||||
};
|
||||
Services.console.registerListener(errorListener);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_bug797677.html");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("plugin");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED, "plugin should not have been found.");
|
||||
|
||||
// simple cpows
|
||||
await ContentTask.spawn(gTestBrowser, null, function() {
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
ok(plugin, "plugin should be in the page");
|
||||
});
|
||||
is(gConsoleErrors, 0, "should have no console errors");
|
||||
});
|
|
@ -0,0 +1,80 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
// Prime the blocklist service, the remote service doesn't launch on startup.
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
});
|
||||
|
||||
// Tests that the going back will reshow the notification for click-to-play
|
||||
// blocklisted plugins
|
||||
add_task(async function() {
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginVulnerableUpdatable.xml", gTestBrowser);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "test part 1: Should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE, "plugin should be marked as VULNERABLE");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
Assert.ok(!!content.document.getElementById("test"),
|
||||
"test part 1: plugin should not be activated");
|
||||
});
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!popupNotification, "test part 2: Should not have a click-to-play notification");
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
Assert.ok(!content.document.getElementById("test"),
|
||||
"test part 2: plugin should not be activated");
|
||||
});
|
||||
|
||||
let obsPromise = TestUtils.topicObserved("PopupNotifications-updateNotShowing");
|
||||
let overlayPromise = promisePopupNotification("click-to-play-plugins");
|
||||
gTestBrowser.goBack();
|
||||
await obsPromise;
|
||||
await overlayPromise;
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "test part 3: Should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE, "plugin should be marked as VULNERABLE");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
Assert.ok(!!content.document.getElementById("test"),
|
||||
"test part 3: plugin should not be activated");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,42 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_both.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY, "plugin should be click to play");
|
||||
ok(!pluginInfo.activated, "plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, () => {
|
||||
let unknown = content.document.getElementById("unknown");
|
||||
ok(unknown, "should have unknown plugin in page");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,73 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var gNumPluginBindingsAttached = 0;
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY, "Second Test Plug-in");
|
||||
|
||||
BrowserTestUtils.addContentEventListener(gTestBrowser, "PluginBindingAttached", function() { gNumPluginBindingsAttached++; }, true, null, true);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_bug820497.html");
|
||||
|
||||
await promiseForCondition(function() { return gNumPluginBindingsAttached == 1; });
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, () => {
|
||||
// Note we add the second plugin in the code farther down, so there's
|
||||
// no way we got here with anything but one plugin loaded.
|
||||
let doc = content.document;
|
||||
let testplugin = doc.getElementById("test");
|
||||
ok(testplugin, "should have test plugin");
|
||||
let secondtestplugin = doc.getElementById("secondtest");
|
||||
ok(!secondtestplugin, "should not yet have second test plugin");
|
||||
});
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "should have a click-to-play notification");
|
||||
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
is(notification.options.pluginData.size, 1, "should be 1 type of plugin in the popup notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
XPCNativeWrapper.unwrap(content).addSecondPlugin();
|
||||
});
|
||||
|
||||
await promiseForCondition(function() { return gNumPluginBindingsAttached == 2; });
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, () => {
|
||||
let doc = content.document;
|
||||
let testplugin = doc.getElementById("test");
|
||||
ok(testplugin, "should have test plugin");
|
||||
let secondtestplugin = doc.getElementById("secondtest");
|
||||
ok(secondtestplugin, "should have second test plugin");
|
||||
});
|
||||
|
||||
notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
|
||||
ok(notification, "should have popup notification");
|
||||
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
is(notification.options.pluginData.size, 2, "aited too long for 2 types of plugins in popup notification");
|
||||
});
|
|
@ -0,0 +1,29 @@
|
|||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>Plugin Clear Site Data sanitize test</title>
|
||||
|
||||
<embed id="plugin1" type="application/x-test" width="200" height="200"></embed>
|
||||
|
||||
<script type="application/javascript">
|
||||
function testSteps() {
|
||||
// Make sure clearing by timerange is supported.
|
||||
var p = document.getElementById("plugin1");
|
||||
p.setSitesWithDataCapabilities(true);
|
||||
|
||||
p.setSitesWithData(
|
||||
"foo.com:0:5," +
|
||||
"bar.com:0:100," +
|
||||
"baz.com:1:5," +
|
||||
"qux.com:1:100"
|
||||
);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onload="testSteps();"></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,113 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
var gTestBrowser = null;
|
||||
|
||||
// Test clearing plugin data using Sanitizer.jsm.
|
||||
const testURL1 = gTestRoot + "browser_clearplugindata.html";
|
||||
const testURL2 = gTestRoot + "browser_clearplugindata_noage.html";
|
||||
|
||||
const {Sanitizer} = ChromeUtils.import("resource:///modules/Sanitizer.jsm", {});
|
||||
|
||||
const pluginHostIface = Ci.nsIPluginHost;
|
||||
var pluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
pluginHost.QueryInterface(pluginHostIface);
|
||||
|
||||
var pluginTag = getTestPlugin();
|
||||
|
||||
function stored(needles) {
|
||||
let something = pluginHost.siteHasData(this.pluginTag, null);
|
||||
if (!needles)
|
||||
return something;
|
||||
|
||||
if (!something)
|
||||
return false;
|
||||
|
||||
for (let i = 0; i < needles.length; ++i) {
|
||||
if (!pluginHost.siteHasData(this.pluginTag, needles[i]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
Services.prefs.clearUserPref("extensions.blocklist.suppressUI");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
if (gTestBrowser) {
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
window.focus();
|
||||
gTestBrowser = null;
|
||||
});
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
});
|
||||
|
||||
function setPrefs(cookies, pluginData) {
|
||||
let itemPrefs = Services.prefs.getBranch("privacy.cpd.");
|
||||
itemPrefs.setBoolPref("history", false);
|
||||
itemPrefs.setBoolPref("downloads", false);
|
||||
itemPrefs.setBoolPref("cache", false);
|
||||
itemPrefs.setBoolPref("cookies", cookies);
|
||||
itemPrefs.setBoolPref("formdata", false);
|
||||
itemPrefs.setBoolPref("offlineApps", false);
|
||||
itemPrefs.setBoolPref("passwords", false);
|
||||
itemPrefs.setBoolPref("sessions", false);
|
||||
itemPrefs.setBoolPref("siteSettings", false);
|
||||
itemPrefs.setBoolPref("pluginData", pluginData);
|
||||
}
|
||||
|
||||
async function testClearingData(url) {
|
||||
// Load page to set data for the plugin.
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, url);
|
||||
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
ok(stored(["foo.com", "bar.com", "baz.com", "qux.com"]),
|
||||
"Data stored for sites");
|
||||
|
||||
// Clear 20 seconds ago.
|
||||
// In the case of testURL2 the plugin will throw
|
||||
// NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED, which should result in us
|
||||
// clearing all data regardless of age.
|
||||
let now_uSec = Date.now() * 1000;
|
||||
let range = [now_uSec - 20 * 1000000, now_uSec];
|
||||
await Sanitizer.sanitize(null, {range, ignoreTimespan: false});
|
||||
|
||||
if (url == testURL1) {
|
||||
ok(stored(["bar.com", "qux.com"]), "Data stored for sites");
|
||||
ok(!stored(["foo.com"]), "Data cleared for foo.com");
|
||||
ok(!stored(["baz.com"]), "Data cleared for baz.com");
|
||||
|
||||
// Clear everything.
|
||||
await Sanitizer.sanitize(null, {ignoreTimespan: false});
|
||||
}
|
||||
|
||||
ok(!stored(null), "All data cleared");
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
gTestBrowser = null;
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
// Test when sanitizing cookies.
|
||||
await setPrefs(true, false);
|
||||
await testClearingData(testURL1);
|
||||
await testClearingData(testURL2);
|
||||
|
||||
// Test when sanitizing pluginData.
|
||||
await setPrefs(false, true);
|
||||
await testClearingData(testURL1);
|
||||
await testClearingData(testURL2);
|
||||
});
|
|
@ -0,0 +1,29 @@
|
|||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<title>Plugin Clear Site Data sanitize test without age</title>
|
||||
|
||||
<embed id="plugin1" type="application/x-test" width="200" height="200"></embed>
|
||||
|
||||
<script type="application/javascript">
|
||||
function testSteps() {
|
||||
// Make sure clearing by timerange is disabled.
|
||||
var p = document.getElementById("plugin1");
|
||||
p.setSitesWithDataCapabilities(false);
|
||||
|
||||
p.setSitesWithData(
|
||||
"foo.com:0:5," +
|
||||
"bar.com:0:100," +
|
||||
"baz.com:1:5," +
|
||||
"qux.com:1:100"
|
||||
);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onload="testSteps();"></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* Bug 1366167 - Tests that the "Enable DRM" prompt shows if EME is requested while EME is disabled.
|
||||
*/
|
||||
|
||||
const TEST_URL =
|
||||
getRootDirectory(gTestPath).replace("chrome://mochitests/content",
|
||||
"https://example.com") + "empty_file.html";
|
||||
|
||||
add_task(async function() {
|
||||
await BrowserTestUtils.withNewTab(TEST_URL, async function(browser) {
|
||||
// Note: SpecialPowers.pushPrefEnv has problems with the "Enable DRM"
|
||||
// button on the notification box toggling the prefs. So manually
|
||||
// set/unset the prefs the UI we're testing toggles.
|
||||
let emeWasEnabled = Services.prefs.getBoolPref("media.eme.enabled", false);
|
||||
let cdmWasEnabled = Services.prefs.getBoolPref("media.gmp-widevinecdm.enabled", false);
|
||||
|
||||
// Restore the preferences to their pre-test state on test finish.
|
||||
registerCleanupFunction(function() {
|
||||
Services.prefs.setBoolPref("media.eme.enabled", emeWasEnabled);
|
||||
Services.prefs.setBoolPref("media.gmp-widevinecdm.enabled", cdmWasEnabled);
|
||||
});
|
||||
|
||||
// Turn off EME and Widevine CDM.
|
||||
Services.prefs.setBoolPref("media.eme.enabled", false);
|
||||
Services.prefs.setBoolPref("media.gmp-widevinecdm.enabled", false);
|
||||
|
||||
// Have content request access to Widevine, UI should drop down to
|
||||
// prompt user to enable DRM.
|
||||
let result = await ContentTask.spawn(browser, {}, async function() {
|
||||
try {
|
||||
let config = [{
|
||||
initDataTypes: ["webm"],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
}];
|
||||
await content.navigator.requestMediaKeySystemAccess("com.widevine.alpha", config);
|
||||
} catch (ex) {
|
||||
return {rejected: true};
|
||||
}
|
||||
return {rejected: false};
|
||||
});
|
||||
is(result.rejected, true, "EME request should be denied because EME disabled.");
|
||||
|
||||
// Verify the UI prompt showed.
|
||||
let box = gBrowser.getNotificationBox(browser);
|
||||
let notification = box.currentNotification;
|
||||
|
||||
ok(notification, "Notification should be visible");
|
||||
is(notification.getAttribute("value"), "drmContentDisabled",
|
||||
"Should be showing the right notification");
|
||||
|
||||
// Verify the "Enable DRM" button is there.
|
||||
let buttons = notification.querySelectorAll(".notification-button");
|
||||
is(buttons.length, 1, "Should have one button.");
|
||||
|
||||
// Prepare a Promise that should resolve when the "Enable DRM" button's
|
||||
// page reload completes.
|
||||
let refreshPromise = BrowserTestUtils.browserLoaded(browser);
|
||||
buttons[0].click();
|
||||
|
||||
// Wait for the reload to complete.
|
||||
await refreshPromise;
|
||||
|
||||
// Verify clicking the "Enable DRM" button enabled DRM.
|
||||
let enabled = Services.prefs.getBoolPref("media.eme.enabled", true);
|
||||
is(enabled, true, "EME should be enabled after click on 'Enable DRM' button");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,36 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
/**
|
||||
* Test that the notification bar for crashed GMPs works.
|
||||
*/
|
||||
add_task(async function() {
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: "about:blank",
|
||||
}, async function(browser) {
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
const GMP_CRASH_EVENT = {
|
||||
pluginID: 1,
|
||||
pluginName: "GlobalTestPlugin",
|
||||
submittedCrashReport: false,
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
gmpPlugin: true,
|
||||
};
|
||||
|
||||
let crashEvent = new content.PluginCrashedEvent("PluginCrashed",
|
||||
GMP_CRASH_EVENT);
|
||||
content.dispatchEvent(crashEvent);
|
||||
});
|
||||
|
||||
let notification = await waitForNotificationBar("plugin-crashed", browser);
|
||||
|
||||
let notificationBox = gBrowser.getNotificationBox(browser);
|
||||
ok(notification, "Infobar was shown.");
|
||||
is(notification.priority, notificationBox.PRIORITY_WARNING_MEDIUM,
|
||||
"Correct priority.");
|
||||
is(notification.messageText.textContent,
|
||||
"The GlobalTestPlugin plugin has crashed.",
|
||||
"Correct message.");
|
||||
});
|
||||
});
|
|
@ -0,0 +1,70 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_PLUGIN_NAME = "Test Plug-in";
|
||||
const HIDDEN_CTP_PLUGIN_PREF = "plugins.navigator.hidden_ctp_plugin";
|
||||
|
||||
/**
|
||||
* If a plugin is click-to-play and named in HIDDEN_CTP_PLUGIN_PREF,
|
||||
* then the plugin should be hidden in the navigator.plugins list by default
|
||||
* when iterating.
|
||||
*/
|
||||
|
||||
add_task(async function setup() {
|
||||
// We'll make the Test Plugin click-to-play.
|
||||
let originalPluginState = getTestPluginEnabledState();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
registerCleanupFunction(() => {
|
||||
setTestPluginEnabledState(originalPluginState);
|
||||
});
|
||||
|
||||
// And then make the plugin hidden.
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
[HIDDEN_CTP_PLUGIN_PREF, TEST_PLUGIN_NAME],
|
||||
["plugins.show_infobar", true],
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Tests that if a plugin is click-to-play and in the
|
||||
* HIDDEN_CTP_PLUGIN_PREF list, then it shouldn't be visible
|
||||
* when iterating navigator.plugins.
|
||||
*/
|
||||
add_task(async function test_plugin_is_hidden_on_iteration() {
|
||||
// The plugin should not be visible when we iterate
|
||||
// navigator.plugins.
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: "http://example.com",
|
||||
}, async function(browser) {
|
||||
await ContentTask.spawn(browser, TEST_PLUGIN_NAME, async function(pluginName) {
|
||||
let plugins = Array.from(content.navigator.plugins);
|
||||
Assert.ok(plugins.every(p => p.name != pluginName),
|
||||
"Should not find Test Plugin");
|
||||
});
|
||||
});
|
||||
|
||||
// Now clear the HIDDEN_CTP_PLUGIN_PREF temporarily and
|
||||
// make sure we can see the plugin again.
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [[HIDDEN_CTP_PLUGIN_PREF, ""]],
|
||||
});
|
||||
|
||||
// Note that I have to do this in a new tab since navigator
|
||||
// caches navigator.plugins after an initial read.
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: "http://example.com",
|
||||
}, async function(browser) {
|
||||
await ContentTask.spawn(browser, TEST_PLUGIN_NAME, async function(pluginName) {
|
||||
let plugins = Array.from(content.navigator.plugins);
|
||||
Assert.ok(plugins.some(p => p.name == pluginName),
|
||||
"Should have found the Test Plugin");
|
||||
});
|
||||
});
|
||||
|
||||
await SpecialPowers.popPrefEnv();
|
||||
});
|
|
@ -0,0 +1,249 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
/* global gBrowser */
|
||||
ChromeUtils.import("resource://gre/modules/CrashSubmit.jsm", this);
|
||||
|
||||
const SERVER_URL = "http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs";
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gTestBrowser = null;
|
||||
var config = {};
|
||||
|
||||
add_task(async function() {
|
||||
// The test harness sets MOZ_CRASHREPORTER_NO_REPORT, which disables plugin
|
||||
// crash reports. This test needs them enabled. The test also needs a mock
|
||||
// report server, and fortunately one is already set up by toolkit/
|
||||
// crashreporter/test/Makefile.in. Assign its URL to MOZ_CRASHREPORTER_URL,
|
||||
// which CrashSubmit.jsm uses as a server override.
|
||||
let env = Cc["@mozilla.org/process/environment;1"]
|
||||
.getService(Ci.nsIEnvironment);
|
||||
let noReport = env.get("MOZ_CRASHREPORTER_NO_REPORT");
|
||||
let serverUrl = env.get("MOZ_CRASHREPORTER_URL");
|
||||
env.set("MOZ_CRASHREPORTER_NO_REPORT", "");
|
||||
env.set("MOZ_CRASHREPORTER_URL", SERVER_URL);
|
||||
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
// Crash immediately
|
||||
Services.prefs.setIntPref("dom.ipc.plugins.timeoutSecs", 0);
|
||||
|
||||
registerCleanupFunction(async function() {
|
||||
Services.prefs.clearUserPref("dom.ipc.plugins.timeoutSecs");
|
||||
env.set("MOZ_CRASHREPORTER_NO_REPORT", noReport);
|
||||
env.set("MOZ_CRASHREPORTER_URL", serverUrl);
|
||||
env = null;
|
||||
config = null;
|
||||
gTestBrowser = null;
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
config = {
|
||||
shouldSubmissionUIBeVisible: true,
|
||||
comment: "",
|
||||
urlOptIn: false,
|
||||
};
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
|
||||
let pluginCrashed = promisePluginCrashed();
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_crashCommentAndURL.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
// Wait for the plugin to crash
|
||||
await pluginCrashed;
|
||||
|
||||
let crashReportStatus = TestUtils.topicObserved("crash-report-status", onSubmitStatus);
|
||||
|
||||
// Test that the crash submission UI is actually visible and submit the crash report.
|
||||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
let submitButton = doc.getAnonymousElementByAttribute(plugin, "anonid", "submitButton");
|
||||
// Test that we don't send the URL when urlOptIn is false.
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
submitButton.click();
|
||||
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
|
||||
});
|
||||
|
||||
await crashReportStatus;
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
config = {
|
||||
shouldSubmissionUIBeVisible: true,
|
||||
comment: "a test comment",
|
||||
urlOptIn: true,
|
||||
};
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
|
||||
let pluginCrashed = promisePluginCrashed();
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_crashCommentAndURL.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
// Wait for the plugin to crash
|
||||
await pluginCrashed;
|
||||
|
||||
let crashReportStatus = TestUtils.topicObserved("crash-report-status", onSubmitStatus);
|
||||
|
||||
// Test that the crash submission UI is actually visible and submit the crash report.
|
||||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
let submitButton = doc.getAnonymousElementByAttribute(plugin, "anonid", "submitButton");
|
||||
// Test that we send the URL when urlOptIn is true.
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
|
||||
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitComment").value = aConfig.comment;
|
||||
submitButton.click();
|
||||
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
|
||||
});
|
||||
|
||||
await crashReportStatus;
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
config = {
|
||||
shouldSubmissionUIBeVisible: false,
|
||||
comment: "",
|
||||
urlOptIn: true,
|
||||
};
|
||||
|
||||
// Deferred promise object used by the test to wait for the crash handler
|
||||
let crashDeferred = PromiseUtils.defer();
|
||||
|
||||
// Clear out any minidumps we create from plugin crashes, this is needed
|
||||
// because we do not submit the crash otherwise the submission process would
|
||||
// have deleted the crash dump files for us.
|
||||
let crashObserver = (subject, topic, data) => {
|
||||
if (topic != "plugin-crashed") {
|
||||
return;
|
||||
}
|
||||
|
||||
let propBag = subject.QueryInterface(Ci.nsIPropertyBag2);
|
||||
let minidumpID = propBag.getPropertyAsAString("pluginDumpID");
|
||||
|
||||
Services.crashmanager.ensureCrashIsPresent(minidumpID).then(() => {
|
||||
let minidumpDir = Services.dirsvc.get("UAppData", Ci.nsIFile);
|
||||
minidumpDir.append("Crash Reports");
|
||||
minidumpDir.append("pending");
|
||||
|
||||
let pluginDumpFile = minidumpDir.clone();
|
||||
pluginDumpFile.append(minidumpID + ".dmp");
|
||||
|
||||
let extraFile = minidumpDir.clone();
|
||||
extraFile.append(minidumpID + ".extra");
|
||||
|
||||
pluginDumpFile.remove(false);
|
||||
extraFile.remove(false);
|
||||
crashDeferred.resolve();
|
||||
});
|
||||
};
|
||||
|
||||
Services.obs.addObserver(crashObserver, "plugin-crashed");
|
||||
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
|
||||
let pluginCrashed = promisePluginCrashed();
|
||||
|
||||
// Make sure that the plugin container is too small to display the crash submission UI
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_crashCommentAndURL.html?" +
|
||||
encodeURIComponent(JSON.stringify({width: 300, height: 300})));
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
// Wait for the plugin to crash
|
||||
await pluginCrashed;
|
||||
|
||||
// Test that the crash submission UI is not visible and do not submit a crash report.
|
||||
await ContentTask.spawn(gTestBrowser, config, async function(aConfig) {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("plugin");
|
||||
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
|
||||
Assert.equal(!!pleaseSubmit && content.getComputedStyle(pleaseSubmit).display == "block",
|
||||
aConfig.shouldSubmissionUIBeVisible, "Plugin crash UI should not be visible");
|
||||
});
|
||||
|
||||
await crashDeferred.promise;
|
||||
Services.obs.removeObserver(crashObserver, "plugin-crashed");
|
||||
});
|
||||
|
||||
function promisePluginCrashed() {
|
||||
return new ContentTask.spawn(gTestBrowser, {}, async function() {
|
||||
await new Promise((resolve) => {
|
||||
addEventListener("PluginCrashReporterDisplayed", function onPluginCrashed() {
|
||||
removeEventListener("PluginCrashReporterDisplayed", onPluginCrashed);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmitStatus(aSubject, aData) {
|
||||
if (aData === "submitting") {
|
||||
return false;
|
||||
}
|
||||
|
||||
is(aData, "success", "The crash report should be submitted successfully");
|
||||
|
||||
let propBag = aSubject.QueryInterface(Ci.nsIPropertyBag);
|
||||
if (aData == "success") {
|
||||
let remoteID = getPropertyBagValue(propBag, "serverCrashID");
|
||||
ok(!!remoteID, "serverCrashID should be set");
|
||||
|
||||
// Remove the submitted report file.
|
||||
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
|
||||
file.initWithPath(Services.crashmanager._submittedDumpsDir);
|
||||
file.append(remoteID + ".txt");
|
||||
ok(file.exists(), "Submitted report file should exist");
|
||||
file.remove(false);
|
||||
}
|
||||
|
||||
let extra = getPropertyBagValue(propBag, "extra");
|
||||
ok(extra instanceof Ci.nsIPropertyBag, "Extra data should be property bag");
|
||||
|
||||
let val = getPropertyBagValue(extra, "PluginUserComment");
|
||||
if (config.comment) {
|
||||
is(val, config.comment,
|
||||
"Comment in extra data should match comment in textbox");
|
||||
} else {
|
||||
ok(val === undefined,
|
||||
"Comment should be absent from extra data when textbox is empty");
|
||||
}
|
||||
|
||||
val = getPropertyBagValue(extra, "PluginContentURL");
|
||||
if (config.urlOptIn) {
|
||||
is(val, gBrowser.currentURI.spec,
|
||||
"URL in extra data should match browser URL when opt-in checked");
|
||||
} else {
|
||||
ok(val === undefined,
|
||||
"URL should be absent from extra data when opt-in not checked");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function getPropertyBagValue(bag, key) {
|
||||
try {
|
||||
var val = bag.getProperty(key);
|
||||
} catch (e) {
|
||||
if (e.result != Cr.NS_ERROR_FAILURE) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return val;
|
||||
}
|
|
@ -0,0 +1,270 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm");
|
||||
|
||||
/**
|
||||
* With e10s, plugins must run in their own process. This means we have
|
||||
* three processes at a minimum when we're running a plugin:
|
||||
*
|
||||
* 1) The main browser, or "chrome" process
|
||||
* 2) The content process hosting the plugin instance
|
||||
* 3) The plugin process
|
||||
*
|
||||
* If the plugin process crashes, we cannot be sure if the chrome process
|
||||
* will hear about it first, or the content process will hear about it
|
||||
* first. Because of how IPC works, that's really up to the operating system,
|
||||
* and we assume any guarantees about it, so we have to account for both
|
||||
* possibilities.
|
||||
*
|
||||
* This test exercises the browser's reaction to both possibilities.
|
||||
*/
|
||||
|
||||
const CRASH_URL = "http://example.com/browser/browser/base/content/test/plugins/plugin_crashCommentAndURL.html";
|
||||
const CRASHED_MESSAGE = "BrowserPlugins:NPAPIPluginProcessCrashed";
|
||||
|
||||
/**
|
||||
* In order for our test to work, we need to be able to put a plugin
|
||||
* in a very specific state. Specifically, we need it to match the
|
||||
* :-moz-handler-crashed pseudoselector. The only way I can find to
|
||||
* do that is by actually crashing the plugin. So we wait for the
|
||||
* plugin to crash and show the "please" state (since that will
|
||||
* only show if both the message from the parent has been received
|
||||
* AND the PluginCrashed event has fired).
|
||||
*
|
||||
* Once in that state, we try to rewind the clock a little bit - we clear
|
||||
* out the crashData cache in the PluginContent with a message, and we also
|
||||
* override the pluginFallbackState of the <object> to fool PluginContent
|
||||
* into believing that the plugin is in a particular state.
|
||||
*
|
||||
* @param browser
|
||||
* The browser that has loaded the CRASH_URL that we need to
|
||||
* prepare to be in the special state.
|
||||
* @param pluginFallbackState
|
||||
* The value we should override the <object>'s pluginFallbackState
|
||||
* with.
|
||||
* @return Promise
|
||||
* The Promise resolves when the plugin has officially been put into
|
||||
* the crash reporter state, and then "rewound" to have the "status"
|
||||
* attribute of the statusDiv removed. The resolved Promise returns
|
||||
* the run ID for the crashed plugin. It rejects if we never get into
|
||||
* the crash reporter state.
|
||||
*/
|
||||
function preparePlugin(browser, pluginFallbackState) {
|
||||
return ContentTask.spawn(browser, pluginFallbackState, async function(contentPluginFallbackState) {
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
// CRASH_URL will load a plugin that crashes immediately. We
|
||||
// wait until the plugin has finished being put into the crash
|
||||
// state.
|
||||
let statusDiv;
|
||||
await ContentTaskUtils.waitForCondition(() => {
|
||||
statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
return statusDiv && statusDiv.getAttribute("status") == "please";
|
||||
}, "Timed out waiting for plugin to be in crash report state");
|
||||
|
||||
// "Rewind", by wiping out the status attribute...
|
||||
statusDiv.removeAttribute("status");
|
||||
// Somehow, I'm able to get away with overriding the getter for
|
||||
// this XPCOM object. Probably because I've got chrome privledges.
|
||||
Object.defineProperty(plugin, "pluginFallbackType", {
|
||||
get() {
|
||||
return contentPluginFallbackState;
|
||||
},
|
||||
});
|
||||
return plugin.runID;
|
||||
}).then((runID) => {
|
||||
browser.messageManager.sendAsyncMessage("BrowserPlugins:Test:ClearCrashData");
|
||||
return runID;
|
||||
});
|
||||
}
|
||||
|
||||
// Bypass click-to-play
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
|
||||
// Deferred promise object used by the test to wait for the crash handler
|
||||
let crashDeferred = null;
|
||||
|
||||
// Clear out any minidumps we create from plugins - we really don't care
|
||||
// about them.
|
||||
let crashObserver = (subject, topic, data) => {
|
||||
if (topic != "plugin-crashed") {
|
||||
return;
|
||||
}
|
||||
|
||||
let propBag = subject.QueryInterface(Ci.nsIPropertyBag2);
|
||||
let minidumpID = propBag.getPropertyAsAString("pluginDumpID");
|
||||
|
||||
Services.crashmanager.ensureCrashIsPresent(minidumpID).then(() => {
|
||||
let minidumpDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
||||
minidumpDir.append("minidumps");
|
||||
|
||||
let pluginDumpFile = minidumpDir.clone();
|
||||
pluginDumpFile.append(minidumpID + ".dmp");
|
||||
|
||||
let extraFile = minidumpDir.clone();
|
||||
extraFile.append(minidumpID + ".extra");
|
||||
|
||||
ok(pluginDumpFile.exists(), "Found minidump");
|
||||
ok(extraFile.exists(), "Found extra file");
|
||||
|
||||
pluginDumpFile.remove(false);
|
||||
extraFile.remove(false);
|
||||
crashDeferred.resolve();
|
||||
});
|
||||
};
|
||||
|
||||
Services.obs.addObserver(crashObserver, "plugin-crashed");
|
||||
// plugins.testmode will make BrowserPlugins:Test:ClearCrashData work.
|
||||
Services.prefs.setBoolPref("plugins.testmode", true);
|
||||
registerCleanupFunction(() => {
|
||||
Services.prefs.clearUserPref("plugins.testmode");
|
||||
Services.obs.removeObserver(crashObserver, "plugin-crashed");
|
||||
});
|
||||
|
||||
/**
|
||||
* In this case, the chrome process hears about the crash first.
|
||||
*/
|
||||
add_task(async function testChromeHearsPluginCrashFirst() {
|
||||
// Setup the crash observer promise
|
||||
crashDeferred = PromiseUtils.defer();
|
||||
|
||||
// Open a remote window so that we can run this test even if e10s is not
|
||||
// enabled by default.
|
||||
let win = await BrowserTestUtils.openNewBrowserWindow({remote: true});
|
||||
let browser = win.gBrowser.selectedBrowser;
|
||||
|
||||
BrowserTestUtils.loadURI(browser, CRASH_URL);
|
||||
await BrowserTestUtils.browserLoaded(browser);
|
||||
|
||||
// In this case, we want the <object> to match the -moz-handler-crashed
|
||||
// pseudoselector, but we want it to seem still active, because the
|
||||
// content process is not yet supposed to know that the plugin has
|
||||
// crashed.
|
||||
let runID = await preparePlugin(browser,
|
||||
Ci.nsIObjectLoadingContent.PLUGIN_ACTIVE);
|
||||
|
||||
// Send the message down to PluginContent.jsm saying that the plugin has
|
||||
// crashed, and that we have a crash report.
|
||||
let mm = browser.messageManager;
|
||||
mm.sendAsyncMessage(CRASHED_MESSAGE,
|
||||
{ pluginName: "", runID, state: "please" });
|
||||
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
// At this point, the content process should have heard the
|
||||
// plugin crash message from the parent, and we are OK to emit
|
||||
// the PluginCrashed event.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
|
||||
if (statusDiv.getAttribute("status") == "please") {
|
||||
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Now we need the plugin to seem crashed to PluginContent.jsm, without
|
||||
// actually crashing the plugin again. We hack around this by overriding
|
||||
// the pluginFallbackType again.
|
||||
Object.defineProperty(plugin, "pluginFallbackType", {
|
||||
get() {
|
||||
return Ci.nsIObjectLoadingContent.PLUGIN_CRASHED;
|
||||
},
|
||||
});
|
||||
|
||||
let event = new content.PluginCrashedEvent("PluginCrashed", {
|
||||
pluginName: "",
|
||||
pluginDumpID: "",
|
||||
browserDumpID: "",
|
||||
submittedCrashReport: false,
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
});
|
||||
|
||||
plugin.dispatchEvent(event);
|
||||
Assert.equal(statusDiv.getAttribute("status"), "please",
|
||||
"Should have been showing crash report UI");
|
||||
});
|
||||
await BrowserTestUtils.closeWindow(win);
|
||||
await crashDeferred.promise;
|
||||
});
|
||||
|
||||
/**
|
||||
* In this case, the content process hears about the crash first.
|
||||
*/
|
||||
add_task(async function testContentHearsCrashFirst() {
|
||||
// Setup the crash observer promise
|
||||
crashDeferred = PromiseUtils.defer();
|
||||
|
||||
// Open a remote window so that we can run this test even if e10s is not
|
||||
// enabled by default.
|
||||
let win = await BrowserTestUtils.openNewBrowserWindow({remote: true});
|
||||
let browser = win.gBrowser.selectedBrowser;
|
||||
|
||||
BrowserTestUtils.loadURI(browser, CRASH_URL);
|
||||
await BrowserTestUtils.browserLoaded(browser);
|
||||
|
||||
// In this case, we want the <object> to match the -moz-handler-crashed
|
||||
// pseudoselector, and we want the plugin to seem crashed, since the
|
||||
// content process in this case has heard about the crash first.
|
||||
let runID = await preparePlugin(browser,
|
||||
Ci.nsIObjectLoadingContent.PLUGIN_CRASHED);
|
||||
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
// At this point, the content process has not yet heard from the
|
||||
// parent about the crash report. Let's ensure that by making sure
|
||||
// we're not showing the plugin crash report UI.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
|
||||
if (statusDiv.getAttribute("status") == "please") {
|
||||
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
|
||||
}
|
||||
|
||||
let event = new content.PluginCrashedEvent("PluginCrashed", {
|
||||
pluginName: "",
|
||||
pluginDumpID: "",
|
||||
browserDumpID: "",
|
||||
submittedCrashReport: false,
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
});
|
||||
|
||||
plugin.dispatchEvent(event);
|
||||
|
||||
Assert.notEqual(statusDiv.getAttribute("status"), "please",
|
||||
"Should not yet be showing crash report UI");
|
||||
});
|
||||
|
||||
// Now send the message down to PluginContent.jsm that the plugin has
|
||||
// crashed...
|
||||
let mm = browser.messageManager;
|
||||
mm.sendAsyncMessage(CRASHED_MESSAGE,
|
||||
{ pluginName: "", runID, state: "please"});
|
||||
|
||||
await ContentTask.spawn(browser, null, async function() {
|
||||
// At this point, the content process will have heard the message
|
||||
// from the parent and reacted to it. We should be showing the plugin
|
||||
// crash report UI now.
|
||||
let plugin = content.document.getElementById("plugin");
|
||||
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let statusDiv = plugin.ownerDocument
|
||||
.getAnonymousElementByAttribute(plugin, "anonid",
|
||||
"submitStatus");
|
||||
|
||||
Assert.equal(statusDiv.getAttribute("status"), "please",
|
||||
"Should have been showing crash report UI");
|
||||
});
|
||||
|
||||
await BrowserTestUtils.closeWindow(win);
|
||||
await crashDeferred.promise;
|
||||
});
|
|
@ -0,0 +1,86 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
var gTestBrowser = null;
|
||||
|
||||
function updateAllTestPlugins(aState) {
|
||||
setTestPluginEnabledState(aState, "Test Plug-in");
|
||||
setTestPluginEnabledState(aState, "Second Test Plug-in");
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
gTestBrowser = null;
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
// Prime the blocklist service, the remote service doesn't launch on startup.
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
});
|
||||
|
||||
// Tests that a click-to-play plugin retains its activated state upon reloading
|
||||
add_task(async function() {
|
||||
clearAllPluginPermissions();
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 1, Should have a click-to-play notification");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
|
||||
"Test 2, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
|
||||
|
||||
// run the plugin
|
||||
await promisePlayObject("test");
|
||||
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_PLUGIN, "Test 3, plugin should have started");
|
||||
ok(pluginInfo.activated, "Test 4, plugin node should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let npobj1 = Cu.waiveXrays(plugin).getObjectValue();
|
||||
// eslint-disable-next-line no-self-assign
|
||||
plugin.src = plugin.src;
|
||||
let pluginsDiffer = false;
|
||||
try {
|
||||
Cu.waiveXrays(plugin).checkObjectValue(npobj1);
|
||||
} catch (e) {
|
||||
pluginsDiffer = true;
|
||||
}
|
||||
|
||||
Assert.ok(pluginsDiffer, "Test 5, plugins differ.");
|
||||
});
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 6, Plugin should have retained activated state.");
|
||||
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_PLUGIN, "Test 7, plugin should have started");
|
||||
});
|
|
@ -0,0 +1,480 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
var gTestBrowser = null;
|
||||
|
||||
function updateAllTestPlugins(aState) {
|
||||
setTestPluginEnabledState(aState, "Test Plug-in");
|
||||
setTestPluginEnabledState(aState, "Second Test Plug-in");
|
||||
}
|
||||
|
||||
add_task(async function() {
|
||||
registerCleanupFunction(async function() {
|
||||
clearAllPluginPermissions();
|
||||
Services.prefs.clearUserPref("plugins.click_to_play");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Second Test Plug-in");
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
resetBlocklist();
|
||||
gTestBrowser = null;
|
||||
gBrowser.removeCurrentTab();
|
||||
window.focus();
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true);
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
// Prime the blocklist service, the remote service doesn't launch on startup.
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
});
|
||||
|
||||
// Tests a page with an unknown plugin in it.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_unknown.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("unknown");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED,
|
||||
"Test 1a, plugin fallback type should be PLUGIN_UNSUPPORTED");
|
||||
});
|
||||
|
||||
// Test that the doorhanger is shown when the user clicks on the overlay
|
||||
// after having previously blocked the plugin.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Plugin should not be activated");
|
||||
|
||||
// Simulate clicking the "Allow" button.
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Plugin should be activated");
|
||||
|
||||
// Simulate clicking the "Block" button.
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.secondaryButton.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Plugin should not be activated");
|
||||
|
||||
let browserLoaded = BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
gTestBrowser.reload();
|
||||
await browserLoaded;
|
||||
notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
|
||||
// Simulate clicking the overlay
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let bounds = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
ok(!notification.dismissed, "A plugin notification should be shown.");
|
||||
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// Tests that going back will reshow the notification for click-to-play plugins
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>hi</html>");
|
||||
|
||||
// make sure the notification is gone
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(!notification, "Test 11b, Should not have a click-to-play notification");
|
||||
|
||||
gTestBrowser.webNavigation.goBack();
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
});
|
||||
|
||||
// Tests that the "Allow Always" permission works for click-to-play plugins
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 12a, Plugin should not be activated");
|
||||
|
||||
// Simulate clicking the "Allow" button.
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 12a, Plugin should be activated");
|
||||
});
|
||||
|
||||
// Test that the "Always" permission, when set for just the Test plugin,
|
||||
// does not also allow the Second Test plugin.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_two_types.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
await promisePopupNotification("click-to-play-plugins");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let test = content.document.getElementById("test");
|
||||
let secondtestA = content.document.getElementById("secondtestA");
|
||||
let secondtestB = content.document.getElementById("secondtestB");
|
||||
Assert.ok(test.activated && !secondtestA.activated && !secondtestB.activated,
|
||||
"Content plugins are set up");
|
||||
});
|
||||
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// Tests that the plugin's "activated" property is true for working plugins
|
||||
// with click-to-play disabled.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_ENABLED);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test2.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test1");
|
||||
ok(pluginInfo.activated, "Test 14, Plugin should be activated");
|
||||
});
|
||||
|
||||
// Tests that the overlay is shown instead of alternate content when
|
||||
// plugins are click to play.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_alternate_content.html");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!!mainBox, "Test 15, Plugin overlay should exist");
|
||||
});
|
||||
});
|
||||
|
||||
// Tests that mContentType is used for click-to-play plugins, and not the
|
||||
// inspected type.
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_bug749455.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 17, Should have a click-to-play notification");
|
||||
});
|
||||
|
||||
// Tests that clicking the icon of the overlay activates the doorhanger
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 18g, Plugin should not be activated");
|
||||
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
|
||||
"Test 19a, Doorhanger should start out dismissed");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let icon = doc.getAnonymousElementByAttribute(plugin, "class", "icon");
|
||||
let bounds = icon.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
|
||||
await promiseForCondition(condition);
|
||||
});
|
||||
|
||||
// Tests that clicking the text of the overlay activates the plugin
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 18g, Plugin should not be activated");
|
||||
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
|
||||
"Test 19c, Doorhanger should start out dismissed");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let text = doc.getAnonymousElementByAttribute(plugin, "class", "msg msgClickToPlay");
|
||||
let bounds = text.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed;
|
||||
await promiseForCondition(condition);
|
||||
});
|
||||
|
||||
// Tests that clicking the box of the overlay activates the doorhanger
|
||||
// (just to be thorough)
|
||||
add_task(async function() {
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 18g, Plugin should not be activated");
|
||||
|
||||
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
|
||||
"Test 19e, Doorhanger should start out dismissed");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", 50, 50, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", 50, 50, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
let condition = () => !PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed &&
|
||||
PopupNotifications.panel.firstElementChild;
|
||||
await promiseForCondition(condition);
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 19e, Plugin should not be activated");
|
||||
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// Tests that a plugin in a div that goes from style="display: none" to
|
||||
// "display: block" can be clicked to activate.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_hidden_to_visible.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 20a, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
Assert.ok(!!overlay, "Test 20a, Plugin overlay should exist");
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlayRect = mainBox.getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
|
||||
"Test 20a, plugin should have an overlay with 0px width and height");
|
||||
});
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 20b, plugin should not be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let div = doc.getElementById("container");
|
||||
Assert.equal(div.style.display, "none",
|
||||
"Test 20b, container div should be display: none");
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let div = doc.getElementById("container");
|
||||
div.style.display = "block";
|
||||
});
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
|
||||
let overlayRect = mainBox.getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 200 && overlayRect.height == 200,
|
||||
"Test 20c, plugin should have overlay dims of 200px");
|
||||
});
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(!pluginInfo.activated, "Test 20b, plugin should not be activated");
|
||||
|
||||
ok(notification.dismissed, "Test 20c, Doorhanger should start out dismissed");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let bounds = plugin.getBoundingClientRect();
|
||||
let left = (bounds.left + bounds.right) / 2;
|
||||
let top = (bounds.top + bounds.bottom) / 2;
|
||||
let utils = content.windowUtils;
|
||||
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
|
||||
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
|
||||
});
|
||||
|
||||
let condition = () => !notification.dismissed && !!PopupNotifications.panel.firstElementChild;
|
||||
await promiseForCondition(condition);
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
ok(pluginInfo.activated, "Test 20c, plugin should be activated");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
|
||||
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
|
||||
"Test 20c, plugin should have overlay dims of 0px");
|
||||
});
|
||||
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// Tests that a click-to-play plugin resets its activated state when changing types
|
||||
add_task(async function() {
|
||||
clearAllPluginPermissions();
|
||||
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(notification, "Test 22, Should have a click-to-play notification");
|
||||
|
||||
// Plugin should start as CTP
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
|
||||
"Test 23, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
plugin.type = null;
|
||||
// We currently don't properly change state just on type change,
|
||||
// so rebind the plugin to tree. bug 767631
|
||||
plugin.parentNode.appendChild(plugin);
|
||||
});
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_NULL, "Test 23, plugin should be TYPE_NULL");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let doc = content.document;
|
||||
let plugin = doc.getElementById("test");
|
||||
plugin.type = "application/x-test";
|
||||
plugin.parentNode.appendChild(plugin);
|
||||
});
|
||||
|
||||
pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_NULL, "Test 23, plugin should be TYPE_NULL");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
|
||||
"Test 23, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
|
||||
ok(!pluginInfo.activated, "Test 23, plugin node should not be activated");
|
||||
});
|
||||
|
||||
// Plugin sync removal test. Note this test produces a notification drop down since
|
||||
// the plugin we add has zero dims.
|
||||
add_task(async function() {
|
||||
updateAllTestPlugins(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_syncRemoved.html");
|
||||
|
||||
// Maybe there some better trick here, we need to wait for the page load, then
|
||||
// wait for the js to execute in the page.
|
||||
await waitForMs(500);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins");
|
||||
ok(notification, "Test 25: There should be a plugin notification even if the plugin was immediately removed");
|
||||
ok(notification.dismissed, "Test 25: The notification should be dismissed by default");
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>hi</html>");
|
||||
});
|
||||
|
||||
// Tests a page with a blocked plugin in it and make sure the infoURL property
|
||||
// the blocklist file gets used.
|
||||
add_task(async function() {
|
||||
clearAllPluginPermissions();
|
||||
|
||||
await asyncSetAndUpdateBlocklist(gTestRoot + "blockPluginInfoURL.xml", gTestBrowser);
|
||||
|
||||
await promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
|
||||
|
||||
// Work around for delayed PluginBindingAttached
|
||||
await promiseUpdatePluginBindings(gTestBrowser);
|
||||
|
||||
let notification = PopupNotifications.getNotification("click-to-play-plugins");
|
||||
|
||||
// Since the plugin notification is dismissed by default, reshow it.
|
||||
await promiseForNotificationShown(notification);
|
||||
|
||||
let pluginInfo = await promiseForPluginInfo("test");
|
||||
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_BLOCKLISTED,
|
||||
"Test 26, plugin fallback type should be PLUGIN_BLOCKLISTED");
|
||||
ok(!pluginInfo.activated, "Plugin should be activated.");
|
||||
});
|
|
@ -0,0 +1,44 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/*
|
||||
* This test ensures that navigator.requestMediaKeySystemAccess() requests
|
||||
* to run EME with persistent state are rejected in private browsing windows.
|
||||
* Bug 1334111.
|
||||
*/
|
||||
|
||||
const TEST_URL =
|
||||
getRootDirectory(gTestPath).replace("chrome://mochitests/content",
|
||||
"https://example.com") + "empty_file.html";
|
||||
|
||||
async function isEmePersistentStateSupported(mode) {
|
||||
let win = await BrowserTestUtils.openNewBrowserWindow(mode);
|
||||
let tab = await BrowserTestUtils.openNewForegroundTab(win.gBrowser, TEST_URL);
|
||||
let persistentStateSupported = await ContentTask.spawn(tab.linkedBrowser, {}, async function() {
|
||||
try {
|
||||
let config = [{
|
||||
initDataTypes: ["webm"],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
persistentState: "required",
|
||||
}];
|
||||
await content.navigator.requestMediaKeySystemAccess("org.w3.clearkey", config);
|
||||
} catch (ex) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
await BrowserTestUtils.closeWindow(win);
|
||||
|
||||
return persistentStateSupported;
|
||||
}
|
||||
|
||||
add_task(async function test() {
|
||||
is(await isEmePersistentStateSupported({private: true}),
|
||||
false,
|
||||
"EME persistentState should *NOT* be supported in private browsing window.");
|
||||
is(await isEmePersistentStateSupported({private: false}),
|
||||
true,
|
||||
"EME persistentState *SHOULD* be supported in non private browsing window.");
|
||||
});
|
|
@ -0,0 +1,230 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
var rootDir = getRootDirectory(gTestPath);
|
||||
const gTestRoot = rootDir;
|
||||
const gHttpTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
|
||||
|
||||
var gTestBrowser = null;
|
||||
var gNextTest = null;
|
||||
var gPluginHost = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
|
||||
|
||||
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
var gPrivateWindow = null;
|
||||
var gPrivateBrowser = null;
|
||||
|
||||
function finishTest() {
|
||||
clearAllPluginPermissions();
|
||||
gBrowser.removeCurrentTab();
|
||||
if (gPrivateWindow) {
|
||||
gPrivateWindow.close();
|
||||
}
|
||||
window.focus();
|
||||
}
|
||||
|
||||
let createPrivateWindow = async function createPrivateWindow(url) {
|
||||
gPrivateWindow = await BrowserTestUtils.openNewBrowserWindow({private: true});
|
||||
ok(!!gPrivateWindow, "should have created a private window.");
|
||||
gPrivateBrowser = gPrivateWindow.getBrowser().selectedBrowser;
|
||||
|
||||
BrowserTestUtils.loadURI(gPrivateBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gPrivateBrowser, false, url);
|
||||
info("loaded " + url);
|
||||
};
|
||||
|
||||
add_task(async function test() {
|
||||
registerCleanupFunction(function() {
|
||||
clearAllPluginPermissions();
|
||||
getTestPlugin().enabledState = Ci.nsIPluginTag.STATE_ENABLED;
|
||||
getTestPlugin("Second Test Plug-in").enabledState = Ci.nsIPluginTag.STATE_ENABLED;
|
||||
});
|
||||
|
||||
let newTab = BrowserTestUtils.addTab(gBrowser);
|
||||
gBrowser.selectedTab = newTab;
|
||||
gTestBrowser = gBrowser.selectedBrowser;
|
||||
let promise = BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
|
||||
Services.prefs.setBoolPref("plugins.click_to_play", true);
|
||||
getTestPlugin().enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
|
||||
getTestPlugin("Second Test Plug-in").enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
|
||||
await promise;
|
||||
});
|
||||
|
||||
add_task(async function test1a() {
|
||||
await createPrivateWindow(gHttpTestRoot + "plugin_test.html");
|
||||
});
|
||||
|
||||
add_task(async function test1b() {
|
||||
let popupNotification = gPrivateWindow.PopupNotifications.getNotification("click-to-play-plugins", gPrivateBrowser);
|
||||
ok(popupNotification, "Test 1b, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gPrivateBrowser, null, function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
ok(!objLoadingContent.activated, "Test 1b, Plugin should not be activated");
|
||||
});
|
||||
|
||||
// Check the button status
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(gPrivateWindow.PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
|
||||
await promiseShown;
|
||||
is(gPrivateWindow.PopupNotifications.panel.firstElementChild.checkbox.hidden, true, "'Remember' checkbox should be hidden in private windows");
|
||||
|
||||
let promises = [
|
||||
BrowserTestUtils.browserLoaded(gTestBrowser, false, gHttpTestRoot + "plugin_test.html"),
|
||||
BrowserTestUtils.waitForEvent(window, "activate"),
|
||||
];
|
||||
gPrivateWindow.close();
|
||||
BrowserTestUtils.loadURI(gTestBrowser, gHttpTestRoot + "plugin_test.html");
|
||||
await Promise.all(promises);
|
||||
await SimpleTest.promiseFocus(window);
|
||||
});
|
||||
|
||||
add_task(async function test2a() {
|
||||
// enable test plugin on this site
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "Test 2a, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
ok(!objLoadingContent.activated, "Test 2a, Plugin should not be activated");
|
||||
});
|
||||
|
||||
// Simulate clicking the "Allow Now" button.
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let condition = () => objLoadingContent.activated;
|
||||
await ContentTaskUtils.waitForCondition(condition, "Test 2a, Waited too long for plugin to activate");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function test2c() {
|
||||
let topicObserved = TestUtils.topicObserved("PopupNotifications-updateNotShowing");
|
||||
await createPrivateWindow(gHttpTestRoot + "plugin_test.html");
|
||||
await topicObserved;
|
||||
|
||||
let popupNotification = gPrivateWindow.PopupNotifications.getNotification("click-to-play-plugins", gPrivateBrowser);
|
||||
ok(popupNotification, "Test 2c, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gPrivateBrowser, null, function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
ok(objLoadingContent.activated, "Test 2c, Plugin should be activated");
|
||||
});
|
||||
|
||||
// Check the button status
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(gPrivateWindow.PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
is(gPrivateWindow.PopupNotifications.panel.firstElementChild.secondaryButton.hidden, true,
|
||||
"Test 2c, Activated plugin in a private window should not have visible 'Block' button.");
|
||||
is(gPrivateWindow.PopupNotifications.panel.firstElementChild.checkbox.hidden, true,
|
||||
"Test 2c, Activated plugin in a private window should not have visible 'Remember' checkbox.");
|
||||
|
||||
clearAllPluginPermissions();
|
||||
|
||||
let promises = [
|
||||
BrowserTestUtils.browserLoaded(gTestBrowser, false, gHttpTestRoot + "plugin_test.html"),
|
||||
BrowserTestUtils.waitForEvent(window, "activate"),
|
||||
];
|
||||
gPrivateWindow.close();
|
||||
BrowserTestUtils.loadURI(gTestBrowser, gHttpTestRoot + "plugin_test.html");
|
||||
await Promise.all(promises);
|
||||
await SimpleTest.promiseFocus(window);
|
||||
});
|
||||
|
||||
add_task(async function test3a() {
|
||||
// enable test plugin on this site
|
||||
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
|
||||
ok(popupNotification, "Test 3a, Should have a click-to-play notification");
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
ok(!objLoadingContent.activated, "Test 3a, Plugin should not be activated");
|
||||
});
|
||||
|
||||
// Simulate clicking the "Allow" button.
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
PopupNotifications.panel.firstElementChild.button.click();
|
||||
|
||||
await ContentTask.spawn(gTestBrowser, null, async function() {
|
||||
let plugin = content.document.getElementById("test");
|
||||
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
|
||||
let condition = () => objLoadingContent.activated;
|
||||
await ContentTaskUtils.waitForCondition(condition, "Test 3a, Waited too long for plugin to activate");
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function test3c() {
|
||||
let topicObserved = TestUtils.topicObserved("PopupNotifications-updateNotShowing");
|
||||
await createPrivateWindow(gHttpTestRoot + "plugin_test.html");
|
||||
await topicObserved;
|
||||
|
||||
let popupNotification = gPrivateWindow.PopupNotifications.getNotification("click-to-play-plugins", gPrivateBrowser);
|
||||
ok(popupNotification, "Test 3c, Should have a click-to-play notification");
|
||||
|
||||
// Check the button status
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(gPrivateWindow.PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
is(gPrivateWindow.PopupNotifications.panel.firstElementChild.secondaryButton.hidden, true,
|
||||
"Test 2c, Activated plugin in a private window should not have visible 'Block' button.");
|
||||
is(gPrivateWindow.PopupNotifications.panel.firstElementChild.checkbox.hidden, true,
|
||||
"Test 2c, Activated plugin in a private window should not have visible 'Remember' checkbox.");
|
||||
|
||||
BrowserTestUtils.loadURI(gPrivateBrowser, gHttpTestRoot + "plugin_two_types.html");
|
||||
await BrowserTestUtils.browserLoaded(gPrivateBrowser);
|
||||
});
|
||||
|
||||
add_task(async function test3d() {
|
||||
let popupNotification = gPrivateWindow.PopupNotifications.getNotification("click-to-play-plugins", gPrivateBrowser);
|
||||
ok(popupNotification, "Test 3d, Should have a click-to-play notification");
|
||||
|
||||
// Check the list item status
|
||||
let promiseShown = BrowserTestUtils.waitForEvent(gPrivateWindow.PopupNotifications.panel,
|
||||
"Shown");
|
||||
popupNotification.reshow();
|
||||
await promiseShown;
|
||||
let doc = gPrivateWindow.document;
|
||||
for (let item of gPrivateWindow.PopupNotifications.panel.firstElementChild.children) {
|
||||
let allowalways = doc.getAnonymousElementByAttribute(item, "anonid", "allowalways");
|
||||
ok(allowalways, "Test 3d, should have list item for allow always");
|
||||
let allownow = doc.getAnonymousElementByAttribute(item, "anonid", "allownow");
|
||||
ok(allownow, "Test 3d, should have list item for allow now");
|
||||
let block = doc.getAnonymousElementByAttribute(item, "anonid", "block");
|
||||
ok(block, "Test 3d, should have list item for block");
|
||||
|
||||
if (item.action.pluginName === "Test") {
|
||||
is(item.value, "allowalways", "Test 3d, Plugin should bet set to 'allow always'");
|
||||
ok(!allowalways.hidden, "Test 3d, Plugin set to 'always allow' should have a visible 'always allow' action.");
|
||||
ok(allownow.hidden, "Test 3d, Plugin set to 'always allow' should have an invisible 'allow now' action.");
|
||||
ok(block.hidden, "Test 3d, Plugin set to 'always allow' should have an invisible 'block' action.");
|
||||
} else if (item.action.pluginName === "Second Test") {
|
||||
is(item.value, "block", "Test 3d, Second plugin should bet set to 'block'");
|
||||
ok(allowalways.hidden, "Test 3d, Plugin set to 'block' should have a visible 'always allow' action.");
|
||||
ok(!allownow.hidden, "Test 3d, Plugin set to 'block' should have a visible 'allow now' action.");
|
||||
ok(!block.hidden, "Test 3d, Plugin set to 'block' should have a visible 'block' action.");
|
||||
} else {
|
||||
ok(false, "Test 3d, Unexpected plugin '" + item.action.pluginName + "'");
|
||||
}
|
||||
}
|
||||
|
||||
finishTest();
|
||||
});
|
|
@ -0,0 +1,74 @@
|
|||
/* import-globals-from ../head.js */
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_PLUGIN_NAME = "Test Plug-in";
|
||||
const HIDDEN_CTP_PLUGIN_PREF = "plugins.navigator.hidden_ctp_plugin";
|
||||
const DOMAIN_1 = "http://example.com";
|
||||
const DOMAIN_2 = "http://mochi.test:8888";
|
||||
|
||||
/**
|
||||
* If a plugin is click-to-play and named in HIDDEN_CTP_PLUGIN_PREF,
|
||||
* then the plugin should be hidden in the navigator.plugins list by
|
||||
* default. However, if a plugin has been allowed on a top-level
|
||||
* document, we should let subframes of that document access
|
||||
* navigator.plugins.
|
||||
*/
|
||||
add_task(async function setup() {
|
||||
// We'll make the Test Plugin click-to-play.
|
||||
let originalPluginState = getTestPluginEnabledState();
|
||||
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY);
|
||||
registerCleanupFunction(() => {
|
||||
setTestPluginEnabledState(originalPluginState);
|
||||
clearAllPluginPermissions();
|
||||
});
|
||||
|
||||
// And then make the plugin hidden.
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [[HIDDEN_CTP_PLUGIN_PREF, TEST_PLUGIN_NAME]],
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function test_plugin_accessible_in_subframe() {
|
||||
// Let's make it so that DOMAIN_1 allows the test plugin to
|
||||
// be activated. This permission will be cleaned up inside
|
||||
// our registerCleanupFunction when the test ends.
|
||||
let ssm = Services.scriptSecurityManager;
|
||||
let principal = ssm.createCodebasePrincipalFromOrigin(DOMAIN_1);
|
||||
let pluginHost = Cc["@mozilla.org/plugin/host;1"]
|
||||
.getService(Ci.nsIPluginHost);
|
||||
let permString = pluginHost.getPermissionStringForType("application/x-test");
|
||||
Services.perms.addFromPrincipal(principal, permString,
|
||||
Ci.nsIPermissionManager.ALLOW_ACTION,
|
||||
Ci.nsIPermissionManager.EXPIRE_NEVER,
|
||||
0 /* expireTime */);
|
||||
|
||||
await BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: DOMAIN_1,
|
||||
}, async function(browser) {
|
||||
await ContentTask.spawn(browser, [TEST_PLUGIN_NAME, DOMAIN_2],
|
||||
async function([pluginName, domain2]) {
|
||||
Assert.ok(content.navigator.plugins[pluginName],
|
||||
"Top-level document should find Test Plugin");
|
||||
|
||||
// Now manually create a subframe hosted at domain2...
|
||||
let subframe = content.document.createElement("iframe");
|
||||
subframe.src = domain2;
|
||||
let loadedPromise = ContentTaskUtils.waitForEvent(subframe, "load");
|
||||
content.document.body.appendChild(subframe);
|
||||
await loadedPromise;
|
||||
|
||||
// Make sure that the HiddenPlugin event never fires in content.
|
||||
let sawEvent = false;
|
||||
addEventListener("HiddenPlugin", function onHiddenPlugin(e) {
|
||||
sawEvent = true;
|
||||
removeEventListener("HiddenPlugin", onHiddenPlugin, true);
|
||||
}, true);
|
||||
|
||||
Assert.ok(subframe.contentWindow.navigator.plugins[pluginName],
|
||||
"Subframe should find Test Plugin");
|
||||
Assert.ok(!sawEvent, "Should not have seen the HiddenPlugin event.");
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
This page is intentionally left blank.
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
function addPlugin(aId, aType = "application/x-test") {
|
||||
var embed = document.createElement("embed");
|
||||
embed.setAttribute("id", aId);
|
||||
embed.style.width = "200px";
|
||||
embed.style.height = "200px";
|
||||
embed.setAttribute("type", aType);
|
||||
return document.body.appendChild(embed);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!-- bug 739575 -->
|
||||
<html>
|
||||
<head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
|
||||
</head>
|
||||
<body>
|
||||
<object id="test" type="application/x-test" style="height: 200px; width:200px">
|
||||
<p><a href="about:blank">you should not see this link when plugins are click-to-play</a></p>
|
||||
</object>
|
||||
</body></html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 500px; height: 500px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="unknown" style="width: 100px; height: 100px" type="application/x-unknown">
|
||||
<embed id="test" style="width: 100px; height: 100px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 100px; height: 100px" type="application/x-test">
|
||||
<embed id="unknown" style="width: 100px; height: 100px" type="application/x-unknown">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body>
|
||||
<style>
|
||||
.x {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
</style>
|
||||
<object id="test" class="x" type="application/x-test" width=200 height=200></object>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,8 @@
|
|||
<!-- bug 749455 -->
|
||||
<html>
|
||||
<head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
|
||||
</head>
|
||||
<body>
|
||||
<embed src="plugin_bug749455.html" type="application/x-test" width="100px" height="100px"></embed>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body>
|
||||
<a id="wrapper">
|
||||
<embed id="plugin" style="width: 200px; height: 200px" type="application/x-test">
|
||||
</a>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body><embed id="plugin" type="9000"></embed></body>
|
||||
</html>
|
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body>
|
||||
<object id="test" type="application/x-test" width=200 height=200></object>
|
||||
<script>
|
||||
function addSecondPlugin() {
|
||||
var object = document.createElement("object");
|
||||
object.type = "application/x-second-test";
|
||||
object.width = 200;
|
||||
object.height = 200;
|
||||
object.id = "secondtest";
|
||||
document.body.appendChild(object);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 200px; height: 200px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 200px; height: 200px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script type="text/javascript">
|
||||
function crash() {
|
||||
var plugin = document.getElementById("plugin");
|
||||
var argStr = decodeURIComponent(window.location.search.substr(1));
|
||||
if (argStr) {
|
||||
var args = JSON.parse(argStr);
|
||||
for (var key in args)
|
||||
plugin.setAttribute(key, args[key]);
|
||||
}
|
||||
try {
|
||||
plugin.crash();
|
||||
} catch (err) {}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="crash();">
|
||||
<embed id="plugin" type="application/x-test"
|
||||
width="400" height="400"
|
||||
drawmode="solid" color="FF00FFFF">
|
||||
</embed>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,96 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body>
|
||||
<style>
|
||||
.testcase {
|
||||
display: none;
|
||||
}
|
||||
object {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Tests that a <video> tag in the fallback content favors the fallback content -->
|
||||
<div id="testcase_video" class="testcase">
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
<video></video>
|
||||
Expected fallback
|
||||
</object>
|
||||
</div>
|
||||
|
||||
<!-- Tests that an object with no src specified (no data="") favors the fallback content -->
|
||||
<div id="testcase_nosrc" class="testcase">
|
||||
<!-- We must use an existing and valid file here because otherwise the failed load
|
||||
triggers the plugin's alternate content, indepedent of the favor-fallback code path -->
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test" data="plugin_simple_blank.swf">
|
||||
Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
Expected fallback
|
||||
</object>
|
||||
</div>
|
||||
|
||||
<!-- Tests that an <embed> tag in the fallback content forces the plugin content,
|
||||
when fallback is defaulting to true -->
|
||||
<div id="testcase_embed" class="testcase">
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
<embed></embed>
|
||||
Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
Expected fallback
|
||||
</object>
|
||||
</div>
|
||||
|
||||
<!-- Tests that links to adobe.com inside the fallback content forces the plugin content,
|
||||
when fallback is defaulting to true -->
|
||||
<div id="testcase_adobelink" class="testcase">
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
<a href="https://www.adobe.com">Go to adobe.com</a>
|
||||
Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
<a href="https://adobe.com">Go to adobe.com</a>
|
||||
Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
Expected fallback
|
||||
</object>
|
||||
</div>
|
||||
|
||||
<!-- Tests that instructions to download or install flash inside the fallback content
|
||||
forces the plugin content, when fallback is defaulting to true -->
|
||||
<div id="testcase_installinstructions" class="testcase">
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
Install -- Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
Flash -- Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_ctp" type="application/x-shockwave-flash-test">
|
||||
Download -- Unexpected fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
<!-- Tests that the words Install, Flash or Download do not trigger
|
||||
this behavior if it's just inside a comment, and not part of
|
||||
the text content -->
|
||||
Expected Fallback
|
||||
</object>
|
||||
<object class="expected_fallback" type="application/x-shockwave-flash-test">
|
||||
Expected fallback
|
||||
</object>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let queryString = location.search;
|
||||
let match = /^\?testcase=([a-z]+)$/.exec(queryString);
|
||||
let testcase = match[1];
|
||||
document.getElementById(`testcase_${testcase}`).style.display = "block";
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="container" style="display: none">
|
||||
<object id="test" type="application/x-test" style="width: 200px; height: 200px;"></object>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<iframe id="frame" with="400" height="400" src="plugin_test.html">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style type="text/css">
|
||||
#container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: blue;
|
||||
}
|
||||
|
||||
#test {
|
||||
width: 400px;
|
||||
height: 400px;
|
||||
position: absolute;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="testcase1" class="testcase">
|
||||
<object width="10" height="10" type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase2" class="testcase">
|
||||
<object width="40" height="40" type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase3" class="testcase">
|
||||
<object width="100" height="70" type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase4" class="testcase">
|
||||
<object width="200" height="200" type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase5" class="testcase">
|
||||
<object width="300" height="300" type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,116 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
object {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.testcase {
|
||||
position: relative;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.cover {
|
||||
position: absolute;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-color: green;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="testcase1" class="testcase" shouldshow="true"
|
||||
style="top: -100px">
|
||||
<!-- Should show overlay even though the top part is outside
|
||||
of the page. -->
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase2" class="testcase" shouldshow="true"
|
||||
style="left: -100px">
|
||||
<!-- Should show overlay even though the left part is outside
|
||||
of the page. -->
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase3" class="testcase" shouldshow="false"
|
||||
style="left: -210px">
|
||||
<!-- The object is entirely outside of the page, so the overlay
|
||||
should NOT show. -->
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase4" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though the top-left corner is covered. -->
|
||||
<div class="cover" style="top: 0; left: 0"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase5" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though the top-right corner is covered. -->
|
||||
<div class="cover" style="top: 0; left: 180px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase6" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though the bottom-left corner is covered. -->
|
||||
<div class="cover" style="top: 180px; left: 0"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="testcase7" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though the bottom-right corner is covered. -->
|
||||
<div class="cover" style="top: 180px; left: 180px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase8" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though the center is covered. -->
|
||||
<div class="cover" style="top: 90px; left: 90px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase9" class="testcase" shouldshow="true">
|
||||
<!-- Should show overlay even though multiple points are covered,
|
||||
but not all of them. -->
|
||||
<div class="cover" style="top: 0; left: 0"></div>
|
||||
<div class="cover" style="top: 0; left: 180px"></div>
|
||||
<div class="cover" style="top: 180px; left: 0"></div>
|
||||
<div class="cover" style="top: 180px; left: 180px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase10" class="testcase" shouldshow="true">
|
||||
<!-- Another case where 4 are covered, but not all. -->
|
||||
<div class="cover" style="top: 90px; left: 90px"></div>
|
||||
<div class="cover" style="top: 0; left: 180px"></div>
|
||||
<div class="cover" style="top: 180px; left: 0"></div>
|
||||
<div class="cover" style="top: 180px; left: 180px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase11" class="testcase" shouldshow="false">
|
||||
<!-- All corners and center are covered here, so in this
|
||||
case the overlay should NOT show. -->
|
||||
<div class="cover" style="top: 0; left: 0"></div>
|
||||
<div class="cover" style="top: 0; left: 180px"></div>
|
||||
<div class="cover" style="top: 180px; left: 0"></div>
|
||||
<div class="cover" style="top: 180px; left: 180px"></div>
|
||||
<div class="cover" style="top: 90px; left: 90px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
<div id="testcase12" class="testcase" shouldshow="false">
|
||||
<!-- All corners and center are covered here, by a single
|
||||
element. In this case the overlay should NOT show. -->
|
||||
<div class="cover" style="width: 200px; height:200px"></div>
|
||||
<object type="application/x-test"></object>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
Двоичный файл не отображается.
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 10px; height: 10px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 10px; height: 10px" type="application/x-second-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<body>
|
||||
<script type="text/javascript">
|
||||
// create an embed, insert it in the doc and immediately remove it
|
||||
var embed = document.createElement("embed");
|
||||
embed.setAttribute("id", "test");
|
||||
embed.setAttribute("type", "application/x-test");
|
||||
embed.setAttribute("style", "width: 0px; height: 0px;");
|
||||
document.body.appendChild(embed);
|
||||
window.getComputedStyle(embed).top;
|
||||
document.body.remove(embed);
|
||||
</script>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 300px; height: 300px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test1" style="width: 200px; height: 200px" type="application/x-test">
|
||||
<embed id="test2" style="width: 200px; height: 200px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="test" style="width: 0px; height: 0px" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"/></head>
|
||||
<body>
|
||||
<embed id="test" style="width: 200px; height: 200px" type="application/x-test"/>
|
||||
<embed id="secondtestA" style="width: 200px; height: 200px" type="application/x-second-test"/>
|
||||
<embed id="secondtestB" style="width: 200px; height: 200px" type="application/x-second-test"/>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<embed id="unknown" style="width: 100px; height: 100px" type="application/x-unknown">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<!-- The odd width and height are here to trigger bug 972237. -->
|
||||
<embed id="test" style="width: 99.789%; height: 99.123%" type="application/x-test">
|
||||
</body>
|
||||
</html>
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче