зеркало из https://github.com/mozilla/gecko-dev.git
Bug 830858 - Implement a generic way to dispatch events to chrome only, r=jst
This commit is contained in:
Родитель
ee55ec9122
Коммит
fef0029520
|
@ -3122,3 +3122,18 @@ nsDOMWindowUtils::IsNodeDisabledForEvents(nsIDOMNode* aNode, bool* aRetVal)
|
|||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMWindowUtils::DispatchEventToChromeOnly(nsIDOMEventTarget* aTarget,
|
||||
nsIDOMEvent* aEvent,
|
||||
bool* aRetVal)
|
||||
{
|
||||
*aRetVal = false;
|
||||
if (!nsContentUtils::IsCallerChrome()) {
|
||||
return NS_ERROR_DOM_SECURITY_ERR;
|
||||
}
|
||||
NS_ENSURE_STATE(aTarget && aEvent);
|
||||
aEvent->GetInternalNSEvent()->mFlags.mOnlyChromeDispatch = true;
|
||||
aTarget->DispatchEvent(aEvent, aRetVal);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -39,8 +39,9 @@ interface nsIFile;
|
|||
interface nsIDOMTouch;
|
||||
interface nsIDOMClientRect;
|
||||
interface nsIURI;
|
||||
interface nsIDOMEventTarget;
|
||||
|
||||
[scriptable, uuid(c98249a5-d38a-4ec6-b6e0-6866ea87d6bb)]
|
||||
[scriptable, uuid(7cd26372-d2e2-463a-bce3-3f02d4b23fa8)]
|
||||
interface nsIDOMWindowUtils : nsISupports {
|
||||
|
||||
/**
|
||||
|
@ -720,6 +721,15 @@ interface nsIDOMWindowUtils : nsISupports {
|
|||
in nsIDOMEvent aEvent,
|
||||
in boolean aTrusted);
|
||||
|
||||
/**
|
||||
* Sets nsEvent::mFlags::mOnlyChromeDispatch to true to ensure that
|
||||
* the event is propagated only to chrome.
|
||||
* Event's .target property will be aTarget.
|
||||
* Returns the same value as what EventTarget.dispatchEvent does.
|
||||
*/
|
||||
boolean dispatchEventToChromeOnly(in nsIDOMEventTarget aTarget,
|
||||
in nsIDOMEvent aEvent);
|
||||
|
||||
/**
|
||||
* Returns the real classname (possibly of the mostly-transparent security
|
||||
* wrapper) of aObj.
|
||||
|
|
|
@ -57,6 +57,8 @@ MOCHITEST_CHROME_FILES = \
|
|||
test_sandbox_eventhandler.xul \
|
||||
test_DOM_element_instanceof.xul \
|
||||
file_DOM_element_instanceof.xul \
|
||||
test_bug830858.xul \
|
||||
file_bug830858.xul \
|
||||
$(NULL)
|
||||
|
||||
ifeq (WINNT,$(OS_ARCH))
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=830858
|
||||
-->
|
||||
<window title="Mozilla Bug 830858"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
|
||||
|
||||
<!-- test results are displayed in the html:body -->
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=830858"
|
||||
target="_blank">Mozilla Bug 830858</a>
|
||||
</body>
|
||||
|
||||
<!-- test code goes here -->
|
||||
<script type="application/javascript">
|
||||
<![CDATA[
|
||||
/** Test for Bug 830858 **/
|
||||
|
||||
function runTests() {
|
||||
var b = document.getElementById("b");
|
||||
var win = b.contentWindow;
|
||||
var doc = win.document;
|
||||
var wu = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
|
||||
.getInterface(Components.interfaces.nsIDOMWindowUtils);
|
||||
|
||||
var docListenerCalled = 0;
|
||||
doc.addEventListener("foo", function() { ++docListenerCalled; }, true);
|
||||
var winListenerCalled = 0;
|
||||
win.addEventListener("foo", function() { ++winListenerCalled; }, true);
|
||||
var iframeListenerCalled = 0;
|
||||
b.addEventListener("foo", function() { ++iframeListenerCalled; }, true);
|
||||
|
||||
doc.dispatchEvent(new Event("foo"));
|
||||
opener.wrappedJSObject.is(docListenerCalled, 1, "Normal dispatch to Document");
|
||||
opener.wrappedJSObject.is(winListenerCalled, 1, "Normal dispatch to Document");
|
||||
opener.wrappedJSObject.is(iframeListenerCalled, 1, "Normal dispatch to Document");
|
||||
|
||||
win.dispatchEvent(new Event("foo"));
|
||||
opener.wrappedJSObject.is(docListenerCalled, 1, "Normal dispatch to Window");
|
||||
opener.wrappedJSObject.is(winListenerCalled, 2, "Normal dispatch to Window");
|
||||
opener.wrappedJSObject.is(iframeListenerCalled, 2, "Normal dispatch to Window");
|
||||
|
||||
wu.dispatchEventToChromeOnly(doc, new Event("foo"));
|
||||
opener.wrappedJSObject.is(docListenerCalled, 1, "Chrome-only dispatch to Document");
|
||||
opener.wrappedJSObject.is(winListenerCalled, 2, "Chrome-only dispatch to Document");
|
||||
opener.wrappedJSObject.is(iframeListenerCalled, 3, "Chrome-only dispatch to Document");
|
||||
|
||||
wu.dispatchEventToChromeOnly(win, new Event("foo"));
|
||||
opener.wrappedJSObject.is(docListenerCalled, 1, "Chrome-only dispatch to Window");
|
||||
opener.wrappedJSObject.is(winListenerCalled, 2, "Chrome-only dispatch to Window");
|
||||
opener.wrappedJSObject.is(iframeListenerCalled, 4, "Chrome-only dispatch to Window");
|
||||
|
||||
window.close();
|
||||
opener.wrappedJSObject.finishedTests();
|
||||
}
|
||||
|
||||
SimpleTest.waitForFocus(runTests);
|
||||
]]>
|
||||
</script>
|
||||
<iframe xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
id="b" type="content" src="about:blank"
|
||||
style="width: 300px; height: 550px; border: 1px solid black;"/>
|
||||
</window>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
||||
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=830858
|
||||
-->
|
||||
<window title="Mozilla Bug 830858"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="runTests()">
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
||||
|
||||
<!-- test code goes here -->
|
||||
<script type="application/javascript">
|
||||
<![CDATA[
|
||||
|
||||
/** Test for Bug 830858 **/
|
||||
|
||||
function runTests() {
|
||||
window.open("file_bug830858.xul", "_blank", "chrome,width=600,height=550");
|
||||
}
|
||||
|
||||
function finishedTests() {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
]]>
|
||||
</script>
|
||||
|
||||
<!-- test results are displayed in the html:body -->
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=830858"
|
||||
target="_blank">Mozilla Bug 830858</a>
|
||||
</body>
|
||||
</window>
|
Загрузка…
Ссылка в новой задаче