Chromium Code Reviews| Index: Source/core/page/FocusController.cpp |
| diff --git a/Source/core/page/FocusController.cpp b/Source/core/page/FocusController.cpp |
| index c8f4a75056a9cf6df2eb42042e18e2a32750d25b..acbce0fa8be01fe5a9221b8e5f7db4a5261ce1a1 100644 |
| --- a/Source/core/page/FocusController.cpp |
| +++ b/Source/core/page/FocusController.cpp |
| @@ -1,6 +1,7 @@ |
| /* |
| * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
| * Copyright (C) 2008 Nuanti Ltd. |
| + * Copyright (C) 2013 Opera Software ASA. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| @@ -57,6 +58,8 @@ |
| #include "core/page/SpatialNavigation.h" |
| #include "core/rendering/HitTestResult.h" |
| #include "core/rendering/RenderLayer.h" |
| +#include "core/rendering/RenderObject.h" |
| +#include "core/rendering/style/StyleNavigationValue.h" |
| namespace WebCore { |
| @@ -919,4 +922,80 @@ bool FocusController::advanceFocusDirectionally(FocusType type) |
| return consumed; |
| } |
| +bool FocusController::handleCSSFocusNavigation(FocusType type) |
| +{ |
| + DEFINE_STATIC_LOCAL(AtomicString, Current, ("current")); |
|
fs
2014/04/14 12:32:01
Maybe make this 'targetCurrent' or 'frameTargetCur
Krzysztof Olczyk
2014/04/17 13:48:40
Done.
|
| + DEFINE_STATIC_LOCAL(AtomicString, Root, ("root")); |
| + |
| + if (!focusedOrMainFrame()->isLocalFrame()) |
| + return false; |
| + |
| + LocalFrame* currentFrame = toLocalFrame(focusedOrMainFrame()); |
| + ASSERT(currentFrame); |
|
fs
2014/04/14 12:32:01
Already dereference focusedOrMainFrame() above.
Krzysztof Olczyk
2014/04/17 13:48:40
Done.
|
| + |
| + Document* focusedDocument = currentFrame->document(); |
| + if (!focusedDocument) |
| + return false; |
| + |
| + Element* focused = focusedDocument->focusedElement(); |
| + RenderObject* renderer = focused ? focused->renderer() : 0; |
| + if (!renderer) |
| + return false; |
| + |
| + StyleNavigationValue value; |
| + |
| + if (StyleNavigationData* navigationData = renderer->style()->navigation()) { |
| + switch (type) { |
| + case FocusTypeForward: |
| + case FocusTypeBackward: |
| + return false; |
| + case FocusTypeUp: |
| + value = navigationData->up(); |
| + break; |
| + case FocusTypeDown: |
| + value = navigationData->down(); |
| + break; |
| + case FocusTypeLeft: |
| + value = navigationData->left(); |
| + break; |
| + case FocusTypeRight: |
| + value = navigationData->right(); |
| + break; |
| + case FocusTypeNone: |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + break; |
| + } |
| + } |
| + |
| + if (value.id().isNull() || value.isAuto()) |
|
fs
2014/04/14 12:32:01
When will id() be the nullAtom?
Krzysztof Olczyk
2014/04/17 13:48:40
Done.
|
| + 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().stopAutoscroll(); |
| + |
| + if (target == Current) |
| + targetFrame = currentFrame; |
| + else if (target == Root) |
| + targetFrame = currentFrame->tree().top(); |
| + else |
| + targetFrame = currentFrame->tree().find(target); |
| + |
| + if (!targetFrame) |
| + return false; |
| + |
| + Element* targetElement = targetFrame->document()->getElementById(value.id()); |
| + |
| + if (!targetElement) |
| + return false; |
| + // If it's same with the current focused, it should be consumed. |
|
fs
2014/04/14 12:32:01
s/same with the current/the same as the currently/
Krzysztof Olczyk
2014/04/17 13:48:40
Done.
|
| + if (focused == targetElement) |
| + return true; |
| + |
| + return setFocusedElement(targetElement, targetFrame); |
| +} |
| + |
| } // namespace WebCore |