mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
e9ba40cf6b
- Bug 1178833 - Fix for unified builds when a new file is added to layout/base. r=mstange (bf961c00fd) - Bug 1178847 - Add a MobileViewportManager to manage setting the CSS viewport on B2G. r=botond,tn (937ba486fa) - Bug 1178847 - Don't use the MobileViewportManager code on Mulet or Fennec yet. r=botond (3061b2c617) - Bug 1168950. Add the document to DoProcessRestyles profile label. r=dbaron (2347b76411) - Bug 1187792 - Don't set the SPCSPS unless meta-viewport or zooming is enabled. r=botond (a8f5ed1006) - Bug 1193062 - Don't double-send target APZC confirmations that might race each other. r=kats (de48467401) - Bug 1186004 - Add a pref to enable/disable APZ zooming behaviour. r=botond (fc3653c979) - Bug 1193062 - Add a PAN_MOMENTUM state. r=kats (10c8bb1a5e) - Bug 1148350 - Have ConvertToGecko use a live screen-to-apzc transform to avoid transform mismatches. r=botond (9eee9ea6f2) - Bug 1169844 - Remove incorrect assertion and properly untransform wheel events for overscroll situations. r=botond (9b101b53bb) - Bug 1169690 - Accelerate flings correctly in the presence of overscroll handoff. r=kats (49d55c05f4) - Bug 1158424 - Extract a BreadthFirstSearch() helper function. r=kats (6a49498185) - Bug 1158424 - Add APZCTreeManager::FindRootContentApzcForLayersId(). r=kats (d6c7ecf781) - Bug 1158424 - Fix APZCTreeManager::GetMultitouchTarget(). r=kats (bf8571a4ca) - Bug 1174205 - Make sure to acquire the tree lock before finding the multitouch target. r=botond (bdbd98f2c7) - Bug 1211660 - Remove dead obj argument from two functions. r=Waldo. (efba5a2f8d) - Bug 1158424 - Undeprecate HasNoParentWithSameLayersId(). r=kats (d994ea28f8) - Fix AsyncCompositionManager not comparing layer tree IDs when finding scrollbar targets. (bug 1151169, r=kats) (c7dbc4776a) - Bug 1163259. Make sure we don't look at the parent ref layer when looking for a layer with the frame metrics for a scrollbar. r=kats (8b99d2c830) - Bug 1164340. Convert the scrollbar thumb ratio to a unitless ratio properly for non-zoomable scrollframes. r=botond (27f56cab56) - Bug 1164340. Fix up some scrollbar related comments in AsyncCompositionManager. r=botond (b9d540bea9) - Bug 1164767. Modify async scrollbar positioning code to deal with containerless root scrollables. r=botond (501d07592e) - Bug 1158424 - Remove FrameMetrics::IsRootScrollable() (it just duplicated IsRootContent()). r=kats (672fd034b3) - Bug 1120683 - Properly handle unapplying 3D projective transforms throughout APZ code. r=botond (a46612811a) - Bug 1148868 - Make APZ wheel handling handle pixel scrolling on OS X. r=dvander, r=kats (da3bd34135) - Bug 1193062 - Add fields to PanGestureInput and ScrollWheelInput. r=kats (716ba34e18) - Bug 1189565 - Send resize events when backing scale factor changes. r=mstange (4e81a7bbf7) - Bug 1193062 - Add nsCocoaUtils::ModifiersForEvent. r=smichaud (da67b22ff7) - Bug 1016035 - Remove the ability to swipe vertically. r=kats (fa315e0b97) - Bug 1016035 - Refactor the code that decides whether we want to start a swipe. r=kats (3091961328) - Bug 1016035 - Make the threshold in AxisPhysicsMSDModel::IsFinished controllable by the caller. r=kip (76df4d85a2) - Bug 1016035 - More swipe refactoring. r=kats (2abcd05b33) - Bug 1016035 - Implement the swipe animation ourselves instead of calling the NSEvent trackSwipe API. r=kats (4842b2a728) - Bug 1016035 - Move swipe tracking code into DispatchAPZWheelInputEvent. r=kats (bb1052b87c) - Bug 1016035 - Also mark widgetWheelEvents that are handled by APZ with mCanStartSwipe. r=kats (21809b902d) - Bug 1016035 - Put PanGestureInput events into a queue if they can end up as a swipe. r=kats (2ebac59047) - Bug 1016035 - Split up MaybeTrackScrollEventAsSwipe into SendMayStartSwipe and TrackScrollEventAsSwipe. r=kats (ced10d9671) - Bug 1016035 - Send MayStartSwipe event before sending the wheel event. r=kats (b3346b81fb) - Fix some fields missing in the widget event IPC glue. (bug 1139711, r=kats) (1298b25705) - Bug 1016035 - Add mCanTriggerSwipe and TriggersSwipe(). r=masayuki (664a059972) - Bug 1016035 - Make APZEventState report defaultPrevented=true when the event started a swipe. r=kats (128d627ac7) - Bug 1016035 - Set scroll overflow information on potential swipe start events that have been processed by APZ. r=masayuki (b5931f6320) - Bug 1206801 - fix broken CONFIG['DEBUG'] checks in moz.build files; r=mshal (292d5ac709) - Bug 1186424: Refactor AsmJSValidate.cpp in preparation for parallelization; r=luke (4868bc66ca) - Bug 1129267 - Fix by backing out patch for bug 1118615. r=mstange (ea8aaba04e) - Bug 1182411 Part 1: Make plugin quirks available to the Parent as well as the Child. r=jimm (1f2551a6b7) - Bug 1228462 - "PluginQuirks.* uses DOS CRLF". r=jmathies (b569a6c6c8) - Bug 1152300 - When focus shifts from a native plugin window to content, content needs to forward the request for focus change to chrome. r=enn (5bd811fadd) - Bug 1185529: On Windows, ensure that NPAPI child window has the correct parent before setwindow is called. r=jimm (9d94fdf2ff) - Bug 1182411 Part 2: Change winless popup surrogate to have its parent set in the chrome process. r=jimm (adee9bb012)
346 lines
10 KiB
C++
346 lines
10 KiB
C++
/* -*- 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/. */
|
|
|
|
#include "InputData.h"
|
|
|
|
#include "mozilla/dom/Touch.h"
|
|
#include "nsDebug.h"
|
|
#include "nsThreadUtils.h"
|
|
#include "mozilla/MouseEvents.h"
|
|
#include "mozilla/TouchEvents.h"
|
|
#include "UnitTransforms.h"
|
|
|
|
namespace mozilla {
|
|
|
|
using namespace dom;
|
|
|
|
already_AddRefed<Touch> SingleTouchData::ToNewDOMTouch() const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only create dom::Touch instances on main thread");
|
|
nsRefPtr<Touch> touch = new Touch(mIdentifier,
|
|
LayoutDeviceIntPoint(mScreenPoint.x, mScreenPoint.y),
|
|
nsIntPoint(mRadius.width, mRadius.height),
|
|
mRotationAngle,
|
|
mForce);
|
|
return touch.forget();
|
|
}
|
|
|
|
MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
|
: InputData(MULTITOUCH_INPUT, aTouchEvent.time, aTouchEvent.timeStamp,
|
|
aTouchEvent.modifiers)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only copy from WidgetTouchEvent on main thread");
|
|
|
|
switch (aTouchEvent.mMessage) {
|
|
case NS_TOUCH_START:
|
|
mType = MULTITOUCH_START;
|
|
break;
|
|
case NS_TOUCH_MOVE:
|
|
mType = MULTITOUCH_MOVE;
|
|
break;
|
|
case NS_TOUCH_END:
|
|
mType = MULTITOUCH_END;
|
|
break;
|
|
case NS_TOUCH_CANCEL:
|
|
mType = MULTITOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to a MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
for (size_t i = 0; i < aTouchEvent.touches.Length(); i++) {
|
|
const Touch* domTouch = aTouchEvent.touches[i];
|
|
|
|
// Extract data from weird interfaces.
|
|
int32_t identifier = domTouch->Identifier();
|
|
int32_t radiusX = domTouch->RadiusX();
|
|
int32_t radiusY = domTouch->RadiusY();
|
|
float rotationAngle = domTouch->RotationAngle();
|
|
float force = domTouch->Force();
|
|
|
|
SingleTouchData data(identifier,
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
gfx::IntPoint(domTouch->mRefPoint.x,
|
|
domTouch->mRefPoint.y)),
|
|
ScreenSize(radiusX, radiusY),
|
|
rotationAngle,
|
|
force);
|
|
|
|
mTouches.AppendElement(data);
|
|
}
|
|
}
|
|
|
|
WidgetTouchEvent
|
|
MultiTouchInput::ToWidgetTouchEvent(nsIWidget* aWidget) const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only convert To WidgetTouchEvent on main thread");
|
|
|
|
EventMessage touchEventMessage = NS_EVENT_NULL;
|
|
switch (mType) {
|
|
case MULTITOUCH_START:
|
|
touchEventMessage = NS_TOUCH_START;
|
|
break;
|
|
case MULTITOUCH_MOVE:
|
|
touchEventMessage = NS_TOUCH_MOVE;
|
|
break;
|
|
case MULTITOUCH_END:
|
|
touchEventMessage = NS_TOUCH_END;
|
|
break;
|
|
case MULTITOUCH_CANCEL:
|
|
touchEventMessage = NS_TOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetTouchEvent in MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
WidgetTouchEvent event(true, touchEventMessage, aWidget);
|
|
if (touchEventMessage == NS_EVENT_NULL) {
|
|
return event;
|
|
}
|
|
|
|
event.modifiers = this->modifiers;
|
|
event.time = this->mTime;
|
|
event.timeStamp = this->mTimeStamp;
|
|
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
*event.touches.AppendElement() = mTouches[i].ToNewDOMTouch();
|
|
}
|
|
|
|
return event;
|
|
}
|
|
|
|
WidgetMouseEvent
|
|
MultiTouchInput::ToWidgetMouseEvent(nsIWidget* aWidget) const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only convert To WidgetMouseEvent on main thread");
|
|
|
|
EventMessage mouseEventMessage = NS_EVENT_NULL;
|
|
switch (mType) {
|
|
case MultiTouchInput::MULTITOUCH_START:
|
|
mouseEventMessage = NS_MOUSE_BUTTON_DOWN;
|
|
break;
|
|
case MultiTouchInput::MULTITOUCH_MOVE:
|
|
mouseEventMessage = NS_MOUSE_MOVE;
|
|
break;
|
|
case MultiTouchInput::MULTITOUCH_CANCEL:
|
|
case MultiTouchInput::MULTITOUCH_END:
|
|
mouseEventMessage = NS_MOUSE_BUTTON_UP;
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("Did not assign a type to WidgetMouseEvent");
|
|
break;
|
|
}
|
|
|
|
WidgetMouseEvent event(true, mouseEventMessage, aWidget,
|
|
WidgetMouseEvent::eReal, WidgetMouseEvent::eNormal);
|
|
|
|
const SingleTouchData& firstTouch = mTouches[0];
|
|
event.refPoint.x = firstTouch.mScreenPoint.x;
|
|
event.refPoint.y = firstTouch.mScreenPoint.y;
|
|
|
|
event.time = mTime;
|
|
event.button = WidgetMouseEvent::eLeftButton;
|
|
event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
|
|
event.modifiers = modifiers;
|
|
|
|
if (mouseEventMessage != NS_MOUSE_MOVE) {
|
|
event.clickCount = 1;
|
|
}
|
|
|
|
return event;
|
|
}
|
|
|
|
int32_t
|
|
MultiTouchInput::IndexOfTouch(int32_t aTouchIdentifier)
|
|
{
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
if (mTouches[i].mIdentifier == aTouchIdentifier) {
|
|
return (int32_t)i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// This conversion from WidgetMouseEvent to MultiTouchInput is needed because on
|
|
// the B2G emulator we can only receive mouse events, but we need to be able
|
|
// to pan correctly. To do this, we convert the events into a format that the
|
|
// panning code can handle. This code is very limited and only supports
|
|
// SingleTouchData. It also sends garbage for the identifier, radius, force
|
|
// and rotation angle.
|
|
MultiTouchInput::MultiTouchInput(const WidgetMouseEvent& aMouseEvent)
|
|
: InputData(MULTITOUCH_INPUT, aMouseEvent.time, aMouseEvent.timeStamp,
|
|
aMouseEvent.modifiers)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(),
|
|
"Can only copy from WidgetMouseEvent on main thread");
|
|
switch (aMouseEvent.mMessage) {
|
|
case NS_MOUSE_BUTTON_DOWN:
|
|
mType = MULTITOUCH_START;
|
|
break;
|
|
case NS_MOUSE_MOVE:
|
|
mType = MULTITOUCH_MOVE;
|
|
break;
|
|
case NS_MOUSE_BUTTON_UP:
|
|
mType = MULTITOUCH_END;
|
|
break;
|
|
// The mouse pointer has been interrupted in an implementation-specific
|
|
// manner, such as a synchronous event or action cancelling the touch, or a
|
|
// touch point leaving the document window and going into a non-document
|
|
// area capable of handling user interactions.
|
|
case NS_MOUSE_EXIT_WIDGET:
|
|
mType = MULTITOUCH_CANCEL;
|
|
break;
|
|
default:
|
|
NS_WARNING("Did not assign a type to a MultiTouchInput");
|
|
break;
|
|
}
|
|
|
|
mTouches.AppendElement(SingleTouchData(0,
|
|
ScreenIntPoint::FromUnknownPoint(
|
|
gfx::IntPoint(aMouseEvent.refPoint.x,
|
|
aMouseEvent.refPoint.y)),
|
|
ScreenSize(1, 1),
|
|
180.0f,
|
|
1.0f));
|
|
}
|
|
|
|
bool
|
|
MultiTouchInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
for (size_t i = 0; i < mTouches.Length(); i++) {
|
|
Maybe<ParentLayerIntPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mTouches[i].mScreenPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mTouches[i].mLocalScreenPoint = *point;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
PanGestureInput::IsMomentum() const
|
|
{
|
|
switch (mType) {
|
|
case PanGestureInput::PANGESTURE_MOMENTUMSTART:
|
|
case PanGestureInput::PANGESTURE_MOMENTUMPAN:
|
|
case PanGestureInput::PANGESTURE_MOMENTUMEND:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
WidgetWheelEvent
|
|
PanGestureInput::ToWidgetWheelEvent(nsIWidget* aWidget) const
|
|
{
|
|
WidgetWheelEvent wheelEvent(true, NS_WHEEL_WHEEL, aWidget);
|
|
wheelEvent.modifiers = this->modifiers;
|
|
wheelEvent.time = mTime;
|
|
wheelEvent.timeStamp = mTimeStamp;
|
|
wheelEvent.refPoint =
|
|
RoundedToInt(ViewAs<LayoutDevicePixel>(mPanStartPoint,
|
|
PixelCastJustification::LayoutDeviceToScreenForUntransformedEvent));
|
|
wheelEvent.buttons = 0;
|
|
wheelEvent.deltaMode = nsIDOMWheelEvent::DOM_DELTA_PIXEL;
|
|
wheelEvent.isMomentum = IsMomentum();
|
|
wheelEvent.lineOrPageDeltaX = mLineOrPageDeltaX;
|
|
wheelEvent.lineOrPageDeltaY = mLineOrPageDeltaY;
|
|
wheelEvent.deltaX = mPanDisplacement.x;
|
|
wheelEvent.deltaY = mPanDisplacement.y;
|
|
wheelEvent.mFlags.mHandledByAPZ = true;
|
|
return wheelEvent;
|
|
}
|
|
|
|
bool
|
|
PanGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> panStartPoint = UntransformTo<ParentLayerPixel>(aTransform, mPanStartPoint);
|
|
if (!panStartPoint) {
|
|
return false;
|
|
}
|
|
mLocalPanStartPoint = *panStartPoint;
|
|
|
|
Maybe<ParentLayerPoint> panDisplacement = UntransformVector<ParentLayerPixel>(aTransform, mPanDisplacement, mPanStartPoint);
|
|
if (!panDisplacement) {
|
|
return false;
|
|
}
|
|
mLocalPanDisplacement = *panDisplacement;
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
PinchGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mFocusPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalFocusPoint = *point;
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TapGestureInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerIntPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mPoint);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalPoint = *point;
|
|
return true;
|
|
}
|
|
|
|
static uint32_t
|
|
DeltaModeForDeltaType(ScrollWheelInput::ScrollDeltaType aDeltaType)
|
|
{
|
|
switch (aDeltaType) {
|
|
case ScrollWheelInput::SCROLLDELTA_LINE:
|
|
return nsIDOMWheelEvent::DOM_DELTA_LINE;
|
|
case ScrollWheelInput::SCROLLDELTA_PIXEL:
|
|
default:
|
|
return nsIDOMWheelEvent::DOM_DELTA_PIXEL;
|
|
}
|
|
}
|
|
|
|
WidgetWheelEvent
|
|
ScrollWheelInput::ToWidgetWheelEvent(nsIWidget* aWidget) const
|
|
{
|
|
WidgetWheelEvent wheelEvent(true, NS_WHEEL_WHEEL, aWidget);
|
|
wheelEvent.modifiers = this->modifiers;
|
|
wheelEvent.time = mTime;
|
|
wheelEvent.timeStamp = mTimeStamp;
|
|
wheelEvent.refPoint =
|
|
RoundedToInt(ViewAs<LayoutDevicePixel>(mOrigin,
|
|
PixelCastJustification::LayoutDeviceToScreenForUntransformedEvent));
|
|
wheelEvent.buttons = 0;
|
|
wheelEvent.deltaMode = DeltaModeForDeltaType(mDeltaType);
|
|
wheelEvent.isMomentum = mIsMomentum;
|
|
wheelEvent.deltaX = mDeltaX;
|
|
wheelEvent.deltaY = mDeltaY;
|
|
wheelEvent.lineOrPageDeltaX = mLineOrPageDeltaX;
|
|
wheelEvent.lineOrPageDeltaY = mLineOrPageDeltaY;
|
|
wheelEvent.mFlags.mHandledByAPZ = true;
|
|
return wheelEvent;
|
|
}
|
|
|
|
bool
|
|
ScrollWheelInput::TransformToLocal(const gfx::Matrix4x4& aTransform)
|
|
{
|
|
Maybe<ParentLayerPoint> point = UntransformTo<ParentLayerPixel>(aTransform, mOrigin);
|
|
if (!point) {
|
|
return false;
|
|
}
|
|
mLocalOrigin = *point;
|
|
return true;
|
|
}
|
|
|
|
} // namespace mozilla
|