Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/events/WheelEvent.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "mozilla/dom/MouseEventBinding.h"
8
#include "mozilla/dom/WheelEvent.h"
9
#include "mozilla/MouseEvents.h"
10
#include "prtime.h"
11
12
namespace mozilla {
13
namespace dom {
14
15
WheelEvent::WheelEvent(EventTarget* aOwner,
16
                       nsPresContext* aPresContext,
17
                       WidgetWheelEvent* aWheelEvent)
18
  : MouseEvent(aOwner, aPresContext,
19
               aWheelEvent ? aWheelEvent :
20
                             new WidgetWheelEvent(false, eVoidEvent, nullptr))
21
  , mAppUnitsPerDevPixel(0)
22
0
{
23
0
  if (aWheelEvent) {
24
0
    mEventIsInternal = false;
25
0
    // If the delta mode is pixel, the WidgetWheelEvent's delta values are in
26
0
    // device pixels.  However, JS contents need the delta values in CSS pixels.
27
0
    // We should store the value of mAppUnitsPerDevPixel here because
28
0
    // it might be changed by changing zoom or something.
29
0
    if (aWheelEvent->mDeltaMode == WheelEvent_Binding::DOM_DELTA_PIXEL) {
30
0
      mAppUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel();
31
0
    }
32
0
  } else {
33
0
    mEventIsInternal = true;
34
0
    mEvent->mTime = PR_Now();
35
0
    mEvent->mRefPoint = LayoutDeviceIntPoint(0, 0);
36
0
    mEvent->AsWheelEvent()->inputSource = MouseEvent_Binding::MOZ_SOURCE_UNKNOWN;
37
0
  }
38
0
}
39
40
void
41
WheelEvent::InitWheelEvent(const nsAString& aType,
42
                           bool aCanBubble,
43
                           bool aCancelable,
44
                           nsGlobalWindowInner* aView,
45
                           int32_t aDetail,
46
                           int32_t aScreenX,
47
                           int32_t aScreenY,
48
                           int32_t aClientX,
49
                           int32_t aClientY,
50
                           uint16_t aButton,
51
                           EventTarget* aRelatedTarget,
52
                           const nsAString& aModifiersList,
53
                           double aDeltaX,
54
                           double aDeltaY,
55
                           double aDeltaZ,
56
                           uint32_t aDeltaMode)
57
0
{
58
0
  NS_ENSURE_TRUE_VOID(!mEvent->mFlags.mIsBeingDispatched);
59
0
60
0
  MouseEvent::InitMouseEvent(aType, aCanBubble, aCancelable, aView, aDetail,
61
0
                             aScreenX, aScreenY, aClientX, aClientY, aButton,
62
0
                             aRelatedTarget, aModifiersList);
63
0
64
0
  WidgetWheelEvent* wheelEvent = mEvent->AsWheelEvent();
65
0
  wheelEvent->mDeltaX = aDeltaX;
66
0
  wheelEvent->mDeltaY = aDeltaY;
67
0
  wheelEvent->mDeltaZ = aDeltaZ;
68
0
  wheelEvent->mDeltaMode = aDeltaMode;
69
0
}
70
71
double
72
WheelEvent::DeltaX()
73
0
{
74
0
  if (!mAppUnitsPerDevPixel) {
75
0
    return mEvent->AsWheelEvent()->mDeltaX;
76
0
  }
77
0
  return mEvent->AsWheelEvent()->mDeltaX *
78
0
    mAppUnitsPerDevPixel / AppUnitsPerCSSPixel();
79
0
}
80
81
double
82
WheelEvent::DeltaY()
83
0
{
84
0
  if (!mAppUnitsPerDevPixel) {
85
0
    return mEvent->AsWheelEvent()->mDeltaY;
86
0
  }
87
0
  return mEvent->AsWheelEvent()->mDeltaY *
88
0
    mAppUnitsPerDevPixel / AppUnitsPerCSSPixel();
89
0
}
90
91
double
92
WheelEvent::DeltaZ()
93
0
{
94
0
  if (!mAppUnitsPerDevPixel) {
95
0
    return mEvent->AsWheelEvent()->mDeltaZ;
96
0
  }
97
0
  return mEvent->AsWheelEvent()->mDeltaZ *
98
0
    mAppUnitsPerDevPixel / AppUnitsPerCSSPixel();
99
0
}
100
101
uint32_t
102
WheelEvent::DeltaMode()
103
0
{
104
0
  return mEvent->AsWheelEvent()->mDeltaMode;
105
0
}
106
107
already_AddRefed<WheelEvent>
108
WheelEvent::Constructor(const GlobalObject& aGlobal,
109
                        const nsAString& aType,
110
                        const WheelEventInit& aParam,
111
                        ErrorResult& aRv)
112
0
{
113
0
  nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
114
0
  RefPtr<WheelEvent> e = new WheelEvent(t, nullptr, nullptr);
115
0
  bool trusted = e->Init(t);
116
0
  e->InitWheelEvent(aType, aParam.mBubbles, aParam.mCancelable,
117
0
                    aParam.mView, aParam.mDetail,
118
0
                    aParam.mScreenX, aParam.mScreenY,
119
0
                    aParam.mClientX, aParam.mClientY,
120
0
                    aParam.mButton, aParam.mRelatedTarget,
121
0
                    EmptyString(), aParam.mDeltaX,
122
0
                    aParam.mDeltaY, aParam.mDeltaZ, aParam.mDeltaMode);
123
0
  e->InitializeExtraMouseEventDictionaryMembers(aParam);
124
0
  e->SetTrusted(trusted);
125
0
  e->SetComposed(aParam.mComposed);
126
0
  return e.forget();
127
0
}
128
129
} // namespace dom
130
} // namespace mozilla
131
132
using namespace mozilla;
133
using namespace mozilla::dom;
134
135
already_AddRefed<WheelEvent>
136
NS_NewDOMWheelEvent(EventTarget* aOwner,
137
                    nsPresContext* aPresContext,
138
                    WidgetWheelEvent* aEvent)
139
0
{
140
0
  RefPtr<WheelEvent> it = new WheelEvent(aOwner, aPresContext, aEvent);
141
0
  return it.forget();
142
0
}