Chromium Code Reviews| Index: Source/core/page/FocusController.cpp |
| diff --git a/Source/core/page/FocusController.cpp b/Source/core/page/FocusController.cpp |
| index 2d7fb6afddee2bff35ba272707c4c6396a97cb7d..ded762d21961cdc8b886dc6d5a8de8fcfd7b3c90 100644 |
| --- a/Source/core/page/FocusController.cpp |
| +++ b/Source/core/page/FocusController.cpp |
| @@ -55,6 +55,8 @@ |
| #include "core/page/Settings.h" |
| #include "core/page/SpatialNavigation.h" |
| #include "core/rendering/HitTestResult.h" |
| +#include "core/rendering/RenderObject.h" |
| +#include "core/rendering/style/StyleNavigationValue.h" |
| namespace WebCore { |
| @@ -871,4 +873,79 @@ bool FocusController::advanceFocusDirectionally(FocusDirection direction) |
| return consumed; |
| } |
| +bool FocusController::handleCSSFocusNavigation(FocusDirection direction) |
| +{ |
| + DEFINE_STATIC_LOCAL(AtomicString, Current, ("current")); |
| + DEFINE_STATIC_LOCAL(AtomicString, Root, ("root")); |
| + |
| + Frame* currentFrame = focusedOrMainFrame(); |
| + ASSERT(currentFrame); |
| + |
| + Document* focusedDocument = currentFrame->document(); |
| + if (!focusedDocument) |
| + return false; |
| + |
| + Element* focused = focusedDocument->focusedElement(); |
| + RenderObject* renderer = focused ? focused->renderer() : 0; |
| + if (!renderer) |
| + return false; |
| + |
| + StyleNavigationValue value; |
| + switch (direction) { |
| + case FocusDirectionForward: |
| + case FocusDirectionBackward: |
| + return false; |
| + case FocusDirectionUp: |
| + value = renderer->style()->navUp(); |
| + break; |
| + case FocusDirectionDown: |
| + value = renderer->style()->navDown(); |
| + break; |
| + case FocusDirectionLeft: |
| + value = renderer->style()->navLeft(); |
| + break; |
| + case FocusDirectionRight: |
| + value = renderer->style()->navRight(); |
| + break; |
| + case FocusDirectionNone: |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + break; |
| + } |
| + |
| + if (value.id().isNull() || value.isAuto()) |
| + return false; |
| + |
| + const AtomicString& target = value.target(); |
| + Frame* targetFrame = 0; |
| + |
| + // If we were in the autoscroll/panScroll mode we want to stop it. |
| + currentFrame->eventHandler()->stopAutoscrollTimer(); |
| + |
| + if (target == Current) |
| + targetFrame = currentFrame; |
| + else if (target == Root) |
| + targetFrame = currentFrame->tree()->top(); |
| + else |
| + targetFrame = currentFrame->tree()->find(target); |
| + |
| + if (!targetFrame) |
| + return false; |
| + |
| + Element* anchor = targetFrame->document()->findAnchor(value.id().string()); |
|
esprehn
2013/08/08 03:39:40
The spec doesn't seem to say we should find elemen
Krzysztof Olczyk
2013/12/04 13:56:50
Done.
|
| + if (!anchor) |
| + return false; |
| + // If it's same with the current focused, it should be consumed. |
| + if (focused == anchor) |
| + return true; |
| + |
| + anchor->scrollIntoViewIfNeeded(false); |
|
esprehn
2013/08/08 03:39:40
you shouldn't have to do this manually, doesn't th
Krzysztof Olczyk
2013/12/04 13:56:50
Done.
|
| + |
| + bool successfullyFocused = setFocusedElement(anchor, targetFrame); |
| + if (successfullyFocused) |
| + m_page->chrome().focusedNodeChanged(anchor); |
|
esprehn
2013/08/08 03:39:40
This is done inside Document::setFocusedElement, I
Krzysztof Olczyk
2013/12/04 13:56:50
Done.
|
| + |
| + return true; |
| +} |
| + |
| } // namespace WebCore |