gecko-dev/dom/xbl/nsXBLEventHandler.h
Ryan Hunt 710c2e9481 Bug 1351783 part 4 - Add a KeyboardShortcut type. r=kats,masayuki
Keyboard scrolling works by first dispatching a key event to the focused element
of the page. It is then caught by a XBL binding put on the chrome event handler of
every window. The XBL binding searches through all of its handlers to find one
that can handle the keyboard event. The matching binding has a command string
which is dispatched to the nsGlobalWindowCommands which dispatches to PresShell
which does the actual scrolling.

To do this asynchronously, we need a representation of the XBL handlers that can
be applied to a KeyboardInput to get a KeyboardAction.

This commit adds KeyboardShortcut for this purpose. KeyboardShortcut is designed
to be compatible with nsXBLPrototypeHandler and to only handle the specific cases
we care about for keyboard scrolling. If a XBL handler runs javascript or does
anything else we cannot handle in an OMT situation, then we create a
dispatch-to-content KeyboardShortcut.

MozReview-Commit-ID: 1qzywS3QHVp

--HG--
extra : rebase_source : 8ea4f85c02d04ce5e0fa6e430c44ac920269dd9f
2017-06-05 18:24:35 -05:00

120 lines
2.7 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef nsXBLEventHandler_h__
#define nsXBLEventHandler_h__
#include "mozilla/Attributes.h"
#include "nsCOMPtr.h"
#include "nsIDOMEventListener.h"
#include "nsTArray.h"
class nsIAtom;
class nsIDOMKeyEvent;
class nsXBLPrototypeHandler;
namespace mozilla {
struct IgnoreModifierState;
} // namespace mozilla
class nsXBLEventHandler : public nsIDOMEventListener
{
public:
explicit nsXBLEventHandler(nsXBLPrototypeHandler* aHandler);
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMEVENTLISTENER
protected:
virtual ~nsXBLEventHandler();
nsXBLPrototypeHandler* mProtoHandler;
private:
nsXBLEventHandler();
virtual bool EventMatched(nsIDOMEvent* aEvent)
{
return true;
}
};
class nsXBLMouseEventHandler : public nsXBLEventHandler
{
public:
explicit nsXBLMouseEventHandler(nsXBLPrototypeHandler* aHandler);
virtual ~nsXBLMouseEventHandler();
private:
bool EventMatched(nsIDOMEvent* aEvent) override;
};
class nsXBLKeyEventHandler : public nsIDOMEventListener
{
typedef mozilla::IgnoreModifierState IgnoreModifierState;
public:
nsXBLKeyEventHandler(nsIAtom* aEventType, uint8_t aPhase, uint8_t aType);
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMEVENTLISTENER
void AddProtoHandler(nsXBLPrototypeHandler* aProtoHandler)
{
mProtoHandlers.AppendElement(aProtoHandler);
}
bool Matches(nsIAtom* aEventType, uint8_t aPhase, uint8_t aType) const
{
return (mEventType == aEventType && mPhase == aPhase && mType == aType);
}
void GetEventName(nsAString& aString) const
{
mEventType->ToString(aString);
}
uint8_t GetPhase() const
{
return mPhase;
}
uint8_t GetType() const
{
return mType;
}
void SetIsBoundToChrome(bool aIsBoundToChrome)
{
mIsBoundToChrome = aIsBoundToChrome;
}
void SetUsingContentXBLScope(bool aUsingContentXBLScope)
{
mUsingContentXBLScope = aUsingContentXBLScope;
}
private:
nsXBLKeyEventHandler();
virtual ~nsXBLKeyEventHandler();
bool ExecuteMatchedHandlers(nsIDOMKeyEvent* aEvent, uint32_t aCharCode,
const IgnoreModifierState& aIgnoreModifierState);
nsTArray<nsXBLPrototypeHandler*> mProtoHandlers;
nsCOMPtr<nsIAtom> mEventType;
uint8_t mPhase;
uint8_t mType;
bool mIsBoundToChrome;
bool mUsingContentXBLScope;
};
already_AddRefed<nsXBLEventHandler>
NS_NewXBLEventHandler(nsXBLPrototypeHandler* aHandler,
nsIAtom* aEventType);
#endif