Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: Source/core/page/FocusController.cpp

Issue 69003004: Have NodeTraversal::previous*() take a reference (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/forms/RadioInputType.cpp ('k') | Source/core/rendering/RenderCounter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 Node* FocusController::findFocusableNode(FocusDirection direction, FocusNavigati onScope scope, Node* node) 461 Node* FocusController::findFocusableNode(FocusDirection direction, FocusNavigati onScope scope, Node* node)
462 { 462 {
463 return (direction == FocusDirectionForward) 463 return (direction == FocusDirectionForward)
464 ? nextFocusableNode(scope, node) 464 ? nextFocusableNode(scope, node)
465 : previousFocusableNode(scope, node); 465 : previousFocusableNode(scope, node);
466 } 466 }
467 467
468 Node* FocusController::findNodeWithExactTabIndex(Node* start, int tabIndex, Focu sDirection direction) 468 Node* FocusController::findNodeWithExactTabIndex(Node* start, int tabIndex, Focu sDirection direction)
469 { 469 {
470 // Search is inclusive of start 470 // Search is inclusive of start
471 for (Node* node = start; node; node = direction == FocusDirectionForward ? N odeTraversal::next(*node) : NodeTraversal::previous(node)) { 471 for (Node* node = start; node; node = direction == FocusDirectionForward ? N odeTraversal::next(*node) : NodeTraversal::previous(*node)) {
472 if (shouldVisit(node) && adjustedTabIndex(node) == tabIndex) 472 if (shouldVisit(node) && adjustedTabIndex(node) == tabIndex)
473 return node; 473 return node;
474 } 474 }
475 return 0; 475 return 0;
476 } 476 }
477 477
478 static Node* nextNodeWithGreaterTabIndex(Node* start, int tabIndex) 478 static Node* nextNodeWithGreaterTabIndex(Node* start, int tabIndex)
479 { 479 {
480 // Search is inclusive of start 480 // Search is inclusive of start
481 int winningTabIndex = std::numeric_limits<short>::max() + 1; 481 int winningTabIndex = std::numeric_limits<short>::max() + 1;
482 Node* winner = 0; 482 Node* winner = 0;
483 for (Node* node = start; node; node = NodeTraversal::next(*node)) { 483 for (Node* node = start; node; node = NodeTraversal::next(*node)) {
484 if (shouldVisit(node) && node->tabIndex() > tabIndex && node->tabIndex() < winningTabIndex) { 484 if (shouldVisit(node) && node->tabIndex() > tabIndex && node->tabIndex() < winningTabIndex) {
485 winner = node; 485 winner = node;
486 winningTabIndex = node->tabIndex(); 486 winningTabIndex = node->tabIndex();
487 } 487 }
488 } 488 }
489 489
490 return winner; 490 return winner;
491 } 491 }
492 492
493 static Node* previousNodeWithLowerTabIndex(Node* start, int tabIndex) 493 static Node* previousNodeWithLowerTabIndex(Node* start, int tabIndex)
494 { 494 {
495 // Search is inclusive of start 495 // Search is inclusive of start
496 int winningTabIndex = 0; 496 int winningTabIndex = 0;
497 Node* winner = 0; 497 Node* winner = 0;
498 for (Node* node = start; node; node = NodeTraversal::previous(node)) { 498 for (Node* node = start; node; node = NodeTraversal::previous(*node)) {
499 int currentTabIndex = adjustedTabIndex(node); 499 int currentTabIndex = adjustedTabIndex(node);
500 if ((shouldVisit(node) || isNonKeyboardFocusableShadowHost(node)) && cur rentTabIndex < tabIndex && currentTabIndex > winningTabIndex) { 500 if ((shouldVisit(node) || isNonKeyboardFocusableShadowHost(node)) && cur rentTabIndex < tabIndex && currentTabIndex > winningTabIndex) {
501 winner = node; 501 winner = node;
502 winningTabIndex = currentTabIndex; 502 winningTabIndex = currentTabIndex;
503 } 503 }
504 } 504 }
505 return winner; 505 return winner;
506 } 506 }
507 507
508 Node* FocusController::nextFocusableNode(FocusNavigationScope scope, Node* start ) 508 Node* FocusController::nextFocusableNode(FocusNavigationScope scope, Node* start )
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 Node* last = 0; 542 Node* last = 0;
543 for (Node* node = scope.rootNode(); node; node = node->lastChild()) 543 for (Node* node = scope.rootNode(); node; node = node->lastChild())
544 last = node; 544 last = node;
545 ASSERT(last); 545 ASSERT(last);
546 546
547 // First try to find the last node in the scope that comes before start and has the same tabindex as start. 547 // First try to find the last node in the scope that comes before start and has the same tabindex as start.
548 // If start is null, find the last node in the scope with a tabindex of 0. 548 // If start is null, find the last node in the scope with a tabindex of 0.
549 Node* startingNode; 549 Node* startingNode;
550 int startingTabIndex; 550 int startingTabIndex;
551 if (start) { 551 if (start) {
552 startingNode = NodeTraversal::previous(start); 552 startingNode = NodeTraversal::previous(*start);
553 startingTabIndex = adjustedTabIndex(start); 553 startingTabIndex = adjustedTabIndex(start);
554 } else { 554 } else {
555 startingNode = last; 555 startingNode = last;
556 startingTabIndex = 0; 556 startingTabIndex = 0;
557 } 557 }
558 558
559 // However, if a node is excluded from the normal tabbing cycle, the previou s focusable node is determined by tree order 559 // However, if a node is excluded from the normal tabbing cycle, the previou s focusable node is determined by tree order
560 if (startingTabIndex < 0) { 560 if (startingTabIndex < 0) {
561 for (Node* node = startingNode; node; node = NodeTraversal::previous(nod e)) { 561 for (Node* node = startingNode; node; node = NodeTraversal::previous(*no de)) {
562 if (shouldVisit(node) && adjustedTabIndex(node) >= 0) 562 if (shouldVisit(node) && adjustedTabIndex(node) >= 0)
563 return node; 563 return node;
564 } 564 }
565 } 565 }
566 566
567 if (Node* winner = findNodeWithExactTabIndex(startingNode, startingTabIndex, FocusDirectionBackward)) 567 if (Node* winner = findNodeWithExactTabIndex(startingNode, startingTabIndex, FocusDirectionBackward))
568 return winner; 568 return winner;
569 569
570 // There are no nodes before start with the same tabindex as start, so look for a node that: 570 // There are no nodes before start with the same tabindex as start, so look for a node that:
571 // 1) has the highest non-zero tabindex (that is less than start's tabindex) , and 571 // 1) has the highest non-zero tabindex (that is less than start's tabindex) , and
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b order */); 900 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b order */);
901 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct ion, container); 901 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct ion, container);
902 if (container && container->isDocumentNode()) 902 if (container && container->isDocumentNode())
903 toDocument(container)->updateLayoutIgnorePendingStylesheets(); 903 toDocument(container)->updateLayoutIgnorePendingStylesheets();
904 } while (!consumed && container); 904 } while (!consumed && container);
905 905
906 return consumed; 906 return consumed;
907 } 907 }
908 908
909 } // namespace WebCore 909 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/html/forms/RadioInputType.cpp ('k') | Source/core/rendering/RenderCounter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698