michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: * michael@0: * Portions Copyright 2013 Microsoft Open Technologies, Inc. */ michael@0: michael@0: #include "mozilla/dom/PointerEvent.h" michael@0: #include "mozilla/MouseEvents.h" michael@0: #include "prtime.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: PointerEvent::PointerEvent(EventTarget* aOwner, michael@0: nsPresContext* aPresContext, michael@0: WidgetPointerEvent* aEvent) michael@0: : MouseEvent(aOwner, aPresContext, michael@0: aEvent ? aEvent : new WidgetPointerEvent(false, 0, nullptr)) michael@0: { michael@0: NS_ASSERTION(mEvent->eventStructType == NS_POINTER_EVENT, michael@0: "event type mismatch NS_POINTER_EVENT"); michael@0: michael@0: WidgetMouseEvent* mouseEvent = mEvent->AsMouseEvent(); michael@0: if (aEvent) { michael@0: mEventIsInternal = false; michael@0: } else { michael@0: mEventIsInternal = true; michael@0: mEvent->time = PR_Now(); michael@0: mEvent->refPoint.x = mEvent->refPoint.y = 0; michael@0: mouseEvent->inputSource = nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN; michael@0: } michael@0: } michael@0: michael@0: static uint16_t michael@0: ConvertStringToPointerType(const nsAString& aPointerTypeArg) michael@0: { michael@0: if (aPointerTypeArg.EqualsLiteral("mouse")) { michael@0: return nsIDOMMouseEvent::MOZ_SOURCE_MOUSE; michael@0: } michael@0: if (aPointerTypeArg.EqualsLiteral("pen")) { michael@0: return nsIDOMMouseEvent::MOZ_SOURCE_PEN; michael@0: } michael@0: if (aPointerTypeArg.EqualsLiteral("touch")) { michael@0: return nsIDOMMouseEvent::MOZ_SOURCE_TOUCH; michael@0: } michael@0: michael@0: return nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN; michael@0: } michael@0: michael@0: // static michael@0: already_AddRefed michael@0: PointerEvent::Constructor(EventTarget* aOwner, michael@0: const nsAString& aType, michael@0: const PointerEventInit& aParam) michael@0: { michael@0: nsRefPtr e = new PointerEvent(aOwner, nullptr, nullptr); michael@0: bool trusted = e->Init(aOwner); michael@0: michael@0: e->InitMouseEvent(aType, aParam.mBubbles, aParam.mCancelable, michael@0: aParam.mView, aParam.mDetail, aParam.mScreenX, michael@0: aParam.mScreenY, aParam.mClientX, aParam.mClientY, michael@0: aParam.mCtrlKey, aParam.mAltKey, aParam.mShiftKey, michael@0: aParam.mMetaKey, aParam.mButton, michael@0: aParam.mRelatedTarget); michael@0: michael@0: WidgetPointerEvent* widgetEvent = e->mEvent->AsPointerEvent(); michael@0: widgetEvent->pointerId = aParam.mPointerId; michael@0: widgetEvent->width = aParam.mWidth; michael@0: widgetEvent->height = aParam.mHeight; michael@0: widgetEvent->pressure = aParam.mPressure; michael@0: widgetEvent->tiltX = aParam.mTiltX; michael@0: widgetEvent->tiltY = aParam.mTiltY; michael@0: widgetEvent->inputSource = ConvertStringToPointerType(aParam.mPointerType); michael@0: widgetEvent->isPrimary = aParam.mIsPrimary; michael@0: widgetEvent->buttons = aParam.mButtons; michael@0: michael@0: e->SetTrusted(trusted); michael@0: return e.forget(); michael@0: } michael@0: michael@0: // static michael@0: already_AddRefed michael@0: PointerEvent::Constructor(const GlobalObject& aGlobal, michael@0: const nsAString& aType, michael@0: const PointerEventInit& aParam, michael@0: ErrorResult& aRv) michael@0: { michael@0: nsCOMPtr owner = do_QueryInterface(aGlobal.GetAsSupports()); michael@0: return Constructor(owner, aType, aParam); michael@0: } michael@0: michael@0: void michael@0: PointerEvent::GetPointerType(nsAString& aPointerType) michael@0: { michael@0: switch (mEvent->AsPointerEvent()->inputSource) { michael@0: case nsIDOMMouseEvent::MOZ_SOURCE_MOUSE: michael@0: aPointerType.AssignLiteral("mouse"); michael@0: break; michael@0: case nsIDOMMouseEvent::MOZ_SOURCE_PEN: michael@0: aPointerType.AssignLiteral("pen"); michael@0: break; michael@0: case nsIDOMMouseEvent::MOZ_SOURCE_TOUCH: michael@0: aPointerType.AssignLiteral("touch"); michael@0: break; michael@0: case nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN: michael@0: aPointerType.AssignLiteral(""); michael@0: break; michael@0: } michael@0: } michael@0: michael@0: int32_t michael@0: PointerEvent::PointerId() michael@0: { michael@0: return mEvent->AsPointerEvent()->pointerId; michael@0: } michael@0: michael@0: int32_t michael@0: PointerEvent::Width() michael@0: { michael@0: return mEvent->AsPointerEvent()->width; michael@0: } michael@0: michael@0: int32_t michael@0: PointerEvent::Height() michael@0: { michael@0: return mEvent->AsPointerEvent()->height; michael@0: } michael@0: michael@0: float michael@0: PointerEvent::Pressure() michael@0: { michael@0: return mEvent->AsPointerEvent()->pressure; michael@0: } michael@0: michael@0: int32_t michael@0: PointerEvent::TiltX() michael@0: { michael@0: return mEvent->AsPointerEvent()->tiltX; michael@0: } michael@0: michael@0: int32_t michael@0: PointerEvent::TiltY() michael@0: { michael@0: return mEvent->AsPointerEvent()->tiltY; michael@0: } michael@0: michael@0: bool michael@0: PointerEvent::IsPrimary() michael@0: { michael@0: return mEvent->AsPointerEvent()->isPrimary; michael@0: } michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::dom; michael@0: michael@0: nsresult michael@0: NS_NewDOMPointerEvent(nsIDOMEvent** aInstancePtrResult, michael@0: EventTarget* aOwner, michael@0: nsPresContext* aPresContext, michael@0: WidgetPointerEvent *aEvent) michael@0: { michael@0: PointerEvent *it = new PointerEvent(aOwner, aPresContext, aEvent); michael@0: NS_ADDREF(it); michael@0: *aInstancePtrResult = static_cast(it); michael@0: return NS_OK; michael@0: }