| 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 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 Element* current = scope.currentElement(); | 419 Element* current = scope.currentElement(); |
| 420 if (shouldVisit(*current) && adjustedTabIndex(*current) == tabIndex) | 420 if (shouldVisit(*current) && adjustedTabIndex(*current) == tabIndex) |
| 421 return current; | 421 return current; |
| 422 } | 422 } |
| 423 return nullptr; | 423 return nullptr; |
| 424 } | 424 } |
| 425 | 425 |
| 426 Element* nextElementWithGreaterTabIndex(ScopedFocusNavigation& scope, | 426 Element* nextElementWithGreaterTabIndex(ScopedFocusNavigation& scope, |
| 427 int tabIndex) { | 427 int tabIndex) { |
| 428 // Search is inclusive of start | 428 // Search is inclusive of start |
| 429 int winningTabIndex = std::numeric_limits<short>::max() + 1; | 429 int winningTabIndex = std::numeric_limits<int>::max(); |
| 430 Element* winner = nullptr; | 430 Element* winner = nullptr; |
| 431 for (; scope.currentElement(); scope.moveToNext()) { | 431 for (; scope.currentElement(); scope.moveToNext()) { |
| 432 Element* current = scope.currentElement(); | 432 Element* current = scope.currentElement(); |
| 433 int currentTabIndex = adjustedTabIndex(*current); | 433 int currentTabIndex = adjustedTabIndex(*current); |
| 434 if (shouldVisit(*current) && currentTabIndex > tabIndex && | 434 if (shouldVisit(*current) && currentTabIndex > tabIndex) { |
| 435 currentTabIndex < winningTabIndex) { | 435 if (!winner || currentTabIndex < winningTabIndex) { |
| 436 winner = current; | 436 winner = current; |
| 437 winningTabIndex = currentTabIndex; | 437 winningTabIndex = currentTabIndex; |
| 438 } |
| 438 } | 439 } |
| 439 } | 440 } |
| 440 return winner; | 441 return winner; |
| 441 } | 442 } |
| 442 | 443 |
| 443 Element* previousElementWithLowerTabIndex(ScopedFocusNavigation& scope, | 444 Element* previousElementWithLowerTabIndex(ScopedFocusNavigation& scope, |
| 444 int tabIndex) { | 445 int tabIndex) { |
| 445 // Search is inclusive of start | 446 // Search is inclusive of start |
| 446 int winningTabIndex = 0; | 447 int winningTabIndex = 0; |
| 447 Element* winner = nullptr; | 448 Element* winner = nullptr; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 if (Element* winner = | 527 if (Element* winner = |
| 527 findElementWithExactTabIndex(scope, tabIndex, WebFocusTypeBackward)) | 528 findElementWithExactTabIndex(scope, tabIndex, WebFocusTypeBackward)) |
| 528 return winner; | 529 return winner; |
| 529 } | 530 } |
| 530 | 531 |
| 531 // There are no elements before start with the same tabindex as start, so look | 532 // There are no elements before start with the same tabindex as start, so look |
| 532 // for an element that: | 533 // for an element that: |
| 533 // 1) has the highest non-zero tabindex (that is less than start's tabindex), | 534 // 1) has the highest non-zero tabindex (that is less than start's tabindex), |
| 534 // and | 535 // and |
| 535 // 2) comes last in the scope, if there's a tie. | 536 // 2) comes last in the scope, if there's a tie. |
| 536 tabIndex = | 537 tabIndex = (current && tabIndex) ? tabIndex : std::numeric_limits<int>::max(); |
| 537 (current && tabIndex) ? tabIndex : std::numeric_limits<short>::max(); | |
| 538 scope.moveToLast(); | 538 scope.moveToLast(); |
| 539 return previousElementWithLowerTabIndex(scope, tabIndex); | 539 return previousElementWithLowerTabIndex(scope, tabIndex); |
| 540 } | 540 } |
| 541 | 541 |
| 542 // Searches through the given tree scope, starting from start element, for the | 542 // Searches through the given tree scope, starting from start element, for the |
| 543 // next/previous selectable element that comes after/before start element. | 543 // next/previous selectable element that comes after/before start element. |
| 544 // The order followed is as specified in the HTML spec[1], which is elements | 544 // The order followed is as specified in the HTML spec[1], which is elements |
| 545 // with tab indexes first (from lowest to highest), and then elements without | 545 // with tab indexes first (from lowest to highest), and then elements without |
| 546 // tab indexes (in document order). The search algorithm also conforms the | 546 // tab indexes (in document order). The search algorithm also conforms the |
| 547 // Shadow DOM spec[2], which inserts sequence in a shadow tree into its host. | 547 // Shadow DOM spec[2], which inserts sequence in a shadow tree into its host. |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 | 1411 |
| 1412 return consumed; | 1412 return consumed; |
| 1413 } | 1413 } |
| 1414 | 1414 |
| 1415 DEFINE_TRACE(FocusController) { | 1415 DEFINE_TRACE(FocusController) { |
| 1416 visitor->trace(m_page); | 1416 visitor->trace(m_page); |
| 1417 visitor->trace(m_focusedFrame); | 1417 visitor->trace(m_focusedFrame); |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 } // namespace blink | 1420 } // namespace blink |
| OLD | NEW |