diff options
Diffstat (limited to 'dom/tests/mochitest/bugs/test_bug61098.html')
-rw-r--r-- | dom/tests/mochitest/bugs/test_bug61098.html | 339 |
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> |