Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| 11 * version 2 of the License, or (at your option) any later version. | 11 * version 2 of the License, or (at your option) any later version. |
| 12 * | 12 * |
| 13 * This library is distributed in the hope that it will be useful, | 13 * This library is distributed in the hope that it will be useful, |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 * Library General Public License for more details. | 16 * Library General Public License for more details. |
| 17 * | 17 * |
| 18 * You should have received a copy of the GNU Library General Public License | 18 * You should have received a copy of the GNU Library General Public License |
| 19 * along with this library; see the file COPYING.LIB. If not, write to | 19 * along with this library; see the file COPYING.LIB. If not, write to |
| 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 21 * Boston, MA 02110-1301, USA. | 21 * Boston, MA 02110-1301, USA. |
| 22 * | 22 * |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 #include "config.h" | 25 #include "config.h" |
| 26 #include "core/html/HTMLFormControlElement.h" | 26 #include "core/html/HTMLFormControlElement.h" |
| 27 | 27 |
| 28 #include "core/events/Event.h" | 28 #include "core/events/Event.h" |
| 29 #include "core/html/HTMLDataListElement.h" | |
| 29 #include "core/html/HTMLFieldSetElement.h" | 30 #include "core/html/HTMLFieldSetElement.h" |
| 30 #include "core/html/HTMLFormElement.h" | 31 #include "core/html/HTMLFormElement.h" |
| 31 #include "core/html/HTMLInputElement.h" | 32 #include "core/html/HTMLInputElement.h" |
| 32 #include "core/html/HTMLLegendElement.h" | 33 #include "core/html/HTMLLegendElement.h" |
| 33 #include "core/html/ValidityState.h" | 34 #include "core/html/ValidityState.h" |
| 34 #include "core/html/forms/ValidationMessage.h" | 35 #include "core/html/forms/ValidationMessage.h" |
| 35 #include "core/frame/UseCounter.h" | 36 #include "core/frame/UseCounter.h" |
| 36 #include "core/rendering/RenderBox.h" | 37 #include "core/rendering/RenderBox.h" |
| 37 #include "core/rendering/RenderTheme.h" | 38 #include "core/rendering/RenderTheme.h" |
| 38 #include "wtf/Vector.h" | 39 #include "wtf/Vector.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 | 95 |
| 95 bool HTMLFormControlElement::formNoValidate() const | 96 bool HTMLFormControlElement::formNoValidate() const |
| 96 { | 97 { |
| 97 return fastHasAttribute(formnovalidateAttr); | 98 return fastHasAttribute(formnovalidateAttr); |
| 98 } | 99 } |
| 99 | 100 |
| 100 void HTMLFormControlElement::updateAncestorDisabledState() const | 101 void HTMLFormControlElement::updateAncestorDisabledState() const |
| 101 { | 102 { |
| 102 HTMLFieldSetElement* fieldSetAncestor = 0; | 103 HTMLFieldSetElement* fieldSetAncestor = 0; |
| 103 ContainerNode* legendAncestor = 0; | 104 ContainerNode* legendAncestor = 0; |
| 104 for (ContainerNode* ancestor = parentNode(); ancestor; ancestor = ancestor-> parentNode()) { | 105 for (HTMLElement* ancestor = Traversal<HTMLElement>::firstAncestor(*this); a ncestor; ancestor = Traversal<HTMLElement>::firstAncestor(*ancestor)) { |
| 105 if (!legendAncestor && isHTMLLegendElement(*ancestor)) | 106 if (!legendAncestor && isHTMLLegendElement(*ancestor)) |
| 106 legendAncestor = ancestor; | 107 legendAncestor = ancestor; |
| 107 if (isHTMLFieldSetElement(*ancestor)) { | 108 if (isHTMLFieldSetElement(*ancestor)) { |
| 108 fieldSetAncestor = toHTMLFieldSetElement(ancestor); | 109 fieldSetAncestor = toHTMLFieldSetElement(ancestor); |
| 109 break; | 110 break; |
| 110 } | 111 } |
| 111 } | 112 } |
| 112 m_ancestorDisabledState = (fieldSetAncestor && fieldSetAncestor->isDisabledF ormControl() && !(legendAncestor && legendAncestor == fieldSetAncestor->legend() )) ? AncestorDisabledStateDisabled : AncestorDisabledStateEnabled; | 113 m_ancestorDisabledState = (fieldSetAncestor && fieldSetAncestor->isDisabledF ormControl() && !(legendAncestor && legendAncestor == fieldSetAncestor->legend() )) ? AncestorDisabledStateDisabled : AncestorDisabledStateEnabled; |
| 113 } | 114 } |
| 114 | 115 |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 | 349 |
| 349 short HTMLFormControlElement::tabIndex() const | 350 short HTMLFormControlElement::tabIndex() const |
| 350 { | 351 { |
| 351 // Skip the supportsFocus check in HTMLElement. | 352 // Skip the supportsFocus check in HTMLElement. |
| 352 return Element::tabIndex(); | 353 return Element::tabIndex(); |
| 353 } | 354 } |
| 354 | 355 |
| 355 bool HTMLFormControlElement::recalcWillValidate() const | 356 bool HTMLFormControlElement::recalcWillValidate() const |
| 356 { | 357 { |
| 357 if (m_dataListAncestorState == Unknown) { | 358 if (m_dataListAncestorState == Unknown) { |
| 358 for (ContainerNode* ancestor = parentNode(); ancestor; ancestor = ancest or->parentNode()) { | 359 if (Traversal<HTMLDataListElement>::firstAncestor(*this)) |
| 359 if (isHTMLDataListElement(*ancestor)) { | 360 m_dataListAncestorState = InsideDataList; |
| 360 m_dataListAncestorState = InsideDataList; | 361 else |
| 361 break; | |
| 362 } | |
| 363 } | |
| 364 if (m_dataListAncestorState == Unknown) | |
| 365 m_dataListAncestorState = NotInsideDataList; | 362 m_dataListAncestorState = NotInsideDataList; |
| 366 } | 363 } |
| 367 return m_dataListAncestorState == NotInsideDataList && !isDisabledOrReadOnly (); | 364 return m_dataListAncestorState == NotInsideDataList && !isDisabledOrReadOnly (); |
| 368 } | 365 } |
| 369 | 366 |
| 370 bool HTMLFormControlElement::willValidate() const | 367 bool HTMLFormControlElement::willValidate() const |
| 371 { | 368 { |
| 372 if (!m_willValidateInitialized || m_dataListAncestorState == Unknown) { | 369 if (!m_willValidateInitialized || m_dataListAncestorState == Unknown) { |
| 373 m_willValidateInitialized = true; | 370 m_willValidateInitialized = true; |
| 374 bool newWillValidate = recalcWillValidate(); | 371 bool newWillValidate = recalcWillValidate(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 return canBeSuccessfulSubmitButton() && !isDisabledFormControl(); | 472 return canBeSuccessfulSubmitButton() && !isDisabledFormControl(); |
| 476 } | 473 } |
| 477 | 474 |
| 478 bool HTMLFormControlElement::isDefaultButtonForForm() const | 475 bool HTMLFormControlElement::isDefaultButtonForForm() const |
| 479 { | 476 { |
| 480 return isSuccessfulSubmitButton() && form() && form()->defaultButton() == th is; | 477 return isSuccessfulSubmitButton() && form() && form()->defaultButton() == th is; |
| 481 } | 478 } |
| 482 | 479 |
| 483 HTMLFormControlElement* HTMLFormControlElement::enclosingFormControlElement(Node * node) | 480 HTMLFormControlElement* HTMLFormControlElement::enclosingFormControlElement(Node * node) |
| 484 { | 481 { |
| 485 for (; node; node = node->parentNode()) { | 482 if (!node || isHTMLFormControlElement(*node)) |
| 486 if (node->isElementNode() && toElement(node)->isFormControlElement()) | 483 return toHTMLFormControlElement(node); |
| 487 return toHTMLFormControlElement(node); | 484 return Traversal<HTMLFormControlElement>::firstAncestor(*node); |
|
esprehn
2014/03/27 13:28:16
This also could have been firstAncestorOrSelf(node
| |
| 488 } | |
| 489 return 0; | |
| 490 } | 485 } |
| 491 | 486 |
| 492 String HTMLFormControlElement::nameForAutofill() const | 487 String HTMLFormControlElement::nameForAutofill() const |
| 493 { | 488 { |
| 494 String fullName = name(); | 489 String fullName = name(); |
| 495 String trimmedName = fullName.stripWhiteSpace(); | 490 String trimmedName = fullName.stripWhiteSpace(); |
| 496 if (!trimmedName.isEmpty()) | 491 if (!trimmedName.isEmpty()) |
| 497 return trimmedName; | 492 return trimmedName; |
| 498 fullName = getIdAttribute(); | 493 fullName = getIdAttribute(); |
| 499 trimmedName = fullName.stripWhiteSpace(); | 494 trimmedName = fullName.stripWhiteSpace(); |
| 500 return trimmedName; | 495 return trimmedName; |
| 501 } | 496 } |
| 502 | 497 |
| 503 void HTMLFormControlElement::setFocus(bool flag) | 498 void HTMLFormControlElement::setFocus(bool flag) |
| 504 { | 499 { |
| 505 LabelableElement::setFocus(flag); | 500 LabelableElement::setFocus(flag); |
| 506 | 501 |
| 507 if (!flag && wasChangedSinceLastFormControlChangeEvent()) | 502 if (!flag && wasChangedSinceLastFormControlChangeEvent()) |
| 508 dispatchFormControlChangeEvent(); | 503 dispatchFormControlChangeEvent(); |
| 509 } | 504 } |
| 510 | 505 |
| 511 } // namespace Webcore | 506 } // namespace Webcore |
| OLD | NEW |