diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-06 14:44:00 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-01-06 14:44:00 +0100 |
commit | 40736c5763bf61337c8c14e16d8587db021a87d4 (patch) | |
tree | b17a9c00042ad89cb1308e2484491799aa14e9f8 /Source/WebCore/page/SpatialNavigation.h | |
download | qtwebkit-40736c5763bf61337c8c14e16d8587db021a87d4.tar.gz |
Imported WebKit commit 2ea9d364d0f6efa8fa64acf19f451504c59be0e4 (http://svn.webkit.org/repository/webkit/trunk@104285)
Diffstat (limited to 'Source/WebCore/page/SpatialNavigation.h')
-rw-r--r-- | Source/WebCore/page/SpatialNavigation.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/Source/WebCore/page/SpatialNavigation.h b/Source/WebCore/page/SpatialNavigation.h new file mode 100644 index 000000000..b5528dff9 --- /dev/null +++ b/Source/WebCore/page/SpatialNavigation.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2009 Antonio Gomes <tonikitoo@webkit.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef SpatialNavigation_h +#define SpatialNavigation_h + +#include "FocusDirection.h" +#include "HTMLFrameOwnerElement.h" +#include "LayoutTypes.h" +#include "Node.h" + +#include <limits> + +namespace WebCore { + +class Element; +class Frame; +class HTMLAreaElement; +class IntRect; +class RenderObject; + +using namespace std; + +inline long long maxDistance() +{ + return numeric_limits<long long>::max(); +} + +inline int fudgeFactor() +{ + return 2; +} + +bool isSpatialNavigationEnabled(const Frame*); + +// Spatially speaking, two given elements in a web page can be: +// 1) Fully aligned: There is a full intersection between the rects, either +// vertically or horizontally. +// +// * Horizontally * Vertically +// _ +// |_| _ _ _ _ _ _ +// |_|...... _ |_|_|_|_|_|_| +// |_| |_| . . +// |_|......|_| OR . . +// |_| |_| . . +// |_|......|_| _ _ _ _ +// |_| |_|_|_|_| +// +// +// 2) Partially aligned: There is a partial intersection between the rects, either +// vertically or horizontally. +// +// * Horizontally * Vertically +// _ _ _ _ _ _ +// |_| |_|_|_|_|_| +// |_|.... _ OR . . +// |_| |_| . . +// |_|....|_| ._._ _ +// |_| |_|_|_| +// |_| +// +// 3) Or, otherwise, not aligned at all. +// +// * Horizontally * Vertically +// _ _ _ _ _ +// |_| |_|_|_|_| +// |_| . +// |_| . +// . OR . +// _ . ._ _ _ _ _ +// |_| |_|_|_|_|_| +// |_| +// |_| +// +// "Totally Aligned" elements are preferable candidates to move +// focus to over "Partially Aligned" ones, that on its turns are +// more preferable than "Not Aligned". +enum RectsAlignment { + None = 0, + Partial, + Full +}; + +struct FocusCandidate { + FocusCandidate() + : visibleNode(0) + , focusableNode(0) + , enclosingScrollableBox(0) + , distance(maxDistance()) + , parentDistance(maxDistance()) + , alignment(None) + , parentAlignment(None) + , isOffscreen(true) + , isOffscreenAfterScrolling(true) + { + } + + FocusCandidate(Node* n, FocusDirection); + explicit FocusCandidate(HTMLAreaElement* area, FocusDirection); + bool isNull() const { return !visibleNode; } + bool inScrollableContainer() const { return visibleNode && enclosingScrollableBox; } + bool isFrameOwnerElement() const { return visibleNode && visibleNode->isFrameOwnerElement(); } + Document* document() const { return visibleNode ? visibleNode->document() : 0; } + + // We handle differently visibleNode and FocusableNode to properly handle the areas of imagemaps, + // where visibleNode would represent the image element and focusableNode would represent the area element. + // In all other cases, visibleNode and focusableNode are one and the same. + Node* visibleNode; + Node* focusableNode; + Node* enclosingScrollableBox; + long long distance; + long long parentDistance; + RectsAlignment alignment; + RectsAlignment parentAlignment; + LayoutRect rect; + bool isOffscreen; + bool isOffscreenAfterScrolling; +}; + +bool hasOffscreenRect(Node*, FocusDirection direction = FocusDirectionNone); +bool scrollInDirection(Frame*, FocusDirection); +bool scrollInDirection(Node* container, FocusDirection); +bool canScrollInDirection(const Node* container, FocusDirection); +bool canScrollInDirection(const Frame*, FocusDirection); +bool canBeScrolledIntoView(FocusDirection, const FocusCandidate&); +bool areElementsOnSameLine(const FocusCandidate& firstCandidate, const FocusCandidate& secondCandidate); +void distanceDataForNode(FocusDirection, const FocusCandidate& current, FocusCandidate& candidate); +Node* scrollableEnclosingBoxOrParentFrameForNodeInDirection(FocusDirection, Node*); +LayoutRect nodeRectInAbsoluteCoordinates(Node*, bool ignoreBorder = false); +LayoutRect frameRectInAbsoluteCoordinates(Frame*); +LayoutRect virtualRectForDirection(FocusDirection, const LayoutRect& startingRect, LayoutUnit width = 0); +LayoutRect virtualRectForAreaElementAndDirection(HTMLAreaElement*, FocusDirection); +HTMLFrameOwnerElement* frameOwnerElement(FocusCandidate&); + +} // namspace WebCore + +#endif // SpatialNavigation_h |