diff -r 000000000000 -r 6474c204b198 dom/events/UIEvent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/events/UIEvent.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,193 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_UIEvent_h_ +#define mozilla_dom_UIEvent_h_ + +#include "mozilla/Attributes.h" +#include "mozilla/dom/Event.h" +#include "mozilla/dom/UIEventBinding.h" +#include "nsDeviceContext.h" +#include "nsIDOMUIEvent.h" +#include "nsLayoutUtils.h" +#include "nsPresContext.h" + +class nsINode; + +namespace mozilla { +namespace dom { + +class UIEvent : public Event, + public nsIDOMUIEvent +{ +public: + UIEvent(EventTarget* aOwner, + nsPresContext* aPresContext, + WidgetGUIEvent* aEvent); + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(UIEvent, Event) + + // nsIDOMUIEvent Interface + NS_DECL_NSIDOMUIEVENT + + // Forward to Event + NS_FORWARD_TO_EVENT_NO_SERIALIZATION_NO_DUPLICATION + NS_IMETHOD DuplicatePrivateData() MOZ_OVERRIDE; + NS_IMETHOD_(void) Serialize(IPC::Message* aMsg, bool aSerializeInterfaceType) MOZ_OVERRIDE; + NS_IMETHOD_(bool) Deserialize(const IPC::Message* aMsg, void** aIter) MOZ_OVERRIDE; + + static nsIntPoint CalculateScreenPoint(nsPresContext* aPresContext, + WidgetEvent* aEvent) + { + if (!aEvent || + (aEvent->eventStructType != NS_MOUSE_EVENT && + aEvent->eventStructType != NS_MOUSE_SCROLL_EVENT && + aEvent->eventStructType != NS_WHEEL_EVENT && + aEvent->eventStructType != NS_DRAG_EVENT && + aEvent->eventStructType != NS_POINTER_EVENT && + aEvent->eventStructType != NS_SIMPLE_GESTURE_EVENT)) { + return nsIntPoint(0, 0); + } + + WidgetGUIEvent* event = aEvent->AsGUIEvent(); + if (!event->widget) { + return LayoutDeviceIntPoint::ToUntyped(aEvent->refPoint); + } + + LayoutDeviceIntPoint offset = aEvent->refPoint + + LayoutDeviceIntPoint::FromUntyped(event->widget->WidgetToScreenOffset()); + nscoord factor = + aPresContext->DeviceContext()->UnscaledAppUnitsPerDevPixel(); + return nsIntPoint(nsPresContext::AppUnitsToIntCSSPixels(offset.x * factor), + nsPresContext::AppUnitsToIntCSSPixels(offset.y * factor)); + } + + static CSSIntPoint CalculateClientPoint(nsPresContext* aPresContext, + WidgetEvent* aEvent, + CSSIntPoint* aDefaultClientPoint) + { + if (!aEvent || + (aEvent->eventStructType != NS_MOUSE_EVENT && + aEvent->eventStructType != NS_MOUSE_SCROLL_EVENT && + aEvent->eventStructType != NS_WHEEL_EVENT && + aEvent->eventStructType != NS_DRAG_EVENT && + aEvent->eventStructType != NS_POINTER_EVENT && + aEvent->eventStructType != NS_SIMPLE_GESTURE_EVENT) || + !aPresContext || + !aEvent->AsGUIEvent()->widget) { + return aDefaultClientPoint + ? *aDefaultClientPoint + : CSSIntPoint(0, 0); + } + + nsIPresShell* shell = aPresContext->GetPresShell(); + if (!shell) { + return CSSIntPoint(0, 0); + } + nsIFrame* rootFrame = shell->GetRootFrame(); + if (!rootFrame) { + return CSSIntPoint(0, 0); + } + nsPoint pt = + nsLayoutUtils::GetEventCoordinatesRelativeTo(aEvent, rootFrame); + + return CSSIntPoint::FromAppUnitsRounded(pt); + } + + static already_AddRefed Constructor(const GlobalObject& aGlobal, + const nsAString& aType, + const UIEventInit& aParam, + ErrorResult& aRv); + + virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE + { + return UIEventBinding::Wrap(aCx, this); + } + + nsIDOMWindow* GetView() const + { + return mView; + } + + int32_t Detail() const + { + return mDetail; + } + + int32_t LayerX() const + { + return GetLayerPoint().x; + } + + int32_t LayerY() const + { + return GetLayerPoint().y; + } + + int32_t PageX() const; + int32_t PageY() const; + + virtual uint32_t Which() + { + MOZ_ASSERT(mEvent->eventStructType != NS_KEY_EVENT, + "Key events should override Which()"); + MOZ_ASSERT(mEvent->eventStructType != NS_MOUSE_EVENT, + "Mouse events should override Which()"); + return 0; + } + + already_AddRefed GetRangeParent(); + + int32_t RangeOffset() const; + + bool CancelBubble() const + { + return mEvent->mFlags.mPropagationStopped; + } + + bool IsChar() const; + +protected: + // Internal helper functions + nsIntPoint GetMovementPoint(); + nsIntPoint GetLayerPoint() const; + + nsCOMPtr mView; + int32_t mDetail; + CSSIntPoint mClientPoint; + // Screenpoint is mEvent->refPoint. + nsIntPoint mLayerPoint; + CSSIntPoint mPagePoint; + nsIntPoint mMovementPoint; + bool mIsPointerLocked; + CSSIntPoint mLastClientPoint; + + static Modifiers ComputeModifierState(const nsAString& aModifiersList); + bool GetModifierStateInternal(const nsAString& aKey); +}; + +} // namespace dom +} // namespace mozilla + +#define NS_FORWARD_TO_UIEVENT \ + NS_FORWARD_NSIDOMUIEVENT(UIEvent::) \ + NS_FORWARD_TO_EVENT_NO_SERIALIZATION_NO_DUPLICATION \ + NS_IMETHOD DuplicatePrivateData() \ + { \ + return UIEvent::DuplicatePrivateData(); \ + } \ + NS_IMETHOD_(void) Serialize(IPC::Message* aMsg, \ + bool aSerializeInterfaceType) \ + { \ + UIEvent::Serialize(aMsg, aSerializeInterfaceType); \ + } \ + NS_IMETHOD_(bool) Deserialize(const IPC::Message* aMsg, \ + void** aIter) \ + { \ + return UIEvent::Deserialize(aMsg, aIter); \ + } + +#endif // mozilla_dom_UIEvent_h_