#ifndef SpatialNavigation_h
#define SpatialNavigation_h
#include "core/dom/Node.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "core/page/FocusType.h"
#include "platform/geometry/LayoutRect.h"
#include <limits>
namespace WebCore {
class Element;
class LocalFrame;
class HTMLAreaElement;
class IntRect;
class RenderObject;
inline long long maxDistance()
{
return std::numeric_limits<long long>::max();
}
inline int fudgeFactor()
{
return 2;
}
bool isSpatialNavigationEnabled(const LocalFrame*);
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*, FocusType);
explicit FocusCandidate(HTMLAreaElement*, FocusType);
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; }
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*, FocusType = FocusTypeNone);
bool scrollInDirection(LocalFrame*, FocusType);
bool scrollInDirection(Node* container, FocusType);
bool canScrollInDirection(const Node* container, FocusType);
bool canScrollInDirection(const LocalFrame*, FocusType);
bool canBeScrolledIntoView(FocusType, const FocusCandidate&);
bool areElementsOnSameLine(const FocusCandidate& firstCandidate, const FocusCandidate& secondCandidate);
void distanceDataForNode(FocusType, const FocusCandidate& current, FocusCandidate&);
Node* scrollableEnclosingBoxOrParentFrameForNodeInDirection(FocusType, Node*);
LayoutRect nodeRectInAbsoluteCoordinates(Node*, bool ignoreBorder = false);
LayoutRect frameRectInAbsoluteCoordinates(LocalFrame*);
LayoutRect virtualRectForDirection(FocusType, const LayoutRect& startingRect, LayoutUnit width = 0);
LayoutRect virtualRectForAreaElementAndDirection(HTMLAreaElement&, FocusType);
HTMLFrameOwnerElement* frameOwnerElement(FocusCandidate&);
}
#endif