1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/events/WheelEvent.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,219 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "mozilla/dom/WheelEvent.h" 1.11 +#include "mozilla/MouseEvents.h" 1.12 +#include "prtime.h" 1.13 + 1.14 +namespace mozilla { 1.15 +namespace dom { 1.16 + 1.17 +WheelEvent::WheelEvent(EventTarget* aOwner, 1.18 + nsPresContext* aPresContext, 1.19 + WidgetWheelEvent* aWheelEvent) 1.20 + : MouseEvent(aOwner, aPresContext, 1.21 + aWheelEvent ? aWheelEvent : 1.22 + new WidgetWheelEvent(false, 0, nullptr)) 1.23 + , mAppUnitsPerDevPixel(0) 1.24 +{ 1.25 + if (aWheelEvent) { 1.26 + mEventIsInternal = false; 1.27 + // If the delta mode is pixel, the WidgetWheelEvent's delta values are in 1.28 + // device pixels. However, JS contents need the delta values in CSS pixels. 1.29 + // We should store the value of mAppUnitsPerDevPixel here because 1.30 + // it might be changed by changing zoom or something. 1.31 + if (aWheelEvent->deltaMode == nsIDOMWheelEvent::DOM_DELTA_PIXEL) { 1.32 + mAppUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel(); 1.33 + } 1.34 + } else { 1.35 + mEventIsInternal = true; 1.36 + mEvent->time = PR_Now(); 1.37 + mEvent->refPoint.x = mEvent->refPoint.y = 0; 1.38 + mEvent->AsWheelEvent()->inputSource = nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN; 1.39 + } 1.40 +} 1.41 + 1.42 +NS_IMPL_ADDREF_INHERITED(WheelEvent, MouseEvent) 1.43 +NS_IMPL_RELEASE_INHERITED(WheelEvent, MouseEvent) 1.44 + 1.45 +NS_INTERFACE_MAP_BEGIN(WheelEvent) 1.46 + NS_INTERFACE_MAP_ENTRY(nsIDOMWheelEvent) 1.47 +NS_INTERFACE_MAP_END_INHERITING(MouseEvent) 1.48 + 1.49 +NS_IMETHODIMP 1.50 +WheelEvent::InitWheelEvent(const nsAString& aType, 1.51 + bool aCanBubble, 1.52 + bool aCancelable, 1.53 + nsIDOMWindow* aView, 1.54 + int32_t aDetail, 1.55 + int32_t aScreenX, 1.56 + int32_t aScreenY, 1.57 + int32_t aClientX, 1.58 + int32_t aClientY, 1.59 + uint16_t aButton, 1.60 + nsIDOMEventTarget* aRelatedTarget, 1.61 + const nsAString& aModifiersList, 1.62 + double aDeltaX, 1.63 + double aDeltaY, 1.64 + double aDeltaZ, 1.65 + uint32_t aDeltaMode) 1.66 +{ 1.67 + nsresult rv = 1.68 + MouseEvent::InitMouseEvent(aType, aCanBubble, aCancelable, aView, aDetail, 1.69 + aScreenX, aScreenY, aClientX, aClientY, aButton, 1.70 + aRelatedTarget, aModifiersList); 1.71 + NS_ENSURE_SUCCESS(rv, rv); 1.72 + 1.73 + WidgetWheelEvent* wheelEvent = mEvent->AsWheelEvent(); 1.74 + wheelEvent->deltaX = aDeltaX; 1.75 + wheelEvent->deltaY = aDeltaY; 1.76 + wheelEvent->deltaZ = aDeltaZ; 1.77 + wheelEvent->deltaMode = aDeltaMode; 1.78 + 1.79 + return NS_OK; 1.80 +} 1.81 + 1.82 +double 1.83 +WheelEvent::DeltaX() 1.84 +{ 1.85 + if (!mAppUnitsPerDevPixel) { 1.86 + return mEvent->AsWheelEvent()->deltaX; 1.87 + } 1.88 + return mEvent->AsWheelEvent()->deltaX * 1.89 + mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel(); 1.90 +} 1.91 + 1.92 +NS_IMETHODIMP 1.93 +WheelEvent::GetDeltaX(double* aDeltaX) 1.94 +{ 1.95 + NS_ENSURE_ARG_POINTER(aDeltaX); 1.96 + 1.97 + *aDeltaX = DeltaX(); 1.98 + return NS_OK; 1.99 +} 1.100 + 1.101 +double 1.102 +WheelEvent::DeltaY() 1.103 +{ 1.104 + if (!mAppUnitsPerDevPixel) { 1.105 + return mEvent->AsWheelEvent()->deltaY; 1.106 + } 1.107 + return mEvent->AsWheelEvent()->deltaY * 1.108 + mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel(); 1.109 +} 1.110 + 1.111 +NS_IMETHODIMP 1.112 +WheelEvent::GetDeltaY(double* aDeltaY) 1.113 +{ 1.114 + NS_ENSURE_ARG_POINTER(aDeltaY); 1.115 + 1.116 + *aDeltaY = DeltaY(); 1.117 + return NS_OK; 1.118 +} 1.119 + 1.120 +double 1.121 +WheelEvent::DeltaZ() 1.122 +{ 1.123 + if (!mAppUnitsPerDevPixel) { 1.124 + return mEvent->AsWheelEvent()->deltaZ; 1.125 + } 1.126 + return mEvent->AsWheelEvent()->deltaZ * 1.127 + mAppUnitsPerDevPixel / nsPresContext::AppUnitsPerCSSPixel(); 1.128 +} 1.129 + 1.130 +NS_IMETHODIMP 1.131 +WheelEvent::GetDeltaZ(double* aDeltaZ) 1.132 +{ 1.133 + NS_ENSURE_ARG_POINTER(aDeltaZ); 1.134 + 1.135 + *aDeltaZ = DeltaZ(); 1.136 + return NS_OK; 1.137 +} 1.138 + 1.139 +uint32_t 1.140 +WheelEvent::DeltaMode() 1.141 +{ 1.142 + return mEvent->AsWheelEvent()->deltaMode; 1.143 +} 1.144 + 1.145 +NS_IMETHODIMP 1.146 +WheelEvent::GetDeltaMode(uint32_t* aDeltaMode) 1.147 +{ 1.148 + NS_ENSURE_ARG_POINTER(aDeltaMode); 1.149 + 1.150 + *aDeltaMode = DeltaMode(); 1.151 + return NS_OK; 1.152 +} 1.153 + 1.154 +static void 1.155 +GetModifierList(bool aCtrl, bool aShift, bool aAlt, bool aMeta, 1.156 + nsAString& aModifierList) 1.157 +{ 1.158 + if (aCtrl) { 1.159 + aModifierList.AppendLiteral(NS_DOM_KEYNAME_CONTROL); 1.160 + } 1.161 + if (aShift) { 1.162 + if (!aModifierList.IsEmpty()) { 1.163 + aModifierList.AppendLiteral(" "); 1.164 + } 1.165 + aModifierList.AppendLiteral(NS_DOM_KEYNAME_SHIFT); 1.166 + } 1.167 + if (aAlt) { 1.168 + if (!aModifierList.IsEmpty()) { 1.169 + aModifierList.AppendLiteral(" "); 1.170 + } 1.171 + aModifierList.AppendLiteral(NS_DOM_KEYNAME_ALT); 1.172 + } 1.173 + if (aMeta) { 1.174 + if (!aModifierList.IsEmpty()) { 1.175 + aModifierList.AppendLiteral(" "); 1.176 + } 1.177 + aModifierList.AppendLiteral(NS_DOM_KEYNAME_META); 1.178 + } 1.179 +} 1.180 + 1.181 +already_AddRefed<WheelEvent> 1.182 +WheelEvent::Constructor(const GlobalObject& aGlobal, 1.183 + const nsAString& aType, 1.184 + const WheelEventInit& aParam, 1.185 + ErrorResult& aRv) 1.186 +{ 1.187 + nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports()); 1.188 + nsRefPtr<WheelEvent> e = new WheelEvent(t, nullptr, nullptr); 1.189 + bool trusted = e->Init(t); 1.190 + nsAutoString modifierList; 1.191 + GetModifierList(aParam.mCtrlKey, aParam.mShiftKey, 1.192 + aParam.mAltKey, aParam.mMetaKey, 1.193 + modifierList); 1.194 + aRv = e->InitWheelEvent(aType, aParam.mBubbles, aParam.mCancelable, 1.195 + aParam.mView, aParam.mDetail, 1.196 + aParam.mScreenX, aParam.mScreenY, 1.197 + aParam.mClientX, aParam.mClientY, 1.198 + aParam.mButton, aParam.mRelatedTarget, 1.199 + modifierList, aParam.mDeltaX, 1.200 + aParam.mDeltaY, aParam.mDeltaZ, aParam.mDeltaMode); 1.201 + e->mEvent->AsWheelEvent()->buttons = aParam.mButtons; 1.202 + e->SetTrusted(trusted); 1.203 + return e.forget(); 1.204 +} 1.205 + 1.206 +} // namespace dom 1.207 +} // namespace mozilla 1.208 + 1.209 +using namespace mozilla; 1.210 +using namespace mozilla::dom; 1.211 + 1.212 +nsresult 1.213 +NS_NewDOMWheelEvent(nsIDOMEvent** aInstancePtrResult, 1.214 + EventTarget* aOwner, 1.215 + nsPresContext* aPresContext, 1.216 + WidgetWheelEvent* aEvent) 1.217 +{ 1.218 + WheelEvent* it = new WheelEvent(aOwner, aPresContext, aEvent); 1.219 + NS_ADDREF(it); 1.220 + *aInstancePtrResult = static_cast<Event*>(it); 1.221 + return NS_OK; 1.222 +}