OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
3 * Copyright (C) 2008 Nuanti Ltd. | 3 * Copyright (C) 2008 Nuanti Ltd. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 if (candidate.alignment == closest.alignment) { | 760 if (candidate.alignment == closest.alignment) { |
761 if (candidate.distance < closest.distance) | 761 if (candidate.distance < closest.distance) |
762 closest = candidate; | 762 closest = candidate; |
763 return; | 763 return; |
764 } | 764 } |
765 | 765 |
766 if (candidate.alignment > closest.alignment) | 766 if (candidate.alignment > closest.alignment) |
767 closest = candidate; | 767 closest = candidate; |
768 } | 768 } |
769 | 769 |
770 void FocusController::findFocusCandidateInContainer(Node* container, const Layou
tRect& startingRect, FocusDirection direction, FocusCandidate& closest) | 770 void FocusController::findFocusCandidateInContainer(Node& container, const Layou
tRect& startingRect, FocusDirection direction, FocusCandidate& closest) |
771 { | 771 { |
772 ASSERT(container); | |
773 Element* focusedElement = (focusedFrame() && focusedFrame()->document()) ? f
ocusedFrame()->document()->focusedElement() : 0; | 772 Element* focusedElement = (focusedFrame() && focusedFrame()->document()) ? f
ocusedFrame()->document()->focusedElement() : 0; |
774 | 773 |
775 Element* element = ElementTraversal::firstWithin(container); | 774 Element* element = ElementTraversal::firstWithin(container); |
776 FocusCandidate current; | 775 FocusCandidate current; |
777 current.rect = startingRect; | 776 current.rect = startingRect; |
778 current.focusableNode = focusedElement; | 777 current.focusableNode = focusedElement; |
779 current.visibleNode = focusedElement; | 778 current.visibleNode = focusedElement; |
780 | 779 |
781 for (; element; element = (element->isFrameOwnerElement() || canScrollInDire
ction(element, direction)) | 780 for (; element; element = (element->isFrameOwnerElement() || canScrollInDire
ction(element, direction)) |
782 ? ElementTraversal::nextSkippingChildren(element, container) | 781 ? ElementTraversal::nextSkippingChildren(element, &container) |
783 : ElementTraversal::next(*element, container)) { | 782 : ElementTraversal::next(*element, &container)) { |
784 if (element == focusedElement) | 783 if (element == focusedElement) |
785 continue; | 784 continue; |
786 | 785 |
787 if (!element->isKeyboardFocusable() && !element->isFrameOwnerElement() &
& !canScrollInDirection(element, direction)) | 786 if (!element->isKeyboardFocusable() && !element->isFrameOwnerElement() &
& !canScrollInDirection(element, direction)) |
788 continue; | 787 continue; |
789 | 788 |
790 FocusCandidate candidate = FocusCandidate(element, direction); | 789 FocusCandidate candidate = FocusCandidate(element, direction); |
791 if (candidate.isNull()) | 790 if (candidate.isNull()) |
792 continue; | 791 continue; |
793 | 792 |
794 candidate.enclosingScrollableBox = container; | 793 candidate.enclosingScrollableBox = &container; |
795 updateFocusCandidateIfNeeded(direction, current, candidate, closest); | 794 updateFocusCandidateIfNeeded(direction, current, candidate, closest); |
796 } | 795 } |
797 } | 796 } |
798 | 797 |
799 bool FocusController::advanceFocusDirectionallyInContainer(Node* container, cons
t LayoutRect& startingRect, FocusDirection direction) | 798 bool FocusController::advanceFocusDirectionallyInContainer(Node* container, cons
t LayoutRect& startingRect, FocusDirection direction) |
800 { | 799 { |
801 if (!container) | 800 if (!container) |
802 return false; | 801 return false; |
803 | 802 |
804 LayoutRect newStartingRect = startingRect; | 803 LayoutRect newStartingRect = startingRect; |
805 | 804 |
806 if (startingRect.isEmpty()) | 805 if (startingRect.isEmpty()) |
807 newStartingRect = virtualRectForDirection(direction, nodeRectInAbsoluteC
oordinates(container)); | 806 newStartingRect = virtualRectForDirection(direction, nodeRectInAbsoluteC
oordinates(container)); |
808 | 807 |
809 // Find the closest node within current container in the direction of the na
vigation. | 808 // Find the closest node within current container in the direction of the na
vigation. |
810 FocusCandidate focusCandidate; | 809 FocusCandidate focusCandidate; |
811 findFocusCandidateInContainer(container, newStartingRect, direction, focusCa
ndidate); | 810 findFocusCandidateInContainer(*container, newStartingRect, direction, focusC
andidate); |
812 | 811 |
813 if (focusCandidate.isNull()) { | 812 if (focusCandidate.isNull()) { |
814 // Nothing to focus, scroll if possible. | 813 // Nothing to focus, scroll if possible. |
815 // NOTE: If no scrolling is performed (i.e. scrollInDirection returns fa
lse), the | 814 // NOTE: If no scrolling is performed (i.e. scrollInDirection returns fa
lse), the |
816 // spatial navigation algorithm will skip this container. | 815 // spatial navigation algorithm will skip this container. |
817 return scrollInDirection(container, direction); | 816 return scrollInDirection(container, direction); |
818 } | 817 } |
819 | 818 |
820 if (HTMLFrameOwnerElement* frameElement = frameOwnerElement(focusCandidate))
{ | 819 if (HTMLFrameOwnerElement* frameElement = frameOwnerElement(focusCandidate))
{ |
821 // If we have an iframe without the src attribute, it will not have a co
ntentFrame(). | 820 // If we have an iframe without the src attribute, it will not have a co
ntentFrame(). |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
900 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); | 899 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); |
901 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct
ion, container); | 900 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct
ion, container); |
902 if (container && container->isDocumentNode()) | 901 if (container && container->isDocumentNode()) |
903 toDocument(container)->updateLayoutIgnorePendingStylesheets(); | 902 toDocument(container)->updateLayoutIgnorePendingStylesheets(); |
904 } while (!consumed && container); | 903 } while (!consumed && container); |
905 | 904 |
906 return consumed; | 905 return consumed; |
907 } | 906 } |
908 | 907 |
909 } // namespace WebCore | 908 } // namespace WebCore |
OLD | NEW |