| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2011 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2010 Google Inc. All rights reserved. | 3 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 return; | 68 return; |
| 69 const String& key = event->keyIdentifier(); | 69 const String& key = event->keyIdentifier(); |
| 70 if (key != "Up" && key != "Down" && key != "Left" && key != "Right") | 70 if (key != "Up" && key != "Down" && key != "Left" && key != "Right") |
| 71 return; | 71 return; |
| 72 | 72 |
| 73 // Left and up mean "previous radio button". | 73 // Left and up mean "previous radio button". |
| 74 // Right and down mean "next radio button". | 74 // Right and down mean "next radio button". |
| 75 // Tested in WinIE, and even for RTL, left still means previous radio button
(and so moves | 75 // Tested in WinIE, and even for RTL, left still means previous radio button
(and so moves |
| 76 // to the right). Seems strange, but we'll match it. | 76 // to the right). Seems strange, but we'll match it. |
| 77 // However, when using Spatial Navigation, we need to be able to navigate wi
thout changing the selection. | 77 // However, when using Spatial Navigation, we need to be able to navigate wi
thout changing the selection. |
| 78 Document* document = element()->document(); | 78 Document& document = element()->document(); |
| 79 if (isSpatialNavigationEnabled(document->frame())) | 79 if (isSpatialNavigationEnabled(document.frame())) |
| 80 return; | 80 return; |
| 81 bool forward = (key == "Down" || key == "Right"); | 81 bool forward = (key == "Down" || key == "Right"); |
| 82 | 82 |
| 83 // We can only stay within the form's children if the form hasn't been demot
ed to a leaf because | 83 // We can only stay within the form's children if the form hasn't been demot
ed to a leaf because |
| 84 // of malformed HTML. | 84 // of malformed HTML. |
| 85 Node* node = element(); | 85 Node* node = element(); |
| 86 while ((node = (forward ? NodeTraversal::next(node) : NodeTraversal::previou
s(node)))) { | 86 while ((node = (forward ? NodeTraversal::next(node) : NodeTraversal::previou
s(node)))) { |
| 87 // Once we encounter a form element, we know we're through. | 87 // Once we encounter a form element, we know we're through. |
| 88 if (node->hasTagName(formTag)) | 88 if (node->hasTagName(formTag)) |
| 89 break; | 89 break; |
| 90 // Look for more radio buttons. | 90 // Look for more radio buttons. |
| 91 if (!node->hasTagName(inputTag)) | 91 if (!node->hasTagName(inputTag)) |
| 92 continue; | 92 continue; |
| 93 HTMLInputElement* inputElement = toHTMLInputElement(node); | 93 HTMLInputElement* inputElement = toHTMLInputElement(node); |
| 94 if (inputElement->form() != element()->form()) | 94 if (inputElement->form() != element()->form()) |
| 95 break; | 95 break; |
| 96 if (inputElement->isRadioButton() && inputElement->name() == element()->
name() && inputElement->isFocusable()) { | 96 if (inputElement->isRadioButton() && inputElement->name() == element()->
name() && inputElement->isFocusable()) { |
| 97 RefPtr<HTMLInputElement> protector(inputElement); | 97 RefPtr<HTMLInputElement> protector(inputElement); |
| 98 document->setFocusedElement(inputElement); | 98 document.setFocusedElement(inputElement); |
| 99 inputElement->dispatchSimulatedClick(event, SendNoEvents, DoNotShowP
ressedLook); | 99 inputElement->dispatchSimulatedClick(event, SendNoEvents, DoNotShowP
ressedLook); |
| 100 event->setDefaultHandled(); | 100 event->setDefaultHandled(); |
| 101 return; | 101 return; |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 } | 104 } |
| 105 | 105 |
| 106 void RadioInputType::handleKeyupEvent(KeyboardEvent* event) | 106 void RadioInputType::handleKeyupEvent(KeyboardEvent* event) |
| 107 { | 107 { |
| 108 const String& key = event->keyIdentifier(); | 108 const String& key = event->keyIdentifier(); |
| 109 if (key != "U+0020") | 109 if (key != "U+0020") |
| 110 return; | 110 return; |
| 111 // If an unselected radio is tabbed into (because the entire group has nothi
ng | 111 // If an unselected radio is tabbed into (because the entire group has nothi
ng |
| 112 // checked, or because of some explicit .focus() call), then allow space to
check it. | 112 // checked, or because of some explicit .focus() call), then allow space to
check it. |
| 113 if (element()->checked()) | 113 if (element()->checked()) |
| 114 return; | 114 return; |
| 115 dispatchSimulatedClickIfActive(event); | 115 dispatchSimulatedClickIfActive(event); |
| 116 } | 116 } |
| 117 | 117 |
| 118 bool RadioInputType::isKeyboardFocusable() const | 118 bool RadioInputType::isKeyboardFocusable() const |
| 119 { | 119 { |
| 120 if (!InputType::isKeyboardFocusable()) | 120 if (!InputType::isKeyboardFocusable()) |
| 121 return false; | 121 return false; |
| 122 | 122 |
| 123 // When using Spatial Navigation, every radio button should be focusable. | 123 // When using Spatial Navigation, every radio button should be focusable. |
| 124 if (isSpatialNavigationEnabled(element()->document()->frame())) | 124 if (isSpatialNavigationEnabled(element()->document().frame())) |
| 125 return true; | 125 return true; |
| 126 | 126 |
| 127 // Never allow keyboard tabbing to leave you in the same radio group. Alway
s | 127 // Never allow keyboard tabbing to leave you in the same radio group. Alway
s |
| 128 // skip any other elements in the group. | 128 // skip any other elements in the group. |
| 129 Element* currentFocusedElement = element()->document()->focusedElement(); | 129 Element* currentFocusedElement = element()->document().focusedElement(); |
| 130 if (currentFocusedElement && currentFocusedElement->hasTagName(inputTag)) { | 130 if (currentFocusedElement && currentFocusedElement->hasTagName(inputTag)) { |
| 131 HTMLInputElement* focusedInput = toHTMLInputElement(currentFocusedElemen
t); | 131 HTMLInputElement* focusedInput = toHTMLInputElement(currentFocusedElemen
t); |
| 132 if (focusedInput->isRadioButton() && focusedInput->form() == element()->
form() && focusedInput->name() == element()->name()) | 132 if (focusedInput->isRadioButton() && focusedInput->form() == element()->
form() && focusedInput->name() == element()->name()) |
| 133 return false; | 133 return false; |
| 134 } | 134 } |
| 135 | 135 |
| 136 // Allow keyboard focus if we're checked or if nothing in the group is check
ed. | 136 // Allow keyboard focus if we're checked or if nothing in the group is check
ed. |
| 137 return element()->checked() || !element()->checkedRadioButtonForGroup(); | 137 return element()->checked() || !element()->checkedRadioButtonForGroup(); |
| 138 } | 138 } |
| 139 | 139 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 { | 184 { |
| 185 return true; | 185 return true; |
| 186 } | 186 } |
| 187 | 187 |
| 188 bool RadioInputType::supportsIndeterminateAppearance() const | 188 bool RadioInputType::supportsIndeterminateAppearance() const |
| 189 { | 189 { |
| 190 return false; | 190 return false; |
| 191 } | 191 } |
| 192 | 192 |
| 193 } // namespace WebCore | 193 } // namespace WebCore |
| OLD | NEW |