Bug 731878 part.2 Implement D3E MouseEvent.buttons attribute r=smaug, sr=jst

This commit is contained in:
Masayuki Nakano 2012-04-25 12:00:01 +09:00
Родитель ef84db57cf
Коммит 3659544533
12 изменённых файлов: 80 добавлений и 14 удалений

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

@ -695,6 +695,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData()
mouseEvent->context = oldMouseEvent->context;
mouseEvent->relatedTarget = oldMouseEvent->relatedTarget;
mouseEvent->button = oldMouseEvent->button;
mouseEvent->buttons = oldMouseEvent->buttons;
mouseEvent->modifiers = oldMouseEvent->modifiers;
mouseEvent->pressure = oldMouseEvent->pressure;
mouseEvent->inputSource = oldMouseEvent->inputSource;
@ -713,6 +714,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData()
dragEvent->acceptActivation = oldDragEvent->acceptActivation;
dragEvent->relatedTarget = oldDragEvent->relatedTarget;
dragEvent->button = oldDragEvent->button;
dragEvent->buttons = oldDragEvent->buttons;
dragEvent->modifiers = oldDragEvent->modifiers;
static_cast<nsMouseEvent*>(dragEvent)->inputSource =
static_cast<nsMouseEvent*>(oldDragEvent)->inputSource;
@ -755,6 +757,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData()
mouseScrollEvent->delta = oldMouseScrollEvent->delta;
mouseScrollEvent->relatedTarget = oldMouseScrollEvent->relatedTarget;
mouseScrollEvent->button = oldMouseScrollEvent->button;
mouseScrollEvent->buttons = oldMouseScrollEvent->buttons;
mouseScrollEvent->modifiers = oldMouseScrollEvent->modifiers;
static_cast<nsMouseEvent_base*>(mouseScrollEvent)->inputSource =
static_cast<nsMouseEvent_base*>(oldMouseScrollEvent)->inputSource;
@ -901,6 +904,7 @@ NS_METHOD nsDOMEvent::DuplicatePrivateData()
NS_ENSURE_TRUE(mozTouchEvent, NS_ERROR_OUT_OF_MEMORY);
isInputEvent = true;
mozTouchEvent->modifiers = oldMozTouchEvent->modifiers;
mozTouchEvent->buttons = oldMozTouchEvent->buttons;
newEvent = mozTouchEvent;
break;
}

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

@ -193,11 +193,26 @@ nsDOMMouseEvent::InitFromCtor(const nsAString& aType,
mozilla::dom::MouseEventInit d;
nsresult rv = d.Init(aCx, aVal);
NS_ENSURE_SUCCESS(rv, rv);
return InitMouseEvent(aType, d.bubbles, d.cancelable,
d.view, d.detail, d.screenX, d.screenY,
d.clientX, d.clientY,
d.ctrlKey, d.altKey, d.shiftKey, d.metaKey,
d.button, d.relatedTarget);
rv = InitMouseEvent(aType, d.bubbles, d.cancelable,
d.view, d.detail, d.screenX, d.screenY,
d.clientX, d.clientY,
d.ctrlKey, d.altKey, d.shiftKey, d.metaKey,
d.button, d.relatedTarget);
NS_ENSURE_SUCCESS(rv, rv);
switch(mEvent->eventStructType) {
case NS_MOUSE_EVENT:
case NS_MOUSE_SCROLL_EVENT:
case NS_DRAG_EVENT:
case NS_SIMPLE_GESTURE_EVENT:
case NS_MOZTOUCH_EVENT:
static_cast<nsMouseEvent_base*>(mEvent)->buttons = d.buttons;
break;
default:
break;
}
return NS_OK;
}
NS_IMETHODIMP
@ -240,6 +255,27 @@ nsDOMMouseEvent::GetButton(PRUint16* aButton)
return NS_OK;
}
NS_IMETHODIMP
nsDOMMouseEvent::GetButtons(PRUint16* aButtons)
{
NS_ENSURE_ARG_POINTER(aButtons);
switch(mEvent->eventStructType)
{
case NS_MOUSE_EVENT:
case NS_MOUSE_SCROLL_EVENT:
case NS_DRAG_EVENT:
case NS_SIMPLE_GESTURE_EVENT:
case NS_MOZTOUCH_EVENT:
*aButtons = static_cast<nsMouseEvent_base*>(mEvent)->buttons;
break;
default:
MOZ_NOT_REACHED("Tried to get mouse buttons for non-mouse event!");
*aButtons = 0;
break;
}
return NS_OK;
}
NS_IMETHODIMP
nsDOMMouseEvent::GetRelatedTarget(nsIDOMEventTarget** aRelatedTarget)
{

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

@ -2009,6 +2009,7 @@ nsEventStateManager::BeginTrackingDragGesture(nsPresContext* aPresContext,
mGestureDownAlt = inDownEvent->isAlt;
mGestureDownMeta = inDownEvent->isMeta;
mGestureModifiers = inDownEvent->modifiers;
mGestureDownButtons = inDownEvent->buttons;
if (mClickHoldContextMenu) {
// fire off a timer to track click-hold
@ -2046,6 +2047,7 @@ nsEventStateManager::FillInEventFromGestureDown(nsMouseEvent* aEvent)
aEvent->isAlt = mGestureDownAlt;
aEvent->isMeta = mGestureDownMeta;
aEvent->modifiers = mGestureModifiers;
aEvent->buttons = mGestureDownButtons;
}
//
@ -2580,6 +2582,7 @@ nsEventStateManager::SendLineScrollEvent(nsIFrame* aTargetFrame,
event.isAlt = aEvent->isAlt;
event.isMeta = aEvent->isMeta;
event.modifiers = aEvent->modifiers;
event.buttons = aEvent->buttons;
event.scrollFlags = aEvent->scrollFlags;
event.delta = aNumLines;
event.inputSource = static_cast<nsMouseEvent_base*>(aEvent)->inputSource;
@ -2616,6 +2619,7 @@ nsEventStateManager::SendPixelScrollEvent(nsIFrame* aTargetFrame,
event.isAlt = aEvent->isAlt;
event.isMeta = aEvent->isMeta;
event.modifiers = aEvent->modifiers;
event.buttons = aEvent->buttons;
event.scrollFlags = aEvent->scrollFlags;
event.inputSource = static_cast<nsMouseEvent_base*>(aEvent)->inputSource;
event.delta = aPresContext->AppUnitsToIntCSSPixels(aEvent->delta * lineHeight);
@ -3416,6 +3420,7 @@ nsEventStateManager::PostHandleEvent(nsPresContext* aPresContext,
event.isAlt = mouseEvent->isAlt;
event.isMeta = mouseEvent->isMeta;
event.modifiers = mouseEvent->modifiers;
event.buttons = mouseEvent->buttons;
event.inputSource = mouseEvent->inputSource;
nsEventStatus status = nsEventStatus_eIgnore;
@ -3842,6 +3847,7 @@ nsEventStateManager::DispatchMouseEvent(nsGUIEvent* aEvent, PRUint32 aMessage,
event.isAlt = ((nsMouseEvent*)aEvent)->isAlt;
event.isMeta = ((nsMouseEvent*)aEvent)->isMeta;
event.modifiers = ((nsMouseEvent*)aEvent)->modifiers;
event.buttons = ((nsMouseEvent*)aEvent)->buttons;
event.pluginEvent = ((nsMouseEvent*)aEvent)->pluginEvent;
event.relatedTarget = aRelatedContent;
event.inputSource = static_cast<nsMouseEvent*>(aEvent)->inputSource;
@ -4256,6 +4262,7 @@ nsEventStateManager::FireDragEnterOrExit(nsPresContext* aPresContext,
event.isAlt = ((nsMouseEvent*)aEvent)->isAlt;
event.isMeta = ((nsMouseEvent*)aEvent)->isMeta;
event.modifiers = ((nsMouseEvent*)aEvent)->modifiers;
event.buttons = ((nsMouseEvent*)aEvent)->buttons;
event.relatedTarget = aRelatedTarget;
event.inputSource = static_cast<nsMouseEvent*>(aEvent)->inputSource;
@ -4419,6 +4426,7 @@ nsEventStateManager::CheckForAndDispatchClick(nsPresContext* aPresContext,
event.isAlt = aEvent->isAlt;
event.isMeta = aEvent->isMeta;
event.modifiers = aEvent->modifiers;
event.buttons = aEvent->buttons;
event.time = aEvent->time;
event.flags |= flags;
event.button = aEvent->button;
@ -4441,6 +4449,7 @@ nsEventStateManager::CheckForAndDispatchClick(nsPresContext* aPresContext,
event2.isAlt = aEvent->isAlt;
event2.isMeta = aEvent->isMeta;
event2.modifiers = aEvent->modifiers;
event2.buttons = aEvent->buttons;
event2.flags |= flags;
event2.button = aEvent->button;
event2.inputSource = aEvent->inputSource;
@ -5044,6 +5053,7 @@ nsEventStateManager::DoQueryScrollTargetInfo(nsQueryContentEvent* aEvent,
msEvent.isAlt = aEvent->mInput.mMouseScrollEvent->isAlt;
msEvent.isMeta = aEvent->mInput.mMouseScrollEvent->isMeta;
msEvent.modifiers = aEvent->mInput.mMouseScrollEvent->modifiers;
msEvent.buttons = aEvent->mInput.mMouseScrollEvent->buttons;
msEvent.scrollFlags = aEvent->mInput.mMouseScrollEvent->scrollFlags;
msEvent.delta = ComputeWheelDeltaFor(aEvent->mInput.mMouseScrollEvent);

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

@ -511,6 +511,7 @@ private:
bool mGestureDownAlt;
bool mGestureDownMeta;
mozilla::widget::Modifiers mGestureModifiers;
PRUint16 mGestureDownButtons;
nsCOMPtr<nsIContent> mLastLeftMouseDownContent;
nsCOMPtr<nsIContent> mLastLeftMouseDownContentParent;

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

@ -395,6 +395,7 @@ var mouseEventProps =
{ altKey: false },
{ metaKey: false },
{ button: 0 },
{ buttons: 0 },
{ relatedTarget: null }
];
@ -409,6 +410,7 @@ var testProps =
{ altKey: true },
{ metaKey: true },
{ button: 5 },
{ buttons: 6 },
{ relatedTarget: window }
];

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

@ -40,7 +40,7 @@
interface nsIDOMDataTransfer;
[scriptable, uuid(74fb5f01-e473-4302-93f5-6f74bdaaddf2)]
[scriptable, uuid(54cbd977-dae1-41ae-a155-a5ee5a5c6985)]
interface nsIDOMDragEvent : nsIDOMMouseEvent
{
readonly attribute nsIDOMDataTransfer dataTransfer;

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

@ -48,7 +48,7 @@
* http://www.w3.org/TR/DOM-Level-2-Events/
*/
[scriptable, uuid(53E29996-F851-4032-B896-8AAFBD0BDF25)]
[scriptable, uuid(8de83489-863a-4377-8ce4-f1965c23b8c7)]
interface nsIDOMMouseEvent : nsIDOMUIEvent
{
readonly attribute long screenX;
@ -66,6 +66,7 @@ interface nsIDOMMouseEvent : nsIDOMUIEvent
readonly attribute boolean metaKey;
readonly attribute unsigned short button;
readonly attribute unsigned short buttons;
readonly attribute nsIDOMEventTarget relatedTarget;
void initMouseEvent(in DOMString typeArg,
@ -128,6 +129,6 @@ dictionary MouseEventInit : UIEventInit
boolean altKey;
boolean metaKey;
unsigned short button;
// unsigned short buttons; is not supported yet.
unsigned short buttons;
nsIDOMEventTarget relatedTarget;
};

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

@ -38,7 +38,7 @@
#include "nsIDOMMouseEvent.idl"
[scriptable, uuid(159f24b9-2058-40b9-b5bc-6477d192955a)]
[scriptable, uuid(E9CF55A5-0436-4F8B-91B6-7C14115B5033)]
interface nsIDOMMouseScrollEvent : nsIDOMMouseEvent
{
const long HORIZONTAL_AXIS = 1;

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

@ -40,7 +40,7 @@
#include "nsIDOMMouseEvent.idl"
[scriptable, uuid(268da07b-4c41-4deb-96a2-10985644e6b0)]
[scriptable, uuid(0830197e-952c-4413-be83-a94e08f4f321)]
interface nsIDOMMozTouchEvent : nsIDOMMouseEvent
{
readonly attribute unsigned long streamId;

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

@ -97,7 +97,7 @@
* consuming events.
*/
[scriptable, uuid(e9bdcc53-1bc0-4cae-9eb3-b215b6be7f70)]
[scriptable, uuid(3aa7b4e8-b7a2-4e42-963d-b6d157eac1cd)]
interface nsIDOMSimpleGestureEvent : nsIDOMMouseEvent
{
/* Swipe direction constants */

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

@ -863,14 +863,15 @@ public:
}
nsMouseEvent_base(bool isTrusted, PRUint32 msg, nsIWidget *w, PRUint8 type)
: nsInputEvent(isTrusted, msg, w, type), button(0), modifiers(0),
pressure(0), inputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE) {}
: nsInputEvent(isTrusted, msg, w, type), button(0), buttons(0),
modifiers(0), pressure(0),
inputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE) {}
/// The possible related target
nsCOMPtr<nsISupports> relatedTarget;
PRInt16 button;
PRInt16 buttons;
mozilla::widget::Modifiers modifiers;
// Finger or touch pressure of event
@ -889,6 +890,15 @@ private:
public:
enum buttonType { eLeftButton = 0, eMiddleButton = 1, eRightButton = 2 };
enum buttonsFlag { eLeftButtonFlag = 0x01,
eRightButtonFlag = 0x02,
eMiddleButtonFlag = 0x04,
// typicall, "back" button being left side of 5-button
// mice, see "buttons" attribute document of DOM3 Events.
e4thButtonFlag = 0x08,
// typicall, "forward" button being right side of 5-button
// mice, see "buttons" attribute document of DOM3 Events.
e5thButtonFlag = 0x10 };
enum reasonType { eReal, eSynthesized };
enum contextType { eNormal, eContextMenuKey };
enum exitType { eChild, eTopLevel };

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

@ -118,6 +118,7 @@ struct ParamTraits<nsMouseEvent_base>
{
WriteParam(aMsg, static_cast<nsInputEvent>(aParam));
WriteParam(aMsg, aParam.button);
WriteParam(aMsg, aParam.buttons);
WriteParam(aMsg, aParam.modifiers);
WriteParam(aMsg, aParam.pressure);
WriteParam(aMsg, aParam.inputSource);
@ -127,6 +128,7 @@ struct ParamTraits<nsMouseEvent_base>
{
return ReadParam(aMsg, aIter, static_cast<nsInputEvent*>(aResult)) &&
ReadParam(aMsg, aIter, &aResult->button) &&
ReadParam(aMsg, aIter, &aResult->buttons) &&
ReadParam(aMsg, aIter, &aResult->modifiers) &&
ReadParam(aMsg, aIter, &aResult->pressure) &&
ReadParam(aMsg, aIter, &aResult->inputSource);