| 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 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 doc.frame() | 67 doc.frame() |
| 68 ->editor() | 68 ->editor() |
| 69 .behavior() | 69 .behavior() |
| 70 .shouldConsiderSelectionAsDirectional() | 70 .shouldConsiderSelectionAsDirectional() |
| 71 ? SelectionHasForwardDirection | 71 ? SelectionHasForwardDirection |
| 72 : SelectionHasNoDirection; | 72 : SelectionHasNoDirection; |
| 73 } | 73 } |
| 74 | 74 |
| 75 TextControlElement::~TextControlElement() {} | 75 TextControlElement::~TextControlElement() {} |
| 76 | 76 |
| 77 Node::InsertionNotificationRequest TextControlElement::insertedInto( | |
| 78 ContainerNode* insertionPoint) { | |
| 79 HTMLFormControlElementWithState::insertedInto(insertionPoint); | |
| 80 if (!insertionPoint->isConnected()) | |
| 81 return InsertionDone; | |
| 82 String initialValue = value(); | |
| 83 setTextAsOfLastFormControlChangeEvent(initialValue.isNull() ? emptyString | |
| 84 : initialValue); | |
| 85 return InsertionDone; | |
| 86 } | |
| 87 | |
| 88 void TextControlElement::dispatchFocusEvent( | 77 void TextControlElement::dispatchFocusEvent( |
| 89 Element* oldFocusedElement, | 78 Element* oldFocusedElement, |
| 90 WebFocusType type, | 79 WebFocusType type, |
| 91 InputDeviceCapabilities* sourceCapabilities) { | 80 InputDeviceCapabilities* sourceCapabilities) { |
| 92 if (supportsPlaceholder()) | 81 if (supportsPlaceholder()) |
| 93 updatePlaceholderVisibility(); | 82 updatePlaceholderVisibility(); |
| 94 handleFocusEvent(oldFocusedElement, type); | 83 handleFocusEvent(oldFocusedElement, type); |
| 95 HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedElement, type, | 84 HTMLFormControlElementWithState::dispatchFocusEvent(oldFocusedElement, type, |
| 96 sourceCapabilities); | 85 sourceCapabilities); |
| 97 } | 86 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 } | 186 } |
| 198 | 187 |
| 199 void TextControlElement::select() { | 188 void TextControlElement::select() { |
| 200 setSelectionRangeForBinding(0, std::numeric_limits<unsigned>::max()); | 189 setSelectionRangeForBinding(0, std::numeric_limits<unsigned>::max()); |
| 201 // Avoid SelectionBehaviorOnFocus::Restore, which scrolls containers to show | 190 // Avoid SelectionBehaviorOnFocus::Restore, which scrolls containers to show |
| 202 // the selection. | 191 // the selection. |
| 203 focus(FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr)); | 192 focus(FocusParams(SelectionBehaviorOnFocus::None, WebFocusTypeNone, nullptr)); |
| 204 restoreCachedSelection(); | 193 restoreCachedSelection(); |
| 205 } | 194 } |
| 206 | 195 |
| 207 void TextControlElement::setChangedSinceLastFormControlChangeEvent( | 196 void TextControlElement::setValueBeforeFirstUserEditIfNotSet() { |
| 208 bool changed) { | 197 if (!m_valueBeforeFirstUserEdit.isNull()) |
| 209 m_wasChangedSinceLastFormControlChangeEvent = changed; | 198 return; |
| 199 String value = this->value(); |
| 200 m_valueBeforeFirstUserEdit = value.isNull() ? emptyString : value; |
| 201 } |
| 202 |
| 203 void TextControlElement::checkIfValueWasReverted(const String& value) { |
| 204 DCHECK(!m_valueBeforeFirstUserEdit.isNull()) |
| 205 << "setValueBeforeFirstUserEditIfNotSet should be called beforehand."; |
| 206 String nonNullValue = value.isNull() ? emptyString : value; |
| 207 if (m_valueBeforeFirstUserEdit == nonNullValue) |
| 208 clearValueBeforeFirstUserEdit(); |
| 209 } |
| 210 |
| 211 void TextControlElement::clearValueBeforeFirstUserEdit() { |
| 212 m_valueBeforeFirstUserEdit = String(); |
| 210 } | 213 } |
| 211 | 214 |
| 212 void TextControlElement::setFocused(bool flag) { | 215 void TextControlElement::setFocused(bool flag) { |
| 213 HTMLFormControlElementWithState::setFocused(flag); | 216 HTMLFormControlElementWithState::setFocused(flag); |
| 214 | 217 |
| 215 if (!flag) { | 218 if (!flag) |
| 216 if (wasChangedSinceLastFormControlChangeEvent()) { | 219 dispatchFormControlChangeEvent(); |
| 217 dispatchFormControlChangeEvent(); | |
| 218 } else { | |
| 219 // |value| IDL attribute setter haven't updated | |
| 220 // textAsOfLastFormControlChangeEvent while this is focused. So we | |
| 221 // synchronize now. | |
| 222 setTextAsOfLastFormControlChangeEvent(value()); | |
| 223 } | |
| 224 } | |
| 225 } | 220 } |
| 226 | 221 |
| 227 bool TextControlElement::shouldDispatchFormControlChangeEvent( | 222 bool TextControlElement::shouldDispatchFormControlChangeEvent( |
| 228 String& oldValue, | 223 String& oldValue, |
| 229 String& newValue) { | 224 String& newValue) { |
| 230 return !equalIgnoringNullity(oldValue, newValue); | 225 return !equalIgnoringNullity(oldValue, newValue); |
| 231 } | 226 } |
| 232 | 227 |
| 233 void TextControlElement::dispatchFormControlChangeEvent() { | 228 void TextControlElement::dispatchFormControlChangeEvent() { |
| 234 String newValue = value(); | 229 String newValue = value(); |
| 235 if (shouldDispatchFormControlChangeEvent(m_textAsOfLastFormControlChangeEvent, | 230 if (!m_valueBeforeFirstUserEdit.isNull() && |
| 231 shouldDispatchFormControlChangeEvent(m_valueBeforeFirstUserEdit, |
| 236 newValue)) { | 232 newValue)) { |
| 237 setTextAsOfLastFormControlChangeEvent(newValue); | 233 clearValueBeforeFirstUserEdit(); |
| 238 dispatchChangeEvent(); | 234 dispatchChangeEvent(); |
| 235 } else { |
| 236 clearValueBeforeFirstUserEdit(); |
| 239 } | 237 } |
| 240 setChangedSinceLastFormControlChangeEvent(false); | |
| 241 } | 238 } |
| 242 | 239 |
| 243 void TextControlElement::enqueueChangeEvent() { | 240 void TextControlElement::enqueueChangeEvent() { |
| 244 String newValue = value(); | 241 String newValue = value(); |
| 245 if (shouldDispatchFormControlChangeEvent(m_textAsOfLastFormControlChangeEvent, | 242 if (!m_valueBeforeFirstUserEdit.isNull() && |
| 243 shouldDispatchFormControlChangeEvent(m_valueBeforeFirstUserEdit, |
| 246 newValue)) { | 244 newValue)) { |
| 247 setTextAsOfLastFormControlChangeEvent(newValue); | |
| 248 Event* event = Event::createBubble(EventTypeNames::change); | 245 Event* event = Event::createBubble(EventTypeNames::change); |
| 249 event->setTarget(this); | 246 event->setTarget(this); |
| 250 document().enqueueAnimationFrameEvent(event); | 247 document().enqueueAnimationFrameEvent(event); |
| 251 } | 248 } |
| 252 setChangedSinceLastFormControlChangeEvent(false); | 249 clearValueBeforeFirstUserEdit(); |
| 253 } | 250 } |
| 254 | 251 |
| 252 // TODO(tkent): Remove this function. |
| 255 void TextControlElement::dispatchFormControlInputEvent() { | 253 void TextControlElement::dispatchFormControlInputEvent() { |
| 256 setChangedSinceLastFormControlChangeEvent(true); | |
| 257 HTMLFormControlElementWithState::dispatchInputEvent(); | 254 HTMLFormControlElementWithState::dispatchInputEvent(); |
| 258 } | 255 } |
| 259 | 256 |
| 260 void TextControlElement::setRangeText(const String& replacement, | 257 void TextControlElement::setRangeText(const String& replacement, |
| 261 ExceptionState& exceptionState) { | 258 ExceptionState& exceptionState) { |
| 262 setRangeText(replacement, selectionStart(), selectionEnd(), "preserve", | 259 setRangeText(replacement, selectionStart(), selectionEnd(), "preserve", |
| 263 exceptionState); | 260 exceptionState); |
| 264 } | 261 } |
| 265 | 262 |
| 266 void TextControlElement::setRangeText(const String& replacement, | 263 void TextControlElement::setRangeText(const String& replacement, |
| (...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 | 968 |
| 972 void TextControlElement::copyNonAttributePropertiesFromElement( | 969 void TextControlElement::copyNonAttributePropertiesFromElement( |
| 973 const Element& source) { | 970 const Element& source) { |
| 974 const TextControlElement& sourceElement = | 971 const TextControlElement& sourceElement = |
| 975 static_cast<const TextControlElement&>(source); | 972 static_cast<const TextControlElement&>(source); |
| 976 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; | 973 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; |
| 977 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); | 974 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); |
| 978 } | 975 } |
| 979 | 976 |
| 980 } // namespace blink | 977 } // namespace blink |
| OLD | NEW |