Changeset 113125 in webkit


Ignore:
Timestamp:
Apr 3, 2012 7:11:42 PM (12 years ago)
Author:
hayato@chromium.org
Message:

Make FocusController use a ComposedShadowTreeWalker, instead of ReifiedTreeTraversal APIs.
https://bugs.webkit.org/show_bug.cgi?id=82694

Reviewed by Dimitri Glazkov.

Rewrite a focus controller so that it uses ComposedShadowTreeWalker
since that is a preferred way to traverse composed shadow tree.
I'll get rid of ReifiedTreeTraversal in follow-up patches, which is now deprecated.

No new tests. No change in functionality.

  • page/FocusController.cpp:

(WebCore::walkerFrom):
(WebCore):
(WebCore::walkerFromNext):
(WebCore::walkerFromPrevious):
(WebCore::nextNode):
(WebCore::previousNode):
(WebCore::FocusController::findNodeWithExactTabIndex):
(WebCore::nextNodeWithGreaterTabIndex):
(WebCore::previousNodeWithLowerTabIndex):
(WebCore::FocusController::nextFocusableNode):
(WebCore::FocusController::previousFocusableNode):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r113123 r113125  
     12012-04-03  Hayato Ito  <hayato@chromium.org>
     2
     3        Make FocusController use a ComposedShadowTreeWalker, instead of ReifiedTreeTraversal APIs.
     4        https://bugs.webkit.org/show_bug.cgi?id=82694
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        Rewrite a focus controller so that it uses ComposedShadowTreeWalker
     9        since that is a preferred way to traverse composed shadow tree.
     10        I'll get rid of ReifiedTreeTraversal in follow-up patches, which is now deprecated.
     11
     12        No new tests. No change in functionality.
     13
     14        * page/FocusController.cpp:
     15        (WebCore::walkerFrom):
     16        (WebCore):
     17        (WebCore::walkerFromNext):
     18        (WebCore::walkerFromPrevious):
     19        (WebCore::nextNode):
     20        (WebCore::previousNode):
     21        (WebCore::FocusController::findNodeWithExactTabIndex):
     22        (WebCore::nextNodeWithGreaterTabIndex):
     23        (WebCore::previousNodeWithLowerTabIndex):
     24        (WebCore::FocusController::nextFocusableNode):
     25        (WebCore::FocusController::previousFocusableNode):
     26
    1272012-04-03  Srikumar Bonda  <srikumar.b@gmail.com>
    228
  • trunk/Source/WebCore/page/FocusController.cpp

    r112511 r113125  
    3030#include "AXObjectCache.h"
    3131#include "Chrome.h"
     32#include "ComposedShadowTreeWalker.h"
    3233#include "Document.h"
    3334#include "Editor.h"
     
    4950#include "Page.h"
    5051#include "Range.h"
    51 #include "ReifiedTreeTraversal.h"
    5252#include "RenderLayer.h"
    5353#include "RenderObject.h"
     
    7070{
    7171    return node && node->isElementNode() && toElement(node)->hasShadowRoot();
     72}
     73
     74static inline ComposedShadowTreeWalker walkerFrom(const Node* node)
     75{
     76    return ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
     77}
     78
     79static inline ComposedShadowTreeWalker walkerFromNext(const Node* node)
     80{
     81    ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
     82    walker.next();
     83    return walker;
     84}
     85
     86static inline ComposedShadowTreeWalker walkerFromPrevious(const Node* node)
     87{
     88    ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary);
     89    walker.previous();
     90    return walker;
     91}
     92
     93static inline Node* nextNode(const Node* node)
     94{
     95    return walkerFromNext(node).get();
     96}
     97
     98static inline Node* previousNode(const Node* node)
     99{
     100    return walkerFromPrevious(node).get();
    72101}
    73102
     
    421450{
    422451    // Search is inclusive of start
    423     for (Node* node = start; node; node = (direction == FocusDirectionForward ? ReifiedTreeTraversal::traverseNextNodeWithoutCrossingUpperBoundary(node): ReifiedTreeTraversal::traversePreviousNodeWithoutCrossingUpperBoundary(node))) {
    424         if (shouldVisit(node, event) && adjustedTabIndex(node, event) == tabIndex)
    425             return node;
     452    for (ComposedShadowTreeWalker walker = walkerFrom(start); walker.get(); direction == FocusDirectionForward ? walker.next() : walker.previous()) {
     453        if (shouldVisit(walker.get(), event) && adjustedTabIndex(walker.get(), event) == tabIndex)
     454            return walker.get();
    426455    }
    427456    return 0;
     
    433462    int winningTabIndex = std::numeric_limits<short>::max() + 1;
    434463    Node* winner = 0;
    435     for (Node* n = start; n; n = ReifiedTreeTraversal::traverseNextNodeWithoutCrossingUpperBoundary(n))
    436         if (shouldVisit(n, event) && n->tabIndex() > tabIndex && n->tabIndex() < winningTabIndex) {
    437             winner = n;
    438             winningTabIndex = n->tabIndex();
    439         }
     464    for (ComposedShadowTreeWalker walker = walkerFrom(start); walker.get(); walker.next()) {
     465        Node* node = walker.get();
     466        if (shouldVisit(node, event) && node->tabIndex() > tabIndex && node->tabIndex() < winningTabIndex) {
     467            winner = node;
     468            winningTabIndex = node->tabIndex();
     469        }
     470    }
    440471
    441472    return winner;
     
    447478    int winningTabIndex = 0;
    448479    Node* winner = 0;
    449     for (Node* n = start; n; n = ReifiedTreeTraversal::traversePreviousNodeWithoutCrossingUpperBoundary(n)) {
    450         int currentTabIndex = adjustedTabIndex(n, event);
    451         if ((shouldVisit(n, event) || isNonFocusableShadowHost(n, event)) && currentTabIndex < tabIndex && currentTabIndex > winningTabIndex) {
    452             winner = n;
     480    for (ComposedShadowTreeWalker walker = walkerFrom(start); walker.get(); walker.previous()) {
     481        Node* node = walker.get();
     482        int currentTabIndex = adjustedTabIndex(node, event);
     483        if ((shouldVisit(node, event) || isNonFocusableShadowHost(node, event)) && currentTabIndex < tabIndex && currentTabIndex > winningTabIndex) {
     484            winner = node;
    453485            winningTabIndex = currentTabIndex;
    454486        }
     
    463495        // If a node is excluded from the normal tabbing cycle, the next focusable node is determined by tree order
    464496        if (tabIndex < 0) {
    465             for (Node* n = ReifiedTreeTraversal::traverseNextNodeWithoutCrossingUpperBoundary(start); n; n = ReifiedTreeTraversal::traverseNextNodeWithoutCrossingUpperBoundary(n)) {
    466                 if (shouldVisit(n, event) && adjustedTabIndex(n, event) >= 0)
    467                     return n;
     497            for (ComposedShadowTreeWalker walker = walkerFromNext(start); walker.get(); walker.next()) {
     498                if (shouldVisit(walker.get(), event) && adjustedTabIndex(walker.get(), event) >= 0)
     499                    return walker.get();
    468500            }
    469501        }
    470502
    471503        // First try to find a node with the same tabindex as start that comes after start in the scope.
    472         if (Node* winner = findNodeWithExactTabIndex(ReifiedTreeTraversal::traverseNextNodeWithoutCrossingUpperBoundary(start), tabIndex, event, FocusDirectionForward))
     504        if (Node* winner = findNodeWithExactTabIndex(nextNode(start), tabIndex, event, FocusDirectionForward))
    473505            return winner;
    474506
     
    491523Node* FocusController::previousFocusableNode(FocusScope scope, Node* start, KeyboardEvent* event)
    492524{
    493     Node* last;
    494     for (last = scope.rootNode(); ReifiedTreeTraversal::lastChildWithoutCrossingUpperBoundary(last); last = ReifiedTreeTraversal::lastChildWithoutCrossingUpperBoundary(last)) { }
     525    Node* last = 0;
     526    for (ComposedShadowTreeWalker walker = walkerFrom(scope.rootNode()); walker.get(); walker.lastChild())
     527        last = walker.get();
     528    ASSERT(last);
    495529
    496530    // First try to find the last node in the scope that comes before start and has the same tabindex as start.
     
    499533    int startingTabIndex;
    500534    if (start) {
    501         startingNode = ReifiedTreeTraversal::traversePreviousNodeWithoutCrossingUpperBoundary(start);
     535        startingNode = previousNode(start);
    502536        startingTabIndex = adjustedTabIndex(start, event);
    503537    } else {
     
    508542    // However, if a node is excluded from the normal tabbing cycle, the previous focusable node is determined by tree order
    509543    if (startingTabIndex < 0) {
    510         for (Node* n = startingNode; n; n = ReifiedTreeTraversal::traversePreviousNodeWithoutCrossingUpperBoundary(n)) {
    511             if (shouldVisit(n, event) && adjustedTabIndex(n, event) >= 0)
    512                 return n;
     544        for (ComposedShadowTreeWalker walker = walkerFrom(startingNode); walker.get(); walker.previous()) {
     545            if (shouldVisit(walker.get(), event) && adjustedTabIndex(walker.get(), event) >= 0)
     546                return walker.get();
    513547        }
    514548    }
Note: See TracChangeset for help on using the changeset viewer.