Bug 1290965 - Prevent command from firing when click has prevented default on the XUL element. draft
authorJonathan Kingston <jkt@mozilla.com>
Tue, 09 Aug 2016 14:51:47 +0100
changeset 400638 b94ff2c6eb4229ffae0834267bbf763f27f7f4f1
parent 398252 720b5d2c84d5b253d4dfde4897e13384dc97a46a
child 528273 8cb96025628686c6fba51f78bf1098c051e33b88
push id26224
push userjkingston@mozilla.com
push dateMon, 15 Aug 2016 09:36:31 +0000
bugs1290965
milestone51.0a1
Bug 1290965 - Prevent command from firing when click has prevented default on the XUL element. MozReview-Commit-ID: 5lMw3hFCe3e
dom/xul/nsXULElement.cpp
dom/xul/test/chrome.ini
dom/xul/test/test_bug1290965.xul
--- a/dom/xul/nsXULElement.cpp
+++ b/dom/xul/nsXULElement.cpp
@@ -1775,16 +1775,22 @@ nsXULElement::ClickWithInputSource(uint1
             status = nsEventStatus_eIgnore;  // reset status
             EventDispatcher::Dispatch(static_cast<nsIContent*>(this),
                                       context, &eventUp, nullptr, &status);
 
             // send mouse click
             status = nsEventStatus_eIgnore;  // reset status
             EventDispatcher::Dispatch(static_cast<nsIContent*>(this),
                                       context, &eventClick, nullptr, &status);
+
+            // If the click has been prevented, lets skip the command call
+            // this is how a physical click works
+            if (status == nsEventStatus_eConsumeNoDefault) {
+                return NS_OK;
+            }
         }
     }
 
     // oncommand is fired when an element is clicked...
     return DoCommand();
 }
 
 NS_IMETHODIMP
--- a/dom/xul/test/chrome.ini
+++ b/dom/xul/test/chrome.ini
@@ -33,8 +33,9 @@ support-files =
 [test_bug1061864_1.xul]
 [test_bug1061864_2.xul]
 [test_bug1070049_throw_from_script.xul]
 [test_import_xul_to_content.xul]
 [test_bug1271240.xul]
 skip-if = os == "android"
 [test_bug1069772.xul]
 skip-if = os == "android"
+[test_bug1290965.xul]
new file mode 100644
--- /dev/null
+++ b/dom/xul/test/test_bug1290965.xul
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:h="http://www.w3.org/1999/xhtml">
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
+  <toolbarbutton oncommand="++countera;" id="a">A</toolbarbutton>
+  <toolbarbutton oncommand="++counterb;" id="b">B</toolbarbutton>
+  <script type="text/javascript">
+  <![CDATA[
+    let aEl = document.getElementById('a');
+    let bEl = document.getElementById('b');
+    let countera = 0;
+    let counterb = 0;
+
+    aEl.addEventListener('click', function (aEvent) {
+      aEvent.preventDefault();
+      let cmdEvent = document.createEvent("xulcommandevent");
+      cmdEvent.initCommandEvent("command", true, true, window, 0,
+                                aEvent.ctrlKey, aEvent.altKey, aEvent.shiftKey,
+                                aEvent.metaKey, null);
+      aEvent.currentTarget.dispatchEvent(cmdEvent);
+    });
+
+    bEl.addEventListener('click', function (aEvent) {
+      let cmdEvent = document.createEvent("xulcommandevent");
+      cmdEvent.initCommandEvent("command", true, true, window, 0,
+                                aEvent.ctrlKey, aEvent.altKey, aEvent.shiftKey,
+                                aEvent.metaKey, null);
+      aEvent.currentTarget.dispatchEvent(cmdEvent);
+    });
+
+    bEl.click();
+    aEl.click();
+
+    is(countera, 1, "Counter should be one as event fires once");
+    is(counterb, 2, "Counter should be two as event fires twice");
+  ]]>
+  </script>
+</window>