| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2011 Apple Inc. All rights reserved. | 3 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 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 are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 #include "core/page/Settings.h" | 51 #include "core/page/Settings.h" |
| 52 #include "core/rendering/RenderLayer.h" | 52 #include "core/rendering/RenderLayer.h" |
| 53 #include "core/rendering/RenderTextControlSingleLine.h" | 53 #include "core/rendering/RenderTextControlSingleLine.h" |
| 54 #include "core/rendering/RenderTheme.h" | 54 #include "core/rendering/RenderTheme.h" |
| 55 #include "wtf/text/WTFString.h" | 55 #include "wtf/text/WTFString.h" |
| 56 | 56 |
| 57 namespace WebCore { | 57 namespace WebCore { |
| 58 | 58 |
| 59 using namespace HTMLNames; | 59 using namespace HTMLNames; |
| 60 | 60 |
| 61 TextFieldInputType::TextFieldInputType(HTMLInputElement* element) | 61 TextFieldInputType::TextFieldInputType(HTMLInputElement& element) |
| 62 : InputType(element) | 62 : InputType(element) |
| 63 { | 63 { |
| 64 } | 64 } |
| 65 | 65 |
| 66 TextFieldInputType::~TextFieldInputType() | 66 TextFieldInputType::~TextFieldInputType() |
| 67 { | 67 { |
| 68 if (SpinButtonElement* spinButton = spinButtonElement()) | 68 if (SpinButtonElement* spinButton = spinButtonElement()) |
| 69 spinButton->removeSpinButtonOwner(); | 69 spinButton->removeSpinButtonOwner(); |
| 70 } | 70 } |
| 71 | 71 |
| 72 SpinButtonElement* TextFieldInputType::spinButtonElement() const | 72 SpinButtonElement* TextFieldInputType::spinButtonElement() const |
| 73 { | 73 { |
| 74 return toSpinButtonElement(element()->userAgentShadowRoot()->getElementById(
ShadowElementNames::spinButton())); | 74 return toSpinButtonElement(element().userAgentShadowRoot()->getElementById(S
hadowElementNames::spinButton())); |
| 75 } | 75 } |
| 76 | 76 |
| 77 bool TextFieldInputType::shouldShowFocusRingOnMouseFocus() const | 77 bool TextFieldInputType::shouldShowFocusRingOnMouseFocus() const |
| 78 { | 78 { |
| 79 return true; | 79 return true; |
| 80 } | 80 } |
| 81 | 81 |
| 82 bool TextFieldInputType::isTextField() const | 82 bool TextFieldInputType::isTextField() const |
| 83 { | 83 { |
| 84 return true; | 84 return true; |
| 85 } | 85 } |
| 86 | 86 |
| 87 static inline bool shouldIgnoreRequiredAttribute(const HTMLInputElement& input) | 87 static inline bool shouldIgnoreRequiredAttribute(const HTMLInputElement& input) |
| 88 { | 88 { |
| 89 if (!input.document().settings() || !input.document().settings()->needsSiteS
pecificQuirks()) | 89 if (!input.document().settings() || !input.document().settings()->needsSiteS
pecificQuirks()) |
| 90 return false; | 90 return false; |
| 91 if (!equalIgnoringCase(input.document().url().host(), "egov.uscis.gov")) | 91 if (!equalIgnoringCase(input.document().url().host(), "egov.uscis.gov")) |
| 92 return false; | 92 return false; |
| 93 return input.fastGetAttribute(requiredAttr) == "no"; | 93 return input.fastGetAttribute(requiredAttr) == "no"; |
| 94 } | 94 } |
| 95 | 95 |
| 96 bool TextFieldInputType::valueMissing(const String& value) const | 96 bool TextFieldInputType::valueMissing(const String& value) const |
| 97 { | 97 { |
| 98 return !shouldIgnoreRequiredAttribute(*element()) && element()->isRequired()
&& value.isEmpty(); | 98 return !shouldIgnoreRequiredAttribute(element()) && element().isRequired() &
& value.isEmpty(); |
| 99 } | 99 } |
| 100 | 100 |
| 101 bool TextFieldInputType::canSetSuggestedValue() | 101 bool TextFieldInputType::canSetSuggestedValue() |
| 102 { | 102 { |
| 103 return true; | 103 return true; |
| 104 } | 104 } |
| 105 | 105 |
| 106 void TextFieldInputType::setValue(const String& sanitizedValue, bool valueChange
d, TextFieldEventBehavior eventBehavior) | 106 void TextFieldInputType::setValue(const String& sanitizedValue, bool valueChange
d, TextFieldEventBehavior eventBehavior) |
| 107 { | 107 { |
| 108 // Grab this input element to keep reference even if JS event handler | 108 // Grab this input element to keep reference even if JS event handler |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 case DispatchNoEvent: | 144 case DispatchNoEvent: |
| 145 break; | 145 break; |
| 146 } | 146 } |
| 147 | 147 |
| 148 if (!input->focused()) | 148 if (!input->focused()) |
| 149 input->setTextAsOfLastFormControlChangeEvent(sanitizedValue); | 149 input->setTextAsOfLastFormControlChangeEvent(sanitizedValue); |
| 150 } | 150 } |
| 151 | 151 |
| 152 void TextFieldInputType::handleKeydownEvent(KeyboardEvent* event) | 152 void TextFieldInputType::handleKeydownEvent(KeyboardEvent* event) |
| 153 { | 153 { |
| 154 if (!element()->focused()) | 154 if (!element().focused()) |
| 155 return; | 155 return; |
| 156 Frame* frame = element()->document().frame(); | 156 Frame* frame = element().document().frame(); |
| 157 if (!frame || !frame->editor().doTextFieldCommandFromEvent(element(), event)
) | 157 if (!frame || !frame->editor().doTextFieldCommandFromEvent(&element(), event
)) |
| 158 return; | 158 return; |
| 159 event->setDefaultHandled(); | 159 event->setDefaultHandled(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void TextFieldInputType::handleKeydownEventForSpinButton(KeyboardEvent* event) | 162 void TextFieldInputType::handleKeydownEventForSpinButton(KeyboardEvent* event) |
| 163 { | 163 { |
| 164 if (element()->isDisabledOrReadOnly()) | 164 if (element().isDisabledOrReadOnly()) |
| 165 return; | 165 return; |
| 166 const String& key = event->keyIdentifier(); | 166 const String& key = event->keyIdentifier(); |
| 167 if (key == "Up") | 167 if (key == "Up") |
| 168 spinButtonStepUp(); | 168 spinButtonStepUp(); |
| 169 else if (key == "Down") | 169 else if (key == "Down") |
| 170 spinButtonStepDown(); | 170 spinButtonStepDown(); |
| 171 else | 171 else |
| 172 return; | 172 return; |
| 173 event->setDefaultHandled(); | 173 event->setDefaultHandled(); |
| 174 } | 174 } |
| 175 | 175 |
| 176 void TextFieldInputType::forwardEvent(Event* event) | 176 void TextFieldInputType::forwardEvent(Event* event) |
| 177 { | 177 { |
| 178 if (SpinButtonElement* spinButton = spinButtonElement()) { | 178 if (SpinButtonElement* spinButton = spinButtonElement()) { |
| 179 spinButton->forwardEvent(event); | 179 spinButton->forwardEvent(event); |
| 180 if (event->defaultHandled()) | 180 if (event->defaultHandled()) |
| 181 return; | 181 return; |
| 182 } | 182 } |
| 183 | 183 |
| 184 if (element()->renderer() && (event->isMouseEvent() || event->isDragEvent()
|| event->hasInterface(EventNames::WheelEvent) || event->type() == EventTypeName
s::blur || event->type() == EventTypeNames::focus)) { | 184 if (element().renderer() && (event->isMouseEvent() || event->isDragEvent() |
| event->hasInterface(EventNames::WheelEvent) || event->type() == EventTypeNames
::blur || event->type() == EventTypeNames::focus)) { |
| 185 RenderTextControlSingleLine* renderTextControl = toRenderTextControlSing
leLine(element()->renderer()); | 185 RenderTextControlSingleLine* renderTextControl = toRenderTextControlSing
leLine(element().renderer()); |
| 186 if (event->type() == EventTypeNames::blur) { | 186 if (event->type() == EventTypeNames::blur) { |
| 187 if (RenderBox* innerTextRenderer = innerTextElement()->renderBox())
{ | 187 if (RenderBox* innerTextRenderer = innerTextElement()->renderBox())
{ |
| 188 // FIXME: This class has no need to know about RenderLayer! | 188 // FIXME: This class has no need to know about RenderLayer! |
| 189 if (RenderLayer* innerLayer = innerTextRenderer->layer()) { | 189 if (RenderLayer* innerLayer = innerTextRenderer->layer()) { |
| 190 RenderLayerScrollableArea* innerScrollableArea = innerLayer-
>scrollableArea(); | 190 RenderLayerScrollableArea* innerScrollableArea = innerLayer-
>scrollableArea(); |
| 191 IntSize scrollOffset(!renderTextControl->style()->isLeftToRi
ghtDirection() ? innerScrollableArea->scrollWidth() : 0, 0); | 191 IntSize scrollOffset(!renderTextControl->style()->isLeftToRi
ghtDirection() ? innerScrollableArea->scrollWidth() : 0, 0); |
| 192 innerScrollableArea->scrollToOffset(scrollOffset, ScrollOffs
etClamped); | 192 innerScrollableArea->scrollToOffset(scrollOffset, ScrollOffs
etClamped); |
| 193 } | 193 } |
| 194 } | 194 } |
| 195 | 195 |
| 196 renderTextControl->capsLockStateMayHaveChanged(); | 196 renderTextControl->capsLockStateMayHaveChanged(); |
| 197 } else if (event->type() == EventTypeNames::focus) { | 197 } else if (event->type() == EventTypeNames::focus) { |
| 198 renderTextControl->capsLockStateMayHaveChanged(); | 198 renderTextControl->capsLockStateMayHaveChanged(); |
| 199 } | 199 } |
| 200 | 200 |
| 201 element()->forwardEvent(event); | 201 element().forwardEvent(event); |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 void TextFieldInputType::handleFocusEvent(Element* oldFocusedNode, FocusDirectio
n focusDirection) | 205 void TextFieldInputType::handleFocusEvent(Element* oldFocusedNode, FocusDirectio
n focusDirection) |
| 206 { | 206 { |
| 207 InputType::handleFocusEvent(oldFocusedNode, focusDirection); | 207 InputType::handleFocusEvent(oldFocusedNode, focusDirection); |
| 208 element()->beginEditing(); | 208 element().beginEditing(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 void TextFieldInputType::handleBlurEvent() | 211 void TextFieldInputType::handleBlurEvent() |
| 212 { | 212 { |
| 213 InputType::handleBlurEvent(); | 213 InputType::handleBlurEvent(); |
| 214 element()->endEditing(); | 214 element().endEditing(); |
| 215 } | 215 } |
| 216 | 216 |
| 217 bool TextFieldInputType::shouldSubmitImplicitly(Event* event) | 217 bool TextFieldInputType::shouldSubmitImplicitly(Event* event) |
| 218 { | 218 { |
| 219 return (event->type() == EventTypeNames::textInput && event->hasInterface(Ev
entNames::TextEvent) && toTextEvent(event)->data() == "\n") || InputType::should
SubmitImplicitly(event); | 219 return (event->type() == EventTypeNames::textInput && event->hasInterface(Ev
entNames::TextEvent) && toTextEvent(event)->data() == "\n") || InputType::should
SubmitImplicitly(event); |
| 220 } | 220 } |
| 221 | 221 |
| 222 RenderObject* TextFieldInputType::createRenderer(RenderStyle*) const | 222 RenderObject* TextFieldInputType::createRenderer(RenderStyle*) const |
| 223 { | 223 { |
| 224 return new RenderTextControlSingleLine(element()); | 224 return new RenderTextControlSingleLine(&element()); |
| 225 } | 225 } |
| 226 | 226 |
| 227 bool TextFieldInputType::needsContainer() const | 227 bool TextFieldInputType::needsContainer() const |
| 228 { | 228 { |
| 229 #if ENABLE(INPUT_SPEECH) | 229 #if ENABLE(INPUT_SPEECH) |
| 230 return element()->isSpeechEnabled(); | 230 return element().isSpeechEnabled(); |
| 231 #else | 231 #else |
| 232 return false; | 232 return false; |
| 233 #endif | 233 #endif |
| 234 } | 234 } |
| 235 | 235 |
| 236 bool TextFieldInputType::shouldHaveSpinButton() const | 236 bool TextFieldInputType::shouldHaveSpinButton() const |
| 237 { | 237 { |
| 238 return RenderTheme::theme().shouldHaveSpinButton(element()); | 238 return RenderTheme::theme().shouldHaveSpinButton(&element()); |
| 239 } | 239 } |
| 240 | 240 |
| 241 void TextFieldInputType::createShadowSubtree() | 241 void TextFieldInputType::createShadowSubtree() |
| 242 { | 242 { |
| 243 ASSERT(element()->shadow()); | 243 ASSERT(element().shadow()); |
| 244 ShadowRoot* shadowRoot = element()->userAgentShadowRoot(); | 244 ShadowRoot* shadowRoot = element().userAgentShadowRoot(); |
| 245 ASSERT(!shadowRoot->hasChildNodes()); | 245 ASSERT(!shadowRoot->hasChildNodes()); |
| 246 | 246 |
| 247 Document& document = element()->document(); | 247 Document& document = element().document(); |
| 248 bool shouldHaveSpinButton = this->shouldHaveSpinButton(); | 248 bool shouldHaveSpinButton = this->shouldHaveSpinButton(); |
| 249 bool createsContainer = shouldHaveSpinButton || needsContainer(); | 249 bool createsContainer = shouldHaveSpinButton || needsContainer(); |
| 250 | 250 |
| 251 m_innerText = TextControlInnerTextElement::create(document); | 251 m_innerText = TextControlInnerTextElement::create(document); |
| 252 if (!createsContainer) { | 252 if (!createsContainer) { |
| 253 shadowRoot->appendChild(m_innerText); | 253 shadowRoot->appendChild(m_innerText); |
| 254 return; | 254 return; |
| 255 } | 255 } |
| 256 | 256 |
| 257 RefPtr<TextControlInnerContainer> container = TextControlInnerContainer::cre
ate(document); | 257 RefPtr<TextControlInnerContainer> container = TextControlInnerContainer::cre
ate(document); |
| 258 container->setPart(AtomicString("-webkit-textfield-decoration-container", At
omicString::ConstructFromLiteral)); | 258 container->setPart(AtomicString("-webkit-textfield-decoration-container", At
omicString::ConstructFromLiteral)); |
| 259 shadowRoot->appendChild(container); | 259 shadowRoot->appendChild(container); |
| 260 | 260 |
| 261 RefPtr<EditingViewPortElement> editingViewPort = EditingViewPortElement::cre
ate(document); | 261 RefPtr<EditingViewPortElement> editingViewPort = EditingViewPortElement::cre
ate(document); |
| 262 editingViewPort->appendChild(m_innerText); | 262 editingViewPort->appendChild(m_innerText); |
| 263 container->appendChild(editingViewPort.release()); | 263 container->appendChild(editingViewPort.release()); |
| 264 | 264 |
| 265 #if ENABLE(INPUT_SPEECH) | 265 #if ENABLE(INPUT_SPEECH) |
| 266 if (element()->isSpeechEnabled()) | 266 if (element().isSpeechEnabled()) |
| 267 container->appendChild(InputFieldSpeechButtonElement::create(document)); | 267 container->appendChild(InputFieldSpeechButtonElement::create(document)); |
| 268 #endif | 268 #endif |
| 269 | 269 |
| 270 if (shouldHaveSpinButton) | 270 if (shouldHaveSpinButton) |
| 271 container->appendChild(SpinButtonElement::create(document, *this)); | 271 container->appendChild(SpinButtonElement::create(document, *this)); |
| 272 } | 272 } |
| 273 | 273 |
| 274 Element* TextFieldInputType::containerElement() const | 274 Element* TextFieldInputType::containerElement() const |
| 275 { | 275 { |
| 276 return element()->userAgentShadowRoot()->getElementById(ShadowElementNames::
textFieldContainer()); | 276 return element().userAgentShadowRoot()->getElementById(ShadowElementNames::t
extFieldContainer()); |
| 277 } | 277 } |
| 278 | 278 |
| 279 HTMLElement* TextFieldInputType::innerTextElement() const | 279 HTMLElement* TextFieldInputType::innerTextElement() const |
| 280 { | 280 { |
| 281 ASSERT(m_innerText); | 281 ASSERT(m_innerText); |
| 282 return m_innerText.get(); | 282 return m_innerText.get(); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void TextFieldInputType::destroyShadowSubtree() | 285 void TextFieldInputType::destroyShadowSubtree() |
| 286 { | 286 { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 return limitLength(proposedValue.removeCharacters(isASCIILineBreak), HTMLInp
utElement::maximumLength); | 348 return limitLength(proposedValue.removeCharacters(isASCIILineBreak), HTMLInp
utElement::maximumLength); |
| 349 } | 349 } |
| 350 | 350 |
| 351 void TextFieldInputType::handleBeforeTextInsertedEvent(BeforeTextInsertedEvent*
event) | 351 void TextFieldInputType::handleBeforeTextInsertedEvent(BeforeTextInsertedEvent*
event) |
| 352 { | 352 { |
| 353 // Make sure that the text to be inserted will not violate the maxLength. | 353 // Make sure that the text to be inserted will not violate the maxLength. |
| 354 | 354 |
| 355 // We use HTMLInputElement::innerTextValue() instead of | 355 // We use HTMLInputElement::innerTextValue() instead of |
| 356 // HTMLInputElement::value() because they can be mismatched by | 356 // HTMLInputElement::value() because they can be mismatched by |
| 357 // sanitizeValue() in HTMLInputElement::subtreeHasChanged() in some cases. | 357 // sanitizeValue() in HTMLInputElement::subtreeHasChanged() in some cases. |
| 358 unsigned oldLength = element()->innerTextValue().length(); | 358 unsigned oldLength = element().innerTextValue().length(); |
| 359 | 359 |
| 360 // selectionLength represents the selection length of this text field to be | 360 // selectionLength represents the selection length of this text field to be |
| 361 // removed by this insertion. | 361 // removed by this insertion. |
| 362 // If the text field has no focus, we don't need to take account of the | 362 // If the text field has no focus, we don't need to take account of the |
| 363 // selection length. The selection is the source of text drag-and-drop in | 363 // selection length. The selection is the source of text drag-and-drop in |
| 364 // that case, and nothing in the text field will be removed. | 364 // that case, and nothing in the text field will be removed. |
| 365 unsigned selectionLength = element()->focused() ? plainText(element()->docum
ent().frame()->selection().selection().toNormalizedRange().get()).length() : 0; | 365 unsigned selectionLength = element().focused() ? plainText(element().documen
t().frame()->selection().selection().toNormalizedRange().get()).length() : 0; |
| 366 ASSERT(oldLength >= selectionLength); | 366 ASSERT(oldLength >= selectionLength); |
| 367 | 367 |
| 368 // Selected characters will be removed by the next text event. | 368 // Selected characters will be removed by the next text event. |
| 369 unsigned baseLength = oldLength - selectionLength; | 369 unsigned baseLength = oldLength - selectionLength; |
| 370 unsigned maxLength = static_cast<unsigned>(isTextType() ? element()->maxLeng
th() : HTMLInputElement::maximumLength); // maxLength can never be negative. | 370 unsigned maxLength = static_cast<unsigned>(isTextType() ? element().maxLengt
h() : HTMLInputElement::maximumLength); // maxLength can never be negative. |
| 371 unsigned appendableLength = maxLength > baseLength ? maxLength - baseLength
: 0; | 371 unsigned appendableLength = maxLength > baseLength ? maxLength - baseLength
: 0; |
| 372 | 372 |
| 373 // Truncate the inserted text to avoid violating the maxLength and other con
straints. | 373 // Truncate the inserted text to avoid violating the maxLength and other con
straints. |
| 374 String eventText = event->text(); | 374 String eventText = event->text(); |
| 375 unsigned textLength = eventText.length(); | 375 unsigned textLength = eventText.length(); |
| 376 while (textLength > 0 && isASCIILineBreak(eventText[textLength - 1])) | 376 while (textLength > 0 && isASCIILineBreak(eventText[textLength - 1])) |
| 377 textLength--; | 377 textLength--; |
| 378 eventText.truncate(textLength); | 378 eventText.truncate(textLength); |
| 379 eventText.replace("\r\n", " "); | 379 eventText.replace("\r\n", " "); |
| 380 eventText.replace('\r', ' '); | 380 eventText.replace('\r', ' '); |
| 381 eventText.replace('\n', ' '); | 381 eventText.replace('\n', ' '); |
| 382 | 382 |
| 383 event->setText(limitLength(eventText, appendableLength)); | 383 event->setText(limitLength(eventText, appendableLength)); |
| 384 } | 384 } |
| 385 | 385 |
| 386 bool TextFieldInputType::shouldRespectListAttribute() | 386 bool TextFieldInputType::shouldRespectListAttribute() |
| 387 { | 387 { |
| 388 return InputType::themeSupportsDataListUI(this); | 388 return InputType::themeSupportsDataListUI(this); |
| 389 } | 389 } |
| 390 | 390 |
| 391 void TextFieldInputType::updatePlaceholderText() | 391 void TextFieldInputType::updatePlaceholderText() |
| 392 { | 392 { |
| 393 if (!supportsPlaceholder()) | 393 if (!supportsPlaceholder()) |
| 394 return; | 394 return; |
| 395 HTMLElement* placeholder = element()->placeholderElement(); | 395 HTMLElement* placeholder = element().placeholderElement(); |
| 396 String placeholderText = element()->strippedPlaceholder(); | 396 String placeholderText = element().strippedPlaceholder(); |
| 397 if (placeholderText.isEmpty()) { | 397 if (placeholderText.isEmpty()) { |
| 398 if (placeholder) | 398 if (placeholder) |
| 399 placeholder->remove(ASSERT_NO_EXCEPTION); | 399 placeholder->remove(ASSERT_NO_EXCEPTION); |
| 400 return; | 400 return; |
| 401 } | 401 } |
| 402 if (!placeholder) { | 402 if (!placeholder) { |
| 403 RefPtr<HTMLElement> newElement = HTMLDivElement::create(element()->docum
ent()); | 403 RefPtr<HTMLElement> newElement = HTMLDivElement::create(element().docume
nt()); |
| 404 placeholder = newElement.get(); | 404 placeholder = newElement.get(); |
| 405 placeholder->setPart(AtomicString("-webkit-input-placeholder", AtomicStr
ing::ConstructFromLiteral)); | 405 placeholder->setPart(AtomicString("-webkit-input-placeholder", AtomicStr
ing::ConstructFromLiteral)); |
| 406 placeholder->setAttribute(idAttr, ShadowElementNames::placeholder()); | 406 placeholder->setAttribute(idAttr, ShadowElementNames::placeholder()); |
| 407 Element* container = containerElement(); | 407 Element* container = containerElement(); |
| 408 Node* previous = container ? container : innerTextElement(); | 408 Node* previous = container ? container : innerTextElement(); |
| 409 previous->parentNode()->insertBefore(placeholder, previous->nextSibling(
)); | 409 previous->parentNode()->insertBefore(placeholder, previous->nextSibling(
)); |
| 410 ASSERT_WITH_SECURITY_IMPLICATION(placeholder->parentNode() == previous->
parentNode()); | 410 ASSERT_WITH_SECURITY_IMPLICATION(placeholder->parentNode() == previous->
parentNode()); |
| 411 } | 411 } |
| 412 placeholder->setTextContent(placeholderText, ASSERT_NO_EXCEPTION); | 412 placeholder->setTextContent(placeholderText, ASSERT_NO_EXCEPTION); |
| 413 } | 413 } |
| 414 | 414 |
| 415 bool TextFieldInputType::appendFormData(FormDataList& list, bool multipart) cons
t | 415 bool TextFieldInputType::appendFormData(FormDataList& list, bool multipart) cons
t |
| 416 { | 416 { |
| 417 InputType::appendFormData(list, multipart); | 417 InputType::appendFormData(list, multipart); |
| 418 const AtomicString& dirnameAttrValue = element()->fastGetAttribute(dirnameAt
tr); | 418 const AtomicString& dirnameAttrValue = element().fastGetAttribute(dirnameAtt
r); |
| 419 if (!dirnameAttrValue.isNull()) | 419 if (!dirnameAttrValue.isNull()) |
| 420 list.appendData(dirnameAttrValue, element()->directionForFormData()); | 420 list.appendData(dirnameAttrValue, element().directionForFormData()); |
| 421 return true; | 421 return true; |
| 422 } | 422 } |
| 423 | 423 |
| 424 String TextFieldInputType::convertFromVisibleValue(const String& visibleValue) c
onst | 424 String TextFieldInputType::convertFromVisibleValue(const String& visibleValue) c
onst |
| 425 { | 425 { |
| 426 return visibleValue; | 426 return visibleValue; |
| 427 } | 427 } |
| 428 | 428 |
| 429 void TextFieldInputType::subtreeHasChanged() | 429 void TextFieldInputType::subtreeHasChanged() |
| 430 { | 430 { |
| 431 ASSERT(element()->renderer()); | 431 ASSERT(element().renderer()); |
| 432 | 432 |
| 433 bool wasChanged = element()->wasChangedSinceLastFormControlChangeEvent(); | 433 bool wasChanged = element().wasChangedSinceLastFormControlChangeEvent(); |
| 434 element()->setChangedSinceLastFormControlChangeEvent(true); | 434 element().setChangedSinceLastFormControlChangeEvent(true); |
| 435 | 435 |
| 436 // We don't need to call sanitizeUserInputValue() function here because | 436 // We don't need to call sanitizeUserInputValue() function here because |
| 437 // HTMLInputElement::handleBeforeTextInsertedEvent() has already called | 437 // HTMLInputElement::handleBeforeTextInsertedEvent() has already called |
| 438 // sanitizeUserInputValue(). | 438 // sanitizeUserInputValue(). |
| 439 // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextIn
sertedEvent. | 439 // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextIn
sertedEvent. |
| 440 element()->setValueFromRenderer(sanitizeValue(convertFromVisibleValue(elemen
t()->innerTextValue()))); | 440 element().setValueFromRenderer(sanitizeValue(convertFromVisibleValue(element
().innerTextValue()))); |
| 441 element()->updatePlaceholderVisibility(false); | 441 element().updatePlaceholderVisibility(false); |
| 442 // Recalc for :invalid change. | 442 // Recalc for :invalid change. |
| 443 element()->setNeedsStyleRecalc(); | 443 element().setNeedsStyleRecalc(); |
| 444 | 444 |
| 445 didSetValueByUserEdit(wasChanged ? ValueChangeStateChanged : ValueChangeStat
eNone); | 445 didSetValueByUserEdit(wasChanged ? ValueChangeStateChanged : ValueChangeStat
eNone); |
| 446 } | 446 } |
| 447 | 447 |
| 448 void TextFieldInputType::didSetValueByUserEdit(ValueChangeState state) | 448 void TextFieldInputType::didSetValueByUserEdit(ValueChangeState state) |
| 449 { | 449 { |
| 450 if (!element()->focused()) | 450 if (!element().focused()) |
| 451 return; | 451 return; |
| 452 if (Frame* frame = element()->document().frame()) | 452 if (Frame* frame = element().document().frame()) |
| 453 frame->editor().textDidChangeInTextField(element()); | 453 frame->editor().textDidChangeInTextField(&element()); |
| 454 } | 454 } |
| 455 | 455 |
| 456 void TextFieldInputType::spinButtonStepDown() | 456 void TextFieldInputType::spinButtonStepDown() |
| 457 { | 457 { |
| 458 stepUpFromRenderer(-1); | 458 stepUpFromRenderer(-1); |
| 459 } | 459 } |
| 460 | 460 |
| 461 void TextFieldInputType::spinButtonStepUp() | 461 void TextFieldInputType::spinButtonStepUp() |
| 462 { | 462 { |
| 463 stepUpFromRenderer(1); | 463 stepUpFromRenderer(1); |
| 464 } | 464 } |
| 465 | 465 |
| 466 void TextFieldInputType::updateInnerTextValue() | 466 void TextFieldInputType::updateInnerTextValue() |
| 467 { | 467 { |
| 468 if (!element()->suggestedValue().isNull()) { | 468 if (!element().suggestedValue().isNull()) { |
| 469 element()->setInnerTextValue(element()->suggestedValue()); | 469 element().setInnerTextValue(element().suggestedValue()); |
| 470 element()->updatePlaceholderVisibility(false); | 470 element().updatePlaceholderVisibility(false); |
| 471 } else if (!element()->formControlValueMatchesRenderer()) { | 471 } else if (!element().formControlValueMatchesRenderer()) { |
| 472 // Update the renderer value if the formControlValueMatchesRenderer() fl
ag is false. | 472 // Update the renderer value if the formControlValueMatchesRenderer() fl
ag is false. |
| 473 // It protects an unacceptable renderer value from being overwritten wit
h the DOM value. | 473 // It protects an unacceptable renderer value from being overwritten wit
h the DOM value. |
| 474 element()->setInnerTextValue(visibleValue()); | 474 element().setInnerTextValue(visibleValue()); |
| 475 element()->updatePlaceholderVisibility(false); | 475 element().updatePlaceholderVisibility(false); |
| 476 } | 476 } |
| 477 } | 477 } |
| 478 | 478 |
| 479 void TextFieldInputType::focusAndSelectSpinButtonOwner() | 479 void TextFieldInputType::focusAndSelectSpinButtonOwner() |
| 480 { | 480 { |
| 481 RefPtr<HTMLInputElement> input(element()); | 481 RefPtr<HTMLInputElement> input(element()); |
| 482 input->focus(); | 482 input->focus(); |
| 483 input->select(); | 483 input->select(); |
| 484 } | 484 } |
| 485 | 485 |
| 486 bool TextFieldInputType::shouldSpinButtonRespondToMouseEvents() | 486 bool TextFieldInputType::shouldSpinButtonRespondToMouseEvents() |
| 487 { | 487 { |
| 488 return !element()->isDisabledOrReadOnly(); | 488 return !element().isDisabledOrReadOnly(); |
| 489 } | 489 } |
| 490 | 490 |
| 491 bool TextFieldInputType::shouldSpinButtonRespondToWheelEvents() | 491 bool TextFieldInputType::shouldSpinButtonRespondToWheelEvents() |
| 492 { | 492 { |
| 493 return shouldSpinButtonRespondToMouseEvents() && element()->focused(); | 493 return shouldSpinButtonRespondToMouseEvents() && element().focused(); |
| 494 } | 494 } |
| 495 | 495 |
| 496 } // namespace WebCore | 496 } // namespace WebCore |
| OLD | NEW |