dom/events/WheelEvent.cpp

changeset 0
6474c204b198
     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 +}

mercurial