зеркало из https://github.com/mozilla/gecko-dev.git
Bug 942689 - Include modifer info in tap gesture events [r=roc,jimm,botond]
This commit is contained in:
Родитель
29056e837a
Коммит
fa697d2df2
|
@ -225,7 +225,6 @@ let Content = {
|
|||
let json = aMessage.json;
|
||||
let x = json.x;
|
||||
let y = json.y;
|
||||
let modifiers = json.modifiers;
|
||||
|
||||
switch (aMessage.name) {
|
||||
case "Browser:Blur":
|
||||
|
@ -263,7 +262,7 @@ let Content = {
|
|||
break;
|
||||
|
||||
case "Gesture:SingleTap":
|
||||
this._onSingleTap(json.x, json.y);
|
||||
this._onSingleTap(json.x, json.y, json.modifiers);
|
||||
break;
|
||||
|
||||
case "Gesture:DoubleTap":
|
||||
|
@ -373,10 +372,11 @@ let Content = {
|
|||
}
|
||||
},
|
||||
|
||||
_onSingleTap: function (aX, aY) {
|
||||
_onSingleTap: function (aX, aY, aModifiers) {
|
||||
let utils = Util.getWindowUtils(content);
|
||||
for (let type of ["mousemove", "mousedown", "mouseup"]) {
|
||||
utils.sendMouseEventToWindow(type, aX, aY, 0, 1, 0, true, 1.0, Ci.nsIDOMMouseEvent.MOZ_SOURCE_TOUCH);
|
||||
utils.sendMouseEventToWindow(type, aX, aY, 0, 1, aModifiers, true, 1.0,
|
||||
Ci.nsIDOMMouseEvent.MOZ_SOURCE_TOUCH);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -494,21 +494,22 @@ TabParent::UpdateFrame(const FrameMetrics& aFrameMetrics)
|
|||
}
|
||||
}
|
||||
|
||||
void TabParent::HandleDoubleTap(const CSSIntPoint& aPoint)
|
||||
void TabParent::HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
if (!mIsDestroyed) {
|
||||
unused << SendHandleDoubleTap(aPoint);
|
||||
}
|
||||
}
|
||||
|
||||
void TabParent::HandleSingleTap(const CSSIntPoint& aPoint)
|
||||
void TabParent::HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
// TODO Send the modifier data to TabChild for use in mouse events.
|
||||
if (!mIsDestroyed) {
|
||||
unused << SendHandleSingleTap(aPoint);
|
||||
}
|
||||
}
|
||||
|
||||
void TabParent::HandleLongTap(const CSSIntPoint& aPoint)
|
||||
void TabParent::HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
if (!mIsDestroyed) {
|
||||
unused << SendHandleLongTap(aPoint);
|
||||
|
|
|
@ -196,9 +196,9 @@ public:
|
|||
void Show(const nsIntSize& size);
|
||||
void UpdateDimensions(const nsRect& rect, const nsIntSize& size);
|
||||
void UpdateFrame(const layers::FrameMetrics& aFrameMetrics);
|
||||
void HandleDoubleTap(const CSSIntPoint& aPoint);
|
||||
void HandleSingleTap(const CSSIntPoint& aPoint);
|
||||
void HandleLongTap(const CSSIntPoint& aPoint);
|
||||
void HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
void HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
void HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
void Activate();
|
||||
void Deactivate();
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "base/tracked.h" // for FROM_HERE
|
||||
#include "gfxTypes.h" // for gfxFloat
|
||||
#include "mozilla/Assertions.h" // for MOZ_ASSERT, etc
|
||||
#include "mozilla/BasicEvents.h" // for Modifiers, MODIFIER_*
|
||||
#include "mozilla/ClearOnShutdown.h" // for ClearOnShutdown
|
||||
#include "mozilla/Constants.h" // for M_PI
|
||||
#include "mozilla/EventForwards.h" // for nsEventStatus_*
|
||||
|
@ -43,6 +44,7 @@
|
|||
#include "nsAutoPtr.h" // for nsRefPtr
|
||||
#include "nsCOMPtr.h" // for already_AddRefed
|
||||
#include "nsDebug.h" // for NS_WARNING
|
||||
#include "nsIDOMWindowUtils.h" // for nsIDOMWindowUtils
|
||||
#include "nsISupportsImpl.h"
|
||||
#include "nsMathUtils.h" // for NS_hypot
|
||||
#include "nsPoint.h" // for nsIntPoint
|
||||
|
@ -69,6 +71,51 @@
|
|||
fm.mScrollableRect.x, fm.mScrollableRect.y, fm.mScrollableRect.width, fm.mScrollableRect.height, \
|
||||
fm.mDevPixelsPerCSSPixel.scale, fm.mResolution.scale, fm.mCumulativeResolution.scale, fm.mZoom.scale); \
|
||||
|
||||
// Static helper functions
|
||||
namespace {
|
||||
|
||||
int32_t
|
||||
WidgetModifiersToDOMModifiers(mozilla::Modifiers aModifiers)
|
||||
{
|
||||
int32_t result = 0;
|
||||
if (aModifiers & mozilla::MODIFIER_SHIFT) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_SHIFT;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_CONTROL) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_CONTROL;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_ALT) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_ALT;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_META) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_META;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_ALTGRAPH) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_ALTGRAPH;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_CAPSLOCK) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_CAPSLOCK;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_FN) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_FN;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_NUMLOCK) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_NUMLOCK;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_SCROLLLOCK) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_SCROLLLOCK;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_SYMBOLLOCK) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_SYMBOLLOCK;
|
||||
}
|
||||
if (aModifiers & mozilla::MODIFIER_OS) {
|
||||
result |= nsIDOMWindowUtils::MODIFIER_OS;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
using namespace mozilla::css;
|
||||
|
||||
namespace mozilla {
|
||||
|
@ -709,7 +756,8 @@ nsEventStatus AsyncPanZoomController::OnLongPress(const TapGestureInput& aEvent)
|
|||
ReentrantMonitorAutoEnter lock(mMonitor);
|
||||
|
||||
CSSPoint point = WidgetSpaceToCompensatedViewportSpace(aEvent.mPoint, mFrameMetrics.mZoom);
|
||||
controller->HandleLongTap(gfx::RoundedToInt(point));
|
||||
int32_t modifiers = WidgetModifiersToDOMModifiers(aEvent.modifiers);
|
||||
controller->HandleLongTap(gfx::RoundedToInt(point), modifiers);
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
return nsEventStatus_eIgnore;
|
||||
|
@ -722,7 +770,8 @@ nsEventStatus AsyncPanZoomController::OnSingleTapUp(const TapGestureInput& aEven
|
|||
ReentrantMonitorAutoEnter lock(mMonitor);
|
||||
|
||||
CSSPoint point = WidgetSpaceToCompensatedViewportSpace(aEvent.mPoint, mFrameMetrics.mZoom);
|
||||
controller->HandleSingleTap(gfx::RoundedToInt(point));
|
||||
int32_t modifiers = WidgetModifiersToDOMModifiers(aEvent.modifiers);
|
||||
controller->HandleSingleTap(gfx::RoundedToInt(point), modifiers);
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
return nsEventStatus_eIgnore;
|
||||
|
@ -736,7 +785,8 @@ nsEventStatus AsyncPanZoomController::OnSingleTapConfirmed(const TapGestureInput
|
|||
ReentrantMonitorAutoEnter lock(mMonitor);
|
||||
|
||||
CSSPoint point = WidgetSpaceToCompensatedViewportSpace(aEvent.mPoint, mFrameMetrics.mZoom);
|
||||
controller->HandleSingleTap(gfx::RoundedToInt(point));
|
||||
int32_t modifiers = WidgetModifiersToDOMModifiers(aEvent.modifiers);
|
||||
controller->HandleSingleTap(gfx::RoundedToInt(point), modifiers);
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
return nsEventStatus_eIgnore;
|
||||
|
@ -750,7 +800,8 @@ nsEventStatus AsyncPanZoomController::OnDoubleTap(const TapGestureInput& aEvent)
|
|||
|
||||
if (mAllowZoom) {
|
||||
CSSPoint point = WidgetSpaceToCompensatedViewportSpace(aEvent.mPoint, mFrameMetrics.mZoom);
|
||||
controller->HandleDoubleTap(gfx::RoundedToInt(point));
|
||||
int32_t modifiers = WidgetModifiersToDOMModifiers(aEvent.modifiers);
|
||||
controller->HandleDoubleTap(gfx::RoundedToInt(point), modifiers);
|
||||
}
|
||||
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
|
|
|
@ -34,20 +34,20 @@ public:
|
|||
* AsyncPanZoomController::ZoomToRect with the dimensions that we want to zoom
|
||||
* to.
|
||||
*/
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint) = 0;
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers) = 0;
|
||||
|
||||
/**
|
||||
* Requests handling a single tap. |aPoint| is in CSS pixels, relative to the
|
||||
* current scroll offset. This should simulate and send to content a mouse
|
||||
* button down, then mouse button up at |aPoint|.
|
||||
*/
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint) = 0;
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers) = 0;
|
||||
|
||||
/**
|
||||
* Requests handling a long tap. |aPoint| is in CSS pixels, relative to the
|
||||
* current scroll offset.
|
||||
*/
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint) = 0;
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers) = 0;
|
||||
|
||||
/**
|
||||
* Requests sending a mozbrowserasyncscroll domevent to embedder.
|
||||
|
|
|
@ -40,7 +40,7 @@ GestureEventListener::GestureEventListener(AsyncPanZoomController* aAsyncPanZoom
|
|||
mSpanChange(0.0f),
|
||||
mTapStartTime(0),
|
||||
mLastTapEndTime(0),
|
||||
mLastTouchInput(MultiTouchInput::MULTITOUCH_START, 0)
|
||||
mLastTouchInput(MultiTouchInput::MULTITOUCH_START, 0, 0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -226,7 +226,8 @@ nsEventStatus GestureEventListener::HandlePinchGestureEvent(const MultiTouchInpu
|
|||
aEvent.mTime,
|
||||
focusPoint,
|
||||
currentSpan,
|
||||
currentSpan);
|
||||
currentSpan,
|
||||
aEvent.modifiers);
|
||||
|
||||
mAsyncPanZoomController->HandleInputEvent(pinchEvent);
|
||||
|
||||
|
@ -240,7 +241,8 @@ nsEventStatus GestureEventListener::HandlePinchGestureEvent(const MultiTouchInpu
|
|||
aEvent.mTime,
|
||||
focusPoint,
|
||||
currentSpan,
|
||||
mPreviousSpan);
|
||||
mPreviousSpan,
|
||||
aEvent.modifiers);
|
||||
|
||||
mAsyncPanZoomController->HandleInputEvent(pinchEvent);
|
||||
break;
|
||||
|
@ -258,7 +260,8 @@ nsEventStatus GestureEventListener::HandlePinchGestureEvent(const MultiTouchInpu
|
|||
aEvent.mTime,
|
||||
ScreenPoint(), // may change below
|
||||
1.0f, // may change below
|
||||
1.0f); // may change below
|
||||
1.0f, // may change below
|
||||
aEvent.modifiers);
|
||||
|
||||
if (mTouches.Length() > 0) {
|
||||
// Pinch is changing to pan. APZC will start a pan at mFocusPoint
|
||||
|
@ -286,19 +289,22 @@ nsEventStatus GestureEventListener::HandlePinchGestureEvent(const MultiTouchInpu
|
|||
|
||||
nsEventStatus GestureEventListener::HandleSingleTapUpEvent(const MultiTouchInput& aEvent)
|
||||
{
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_UP, aEvent.mTime, aEvent.mTouches[0].mScreenPoint);
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_UP, aEvent.mTime,
|
||||
aEvent.mTouches[0].mScreenPoint, aEvent.modifiers);
|
||||
return mAsyncPanZoomController->HandleInputEvent(tapEvent);
|
||||
}
|
||||
|
||||
nsEventStatus GestureEventListener::HandleSingleTapConfirmedEvent(const MultiTouchInput& aEvent)
|
||||
{
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_CONFIRMED, aEvent.mTime, aEvent.mTouches[0].mScreenPoint);
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_CONFIRMED, aEvent.mTime,
|
||||
aEvent.mTouches[0].mScreenPoint, aEvent.modifiers);
|
||||
return mAsyncPanZoomController->HandleInputEvent(tapEvent);
|
||||
}
|
||||
|
||||
nsEventStatus GestureEventListener::HandleLongTapEvent(const MultiTouchInput& aEvent)
|
||||
{
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_LONG, aEvent.mTime, aEvent.mTouches[0].mScreenPoint);
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_LONG, aEvent.mTime,
|
||||
aEvent.mTouches[0].mScreenPoint, aEvent.modifiers);
|
||||
return mAsyncPanZoomController->HandleInputEvent(tapEvent);
|
||||
}
|
||||
|
||||
|
@ -325,7 +331,8 @@ nsEventStatus GestureEventListener::HandleTapCancel(const MultiTouchInput& aEven
|
|||
|
||||
nsEventStatus GestureEventListener::HandleDoubleTap(const MultiTouchInput& aEvent)
|
||||
{
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_DOUBLE, aEvent.mTime, aEvent.mTouches[0].mScreenPoint);
|
||||
TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_DOUBLE, aEvent.mTime,
|
||||
aEvent.mTouches[0].mScreenPoint, aEvent.modifiers);
|
||||
return mAsyncPanZoomController->HandleInputEvent(tapEvent);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@ using ::testing::_;
|
|||
class MockContentController : public GeckoContentController {
|
||||
public:
|
||||
MOCK_METHOD1(RequestContentRepaint, void(const FrameMetrics&));
|
||||
MOCK_METHOD1(HandleDoubleTap, void(const CSSIntPoint&));
|
||||
MOCK_METHOD1(HandleSingleTap, void(const CSSIntPoint&));
|
||||
MOCK_METHOD1(HandleLongTap, void(const CSSIntPoint&));
|
||||
MOCK_METHOD2(HandleDoubleTap, void(const CSSIntPoint&, int32_t));
|
||||
MOCK_METHOD2(HandleSingleTap, void(const CSSIntPoint&, int32_t));
|
||||
MOCK_METHOD2(HandleLongTap, void(const CSSIntPoint&, int32_t));
|
||||
MOCK_METHOD3(SendAsyncScrollDOMEvent, void(bool aIsRoot, const CSSRect &aContentRect, const CSSSize &aScrollableSize));
|
||||
MOCK_METHOD2(PostDelayedTask, void(Task* aTask, int aDelayMs));
|
||||
};
|
||||
|
@ -86,7 +86,7 @@ void ApzcPan(AsyncPanZoomController* apzc, int& aTime, int aTouchStartY, int aTo
|
|||
MultiTouchInput mti;
|
||||
nsEventStatus status;
|
||||
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_START, aTime);
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_START, aTime, 0);
|
||||
aTime += TIME_BETWEEN_TOUCH_EVENT;
|
||||
// Make sure the move is large enough to not be handled as a tap
|
||||
mti.mTouches.AppendElement(SingleTouchData(0, ScreenIntPoint(10, aTouchStartY+OVERCOME_TOUCH_TOLERANCE), ScreenSize(0, 0), 0, 0));
|
||||
|
@ -94,20 +94,20 @@ void ApzcPan(AsyncPanZoomController* apzc, int& aTime, int aTouchStartY, int aTo
|
|||
EXPECT_EQ(status, nsEventStatus_eConsumeNoDefault);
|
||||
// APZC should be in TOUCHING state
|
||||
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_MOVE, aTime);
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_MOVE, aTime, 0);
|
||||
aTime += TIME_BETWEEN_TOUCH_EVENT;
|
||||
mti.mTouches.AppendElement(SingleTouchData(0, ScreenIntPoint(10, aTouchStartY), ScreenSize(0, 0), 0, 0));
|
||||
status = apzc->HandleInputEvent(mti);
|
||||
EXPECT_EQ(status, nsEventStatus_eConsumeNoDefault);
|
||||
// APZC should be in PANNING, otherwise status != ConsumeNoDefault
|
||||
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_MOVE, aTime);
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_MOVE, aTime, 0);
|
||||
aTime += TIME_BETWEEN_TOUCH_EVENT;
|
||||
mti.mTouches.AppendElement(SingleTouchData(0, ScreenIntPoint(10, aTouchEndY), ScreenSize(0, 0), 0, 0));
|
||||
status = apzc->HandleInputEvent(mti);
|
||||
EXPECT_EQ(status, nsEventStatus_eConsumeNoDefault);
|
||||
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_END, aTime);
|
||||
mti = MultiTouchInput(MultiTouchInput::MULTITOUCH_END, aTime, 0);
|
||||
aTime += TIME_BETWEEN_TOUCH_EVENT;
|
||||
mti.mTouches.AppendElement(SingleTouchData(0, ScreenIntPoint(10, aTouchEndY), ScreenSize(0, 0), 0, 0));
|
||||
status = apzc->HandleInputEvent(mti);
|
||||
|
@ -119,19 +119,22 @@ ApzcPinch(AsyncPanZoomController* aApzc, int aFocusX, int aFocusY, float aScale)
|
|||
0,
|
||||
ScreenPoint(aFocusX, aFocusY),
|
||||
10.0,
|
||||
10.0));
|
||||
10.0,
|
||||
0));
|
||||
aApzc->HandleInputEvent(PinchGestureInput(PinchGestureInput::PINCHGESTURE_SCALE,
|
||||
0,
|
||||
ScreenPoint(aFocusX, aFocusY),
|
||||
10.0 * aScale,
|
||||
10.0));
|
||||
10.0,
|
||||
0));
|
||||
aApzc->HandleInputEvent(PinchGestureInput(PinchGestureInput::PINCHGESTURE_END,
|
||||
0,
|
||||
ScreenPoint(aFocusX, aFocusY),
|
||||
// note: negative values here tell APZC
|
||||
// not to turn the pinch into a pan
|
||||
-1.0,
|
||||
-1.0));
|
||||
-1.0,
|
||||
0));
|
||||
}
|
||||
|
||||
TEST(AsyncPanZoomController, Constructor) {
|
||||
|
|
|
@ -514,7 +514,8 @@ public:
|
|||
aFrameMetrics));
|
||||
}
|
||||
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint,
|
||||
int32_t aModifiers) MOZ_OVERRIDE
|
||||
{
|
||||
if (MessageLoop::current() != mUILoop) {
|
||||
// We have to send this message from the "UI thread" (main
|
||||
|
@ -522,16 +523,17 @@ public:
|
|||
mUILoop->PostTask(
|
||||
FROM_HERE,
|
||||
NewRunnableMethod(this, &RemoteContentController::HandleDoubleTap,
|
||||
aPoint));
|
||||
aPoint, aModifiers));
|
||||
return;
|
||||
}
|
||||
if (mRenderFrame) {
|
||||
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
|
||||
browser->HandleDoubleTap(aPoint);
|
||||
browser->HandleDoubleTap(aPoint, aModifiers);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint,
|
||||
int32_t aModifiers) MOZ_OVERRIDE
|
||||
{
|
||||
if (MessageLoop::current() != mUILoop) {
|
||||
// We have to send this message from the "UI thread" (main
|
||||
|
@ -539,16 +541,17 @@ public:
|
|||
mUILoop->PostTask(
|
||||
FROM_HERE,
|
||||
NewRunnableMethod(this, &RemoteContentController::HandleSingleTap,
|
||||
aPoint));
|
||||
aPoint, aModifiers));
|
||||
return;
|
||||
}
|
||||
if (mRenderFrame) {
|
||||
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
|
||||
browser->HandleSingleTap(aPoint);
|
||||
browser->HandleSingleTap(aPoint, aModifiers);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint,
|
||||
int32_t aModifiers) MOZ_OVERRIDE
|
||||
{
|
||||
if (MessageLoop::current() != mUILoop) {
|
||||
// We have to send this message from the "UI thread" (main
|
||||
|
@ -556,12 +559,12 @@ public:
|
|||
mUILoop->PostTask(
|
||||
FROM_HERE,
|
||||
NewRunnableMethod(this, &RemoteContentController::HandleLongTap,
|
||||
aPoint));
|
||||
aPoint, aModifiers));
|
||||
return;
|
||||
}
|
||||
if (mRenderFrame) {
|
||||
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
|
||||
browser->HandleLongTap(aPoint);
|
||||
browser->HandleLongTap(aPoint, aModifiers);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -49,6 +49,8 @@ public:
|
|||
// startup.
|
||||
uint32_t mTime;
|
||||
|
||||
Modifiers modifiers;
|
||||
|
||||
INPUTDATA_AS_CHILD_TYPE(MultiTouchInput, MULTITOUCH_INPUT)
|
||||
INPUTDATA_AS_CHILD_TYPE(PinchGestureInput, PINCHGESTURE_INPUT)
|
||||
INPUTDATA_AS_CHILD_TYPE(TapGestureInput, TAPGESTURE_INPUT)
|
||||
|
@ -58,9 +60,10 @@ public:
|
|||
}
|
||||
|
||||
protected:
|
||||
InputData(InputType aInputType, uint32_t aTime)
|
||||
InputData(InputType aInputType, uint32_t aTime, Modifiers aModifiers)
|
||||
: mInputType(aInputType),
|
||||
mTime(aTime)
|
||||
mTime(aTime),
|
||||
modifiers(aModifiers)
|
||||
{
|
||||
|
||||
|
||||
|
@ -148,8 +151,8 @@ public:
|
|||
MULTITOUCH_CANCEL
|
||||
};
|
||||
|
||||
MultiTouchInput(MultiTouchType aType, uint32_t aTime)
|
||||
: InputData(MULTITOUCH_INPUT, aTime),
|
||||
MultiTouchInput(MultiTouchType aType, uint32_t aTime, Modifiers aModifiers)
|
||||
: InputData(MULTITOUCH_INPUT, aTime, aModifiers),
|
||||
mType(aType)
|
||||
{
|
||||
|
||||
|
@ -193,8 +196,9 @@ public:
|
|||
uint32_t aTime,
|
||||
const ScreenPoint& aFocusPoint,
|
||||
float aCurrentSpan,
|
||||
float aPreviousSpan)
|
||||
: InputData(PINCHGESTURE_INPUT, aTime),
|
||||
float aPreviousSpan,
|
||||
Modifiers aModifiers)
|
||||
: InputData(PINCHGESTURE_INPUT, aTime, aModifiers),
|
||||
mType(aType),
|
||||
mFocusPoint(aFocusPoint),
|
||||
mCurrentSpan(aCurrentSpan),
|
||||
|
@ -241,8 +245,11 @@ public:
|
|||
TAPGESTURE_CANCEL
|
||||
};
|
||||
|
||||
TapGestureInput(TapGestureType aType, uint32_t aTime, const ScreenIntPoint& aPoint)
|
||||
: InputData(TAPGESTURE_INPUT, aTime),
|
||||
TapGestureInput(TapGestureType aType,
|
||||
uint32_t aTime,
|
||||
const ScreenIntPoint& aPoint,
|
||||
Modifiers aModifiers)
|
||||
: InputData(TAPGESTURE_INPUT, aTime, aModifiers),
|
||||
mType(aType),
|
||||
mPoint(aPoint)
|
||||
{
|
||||
|
|
|
@ -1979,7 +1979,7 @@ AndroidBridge::RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrame
|
|||
}
|
||||
|
||||
void
|
||||
AndroidBridge::HandleDoubleTap(const CSSIntPoint& aPoint)
|
||||
AndroidBridge::HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y);
|
||||
nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent(
|
||||
|
@ -1987,15 +1987,16 @@ AndroidBridge::HandleDoubleTap(const CSSIntPoint& aPoint)
|
|||
}
|
||||
|
||||
void
|
||||
AndroidBridge::HandleSingleTap(const CSSIntPoint& aPoint)
|
||||
AndroidBridge::HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
// TODO Send the modifier data to Gecko for use in mouse events.
|
||||
nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y);
|
||||
nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent(
|
||||
NS_LITERAL_CSTRING("Gesture:SingleTap"), data));
|
||||
}
|
||||
|
||||
void
|
||||
AndroidBridge::HandleLongTap(const CSSIntPoint& aPoint)
|
||||
AndroidBridge::HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y);
|
||||
nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent(
|
||||
|
|
|
@ -406,9 +406,9 @@ public:
|
|||
NativePanZoomController* SetNativePanZoomController(jobject obj);
|
||||
// GeckoContentController methods
|
||||
void RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrameMetrics) MOZ_OVERRIDE;
|
||||
void HandleDoubleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE;
|
||||
void HandleSingleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE;
|
||||
void HandleLongTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE;
|
||||
void HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE;
|
||||
void HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE;
|
||||
void HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE;
|
||||
void SendAsyncScrollDOMEvent(bool aIsRoot,
|
||||
const CSSRect& aContentRect,
|
||||
const CSSSize& aScrollableSize) MOZ_OVERRIDE;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include "AndroidBridgeUtilities.h"
|
||||
#include "nsIDOMKeyEvent.h"
|
||||
#include "nsIWidget.h"
|
||||
#include "mozilla/BasicEvents.h"
|
||||
#include "mozilla/TouchEvents.h"
|
||||
|
||||
using namespace mozilla;
|
||||
|
@ -706,7 +707,19 @@ AndroidGeckoEvent::MakeMultiTouchInput(nsIWidget* widget)
|
|||
}
|
||||
}
|
||||
|
||||
MultiTouchInput event(type, Time());
|
||||
MultiTouchInput event(type, Time(), 0);
|
||||
if (IsCtrlPressed()) {
|
||||
event.modifiers |= MODIFIER_CONTROL;
|
||||
}
|
||||
if (IsAltPressed()) {
|
||||
event.modifiers |= MODIFIER_ALT;
|
||||
}
|
||||
if (IsShiftPressed()) {
|
||||
event.modifiers |= MODIFIER_SHIFT;
|
||||
}
|
||||
if (IsMetaPressed()) {
|
||||
event.modifiers |= MODIFIER_META;
|
||||
}
|
||||
|
||||
if (type < 0) {
|
||||
// An event we don't know about
|
||||
|
|
|
@ -20,9 +20,9 @@ public:
|
|||
virtual void PostDelayedTask(Task* aTask, int aDelayMs) MOZ_OVERRIDE;
|
||||
|
||||
// No-ops
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE {}
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE {}
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint) MOZ_OVERRIDE {}
|
||||
virtual void HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE {}
|
||||
virtual void HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE {}
|
||||
virtual void HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers) MOZ_OVERRIDE {}
|
||||
virtual void SendAsyncScrollDOMEvent(bool aIsRoot,
|
||||
const CSSRect &aContentRect,
|
||||
const CSSSize &aScrollableSize) MOZ_OVERRIDE {}
|
||||
|
|
|
@ -281,23 +281,25 @@ APZController::UpdateScrollOffset(const mozilla::layers::ScrollableLayerGuid& aS
|
|||
}
|
||||
|
||||
void
|
||||
APZController::HandleDoubleTap(const CSSIntPoint& aPoint)
|
||||
APZController::HandleDoubleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
NS_ConvertASCIItoUTF16 data(nsPrintfCString("{ \"x\": %d, \"y\": %d }",
|
||||
(int32_t)aPoint.x, (int32_t)aPoint.y));
|
||||
NS_ConvertASCIItoUTF16 data(
|
||||
nsPrintfCString("{ \"x\": %d, \"y\": %d, \"modifiers\": %d }",
|
||||
(int32_t)aPoint.x, (int32_t)aPoint.y, aModifiers));
|
||||
MetroUtils::FireObserver("Gesture:DoubleTap", data.get());
|
||||
}
|
||||
|
||||
void
|
||||
APZController::HandleSingleTap(const CSSIntPoint& aPoint)
|
||||
APZController::HandleSingleTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
NS_ConvertASCIItoUTF16 data(nsPrintfCString("{ \"x\": %d, \"y\": %d }",
|
||||
(int32_t)aPoint.x, (int32_t)aPoint.y));
|
||||
NS_ConvertASCIItoUTF16 data(
|
||||
nsPrintfCString("{ \"x\": %d, \"y\": %d, \"modifiers\": %d }",
|
||||
(int32_t)aPoint.x, (int32_t)aPoint.y, aModifiers));
|
||||
MetroUtils::FireObserver("Gesture:SingleTap", data.get());
|
||||
}
|
||||
|
||||
void
|
||||
APZController::HandleLongTap(const CSSIntPoint& aPoint)
|
||||
APZController::HandleLongTap(const CSSIntPoint& aPoint, int32_t aModifiers)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -32,9 +32,9 @@ public:
|
|||
|
||||
// GeckoContentController interface
|
||||
virtual void RequestContentRepaint(const FrameMetrics& aFrameMetrics);
|
||||
virtual void HandleDoubleTap(const mozilla::CSSIntPoint& aPoint);
|
||||
virtual void HandleSingleTap(const mozilla::CSSIntPoint& aPoint);
|
||||
virtual void HandleLongTap(const mozilla::CSSIntPoint& aPoint);
|
||||
virtual void HandleDoubleTap(const mozilla::CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
virtual void HandleSingleTap(const mozilla::CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
virtual void HandleLongTap(const mozilla::CSSIntPoint& aPoint, int32_t aModifiers);
|
||||
virtual void SendAsyncScrollDOMEvent(bool aIsRoot, const mozilla::CSSRect &aContentRect, const mozilla::CSSSize &aScrollableSize);
|
||||
virtual void PostDelayedTask(Task* aTask, int aDelayMs);
|
||||
virtual void HandlePanBegin();
|
||||
|
@ -63,4 +63,4 @@ private:
|
|||
CSSIntPoint mLastScrollOffset;
|
||||
};
|
||||
|
||||
} } }
|
||||
} } }
|
||||
|
|
|
@ -16,7 +16,7 @@ namespace mozilla {
|
|||
using namespace dom;
|
||||
|
||||
MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
||||
: InputData(MULTITOUCH_INPUT, aTouchEvent.time)
|
||||
: InputData(MULTITOUCH_INPUT, aTouchEvent.time, aTouchEvent.modifiers)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
||||
"Can only copy from WidgetTouchEvent on main thread");
|
||||
|
@ -74,7 +74,7 @@ MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
|||
// SingleTouchData. It also sends garbage for the identifier, radius, force
|
||||
// and rotation angle.
|
||||
MultiTouchInput::MultiTouchInput(const WidgetMouseEvent& aMouseEvent)
|
||||
: InputData(MULTITOUCH_INPUT, aMouseEvent.time)
|
||||
: InputData(MULTITOUCH_INPUT, aMouseEvent.time, aMouseEvent.modifiers)
|
||||
{
|
||||
NS_ABORT_IF_FALSE(NS_IsMainThread(),
|
||||
"Can only copy from WidgetMouseEvent on main thread");
|
||||
|
|
Загрузка…
Ссылка в новой задаче