OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 DEFINE_STATIC_LOCAL(AtomicString, textPseudoId, ("-webkit-datetime-edit-text
", AtomicString::ConstructFromLiteral)); | 296 DEFINE_STATIC_LOCAL(AtomicString, textPseudoId, ("-webkit-datetime-edit-text
", AtomicString::ConstructFromLiteral)); |
297 ASSERT(text.length()); | 297 ASSERT(text.length()); |
298 RefPtr<HTMLDivElement> element = HTMLDivElement::create(m_editElement.docume
nt()); | 298 RefPtr<HTMLDivElement> element = HTMLDivElement::create(m_editElement.docume
nt()); |
299 element->setPseudo(textPseudoId); | 299 element->setPseudo(textPseudoId); |
300 if (m_parameters.locale.isRTL() && text.length()) { | 300 if (m_parameters.locale.isRTL() && text.length()) { |
301 Direction dir = direction(text[0]); | 301 Direction dir = direction(text[0]); |
302 if (dir == SegmentSeparator || dir == WhiteSpaceNeutral || dir == OtherN
eutral) | 302 if (dir == SegmentSeparator || dir == WhiteSpaceNeutral || dir == OtherN
eutral) |
303 element->appendChild(Text::create(m_editElement.document(), String(&
rightToLeftMark, 1))); | 303 element->appendChild(Text::create(m_editElement.document(), String(&
rightToLeftMark, 1))); |
304 } | 304 } |
305 element->appendChild(Text::create(m_editElement.document(), text)); | 305 element->appendChild(Text::create(m_editElement.document(), text)); |
306 m_editElement.appendChild(element); | 306 m_editElement.fieldsWrapperElement()->appendChild(element); |
307 } | 307 } |
308 | 308 |
309 DateTimeNumericFieldElement::Parameters DateTimeEditBuilder::createNumericFieldP
arameters(const Decimal& msPerFieldUnit, const Decimal& msPerFieldSize) const | 309 DateTimeNumericFieldElement::Parameters DateTimeEditBuilder::createNumericFieldP
arameters(const Decimal& msPerFieldUnit, const Decimal& msPerFieldSize) const |
310 { | 310 { |
311 ASSERT(!msPerFieldUnit.isZero()); | 311 ASSERT(!msPerFieldUnit.isZero()); |
312 ASSERT(!msPerFieldSize.isZero()); | 312 ASSERT(!msPerFieldSize.isZero()); |
313 Decimal stepMilliseconds = stepRange().step(); | 313 Decimal stepMilliseconds = stepRange().step(); |
314 ASSERT(!stepMilliseconds.isZero()); | 314 ASSERT(!stepMilliseconds.isZero()); |
315 | 315 |
316 DateTimeNumericFieldElement::Parameters parameters(1, 0); | 316 DateTimeNumericFieldElement::Parameters parameters(1, 0); |
(...skipping 22 matching lines...) Expand all Loading... |
339 setPseudo(dateTimeEditPseudoId); | 339 setPseudo(dateTimeEditPseudoId); |
340 setHasCustomCallbacks(); | 340 setHasCustomCallbacks(); |
341 } | 341 } |
342 | 342 |
343 DateTimeEditElement::~DateTimeEditElement() | 343 DateTimeEditElement::~DateTimeEditElement() |
344 { | 344 { |
345 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) | 345 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) |
346 m_fields[fieldIndex]->removeEventHandler(); | 346 m_fields[fieldIndex]->removeEventHandler(); |
347 } | 347 } |
348 | 348 |
| 349 inline Element* DateTimeEditElement::fieldsWrapperElement() const |
| 350 { |
| 351 ASSERT(firstChild()); |
| 352 return toElement(firstChild()); |
| 353 } |
| 354 |
349 void DateTimeEditElement::addField(PassRefPtr<DateTimeFieldElement> field) | 355 void DateTimeEditElement::addField(PassRefPtr<DateTimeFieldElement> field) |
350 { | 356 { |
351 if (m_fields.size() == m_fields.capacity()) | 357 if (m_fields.size() == m_fields.capacity()) |
352 return; | 358 return; |
353 m_fields.append(field.get()); | 359 m_fields.append(field.get()); |
354 appendChild(field); | 360 fieldsWrapperElement()->appendChild(field); |
355 } | 361 } |
356 | 362 |
357 bool DateTimeEditElement::anyEditableFieldsHaveValues() const | 363 bool DateTimeEditElement::anyEditableFieldsHaveValues() const |
358 { | 364 { |
359 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) { | 365 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) { |
360 if (!m_fields[fieldIndex]->isReadOnly() && m_fields[fieldIndex]->hasValu
e()) | 366 if (!m_fields[fieldIndex]->isReadOnly() && m_fields[fieldIndex]->hasValu
e()) |
361 return true; | 367 return true; |
362 } | 368 } |
363 return false; | 369 return false; |
364 } | 370 } |
(...skipping 10 matching lines...) Expand all Loading... |
375 return container.release(); | 381 return container.release(); |
376 } | 382 } |
377 | 383 |
378 PassRefPtr<RenderStyle> DateTimeEditElement::customStyleForRenderer() | 384 PassRefPtr<RenderStyle> DateTimeEditElement::customStyleForRenderer() |
379 { | 385 { |
380 // FIXME: This is a kind of layout. We might want to introduce new renderer. | 386 // FIXME: This is a kind of layout. We might want to introduce new renderer. |
381 FontCachePurgePreventer fontCachePurgePreventer; | 387 FontCachePurgePreventer fontCachePurgePreventer; |
382 RefPtr<RenderStyle> originalStyle = document()->styleResolver()->styleForEle
ment(this); | 388 RefPtr<RenderStyle> originalStyle = document()->styleResolver()->styleForEle
ment(this); |
383 RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get()); | 389 RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get()); |
384 float width = 0; | 390 float width = 0; |
385 for (Node* child = firstChild(); child; child = child->nextSibling()) { | 391 for (Node* child = fieldsWrapperElement()->firstChild(); child; child = chil
d->nextSibling()) { |
386 if (!child->isElementNode()) | 392 if (!child->isElementNode()) |
387 continue; | 393 continue; |
388 Element* childElement = toElement(child); | 394 Element* childElement = toElement(child); |
389 if (childElement->isDateTimeFieldElement()) { | 395 if (childElement->isDateTimeFieldElement()) { |
390 // We need to pass the Font of this element because child elements | 396 // We need to pass the Font of this element because child elements |
391 // can't resolve inherited style at this timing. | 397 // can't resolve inherited style at this timing. |
392 width += static_cast<DateTimeFieldElement*>(childElement)->maximumWi
dth(style->font()); | 398 width += static_cast<DateTimeFieldElement*>(childElement)->maximumWi
dth(style->font()); |
393 } else { | 399 } else { |
394 // ::-webkit-datetime-edit-text case. It has no | 400 // ::-webkit-datetime-edit-text case. It has no |
395 // border/padding/margin in html.css. | 401 // border/padding/margin in html.css. |
396 width += style->font().width(childElement->textContent()); | 402 width += style->font().width(childElement->textContent()); |
397 } | 403 } |
398 } | 404 } |
399 style->setMinWidth(Length(ceilf(width), Fixed)); | 405 style->setWidth(Length(ceilf(width), Fixed)); |
400 return style.release(); | 406 return style.release(); |
401 } | 407 } |
402 | 408 |
403 void DateTimeEditElement::didBlurFromField() | 409 void DateTimeEditElement::didBlurFromField() |
404 { | 410 { |
405 if (m_editControlOwner) | 411 if (m_editControlOwner) |
406 m_editControlOwner->didBlurFromControl(); | 412 m_editControlOwner->didBlurFromControl(); |
407 } | 413 } |
408 | 414 |
409 void DateTimeEditElement::didFocusOnField() | 415 void DateTimeEditElement::didFocusOnField() |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 return isDisabled() || isReadOnly(); | 513 return isDisabled() || isReadOnly(); |
508 } | 514 } |
509 | 515 |
510 bool DateTimeEditElement::isReadOnly() const | 516 bool DateTimeEditElement::isReadOnly() const |
511 { | 517 { |
512 return m_editControlOwner && m_editControlOwner->isEditControlOwnerReadOnly(
); | 518 return m_editControlOwner && m_editControlOwner->isEditControlOwnerReadOnly(
); |
513 } | 519 } |
514 | 520 |
515 void DateTimeEditElement::layout(const LayoutParameters& layoutParameters, const
DateComponents& dateValue) | 521 void DateTimeEditElement::layout(const LayoutParameters& layoutParameters, const
DateComponents& dateValue) |
516 { | 522 { |
| 523 DEFINE_STATIC_LOCAL(AtomicString, fieldsWrapperPseudoId, ("-webkit-datetime-
edit-fields-wrapper", AtomicString::ConstructFromLiteral)); |
| 524 if (!firstChild()) { |
| 525 RefPtr<HTMLDivElement> element = HTMLDivElement::create(document()); |
| 526 element->setPseudo(fieldsWrapperPseudoId); |
| 527 appendChild(element.get()); |
| 528 } |
| 529 Element* fieldsWrapper = fieldsWrapperElement(); |
| 530 |
517 size_t focusedFieldIndex = this->focusedFieldIndex(); | 531 size_t focusedFieldIndex = this->focusedFieldIndex(); |
518 DateTimeFieldElement* const focusedField = fieldAt(focusedFieldIndex); | 532 DateTimeFieldElement* const focusedField = fieldAt(focusedFieldIndex); |
519 const AtomicString focusedFieldId = focusedField ? focusedField->shadowPseud
oId() : nullAtom; | 533 const AtomicString focusedFieldId = focusedField ? focusedField->shadowPseud
oId() : nullAtom; |
520 | 534 |
521 DateTimeEditBuilder builder(*this, layoutParameters, dateValue); | 535 DateTimeEditBuilder builder(*this, layoutParameters, dateValue); |
522 Node* lastChildToBeRemoved = lastChild(); | 536 Node* lastChildToBeRemoved = fieldsWrapper->lastChild(); |
523 if (!builder.build(layoutParameters.dateTimeFormat) || m_fields.isEmpty()) { | 537 if (!builder.build(layoutParameters.dateTimeFormat) || m_fields.isEmpty()) { |
524 lastChildToBeRemoved = lastChild(); | 538 lastChildToBeRemoved = fieldsWrapper->lastChild(); |
525 builder.build(layoutParameters.fallbackDateTimeFormat); | 539 builder.build(layoutParameters.fallbackDateTimeFormat); |
526 } | 540 } |
527 | 541 |
528 if (focusedFieldIndex != invalidFieldIndex) { | 542 if (focusedFieldIndex != invalidFieldIndex) { |
529 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
{ | 543 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
{ |
530 if (m_fields[fieldIndex]->shadowPseudoId() == focusedFieldId) { | 544 if (m_fields[fieldIndex]->shadowPseudoId() == focusedFieldId) { |
531 focusedFieldIndex = fieldIndex; | 545 focusedFieldIndex = fieldIndex; |
532 break; | 546 break; |
533 } | 547 } |
534 } | 548 } |
535 if (DateTimeFieldElement* field = fieldAt(std::min(focusedFieldIndex, m_
fields.size() - 1))) | 549 if (DateTimeFieldElement* field = fieldAt(std::min(focusedFieldIndex, m_
fields.size() - 1))) |
536 field->focus(); | 550 field->focus(); |
537 } | 551 } |
538 | 552 |
539 if (lastChildToBeRemoved) { | 553 if (lastChildToBeRemoved) { |
540 for (Node* childNode = firstChild(); childNode; childNode = firstChild()
) { | 554 for (Node* childNode = fieldsWrapper->firstChild(); childNode; childNode
= fieldsWrapper->firstChild()) { |
541 removeChild(childNode); | 555 fieldsWrapper->removeChild(childNode); |
542 if (childNode == lastChildToBeRemoved) | 556 if (childNode == lastChildToBeRemoved) |
543 break; | 557 break; |
544 } | 558 } |
| 559 setNeedsStyleRecalc(); |
545 } | 560 } |
546 } | 561 } |
547 | 562 |
548 AtomicString DateTimeEditElement::localeIdentifier() const | 563 AtomicString DateTimeEditElement::localeIdentifier() const |
549 { | 564 { |
550 return m_editControlOwner ? m_editControlOwner->localeIdentifier() : nullAto
m; | 565 return m_editControlOwner ? m_editControlOwner->localeIdentifier() : nullAto
m; |
551 } | 566 } |
552 | 567 |
553 void DateTimeEditElement::readOnlyStateChanged() | 568 void DateTimeEditElement::readOnlyStateChanged() |
554 { | 569 { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 { | 661 { |
647 DateTimeFieldsState dateTimeFieldsState; | 662 DateTimeFieldsState dateTimeFieldsState; |
648 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) | 663 for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) |
649 m_fields[fieldIndex]->populateDateTimeFieldsState(dateTimeFieldsState); | 664 m_fields[fieldIndex]->populateDateTimeFieldsState(dateTimeFieldsState); |
650 return dateTimeFieldsState; | 665 return dateTimeFieldsState; |
651 } | 666 } |
652 | 667 |
653 } // namespace WebCore | 668 } // namespace WebCore |
654 | 669 |
655 #endif | 670 #endif |
OLD | NEW |