Bug 1449564 - part 3: Make absolute position editor listen to mouse events at the system event group r?m_kato draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Thu, 05 Apr 2018 00:32:32 +0900
changeset 830011 0aa4ba4f041b207e9c400b0ef18ef13519b11c5b
parent 830010 d21676503e6642937f54219f0e3c5a36682cd426
child 830012 1f8f46f45d60c42b231e0f6731875dc49048e06b
push id118808
push usermasayuki@d-toybox.com
push dateSat, 18 Aug 2018 08:51:19 +0000
reviewersm_kato
bugs1449564
milestone63.0a1
Bug 1449564 - part 3: Make absolute position editor listen to mouse events at the system event group r?m_kato Currently, absolute position editor listens to mouse events at the default event group to handle dragging of positioner. However, this is blocked by a call of Event.stopPropagation() in web apps unexpectedly. Therefore, we should make it listen to the events at the system event group instead. MozReview-Commit-ID: Hoa8c9QvMuG
editor/libeditor/HTMLAbsPositionEditor.cpp
editor/libeditor/tests/test_abs_positioner_positioning_elements.html
--- a/editor/libeditor/HTMLAbsPositionEditor.cpp
+++ b/editor/libeditor/HTMLAbsPositionEditor.cpp
@@ -219,28 +219,31 @@ HTMLEditor::GetZIndex(Element& aElement)
   nsresult errorCode;
   return zIndexStr.ToInteger(&errorCode);
 }
 
 ManualNACPtr
 HTMLEditor::CreateGrabber(nsIContent& aParentContent)
 {
   // let's create a grabber through the element factory
-  ManualNACPtr ret =
+  ManualNACPtr grabber =
     CreateAnonymousElement(nsGkAtoms::span, aParentContent,
                            NS_LITERAL_STRING("mozGrabber"), false);
-  if (NS_WARN_IF(!ret)) {
+  if (NS_WARN_IF(!grabber)) {
     return nullptr;
   }
 
   // add the mouse listener so we can detect a click on a resizer
-  ret->AddEventListener(NS_LITERAL_STRING("mousedown"),
-			mEventListener, false);
-
-  return ret;
+  EventListenerManager* eventListenerManager =
+    grabber->GetOrCreateListenerManager();
+  eventListenerManager->AddEventListenerByType(
+                          mEventListener,
+                          NS_LITERAL_STRING("mousedown"),
+                          TrustedEventsAtSystemGroupBubble());
+  return grabber;
 }
 
 NS_IMETHODIMP
 HTMLEditor::RefreshGrabber()
 {
   NS_ENSURE_TRUE(mAbsolutelyPositionedObject, NS_ERROR_NULL_POINTER);
 
   nsresult rv =
@@ -365,49 +368,52 @@ HTMLEditor::SnapToGrid(int32_t& newX, in
 }
 
 nsresult
 HTMLEditor::GrabberClicked()
 {
   // add a mouse move listener to the editor
   nsresult rv = NS_OK;
   if (!mMouseMotionListenerP) {
+    EventTarget* eventTarget = GetDOMEventTarget();
+    if (NS_WARN_IF(!eventTarget)) {
+      return NS_ERROR_FAILURE;
+    }
     mMouseMotionListenerP = new ResizerMouseMotionListener(*this);
-    if (!mMouseMotionListenerP) {return NS_ERROR_NULL_POINTER;}
-
-    EventTarget* piTarget = GetDOMEventTarget();
-    NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE);
-
-    rv = piTarget->AddEventListener(NS_LITERAL_STRING("mousemove"),
-				    mMouseMotionListenerP,
-				    false, false);
-    NS_ASSERTION(NS_SUCCEEDED(rv),
-                 "failed to register mouse motion listener");
+    EventListenerManager* eventListenerManager =
+      eventTarget->GetOrCreateListenerManager();
+    eventListenerManager->AddEventListenerByType(
+                            mMouseMotionListenerP,
+                            NS_LITERAL_STRING("mousemove"),
+                            TrustedEventsAtSystemGroupBubble());
   }
   mGrabberClicked = true;
   return rv;
 }
 
 nsresult
 HTMLEditor::EndMoving()
 {
   if (mPositioningShadow) {
     nsCOMPtr<nsIPresShell> ps = GetPresShell();
     NS_ENSURE_TRUE(ps, NS_ERROR_NOT_INITIALIZED);
 
     DeleteRefToAnonymousNode(std::move(mPositioningShadow), ps);
 
     mPositioningShadow = nullptr;
   }
-  RefPtr<EventTarget> piTarget = GetDOMEventTarget();
 
-  if (piTarget && mMouseMotionListenerP) {
-    piTarget->RemoveEventListener(NS_LITERAL_STRING("mousemove"),
-				  mMouseMotionListenerP,
-				  false);
+  EventTarget* eventTarget = GetDOMEventTarget();
+  if (eventTarget && mMouseMotionListenerP) {
+    EventListenerManager* eventListenerManager =
+      eventTarget->GetOrCreateListenerManager();
+    eventListenerManager->RemoveEventListenerByType(
+                            mMouseMotionListenerP,
+                            NS_LITERAL_STRING("mousemove"),
+                            TrustedEventsAtSystemGroupBubble());
   }
   mMouseMotionListenerP = nullptr;
 
   mGrabberClicked = false;
   mIsMoving = false;
   RefPtr<Selection> selection = GetSelection();
   if (!selection) {
     return NS_ERROR_NOT_INITIALIZED;
--- a/editor/libeditor/tests/test_abs_positioner_positioning_elements.html
+++ b/editor/libeditor/tests/test_abs_positioner_positioning_elements.html
@@ -23,17 +23,17 @@
 SimpleTest.waitForExplicitFinish();
 SimpleTest.waitForFocus(async function() {
   document.execCommand("enableAbsolutePositionEditing", false, true);
   ok(document.queryCommandState("enableAbsolutePositionEditing"),
      "Absolute positioned element editor should be enabled by the call of execCommand");
 
   let outOfEditor = document.getElementById("clickaway");
 
-  function cancel(e) { /* TODO: e.stopPropagation(); */ }
+  function cancel(e) { e.stopPropagation(); }
   let content = document.getElementById("content");
   content.addEventListener("mousedown", cancel);
   content.addEventListener("mousemove", cancel);
   content.addEventListener("mouseup", cancel);
 
   async function waitForSelectionChange() {
     return new Promise(resolve => {
       document.addEventListener("selectionchange", () => {