Changeset 113125 in webkit
- Timestamp:
- Apr 3, 2012 7:11:42 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r113123 r113125 1 2012-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 1 27 2012-04-03 Srikumar Bonda <srikumar.b@gmail.com> 2 28 -
trunk/Source/WebCore/page/FocusController.cpp
r112511 r113125 30 30 #include "AXObjectCache.h" 31 31 #include "Chrome.h" 32 #include "ComposedShadowTreeWalker.h" 32 33 #include "Document.h" 33 34 #include "Editor.h" … … 49 50 #include "Page.h" 50 51 #include "Range.h" 51 #include "ReifiedTreeTraversal.h"52 52 #include "RenderLayer.h" 53 53 #include "RenderObject.h" … … 70 70 { 71 71 return node && node->isElementNode() && toElement(node)->hasShadowRoot(); 72 } 73 74 static inline ComposedShadowTreeWalker walkerFrom(const Node* node) 75 { 76 return ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary); 77 } 78 79 static inline ComposedShadowTreeWalker walkerFromNext(const Node* node) 80 { 81 ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary); 82 walker.next(); 83 return walker; 84 } 85 86 static inline ComposedShadowTreeWalker walkerFromPrevious(const Node* node) 87 { 88 ComposedShadowTreeWalker walker = ComposedShadowTreeWalker(node, ComposedShadowTreeWalker::DoNotCrossUpperBoundary); 89 walker.previous(); 90 return walker; 91 } 92 93 static inline Node* nextNode(const Node* node) 94 { 95 return walkerFromNext(node).get(); 96 } 97 98 static inline Node* previousNode(const Node* node) 99 { 100 return walkerFromPrevious(node).get(); 72 101 } 73 102 … … 421 450 { 422 451 // 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(); 426 455 } 427 456 return 0; … … 433 462 int winningTabIndex = std::numeric_limits<short>::max() + 1; 434 463 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 } 440 471 441 472 return winner; … … 447 478 int winningTabIndex = 0; 448 479 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; 453 485 winningTabIndex = currentTabIndex; 454 486 } … … 463 495 // If a node is excluded from the normal tabbing cycle, the next focusable node is determined by tree order 464 496 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(); 468 500 } 469 501 } 470 502 471 503 // 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)) 473 505 return winner; 474 506 … … 491 523 Node* FocusController::previousFocusableNode(FocusScope scope, Node* start, KeyboardEvent* event) 492 524 { 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); 495 529 496 530 // First try to find the last node in the scope that comes before start and has the same tabindex as start. … … 499 533 int startingTabIndex; 500 534 if (start) { 501 startingNode = ReifiedTreeTraversal::traversePreviousNodeWithoutCrossingUpperBoundary(start);535 startingNode = previousNode(start); 502 536 startingTabIndex = adjustedTabIndex(start, event); 503 537 } else { … … 508 542 // However, if a node is excluded from the normal tabbing cycle, the previous focusable node is determined by tree order 509 543 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(); 513 547 } 514 548 }
Note: See TracChangeset
for help on using the changeset viewer.