summaryrefslogtreecommitdiffstats
path: root/dom/xbl/nsXBLWindowKeyHandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/xbl/nsXBLWindowKeyHandler.h')
-rw-r--r--dom/xbl/nsXBLWindowKeyHandler.h132
1 files changed, 132 insertions, 0 deletions
diff --git a/dom/xbl/nsXBLWindowKeyHandler.h b/dom/xbl/nsXBLWindowKeyHandler.h
new file mode 100644
index 000000000..0509e85e4
--- /dev/null
+++ b/dom/xbl/nsXBLWindowKeyHandler.h
@@ -0,0 +1,132 @@
+/* -*- 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 nsXBLWindowKeyHandler_h__
+#define nsXBLWindowKeyHandler_h__
+
+#include "mozilla/EventForwards.h"
+#include "nsWeakPtr.h"
+#include "nsIDOMEventListener.h"
+
+class nsIAtom;
+class nsIDOMElement;
+class nsIDOMKeyEvent;
+class nsXBLSpecialDocInfo;
+class nsXBLPrototypeHandler;
+
+namespace mozilla {
+class EventListenerManager;
+namespace dom {
+class Element;
+class EventTarget;
+struct IgnoreModifierState;
+} // namespace dom
+} // namespace mozilla
+
+class nsXBLWindowKeyHandler : public nsIDOMEventListener
+{
+ typedef mozilla::dom::IgnoreModifierState IgnoreModifierState;
+ typedef mozilla::EventListenerManager EventListenerManager;
+
+public:
+ nsXBLWindowKeyHandler(nsIDOMElement* aElement, mozilla::dom::EventTarget* aTarget);
+
+ void InstallKeyboardEventListenersTo(
+ EventListenerManager* aEventListenerManager);
+ void RemoveKeyboardEventListenersFrom(
+ EventListenerManager* aEventListenerManager);
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIDOMEVENTLISTENER
+
+protected:
+ virtual ~nsXBLWindowKeyHandler();
+
+ nsresult WalkHandlers(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventType);
+
+ // walk the handlers, looking for one to handle the event
+ bool WalkHandlersInternal(nsIDOMKeyEvent* aKeyEvent,
+ nsIAtom* aEventType,
+ nsXBLPrototypeHandler* aHandler,
+ bool aExecute,
+ bool* aOutReservedForChrome = nullptr);
+
+ // walk the handlers for aEvent, aCharCode and aIgnoreModifierState. Execute
+ // it if aExecute = true.
+ bool WalkHandlersAndExecute(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventType,
+ nsXBLPrototypeHandler* aHandler,
+ uint32_t aCharCode,
+ const IgnoreModifierState& aIgnoreModifierState,
+ bool aExecute,
+ bool* aOutReservedForChrome = nullptr);
+
+ // HandleEvent function for the capturing phase in the default event group.
+ void HandleEventOnCaptureInDefaultEventGroup(nsIDOMKeyEvent* aEvent);
+ // HandleEvent function for the capturing phase in the system event group.
+ void HandleEventOnCaptureInSystemEventGroup(nsIDOMKeyEvent* aEvent);
+
+ // Check if any handler would handle the given event. Optionally returns
+ // whether the command handler for the event is marked with the "reserved"
+ // attribute.
+ bool HasHandlerForEvent(nsIDOMKeyEvent* aEvent,
+ bool* aOutReservedForChrome = nullptr);
+
+ // Returns event type for matching between aWidgetKeyboardEvent and
+ // shortcut key handlers. This is used for calling WalkHandlers(),
+ // WalkHandlersInternal() and WalkHandlersAndExecute().
+ nsIAtom* ConvertEventToDOMEventType(
+ const mozilla::WidgetKeyboardEvent& aWidgetKeyboardEvent) const;
+
+ // lazily load the handlers. Overridden to handle being attached
+ // to a particular element rather than the document
+ nsresult EnsureHandlers();
+
+ // Is an HTML editable element focused
+ bool IsHTMLEditableFieldFocused();
+
+ // Returns the element which was passed as a parameter to the constructor,
+ // unless the element has been removed from the document. Optionally returns
+ // whether the disabled attribute is set on the element (assuming the element
+ // is non-null).
+ already_AddRefed<mozilla::dom::Element> GetElement(bool* aIsDisabled = nullptr);
+
+ /**
+ * GetElementForHandler() retrieves an element for the handler. The element
+ * may be a command element or a key element.
+ *
+ * @param aHandler The handler.
+ * @param aElementForHandler Must not be nullptr. The element is returned to
+ * this.
+ * @return true if the handler is valid. Otherwise, false.
+ */
+ bool GetElementForHandler(nsXBLPrototypeHandler* aHandler,
+ mozilla::dom::Element** aElementForHandler);
+
+ /**
+ * IsExecutableElement() returns true if aElement is executable.
+ * Otherwise, false. aElement should be a command element or a key element.
+ */
+ bool IsExecutableElement(mozilla::dom::Element* aElement) const;
+
+ // Using weak pointer to the DOM Element.
+ nsWeakPtr mWeakPtrForElement;
+ mozilla::dom::EventTarget* mTarget; // weak ref
+
+ // these are not owning references; the prototype handlers are owned
+ // by the prototype bindings which are owned by the docinfo.
+ nsXBLPrototypeHandler* mHandler; // platform bindings
+ nsXBLPrototypeHandler* mUserHandler; // user-specific bindings
+
+ // holds document info about bindings
+ static nsXBLSpecialDocInfo* sXBLSpecialDocInfo;
+ static uint32_t sRefCnt;
+};
+
+already_AddRefed<nsXBLWindowKeyHandler>
+NS_NewXBLWindowKeyHandler(nsIDOMElement* aElement,
+ mozilla::dom::EventTarget* aTarget);
+
+#endif