/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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 nsCoreUtils_h_ #define nsCoreUtils_h_ #include "mozilla/EventForwards.h" #include "nsIContent.h" #include "nsIDocument.h" // for GetShell() #include "nsIPresShell.h" #include "nsPoint.h" #include "nsTArray.h" class nsRange; class nsIBoxObject; class nsIFrame; class nsIDocShell; class nsITreeColumn; class nsITreeBoxObject; class nsIWidget; /** * Core utils. */ class nsCoreUtils { public: /** * Return true if the given node is a label of a control. */ static bool IsLabelWithControl(nsIContent *aContent); /** * Return true if the given node has registered click, mousedown or mouseup * event listeners. */ static bool HasClickListener(nsIContent *aContent); /** * Dispatch click event to XUL tree cell. * * @param aTreeBoxObj [in] tree box object * @param aRowIndex [in] row index * @param aColumn [in] column object * @param aPseudoElm [in] pseudo elemenet inside the cell, see * nsITreeBoxObject for available values */ static void DispatchClickEvent(nsITreeBoxObject *aTreeBoxObj, int32_t aRowIndex, nsITreeColumn *aColumn, const nsAString& aPseudoElt = EmptyString()); /** * Send mouse event to the given element. * * @param aMessage [in] an event message (see EventForwards.h) * @param aX [in] x coordinate in dev pixels * @param aY [in] y coordinate in dev pixels * @param aContent [in] the element * @param aFrame [in] frame of the element * @param aPresShell [in] the presshell for the element * @param aRootWidget [in] the root widget of the element */ static void DispatchMouseEvent(mozilla::EventMessage aMessage, int32_t aX, int32_t aY, nsIContent *aContent, nsIFrame *aFrame, nsIPresShell *aPresShell, nsIWidget *aRootWidget); /** * Send a touch event with a single touch point to the given element. * * @param aMessage [in] an event message (see EventForwards.h) * @param aX [in] x coordinate in dev pixels * @param aY [in] y coordinate in dev pixels * @param aContent [in] the element * @param aFrame [in] frame of the element * @param aPresShell [in] the presshell for the element * @param aRootWidget [in] the root widget of the element */ static void DispatchTouchEvent(mozilla::EventMessage aMessage, int32_t aX, int32_t aY, nsIContent* aContent, nsIFrame* aFrame, nsIPresShell* aPresShell, nsIWidget* aRootWidget); /** * Return an accesskey registered on the given element by * EventStateManager or 0 if there is no registered accesskey. * * @param aContent - the given element. */ static uint32_t GetAccessKeyFor(nsIContent *aContent); /** * Return DOM element related with the given node, i.e. * a) itself if it is DOM element * b) parent element if it is text node * c) otherwise nullptr * * @param aNode [in] the given DOM node */ static nsIContent* GetDOMElementFor(nsIContent *aContent); /** * Return DOM node for the given DOM point. */ static nsINode *GetDOMNodeFromDOMPoint(nsINode *aNode, uint32_t aOffset); /** * Return the nsIContent* to check for ARIA attributes on -- this may not * always be the DOM node for the accessible. Specifically, for doc * accessibles, it is not the document node, but either the root element or *
in HTML. * * @param aNode [in] DOM node for the accessible that may be affected by ARIA * @return the nsIContent which may have ARIA markup */ static nsIContent* GetRoleContent(nsINode *aNode); /** * Is the first passed in node an ancestor of the second? * Note: A node is not considered to be the ancestor of itself. * * @param aPossibleAncestorNode [in] node to test for ancestor-ness of * aPossibleDescendantNode * @param aPossibleDescendantNode [in] node to test for descendant-ness of * aPossibleAncestorNode * @param aRootNode [in, optional] the root node that search * search should be performed within * @return true if aPossibleAncestorNode is an ancestor of * aPossibleDescendantNode */ static bool IsAncestorOf(nsINode *aPossibleAncestorNode, nsINode *aPossibleDescendantNode, nsINode *aRootNode = nullptr); /** * Helper method to scroll range into view, used for implementation of * nsIAccessibleText::scrollSubstringTo(). * * @param aFrame the frame for accessible the range belongs to. * @param aRange the range to scroll to * @param aScrollType the place a range should be scrolled to */ static nsresult ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange, uint32_t aScrollType); /** Helper method to scroll range into view, used for implementation of * nsIAccessibleText::scrollSubstringTo[Point](). * * @param aFrame the frame for accessible the range belongs to. * @param aRange the range to scroll to * @param aVertical how to align vertically, specified in percents, and when. * @param aHorizontal how to align horizontally, specified in percents, and when. */ static nsresult ScrollSubstringTo(nsIFrame* aFrame, nsRange* aRange, nsIPresShell::ScrollAxis aVertical, nsIPresShell::ScrollAxis aHorizontal); /** * Scrolls the given frame to the point, used for implememntation of * nsIAccessible::scrollToPoint and nsIAccessibleText::scrollSubstringToPoint. * * @param aScrollableFrame the scrollable frame * @param aFrame the frame to scroll * @param aPoint the point scroll to */ static void ScrollFrameToPoint(nsIFrame *aScrollableFrame, nsIFrame *aFrame, const nsIntPoint& aPoint); /** * Converts scroll type constant defined in nsIAccessibleScrollType to * vertical and horizontal parameters. */ static void ConvertScrollTypeToPercents(uint32_t aScrollType, nsIPresShell::ScrollAxis *aVertical, nsIPresShell::ScrollAxis *aHorizontal); /** * Returns coordinates in device pixels relative screen for the top level * window. * * @param aNode the DOM node hosted in the window. */ static nsIntPoint GetScreenCoordsForWindow(nsINode *aNode); /** * Return document shell for the given DOM node. */ static already_AddRefed