Bug 942689 - Include modifer info in tap gesture events [r=roc,jimm,botond]

This commit is contained in:
Matt Brubeck 2013-11-25 20:30:26 -08:00
Родитель 29056e837a
Коммит fa697d2df2
16 изменённых файлов: 163 добавлений и 75 удалений

Просмотреть файл

@ -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();

Просмотреть файл

@ -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");