Bug 1256589 part.5 Add DefaultPrevented() and DefaultPreventedByContent() to WidgetEvent r=smaug
MozReview-Commit-ID: 5q3QUPTf12Z
--- a/dom/events/Event.cpp
+++ b/dom/events/Event.cpp
@@ -1045,24 +1045,24 @@ Event::GetEventName(EventMessage aEventT
bool
Event::DefaultPrevented(JSContext* aCx) const
{
MOZ_ASSERT(aCx, "JS context must be specified");
NS_ENSURE_TRUE(mEvent, false);
// If preventDefault() has never been called, just return false.
- if (!mEvent->mFlags.mDefaultPrevented) {
+ if (!mEvent->DefaultPrevented()) {
return false;
}
// If preventDefault() has been called by content, return true. Otherwise,
// i.e., preventDefault() has been called by chrome, return true only when
// this is called by chrome.
- return mEvent->mFlags.mDefaultPreventedByContent || IsChrome(aCx);
+ return mEvent->DefaultPreventedByContent() || IsChrome(aCx);
}
double
Event::TimeStamp() const
{
if (!sReturnHighResTimeStamp) {
return static_cast<double>(mEvent->time);
}
--- a/dom/events/Event.h
+++ b/dom/events/Event.h
@@ -182,17 +182,17 @@ public:
// You MUST NOT call DefaultPrevented(JSContext*) from C++ code. This may
// return false even if PreventDefault() has been called.
// See comments in its implementation for the detail.
bool DefaultPrevented(JSContext* aCx) const;
bool DefaultPrevented() const
{
- return mEvent->mFlags.mDefaultPrevented;
+ return mEvent->DefaultPrevented();
}
bool MultipleActionsPrevented() const
{
return mEvent->mFlags.mMultipleActionsPrevented;
}
bool IsTrusted() const
--- a/dom/events/EventListenerManager.cpp
+++ b/dom/events/EventListenerManager.cpp
@@ -1185,17 +1185,17 @@ EventListenerManager::GetDocShellForTarg
void
EventListenerManager::HandleEventInternal(nsPresContext* aPresContext,
WidgetEvent* aEvent,
nsIDOMEvent** aDOMEvent,
EventTarget* aCurrentTarget,
nsEventStatus* aEventStatus)
{
//Set the value of the internal PreventDefault flag properly based on aEventStatus
- if (!aEvent->mFlags.mDefaultPrevented &&
+ if (!aEvent->DefaultPrevented() &&
*aEventStatus == nsEventStatus_eConsumeNoDefault) {
// Assume that if only aEventStatus claims that the event has already been
// consumed, the consumer is default event handler.
aEvent->PreventDefault();
}
Maybe<nsAutoPopupStatePusher> popupStatePusher;
if (mIsMainThreadELM) {
@@ -1304,17 +1304,17 @@ EventListenerManager::HandleEventInterna
aEvent->currentTarget = nullptr;
if (mIsMainThreadELM && !hasListener) {
mNoListenerForEvent = aEvent->mMessage;
mNoListenerForEventAtom = aEvent->userType;
}
- if (aEvent->mFlags.mDefaultPrevented) {
+ if (aEvent->DefaultPrevented()) {
*aEventStatus = nsEventStatus_eConsumeNoDefault;
}
}
void
EventListenerManager::Disconnect()
{
mTarget = nullptr;
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -2220,17 +2220,17 @@ EventStateManager::DispatchLegacyMouseSc
// 1. Vertical scroll
// 2. Vertical pixel scroll (even if #1 isn't consumed)
// 3. Horizontal scroll (even if #1 and/or #2 are consumed)
// 4. Horizontal pixel scroll (even if #3 isn't consumed)
nsWeakFrame targetFrame(aTargetFrame);
MOZ_ASSERT(*aStatus != nsEventStatus_eConsumeNoDefault &&
- !aEvent->mFlags.mDefaultPrevented,
+ !aEvent->DefaultPrevented(),
"If you make legacy events dispatched for default prevented wheel "
"event, you need to initialize stateX and stateY");
EventState stateX, stateY;
if (scrollDeltaY) {
SendLineScrollEvent(aTargetFrame, aEvent, stateY,
scrollDeltaY, DELTA_DIRECTION_Y);
if (!targetFrame.IsAlive()) {
*aStatus = nsEventStatus_eConsumeNoDefault;
@@ -2306,18 +2306,18 @@ EventStateManager::SendLineScrollEvent(n
event.isHorizontal = (aDeltaDirection == DELTA_DIRECTION_X);
event.delta = aDelta;
event.inputSource = aEvent->inputSource;
nsEventStatus status = nsEventStatus_eIgnore;
EventDispatcher::Dispatch(targetContent, aTargetFrame->PresContext(),
&event, nullptr, &status);
aState.mDefaultPrevented =
- event.mFlags.mDefaultPrevented || status == nsEventStatus_eConsumeNoDefault;
- aState.mDefaultPreventedByContent = event.mFlags.mDefaultPreventedByContent;
+ event.DefaultPrevented() || status == nsEventStatus_eConsumeNoDefault;
+ aState.mDefaultPreventedByContent = event.DefaultPreventedByContent();
}
void
EventStateManager::SendPixelScrollEvent(nsIFrame* aTargetFrame,
WidgetWheelEvent* aEvent,
EventState& aState,
int32_t aPixelDelta,
DeltaDirection aDeltaDirection)
@@ -2346,18 +2346,18 @@ EventStateManager::SendPixelScrollEvent(
event.isHorizontal = (aDeltaDirection == DELTA_DIRECTION_X);
event.delta = aPixelDelta;
event.inputSource = aEvent->inputSource;
nsEventStatus status = nsEventStatus_eIgnore;
EventDispatcher::Dispatch(targetContent, aTargetFrame->PresContext(),
&event, nullptr, &status);
aState.mDefaultPrevented =
- event.mFlags.mDefaultPrevented || status == nsEventStatus_eConsumeNoDefault;
- aState.mDefaultPreventedByContent = event.mFlags.mDefaultPreventedByContent;
+ event.DefaultPrevented() || status == nsEventStatus_eConsumeNoDefault;
+ aState.mDefaultPreventedByContent = event.DefaultPreventedByContent();
}
nsIFrame*
EventStateManager::ComputeScrollTarget(nsIFrame* aTargetFrame,
WidgetWheelEvent* aEvent,
ComputeScrollTargetOptions aOptions)
{
return ComputeScrollTarget(aTargetFrame, aEvent->deltaX, aEvent->deltaY,
--- a/dom/events/IMEContentObserver.cpp
+++ b/dom/events/IMEContentObserver.cpp
@@ -752,17 +752,17 @@ IMEContentObserver::HandleQueryContentEv
bool
IMEContentObserver::OnMouseButtonEvent(nsPresContext* aPresContext,
WidgetMouseEvent* aMouseEvent)
{
if (!mUpdatePreference.WantMouseButtonEventOnChar()) {
return false;
}
if (!aMouseEvent->mFlags.mIsTrusted ||
- aMouseEvent->mFlags.mDefaultPrevented ||
+ aMouseEvent->DefaultPrevented() ||
!aMouseEvent->widget) {
return false;
}
// Now, we need to notify only mouse down and mouse up event.
switch (aMouseEvent->mMessage) {
case eMouseUp:
case eMouseDown:
break;
--- a/dom/html/HTMLInputElement.cpp
+++ b/dom/html/HTMLInputElement.cpp
@@ -3694,17 +3694,17 @@ HTMLInputElement::MaybeInitPickers(Event
{
// Open a file picker when we receive a click on a <input type='file'>, or
// open a color picker when we receive a click on a <input type='color'>.
// A click is handled in the following cases:
// - preventDefault() has not been called (or something similar);
// - it's the left mouse button.
// We do not prevent non-trusted click because authors can already use
// .click(). However, the pickers will follow the rules of popup-blocking.
- if (aVisitor.mEvent->mFlags.mDefaultPrevented) {
+ if (aVisitor.mEvent->DefaultPrevented()) {
return NS_OK;
}
WidgetMouseEvent* mouseEvent = aVisitor.mEvent->AsMouseEvent();
if (!(mouseEvent && mouseEvent->IsLeftClickEvent())) {
return NS_OK;
}
if (mType == NS_FORM_INPUT_FILE) {
// If the user clicked on the "Choose folder..." button we open the
@@ -3885,17 +3885,17 @@ HTMLInputElement::PostHandleEvent(EventC
// control and as a result aVisitor.mEventStatus will already have been
// set to nsEventStatus_eConsumeNoDefault. However, we know that
// whenever the up/down arrow keys cause the value of the number
// control to change the string in the text control will change, and
// the cursor will be moved to the end of the text control, overwriting
// the editor's handling of up/down keypress events. For that reason we
// just ignore aVisitor.mEventStatus here and go ahead and handle the
// event to increase/decrease the value of the number control.
- if (!aVisitor.mEvent->mFlags.mDefaultPreventedByContent && IsMutable()) {
+ if (!aVisitor.mEvent->DefaultPreventedByContent() && IsMutable()) {
StepNumberControlForUserEvent(keyEvent->keyCode == NS_VK_UP ? 1 : -1);
aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault;
}
} else if (nsEventStatus_eIgnore == aVisitor.mEventStatus) {
switch (aVisitor.mEvent->mMessage) {
case eFocus: {
// see if we should select the contents of the textbox. This happens
// for text and password fields when the field was focused by the
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -2134,17 +2134,17 @@ TabParent::RecvDispatchAfterKeyboardEven
nsIDocument* doc = mFrameElement->OwnerDoc();
nsCOMPtr<nsIPresShell> presShell = doc->GetShell();
NS_ENSURE_TRUE(presShell, true);
if (mFrameElement &&
PresShell::BeforeAfterKeyboardEventEnabled() &&
localEvent.mMessage != eKeyPress) {
presShell->DispatchAfterKeyboardEvent(mFrameElement, localEvent,
- aEvent.mFlags.mDefaultPrevented);
+ aEvent.DefaultPrevented());
}
return true;
}
bool
TabParent::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent)
{
--- a/gfx/layers/apz/util/APZEventState.cpp
+++ b/gfx/layers/apz/util/APZEventState.cpp
@@ -334,18 +334,17 @@ APZEventState::ProcessTouchEvent(const W
void
APZEventState::ProcessWheelEvent(const WidgetWheelEvent& aEvent,
const ScrollableLayerGuid& aGuid,
uint64_t aInputBlockId)
{
// If this event starts a swipe, indicate that it shouldn't result in a
// scroll by setting defaultPrevented to true.
- bool defaultPrevented =
- aEvent.mFlags.mDefaultPrevented || aEvent.TriggersSwipe();
+ bool defaultPrevented = aEvent.DefaultPrevented() || aEvent.TriggersSwipe();
mContentReceivedInputBlockCallback(aGuid, aInputBlockId, defaultPrevented);
}
void
APZEventState::ProcessMouseEvent(const WidgetMouseEvent& aEvent,
const ScrollableLayerGuid& aGuid,
uint64_t aInputBlockId)
{
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -1138,18 +1138,17 @@ nsDocumentViewer::PermitUnloadInternal(b
nsCOMPtr<nsIDocShell> docShell(mContainer);
nsAutoString text;
beforeUnload->GetReturnValue(text);
// NB: we nullcheck mDocument because it might now be dead as a result of
// the event being dispatched.
if (!sIsBeforeUnloadDisabled && *aShouldPrompt && dialogsAreEnabled && mDocument &&
(!sBeforeUnloadRequiresInteraction || mDocument->UserHasInteracted()) &&
- (event->WidgetEventPtr()->mFlags.mDefaultPrevented ||
- !text.IsEmpty())) {
+ (event->WidgetEventPtr()->DefaultPrevented() || !text.IsEmpty())) {
// Ask the user if it's ok to unload the current page
nsCOMPtr<nsIPrompt> prompt = do_GetInterface(docShell);
if (prompt) {
nsCOMPtr<nsIWritablePropertyBag2> promptBag = do_QueryInterface(prompt);
if (promptBag) {
bool isTabModalPromptAllowed;
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -6966,17 +6966,17 @@ PresShell::DispatchBeforeKeyboardEventIn
}
aChainIndex = i;
InternalBeforeAfterKeyboardEvent beforeEvent(aEvent.mFlags.mIsTrusted,
message, aEvent.widget);
beforeEvent.AssignBeforeAfterKeyEventData(aEvent, false);
EventDispatcher::Dispatch(eventTarget, mPresContext, &beforeEvent);
- if (beforeEvent.mFlags.mDefaultPrevented) {
+ if (beforeEvent.DefaultPrevented()) {
aDefaultPrevented = true;
return;
}
}
}
void
PresShell::DispatchAfterKeyboardEventInternal(const nsTArray<nsCOMPtr<Element> >& aChain,
@@ -7000,17 +7000,17 @@ PresShell::DispatchAfterKeyboardEventInt
return;
}
InternalBeforeAfterKeyboardEvent afterEvent(aEvent.mFlags.mIsTrusted,
message, aEvent.widget);
afterEvent.AssignBeforeAfterKeyEventData(aEvent, false);
afterEvent.mEmbeddedCancelled.SetValue(embeddedCancelled);
EventDispatcher::Dispatch(eventTarget, mPresContext, &afterEvent);
- embeddedCancelled = afterEvent.mFlags.mDefaultPrevented;
+ embeddedCancelled = afterEvent.DefaultPrevented();
}
}
void
PresShell::DispatchAfterKeyboardEvent(nsINode* aTarget,
const WidgetKeyboardEvent& aEvent,
bool aEmbeddedCancelled)
{
@@ -7085,33 +7085,32 @@ PresShell::HandleKeyboardEvent(nsINode*
if (!CanDispatchEvent()) {
return;
}
// Dispatch actual key event to event target.
EventDispatcher::Dispatch(aTarget, mPresContext,
&aEvent, nullptr, aStatus, aEventCB);
- if (aEvent.mFlags.mDefaultPrevented) {
+ if (aEvent.DefaultPrevented()) {
// When embedder prevents the default action of actual key event, attribute
// 'embeddedCancelled' of after event is false, i.e. |!targetIsIframe|.
// On the contrary, if the defult action is prevented by embedded iframe,
// 'embeddedCancelled' is true which equals to |!targetIsIframe|.
DispatchAfterKeyboardEventInternal(chain, aEvent, !targetIsIframe, chainIndex);
return;
}
// Event listeners may kill nsPresContext and nsPresShell.
if (targetIsIframe || !CanDispatchEvent()) {
return;
}
// Dispatch after events to all items in the chain.
- DispatchAfterKeyboardEventInternal(chain, aEvent,
- aEvent.mFlags.mDefaultPrevented);
+ DispatchAfterKeyboardEventInternal(chain, aEvent, aEvent.DefaultPrevented());
}
nsresult
PresShell::HandleEvent(nsIFrame* aFrame,
WidgetGUIEvent* aEvent,
bool aDontRetargetEvents,
nsEventStatus* aEventStatus,
nsIContent** aTargetContent)
--- a/layout/forms/nsListControlFrame.cpp
+++ b/layout/forms/nsListControlFrame.cpp
@@ -2246,17 +2246,17 @@ nsListControlFrame::KeyPress(nsIDOMEvent
aKeyEvent->WidgetEventPtr()->AsKeyboardEvent();
MOZ_ASSERT(keyEvent,
"DOM event must have WidgetKeyboardEvent for its internal event");
// Select option with this as the first character
// XXX Not I18N compliant
// Don't do incremental search if the key event has already consumed.
- if (keyEvent->mFlags.mDefaultPrevented) {
+ if (keyEvent->DefaultPrevented()) {
return NS_OK;
}
if (keyEvent->IsAlt()) {
return NS_OK;
}
// With some keyboard layout, space key causes non-ASCII space.
--- a/layout/generic/nsPluginFrame.cpp
+++ b/layout/generic/nsPluginFrame.cpp
@@ -1707,17 +1707,17 @@ nsPluginFrame::HandleEvent(nsPresContext
return rv;
}
void
nsPluginFrame::HandleWheelEventAsDefaultAction(WidgetWheelEvent* aWheelEvent)
{
MOZ_ASSERT(WantsToHandleWheelEventAsDefaultAction());
- MOZ_ASSERT(!aWheelEvent->mFlags.mDefaultPrevented);
+ MOZ_ASSERT(!aWheelEvent->DefaultPrevented());
if (NS_WARN_IF(!mInstanceOwner) ||
NS_WARN_IF(aWheelEvent->mMessage != eWheel)) {
return;
}
// If the wheel event has native message, it should may be handled by
// HandleEvent() in the future. In such case, we should do nothing here.
--- a/widget/BasicEvents.h
+++ b/widget/BasicEvents.h
@@ -159,16 +159,25 @@ public:
mDefaultPreventedByContent = true;
}
}
// This should be used only before dispatching events into the DOM tree.
inline void PreventDefaultBeforeDispatch()
{
mDefaultPrevented = true;
}
+ inline bool DefaultPrevented() const
+ {
+ return mDefaultPrevented;
+ }
+ inline bool DefaultPreventedByContent() const
+ {
+ MOZ_ASSERT(!mDefaultPreventedByContent || DefaultPrevented());
+ return mDefaultPreventedByContent;
+ }
inline void Clear()
{
SetRawFlags(0);
}
// Get if either the instance's bit or the aOther's bit is true, the
// instance's bit becomes true. In other words, this works like:
// eventFlags |= aOther;
@@ -349,16 +358,21 @@ public:
void StopPropagation() { mFlags.StopPropagation(); }
void StopImmediatePropagation() { mFlags.StopImmediatePropagation(); }
void StopCrossProcessForwarding() { mFlags.StopCrossProcessForwarding(); }
void PreventDefault(bool aCalledByDefaultHandler = true)
{
mFlags.PreventDefault(aCalledByDefaultHandler);
}
void PreventDefaultBeforeDispatch() { mFlags.PreventDefaultBeforeDispatch(); }
+ bool DefaultPrevented() const { return mFlags.DefaultPrevented(); }
+ bool DefaultPreventedByContent() const
+ {
+ return mFlags.DefaultPreventedByContent();
+ }
/**
* Utils for checking event types
*/
/**
* As*Event() returns the pointer of the instance only when the instance is
* the class or one of its derived class.
--- a/widget/windows/KeyboardLayout.cpp
+++ b/widget/windows/KeyboardLayout.cpp
@@ -1202,18 +1202,18 @@ NativeKey::InitKeyEvent(WidgetKeyboardEv
pluginEvent.event = aMsgSentToPlugin->message;
pluginEvent.wParam = aMsgSentToPlugin->wParam;
pluginEvent.lParam = aMsgSentToPlugin->lParam;
aKeyEvent.mPluginEvent.Copy(pluginEvent);
}
KeyboardLayout::NotifyIdleServiceOfUserActivity();
- return aKeyEvent.mFlags.mDefaultPrevented ? nsEventStatus_eConsumeNoDefault :
- nsEventStatus_eIgnore;
+ return aKeyEvent.DefaultPrevented() ? nsEventStatus_eConsumeNoDefault :
+ nsEventStatus_eIgnore;
}
bool
NativeKey::DispatchCommandEvent(uint32_t aEventCommand) const
{
nsCOMPtr<nsIAtom> command;
switch (aEventCommand) {
case APPCOMMAND_BROWSER_BACKWARD: