summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/bugs/test_bug61098.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/bugs/test_bug61098.html')
-rw-r--r--dom/tests/mochitest/bugs/test_bug61098.html339
1 files changed, 339 insertions, 0 deletions
diff --git a/dom/tests/mochitest/bugs/test_bug61098.html b/dom/tests/mochitest/bugs/test_bug61098.html
new file mode 100644
index 000000000..4c6ce967d
--- /dev/null
+++ b/dom/tests/mochitest/bugs/test_bug61098.html
@@ -0,0 +1,339 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=61098
+-->
+<head>
+ <title>Test for Bug 61098</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/MockObjects.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body onload="runtests();">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=61098">Mozilla Bug 61098</a>
+<p id="display">
+</p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+</pre>
+<script class="testbody" type="text/javascript">
+/** Test for Bug 61098 **/
+
+SimpleTest.waitForExplicitFinish();
+
+var mockPromptServiceRegisterer, mockPromptFactoryRegisterer;
+
+var promptState;
+
+function registerMockPromptService()
+{
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+ var XPCOMUtils = SpecialPowers.Cu.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils;
+ var Ci = SpecialPowers.Ci;
+
+ function MockPrompt(aDOMWindow) {
+ this.domWindow = aDOMWindow;
+ }
+
+ MockPrompt.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrompt]),
+
+ domWindow : null,
+
+ _toggleModalState: function()
+ {
+ // The real prompt service puts the window into a modal state
+ // immediately before showing a modal prompt, and leaves the modal state
+ // when the prompt is dismissed by the user. This mock prompt doesn't
+ // show anything to the user, so we only need to enter and immediately
+ // leave the modal state -- this is done to trigger the necessary
+ // accounting for triggering the "stop showing more prompts" code for
+ // abusive pages.
+ var winUtils = SpecialPowers.getDOMWindowUtils(this.domWindow);
+ winUtils.enterModalState();
+ winUtils.leaveModalState();
+ },
+
+ alert: function(aDialogTitle, aText)
+ {
+ this._toggleModalState();
+ promptState = {method: "alert",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText
+ };
+ },
+
+ alertCheck: function(aDialogTitle, aText, aCheckMsg, aCheckState)
+ {
+ this._toggleModalState();
+ promptState = {method: "alertCheck",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText,
+ checkMsg: aCheckMsg,
+ checkState: aCheckState
+ };
+
+ SpecialPowers.wrap(aCheckState).value = true;
+ },
+
+ confirm: function(aDialogTitle, aText)
+ {
+ this._toggleModalState();
+ promptState = {method: "confirm",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText
+ };
+
+ return true;
+ },
+
+ confirmCheck: function(aDialogTitle, aText, aCheckMsg, aCheckState)
+ {
+ this._toggleModalState();
+ promptState = {method: "confirmCheck",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText,
+ checkMsg: aCheckMsg,
+ checkState: aCheckState
+ };
+
+ SpecialPowers.wrap(aCheckState).value = true;
+
+ return true;
+ },
+
+ confirmEx: function(aDialogTitle, aText, aButtonFlags,
+ aButton0Title, aButton1Title, aButton2Title,
+ aCheckMsg, aCheckState)
+ {
+ this._toggleModalState();
+ promptState = {method: "confirmCheck",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText,
+ checkMsg: aCheckMsg,
+ checkState: aCheckState
+ };
+
+ if (aCheckMsg != null)
+ SpecialPowers.wrap(aCheckState).value = true;
+
+ return 0;
+ },
+
+ prompt: function(aDialogTitle, aText, aValue, aCheckMsg,
+ aCheckState)
+ {
+ this._toggleModalState();
+ promptState = {method: "prompt",
+ parent: this.domWindow,
+ title: aDialogTitle,
+ msg: aText,
+ checkMsg: aCheckMsg,
+ checkState: aCheckState
+ };
+
+ if (aCheckMsg != null)
+ SpecialPowers.wrap(aCheckState).value = true;
+
+ return true;
+ },
+ };
+
+
+ // Override the prompt service with our own so that we can test
+ // modal dialogs
+
+ function MockPromptService()
+ {
+ }
+
+ MockPromptService.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPromptFactory, Ci.nsIPromptService]),
+
+ getPrompt: function(aDOMWindow, aIID)
+ {
+ return new MockPrompt(aDOMWindow);
+ },
+
+ alert: function(aParent, aDialogTitle, aText)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.alert(aDialogTitle, aText);
+ },
+
+ alertCheck: function(aParent, aDialogTitle, aText, aCheckMsg, aCheckState)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.alertCheck(aDialogTitle, aText, aCheckMsg, aCheckState);
+ },
+
+ confirm: function(aParent, aDialogTitle, aText)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.confirm(aDialogTitle, aText);
+ },
+
+ confirmCheck: function(aParent, aDialogTitle, aText, aCheckMsg,
+ aCheckState)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.confirmCheck(aDialogTitle, aText, aCheckMsg, aCheckState);
+ },
+
+ confirmEx: function(aParent, aDialogTitle, aText, aButtonFlags,
+ aButton0Title, aButton1Title, aButton2Title,
+ aCheckMsg, aCheckState)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.confirmEx(aDialogTitle, aText, aButtonFlags,
+ aButton0Title, aButton1Title, aButton2Title,
+ aCheckMsg, aCheckState);
+ },
+
+ prompt: function(aParent, aDialogTitle, aText, aValue, aCheckMsg,
+ aCheckState)
+ {
+ var prompt = new MockPrompt(aParent);
+ return prompt.prompt(aDialogTitle, aText, aValue, aCheckMsg, aCheckState);
+ },
+
+ };
+
+ mockPromptServiceRegisterer =
+ new MockObjectRegisterer("@mozilla.org/embedcomp/prompt-service;1",
+ MockPromptService);
+ mockPromptFactoryRegisterer =
+ new MockObjectRegisterer("@mozilla.org/prompter;1",
+ MockPromptService);
+
+ mockPromptServiceRegisterer.register();
+ mockPromptFactoryRegisterer.register();
+};
+
+var expectedState;
+
+function runtests()
+{
+ SpecialPowers.pushPrefEnv({'set': [["dom.successive_dialog_time_limit", 3]]},
+ runtestsInner);
+}
+
+function runtestsInner()
+{
+ registerMockPromptService();
+
+ // Test that alert() works normally and then gets blocked on the
+ // second call.
+ w = window.open();
+ w.alert("alert message 1");
+ is (promptState.method, "alert", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong alert parent");
+ is (promptState.msg, "alert message 1", "Wrong alert message");
+ promptState = void(0);
+
+ w.alert("alert message 2");
+ is (promptState.method, "alertCheck", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong alert parent");
+ is (promptState.msg, "alert message 2", "Wrong alert message");
+ promptState = void(0);
+
+ try {
+ w.alert("alert message 3");
+ } catch(e) {
+ is(e.name, "NS_ERROR_NOT_AVAILABLE", "Wrong exception");
+ }
+
+ is (promptState, void(0), "Wrong prompt state after blocked alert()");
+
+ w.close();
+
+ // Test that confirm() works normally and then gets blocked on the
+ // second call.
+ w = window.open();
+ w.confirm("confirm message 1");
+ is (promptState.method, "confirm", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong confirm parent");
+ is (promptState.msg, "confirm message 1", "Wrong confirm message");
+ promptState = void(0);
+
+ w.confirm("confirm message 2");
+ is (promptState.method, "confirmCheck", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong confirm parent");
+ is (promptState.msg, "confirm message 2", "Wrong confirm message");
+ promptState = void(0);
+
+ try {
+ w.confirm("confirm message 3");
+ } catch(e) {
+ is(e.name, "NS_ERROR_NOT_AVAILABLE", "Wrong exception");
+ }
+
+ is (promptState, void(0), "Wrong prompt state after blocked confirm()");
+
+ w.close();
+
+ // Test that prompt() works normally and then gets blocked on the
+ // second call.
+ w = window.open();
+ w.prompt("prompt message 1");
+ is (promptState.method, "prompt", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong prompt parent");
+ is (promptState.msg, "prompt message 1", "Wrong prompt message");
+ is (promptState.checkMsg, null, "Wrong dialog value");
+ promptState = void(0);
+
+ w.prompt("prompt message 2");
+ is (promptState.method, "prompt", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong prompt parent");
+ is (promptState.msg, "prompt message 2", "Wrong prompt message");
+ is (promptState.checkMsg, "Prevent this page from creating additional dialogs", "Wrong dialog value");
+ promptState = void(0);
+
+ try {
+ w.prompt("prompt message 3");
+ } catch(e) {
+ is(e.name, "NS_ERROR_NOT_AVAILABLE", "Wrong exception");
+ }
+
+ is (promptState, void(0), "Wrong prompt state after blocked prompt()");
+
+ w.close();
+
+ // Test that showModalDialog() works normally and then gets blocked
+ // on the second call.
+ if (window.showModalDialog) {
+ w = window.open();
+ w.showModalDialog("data:text/html,%3Cscript>window.close();%3C/script>")
+ is (promptState, void(0), "Wrong prompt state");
+
+ try {
+ w.showModalDialog("data:text/html,%3Cscript>window.close();%3C/script>")
+ ok(false, "showModalDialog call should throw an exception");
+ } catch(e) {
+ is(e.name, "NS_ERROR_NOT_AVAILABLE", "Wrong exception");
+ }
+ is (promptState.method, "confirm", "Wrong prompt method called");
+ is (promptState.parent, w, "Wrong confirm parent");
+ is (promptState.msg, "Prevent this page from creating additional dialogs",
+ "Wrong confirm message");
+ promptState = void(0);
+
+ w.close();
+ }
+
+ mockPromptFactoryRegisterer.unregister();
+ mockPromptServiceRegisterer.unregister();
+
+ SimpleTest.finish();
+}
+
+</script>
+</body>
+</html>