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, 2008, 2010 Apple Inc. All rights reserv
ed. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserv
ed. |
6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) | 7 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 return text.length() + numberOfLineBreaks(text); | 77 return text.length() + numberOfLineBreaks(text); |
78 } | 78 } |
79 | 79 |
80 HTMLTextAreaElement::HTMLTextAreaElement(Document& document, HTMLFormElement* fo
rm) | 80 HTMLTextAreaElement::HTMLTextAreaElement(Document& document, HTMLFormElement* fo
rm) |
81 : HTMLTextFormControlElement(textareaTag, document, form) | 81 : HTMLTextFormControlElement(textareaTag, document, form) |
82 , m_rows(defaultRows) | 82 , m_rows(defaultRows) |
83 , m_cols(defaultCols) | 83 , m_cols(defaultCols) |
84 , m_wrap(SoftWrap) | 84 , m_wrap(SoftWrap) |
85 , m_isDirty(false) | 85 , m_isDirty(false) |
86 , m_valueIsUpToDate(true) | 86 , m_valueIsUpToDate(true) |
| 87 , m_isPlaceholderVisible(false) |
87 { | 88 { |
88 } | 89 } |
89 | 90 |
90 PassRefPtrWillBeRawPtr<HTMLTextAreaElement> HTMLTextAreaElement::create(Document
& document, HTMLFormElement* form) | 91 PassRefPtrWillBeRawPtr<HTMLTextAreaElement> HTMLTextAreaElement::create(Document
& document, HTMLFormElement* form) |
91 { | 92 { |
92 RefPtrWillBeRawPtr<HTMLTextAreaElement> textArea = adoptRefWillBeNoop(new HT
MLTextAreaElement(document, form)); | 93 RefPtrWillBeRawPtr<HTMLTextAreaElement> textArea = adoptRefWillBeNoop(new HT
MLTextAreaElement(document, form)); |
93 textArea->ensureUserAgentShadowRoot(); | 94 textArea->ensureUserAgentShadowRoot(); |
94 return textArea.release(); | 95 return textArea.release(); |
95 } | 96 } |
96 | 97 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 if (LocalFrame* frame = document().frame()) | 268 if (LocalFrame* frame = document().frame()) |
268 frame->spellChecker().didBeginEditing(this); | 269 frame->spellChecker().didBeginEditing(this); |
269 } | 270 } |
270 | 271 |
271 void HTMLTextAreaElement::subtreeHasChanged() | 272 void HTMLTextAreaElement::subtreeHasChanged() |
272 { | 273 { |
273 setChangedSinceLastFormControlChangeEvent(true); | 274 setChangedSinceLastFormControlChangeEvent(true); |
274 m_valueIsUpToDate = false; | 275 m_valueIsUpToDate = false; |
275 setNeedsValidityCheck(); | 276 setNeedsValidityCheck(); |
276 setAutofilled(false); | 277 setAutofilled(false); |
277 updatePlaceholderVisibility(false); | 278 updatePlaceholderVisibility(); |
278 | 279 |
279 if (!focused()) | 280 if (!focused()) |
280 return; | 281 return; |
281 | 282 |
282 // When typing in a textarea, childrenChanged is not called, so we need to f
orce the directionality check. | 283 // When typing in a textarea, childrenChanged is not called, so we need to f
orce the directionality check. |
283 calculateAndAdjustDirectionality(); | 284 calculateAndAdjustDirectionality(); |
284 | 285 |
285 ASSERT(document().isActive()); | 286 ASSERT(document().isActive()); |
286 document().frameHost()->chromeClient().didChangeValueInTextField(*this); | 287 document().frameHost()->chromeClient().didChangeValueInTextField(*this); |
287 } | 288 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 | 326 |
326 void HTMLTextAreaElement::updateValue() const | 327 void HTMLTextAreaElement::updateValue() const |
327 { | 328 { |
328 if (m_valueIsUpToDate) | 329 if (m_valueIsUpToDate) |
329 return; | 330 return; |
330 | 331 |
331 m_value = innerEditorValue(); | 332 m_value = innerEditorValue(); |
332 const_cast<HTMLTextAreaElement*>(this)->m_valueIsUpToDate = true; | 333 const_cast<HTMLTextAreaElement*>(this)->m_valueIsUpToDate = true; |
333 const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged(); | 334 const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged(); |
334 m_isDirty = true; | 335 m_isDirty = true; |
335 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility(false); | 336 const_cast<HTMLTextAreaElement*>(this)->updatePlaceholderVisibility(); |
336 } | 337 } |
337 | 338 |
338 String HTMLTextAreaElement::value() const | 339 String HTMLTextAreaElement::value() const |
339 { | 340 { |
340 updateValue(); | 341 updateValue(); |
341 return m_value; | 342 return m_value; |
342 } | 343 } |
343 | 344 |
344 void HTMLTextAreaElement::setValue(const String& value, TextFieldEventBehavior e
ventBehavior) | 345 void HTMLTextAreaElement::setValue(const String& value, TextFieldEventBehavior e
ventBehavior) |
345 { | 346 { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 setSelectionRange(endOfString, endOfString, SelectionHasNoDirect
ion, NotDispatchSelectEvent, ChangeSelectionIfFocused); | 378 setSelectionRange(endOfString, endOfString, SelectionHasNoDirect
ion, NotDispatchSelectEvent, ChangeSelectionIfFocused); |
378 } | 379 } |
379 } | 380 } |
380 return; | 381 return; |
381 } | 382 } |
382 | 383 |
383 m_value = normalizedValue; | 384 m_value = normalizedValue; |
384 setInnerEditorValue(m_value); | 385 setInnerEditorValue(m_value); |
385 if (eventBehavior == DispatchNoEvent) | 386 if (eventBehavior == DispatchNoEvent) |
386 setLastChangeWasNotUserEdit(); | 387 setLastChangeWasNotUserEdit(); |
387 updatePlaceholderVisibility(false); | 388 updatePlaceholderVisibility(); |
388 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(
StyleChangeReason::ControlValue)); | 389 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(
StyleChangeReason::ControlValue)); |
389 m_suggestedValue = String(); | 390 m_suggestedValue = String(); |
390 setNeedsValidityCheck(); | 391 setNeedsValidityCheck(); |
391 if (isFinishedParsingChildren()) { | 392 if (isFinishedParsingChildren()) { |
392 // Set the caret to the end of the text value except for initialize. | 393 // Set the caret to the end of the text value except for initialize. |
393 unsigned endOfString = m_value.length(); | 394 unsigned endOfString = m_value.length(); |
394 setSelectionRange(endOfString, endOfString, SelectionHasNoDirection, Not
DispatchSelectEvent, ChangeSelectionIfFocused); | 395 setSelectionRange(endOfString, endOfString, SelectionHasNoDirection, Not
DispatchSelectEvent, ChangeSelectionIfFocused); |
395 } | 396 } |
396 | 397 |
397 notifyFormStateChanged(); | 398 notifyFormStateChanged(); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 } | 493 } |
493 | 494 |
494 void HTMLTextAreaElement::setSuggestedValue(const String& value) | 495 void HTMLTextAreaElement::setSuggestedValue(const String& value) |
495 { | 496 { |
496 m_suggestedValue = value; | 497 m_suggestedValue = value; |
497 | 498 |
498 if (!value.isNull()) | 499 if (!value.isNull()) |
499 setInnerEditorValue(m_suggestedValue); | 500 setInnerEditorValue(m_suggestedValue); |
500 else | 501 else |
501 setInnerEditorValue(m_value); | 502 setInnerEditorValue(m_value); |
502 updatePlaceholderVisibility(false); | 503 updatePlaceholderVisibility(); |
503 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(
StyleChangeReason::ControlValue)); | 504 setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(
StyleChangeReason::ControlValue)); |
504 } | 505 } |
505 | 506 |
506 String HTMLTextAreaElement::validationMessage() const | 507 String HTMLTextAreaElement::validationMessage() const |
507 { | 508 { |
508 if (!willValidate()) | 509 if (!willValidate()) |
509 return String(); | 510 return String(); |
510 | 511 |
511 if (customError()) | 512 if (customError()) |
512 return customValidationMessage(); | 513 return customValidationMessage(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 bool HTMLTextAreaElement::matchesReadOnlyPseudoClass() const | 598 bool HTMLTextAreaElement::matchesReadOnlyPseudoClass() const |
598 { | 599 { |
599 return isReadOnly(); | 600 return isReadOnly(); |
600 } | 601 } |
601 | 602 |
602 bool HTMLTextAreaElement::matchesReadWritePseudoClass() const | 603 bool HTMLTextAreaElement::matchesReadWritePseudoClass() const |
603 { | 604 { |
604 return !isReadOnly(); | 605 return !isReadOnly(); |
605 } | 606 } |
606 | 607 |
| 608 void HTMLTextAreaElement::setPlaceholderVisibility(bool visible) |
| 609 { |
| 610 m_isPlaceholderVisible = visible; |
| 611 } |
| 612 |
607 void HTMLTextAreaElement::updatePlaceholderText() | 613 void HTMLTextAreaElement::updatePlaceholderText() |
608 { | 614 { |
609 HTMLElement* placeholder = placeholderElement(); | 615 HTMLElement* placeholder = placeholderElement(); |
610 const AtomicString& placeholderText = fastGetAttribute(placeholderAttr); | 616 const AtomicString& placeholderText = fastGetAttribute(placeholderAttr); |
611 if (placeholderText.isEmpty()) { | 617 if (placeholderText.isEmpty()) { |
612 if (placeholder) | 618 if (placeholder) |
613 userAgentShadowRoot()->removeChild(placeholder); | 619 userAgentShadowRoot()->removeChild(placeholder); |
614 return; | 620 return; |
615 } | 621 } |
616 if (!placeholder) { | 622 if (!placeholder) { |
617 RefPtrWillBeRawPtr<HTMLDivElement> newElement = HTMLDivElement::create(d
ocument()); | 623 RefPtrWillBeRawPtr<HTMLDivElement> newElement = HTMLDivElement::create(d
ocument()); |
618 placeholder = newElement.get(); | 624 placeholder = newElement.get(); |
619 placeholder->setShadowPseudoId(AtomicString("-webkit-input-placeholder",
AtomicString::ConstructFromLiteral)); | 625 placeholder->setShadowPseudoId(AtomicString("-webkit-input-placeholder",
AtomicString::ConstructFromLiteral)); |
620 placeholder->setAttribute(idAttr, ShadowElementNames::placeholder()); | 626 placeholder->setAttribute(idAttr, ShadowElementNames::placeholder()); |
| 627 placeholder->setInlineStyleProperty(CSSPropertyDisplay, isPlaceholderVis
ible() ? CSSValueBlock : CSSValueNone, true); |
621 userAgentShadowRoot()->insertBefore(placeholder, innerEditorElement()->n
extSibling()); | 628 userAgentShadowRoot()->insertBefore(placeholder, innerEditorElement()->n
extSibling()); |
622 } | 629 } |
623 placeholder->setTextContent(placeholderText); | 630 placeholder->setTextContent(placeholderText); |
624 } | 631 } |
625 | 632 |
626 bool HTMLTextAreaElement::isInteractiveContent() const | 633 bool HTMLTextAreaElement::isInteractiveContent() const |
627 { | 634 { |
628 return true; | 635 return true; |
629 } | 636 } |
630 | 637 |
(...skipping 10 matching lines...) Expand all Loading... |
641 | 648 |
642 void HTMLTextAreaElement::copyNonAttributePropertiesFromElement(const Element& s
ource) | 649 void HTMLTextAreaElement::copyNonAttributePropertiesFromElement(const Element& s
ource) |
643 { | 650 { |
644 const HTMLTextAreaElement& sourceElement = static_cast<const HTMLTextAreaEle
ment&>(source); | 651 const HTMLTextAreaElement& sourceElement = static_cast<const HTMLTextAreaEle
ment&>(source); |
645 setValueCommon(sourceElement.value(), DispatchNoEvent, SetSeletion); | 652 setValueCommon(sourceElement.value(), DispatchNoEvent, SetSeletion); |
646 m_isDirty = sourceElement.m_isDirty; | 653 m_isDirty = sourceElement.m_isDirty; |
647 HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source); | 654 HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source); |
648 } | 655 } |
649 | 656 |
650 } // namespace blink | 657 } // namespace blink |
OLD | NEW |