author | Lebedev Maksim <Alessarik@gmail.com> |
Wed, 09 Jul 2014 01:03:00 -0400 | |
changeset 193390 | ab6ad70d1a3effbf6faaa4e88e31dcdf05117973 |
parent 193389 | 69da62f5cb29b4b4a998a3fd2ef66ad21a9c39fa |
child 193391 | 2f00e114a4894d78cecd54b8e064fd5c057396e3 |
push id | 27117 |
push user | ryanvm@gmail.com |
push date | Thu, 10 Jul 2014 22:23:14 +0000 |
treeherder | mozilla-central@e1a037c085d1 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | smaug |
bugs | 976963 |
milestone | 33.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -683,16 +683,33 @@ GetButtonsFlagForButton(int32_t aButton) case 5: return WidgetMouseEvent::e5thButtonFlag; default: NS_ERROR("Button not known."); return 0; } } +nsView* +nsDOMWindowUtils::GetViewToDispatchEvent(nsPresContext* presContext, nsIPresShell** presShell) +{ + if (presContext && presShell) { + *presShell = presContext->PresShell(); + if (*presShell) { + NS_ADDREF(*presShell); + if (nsViewManager* viewManager = (*presShell)->GetViewManager()) { + if (nsView* view = viewManager->GetRootView()) { + return view; + } + } + } + } + return nullptr; +} + NS_IMETHODIMP nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType, float aX, float aY, int32_t aButton, int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, @@ -751,54 +768,52 @@ nsDOMWindowUtils::SendMouseEventCommon(c if (!presContext) return NS_ERROR_FAILURE; event.refPoint = ToWidgetPoint(CSSPoint(aX, aY), offset, presContext); event.ignoreRootScrollFrame = aIgnoreRootScrollFrame; nsEventStatus status; if (aToWindow) { - nsCOMPtr<nsIPresShell> presShell = presContext->PresShell(); - if (!presShell) + nsCOMPtr<nsIPresShell> presShell; + nsView* view = GetViewToDispatchEvent(presContext, getter_AddRefs(presShell)); + if (!presShell || !view) { return NS_ERROR_FAILURE; - nsViewManager* viewManager = presShell->GetViewManager(); - if (!viewManager) - return NS_ERROR_FAILURE; - nsView* view = viewManager->GetRootView(); - if (!view) - return NS_ERROR_FAILURE; - + } status = nsEventStatus_eIgnore; return presShell->HandleEvent(view->GetFrame(), &event, false, &status); } nsresult rv = widget->DispatchEvent(&event, status); - *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); + if (aPreventDefault) { + *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); + } return rv; } NS_IMETHODIMP -nsDOMWindowUtils::SendPointerEvent(const nsAString& aType, - float aX, - float aY, - int32_t aButton, - int32_t aClickCount, - int32_t aModifiers, - bool aIgnoreRootScrollFrame, - float aPressure, - unsigned short aInputSourceArg, - int32_t aPointerId, - int32_t aWidth, - int32_t aHeight, - int32_t tiltX, - int32_t tiltY, - bool aIsPrimary, - bool aIsSynthesized, - uint8_t aOptionalArgCount, - bool* aPreventDefault) +nsDOMWindowUtils::SendPointerEventCommon(const nsAString& aType, + float aX, + float aY, + int32_t aButton, + int32_t aClickCount, + int32_t aModifiers, + bool aIgnoreRootScrollFrame, + float aPressure, + unsigned short aInputSourceArg, + int32_t aPointerId, + int32_t aWidth, + int32_t aHeight, + int32_t aTiltX, + int32_t aTiltY, + bool aIsPrimary, + bool aIsSynthesized, + uint8_t aOptionalArgCount, + bool aToWindow, + bool* aPreventDefault) { MOZ_RELEASE_ASSERT(nsContentUtils::IsCallerChrome()); // get the widget to send the event to nsPoint offset; nsCOMPtr<nsIWidget> widget = GetWidget(&offset); if (!widget) { return NS_ERROR_FAILURE; @@ -828,39 +843,111 @@ nsDOMWindowUtils::SendPointerEvent(const event.button = aButton; event.buttons = GetButtonsFlagForButton(aButton); event.widget = widget; event.pressure = aPressure; event.inputSource = aInputSourceArg; event.pointerId = aPointerId; event.width = aWidth; event.height = aHeight; - event.tiltX = tiltX; - event.tiltY = tiltY; + event.tiltX = aTiltX; + event.tiltY = aTiltY; event.isPrimary = aIsPrimary; event.clickCount = aClickCount; event.time = PR_IntervalNow(); event.mFlags.mIsSynthesizedForTests = aOptionalArgCount >= 10 ? aIsSynthesized : true; nsPresContext* presContext = GetPresContext(); if (!presContext) { return NS_ERROR_FAILURE; } event.refPoint = ToWidgetPoint(CSSPoint(aX, aY), offset, presContext); event.ignoreRootScrollFrame = aIgnoreRootScrollFrame; nsEventStatus status; + if (aToWindow) { + nsCOMPtr<nsIPresShell> presShell; + nsView* view = GetViewToDispatchEvent(presContext, getter_AddRefs(presShell)); + if (!presShell || !view) { + return NS_ERROR_FAILURE; + } + status = nsEventStatus_eIgnore; + return presShell->HandleEvent(view->GetFrame(), &event, false, &status); + } nsresult rv = widget->DispatchEvent(&event, status); - *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); + if (aPreventDefault) { + *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); + } return rv; } NS_IMETHODIMP +nsDOMWindowUtils::SendPointerEvent(const nsAString& aType, + float aX, + float aY, + int32_t aButton, + int32_t aClickCount, + int32_t aModifiers, + bool aIgnoreRootScrollFrame, + float aPressure, + unsigned short aInputSourceArg, + int32_t aPointerId, + int32_t aWidth, + int32_t aHeight, + int32_t aTiltX, + int32_t aTiltY, + bool aIsPrimary, + bool aIsSynthesized, + uint8_t aOptionalArgCount, + bool* aPreventDefault) +{ + PROFILER_LABEL("nsDOMWindowUtils", "SendPointerEvent", + js::ProfileEntry::Category::EVENTS); + + return SendPointerEventCommon(aType, aX, aY, aButton, aClickCount, + aModifiers, aIgnoreRootScrollFrame, + aPressure, aInputSourceArg, aPointerId, + aWidth, aHeight, aTiltX, aTiltY, + aIsPrimary, aIsSynthesized, + aOptionalArgCount, false, aPreventDefault); +} + +NS_IMETHODIMP +nsDOMWindowUtils::SendPointerEventToWindow(const nsAString& aType, + float aX, + float aY, + int32_t aButton, + int32_t aClickCount, + int32_t aModifiers, + bool aIgnoreRootScrollFrame, + float aPressure, + unsigned short aInputSourceArg, + int32_t aPointerId, + int32_t aWidth, + int32_t aHeight, + int32_t aTiltX, + int32_t aTiltY, + bool aIsPrimary, + bool aIsSynthesized, + uint8_t aOptionalArgCount) +{ + PROFILER_LABEL("nsDOMWindowUtils", "SendPointerEventToWindow", + js::ProfileEntry::Category::EVENTS); + + return SendPointerEventCommon(aType, aX, aY, aButton, aClickCount, + aModifiers, aIgnoreRootScrollFrame, + aPressure, aInputSourceArg, aPointerId, + aWidth, aHeight, aTiltX, aTiltY, + aIsPrimary, aIsSynthesized, + aOptionalArgCount, true, nullptr); +} + +NS_IMETHODIMP nsDOMWindowUtils::SendWheelEvent(float aX, float aY, double aDeltaX, double aDeltaY, double aDeltaZ, uint32_t aDeltaMode, int32_t aModifiers, int32_t aLineOrPageDeltaX, @@ -1037,31 +1124,21 @@ nsDOMWindowUtils::SendTouchEventCommon(c nsIntPoint(aRxs[i], aRys[i]), aRotationAngles[i], aForces[i]); event.touches.AppendElement(t); } nsEventStatus status; if (aToWindow) { - nsCOMPtr<nsIPresShell> presShell = presContext->PresShell(); - if (!presShell) { + nsCOMPtr<nsIPresShell> presShell; + nsView* view = GetViewToDispatchEvent(presContext, getter_AddRefs(presShell)); + if (!presShell || !view) { return NS_ERROR_FAILURE; } - - nsViewManager* viewManager = presShell->GetViewManager(); - if (!viewManager) { - return NS_ERROR_FAILURE; - } - - nsView* view = viewManager->GetRootView(); - if (!view) { - return NS_ERROR_FAILURE; - } - status = nsEventStatus_eIgnore; *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); return presShell->HandleEvent(view->GetFrame(), &event, false, &status); } nsresult rv = widget->DispatchEvent(&event, status); *aPreventDefault = (status == nsEventStatus_eConsumeNoDefault); return rv;
--- a/dom/base/nsDOMWindowUtils.h +++ b/dom/base/nsDOMWindowUtils.h @@ -12,16 +12,17 @@ #include "mozilla/Attributes.h" #include "mozilla/BasicEvents.h" class nsGlobalWindow; class nsIPresShell; class nsIWidget; class nsPresContext; class nsIDocument; +class nsView; struct nsPoint; namespace mozilla { namespace layers { class LayerTransactionChild; } } @@ -73,40 +74,61 @@ protected: nsIWidget* GetWidget(nsPoint* aOffset = nullptr); nsIWidget* GetWidgetForElement(nsIDOMElement* aElement); nsIPresShell* GetPresShell(); nsPresContext* GetPresContext(); nsIDocument* GetDocument(); mozilla::layers::LayerTransactionChild* GetLayerTransaction(); + nsView* GetViewToDispatchEvent(nsPresContext* presContext, nsIPresShell** presShell); + NS_IMETHOD SendMouseEventCommon(const nsAString& aType, float aX, float aY, int32_t aButton, int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, float aPressure, unsigned short aInputSourceArg, bool aToWindow, bool *aPreventDefault, bool aIsSynthesized); + NS_IMETHOD SendPointerEventCommon(const nsAString& aType, + float aX, + float aY, + int32_t aButton, + int32_t aClickCount, + int32_t aModifiers, + bool aIgnoreRootScrollFrame, + float aPressure, + unsigned short aInputSourceArg, + int32_t aPointerId, + int32_t aWidth, + int32_t aHeight, + int32_t aTiltX, + int32_t aTiltY, + bool aIsPrimary, + bool aIsSynthesized, + uint8_t aOptionalArgCount, + bool aToWindow, + bool* aPreventDefault); + NS_IMETHOD SendTouchEventCommon(const nsAString& aType, uint32_t* aIdentifiers, int32_t* aXs, int32_t* aYs, uint32_t* aRxs, uint32_t* aRys, float* aRotationAngles, float* aForces, uint32_t aCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, bool aToWindow, bool* aPreventDefault); - static mozilla::Modifiers GetWidgetModifiers(int32_t aModifiers); }; #endif
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -46,17 +46,17 @@ interface nsIDOMClientRect; interface nsIURI; interface nsIDOMEventTarget; interface nsIRunnable; interface nsICompositionStringSynthesizer; interface nsITranslationNodeList; interface nsIJSRAIIHelper; interface nsIContentPermissionRequest; -[scriptable, uuid(0ef9e8bb-b934-4f6b-ae05-e98774d8d3d3)] +[scriptable, uuid(11911980-607c-4efd-aacc-de3b9005c058)] interface nsIDOMWindowUtils : nsISupports { /** * Image animation mode of the window. When this attribute's value * is changed, the implementation should set all images in the window * to the given value. That is, when set to kDontAnimMode, all images * will stop animating. The attribute's value must be one of the * animationMode values from imgIContainer. @@ -366,18 +366,18 @@ interface nsIDOMWindowUtils : nsISupport in long aClickCount, in long aModifiers, [optional] in boolean aIgnoreRootScrollFrame, [optional] in float aPressure, [optional] in unsigned short aInputSourceArg, [optional] in long aPointerId, [optional] in long aWidth, [optional] in long aHeight, - [optional] in long tiltX, - [optional] in long tiltY, + [optional] in long aTiltX, + [optional] in long aTiltY, [optional] in boolean aIsPrimary, [optional] in boolean aIsSynthesized); /** Synthesize a touch event. The event types supported are: * touchstart, touchend, touchmove, and touchcancel * * Events are sent in coordinates offset by aX and aY from the window. * @@ -424,16 +424,37 @@ interface nsIDOMWindowUtils : nsISupport in long aButton, in long aClickCount, in long aModifiers, [optional] in boolean aIgnoreRootScrollFrame, [optional] in float aPressure, [optional] in unsigned short aInputSourceArg, [optional] in boolean aIsSynthesized); + /** The same as sendPointerEvent but ensures that the event + * is dispatched to this DOM window or one of its children. + */ + [optional_argc] + void sendPointerEventToWindow(in AString aType, + in float aX, + in float aY, + in long aButton, + in long aClickCount, + in long aModifiers, + [optional] in boolean aIgnoreRootScrollFrame, + [optional] in float aPressure, + [optional] in unsigned short aInputSourceArg, + [optional] in long aPointerId, + [optional] in long aWidth, + [optional] in long aHeight, + [optional] in long aTiltX, + [optional] in long aTiltY, + [optional] in boolean aIsPrimary, + [optional] in boolean aIsSynthesized); + /** The same as sendTouchEvent but ensures that the event is dispatched to * this DOM window or one of its children. */ boolean sendTouchEventToWindow(in AString aType, [array, size_is(count)] in uint32_t aIdentifiers, [array, size_is(count)] in int32_t aXs, [array, size_is(count)] in int32_t aYs, [array, size_is(count)] in uint32_t aRxs,
--- a/testing/mochitest/tests/SimpleTest/EventUtils.js +++ b/testing/mochitest/tests/SimpleTest/EventUtils.js @@ -302,24 +302,24 @@ function synthesizePointerAtPoint(left, var button = aEvent.button || 0; var clickCount = aEvent.clickCount || 1; var modifiers = _parseModifiers(aEvent); var pressure = ("pressure" in aEvent) ? aEvent.pressure : 0; var inputSource = ("inputSource" in aEvent) ? aEvent.inputSource : 0; var synthesized = ("isSynthesized" in aEvent) ? aEvent.isSynthesized : true; if (("type" in aEvent) && aEvent.type) { - defaultPrevented = utils.sendPointerEvent(aEvent.type, left, top, button, - clickCount, modifiers, false, - pressure, inputSource, - synthesized); + defaultPrevented = utils.sendPointerEventToWindow(aEvent.type, left, top, button, + clickCount, modifiers, false, + pressure, inputSource, + synthesized); } else { - utils.sendPointerEvent("pointerdown", left, top, button, clickCount, modifiers, false, pressure, inputSource); - utils.sendPointerEvent("pointerup", left, top, button, clickCount, modifiers, false, pressure, inputSource); + utils.sendPointerEventToWindow("pointerdown", left, top, button, clickCount, modifiers, false, pressure, inputSource); + utils.sendPointerEventToWindow("pointerup", left, top, button, clickCount, modifiers, false, pressure, inputSource); } } return defaultPrevented; } // Call synthesizeMouse with coordinates at the center of aTarget. function synthesizeMouseAtCenter(aTarget, aEvent, aWindow)