diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-08 14:30:41 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-12 13:49:54 +0200 |
commit | ab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch) | |
tree | 498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/third_party/WebKit/Source/core/html/shadow | |
parent | 4ce69f7403811819800e7c5ae1318b2647e778d1 (diff) |
Update Chromium to beta version 37.0.2062.68
Change-Id: I188e3b5aff1bec75566014291b654eb19f5bc8ca
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/html/shadow')
44 files changed, 1022 insertions, 2490 deletions
diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.cpp index cb928e81dce..adbd8f8adde 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.cpp @@ -27,9 +27,9 @@ #include "core/html/shadow/ClearButtonElement.h" #include "core/events/MouseEvent.h" +#include "core/frame/LocalFrame.h" #include "core/html/shadow/ShadowElementNames.h" #include "core/page/EventHandler.h" -#include "core/frame/Frame.h" #include "core/rendering/RenderView.h" namespace WebCore { @@ -43,10 +43,10 @@ inline ClearButtonElement::ClearButtonElement(Document& document, ClearButtonOwn { } -PassRefPtr<ClearButtonElement> ClearButtonElement::create(Document& document, ClearButtonOwner& clearButtonOwner) +PassRefPtrWillBeRawPtr<ClearButtonElement> ClearButtonElement::create(Document& document, ClearButtonOwner& clearButtonOwner) { - RefPtr<ClearButtonElement> element = adoptRef(new ClearButtonElement(document, clearButtonOwner)); - element->setPseudo(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<ClearButtonElement> element = adoptRefWillBeNoop(new ClearButtonElement(document, clearButtonOwner)); + element->setShadowPseudoId(AtomicString("-webkit-clear-button", AtomicString::ConstructFromLiteral)); element->setAttribute(idAttr, ShadowElementNames::clearButton()); return element.release(); } @@ -54,8 +54,8 @@ PassRefPtr<ClearButtonElement> ClearButtonElement::create(Document& document, Cl void ClearButtonElement::detach(const AttachContext& context) { if (m_capturing) { - if (Frame* frame = document().frame()) - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) + frame->eventHandler().setCapturingMouseEventsNode(nullptr); } HTMLDivElement::detach(context); } @@ -65,8 +65,8 @@ void ClearButtonElement::releaseCapture() if (!m_capturing) return; - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) { + frame->eventHandler().setCapturingMouseEventsNode(nullptr); m_capturing = false; } } @@ -87,7 +87,7 @@ void ClearButtonElement::defaultEventHandler(Event* event) if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { if (renderer() && renderer()->visibleToHitTesting()) { - if (Frame* frame = document().frame()) { + if (LocalFrame* frame = document().frame()) { frame->eventHandler().setCapturingMouseEventsNode(this); m_capturing = true; } @@ -97,8 +97,8 @@ void ClearButtonElement::defaultEventHandler(Event* event) } if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { if (m_capturing) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) { + frame->eventHandler().setCapturingMouseEventsNode(nullptr); m_capturing = false; } if (hovered()) { @@ -117,4 +117,10 @@ bool ClearButtonElement::isClearButtonElement() const return true; } +void ClearButtonElement::trace(Visitor* visitor) +{ + visitor->trace(m_clearButtonOwner); + HTMLDivElement::trace(visitor); +} + } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.h index 47c91115e31..eba5309fa30 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ClearButtonElement.h @@ -33,7 +33,7 @@ namespace WebCore { class ClearButtonElement FINAL : public HTMLDivElement { public: - class ClearButtonOwner { + class ClearButtonOwner : public WillBeGarbageCollectedMixin { public: virtual ~ClearButtonOwner() { } virtual void focusAndSelectClearButtonOwner() = 0; @@ -41,18 +41,20 @@ public: virtual void clearValue() = 0; }; - static PassRefPtr<ClearButtonElement> create(Document&, ClearButtonOwner&); + static PassRefPtrWillBeRawPtr<ClearButtonElement> create(Document&, ClearButtonOwner&); void releaseCapture(); - void removeClearButtonOwner() { m_clearButtonOwner = 0; } + void removeClearButtonOwner() { m_clearButtonOwner = nullptr; } + + virtual void trace(Visitor*) OVERRIDE; private: ClearButtonElement(Document&, ClearButtonOwner&); virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; - virtual bool isMouseFocusable() const { return false; } - virtual void defaultEventHandler(Event*); + virtual bool isMouseFocusable() const OVERRIDE { return false; } + virtual void defaultEventHandler(Event*) OVERRIDE; virtual bool isClearButtonElement() const OVERRIDE; - ClearButtonOwner* m_clearButtonOwner; + RawPtrWillBeMember<ClearButtonOwner> m_clearButtonOwner; bool m_capturing; }; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.cpp index eb3508e9dc8..3b337ddf0f1 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.cpp @@ -27,8 +27,9 @@ #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) #include "core/html/shadow/DateTimeEditElement.h" -#include "HTMLNames.h" #include "bindings/v8/ExceptionStatePlaceholder.h" +#include "core/HTMLNames.h" +#include "core/dom/Document.h" #include "core/dom/Text.h" #include "core/events/MouseEvent.h" #include "core/html/forms/DateTimeFieldsState.h" @@ -147,7 +148,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co switch (fieldType) { case DateTimeFormat::FieldTypeDayOfMonth: { - RefPtr<DateTimeFieldElement> field = DateTimeDayFieldElement::create(document, m_editElement, m_parameters.placeholderForDay, m_dayRange); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeDayFieldElement::create(document, m_editElement, m_parameters.placeholderForDay, m_dayRange); m_editElement.addField(field); if (shouldDayOfMonthFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -158,7 +159,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeHour11: { DateTimeNumericFieldElement::Step step = createStep(msPerHour, msPerHour * 12); - RefPtr<DateTimeFieldElement> field = DateTimeHour11FieldElement::create(document, m_editElement, m_hour23Range, step); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeHour11FieldElement::create(document, m_editElement, m_hour23Range, step); m_editElement.addField(field); if (shouldHourFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -169,7 +170,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeHour12: { DateTimeNumericFieldElement::Step step = createStep(msPerHour, msPerHour * 12); - RefPtr<DateTimeFieldElement> field = DateTimeHour12FieldElement::create(document, m_editElement, m_hour23Range, step); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeHour12FieldElement::create(document, m_editElement, m_hour23Range, step); m_editElement.addField(field); if (shouldHourFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -180,7 +181,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeHour23: { DateTimeNumericFieldElement::Step step = createStep(msPerHour, msPerDay); - RefPtr<DateTimeFieldElement> field = DateTimeHour23FieldElement::create(document, m_editElement, m_hour23Range, step); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeHour23FieldElement::create(document, m_editElement, m_hour23Range, step); m_editElement.addField(field); if (shouldHourFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -191,7 +192,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeHour24: { DateTimeNumericFieldElement::Step step = createStep(msPerHour, msPerDay); - RefPtr<DateTimeFieldElement> field = DateTimeHour24FieldElement::create(document, m_editElement, m_hour23Range, step); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeHour24FieldElement::create(document, m_editElement, m_hour23Range, step); m_editElement.addField(field); if (shouldHourFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -202,7 +203,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeMinute: { DateTimeNumericFieldElement::Step step = createStep(msPerMinute, msPerHour); - RefPtr<DateTimeNumericFieldElement> field = DateTimeMinuteFieldElement::create(document, m_editElement, m_minuteRange, step); + RefPtrWillBeRawPtr<DateTimeNumericFieldElement> field = DateTimeMinuteFieldElement::create(document, m_editElement, m_minuteRange, step); m_editElement.addField(field); if (shouldMinuteFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -221,7 +222,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co minMonth = m_parameters.minimum.month(); maxMonth = m_parameters.maximum.month(); } - RefPtr<DateTimeFieldElement> field; + RefPtrWillBeRawPtr<DateTimeFieldElement> field; switch (count) { case countForNarrowMonth: // Fallthrough. case countForAbbreviatedMonth: @@ -243,7 +244,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co } case DateTimeFormat::FieldTypePeriod: { - RefPtr<DateTimeFieldElement> field = DateTimeAMPMFieldElement::create(document, m_editElement, m_parameters.locale.timeAMPMLabels()); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeAMPMFieldElement::create(document, m_editElement, m_parameters.locale.timeAMPMLabels()); m_editElement.addField(field); if (shouldAMPMFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -254,7 +255,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeSecond: { DateTimeNumericFieldElement::Step step = createStep(msPerSecond, msPerMinute); - RefPtr<DateTimeNumericFieldElement> field = DateTimeSecondFieldElement::create(document, m_editElement, m_secondRange, step); + RefPtrWillBeRawPtr<DateTimeNumericFieldElement> field = DateTimeSecondFieldElement::create(document, m_editElement, m_secondRange, step); m_editElement.addField(field); if (shouldSecondFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -270,7 +271,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co case DateTimeFormat::FieldTypeFractionalSecond: { DateTimeNumericFieldElement::Step step = createStep(1, msPerSecond); - RefPtr<DateTimeNumericFieldElement> field = DateTimeMillisecondFieldElement::create(document, m_editElement, m_millisecondRange, step); + RefPtrWillBeRawPtr<DateTimeNumericFieldElement> field = DateTimeMillisecondFieldElement::create(document, m_editElement, m_millisecondRange, step); m_editElement.addField(field); if (shouldMillisecondFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -313,7 +314,7 @@ void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int co std::swap(yearParams.minIsSpecified, yearParams.maxIsSpecified); } yearParams.placeholder = m_parameters.placeholderForYear; - RefPtr<DateTimeFieldElement> field = DateTimeYearFieldElement::create(document, m_editElement, yearParams); + RefPtrWillBeRawPtr<DateTimeFieldElement> field = DateTimeYearFieldElement::create(document, m_editElement, yearParams); m_editElement.addField(field); if (shouldYearFieldDisabled()) { field->setValueAsDate(m_dateValue); @@ -401,8 +402,8 @@ void DateTimeEditBuilder::visitLiteral(const String& text) { DEFINE_STATIC_LOCAL(AtomicString, textPseudoId, ("-webkit-datetime-edit-text", AtomicString::ConstructFromLiteral)); ASSERT(text.length()); - RefPtr<HTMLDivElement> element = HTMLDivElement::create(m_editElement.document()); - element->setPseudo(textPseudoId); + RefPtrWillBeRawPtr<HTMLDivElement> element = HTMLDivElement::create(m_editElement.document()); + element->setShadowPseudoId(textPseudoId); if (m_parameters.locale.isRTL() && text.length()) { Direction dir = direction(text[0]); if (dir == SegmentSeparator || dir == WhiteSpaceNeutral || dir == OtherNeutral) @@ -448,8 +449,19 @@ DateTimeEditElement::DateTimeEditElement(Document& document, EditControlOwner& e DateTimeEditElement::~DateTimeEditElement() { +#if !ENABLE(OILPAN) for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) m_fields[fieldIndex]->removeEventHandler(); +#endif +} + +void DateTimeEditElement::trace(Visitor* visitor) +{ +#if ENABLE(OILPAN) + visitor->trace(m_fields); +#endif + visitor->trace(m_editControlOwner); + HTMLDivElement::trace(visitor); } inline Element* DateTimeEditElement::fieldsWrapperElement() const @@ -458,7 +470,7 @@ inline Element* DateTimeEditElement::fieldsWrapperElement() const return toElement(firstChild()); } -void DateTimeEditElement::addField(PassRefPtr<DateTimeFieldElement> field) +void DateTimeEditElement::addField(PassRefPtrWillBeRawPtr<DateTimeFieldElement> field) { if (m_fields.size() == m_fields.capacity()) return; @@ -481,10 +493,10 @@ void DateTimeEditElement::blurByOwner() field->blur(); } -PassRefPtr<DateTimeEditElement> DateTimeEditElement::create(Document& document, EditControlOwner& editControlOwner) +PassRefPtrWillBeRawPtr<DateTimeEditElement> DateTimeEditElement::create(Document& document, EditControlOwner& editControlOwner) { - RefPtr<DateTimeEditElement> container = adoptRef(new DateTimeEditElement(document, editControlOwner)); - container->setPseudo(AtomicString("-webkit-datetime-edit", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<DateTimeEditElement> container = adoptRefWillBeNoop(new DateTimeEditElement(document, editControlOwner)); + container->setShadowPseudoId(AtomicString("-webkit-datetime-edit", AtomicString::ConstructFromLiteral)); container->setAttribute(idAttr, ShadowElementNames::dateTimeEdit()); return container.release(); } @@ -534,7 +546,7 @@ void DateTimeEditElement::disabledStateChanged() DateTimeFieldElement* DateTimeEditElement::fieldAt(size_t fieldIndex) const { - return fieldIndex < m_fields.size() ? m_fields[fieldIndex] : 0; + return fieldIndex < m_fields.size() ? m_fields[fieldIndex].get() : 0; } size_t DateTimeEditElement::fieldIndexOf(const DateTimeFieldElement& field) const @@ -651,8 +663,8 @@ void DateTimeEditElement::layout(const LayoutParameters& layoutParameters, const { DEFINE_STATIC_LOCAL(AtomicString, fieldsWrapperPseudoId, ("-webkit-datetime-edit-fields-wrapper", AtomicString::ConstructFromLiteral)); if (!firstChild()) { - RefPtr<HTMLDivElement> element = HTMLDivElement::create(document()); - element->setPseudo(fieldsWrapperPseudoId); + RefPtrWillBeRawPtr<HTMLDivElement> element = HTMLDivElement::create(document()); + element->setShadowPseudoId(fieldsWrapperPseudoId); appendChild(element.get()); } Element* fieldsWrapper = fieldsWrapperElement(); @@ -685,7 +697,7 @@ void DateTimeEditElement::layout(const LayoutParameters& layoutParameters, const if (childNode == lastChildToBeRemoved) break; } - setNeedsStyleRecalc(); + setNeedsStyleRecalc(SubtreeStyleChange); } } @@ -694,6 +706,12 @@ AtomicString DateTimeEditElement::localeIdentifier() const return m_editControlOwner ? m_editControlOwner->localeIdentifier() : nullAtom; } +void DateTimeEditElement::fieldDidChangeValueByKeyboard() +{ + if (m_editControlOwner) + m_editControlOwner->editControlDidChangeValueByKeyboard(); +} + void DateTimeEditElement::readOnlyStateChanged() { updateUIState(); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.h index 87226cb136b..8621afdad8e 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeEditElement.h @@ -45,11 +45,12 @@ class StepRange; // - Hour, Minute, Second, Millisecond, AM/PM class DateTimeEditElement FINAL : public HTMLDivElement, public DateTimeFieldElement::FieldOwner { WTF_MAKE_NONCOPYABLE(DateTimeEditElement); + WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(DateTimeEditElement); public: // EditControlOwner implementer must call removeEditControlOwner when // it doesn't handle event, e.g. at destruction. - class EditControlOwner { + class EditControlOwner : public WillBeGarbageCollectedMixin { public: virtual ~EditControlOwner(); virtual void didBlurFromControl() = 0; @@ -59,6 +60,7 @@ public: virtual bool isEditControlOwnerDisabled() const = 0; virtual bool isEditControlOwnerReadOnly() const = 0; virtual AtomicString localeIdentifier() const = 0; + virtual void editControlDidChangeValueByKeyboard() = 0; }; struct LayoutParameters { @@ -79,10 +81,12 @@ public: } }; - static PassRefPtr<DateTimeEditElement> create(Document&, EditControlOwner&); + static PassRefPtrWillBeRawPtr<DateTimeEditElement> create(Document&, EditControlOwner&); virtual ~DateTimeEditElement(); - void addField(PassRefPtr<DateTimeFieldElement>); + virtual void trace(Visitor*) OVERRIDE; + + void addField(PassRefPtrWillBeRawPtr<DateTimeFieldElement>); bool anyEditableFieldsHaveValues() const; void blurByOwner(); virtual void defaultEventHandler(Event*) OVERRIDE; @@ -94,7 +98,7 @@ public: void focusByOwner(Element* oldFocusedElement = 0); bool hasFocusedField(); void readOnlyStateChanged(); - void removeEditControlOwner() { m_editControlOwner = 0; } + void removeEditControlOwner() { m_editControlOwner = nullptr; } void resetFields(); void setEmptyValue(const LayoutParameters&, const DateComponents& dateForReadOnlyField); void setValueAsDate(const LayoutParameters&, const DateComponents&); @@ -136,17 +140,18 @@ private: virtual bool isDateTimeEditElement() const OVERRIDE; // DateTimeFieldElement::FieldOwner functions. - virtual void didBlurFromField() OVERRIDE FINAL; - virtual void didFocusOnField() OVERRIDE FINAL; - virtual void fieldValueChanged() OVERRIDE FINAL; - virtual bool focusOnNextField(const DateTimeFieldElement&) OVERRIDE FINAL; - virtual bool focusOnPreviousField(const DateTimeFieldElement&) OVERRIDE FINAL; - virtual bool isFieldOwnerDisabled() const OVERRIDE FINAL; - virtual bool isFieldOwnerReadOnly() const OVERRIDE FINAL; - virtual AtomicString localeIdentifier() const OVERRIDE FINAL; - - Vector<DateTimeFieldElement*, maximumNumberOfFields> m_fields; - EditControlOwner* m_editControlOwner; + virtual void didBlurFromField() OVERRIDE; + virtual void didFocusOnField() OVERRIDE; + virtual void fieldValueChanged() OVERRIDE; + virtual bool focusOnNextField(const DateTimeFieldElement&) OVERRIDE; + virtual bool focusOnPreviousField(const DateTimeFieldElement&) OVERRIDE; + virtual bool isFieldOwnerDisabled() const OVERRIDE; + virtual bool isFieldOwnerReadOnly() const OVERRIDE; + virtual AtomicString localeIdentifier() const OVERRIDE; + virtual void fieldDidChangeValueByKeyboard() OVERRIDE; + + WillBeHeapVector<RawPtrWillBeMember<DateTimeFieldElement>, maximumNumberOfFields> m_fields; + RawPtrWillBeMember<EditControlOwner> m_editControlOwner; }; DEFINE_TYPE_CASTS(DateTimeEditElement, Element, element, element->isDateTimeEditElement(), element.isDateTimeEditElement()); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.cpp index 31cdb06f9c4..e96cc7a4fb5 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.cpp @@ -27,7 +27,8 @@ #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) #include "core/html/shadow/DateTimeFieldElement.h" -#include "HTMLNames.h" +#include "core/HTMLNames.h" +#include "core/dom/Document.h" #include "core/dom/Text.h" #include "core/events/KeyboardEvent.h" #include "platform/text/PlatformLocale.h" @@ -52,22 +53,27 @@ DateTimeFieldElement::DateTimeFieldElement(Document& document, FieldOwner& field { } -void DateTimeFieldElement::defaultEventHandler(Event* event) +void DateTimeFieldElement::trace(Visitor* visitor) { - if (event->type() == EventTypeNames::blur) - didBlur(); - - if (event->type() == EventTypeNames::focus) - didFocus(); + visitor->trace(m_fieldOwner); + HTMLSpanElement::trace(visitor); +} +void DateTimeFieldElement::defaultEventHandler(Event* event) +{ if (event->isKeyboardEvent()) { KeyboardEvent* keyboardEvent = toKeyboardEvent(event); if (!isDisabled() && !isFieldOwnerDisabled() && !isFieldOwnerReadOnly()) { handleKeyboardEvent(keyboardEvent); - if (keyboardEvent->defaultHandled()) + if (keyboardEvent->defaultHandled()) { + if (m_fieldOwner) + m_fieldOwner->fieldDidChangeValueByKeyboard(); return; + } } defaultKeyboardEventHandler(keyboardEvent); + if (m_fieldOwner) + m_fieldOwner->fieldDidChangeValueByKeyboard(); if (keyboardEvent->defaultHandled()) return; } @@ -129,16 +135,11 @@ void DateTimeFieldElement::defaultKeyboardEventHandler(KeyboardEvent* keyboardEv } } -void DateTimeFieldElement::didBlur() -{ - if (m_fieldOwner) - m_fieldOwner->didBlurFromField(); -} - -void DateTimeFieldElement::didFocus() +void DateTimeFieldElement::setFocus(bool value) { if (m_fieldOwner) - m_fieldOwner->didFocusOnField(); + value ? m_fieldOwner->didFocusOnField() : m_fieldOwner->didBlurFromField(); + ContainerNode::setFocus(value); } void DateTimeFieldElement::focusOnNextField() @@ -152,12 +153,12 @@ void DateTimeFieldElement::initialize(const AtomicString& pseudo, const String& { // On accessibility, DateTimeFieldElement acts like spin button. setAttribute(roleAttr, AtomicString("spinbutton", AtomicString::ConstructFromLiteral)); - setAttribute(aria_valuetextAttr, emptyValueAXText()); - setAttribute(aria_valueminAttr, String::number(axMinimum)); - setAttribute(aria_valuemaxAttr, String::number(axMaximum)); + setAttribute(aria_valuetextAttr, AtomicString(emptyValueAXText())); + setAttribute(aria_valueminAttr, AtomicString::number(axMinimum)); + setAttribute(aria_valuemaxAttr, AtomicString::number(axMaximum)); - setAttribute(aria_helpAttr, axHelpText); - setPseudo(pseudo); + setAttribute(aria_helpAttr, AtomicString(axHelpText)); + setShadowPseudoId(pseudo); appendChild(Text::create(document(), visibleValue())); } @@ -201,7 +202,7 @@ void DateTimeFieldElement::setDisabled() { // Set HTML attribute disabled to change apperance. setBooleanAttribute(disabledAttr, true); - setNeedsStyleRecalc(); + setNeedsStyleRecalc(SubtreeStyleChange); } bool DateTimeFieldElement::supportsFocus() const @@ -220,10 +221,10 @@ void DateTimeFieldElement::updateVisibleValue(EventBehavior eventBehavior) textNode->replaceWholeText(newVisibleValue); if (hasValue()) { - setAttribute(aria_valuetextAttr, newVisibleValue); - setAttribute(aria_valuenowAttr, String::number(valueForARIAValueNow())); + setAttribute(aria_valuetextAttr, AtomicString(newVisibleValue)); + setAttribute(aria_valuenowAttr, AtomicString::number(valueForARIAValueNow())); } else { - setAttribute(aria_valuetextAttr, emptyValueAXText()); + setAttribute(aria_valuetextAttr, AtomicString(emptyValueAXText())); removeAttribute(aria_valuenowAttr); } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.h index a2e42a9599b..1fe32594769 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElement.h @@ -48,7 +48,7 @@ public: // FieldOwner implementer must call removeEventHandler when // it doesn't handle event, e.g. at destruction. - class FieldOwner { + class FieldOwner : public WillBeGarbageCollectedMixin { public: virtual ~FieldOwner(); virtual void didBlurFromField() = 0; @@ -59,6 +59,7 @@ public: virtual bool isFieldOwnerDisabled() const = 0; virtual bool isFieldOwnerReadOnly() const = 0; virtual AtomicString localeIdentifier() const = 0; + virtual void fieldDidChangeValueByKeyboard() = 0; }; virtual void defaultEventHandler(Event*) OVERRIDE; @@ -66,7 +67,7 @@ public: bool isDisabled() const; virtual float maximumWidth(const Font&); virtual void populateDateTimeFieldsState(DateTimeFieldsState&) = 0; - void removeEventHandler() { m_fieldOwner = 0; } + void removeEventHandler() { m_fieldOwner = nullptr; } void setDisabled(); virtual void setEmptyValue(EventBehavior = DispatchNoEvent) = 0; virtual void setValueAsDate(const DateComponents&) = 0; @@ -76,11 +77,10 @@ public: virtual void stepUp() = 0; virtual String value() const = 0; virtual String visibleValue() const = 0; + virtual void trace(Visitor*) OVERRIDE; protected: DateTimeFieldElement(Document&, FieldOwner&); - virtual void didBlur(); - virtual void didFocus(); void focusOnNextField(); virtual void handleKeyboardEvent(KeyboardEvent*) = 0; void initialize(const AtomicString& pseudo, const String& axHelpText, int axMinimum, int axMaximum); @@ -90,14 +90,17 @@ protected: virtual int valueAsInteger() const = 0; virtual int valueForARIAValueNow() const; + // Node functions. + virtual void setFocus(bool) OVERRIDE; + private: void defaultKeyboardEventHandler(KeyboardEvent*); - virtual bool isDateTimeFieldElement() const OVERRIDE; + virtual bool isDateTimeFieldElement() const OVERRIDE FINAL; bool isFieldOwnerDisabled() const; bool isFieldOwnerReadOnly() const; virtual bool supportsFocus() const OVERRIDE FINAL; - FieldOwner* m_fieldOwner; + RawPtrWillBeMember<FieldOwner> m_fieldOwner; }; } // namespace WebCore diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp index 5353c04ff2e..9479d9682ba 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp @@ -47,10 +47,10 @@ DateTimeAMPMFieldElement::DateTimeAMPMFieldElement(Document& document, FieldOwne { } -PassRefPtr<DateTimeAMPMFieldElement> DateTimeAMPMFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels) +PassRefPtrWillBeRawPtr<DateTimeAMPMFieldElement> DateTimeAMPMFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels) { DEFINE_STATIC_LOCAL(AtomicString, ampmPsuedoId, ("-webkit-datetime-edit-ampm-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeAMPMFieldElement> field = adoptRef(new DateTimeAMPMFieldElement(document, fieldOwner, ampmLabels)); + RefPtrWillBeRawPtr<DateTimeAMPMFieldElement> field = adoptRefWillBeNoop(new DateTimeAMPMFieldElement(document, fieldOwner, ampmLabels)); field->initialize(ampmPsuedoId, queryString(WebLocalizedString::AXAMPMFieldText)); return field.release(); } @@ -83,10 +83,10 @@ DateTimeDayFieldElement::DateTimeDayFieldElement(Document& document, FieldOwner& { } -PassRefPtr<DateTimeDayFieldElement> DateTimeDayFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) +PassRefPtrWillBeRawPtr<DateTimeDayFieldElement> DateTimeDayFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) { DEFINE_STATIC_LOCAL(AtomicString, dayPsuedoId, ("-webkit-datetime-edit-day-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeDayFieldElement> field = adoptRef(new DateTimeDayFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); + RefPtrWillBeRawPtr<DateTimeDayFieldElement> field = adoptRefWillBeNoop(new DateTimeDayFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); field->initialize(dayPsuedoId, queryString(WebLocalizedString::AXDayOfMonthFieldText)); return field.release(); } @@ -159,7 +159,7 @@ DateTimeHour11FieldElement::DateTimeHour11FieldElement(Document& document, Field { } -PassRefPtr<DateTimeHour11FieldElement> DateTimeHour11FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeHour11FieldElement> DateTimeHour11FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) { ASSERT(hour23Range.minimum >= 0); ASSERT(hour23Range.maximum <= 23); @@ -172,7 +172,7 @@ PassRefPtr<DateTimeHour11FieldElement> DateTimeHour11FieldElement::create(Docume range.maximum = hour23Range.maximum - 12; } - RefPtr<DateTimeHour11FieldElement> field = adoptRef(new DateTimeHour11FieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeHour11FieldElement> field = adoptRefWillBeNoop(new DateTimeHour11FieldElement(document, fieldOwner, range, step)); field->initialize(); return field.release(); } @@ -200,7 +200,7 @@ DateTimeHour12FieldElement::DateTimeHour12FieldElement(Document& document, Field { } -PassRefPtr<DateTimeHour12FieldElement> DateTimeHour12FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeHour12FieldElement> DateTimeHour12FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) { ASSERT(hour23Range.minimum >= 0); ASSERT(hour23Range.maximum <= 23); @@ -220,7 +220,7 @@ PassRefPtr<DateTimeHour12FieldElement> DateTimeHour12FieldElement::create(Docume range.minimum = 1; range.maximum = 12; } - RefPtr<DateTimeHour12FieldElement> field = adoptRef(new DateTimeHour12FieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeHour12FieldElement> field = adoptRefWillBeNoop(new DateTimeHour12FieldElement(document, fieldOwner, range, step)); field->initialize(); return field.release(); } @@ -243,12 +243,12 @@ DateTimeHour23FieldElement::DateTimeHour23FieldElement(Document& document, Field { } -PassRefPtr<DateTimeHour23FieldElement> DateTimeHour23FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeHour23FieldElement> DateTimeHour23FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) { ASSERT(hour23Range.minimum >= 0); ASSERT(hour23Range.maximum <= 23); ASSERT(hour23Range.minimum <= hour23Range.maximum); - RefPtr<DateTimeHour23FieldElement> field = adoptRef(new DateTimeHour23FieldElement(document, fieldOwner, hour23Range, step)); + RefPtrWillBeRawPtr<DateTimeHour23FieldElement> field = adoptRefWillBeNoop(new DateTimeHour23FieldElement(document, fieldOwner, hour23Range, step)); field->initialize(); return field.release(); } @@ -279,7 +279,7 @@ DateTimeHour24FieldElement::DateTimeHour24FieldElement(Document& document, Field { } -PassRefPtr<DateTimeHour24FieldElement> DateTimeHour24FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeHour24FieldElement> DateTimeHour24FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step) { ASSERT(hour23Range.minimum >= 0); ASSERT(hour23Range.maximum <= 23); @@ -290,7 +290,7 @@ PassRefPtr<DateTimeHour24FieldElement> DateTimeHour24FieldElement::create(Docume range.maximum = 24; } - RefPtr<DateTimeHour24FieldElement> field = adoptRef(new DateTimeHour24FieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeHour24FieldElement> field = adoptRefWillBeNoop(new DateTimeHour24FieldElement(document, fieldOwner, range, step)); field->initialize(); return field.release(); } @@ -326,10 +326,10 @@ DateTimeMillisecondFieldElement::DateTimeMillisecondFieldElement(Document& docum { } -PassRefPtr<DateTimeMillisecondFieldElement> DateTimeMillisecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeMillisecondFieldElement> DateTimeMillisecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) { DEFINE_STATIC_LOCAL(AtomicString, millisecondPsuedoId, ("-webkit-datetime-edit-millisecond-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeMillisecondFieldElement> field = adoptRef(new DateTimeMillisecondFieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeMillisecondFieldElement> field = adoptRefWillBeNoop(new DateTimeMillisecondFieldElement(document, fieldOwner, range, step)); field->initialize(millisecondPsuedoId, queryString(WebLocalizedString::AXMillisecondFieldText)); return field.release(); } @@ -367,10 +367,10 @@ DateTimeMinuteFieldElement::DateTimeMinuteFieldElement(Document& document, Field { } -PassRefPtr<DateTimeMinuteFieldElement> DateTimeMinuteFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeMinuteFieldElement> DateTimeMinuteFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) { DEFINE_STATIC_LOCAL(AtomicString, minutePsuedoId, ("-webkit-datetime-edit-minute-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeMinuteFieldElement> field = adoptRef(new DateTimeMinuteFieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeMinuteFieldElement> field = adoptRefWillBeNoop(new DateTimeMinuteFieldElement(document, fieldOwner, range, step)); field->initialize(minutePsuedoId, queryString(WebLocalizedString::AXMinuteFieldText)); return field.release(); } @@ -408,10 +408,10 @@ DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document& document, FieldOw { } -PassRefPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) +PassRefPtrWillBeRawPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range) { DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeMonthFieldElement> field = adoptRef(new DateTimeMonthFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); + RefPtrWillBeRawPtr<DateTimeMonthFieldElement> field = adoptRefWillBeNoop(new DateTimeMonthFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range)); field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText)); return field.release(); } @@ -449,10 +449,10 @@ DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document& document, Field { } -PassRefPtr<DateTimeSecondFieldElement> DateTimeSecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) +PassRefPtrWillBeRawPtr<DateTimeSecondFieldElement> DateTimeSecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step) { DEFINE_STATIC_LOCAL(AtomicString, secondPsuedoId, ("-webkit-datetime-edit-second-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeSecondFieldElement> field = adoptRef(new DateTimeSecondFieldElement(document, fieldOwner, range, step)); + RefPtrWillBeRawPtr<DateTimeSecondFieldElement> field = adoptRefWillBeNoop(new DateTimeSecondFieldElement(document, fieldOwner, range, step)); field->initialize(secondPsuedoId, queryString(WebLocalizedString::AXSecondFieldText)); return field.release(); } @@ -490,10 +490,10 @@ DateTimeSymbolicMonthFieldElement::DateTimeSymbolicMonthFieldElement(Document& d { } -PassRefPtr<DateTimeSymbolicMonthFieldElement> DateTimeSymbolicMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum) +PassRefPtrWillBeRawPtr<DateTimeSymbolicMonthFieldElement> DateTimeSymbolicMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum) { DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeSymbolicMonthFieldElement> field = adoptRef(new DateTimeSymbolicMonthFieldElement(document, fieldOwner, labels, minimum, maximum)); + RefPtrWillBeRawPtr<DateTimeSymbolicMonthFieldElement> field = adoptRefWillBeNoop(new DateTimeSymbolicMonthFieldElement(document, fieldOwner, labels, minimum, maximum)); field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText)); return field.release(); } @@ -534,10 +534,10 @@ DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document& document, FieldOwne { } -PassRefPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range) +PassRefPtrWillBeRawPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range) { DEFINE_STATIC_LOCAL(AtomicString, weekPsuedoId, ("-webkit-datetime-edit-week-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeWeekFieldElement> field = adoptRef(new DateTimeWeekFieldElement(document, fieldOwner, range)); + RefPtrWillBeRawPtr<DateTimeWeekFieldElement> field = adoptRefWillBeNoop(new DateTimeWeekFieldElement(document, fieldOwner, range)); field->initialize(weekPsuedoId, queryString(WebLocalizedString::AXWeekOfYearFieldText)); return field.release(); } @@ -579,10 +579,10 @@ DateTimeYearFieldElement::DateTimeYearFieldElement(Document& document, FieldOwne ASSERT(parameters.maximumYear <= DateComponents::maximumYear()); } -PassRefPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters) +PassRefPtrWillBeRawPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters) { DEFINE_STATIC_LOCAL(AtomicString, yearPsuedoId, ("-webkit-datetime-edit-year-field", AtomicString::ConstructFromLiteral)); - RefPtr<DateTimeYearFieldElement> field = adoptRef(new DateTimeYearFieldElement(document, fieldOwner, parameters)); + RefPtrWillBeRawPtr<DateTimeYearFieldElement> field = adoptRefWillBeNoop(new DateTimeYearFieldElement(document, fieldOwner, parameters)); field->initialize(yearPsuedoId, queryString(WebLocalizedString::AXYearFieldText)); return field.release(); } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.h b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.h index fb8ef52b22e..19050dbf6dc 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.h @@ -36,30 +36,30 @@ class DateTimeAMPMFieldElement FINAL : public DateTimeSymbolicFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeAMPMFieldElement); public: - static PassRefPtr<DateTimeAMPMFieldElement> create(Document&, FieldOwner&, const Vector<String>&); + static PassRefPtrWillBeRawPtr<DateTimeAMPMFieldElement> create(Document&, FieldOwner&, const Vector<String>&); private: DateTimeAMPMFieldElement(Document&, FieldOwner&, const Vector<String>&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeDayFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeDayFieldElement); public: - static PassRefPtr<DateTimeDayFieldElement> create(Document&, FieldOwner&, const String& placeholder, const Range&); + static PassRefPtrWillBeRawPtr<DateTimeDayFieldElement> create(Document&, FieldOwner&, const String& placeholder, const Range&); private: DateTimeDayFieldElement(Document&, FieldOwner&, const String& placeholder, const Range&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeHourFieldElementBase : public DateTimeNumericFieldElement { @@ -71,154 +71,154 @@ protected: private: // DateTimeFieldElement functions. - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeHour11FieldElement FINAL : public DateTimeHourFieldElementBase { WTF_MAKE_NONCOPYABLE(DateTimeHour11FieldElement); public: - static PassRefPtr<DateTimeHour11FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeHour11FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeHour11FieldElement(Document&, FieldOwner&, const Range& hour23Range, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE; }; class DateTimeHour12FieldElement FINAL : public DateTimeHourFieldElementBase { WTF_MAKE_NONCOPYABLE(DateTimeHour12FieldElement); public: - static PassRefPtr<DateTimeHour12FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeHour12FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeHour12FieldElement(Document&, FieldOwner&, const Range& hour23Range, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE; }; class DateTimeHour23FieldElement FINAL : public DateTimeHourFieldElementBase { WTF_MAKE_NONCOPYABLE(DateTimeHour23FieldElement); public: - static PassRefPtr<DateTimeHour23FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeHour23FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeHour23FieldElement(Document&, FieldOwner&, const Range& hour23Range, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE; }; class DateTimeHour24FieldElement FINAL : public DateTimeHourFieldElementBase { WTF_MAKE_NONCOPYABLE(DateTimeHour24FieldElement); public: - static PassRefPtr<DateTimeHour24FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeHour24FieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeHour24FieldElement(Document&, FieldOwner&, const Range& hour23Range, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE; }; class DateTimeMillisecondFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeMillisecondFieldElement); public: - static PassRefPtr<DateTimeMillisecondFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeMillisecondFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeMillisecondFieldElement(Document&, FieldOwner&, const Range&, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeMinuteFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeMinuteFieldElement); public: - static PassRefPtr<DateTimeMinuteFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeMinuteFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeMinuteFieldElement(Document&, FieldOwner&, const Range&, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeMonthFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeMonthFieldElement); public: - static PassRefPtr<DateTimeMonthFieldElement> create(Document&, FieldOwner&, const String& placeholder, const Range&); + static PassRefPtrWillBeRawPtr<DateTimeMonthFieldElement> create(Document&, FieldOwner&, const String& placeholder, const Range&); private: DateTimeMonthFieldElement(Document&, FieldOwner&, const String& placeholder, const Range&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeSecondFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeSecondFieldElement); public: - static PassRefPtr<DateTimeSecondFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); + static PassRefPtrWillBeRawPtr<DateTimeSecondFieldElement> create(Document&, FieldOwner&, const Range&, const Step&); private: DateTimeSecondFieldElement(Document&, FieldOwner&, const Range&, const Step&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeSymbolicMonthFieldElement FINAL : public DateTimeSymbolicFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeSymbolicMonthFieldElement); public: - static PassRefPtr<DateTimeSymbolicMonthFieldElement> create(Document&, FieldOwner&, const Vector<String>&, int minimum, int maximum); + static PassRefPtrWillBeRawPtr<DateTimeSymbolicMonthFieldElement> create(Document&, FieldOwner&, const Vector<String>&, int minimum, int maximum); private: DateTimeSymbolicMonthFieldElement(Document&, FieldOwner&, const Vector<String>&, int minimum, int maximum); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeWeekFieldElement FINAL : public DateTimeNumericFieldElement { WTF_MAKE_NONCOPYABLE(DateTimeWeekFieldElement); public: - static PassRefPtr<DateTimeWeekFieldElement> create(Document&, FieldOwner&, const Range&); + static PassRefPtrWillBeRawPtr<DateTimeWeekFieldElement> create(Document&, FieldOwner&, const Range&); private: DateTimeWeekFieldElement(Document&, FieldOwner&, const Range&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; }; class DateTimeYearFieldElement FINAL : public DateTimeNumericFieldElement { @@ -241,19 +241,19 @@ public: } }; - static PassRefPtr<DateTimeYearFieldElement> create(Document&, FieldOwner&, const Parameters&); + static PassRefPtrWillBeRawPtr<DateTimeYearFieldElement> create(Document&, FieldOwner&, const Parameters&); private: DateTimeYearFieldElement(Document&, FieldOwner&, const Parameters&); // DateTimeFieldElement functions. - virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL; - virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL; - virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL; + virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE; + virtual void setValueAsDate(const DateComponents&) OVERRIDE; + virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE; // DateTimeNumericFieldElement functions. - virtual int defaultValueForStepDown() const OVERRIDE FINAL; - virtual int defaultValueForStepUp() const OVERRIDE FINAL; + virtual int defaultValueForStepDown() const OVERRIDE; + virtual int defaultValueForStepUp() const OVERRIDE; bool m_minIsSpecified; bool m_maxIsSpecified; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.cpp index 537416f7402..64b3e46b90c 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.cpp @@ -27,8 +27,8 @@ #if ENABLE(INPUT_MULTIPLE_FIELDS_UI) #include "core/html/shadow/DateTimeNumericFieldElement.h" -#include "CSSPropertyNames.h" -#include "CSSValueKeywords.h" +#include "core/CSSPropertyNames.h" +#include "core/CSSValueKeywords.h" #include "core/events/KeyboardEvent.h" #include "platform/fonts/Font.h" #include "platform/text/PlatformLocale.h" @@ -91,13 +91,15 @@ int DateTimeNumericFieldElement::defaultValueForStepUp() const return m_range.minimum; } -void DateTimeNumericFieldElement::didBlur() +void DateTimeNumericFieldElement::setFocus(bool value) { - int value = typeAheadValue(); - m_typeAheadBuffer.clear(); - if (value >= 0) - setValueAsInteger(value, DispatchEvent); - DateTimeFieldElement::didBlur(); + if (!value) { + int value = typeAheadValue(); + m_typeAheadBuffer.clear(); + if (value >= 0) + setValueAsInteger(value, DispatchEvent); + } + DateTimeFieldElement::setFocus(value); } String DateTimeNumericFieldElement::formatValue(int value) const @@ -122,6 +124,13 @@ void DateTimeNumericFieldElement::handleKeyboardEvent(KeyboardEvent* keyboardEve if (digit < 0 || digit > 9) return; + unsigned maximumLength = DateTimeNumericFieldElement::formatValue(m_range.maximum).length(); + if (m_typeAheadBuffer.length() >= maximumLength) { + String current = m_typeAheadBuffer.toString(); + m_typeAheadBuffer.clear(); + unsigned desiredLength = maximumLength - 1; + m_typeAheadBuffer.append(current, current.length() - desiredLength, desiredLength); + } m_typeAheadBuffer.append(number); int newValue = typeAheadValue(); if (newValue >= m_hardLimits.minimum) @@ -131,7 +140,7 @@ void DateTimeNumericFieldElement::handleKeyboardEvent(KeyboardEvent* keyboardEve updateVisibleValue(DispatchEvent); } - if (m_typeAheadBuffer.length() >= DateTimeNumericFieldElement::formatValue(m_range.maximum).length() || newValue * 10 > m_range.maximum) + if (m_typeAheadBuffer.length() >= maximumLength || newValue * 10 > m_range.maximum) focusOnNextField(); keyboardEvent->setDefaultHandled(); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.h index 9b96fb54e3b..9a6272f8f01 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeNumericFieldElement.h @@ -80,13 +80,15 @@ protected: private: // DateTimeFieldElement functions. - virtual void didBlur() OVERRIDE FINAL; virtual void handleKeyboardEvent(KeyboardEvent*) OVERRIDE FINAL; virtual float maximumWidth(const Font&) OVERRIDE; virtual void stepDown() OVERRIDE FINAL; virtual void stepUp() OVERRIDE FINAL; virtual String value() const OVERRIDE FINAL; + // Node functions. + virtual void setFocus(bool) OVERRIDE FINAL; + String formatValue(int) const; int roundUp(int) const; int roundDown(int) const; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.cpp index f3f2adb3b8e..3da57cd08ea 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.cpp @@ -31,7 +31,7 @@ #include "config.h" #include "core/html/shadow/DetailsMarkerControl.h" -#include "HTMLNames.h" +#include "core/HTMLNames.h" #include "core/html/HTMLSummaryElement.h" #include "core/rendering/RenderDetailsMarker.h" diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.h b/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.h index 118063ef090..62fe336a698 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/DetailsMarkerControl.h @@ -40,20 +40,20 @@ class HTMLSummaryElement; class DetailsMarkerControl FINAL : public HTMLDivElement { public: - DetailsMarkerControl(Document&); - static PassRefPtr<DetailsMarkerControl> create(Document&); + explicit DetailsMarkerControl(Document&); + static PassRefPtrWillBeRawPtr<DetailsMarkerControl> create(Document&); private: - virtual RenderObject* createRenderer(RenderStyle*); - virtual bool rendererIsNeeded(const RenderStyle&); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; + virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE; HTMLSummaryElement* summaryElement(); }; -inline PassRefPtr<DetailsMarkerControl> DetailsMarkerControl::create(Document& document) +inline PassRefPtrWillBeRawPtr<DetailsMarkerControl> DetailsMarkerControl::create(Document& document) { - RefPtr<DetailsMarkerControl> element = adoptRef(new DetailsMarkerControl(document)); - element->setPseudo(AtomicString("-webkit-details-marker", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<DetailsMarkerControl> element = adoptRefWillBeNoop(new DetailsMarkerControl(document)); + element->setShadowPseudoId(AtomicString("-webkit-details-marker", AtomicString::ConstructFromLiteral)); return element.release(); } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.cpp deleted file mode 100644 index 81691295e85..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/html/shadow/HTMLContentElement.h" - -#include "HTMLNames.h" -#include "core/css/CSSParser.h" -#include "core/css/SelectorChecker.h" -#include "core/css/SiblingTraversalStrategies.h" -#include "core/dom/QualifiedName.h" -#include "core/dom/shadow/ElementShadow.h" -#include "core/dom/shadow/ShadowRoot.h" - -namespace WebCore { - -using namespace HTMLNames; - -PassRefPtr<HTMLContentElement> HTMLContentElement::create(Document& document) -{ - return adoptRef(new HTMLContentElement(document)); -} - -HTMLContentElement::HTMLContentElement(Document& document) - : InsertionPoint(contentTag, document) - , m_shouldParseSelect(false) - , m_isValidSelector(true) -{ - ScriptWrappable::init(this); -} - -HTMLContentElement::~HTMLContentElement() -{ -} - -void HTMLContentElement::parseSelect() -{ - ASSERT(m_shouldParseSelect); - - CSSParser parser(document()); - parser.parseSelector(m_select, m_selectorList); - m_shouldParseSelect = false; - m_isValidSelector = validateSelect(); - if (!m_isValidSelector) { - CSSSelectorList emptyList; - m_selectorList.adopt(emptyList); - } -} - -void HTMLContentElement::parseAttribute(const QualifiedName& name, const AtomicString& value) -{ - if (name == selectAttr) { - if (ShadowRoot* root = containingShadowRoot()) - root->owner()->willAffectSelector(); - m_shouldParseSelect = true; - m_select = value; - } else - InsertionPoint::parseAttribute(name, value); -} - -bool HTMLContentElement::validateSelect() const -{ - ASSERT(!m_shouldParseSelect); - - if (m_select.isNull() || m_select.isEmpty()) - return true; - - if (!m_selectorList.isValid()) - return false; - - for (const CSSSelector* selector = m_selectorList.first(); selector; selector = m_selectorList.next(selector)) { - if (!selector->isCompound()) - return false; - } - - return true; -} - -static inline bool checkOneSelector(const CSSSelector* selector, const Vector<Node*, 32>& siblings, int nth) -{ - Element* element = toElement(siblings[nth]); - SelectorChecker selectorChecker(element->document(), SelectorChecker::CollectingCSSRules); - SelectorChecker::SelectorCheckingContext context(selector, element, SelectorChecker::VisitedMatchEnabled); - ShadowDOMSiblingTraversalStrategy strategy(siblings, nth); - return selectorChecker.match(context, strategy) == SelectorChecker::SelectorMatches; -} - -bool HTMLContentElement::matchSelector(const Vector<Node*, 32>& siblings, int nth) const -{ - for (const CSSSelector* selector = selectorList().first(); selector; selector = CSSSelectorList::next(selector)) { - if (checkOneSelector(selector, siblings, nth)) - return true; - } - return false; -} - -} diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.h deleted file mode 100644 index b8f0f4fdd58..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef HTMLContentElement_h -#define HTMLContentElement_h - -#include "core/css/CSSSelectorList.h" -#include "core/dom/shadow/InsertionPoint.h" - -namespace WebCore { - -class HTMLContentElement FINAL : public InsertionPoint { -public: - static PassRefPtr<HTMLContentElement> create(Document&); - - virtual ~HTMLContentElement(); - - virtual bool canAffectSelector() const OVERRIDE { return true; } - - bool canSelectNode(const Vector<Node*, 32>& siblings, int nth) const; - - const CSSSelectorList& selectorList() const; - bool isSelectValid() const; - -private: - explicit HTMLContentElement(Document&); - - virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE; - - bool validateSelect() const; - void parseSelect(); - - bool matchSelector(const Vector<Node*, 32>& siblings, int nth) const; - - bool m_shouldParseSelect; - bool m_isValidSelector; - AtomicString m_select; - CSSSelectorList m_selectorList; -}; - -inline const CSSSelectorList& HTMLContentElement::selectorList() const -{ - if (m_shouldParseSelect) - const_cast<HTMLContentElement*>(this)->parseSelect(); - return m_selectorList; -} - -inline bool HTMLContentElement::isSelectValid() const -{ - if (m_shouldParseSelect) - const_cast<HTMLContentElement*>(this)->parseSelect(); - return m_isValidSelector; -} - -inline bool HTMLContentElement::canSelectNode(const Vector<Node*, 32>& siblings, int nth) const -{ - if (m_select.isNull() || m_select.isEmpty()) - return true; - if (!isSelectValid()) - return false; - if (!siblings[nth]->isElementNode()) - return false; - return matchSelector(siblings, nth); -} - -inline bool isHTMLContentElement(const Node* node) -{ - return node->hasTagName(HTMLNames::contentTag); -} - -inline bool isHTMLContentElement(const Element* element) -{ - return element->hasTagName(HTMLNames::contentTag); -} - -DEFINE_NODE_TYPE_CASTS(HTMLContentElement, hasTagName(HTMLNames::contentTag)); - -} - -#endif diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.idl b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.idl deleted file mode 100644 index ab593425152..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLContentElement.idl +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -[ -] interface HTMLContentElement : HTMLElement { - [Reflect, TreatNullAs=NullString] attribute DOMString select; - attribute boolean resetStyleInheritance; - NodeList getDistributedNodes(); -}; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.cpp deleted file mode 100644 index edfba07e3e1..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/html/shadow/HTMLShadowElement.h" - -#include "HTMLNames.h" -#include "core/dom/shadow/ShadowRoot.h" - -namespace WebCore { - -class Document; - -inline HTMLShadowElement::HTMLShadowElement(Document& document) - : InsertionPoint(HTMLNames::shadowTag, document) -{ - ScriptWrappable::init(this); -} - -PassRefPtr<HTMLShadowElement> HTMLShadowElement::create(Document& document) -{ - return adoptRef(new HTMLShadowElement(document)); -} - -HTMLShadowElement::~HTMLShadowElement() -{ -} - -ShadowRoot* HTMLShadowElement::olderShadowRoot() -{ - ShadowRoot* containingRoot = containingShadowRoot(); - if (!containingRoot) - return 0; - - document().updateDistributionForNodeIfNeeded(this); - - ShadowRoot* older = containingRoot->olderShadowRoot(); - if (!older || !older->shouldExposeToBindings() || older->shadowInsertionPointOfYoungerShadowRoot() != this) - return 0; - - ASSERT(older->shouldExposeToBindings()); - return older; -} - -Node::InsertionNotificationRequest HTMLShadowElement::insertedInto(ContainerNode* insertionPoint) -{ - if (insertionPoint->inDocument()) { - // Warn if trying to reproject between user agent and author shadows. - ShadowRoot* root = containingShadowRoot(); - if (root && root->olderShadowRoot() && root->type() != root->olderShadowRoot()->type()) { - String message = String::format("<shadow> doesn't work for %s element host.", root->host()->tagName().utf8().data()); - document().addConsoleMessage(RenderingMessageSource, WarningMessageLevel, message); - } - } - return InsertionPoint::insertedInto(insertionPoint); -} - -} // namespace WebCore - diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.h deleted file mode 100644 index 77741ecc588..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef HTMLShadowElement_h -#define HTMLShadowElement_h - -#include "core/dom/shadow/InsertionPoint.h" -#include "wtf/Forward.h" - -namespace WebCore { - -class HTMLShadowElement FINAL : public InsertionPoint { -public: - static PassRefPtr<HTMLShadowElement> create(Document&); - - virtual ~HTMLShadowElement(); - - ShadowRoot* olderShadowRoot(); - -private: - explicit HTMLShadowElement(Document&); - virtual InsertionNotificationRequest insertedInto(ContainerNode* insertionPoint) OVERRIDE; -}; - -inline bool isHTMLShadowElement(const Node* node) -{ - ASSERT(node); - return node->hasTagName(HTMLNames::shadowTag); -} - -DEFINE_NODE_TYPE_CASTS(HTMLShadowElement, hasTagName(HTMLNames::shadowTag)); - -} // namespace WebCore - -#endif // HTMLShadowElement_h diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.idl b/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.idl deleted file mode 100644 index faceace1458..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/HTMLShadowElement.idl +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -interface HTMLShadowElement : HTMLElement { - attribute boolean resetStyleInheritance; - [DeprecateAs=HTMLShadowElementOlderShadowRoot] readonly attribute ShadowRoot olderShadowRoot; - [RuntimeEnabled=ShadowDOM] NodeList getDistributedNodes(); -}; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp index dc7f986e04e..989244d1bf8 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.cpp @@ -31,11 +31,13 @@ #include "core/html/shadow/MediaControlElementTypes.h" -#include "CSSValueKeywords.h" -#include "HTMLNames.h" #include "bindings/v8/ExceptionStatePlaceholder.h" +#include "core/CSSValueKeywords.h" +#include "core/HTMLNames.h" #include "core/css/StylePropertySet.h" #include "core/events/MouseEvent.h" +#include "core/html/HTMLMediaElement.h" +#include "core/html/shadow/MediaControls.h" namespace WebCore { @@ -50,7 +52,7 @@ HTMLMediaElement* toParentMediaElement(Node* node) Node* mediaNode = node->shadowHost(); if (!mediaNode) mediaNode = node; - if (!mediaNode || !mediaNode->isElementNode() || !toElement(mediaNode)->isMediaElement()) + if (!isHTMLMediaElement(mediaNode)) return 0; return toHTMLMediaElement(mediaNode); @@ -60,18 +62,23 @@ MediaControlElementType mediaControlElementType(Node* node) { ASSERT_WITH_SECURITY_IMPLICATION(node->isMediaControlElement()); HTMLElement* element = toHTMLElement(node); - if (element->hasTagName(inputTag)) + if (isHTMLInputElement(*element)) return static_cast<MediaControlInputElement*>(element)->displayType(); return static_cast<MediaControlDivElement*>(element)->displayType(); } -MediaControlElement::MediaControlElement(MediaControlElementType displayType, HTMLElement* element) - : m_mediaController(0) +MediaControlElement::MediaControlElement(MediaControls& mediaControls, MediaControlElementType displayType, HTMLElement* element) + : m_mediaControls(mediaControls) , m_displayType(displayType) , m_element(element) { } +HTMLMediaElement& MediaControlElement::mediaElement() const +{ + return mediaControls().mediaElement(); +} + void MediaControlElement::hide() { m_element->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); @@ -82,14 +89,6 @@ void MediaControlElement::show() m_element->removeInlineStyleProperty(CSSPropertyDisplay); } -bool MediaControlElement::isShowing() const -{ - const StylePropertySet* propertySet = m_element->inlineStyle(); - // Following the code from show() and hide() above, we only have - // to check for the presense of inline display. - return (!propertySet || !propertySet->getPropertyCSSValue(CSSPropertyDisplay)); -} - void MediaControlElement::setDisplayType(MediaControlElementType displayType) { if (displayType == m_displayType) @@ -97,22 +96,22 @@ void MediaControlElement::setDisplayType(MediaControlElementType displayType) m_displayType = displayType; if (RenderObject* object = m_element->renderer()) - object->repaint(); + object->paintInvalidationForWholeRenderer(); } // ---------------------------- -MediaControlDivElement::MediaControlDivElement(Document& document, MediaControlElementType displayType) - : HTMLDivElement(document) - , MediaControlElement(displayType, this) +MediaControlDivElement::MediaControlDivElement(MediaControls& mediaControls, MediaControlElementType displayType) + : HTMLDivElement(mediaControls.document()) + , MediaControlElement(mediaControls, displayType, this) { } // ---------------------------- -MediaControlInputElement::MediaControlInputElement(Document& document, MediaControlElementType displayType) - : HTMLInputElement(document, 0, false) - , MediaControlElement(displayType, this) +MediaControlInputElement::MediaControlInputElement(MediaControls& mediaControls, MediaControlElementType displayType) + : HTMLInputElement(mediaControls.document(), 0, false) + , MediaControlElement(mediaControls, displayType, this) { } @@ -123,8 +122,8 @@ bool MediaControlInputElement::isMouseFocusable() const // ---------------------------- -MediaControlTimeDisplayElement::MediaControlTimeDisplayElement(Document& document, MediaControlElementType displayType) - : MediaControlDivElement(document, displayType) +MediaControlTimeDisplayElement::MediaControlTimeDisplayElement(MediaControls& mediaControls, MediaControlElementType displayType) + : MediaControlDivElement(mediaControls, displayType) , m_currentValue(0) { } @@ -134,87 +133,4 @@ void MediaControlTimeDisplayElement::setCurrentValue(double time) m_currentValue = time; } -// ---------------------------- - -MediaControlMuteButtonElement::MediaControlMuteButtonElement(Document& document, MediaControlElementType displayType) - : MediaControlInputElement(document, displayType) -{ -} - -void MediaControlMuteButtonElement::defaultEventHandler(Event* event) -{ - if (event->type() == EventTypeNames::click) { - mediaController()->setMuted(!mediaController()->muted()); - event->setDefaultHandled(); - } - - HTMLInputElement::defaultEventHandler(event); -} - -void MediaControlMuteButtonElement::changedMute() -{ - updateDisplayType(); -} - -void MediaControlMuteButtonElement::updateDisplayType() -{ - setDisplayType(mediaController()->muted() ? MediaUnMuteButton : MediaMuteButton); -} - -// ---------------------------- - -MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(Document& document) - : MediaControlInputElement(document, MediaVolumeSlider) - , m_clearMutedOnUserInteraction(false) -{ -} - -void MediaControlVolumeSliderElement::defaultEventHandler(Event* event) -{ - // Left button is 0. Rejects mouse events not from left button. - if (event->isMouseEvent() && toMouseEvent(event)->button()) - return; - - if (!inDocument() || !document().isActive()) - return; - - MediaControlInputElement::defaultEventHandler(event); - - if (event->type() == EventTypeNames::mouseover || event->type() == EventTypeNames::mouseout || event->type() == EventTypeNames::mousemove) - return; - - double volume = value().toDouble(); - if (volume != mediaController()->volume()) - mediaController()->setVolume(volume, ASSERT_NO_EXCEPTION); - if (m_clearMutedOnUserInteraction) - mediaController()->setMuted(false); -} - -bool MediaControlVolumeSliderElement::willRespondToMouseMoveEvents() -{ - if (!inDocument() || !document().isActive()) - return false; - - return MediaControlInputElement::willRespondToMouseMoveEvents(); -} - -bool MediaControlVolumeSliderElement::willRespondToMouseClickEvents() -{ - if (!inDocument() || !document().isActive()) - return false; - - return MediaControlInputElement::willRespondToMouseClickEvents(); -} - -void MediaControlVolumeSliderElement::setVolume(double volume) -{ - if (value().toDouble() != volume) - setValue(String::number(volume)); -} - -void MediaControlVolumeSliderElement::setClearMutedOnUserInteraction(bool clearMute) -{ - m_clearMutedOnUserInteraction = clearMute; -} - } // namespace WebCore diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h index 6293e6dac09..6213debb7b3 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElementTypes.h @@ -32,23 +32,19 @@ #include "core/html/HTMLDivElement.h" #include "core/html/HTMLInputElement.h" -#include "core/html/HTMLMediaElement.h" -#include "core/html/MediaControllerInterface.h" #include "core/rendering/RenderBlock.h" namespace WebCore { -// Must match WebKitSystemInterface.h +class HTMLMediaElement; +class MediaControls; + enum MediaControlElementType { MediaEnterFullscreenButton = 0, MediaMuteButton, MediaPlayButton, - MediaSeekBackButton, - MediaSeekForwardButton, MediaSlider, MediaSliderThumb, - MediaRewindButton, - MediaReturnToRealtimeButton, MediaShowClosedCaptionsButton, MediaHideClosedCaptionsButton, MediaUnMuteButton, @@ -63,7 +59,6 @@ enum MediaControlElementType { MediaVolumeSliderThumb, MediaFullScreenVolumeSlider, MediaFullScreenVolumeSliderThumb, - MediaVolumeSliderMuteButton, MediaTextTrackDisplayContainer, MediaTextTrackDisplay, MediaExitFullscreenButton, @@ -77,27 +72,23 @@ MediaControlElementType mediaControlElementType(Node*); // ---------------------------- -class MediaControlElement { +class MediaControlElement : public WillBeGarbageCollectedMixin { public: - virtual void hide(); - virtual void show(); - virtual bool isShowing() const; - - virtual MediaControlElementType displayType() { return m_displayType; } - virtual const AtomicString& pseudo() const = 0; + void hide(); + void show(); - virtual void setMediaController(MediaControllerInterface* controller) { m_mediaController = controller; } - virtual MediaControllerInterface* mediaController() const { return m_mediaController; } + MediaControlElementType displayType() { return m_displayType; } protected: - explicit MediaControlElement(MediaControlElementType, HTMLElement*); - ~MediaControlElement() { } + MediaControlElement(MediaControls&, MediaControlElementType, HTMLElement*); - virtual void setDisplayType(MediaControlElementType); - virtual bool isMediaControlElement() const { return true; } + MediaControls& mediaControls() const { return m_mediaControls; } + HTMLMediaElement& mediaElement() const; + + void setDisplayType(MediaControlElementType); private: - MediaControllerInterface* m_mediaController; + MediaControls& m_mediaControls; MediaControlElementType m_displayType; HTMLElement* m_element; }; @@ -105,17 +96,21 @@ private: // ---------------------------- class MediaControlDivElement : public HTMLDivElement, public MediaControlElement { + WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MediaControlDivElement); + protected: - virtual bool isMediaControlElement() const OVERRIDE { return MediaControlElement::isMediaControlElement(); } - explicit MediaControlDivElement(Document&, MediaControlElementType); + virtual bool isMediaControlElement() const OVERRIDE FINAL { return true; } + MediaControlDivElement(MediaControls&, MediaControlElementType); }; // ---------------------------- class MediaControlInputElement : public HTMLInputElement, public MediaControlElement { + WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MediaControlInputElement); + protected: - virtual bool isMediaControlElement() const OVERRIDE { return MediaControlElement::isMediaControlElement(); } - explicit MediaControlInputElement(Document&, MediaControlElementType); + virtual bool isMediaControlElement() const OVERRIDE FINAL { return true; } + MediaControlInputElement(MediaControls&, MediaControlElementType); private: virtual void updateDisplayType() { } @@ -130,47 +125,12 @@ public: double currentValue() const { return m_currentValue; } protected: - explicit MediaControlTimeDisplayElement(Document&, MediaControlElementType); + MediaControlTimeDisplayElement(MediaControls&, MediaControlElementType); private: double m_currentValue; }; -// ---------------------------- - -class MediaControlMuteButtonElement : public MediaControlInputElement { -public: - void changedMute(); - - virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } - -protected: - explicit MediaControlMuteButtonElement(Document&, MediaControlElementType); - - virtual void defaultEventHandler(Event*) OVERRIDE; - -private: - virtual void updateDisplayType() OVERRIDE; -}; - -// ---------------------------- - -class MediaControlVolumeSliderElement : public MediaControlInputElement { -public: - virtual bool willRespondToMouseMoveEvents() OVERRIDE; - virtual bool willRespondToMouseClickEvents() OVERRIDE; - void setVolume(double); - void setClearMutedOnUserInteraction(bool); - -protected: - explicit MediaControlVolumeSliderElement(Document&); - - virtual void defaultEventHandler(Event*) OVERRIDE; - -private: - bool m_clearMutedOnUserInteraction; -}; - } // namespace WebCore #endif // MediaControlElementTypes_h diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp index 9c3aee249b1..674675fbff9 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.cpp @@ -30,24 +30,23 @@ #include "config.h" #include "core/html/shadow/MediaControlElements.h" -#include "RuntimeEnabledFeatures.h" #include "bindings/v8/ExceptionStatePlaceholder.h" #include "core/dom/DOMTokenList.h" #include "core/dom/FullscreenElementStack.h" #include "core/dom/shadow/ShadowRoot.h" #include "core/events/MouseEvent.h" -#include "core/events/ThreadLocalEventNames.h" +#include "core/frame/LocalFrame.h" #include "core/html/HTMLVideoElement.h" +#include "core/html/MediaController.h" #include "core/html/shadow/MediaControls.h" #include "core/html/track/TextTrack.h" #include "core/html/track/vtt/VTTRegionList.h" #include "core/page/EventHandler.h" -#include "core/frame/Frame.h" -#include "core/frame/Settings.h" #include "core/rendering/RenderMediaControlElements.h" #include "core/rendering/RenderSlider.h" #include "core/rendering/RenderTheme.h" #include "core/rendering/RenderVideo.h" +#include "platform/RuntimeEnabledFeatures.h" namespace WebCore { @@ -56,76 +55,39 @@ using namespace HTMLNames; static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoId(); static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseudoId(); +// If you change any of the following fade durations, then also update the +// corresponding values in LayoutTests/media/media-controls.js. static const double fadeInDuration = 0.1; static const double fadeOutDuration = 0.3; -MediaControlPanelElement::MediaControlPanelElement(Document& document) - : MediaControlDivElement(document, MediaControlsPanel) - , m_canBeDragged(false) - , m_isBeingDragged(false) +MediaControlPanelElement::MediaControlPanelElement(MediaControls& mediaControls) + : MediaControlDivElement(mediaControls, MediaControlsPanel) , m_isDisplayed(false) , m_opaque(true) , m_transitionTimer(this, &MediaControlPanelElement::transitionTimerFired) { } -PassRefPtr<MediaControlPanelElement> MediaControlPanelElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlPanelElement> MediaControlPanelElement::create(MediaControls& mediaControls) { - return adoptRef(new MediaControlPanelElement(document)); + return adoptRefWillBeNoop(new MediaControlPanelElement(mediaControls)); } -const AtomicString& MediaControlPanelElement::pseudo() const +const AtomicString& MediaControlPanelElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-panel", AtomicString::ConstructFromLiteral)); return id; } -void MediaControlPanelElement::startDrag(const LayoutPoint& eventLocation) -{ - if (!m_canBeDragged) - return; - - if (m_isBeingDragged) - return; - - RenderObject* renderer = this->renderer(); - if (!renderer || !renderer->isBox()) - return; - - Frame* frame = document().frame(); - if (!frame) - return; - - m_lastDragEventLocation = eventLocation; - - frame->eventHandler().setCapturingMouseEventsNode(this); - - m_isBeingDragged = true; -} - -void MediaControlPanelElement::continueDrag(const LayoutPoint& eventLocation) -{ - if (!m_isBeingDragged) - return; - - LayoutSize distanceDragged = eventLocation - m_lastDragEventLocation; - m_cumulativeDragOffset.move(distanceDragged); - m_lastDragEventLocation = eventLocation; - setPosition(m_cumulativeDragOffset); -} - -void MediaControlPanelElement::endDrag() +void MediaControlPanelElement::defaultEventHandler(Event* event) { - if (!m_isBeingDragged) - return; - - m_isBeingDragged = false; - - Frame* frame = document().frame(); - if (!frame) + // Suppress the media element activation behavior (toggle play/pause) when + // any part of the control panel is clicked. + if (event->type() == EventTypeNames::click) { + event->setDefaultHandled(); return; - - frame->eventHandler().setCapturingMouseEventsNode(0); + } + HTMLDivElement::defaultEventHandler(event); } void MediaControlPanelElement::startTimer() @@ -136,7 +98,7 @@ void MediaControlPanelElement::startTimer() // such that captions are correctly displayed at the bottom of the video // at the end of the fadeout transition. // FIXME: Racing a transition with a setTimeout like this is wrong. - m_transitionTimer.startOneShot(fadeOutDuration); + m_transitionTimer.startOneShot(fadeOutDuration, FROM_HERE); } void MediaControlPanelElement::stopTimer() @@ -153,34 +115,6 @@ void MediaControlPanelElement::transitionTimerFired(Timer<MediaControlPanelEleme stopTimer(); } -void MediaControlPanelElement::setPosition(const LayoutPoint& position) -{ - double left = position.x(); - double top = position.y(); - - // Set the left and top to control the panel's position; this depends on it being absolute positioned. - // Set the margin to zero since the position passed in will already include the effect of the margin. - setInlineStyleProperty(CSSPropertyLeft, left, CSSPrimitiveValue::CSS_PX); - setInlineStyleProperty(CSSPropertyTop, top, CSSPrimitiveValue::CSS_PX); - setInlineStyleProperty(CSSPropertyMarginLeft, 0.0, CSSPrimitiveValue::CSS_PX); - setInlineStyleProperty(CSSPropertyMarginTop, 0.0, CSSPrimitiveValue::CSS_PX); - - classList()->add("dragged", IGNORE_EXCEPTION); -} - -void MediaControlPanelElement::resetPosition() -{ - removeInlineStyleProperty(CSSPropertyLeft); - removeInlineStyleProperty(CSSPropertyTop); - removeInlineStyleProperty(CSSPropertyMarginLeft); - removeInlineStyleProperty(CSSPropertyMarginTop); - - classList()->remove("dragged", IGNORE_EXCEPTION); - - m_cumulativeDragOffset.setX(0); - m_cumulativeDragOffset.setY(0); -} - void MediaControlPanelElement::makeOpaque() { if (m_opaque) @@ -209,36 +143,6 @@ void MediaControlPanelElement::makeTransparent() startTimer(); } -void MediaControlPanelElement::defaultEventHandler(Event* event) -{ - MediaControlDivElement::defaultEventHandler(event); - - if (event->isMouseEvent()) { - LayoutPoint location = toMouseEvent(event)->absoluteLocation(); - if (event->type() == EventTypeNames::mousedown && event->target() == this) { - startDrag(location); - event->setDefaultHandled(); - } else if (event->type() == EventTypeNames::mousemove && m_isBeingDragged) - continueDrag(location); - else if (event->type() == EventTypeNames::mouseup && m_isBeingDragged) { - continueDrag(location); - endDrag(); - event->setDefaultHandled(); - } - } -} - -void MediaControlPanelElement::setCanBeDragged(bool canBeDragged) -{ - if (m_canBeDragged == canBeDragged) - return; - - m_canBeDragged = canBeDragged; - - if (!canBeDragged) - endDrag(); -} - void MediaControlPanelElement::setIsDisplayed(bool isDisplayed) { m_isDisplayed = isDisplayed; @@ -246,18 +150,18 @@ void MediaControlPanelElement::setIsDisplayed(bool isDisplayed) // ---------------------------- -MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(Document& document) +MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(MediaControls& mediaControls) // Mapping onto same MediaControlElementType as panel element, since it has similar properties. - : MediaControlDivElement(document, MediaControlsPanel) + : MediaControlDivElement(mediaControls, MediaControlsPanel) { } -PassRefPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement::create(MediaControls& mediaControls) { - return adoptRef(new MediaControlPanelEnclosureElement(document)); + return adoptRefWillBeNoop(new MediaControlPanelEnclosureElement(mediaControls)); } -const AtomicString& MediaControlPanelEnclosureElement::pseudo() const +const AtomicString& MediaControlPanelEnclosureElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-enclosure", AtomicString::ConstructFromLiteral)); return id; @@ -265,18 +169,18 @@ const AtomicString& MediaControlPanelEnclosureElement::pseudo() const // ---------------------------- -MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement(Document& document) +MediaControlOverlayEnclosureElement::MediaControlOverlayEnclosureElement(MediaControls& mediaControls) // Mapping onto same MediaControlElementType as panel element, since it has similar properties. - : MediaControlDivElement(document, MediaControlsPanel) + : MediaControlDivElement(mediaControls, MediaControlsPanel) { } -PassRefPtr<MediaControlOverlayEnclosureElement> MediaControlOverlayEnclosureElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> MediaControlOverlayEnclosureElement::create(MediaControls& mediaControls) { - return adoptRef(new MediaControlOverlayEnclosureElement(document)); + return adoptRefWillBeNoop(new MediaControlOverlayEnclosureElement(mediaControls)); } -const AtomicString& MediaControlOverlayEnclosureElement::pseudo() const +const AtomicString& MediaControlOverlayEnclosureElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-enclosure", AtomicString::ConstructFromLiteral)); return id; @@ -284,67 +188,50 @@ const AtomicString& MediaControlOverlayEnclosureElement::pseudo() const // ---------------------------- -MediaControlPanelMuteButtonElement::MediaControlPanelMuteButtonElement(Document& document, MediaControls* controls) - : MediaControlMuteButtonElement(document, MediaMuteButton) - , m_controls(controls) +MediaControlMuteButtonElement::MediaControlMuteButtonElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaMuteButton) { } -PassRefPtr<MediaControlPanelMuteButtonElement> MediaControlPanelMuteButtonElement::create(Document& document, MediaControls* controls) +PassRefPtrWillBeRawPtr<MediaControlMuteButtonElement> MediaControlMuteButtonElement::create(MediaControls& mediaControls) { - ASSERT(controls); - - RefPtr<MediaControlPanelMuteButtonElement> button = adoptRef(new MediaControlPanelMuteButtonElement(document, controls)); + RefPtrWillBeRawPtr<MediaControlMuteButtonElement> button = adoptRefWillBeNoop(new MediaControlMuteButtonElement(mediaControls)); button->ensureUserAgentShadowRoot(); button->setType("button"); return button.release(); } -void MediaControlPanelMuteButtonElement::defaultEventHandler(Event* event) +void MediaControlMuteButtonElement::defaultEventHandler(Event* event) { - if (event->type() == EventTypeNames::mouseover) - m_controls->showVolumeSlider(); - - MediaControlMuteButtonElement::defaultEventHandler(event); -} - -const AtomicString& MediaControlPanelMuteButtonElement::pseudo() const -{ - DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-mute-button", AtomicString::ConstructFromLiteral)); - return id; -} - -// ---------------------------- + if (event->type() == EventTypeNames::click) { + mediaElement().setMuted(!mediaElement().muted()); + event->setDefaultHandled(); + } -MediaControlVolumeSliderMuteButtonElement::MediaControlVolumeSliderMuteButtonElement(Document& document) - : MediaControlMuteButtonElement(document, MediaMuteButton) -{ + HTMLInputElement::defaultEventHandler(event); } -PassRefPtr<MediaControlVolumeSliderMuteButtonElement> MediaControlVolumeSliderMuteButtonElement::create(Document& document) +void MediaControlMuteButtonElement::updateDisplayType() { - RefPtr<MediaControlVolumeSliderMuteButtonElement> button = adoptRef(new MediaControlVolumeSliderMuteButtonElement(document)); - button->ensureUserAgentShadowRoot(); - button->setType("button"); - return button.release(); + setDisplayType(mediaElement().muted() ? MediaUnMuteButton : MediaMuteButton); } -const AtomicString& MediaControlVolumeSliderMuteButtonElement::pseudo() const +const AtomicString& MediaControlMuteButtonElement::shadowPseudoId() const { - DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider-mute-button", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-mute-button", AtomicString::ConstructFromLiteral)); return id; } // ---------------------------- -MediaControlPlayButtonElement::MediaControlPlayButtonElement(Document& document) - : MediaControlInputElement(document, MediaPlayButton) +MediaControlPlayButtonElement::MediaControlPlayButtonElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaPlayButton) { } -PassRefPtr<MediaControlPlayButtonElement> MediaControlPlayButtonElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlPlayButtonElement> MediaControlPlayButtonElement::create(MediaControls& mediaControls) { - RefPtr<MediaControlPlayButtonElement> button = adoptRef(new MediaControlPlayButtonElement(document)); + RefPtrWillBeRawPtr<MediaControlPlayButtonElement> button = adoptRefWillBeNoop(new MediaControlPlayButtonElement(mediaControls)); button->ensureUserAgentShadowRoot(); button->setType("button"); return button.release(); @@ -353,10 +240,7 @@ PassRefPtr<MediaControlPlayButtonElement> MediaControlPlayButtonElement::create( void MediaControlPlayButtonElement::defaultEventHandler(Event* event) { if (event->type() == EventTypeNames::click) { - if (mediaController()->canPlay()) - mediaController()->play(); - else - mediaController()->pause(); + mediaElement().togglePlayState(); updateDisplayType(); event->setDefaultHandled(); } @@ -365,10 +249,10 @@ void MediaControlPlayButtonElement::defaultEventHandler(Event* event) void MediaControlPlayButtonElement::updateDisplayType() { - setDisplayType(mediaController()->canPlay() ? MediaPlayButton : MediaPauseButton); + setDisplayType(mediaElement().togglePlayStateWillPlay() ? MediaPlayButton : MediaPauseButton); } -const AtomicString& MediaControlPlayButtonElement::pseudo() const +const AtomicString& MediaControlPlayButtonElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-play-button", AtomicString::ConstructFromLiteral)); return id; @@ -376,14 +260,14 @@ const AtomicString& MediaControlPlayButtonElement::pseudo() const // ---------------------------- -MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement(Document& document) - : MediaControlInputElement(document, MediaOverlayPlayButton) +MediaControlOverlayPlayButtonElement::MediaControlOverlayPlayButtonElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaOverlayPlayButton) { } -PassRefPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonElement::create(MediaControls& mediaControls) { - RefPtr<MediaControlOverlayPlayButtonElement> button = adoptRef(new MediaControlOverlayPlayButtonElement(document)); + RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> button = adoptRefWillBeNoop(new MediaControlOverlayPlayButtonElement(mediaControls)); button->ensureUserAgentShadowRoot(); button->setType("button"); return button.release(); @@ -391,23 +275,22 @@ PassRefPtr<MediaControlOverlayPlayButtonElement> MediaControlOverlayPlayButtonEl void MediaControlOverlayPlayButtonElement::defaultEventHandler(Event* event) { - if (event->type() == EventTypeNames::click && mediaController()->canPlay()) { - mediaController()->play(); + if (event->type() == EventTypeNames::click && mediaElement().togglePlayStateWillPlay()) { + mediaElement().togglePlayState(); updateDisplayType(); event->setDefaultHandled(); } - HTMLInputElement::defaultEventHandler(event); } void MediaControlOverlayPlayButtonElement::updateDisplayType() { - if (mediaController()->canPlay()) { + if (mediaElement().togglePlayStateWillPlay()) { show(); } else hide(); } -const AtomicString& MediaControlOverlayPlayButtonElement::pseudo() const +const AtomicString& MediaControlOverlayPlayButtonElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-overlay-play-button", AtomicString::ConstructFromLiteral)); return id; @@ -416,16 +299,14 @@ const AtomicString& MediaControlOverlayPlayButtonElement::pseudo() const // ---------------------------- -MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(Document& document, MediaControls*) - : MediaControlInputElement(document, MediaShowClosedCaptionsButton) +MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaShowClosedCaptionsButton) { } -PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> MediaControlToggleClosedCaptionsButtonElement::create(Document& document, MediaControls* controls) +PassRefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> MediaControlToggleClosedCaptionsButtonElement::create(MediaControls& mediaControls) { - ASSERT(controls); - - RefPtr<MediaControlToggleClosedCaptionsButtonElement> button = adoptRef(new MediaControlToggleClosedCaptionsButtonElement(document, controls)); + RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> button = adoptRefWillBeNoop(new MediaControlToggleClosedCaptionsButtonElement(mediaControls)); button->ensureUserAgentShadowRoot(); button->setType("button"); button->hide(); @@ -434,7 +315,7 @@ PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> MediaControlToggleClos void MediaControlToggleClosedCaptionsButtonElement::updateDisplayType() { - bool captionsVisible = mediaController()->closedCaptionsVisible(); + bool captionsVisible = mediaElement().closedCaptionsVisible(); setDisplayType(captionsVisible ? MediaHideClosedCaptionsButton : MediaShowClosedCaptionsButton); setChecked(captionsVisible); } @@ -442,8 +323,8 @@ void MediaControlToggleClosedCaptionsButtonElement::updateDisplayType() void MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* event) { if (event->type() == EventTypeNames::click) { - mediaController()->setClosedCaptionsVisible(!mediaController()->closedCaptionsVisible()); - setChecked(mediaController()->closedCaptionsVisible()); + mediaElement().setClosedCaptionsVisible(!mediaElement().closedCaptionsVisible()); + setChecked(mediaElement().closedCaptionsVisible()); updateDisplayType(); event->setDefaultHandled(); } @@ -451,7 +332,7 @@ void MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* e HTMLInputElement::defaultEventHandler(event); } -const AtomicString& MediaControlToggleClosedCaptionsButtonElement::pseudo() const +const AtomicString& MediaControlToggleClosedCaptionsButtonElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-toggle-closed-captions-button", AtomicString::ConstructFromLiteral)); return id; @@ -459,17 +340,14 @@ const AtomicString& MediaControlToggleClosedCaptionsButtonElement::pseudo() cons // ---------------------------- -MediaControlTimelineElement::MediaControlTimelineElement(Document& document, MediaControls* controls) - : MediaControlInputElement(document, MediaSlider) - , m_controls(controls) +MediaControlTimelineElement::MediaControlTimelineElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaSlider) { } -PassRefPtr<MediaControlTimelineElement> MediaControlTimelineElement::create(Document& document, MediaControls* controls) +PassRefPtrWillBeRawPtr<MediaControlTimelineElement> MediaControlTimelineElement::create(MediaControls& mediaControls) { - ASSERT(controls); - - RefPtr<MediaControlTimelineElement> timeline = adoptRef(new MediaControlTimelineElement(document, controls)); + RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = adoptRefWillBeNoop(new MediaControlTimelineElement(mediaControls)); timeline->ensureUserAgentShadowRoot(); timeline->setType("range"); timeline->setAttribute(stepAttr, "any"); @@ -478,18 +356,17 @@ PassRefPtr<MediaControlTimelineElement> MediaControlTimelineElement::create(Docu void MediaControlTimelineElement::defaultEventHandler(Event* event) { - // Left button is 0. Rejects mouse events not from left button. - if (event->isMouseEvent() && toMouseEvent(event)->button()) + if (event->isMouseEvent() && toMouseEvent(event)->button() != LeftButton) return; if (!inDocument() || !document().isActive()) return; if (event->type() == EventTypeNames::mousedown) - mediaController()->beginScrubbing(); + mediaControls().beginScrubbing(); if (event->type() == EventTypeNames::mouseup) - mediaController()->endScrubbing(); + mediaControls().endScrubbing(); MediaControlInputElement::defaultEventHandler(event); @@ -497,12 +374,18 @@ void MediaControlTimelineElement::defaultEventHandler(Event* event) return; double time = value().toDouble(); - if (event->type() == EventTypeNames::input && time != mediaController()->currentTime()) - mediaController()->setCurrentTime(time, IGNORE_EXCEPTION); + if (event->type() == EventTypeNames::input) { + // FIXME: This will need to take the timeline offset into consideration + // once that concept is supported, see https://crbug.com/312699 + if (mediaElement().controller()) + mediaElement().controller()->setCurrentTime(time, IGNORE_EXCEPTION); + else + mediaElement().setCurrentTime(time, IGNORE_EXCEPTION); + } RenderSlider* slider = toRenderSlider(renderer()); if (slider && slider->inDragMode()) - m_controls->updateCurrentTimeDisplay(); + mediaControls().updateCurrentTimeDisplay(); } bool MediaControlTimelineElement::willRespondToMouseClickEvents() @@ -521,7 +404,7 @@ void MediaControlTimelineElement::setDuration(double duration) } -const AtomicString& MediaControlTimelineElement::pseudo() const +const AtomicString& MediaControlTimelineElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-timeline", AtomicString::ConstructFromLiteral)); return id; @@ -529,14 +412,14 @@ const AtomicString& MediaControlTimelineElement::pseudo() const // ---------------------------- -MediaControlPanelVolumeSliderElement::MediaControlPanelVolumeSliderElement(Document& document) - : MediaControlVolumeSliderElement(document) +MediaControlVolumeSliderElement::MediaControlVolumeSliderElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaVolumeSlider) { } -PassRefPtr<MediaControlPanelVolumeSliderElement> MediaControlPanelVolumeSliderElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlVolumeSliderElement> MediaControlVolumeSliderElement::create(MediaControls& mediaControls) { - RefPtr<MediaControlPanelVolumeSliderElement> slider = adoptRef(new MediaControlPanelVolumeSliderElement(document)); + RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = adoptRefWillBeNoop(new MediaControlVolumeSliderElement(mediaControls)); slider->ensureUserAgentShadowRoot(); slider->setType("range"); slider->setAttribute(stepAttr, "any"); @@ -544,7 +427,47 @@ PassRefPtr<MediaControlPanelVolumeSliderElement> MediaControlPanelVolumeSliderEl return slider.release(); } -const AtomicString& MediaControlPanelVolumeSliderElement::pseudo() const +void MediaControlVolumeSliderElement::defaultEventHandler(Event* event) +{ + if (event->isMouseEvent() && toMouseEvent(event)->button() != LeftButton) + return; + + if (!inDocument() || !document().isActive()) + return; + + MediaControlInputElement::defaultEventHandler(event); + + if (event->type() == EventTypeNames::mouseover || event->type() == EventTypeNames::mouseout || event->type() == EventTypeNames::mousemove) + return; + + double volume = value().toDouble(); + mediaElement().setVolume(volume, ASSERT_NO_EXCEPTION); + mediaElement().setMuted(false); +} + +bool MediaControlVolumeSliderElement::willRespondToMouseMoveEvents() +{ + if (!inDocument() || !document().isActive()) + return false; + + return MediaControlInputElement::willRespondToMouseMoveEvents(); +} + +bool MediaControlVolumeSliderElement::willRespondToMouseClickEvents() +{ + if (!inDocument() || !document().isActive()) + return false; + + return MediaControlInputElement::willRespondToMouseClickEvents(); +} + +void MediaControlVolumeSliderElement::setVolume(double volume) +{ + if (value().toDouble() != volume) + setValue(String::number(volume)); +} + +const AtomicString& MediaControlVolumeSliderElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-volume-slider", AtomicString::ConstructFromLiteral)); return id; @@ -552,14 +475,14 @@ const AtomicString& MediaControlPanelVolumeSliderElement::pseudo() const // ---------------------------- -MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(Document& document) - : MediaControlInputElement(document, MediaEnterFullscreenButton) +MediaControlFullscreenButtonElement::MediaControlFullscreenButtonElement(MediaControls& mediaControls) + : MediaControlInputElement(mediaControls, MediaEnterFullscreenButton) { } -PassRefPtr<MediaControlFullscreenButtonElement> MediaControlFullscreenButtonElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> MediaControlFullscreenButtonElement::create(MediaControls& mediaControls) { - RefPtr<MediaControlFullscreenButtonElement> button = adoptRef(new MediaControlFullscreenButtonElement(document)); + RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> button = adoptRefWillBeNoop(new MediaControlFullscreenButtonElement(mediaControls)); button->ensureUserAgentShadowRoot(); button->setType("button"); button->hide(); @@ -569,24 +492,16 @@ PassRefPtr<MediaControlFullscreenButtonElement> MediaControlFullscreenButtonElem void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event) { if (event->type() == EventTypeNames::click) { - // Only use the new full screen API if the fullScreenEnabled setting has - // been explicitly enabled. Otherwise, use the old fullscreen API. This - // allows apps which embed a WebView to retain the existing full screen - // video implementation without requiring them to implement their own full - // screen behavior. - if (document().settings() && document().settings()->fullScreenEnabled()) { - if (FullscreenElementStack::isActiveFullScreenElement(toParentMediaElement(this))) - FullscreenElementStack::from(&document())->webkitCancelFullScreen(); - else - FullscreenElementStack::from(&document())->requestFullScreenForElement(toParentMediaElement(this), 0, FullscreenElementStack::ExemptIFrameAllowFullScreenRequirement); - } else - mediaController()->enterFullscreen(); + if (FullscreenElementStack::isActiveFullScreenElement(&mediaElement())) + FullscreenElementStack::from(document()).webkitCancelFullScreen(); + else + FullscreenElementStack::from(document()).requestFullScreenForElement(&mediaElement(), 0, FullscreenElementStack::ExemptIFrameAllowFullScreenRequirement); event->setDefaultHandled(); } HTMLInputElement::defaultEventHandler(event); } -const AtomicString& MediaControlFullscreenButtonElement::pseudo() const +const AtomicString& MediaControlFullscreenButtonElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-fullscreen-button", AtomicString::ConstructFromLiteral)); return id; @@ -599,14 +514,14 @@ void MediaControlFullscreenButtonElement::setIsFullscreen(bool isFullscreen) // ---------------------------- -MediaControlTimeRemainingDisplayElement::MediaControlTimeRemainingDisplayElement(Document& document) - : MediaControlTimeDisplayElement(document, MediaTimeRemainingDisplay) +MediaControlTimeRemainingDisplayElement::MediaControlTimeRemainingDisplayElement(MediaControls& mediaControls) + : MediaControlTimeDisplayElement(mediaControls, MediaTimeRemainingDisplay) { } -PassRefPtr<MediaControlTimeRemainingDisplayElement> MediaControlTimeRemainingDisplayElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> MediaControlTimeRemainingDisplayElement::create(MediaControls& mediaControls) { - return adoptRef(new MediaControlTimeRemainingDisplayElement(document)); + return adoptRefWillBeNoop(new MediaControlTimeRemainingDisplayElement(mediaControls)); } static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseudoId() @@ -615,21 +530,21 @@ static const AtomicString& getMediaControlTimeRemainingDisplayElementShadowPseud return id; } -const AtomicString& MediaControlTimeRemainingDisplayElement::pseudo() const +const AtomicString& MediaControlTimeRemainingDisplayElement::shadowPseudoId() const { return getMediaControlTimeRemainingDisplayElementShadowPseudoId(); } // ---------------------------- -MediaControlCurrentTimeDisplayElement::MediaControlCurrentTimeDisplayElement(Document& document) - : MediaControlTimeDisplayElement(document, MediaCurrentTimeDisplay) +MediaControlCurrentTimeDisplayElement::MediaControlCurrentTimeDisplayElement(MediaControls& mediaControls) + : MediaControlTimeDisplayElement(mediaControls, MediaCurrentTimeDisplay) { } -PassRefPtr<MediaControlCurrentTimeDisplayElement> MediaControlCurrentTimeDisplayElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> MediaControlCurrentTimeDisplayElement::create(MediaControls& mediaControls) { - return adoptRef(new MediaControlCurrentTimeDisplayElement(document)); + return adoptRefWillBeNoop(new MediaControlCurrentTimeDisplayElement(mediaControls)); } static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoId() @@ -638,22 +553,22 @@ static const AtomicString& getMediaControlCurrentTimeDisplayElementShadowPseudoI return id; } -const AtomicString& MediaControlCurrentTimeDisplayElement::pseudo() const +const AtomicString& MediaControlCurrentTimeDisplayElement::shadowPseudoId() const { return getMediaControlCurrentTimeDisplayElementShadowPseudoId(); } // ---------------------------- -MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(Document& document) - : MediaControlDivElement(document, MediaTextTrackDisplayContainer) +MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(MediaControls& mediaControls) + : MediaControlDivElement(mediaControls, MediaTextTrackDisplayContainer) , m_fontSize(0) { } -PassRefPtr<MediaControlTextTrackContainerElement> MediaControlTextTrackContainerElement::create(Document& document) +PassRefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> MediaControlTextTrackContainerElement::create(MediaControls& mediaControls) { - RefPtr<MediaControlTextTrackContainerElement> element = adoptRef(new MediaControlTextTrackContainerElement(document)); + RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> element = adoptRefWillBeNoop(new MediaControlTextTrackContainerElement(mediaControls)); element->hide(); return element.release(); } @@ -669,30 +584,28 @@ const AtomicString& MediaControlTextTrackContainerElement::textTrackContainerEle return id; } -const AtomicString& MediaControlTextTrackContainerElement::pseudo() const +const AtomicString& MediaControlTextTrackContainerElement::shadowPseudoId() const { return textTrackContainerElementShadowPseudoId(); } void MediaControlTextTrackContainerElement::updateDisplay() { - if (!mediaController()->closedCaptionsVisible()) { + if (!mediaElement().closedCaptionsVisible()) { removeChildren(); return; } - HTMLMediaElement* mediaElement = toParentMediaElement(this); // 1. If the media element is an audio element, or is another playback // mechanism with no rendering area, abort these steps. There is nothing to // render. - if (!mediaElement || !mediaElement->isVideo()) + if (isHTMLAudioElement(mediaElement())) return; // 2. Let video be the media element or other playback mechanism. - HTMLVideoElement* video = toHTMLVideoElement(mediaElement); + HTMLVideoElement& video = toHTMLVideoElement(mediaElement()); // 3. Let output be an empty list of absolutely positioned CSS block boxes. - Vector<RefPtr<HTMLDivElement> > output; // 4. If the user agent is exposing a user interface for video, add to // output one or more completely transparent positioned CSS block boxes that @@ -713,7 +626,7 @@ void MediaControlTextTrackContainerElement::updateDisplay() // 7. Let cues be an empty list of text track cues. // 8. For each track track in tracks, append to cues all the cues from // track's list of cues that have their text track cue active flag set. - CueList activeCues = video->currentlyActiveCues(); + CueList activeCues = video.currentlyActiveCues(); // 9. If reset is false, then, for each text track cue cue in cues: if cue's // text track cue display state has a set of CSS boxes, then add those boxes @@ -737,28 +650,24 @@ void MediaControlTextTrackContainerElement::updateDisplay() } // 11. Return output. - if (hasChildNodes()) + if (hasChildren()) show(); else hide(); } -void MediaControlTextTrackContainerElement::updateSizes(bool forceUpdate) +void MediaControlTextTrackContainerElement::updateSizes() { - HTMLMediaElement* mediaElement = toParentMediaElement(this); - if (!mediaElement) - return; - if (!document().isActive()) return; IntRect videoBox; - if (!mediaElement->renderer() || !mediaElement->renderer()->isVideo()) + if (!mediaElement().renderer() || !mediaElement().renderer()->isVideo()) return; - videoBox = toRenderVideo(mediaElement->renderer())->videoBox(); + videoBox = toRenderVideo(mediaElement().renderer())->videoBox(); - if (!forceUpdate && m_videoDisplaySize == videoBox) + if (m_videoDisplaySize == videoBox) return; m_videoDisplaySize = videoBox; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.h b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.h index 3d631dbb9b9..06c03206b75 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlElements.h @@ -38,40 +38,25 @@ namespace WebCore { class MediaControlPanelElement FINAL : public MediaControlDivElement { public: - static PassRefPtr<MediaControlPanelElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlPanelElement> create(MediaControls&); - void setCanBeDragged(bool); void setIsDisplayed(bool); - void resetPosition(); void makeOpaque(); void makeTransparent(); - virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; } - virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } - private: - explicit MediaControlPanelElement(Document&); + explicit MediaControlPanelElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; - void startDrag(const LayoutPoint& eventLocation); - void continueDrag(const LayoutPoint& eventLocation); - void endDrag(); - void startTimer(); void stopTimer(); void transitionTimerFired(Timer<MediaControlPanelElement>*); - void setPosition(const LayoutPoint&); - - bool m_canBeDragged; - bool m_isBeingDragged; bool m_isDisplayed; bool m_opaque; - LayoutPoint m_lastDragEventLocation; - LayoutPoint m_cumulativeDragOffset; Timer<MediaControlPanelElement> m_transitionTimer; }; @@ -80,66 +65,53 @@ private: class MediaControlPanelEnclosureElement FINAL : public MediaControlDivElement { public: - static PassRefPtr<MediaControlPanelEnclosureElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> create(MediaControls&); private: - explicit MediaControlPanelEnclosureElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlPanelEnclosureElement(MediaControls&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; }; // ---------------------------- class MediaControlOverlayEnclosureElement FINAL : public MediaControlDivElement { public: - static PassRefPtr<MediaControlOverlayEnclosureElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> create(MediaControls&); private: - explicit MediaControlOverlayEnclosureElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlOverlayEnclosureElement(MediaControls&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; }; // ---------------------------- -class MediaControlPanelMuteButtonElement FINAL : public MediaControlMuteButtonElement { +class MediaControlMuteButtonElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlPanelMuteButtonElement> create(Document&, MediaControls*); + static PassRefPtrWillBeRawPtr<MediaControlMuteButtonElement> create(MediaControls&); - virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; } + virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } + virtual void updateDisplayType() OVERRIDE; private: - explicit MediaControlPanelMuteButtonElement(Document&, MediaControls*); + explicit MediaControlMuteButtonElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; - - MediaControls* m_controls; -}; - -// ---------------------------- - -class MediaControlVolumeSliderMuteButtonElement FINAL : public MediaControlMuteButtonElement { -public: - static PassRefPtr<MediaControlVolumeSliderMuteButtonElement> create(Document&); - -private: - explicit MediaControlVolumeSliderMuteButtonElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; }; - // ---------------------------- class MediaControlPlayButtonElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlPlayButtonElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlPlayButtonElement> create(MediaControls&); virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } virtual void updateDisplayType() OVERRIDE; private: - explicit MediaControlPlayButtonElement(Document&); + explicit MediaControlPlayButtonElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; }; @@ -147,14 +119,14 @@ private: class MediaControlOverlayPlayButtonElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlOverlayPlayButtonElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> create(MediaControls&); virtual void updateDisplayType() OVERRIDE; private: - explicit MediaControlOverlayPlayButtonElement(Document&); + explicit MediaControlOverlayPlayButtonElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; }; @@ -162,16 +134,16 @@ private: class MediaControlToggleClosedCaptionsButtonElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> create(Document&, MediaControls*); + static PassRefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> create(MediaControls&); virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } virtual void updateDisplayType() OVERRIDE; private: - explicit MediaControlToggleClosedCaptionsButtonElement(Document&, MediaControls*); + explicit MediaControlToggleClosedCaptionsButtonElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; }; @@ -179,87 +151,93 @@ private: class MediaControlTimelineElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlTimelineElement> create(Document&, MediaControls*); + static PassRefPtrWillBeRawPtr<MediaControlTimelineElement> create(MediaControls&); virtual bool willRespondToMouseClickEvents() OVERRIDE; + // FIXME: An "earliest possible position" will be needed once that concept + // is supported by HTMLMediaElement, see https://crbug.com/137275 void setPosition(double); void setDuration(double); private: - explicit MediaControlTimelineElement(Document&, MediaControls*); + explicit MediaControlTimelineElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; - - MediaControls* m_controls; }; // ---------------------------- class MediaControlFullscreenButtonElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlFullscreenButtonElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> create(MediaControls&); virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; } - virtual void setIsFullscreen(bool); + void setIsFullscreen(bool); private: - explicit MediaControlFullscreenButtonElement(Document&); + explicit MediaControlFullscreenButtonElement(MediaControls&); - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual void defaultEventHandler(Event*) OVERRIDE; }; // ---------------------------- -class MediaControlPanelVolumeSliderElement FINAL : public MediaControlVolumeSliderElement { +class MediaControlVolumeSliderElement FINAL : public MediaControlInputElement { public: - static PassRefPtr<MediaControlPanelVolumeSliderElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlVolumeSliderElement> create(MediaControls&); + + virtual bool willRespondToMouseMoveEvents() OVERRIDE; + virtual bool willRespondToMouseClickEvents() OVERRIDE; + void setVolume(double); private: - explicit MediaControlPanelVolumeSliderElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlVolumeSliderElement(MediaControls&); + + virtual const AtomicString& shadowPseudoId() const OVERRIDE; + virtual void defaultEventHandler(Event*) OVERRIDE; }; // ---------------------------- class MediaControlTimeRemainingDisplayElement FINAL : public MediaControlTimeDisplayElement { public: - static PassRefPtr<MediaControlTimeRemainingDisplayElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> create(MediaControls&); private: - explicit MediaControlTimeRemainingDisplayElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlTimeRemainingDisplayElement(MediaControls&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; }; // ---------------------------- class MediaControlCurrentTimeDisplayElement FINAL : public MediaControlTimeDisplayElement { public: - static PassRefPtr<MediaControlCurrentTimeDisplayElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> create(MediaControls&); private: - explicit MediaControlCurrentTimeDisplayElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlCurrentTimeDisplayElement(MediaControls&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; }; // ---------------------------- class MediaControlTextTrackContainerElement FINAL : public MediaControlDivElement { public: - static PassRefPtr<MediaControlTextTrackContainerElement> create(Document&); + static PassRefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> create(MediaControls&); void updateDisplay(); - void updateSizes(bool forceUpdate = false); + void updateSizes(); static const AtomicString& textTrackContainerElementShadowPseudoId(); private: - explicit MediaControlTextTrackContainerElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit MediaControlTextTrackContainerElement(MediaControls&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; - virtual RenderObject* createRenderer(RenderStyle*); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; IntRect m_videoDisplaySize; float m_fontSize; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp index 0e2fa811fba..a82cf61a972 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp @@ -28,118 +28,162 @@ #include "core/html/shadow/MediaControls.h" #include "bindings/v8/ExceptionStatePlaceholder.h" +#include "core/events/MouseEvent.h" +#include "core/frame/Settings.h" +#include "core/html/HTMLMediaElement.h" +#include "core/html/MediaController.h" +#include "core/rendering/RenderTheme.h" namespace WebCore { -static const double timeWithoutMouseMovementBeforeHidingFullscreenControls = 3; - -MediaControls::MediaControls(Document& document) - : HTMLDivElement(document) - , m_mediaController(0) - , m_panel(0) - , m_textDisplayContainer(0) - , m_playButton(0) - , m_currentTimeDisplay(0) - , m_timeline(0) - , m_panelMuteButton(0) - , m_volumeSlider(0) - , m_toggleClosedCaptionsButton(0) - , m_fullScreenButton(0) - , m_hideFullscreenControlsTimer(this, &MediaControls::hideFullscreenControlsTimerFired) - , m_isFullscreen(false) +// If you change this value, then also update the corresponding value in +// LayoutTests/media/media-controls.js. +static const double timeWithoutMouseMovementBeforeHidingMediaControls = 3; + +MediaControls::MediaControls(HTMLMediaElement& mediaElement) + : HTMLDivElement(mediaElement.document()) + , m_mediaElement(&mediaElement) + , m_panel(nullptr) + , m_textDisplayContainer(nullptr) + , m_overlayPlayButton(nullptr) + , m_overlayEnclosure(nullptr) + , m_playButton(nullptr) + , m_currentTimeDisplay(nullptr) + , m_timeline(nullptr) + , m_muteButton(nullptr) + , m_volumeSlider(nullptr) + , m_toggleClosedCaptionsButton(nullptr) + , m_fullScreenButton(nullptr) + , m_durationDisplay(nullptr) + , m_enclosure(nullptr) + , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired) , m_isMouseOverControls(false) + , m_isPausedForScrubbing(false) { } -void MediaControls::setMediaController(MediaControllerInterface* controller) +PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& mediaElement) { - if (m_mediaController == controller) - return; - m_mediaController = controller; + RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaControls(mediaElement)); - if (m_panel) - m_panel->setMediaController(controller); - if (m_textDisplayContainer) - m_textDisplayContainer->setMediaController(controller); - if (m_playButton) - m_playButton->setMediaController(controller); - if (m_currentTimeDisplay) - m_currentTimeDisplay->setMediaController(controller); - if (m_timeline) - m_timeline->setMediaController(controller); - if (m_panelMuteButton) - m_panelMuteButton->setMediaController(controller); - if (m_volumeSlider) - m_volumeSlider->setMediaController(controller); - if (m_toggleClosedCaptionsButton) - m_toggleClosedCaptionsButton->setMediaController(controller); - if (m_fullScreenButton) - m_fullScreenButton->setMediaController(controller); + if (controls->initializeControls()) + return controls.release(); + + return nullptr; } -void MediaControls::reset() +bool MediaControls::initializeControls() { - Page* page = document().page(); - if (!page) - return; + TrackExceptionState exceptionState; - m_playButton->updateDisplayType(); + if (document().settings() && document().settings()->mediaControlsOverlayPlayButtonEnabled()) { + RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); + RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(*this); + m_overlayPlayButton = overlayPlayButton.get(); + overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionState); + if (exceptionState.hadException()) + return false; - updateCurrentTimeDisplay(); - - double duration = m_mediaController->duration(); - if (std::isfinite(duration) || RenderTheme::theme().hasOwnDisabledStateHandlingFor(MediaSliderPart)) { - m_timeline->setDuration(duration); - m_timeline->setPosition(m_mediaController->currentTime()); + m_overlayEnclosure = overlayEnclosure.get(); + appendChild(overlayEnclosure.release(), exceptionState); + if (exceptionState.hadException()) + return false; } - if (m_mediaController->hasAudio() || RenderTheme::theme().hasOwnDisabledStateHandlingFor(MediaMuteButtonPart)) - m_panelMuteButton->show(); - else - m_panelMuteButton->hide(); - - if (m_volumeSlider) { - if (!m_mediaController->hasAudio()) - m_volumeSlider->hide(); - else { - m_volumeSlider->show(); - m_volumeSlider->setVolume(m_mediaController->volume()); - } - } + // Create an enclosing element for the panel so we can visually offset the controls correctly. + RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(*this); - refreshClosedCaptionsButtonVisibility(); + RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(*this); - if (m_fullScreenButton) { - if (m_mediaController->supportsFullscreen() && m_mediaController->hasVideo()) - m_fullScreenButton->show(); - else - m_fullScreenButton->hide(); - } + RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(*this); + m_playButton = playButton.get(); + panel->appendChild(playButton.release(), exceptionState); + if (exceptionState.hadException()) + return false; - makeOpaque(); + RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(*this); + m_timeline = timeline.get(); + panel->appendChild(timeline.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(*this); + m_currentTimeDisplay = currentTimeDisplay.get(); + m_currentTimeDisplay->hide(); + panel->appendChild(currentTimeDisplay.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(*this); + m_durationDisplay = durationDisplay.get(); + panel->appendChild(durationDisplay.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlMuteButtonElement> muteButton = MediaControlMuteButtonElement::create(*this); + m_muteButton = muteButton.get(); + panel->appendChild(muteButton.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = MediaControlVolumeSliderElement::create(*this); + m_volumeSlider = slider.get(); + panel->appendChild(slider.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); + m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); + panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(*this); + m_fullScreenButton = fullscreenButton.get(); + panel->appendChild(fullscreenButton.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + m_panel = panel.get(); + enclosure->appendChild(panel.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + m_enclosure = enclosure.get(); + appendChild(enclosure.release(), exceptionState); + if (exceptionState.hadException()) + return false; + + return true; } -void MediaControls::reportedError() +void MediaControls::reset() { - Page* page = document().page(); - if (!page) - return; + double duration = mediaElement().duration(); + m_durationDisplay->setInnerText(RenderTheme::theme().formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION); + m_durationDisplay->setCurrentValue(duration); + + updatePlayState(); + + updateCurrentTimeDisplay(); - if (!RenderTheme::theme().hasOwnDisabledStateHandlingFor(MediaMuteButtonPart)) { - m_panelMuteButton->hide(); + m_timeline->setDuration(duration); + m_timeline->setPosition(mediaElement().currentTime()); + + if (!mediaElement().hasAudio()) m_volumeSlider->hide(); - } + else + m_volumeSlider->show(); + updateVolume(); - if (m_toggleClosedCaptionsButton && !RenderTheme::theme().hasOwnDisabledStateHandlingFor(MediaToggleClosedCaptionsButtonPart)) - m_toggleClosedCaptionsButton->hide(); + refreshClosedCaptionsButtonVisibility(); - if (m_fullScreenButton && !RenderTheme::theme().hasOwnDisabledStateHandlingFor(MediaEnterFullscreenButtonPart)) + if (mediaElement().hasVideo()) + m_fullScreenButton->show(); + else m_fullScreenButton->hide(); -} -void MediaControls::loadedMetadata() -{ - reset(); + makeOpaque(); } void MediaControls::show() @@ -149,6 +193,12 @@ void MediaControls::show() m_panel->show(); } +void MediaControls::mediaElementFocused() +{ + show(); + stopHideMediaControlsTimer(); +} + void MediaControls::hide() { m_panel->setIsDisplayed(false); @@ -165,81 +215,118 @@ void MediaControls::makeTransparent() m_panel->makeTransparent(); } -bool MediaControls::shouldHideControls() +bool MediaControls::shouldHideMediaControls(unsigned behaviorFlags) const { - return !m_panel->hovered(); -} - -void MediaControls::bufferingProgressed() -{ - // We only need to update buffering progress when paused, during normal - // playback playbackProgressed() will take care of it. - if (m_mediaController->paused()) - m_timeline->setPosition(m_mediaController->currentTime()); + // Never hide for a media element without visual representation. + if (!mediaElement().hasVideo()) + return false; + // Don't hide if the controls are hovered or the mouse is over the video area. + const bool ignoreVideoHover = behaviorFlags & IgnoreVideoHover; + if (m_panel->hovered() || (!ignoreVideoHover && m_isMouseOverControls)) + return false; + // Don't hide if focus is on the HTMLMediaElement or within the + // controls/shadow tree. (Perform the checks separately to avoid going + // through all the potential ancestor hosts for the focused element.) + const bool ignoreFocus = behaviorFlags & IgnoreFocus; + if (!ignoreFocus && (mediaElement().focused() || contains(document().focusedElement()))) + return false; + return true; } void MediaControls::playbackStarted() { - m_playButton->updateDisplayType(); - m_timeline->setPosition(m_mediaController->currentTime()); + m_currentTimeDisplay->show(); + m_durationDisplay->hide(); + + updatePlayState(); + m_timeline->setPosition(mediaElement().currentTime()); updateCurrentTimeDisplay(); - if (m_isFullscreen) - startHideFullscreenControlsTimer(); + startHideMediaControlsTimer(); } void MediaControls::playbackProgressed() { - m_timeline->setPosition(m_mediaController->currentTime()); + m_timeline->setPosition(mediaElement().currentTime()); updateCurrentTimeDisplay(); - if (!m_isMouseOverControls && m_mediaController->hasVideo()) + if (shouldHideMediaControls()) makeTransparent(); } void MediaControls::playbackStopped() { - m_playButton->updateDisplayType(); - m_timeline->setPosition(m_mediaController->currentTime()); + updatePlayState(); + m_timeline->setPosition(mediaElement().currentTime()); updateCurrentTimeDisplay(); makeOpaque(); - stopHideFullscreenControlsTimer(); + stopHideMediaControlsTimer(); } -void MediaControls::showVolumeSlider() +void MediaControls::updatePlayState() { - if (!m_mediaController->hasAudio()) + if (m_isPausedForScrubbing) return; - m_volumeSlider->show(); + if (m_overlayPlayButton) + m_overlayPlayButton->updateDisplayType(); + m_playButton->updateDisplayType(); } -void MediaControls::changedMute() +void MediaControls::beginScrubbing() { - m_panelMuteButton->changedMute(); + if (!mediaElement().togglePlayStateWillPlay()) { + m_isPausedForScrubbing = true; + mediaElement().togglePlayState(); + } } -void MediaControls::changedVolume() +void MediaControls::endScrubbing() { - if (m_volumeSlider) - m_volumeSlider->setVolume(m_mediaController->volume()); - if (m_panelMuteButton && m_panelMuteButton->renderer()) - m_panelMuteButton->renderer()->repaint(); + if (m_isPausedForScrubbing) { + m_isPausedForScrubbing = false; + if (mediaElement().togglePlayStateWillPlay()) + mediaElement().togglePlayState(); + } +} + +void MediaControls::updateCurrentTimeDisplay() +{ + double now = mediaElement().currentTime(); + double duration = mediaElement().duration(); + + // After seek, hide duration display and show current time. + if (now > 0) { + m_currentTimeDisplay->show(); + m_durationDisplay->hide(); + } + + // Allow the theme to format the time. + m_currentTimeDisplay->setInnerText(RenderTheme::theme().formatMediaControlsCurrentTime(now, duration), IGNORE_EXCEPTION); + m_currentTimeDisplay->setCurrentValue(now); +} + +void MediaControls::updateVolume() +{ + m_muteButton->updateDisplayType(); + if (m_muteButton->renderer()) + m_muteButton->renderer()->paintInvalidationForWholeRenderer(); + + if (mediaElement().muted()) + m_volumeSlider->setVolume(0); + else + m_volumeSlider->setVolume(mediaElement().volume()); } void MediaControls::changedClosedCaptionsVisibility() { - if (m_toggleClosedCaptionsButton) - m_toggleClosedCaptionsButton->updateDisplayType(); + m_toggleClosedCaptionsButton->updateDisplayType(); } void MediaControls::refreshClosedCaptionsButtonVisibility() { - if (!m_toggleClosedCaptionsButton) - return; - - if (m_mediaController->hasClosedCaptions()) + if (mediaElement().hasClosedCaptions()) m_toggleClosedCaptionsButton->show(); else m_toggleClosedCaptionsButton->hide(); @@ -252,16 +339,16 @@ void MediaControls::closedCaptionTracksChanged() void MediaControls::enteredFullscreen() { - m_isFullscreen = true; m_fullScreenButton->setIsFullscreen(true); - startHideFullscreenControlsTimer(); + stopHideMediaControlsTimer(); + startHideMediaControlsTimer(); } void MediaControls::exitedFullscreen() { - m_isFullscreen = false; m_fullScreenButton->setIsFullscreen(false); - stopHideFullscreenControlsTimer(); + stopHideMediaControlsTimer(); + startHideMediaControlsTimer(); } void MediaControls::defaultEventHandler(Event* event) @@ -271,10 +358,10 @@ void MediaControls::defaultEventHandler(Event* event) if (event->type() == EventTypeNames::mouseover) { if (!containsRelatedTarget(event)) { m_isMouseOverControls = true; - if (!m_mediaController->canPlay()) { + if (!mediaElement().togglePlayStateWillPlay()) { makeOpaque(); - if (shouldHideControls()) - startHideFullscreenControlsTimer(); + if (shouldHideMediaControls()) + startHideMediaControlsTimer(); } } return; @@ -283,55 +370,43 @@ void MediaControls::defaultEventHandler(Event* event) if (event->type() == EventTypeNames::mouseout) { if (!containsRelatedTarget(event)) { m_isMouseOverControls = false; - stopHideFullscreenControlsTimer(); + stopHideMediaControlsTimer(); } return; } if (event->type() == EventTypeNames::mousemove) { - if (m_isFullscreen) { - // When we get a mouse move in fullscreen mode, show the media controls, and start a timer - // that will hide the media controls after a 3 seconds without a mouse move. - makeOpaque(); - if (shouldHideControls()) - startHideFullscreenControlsTimer(); - } + // When we get a mouse move, show the media controls, and start a timer + // that will hide the media controls after a 3 seconds without a mouse move. + makeOpaque(); + if (shouldHideMediaControls(IgnoreVideoHover)) + startHideMediaControlsTimer(); return; } } -void MediaControls::hideFullscreenControlsTimerFired(Timer<MediaControls>*) +void MediaControls::hideMediaControlsTimerFired(Timer<MediaControls>*) { - if (m_mediaController->paused()) + if (mediaElement().togglePlayStateWillPlay()) return; - if (!m_isFullscreen) - return; - - if (!shouldHideControls()) + if (!shouldHideMediaControls(IgnoreFocus | IgnoreVideoHover)) return; makeTransparent(); } -void MediaControls::startHideFullscreenControlsTimer() +void MediaControls::startHideMediaControlsTimer() { - if (!m_isFullscreen) - return; - - Page* page = document().page(); - if (!page) - return; - - m_hideFullscreenControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingFullscreenControls); + m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMediaControls, FROM_HERE); } -void MediaControls::stopHideFullscreenControlsTimer() +void MediaControls::stopHideMediaControlsTimer() { - m_hideFullscreenControlsTimer.stop(); + m_hideMediaControlsTimer.stop(); } -const AtomicString& MediaControls::pseudo() const +const AtomicString& MediaControls::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls")); return id; @@ -352,14 +427,14 @@ void MediaControls::createTextTrackDisplay() if (m_textDisplayContainer) return; - RefPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(document()); + RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(*this); m_textDisplayContainer = textDisplayContainer.get(); - if (m_mediaController) - m_textDisplayContainer->setMediaController(m_mediaController); - - // Insert it before the first controller element so it always displays behind the controls. - insertBefore(textDisplayContainer.release(), m_panel, IGNORE_EXCEPTION); + // Insert it before (behind) all other control elements. + if (m_overlayEnclosure && m_overlayPlayButton) + m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overlayPlayButton); + else + insertBefore(textDisplayContainer.release(), m_enclosure); } void MediaControls::showTextTrackDisplay() @@ -384,4 +459,23 @@ void MediaControls::updateTextTrackDisplay() m_textDisplayContainer->updateDisplay(); } +void MediaControls::trace(Visitor* visitor) +{ + visitor->trace(m_mediaElement); + visitor->trace(m_panel); + visitor->trace(m_textDisplayContainer); + visitor->trace(m_overlayPlayButton); + visitor->trace(m_overlayEnclosure); + visitor->trace(m_playButton); + visitor->trace(m_currentTimeDisplay); + visitor->trace(m_timeline); + visitor->trace(m_muteButton); + visitor->trace(m_volumeSlider); + visitor->trace(m_toggleClosedCaptionsButton); + visitor->trace(m_fullScreenButton); + visitor->trace(m_durationDisplay); + visitor->trace(m_enclosure); + HTMLDivElement::trace(visitor); +} + } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.h b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.h index ea87254a8e2..7879662b3cb 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControls.h @@ -27,106 +27,109 @@ #ifndef MediaControls_h #define MediaControls_h -#include "core/events/MouseEvent.h" #include "core/html/HTMLDivElement.h" #include "core/html/shadow/MediaControlElements.h" -#include "core/rendering/RenderTheme.h" namespace WebCore { class Document; class Event; -class MediaPlayer; -class RenderBox; -class RenderMedia; +class MediaControls FINAL : public HTMLDivElement { +public: + static PassRefPtrWillBeRawPtr<MediaControls> create(HTMLMediaElement&); -// An abstract class with the media control elements that all ports support. -class MediaControls : public HTMLDivElement { - public: - virtual ~MediaControls() {} + HTMLMediaElement& mediaElement() const { return *m_mediaElement; } - // This function is to be implemented in your port-specific media - // controls implementation since it will return a child instance. - static PassRefPtr<MediaControls> create(Document&); + void reset(); - virtual void setMediaController(MediaControllerInterface*); + void show(); + void hide(); - virtual void reset(); - virtual void reportedError(); - virtual void loadedMetadata(); + void playbackStarted(); + void playbackProgressed(); + void playbackStopped(); - virtual void show(); - virtual void hide(); - virtual void makeOpaque(); - virtual void makeTransparent(); - virtual bool shouldHideControls(); + void beginScrubbing(); + void endScrubbing(); - virtual void bufferingProgressed(); - virtual void playbackStarted(); - virtual void playbackProgressed(); - virtual void playbackStopped(); + void updateCurrentTimeDisplay(); - virtual void updateStatusDisplay() { }; - virtual void updateCurrentTimeDisplay() = 0; - virtual void showVolumeSlider(); + void updateVolume(); - virtual void changedMute(); - virtual void changedVolume(); + void changedClosedCaptionsVisibility(); + void refreshClosedCaptionsButtonVisibility(); + void closedCaptionTracksChanged(); - virtual void changedClosedCaptionsVisibility(); - virtual void refreshClosedCaptionsButtonVisibility(); - virtual void closedCaptionTracksChanged(); + void enteredFullscreen(); + void exitedFullscreen(); - virtual void enteredFullscreen(); - virtual void exitedFullscreen(); + void updateTextTrackDisplay(); - virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; } + void mediaElementFocused(); + + virtual void trace(Visitor*) OVERRIDE; + +private: + explicit MediaControls(HTMLMediaElement&); + + bool initializeControls(); - virtual void hideFullscreenControlsTimerFired(Timer<MediaControls>*); - virtual void startHideFullscreenControlsTimer(); - virtual void stopHideFullscreenControlsTimer(); + void makeOpaque(); + void makeTransparent(); - virtual void createTextTrackDisplay(); - virtual void showTextTrackDisplay(); - virtual void hideTextTrackDisplay(); - virtual void updateTextTrackDisplay(); + void updatePlayState(); -protected: - explicit MediaControls(Document&); + enum HideBehaviorFlags { + IgnoreVideoHover = 1 << 0, + IgnoreFocus = 1 << 1 + }; - virtual void defaultEventHandler(Event*); + bool shouldHideMediaControls(unsigned behaviorFlags = 0) const; + void hideMediaControlsTimerFired(Timer<MediaControls>*); + void startHideMediaControlsTimer(); + void stopHideMediaControlsTimer(); - virtual bool containsRelatedTarget(Event*); + void createTextTrackDisplay(); + void showTextTrackDisplay(); + void hideTextTrackDisplay(); - MediaControllerInterface* m_mediaController; + // Node + virtual bool isMediaControls() const OVERRIDE { return true; } + virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; } + virtual void defaultEventHandler(Event*) OVERRIDE; + bool containsRelatedTarget(Event*); + + // Element + virtual const AtomicString& shadowPseudoId() const OVERRIDE; + + RawPtrWillBeMember<HTMLMediaElement> m_mediaElement; // Container for the media control elements. - MediaControlPanelElement* m_panel; + RawPtrWillBeMember<MediaControlPanelElement> m_panel; // Container for the text track cues. - MediaControlTextTrackContainerElement* m_textDisplayContainer; + RawPtrWillBeMember<MediaControlTextTrackContainerElement> m_textDisplayContainer; // Media control elements. - MediaControlPlayButtonElement* m_playButton; - MediaControlCurrentTimeDisplayElement* m_currentTimeDisplay; - MediaControlTimelineElement* m_timeline; - MediaControlPanelMuteButtonElement* m_panelMuteButton; - MediaControlPanelVolumeSliderElement* m_volumeSlider; - MediaControlToggleClosedCaptionsButtonElement* m_toggleClosedCaptionsButton; - MediaControlFullscreenButtonElement* m_fullScreenButton; - - Timer<MediaControls> m_hideFullscreenControlsTimer; - bool m_isFullscreen; - bool m_isMouseOverControls; - -private: - virtual bool isMediaControls() const { return true; } - - virtual const AtomicString& pseudo() const; + RawPtrWillBeMember<MediaControlOverlayPlayButtonElement> m_overlayPlayButton; + RawPtrWillBeMember<MediaControlOverlayEnclosureElement> m_overlayEnclosure; + RawPtrWillBeMember<MediaControlPlayButtonElement> m_playButton; + RawPtrWillBeMember<MediaControlCurrentTimeDisplayElement> m_currentTimeDisplay; + RawPtrWillBeMember<MediaControlTimelineElement> m_timeline; + RawPtrWillBeMember<MediaControlMuteButtonElement> m_muteButton; + RawPtrWillBeMember<MediaControlVolumeSliderElement> m_volumeSlider; + RawPtrWillBeMember<MediaControlToggleClosedCaptionsButtonElement> m_toggleClosedCaptionsButton; + RawPtrWillBeMember<MediaControlFullscreenButtonElement> m_fullScreenButton; + RawPtrWillBeMember<MediaControlTimeRemainingDisplayElement> m_durationDisplay; + RawPtrWillBeMember<MediaControlPanelEnclosureElement> m_enclosure; + + Timer<MediaControls> m_hideMediaControlsTimer; + bool m_isMouseOverControls : 1; + bool m_isPausedForScrubbing : 1; }; -DEFINE_NODE_TYPE_CASTS(MediaControls, isMediaControls()); +DEFINE_ELEMENT_TYPE_CASTS(MediaControls, isMediaControls()); } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.cpp deleted file mode 100644 index d1d4ccbfd40..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2011, 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/html/shadow/MediaControlsChromium.h" - -#include "bindings/v8/ExceptionState.h" -#include "bindings/v8/ExceptionStatePlaceholder.h" - -using namespace std; - -namespace WebCore { - -MediaControlsChromium::MediaControlsChromium(Document& document) - : MediaControls(document) - , m_durationDisplay(0) - , m_enclosure(0) -{ -} - -// MediaControls::create() for Android is defined in MediaControlsChromiumAndroid.cpp. -#if !OS(ANDROID) -PassRefPtr<MediaControls> MediaControls::create(Document& document) -{ - return MediaControlsChromium::createControls(document); -} -#endif - -PassRefPtr<MediaControlsChromium> MediaControlsChromium::createControls(Document& document) -{ - if (!document.page()) - return 0; - - RefPtr<MediaControlsChromium> controls = adoptRef(new MediaControlsChromium(document)); - - if (controls->initializeControls(document)) - return controls.release(); - - return 0; -} - -bool MediaControlsChromium::initializeControls(Document& document) -{ - // Create an enclosing element for the panel so we can visually offset the controls correctly. - RefPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(document); - - RefPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(document); - - TrackExceptionState exceptionState; - - RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document); - m_playButton = playButton.get(); - panel->appendChild(playButton.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, this); - m_timeline = timeline.get(); - panel->appendChild(timeline.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document); - m_currentTimeDisplay = currentTimeDisplay.get(); - m_currentTimeDisplay->hide(); - panel->appendChild(currentTimeDisplay.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - RefPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(document); - m_durationDisplay = durationDisplay.get(); - panel->appendChild(durationDisplay.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, this); - m_panelMuteButton = panelMuteButton.get(); - panel->appendChild(panelMuteButton.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - RefPtr<MediaControlPanelVolumeSliderElement> slider = MediaControlPanelVolumeSliderElement::create(document); - m_volumeSlider = slider.get(); - m_volumeSlider->setClearMutedOnUserInteraction(true); - panel->appendChild(slider.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - if (RenderTheme::theme().supportsClosedCaptioning()) { - RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document, this); - m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); - panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); - if (exceptionState.hadException()) - return false; - } - - RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document); - m_fullScreenButton = fullscreenButton.get(); - panel->appendChild(fullscreenButton.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - m_panel = panel.get(); - enclosure->appendChild(panel.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - m_enclosure = enclosure.get(); - appendChild(enclosure.release(), exceptionState); - if (exceptionState.hadException()) - return false; - - return true; -} - -void MediaControlsChromium::setMediaController(MediaControllerInterface* controller) -{ - if (m_mediaController == controller) - return; - - MediaControls::setMediaController(controller); - - if (m_durationDisplay) - m_durationDisplay->setMediaController(controller); - if (m_enclosure) - m_enclosure->setMediaController(controller); -} - -void MediaControlsChromium::reset() -{ - Page* page = document().page(); - if (!page) - return; - - double duration = m_mediaController->duration(); - m_durationDisplay->setInnerText(RenderTheme::theme().formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION); - m_durationDisplay->setCurrentValue(duration); - - MediaControls::reset(); -} - -void MediaControlsChromium::playbackStarted() -{ - m_currentTimeDisplay->show(); - m_durationDisplay->hide(); - - MediaControls::playbackStarted(); -} - -void MediaControlsChromium::updateCurrentTimeDisplay() -{ - double now = m_mediaController->currentTime(); - double duration = m_mediaController->duration(); - - Page* page = document().page(); - if (!page) - return; - - // After seek, hide duration display and show current time. - if (now > 0) { - m_currentTimeDisplay->show(); - m_durationDisplay->hide(); - } - - // Allow the theme to format the time. - m_currentTimeDisplay->setInnerText(RenderTheme::theme().formatMediaControlsCurrentTime(now, duration), IGNORE_EXCEPTION); - m_currentTimeDisplay->setCurrentValue(now); -} - -void MediaControlsChromium::changedMute() -{ - MediaControls::changedMute(); - - if (m_mediaController->muted()) - m_volumeSlider->setVolume(0); - else - m_volumeSlider->setVolume(m_mediaController->volume()); -} - -void MediaControlsChromium::createTextTrackDisplay() -{ - if (m_textDisplayContainer) - return; - - RefPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(document()); - m_textDisplayContainer = textDisplayContainer.get(); - - if (m_mediaController) - m_textDisplayContainer->setMediaController(m_mediaController); - - insertTextTrackContainer(textDisplayContainer.release()); -} - -void MediaControlsChromium::insertTextTrackContainer(PassRefPtr<MediaControlTextTrackContainerElement> textTrackContainer) -{ - // Insert it before the first controller element so it always displays behind the controls. - // In the Chromium case, that's the enclosure element. - insertBefore(textTrackContainer, m_enclosure); -} - - -} diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.h b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.h deleted file mode 100644 index 5e3c55e8512..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromium.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2011, 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef MediaControlsChromium_h -#define MediaControlsChromium_h - -#include "core/html/shadow/MediaControls.h" - -namespace WebCore { - -class MediaControlsChromium : public MediaControls { -public: - // Called from port-specific parent create function to create custom controls. - static PassRefPtr<MediaControlsChromium> createControls(Document&); - - virtual void setMediaController(MediaControllerInterface*) OVERRIDE; - - virtual void reset() OVERRIDE; - - virtual void playbackStarted() OVERRIDE; - - void changedMute() OVERRIDE; - - virtual void updateCurrentTimeDisplay() OVERRIDE; - - void createTextTrackDisplay() OVERRIDE; - - virtual void insertTextTrackContainer(PassRefPtr<MediaControlTextTrackContainerElement>); - -protected: - explicit MediaControlsChromium(Document&); - - bool initializeControls(Document&); - -private: - MediaControlTimeRemainingDisplayElement* m_durationDisplay; - MediaControlPanelEnclosureElement* m_enclosure; -}; - -} - -#endif diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.cpp deleted file mode 100644 index f81c9309b37..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/html/shadow/MediaControlsChromiumAndroid.h" - -#include "bindings/v8/ExceptionState.h" -#include "bindings/v8/ExceptionStatePlaceholder.h" - -namespace WebCore { - -MediaControlsChromiumAndroid::MediaControlsChromiumAndroid(Document& document) - : MediaControlsChromium(document) - , m_overlayPlayButton(0) - , m_overlayEnclosure(0) -{ -} - -PassRefPtr<MediaControls> MediaControls::create(Document& document) -{ - return MediaControlsChromiumAndroid::createControls(document); -} - -PassRefPtr<MediaControlsChromiumAndroid> MediaControlsChromiumAndroid::createControls(Document& document) -{ - if (!document.page()) - return 0; - - RefPtr<MediaControlsChromiumAndroid> controls = adoptRef(new MediaControlsChromiumAndroid(document)); - - TrackExceptionState exceptionState; - - RefPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(document); - RefPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(document); - controls->m_overlayPlayButton = overlayPlayButton.get(); - overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionState); - if (exceptionState.hadException()) - return 0; - - controls->m_overlayEnclosure = overlayEnclosure.get(); - controls->appendChild(overlayEnclosure.release(), exceptionState); - if (exceptionState.hadException()) - return 0; - - if (controls->initializeControls(document)) - return controls.release(); - - return 0; -} - -void MediaControlsChromiumAndroid::setMediaController(MediaControllerInterface* controller) -{ - if (m_overlayPlayButton) - m_overlayPlayButton->setMediaController(controller); - if (m_overlayEnclosure) - m_overlayEnclosure->setMediaController(controller); - MediaControlsChromium::setMediaController(controller); -} - -void MediaControlsChromiumAndroid::playbackStarted() -{ - m_overlayPlayButton->updateDisplayType(); - MediaControlsChromium::playbackStarted(); -} - -void MediaControlsChromiumAndroid::playbackStopped() -{ - m_overlayPlayButton->updateDisplayType(); - MediaControlsChromium::playbackStopped(); -} - -void MediaControlsChromiumAndroid::insertTextTrackContainer(PassRefPtr<MediaControlTextTrackContainerElement> textTrackContainer) -{ - // Insert it before the overlay play button so it always displays behind it. - m_overlayEnclosure->insertBefore(textTrackContainer, m_overlayPlayButton); -} -} diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.h b/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.h deleted file mode 100644 index 8b8a90069f4..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MediaControlsChromiumAndroid.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef MediaControlsChromiumAndroid_h -#define MediaControlsChromiumAndroid_h - -#include "core/html/shadow/MediaControls.h" -#include "core/html/shadow/MediaControlsChromium.h" - -namespace WebCore { - -class MediaControlsChromiumAndroid : public MediaControlsChromium { -public: - static PassRefPtr<MediaControlsChromiumAndroid> createControls(Document&); - - virtual void setMediaController(MediaControllerInterface*) OVERRIDE; - virtual void playbackStarted() OVERRIDE; - virtual void playbackStopped() OVERRIDE; - virtual bool shouldHideControls() OVERRIDE { return true; } - - void insertTextTrackContainer(PassRefPtr<MediaControlTextTrackContainerElement>) OVERRIDE; - -private: - explicit MediaControlsChromiumAndroid(Document&); - - MediaControlOverlayPlayButtonElement* m_overlayPlayButton; - MediaControlOverlayEnclosureElement* m_overlayEnclosure; -}; - -} - -#endif diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.cpp index a39c29cdb71..8f8f0cc4671 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.cpp @@ -32,8 +32,8 @@ #include "core/html/shadow/MeterShadowElement.h" -#include "CSSPropertyNames.h" -#include "HTMLNames.h" +#include "core/CSSPropertyNames.h" +#include "core/HTMLNames.h" #include "core/html/HTMLMeterElement.h" #include "core/rendering/RenderMeter.h" #include "core/rendering/RenderTheme.h" @@ -63,10 +63,10 @@ inline MeterInnerElement::MeterInnerElement(Document& document) { } -PassRefPtr<MeterInnerElement> MeterInnerElement::create(Document& document) +PassRefPtrWillBeRawPtr<MeterInnerElement> MeterInnerElement::create(Document& document) { - RefPtr<MeterInnerElement> element = adoptRef(new MeterInnerElement(document)); - element->setPseudo(AtomicString("-webkit-meter-inner-element", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<MeterInnerElement> element = adoptRefWillBeNoop(new MeterInnerElement(document)); + element->setShadowPseudoId(AtomicString("-webkit-meter-inner-element", AtomicString::ConstructFromLiteral)); return element.release(); } @@ -89,10 +89,10 @@ inline MeterBarElement::MeterBarElement(Document& document) { } -PassRefPtr<MeterBarElement> MeterBarElement::create(Document& document) +PassRefPtrWillBeRawPtr<MeterBarElement> MeterBarElement::create(Document& document) { - RefPtr<MeterBarElement> element = adoptRef(new MeterBarElement(document)); - element->setPseudo(AtomicString("-webkit-meter-bar", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<MeterBarElement> element = adoptRefWillBeNoop(new MeterBarElement(document)); + element->setShadowPseudoId(AtomicString("-webkit-meter-bar", AtomicString::ConstructFromLiteral)); return element.release(); } @@ -101,9 +101,9 @@ inline MeterValueElement::MeterValueElement(Document& document) { } -PassRefPtr<MeterValueElement> MeterValueElement::create(Document& document) +PassRefPtrWillBeRawPtr<MeterValueElement> MeterValueElement::create(Document& document) { - RefPtr<MeterValueElement> element = adoptRef(new MeterValueElement(document)); + RefPtrWillBeRawPtr<MeterValueElement> element = adoptRefWillBeNoop(new MeterValueElement(document)); element->updatePseudo(); return element.release(); } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.h index c15bfdcbcb7..22847f7a8f7 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/MeterShadowElement.h @@ -41,39 +41,39 @@ class RenderMeter; class MeterShadowElement : public HTMLDivElement { protected: - MeterShadowElement(Document&); + explicit MeterShadowElement(Document&); HTMLMeterElement* meterElement() const; private: - virtual bool rendererIsNeeded(const RenderStyle&); + virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE; }; class MeterInnerElement FINAL : public MeterShadowElement { public: - static PassRefPtr<MeterInnerElement> create(Document&); + static PassRefPtrWillBeRawPtr<MeterInnerElement> create(Document&); private: - MeterInnerElement(Document&); + explicit MeterInnerElement(Document&); virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE; virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; }; class MeterBarElement FINAL : public MeterShadowElement { private: - MeterBarElement(Document&); + explicit MeterBarElement(Document&); public: - static PassRefPtr<MeterBarElement> create(Document&); + static PassRefPtrWillBeRawPtr<MeterBarElement> create(Document&); }; class MeterValueElement FINAL : public MeterShadowElement { public: - static PassRefPtr<MeterValueElement> create(Document&); + static PassRefPtrWillBeRawPtr<MeterValueElement> create(Document&); void setWidthPercentage(double); - void updatePseudo() { setPseudo(valuePseudoId()); } + void updatePseudo() { setShadowPseudoId(valuePseudoId()); } private: - MeterValueElement(Document&); + explicit MeterValueElement(Document&); const AtomicString& valuePseudoId() const; }; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp deleted file mode 100644 index 238c3f41aee..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/html/shadow/PasswordGeneratorButtonElement.h" - -#include "core/events/Event.h" -#include "core/dom/NodeRenderStyle.h" -#include "core/fetch/ImageResource.h" -#include "core/html/HTMLInputElement.h" -#include "core/html/shadow/ShadowElementNames.h" -#include "core/page/Chrome.h" -#include "core/page/ChromeClient.h" -#include "core/page/Page.h" -#include "core/rendering/RenderImage.h" -#include "platform/graphics/Image.h" - -namespace WebCore { - -using namespace HTMLNames; - -PasswordGeneratorButtonElement::PasswordGeneratorButtonElement(Document& document) - : HTMLDivElement(document) - , m_isInHoverState(false) -{ - setHasCustomStyleCallbacks(); -} - -PassRefPtr<PasswordGeneratorButtonElement> PasswordGeneratorButtonElement::create(Document& document) -{ - RefPtr<PasswordGeneratorButtonElement> element = adoptRef(new PasswordGeneratorButtonElement(document)); - element->setAttribute(idAttr, ShadowElementNames::passwordGenerator()); - return element.release(); -} - -inline HTMLInputElement* PasswordGeneratorButtonElement::hostInput() -{ - // PasswordGeneratorButtonElement is created only by C++ code, and it is always - // in <input> shadow. - return toHTMLInputElement(shadowHost()); -} - -void PasswordGeneratorButtonElement::updateImage() -{ - if (!renderer() || !renderer()->isImage()) - return; - RenderImageResource* resource = toRenderImage(renderer())->imageResource(); - ImageResource* image = m_isInHoverState ? imageForHoverState() : imageForNormalState(); - ASSERT(image); - resource->setImageResource(image); -} - -PassRefPtr<RenderStyle> PasswordGeneratorButtonElement::customStyleForRenderer() -{ - RefPtr<RenderStyle> originalStyle = originalStyleForRenderer(); - RefPtr<RenderStyle> style = RenderStyle::clone(originalStyle.get()); - RenderStyle* inputStyle = hostInput()->renderStyle(); - ASSERT(inputStyle); - style->setWidth(Length(inputStyle->fontSize(), Fixed)); - style->setHeight(Length(inputStyle->fontSize(), Fixed)); - style->setUnique(); - updateImage(); - return style.release(); -} - -RenderObject* PasswordGeneratorButtonElement::createRenderer(RenderStyle*) -{ - RenderImage* image = new RenderImage(this); - image->setImageResource(RenderImageResource::create()); - return image; -} - -void PasswordGeneratorButtonElement::attach(const AttachContext& context) -{ - HTMLDivElement::attach(context); - updateImage(); -} - -ImageResource* PasswordGeneratorButtonElement::imageForNormalState() -{ - if (!m_cachedImageForNormalState) { - RefPtr<Image> image = Image::loadPlatformResource("generatePassword"); - m_cachedImageForNormalState = new ImageResource(image.get()); - } - return m_cachedImageForNormalState.get(); -} - -ImageResource* PasswordGeneratorButtonElement::imageForHoverState() -{ - if (!m_cachedImageForHoverState) { - RefPtr<Image> image = Image::loadPlatformResource("generatePasswordHover"); - m_cachedImageForHoverState = new ImageResource(image.get()); - } - return m_cachedImageForHoverState.get(); -} - -void PasswordGeneratorButtonElement::defaultEventHandler(Event* event) -{ - RefPtr<HTMLInputElement> input = hostInput(); - if (!input || input->isDisabledOrReadOnly() || !event->isMouseEvent()) { - if (!event->defaultHandled()) - HTMLDivElement::defaultEventHandler(event); - return; - } - - RefPtr<PasswordGeneratorButtonElement> protector(this); - if (event->type() == EventTypeNames::click) { - if (Page* page = document().page()) - page->chrome().client().openPasswordGenerator(input.get()); - event->setDefaultHandled(); - } - - if (event->type() == EventTypeNames::mouseover) { - m_isInHoverState = true; - updateImage(); - } - - if (event->type() == EventTypeNames::mouseout) { - m_isInHoverState = false; - updateImage(); - } - - if (!event->defaultHandled()) - HTMLDivElement::defaultEventHandler(event); -} - -bool PasswordGeneratorButtonElement::willRespondToMouseMoveEvents() -{ - const HTMLInputElement* input = hostInput(); - if (!input->isDisabledOrReadOnly()) - return true; - - return HTMLDivElement::willRespondToMouseMoveEvents(); -} - -bool PasswordGeneratorButtonElement::willRespondToMouseClickEvents() -{ - const HTMLInputElement* input = hostInput(); - if (!input->isDisabledOrReadOnly()) - return true; - - return HTMLDivElement::willRespondToMouseClickEvents(); -} - -} // namespace WebCore diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h deleted file mode 100644 index 0d220f9c6b1..00000000000 --- a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef PasswordGeneratorButtonElement_h -#define PasswordGeneratorButtonElement_h - -#include "core/fetch/ResourcePtr.h" -#include "core/html/HTMLDivElement.h" - -namespace WebCore { - -class ImageResource; -class HTMLInputElement; -class ShadowRoot; - -class PasswordGeneratorButtonElement FINAL : public HTMLDivElement { -public: - static PassRefPtr<PasswordGeneratorButtonElement> create(Document&); - - void decorate(HTMLInputElement*); - - virtual bool willRespondToMouseMoveEvents() OVERRIDE; - virtual bool willRespondToMouseClickEvents() OVERRIDE; - -private: - PasswordGeneratorButtonElement(Document&); - virtual bool isPasswordGeneratorButtonElement() const OVERRIDE { return true; } - virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE; - virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; - virtual void attach(const AttachContext& = AttachContext()) OVERRIDE; - virtual bool isMouseFocusable() const OVERRIDE { return false; } - virtual void defaultEventHandler(Event*) OVERRIDE; - - ImageResource* imageForNormalState(); - ImageResource* imageForHoverState(); - - HTMLInputElement* hostInput(); - void updateImage(); - - ResourcePtr<ImageResource> m_cachedImageForNormalState; - ResourcePtr<ImageResource> m_cachedImageForHoverState; - bool m_isInHoverState; -}; - -} -#endif diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.cpp index 40aec28a852..1c838a2683a 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.cpp @@ -37,6 +37,7 @@ #include "core/page/Chrome.h" #include "core/page/Page.h" #include "core/rendering/RenderDetailsMarker.h" +#include "wtf/TemporaryChange.h" using namespace WTF::Unicode; @@ -47,21 +48,20 @@ using namespace HTMLNames; inline PickerIndicatorElement::PickerIndicatorElement(Document& document, PickerIndicatorOwner& pickerIndicatorOwner) : HTMLDivElement(document) , m_pickerIndicatorOwner(&pickerIndicatorOwner) + , m_isInOpenPopup(false) { } -PassRefPtr<PickerIndicatorElement> PickerIndicatorElement::create(Document& document, PickerIndicatorOwner& pickerIndicatorOwner) +PassRefPtrWillBeRawPtr<PickerIndicatorElement> PickerIndicatorElement::create(Document& document, PickerIndicatorOwner& pickerIndicatorOwner) { - RefPtr<PickerIndicatorElement> element = adoptRef(new PickerIndicatorElement(document, pickerIndicatorOwner)); - element->setPseudo(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<PickerIndicatorElement> element = adoptRefWillBeNoop(new PickerIndicatorElement(document, pickerIndicatorOwner)); + element->setShadowPseudoId(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral)); element->setAttribute(idAttr, ShadowElementNames::pickerIndicator()); return element.release(); } PickerIndicatorElement::~PickerIndicatorElement() { - closePopup(); - ASSERT(!m_chooser); } RenderObject* PickerIndicatorElement::createRenderer(RenderStyle*) @@ -113,6 +113,12 @@ void PickerIndicatorElement::didEndChooser() void PickerIndicatorElement::openPopup() { + // The m_isInOpenPopup flag is unnecessary in production. + // MockPagePopupDriver allows to execute JavaScript code in + // DateTimeChooserImpl constructor. It might create another DateTimeChooser. + if (m_isInOpenPopup) + return; + TemporaryChange<bool> reentrancyProtector(m_isInOpenPopup, true); if (m_chooser) return; if (!document().page()) @@ -143,6 +149,14 @@ bool PickerIndicatorElement::isPickerIndicatorElement() const return true; } +void PickerIndicatorElement::trace(Visitor* visitor) +{ + visitor->trace(m_pickerIndicatorOwner); + visitor->trace(m_chooser); + HTMLDivElement::trace(visitor); + DateTimeChooserClient::trace(visitor); +} + } #endif diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.h index 8b7a5e3d740..914fd9887d3 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/PickerIndicatorElement.h @@ -42,10 +42,11 @@ class HTMLInputElement; class PagePopup; class PickerIndicatorElement FINAL : public HTMLDivElement, public DateTimeChooserClient { + WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(PickerIndicatorElement); public: // PickerIndicatorOwner implementer must call removePickerIndicatorOwner when // it doesn't handle event, e.g. at destruction. - class PickerIndicatorOwner { + class PickerIndicatorOwner : public WillBeGarbageCollectedMixin { public: virtual ~PickerIndicatorOwner() { } virtual bool isPickerIndicatorOwnerDisabledOrReadOnly() const = 0; @@ -55,12 +56,14 @@ public: virtual bool setupDateTimeChooserParameters(DateTimeChooserParameters&) = 0; }; - static PassRefPtr<PickerIndicatorElement> create(Document&, PickerIndicatorOwner&); + static PassRefPtrWillBeRawPtr<PickerIndicatorElement> create(Document&, PickerIndicatorOwner&); virtual ~PickerIndicatorElement(); + virtual void trace(Visitor*) OVERRIDE; + void openPopup(); void closePopup(); virtual bool willRespondToMouseClickEvents() OVERRIDE; - void removePickerIndicatorOwner() { m_pickerIndicatorOwner = 0; } + void removePickerIndicatorOwner() { m_pickerIndicatorOwner = nullptr; } // DateTimeChooserClient implementation. virtual void didChooseValue(const String&) OVERRIDE; @@ -76,8 +79,9 @@ private: HTMLInputElement* hostInput(); - PickerIndicatorOwner* m_pickerIndicatorOwner; - RefPtr<DateTimeChooser> m_chooser; + RawPtrWillBeMember<PickerIndicatorOwner> m_pickerIndicatorOwner; + RefPtrWillBeMember<DateTimeChooser> m_chooser; + bool m_isInOpenPopup; }; DEFINE_TYPE_CASTS(PickerIndicatorElement, Element, element, element->isPickerIndicatorElement(), element.isPickerIndicatorElement()); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.cpp index 50c8d1dc9a4..0f8b72f069c 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.cpp @@ -32,7 +32,7 @@ #include "core/html/shadow/ProgressShadowElement.h" -#include "HTMLNames.h" +#include "core/HTMLNames.h" #include "core/html/HTMLProgressElement.h" #include "core/rendering/RenderProgress.h" @@ -56,11 +56,13 @@ bool ProgressShadowElement::rendererIsNeeded(const RenderStyle& style) return progressRenderer && !progressRenderer->style()->hasAppearance() && HTMLDivElement::rendererIsNeeded(style); } -ProgressInnerElement::ProgressInnerElement(Document& document) +inline ProgressInnerElement::ProgressInnerElement(Document& document) : ProgressShadowElement(document) { } +DEFINE_NODE_FACTORY(ProgressInnerElement) + RenderObject* ProgressInnerElement::createRenderer(RenderStyle*) { return new RenderProgress(this); @@ -75,11 +77,13 @@ bool ProgressInnerElement::rendererIsNeeded(const RenderStyle& style) return progressRenderer && !progressRenderer->style()->hasAppearance() && HTMLDivElement::rendererIsNeeded(style); } -ProgressBarElement::ProgressBarElement(Document& document) +inline ProgressBarElement::ProgressBarElement(Document& document) : ProgressShadowElement(document) { } +DEFINE_NODE_FACTORY(ProgressBarElement) + ProgressValueElement::ProgressValueElement(Document& document) : ProgressShadowElement(document) { @@ -90,4 +94,6 @@ void ProgressValueElement::setWidthPercentage(double width) setInlineStyleProperty(CSSPropertyWidth, width, CSSPrimitiveValue::CSS_PERCENTAGE); } +DEFINE_NODE_FACTORY(ProgressValueElement) + } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.h index b375fcc88d7..825b0b68437 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ProgressShadowElement.h @@ -41,56 +41,41 @@ class HTMLProgressElement; class ProgressShadowElement : public HTMLDivElement { public: - ProgressShadowElement(Document&); + explicit ProgressShadowElement(Document&); HTMLProgressElement* progressElement() const; protected: - virtual bool rendererIsNeeded(const RenderStyle&); + virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE; }; class ProgressInnerElement FINAL : public ProgressShadowElement { public: - static PassRefPtr<ProgressInnerElement> create(Document&); + DECLARE_NODE_FACTORY(ProgressInnerElement); private: - ProgressInnerElement(Document&); + explicit ProgressInnerElement(Document&); virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; - virtual bool rendererIsNeeded(const RenderStyle&); + virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE; }; -inline PassRefPtr<ProgressInnerElement> ProgressInnerElement::create(Document& document) -{ - return adoptRef(new ProgressInnerElement(document)); -} - class ProgressBarElement FINAL : public ProgressShadowElement { public: - static PassRefPtr<ProgressBarElement> create(Document&); + DECLARE_NODE_FACTORY(ProgressBarElement); private: - ProgressBarElement(Document&); + explicit ProgressBarElement(Document&); }; -inline PassRefPtr<ProgressBarElement> ProgressBarElement::create(Document& document) -{ - return adoptRef(new ProgressBarElement(document)); -} - class ProgressValueElement FINAL : public ProgressShadowElement { public: - static PassRefPtr<ProgressValueElement> create(Document&); + DECLARE_NODE_FACTORY(ProgressValueElement); void setWidthPercentage(double); private: - ProgressValueElement(Document&); + explicit ProgressValueElement(Document&); }; -inline PassRefPtr<ProgressValueElement> ProgressValueElement::create(Document& document) -{ - return adoptRef(new ProgressValueElement(document)); -} - } #endif // ProgressShadowElement_h diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.cpp index abe60e1d644..ad2f183effb 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.cpp @@ -35,6 +35,18 @@ namespace WebCore { namespace ShadowElementNames { +const AtomicString& detailsContent() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("details-content", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& detailsSummary() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("details-summary", AtomicString::ConstructFromLiteral)); + return name; +} + const AtomicString& dateTimeEdit() { DEFINE_STATIC_LOCAL(AtomicString, name, ("date-time-edit", AtomicString::ConstructFromLiteral)); @@ -65,12 +77,6 @@ const AtomicString& innerEditor() return name; } -const AtomicString& passwordGenerator() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("password-generator", AtomicString::ConstructFromLiteral)); - return name; -} - const AtomicString& pickerIndicator() { DEFINE_STATIC_LOCAL(AtomicString, name, ("picker", AtomicString::ConstructFromLiteral)); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.h b/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.h index 46788a1cdfb..61ee1ca1680 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/ShadowElementNames.h @@ -37,12 +37,13 @@ namespace WebCore { namespace ShadowElementNames { +const AtomicString& detailsContent(); +const AtomicString& detailsSummary(); const AtomicString& dateTimeEdit(); const AtomicString& spinButton(); const AtomicString& clearButton(); const AtomicString& editingViewPort(); const AtomicString& innerEditor(); -const AtomicString& passwordGenerator(); const AtomicString& pickerIndicator(); const AtomicString& placeholder(); const AtomicString& searchDecoration(); diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.cpp index dc7d5080591..3e9ab2fd281 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.cpp @@ -36,18 +36,16 @@ #include "core/events/Event.h" #include "core/events/MouseEvent.h" #include "core/dom/shadow/ShadowRoot.h" +#include "core/frame/LocalFrame.h" #include "core/html/HTMLInputElement.h" #include "core/html/forms/StepRange.h" #include "core/html/parser/HTMLParserIdioms.h" #include "core/html/shadow/ShadowElementNames.h" #include "core/page/EventHandler.h" -#include "core/frame/Frame.h" #include "core/rendering/RenderFlexibleBox.h" #include "core/rendering/RenderSlider.h" #include "core/rendering/RenderTheme.h" -using namespace std; - namespace WebCore { using namespace HTMLNames; @@ -64,9 +62,6 @@ inline static bool hasVerticalAppearance(HTMLInputElement* input) ASSERT(input->renderer()); RenderStyle* sliderStyle = input->renderer()->style(); - if (sliderStyle->appearance() == MediaVolumeSliderPart && RenderTheme::theme().usesVerticalVolumeSlider()) - return true; - return sliderStyle->appearance() == SliderVerticalPart; } @@ -131,11 +126,18 @@ void RenderSliderContainer::computeLogicalHeight(LayoutUnit logicalHeight, Layou if (zoomFactor != 1.0) trackHeight *= zoomFactor; + // FIXME: The trackHeight should have been added before updateLogicalHeight was called to avoid this hack. + updateIntrinsicContentLogicalHeight(trackHeight); + RenderBox::computeLogicalHeight(trackHeight, logicalTop, computedValues); return; } if (isVertical) logicalHeight = RenderSlider::defaultTrackLength; + + // FIXME: The trackHeight should have been added before updateLogicalHeight was called to avoid this hack. + updateIntrinsicContentLogicalHeight(logicalHeight); + RenderBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); } @@ -157,7 +159,7 @@ void RenderSliderContainer::layout() RenderBox* thumb = thumbElement ? thumbElement->renderBox() : 0; RenderBox* track = trackElement ? trackElement->renderBox() : 0; - SubtreeLayoutScope layoutScope(this); + SubtreeLayoutScope layoutScope(*this); // Force a layout to reset the position of the thumb so the code below doesn't move the thumb to the wrong place. // FIXME: Make a custom Render class for the track and move the thumb positioning code there. if (track) @@ -182,14 +184,14 @@ void RenderSliderContainer::layout() else thumbLocation.setX(thumbLocation.x() - offset); thumb->setLocation(thumbLocation); - if (checkForRepaintDuringLayout() && parent() + if (checkForPaintInvalidationDuringLayout() && parent() && (parent()->style()->appearance() == MediaVolumeSliderPart || parent()->style()->appearance() == MediaSliderPart)) { // This will sometimes repaint too much. However, it is necessary to // correctly repaint media controls (volume and timeline sliders) - // they have special painting code in RenderMediaControls.cpp:paintMediaVolumeSlider // and paintMediaSlider that gets called via -webkit-appearance and RenderTheme, // so nothing else would otherwise invalidate the slider. - repaint(); + paintInvalidationForWholeRenderer(); } } @@ -201,9 +203,9 @@ inline SliderThumbElement::SliderThumbElement(Document& document) { } -PassRefPtr<SliderThumbElement> SliderThumbElement::create(Document& document) +PassRefPtrWillBeRawPtr<SliderThumbElement> SliderThumbElement::create(Document& document) { - RefPtr<SliderThumbElement> element = adoptRef(new SliderThumbElement(document)); + RefPtrWillBeRawPtr<SliderThumbElement> element = adoptRefWillBeNoop(new SliderThumbElement(document)); element->setAttribute(idAttr, ShadowElementNames::sliderThumb()); return element.release(); } @@ -214,7 +216,7 @@ void SliderThumbElement::setPositionFromValue() // path, we don't actually update the value here. Instead, we poke at the // renderer directly to trigger layout. if (renderer()) - renderer()->setNeedsLayout(); + renderer()->setNeedsLayoutAndFullPaintInvalidation(); } RenderObject* SliderThumbElement::createRenderer(RenderStyle*) @@ -229,12 +231,12 @@ bool SliderThumbElement::isDisabledFormControl() const bool SliderThumbElement::matchesReadOnlyPseudoClass() const { - return hostInput()->matchesReadOnlyPseudoClass(); + return hostInput() && hostInput()->matchesReadOnlyPseudoClass(); } bool SliderThumbElement::matchesReadWritePseudoClass() const { - return hostInput()->matchesReadWritePseudoClass(); + return hostInput() && hostInput()->matchesReadWritePseudoClass(); } Node* SliderThumbElement::focusDelegate() @@ -244,14 +246,14 @@ Node* SliderThumbElement::focusDelegate() void SliderThumbElement::dragFrom(const LayoutPoint& point) { - RefPtr<SliderThumbElement> protector(this); + RefPtrWillBeRawPtr<SliderThumbElement> protector(this); startDragging(); setPositionFromPoint(point); } void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point) { - RefPtr<HTMLInputElement> input(hostInput()); + RefPtrWillBeRawPtr<HTMLInputElement> input(hostInput()); Element* trackElement = input->userAgentShadowRoot()->getElementById(ShadowElementNames::sliderTrack()); if (!input->renderer() || !renderBox() || !trackElement->renderBox()) @@ -281,7 +283,7 @@ void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point) position -= isLeftToRightDirection ? renderBox()->marginLeft() : renderBox()->marginRight(); currentPosition = absoluteThumbOrigin.x() - absoluteSliderContentOrigin.x(); } - position = max<LayoutUnit>(0, min(position, trackSize)); + position = std::max<LayoutUnit>(0, std::min(position, trackSize)); const Decimal ratio = Decimal::fromDouble(static_cast<double>(position) / trackSize); const Decimal fraction = isVertical || !isLeftToRightDirection ? Decimal(1) - ratio : ratio; StepRange stepRange(input->createStepRange(RejectAny)); @@ -304,13 +306,12 @@ void SliderThumbElement::setPositionFromPoint(const LayoutPoint& point) // FIXME: This is no longer being set from renderer. Consider updating the method name. input->setValueFromRenderer(valueString); if (renderer()) - renderer()->setNeedsLayout(); - input->dispatchFormControlChangeEvent(); + renderer()->setNeedsLayoutAndFullPaintInvalidation(); } void SliderThumbElement::startDragging() { - if (Frame* frame = document().frame()) { + if (LocalFrame* frame = document().frame()) { frame->eventHandler().setCapturingMouseEventsNode(this); m_inDragMode = true; } @@ -321,11 +322,13 @@ void SliderThumbElement::stopDragging() if (!m_inDragMode) return; - if (Frame* frame = document().frame()) - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) + frame->eventHandler().setCapturingMouseEventsNode(nullptr); m_inDragMode = false; if (renderer()) - renderer()->setNeedsLayout(); + renderer()->setNeedsLayoutAndFullPaintInvalidation(); + if (hostInput()) + hostInput()->dispatchFormControlChangeEvent(); } void SliderThumbElement::defaultEventHandler(Event* event) @@ -387,8 +390,8 @@ bool SliderThumbElement::willRespondToMouseClickEvents() void SliderThumbElement::detach(const AttachContext& context) { if (m_inDragMode) { - if (Frame* frame = document().frame()) - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) + frame->eventHandler().setCapturingMouseEventsNode(nullptr); } HTMLDivElement::detach(context); } @@ -412,10 +415,10 @@ static const AtomicString& mediaSliderThumbShadowPartId() return mediaSliderThumb; } -const AtomicString& SliderThumbElement::pseudo() const +const AtomicString& SliderThumbElement::shadowPseudoId() const { HTMLInputElement* input = hostInput(); - if (!input) + if (!input || !input->renderer()) return sliderThumbShadowPartId(); RenderStyle* sliderStyle = input->renderer()->style(); @@ -439,25 +442,22 @@ inline SliderContainerElement::SliderContainerElement(Document& document) { } -PassRefPtr<SliderContainerElement> SliderContainerElement::create(Document& document) -{ - return adoptRef(new SliderContainerElement(document)); -} +DEFINE_NODE_FACTORY(SliderContainerElement) RenderObject* SliderContainerElement::createRenderer(RenderStyle*) { return new RenderSliderContainer(this); } -const AtomicString& SliderContainerElement::pseudo() const +const AtomicString& SliderContainerElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(const AtomicString, mediaSliderContainer, ("-webkit-media-slider-container", AtomicString::ConstructFromLiteral)); DEFINE_STATIC_LOCAL(const AtomicString, sliderContainer, ("-webkit-slider-container", AtomicString::ConstructFromLiteral)); - if (!shadowHost()->hasTagName(inputTag)) + if (!shadowHost() || !shadowHost()->renderer()) return sliderContainer; - RenderStyle* sliderStyle = toHTMLInputElement(shadowHost())->renderer()->style(); + RenderStyle* sliderStyle = shadowHost()->renderer()->style(); switch (sliderStyle->appearance()) { case MediaSliderPart: case MediaSliderThumbPart: diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.h index a7af7771fbd..efb41d65fa0 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/SliderThumbElement.h @@ -32,7 +32,7 @@ #ifndef SliderThumbElement_h #define SliderThumbElement_h -#include "HTMLNames.h" +#include "core/HTMLNames.h" #include "core/html/HTMLDivElement.h" #include "core/rendering/RenderBlockFlow.h" #include "wtf/Forward.h" @@ -46,43 +46,40 @@ class FloatPoint; class SliderThumbElement FINAL : public HTMLDivElement { public: - static PassRefPtr<SliderThumbElement> create(Document&); + static PassRefPtrWillBeRawPtr<SliderThumbElement> create(Document&); void setPositionFromValue(); void dragFrom(const LayoutPoint&); - virtual void defaultEventHandler(Event*); + virtual void defaultEventHandler(Event*) OVERRIDE; virtual bool willRespondToMouseMoveEvents() OVERRIDE; virtual bool willRespondToMouseClickEvents() OVERRIDE; virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; - virtual const AtomicString& pseudo() const OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; HTMLInputElement* hostInput() const; void setPositionFromPoint(const LayoutPoint&); void stopDragging(); private: SliderThumbElement(Document&); - virtual RenderObject* createRenderer(RenderStyle*); - virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren(); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; + virtual PassRefPtrWillBeRawPtr<Element> cloneElementWithoutAttributesAndChildren() OVERRIDE; virtual bool isDisabledFormControl() const OVERRIDE; virtual bool matchesReadOnlyPseudoClass() const OVERRIDE; virtual bool matchesReadWritePseudoClass() const OVERRIDE; - virtual Node* focusDelegate(); + virtual Node* focusDelegate() OVERRIDE; void startDragging(); bool m_inDragMode; }; -inline PassRefPtr<Element> SliderThumbElement::cloneElementWithoutAttributesAndChildren() +inline PassRefPtrWillBeRawPtr<Element> SliderThumbElement::cloneElementWithoutAttributesAndChildren() { return create(document()); } -inline SliderThumbElement* toSliderThumbElement(Node* node) -{ - ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isHTMLElement()); - return static_cast<SliderThumbElement*>(node); -} +// FIXME: There are no ways to check if a node is a SliderThumbElement. +DEFINE_ELEMENT_TYPE_CASTS(SliderThumbElement, isHTMLElement()); // -------------------------------- @@ -92,20 +89,19 @@ public: void updateAppearance(RenderStyle* parentStyle); private: - virtual bool isSliderThumb() const; - virtual bool supportsPartialLayout() const OVERRIDE { return false; } + virtual bool isSliderThumb() const OVERRIDE; }; // -------------------------------- class SliderContainerElement FINAL : public HTMLDivElement { public: - static PassRefPtr<SliderContainerElement> create(Document&); + DECLARE_NODE_FACTORY(SliderContainerElement); private: - SliderContainerElement(Document&); - virtual RenderObject* createRenderer(RenderStyle*); - virtual const AtomicString& pseudo() const; + explicit SliderContainerElement(Document&); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; + virtual const AtomicString& shadowPseudoId() const OVERRIDE; }; } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.cpp index 38303b5aca5..0671ee1beef 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.cpp @@ -27,14 +27,13 @@ #include "config.h" #include "core/html/shadow/SpinButtonElement.h" -#include "HTMLNames.h" +#include "core/HTMLNames.h" #include "core/events/MouseEvent.h" -#include "core/events/ThreadLocalEventNames.h" #include "core/events/WheelEvent.h" +#include "core/frame/LocalFrame.h" #include "core/html/shadow/ShadowElementNames.h" #include "core/page/Chrome.h" #include "core/page/EventHandler.h" -#include "core/frame/Frame.h" #include "core/page/Page.h" #include "core/rendering/RenderBox.h" #include "platform/scroll/ScrollbarTheme.h" @@ -53,17 +52,17 @@ inline SpinButtonElement::SpinButtonElement(Document& document, SpinButtonOwner& { } -PassRefPtr<SpinButtonElement> SpinButtonElement::create(Document& document, SpinButtonOwner& spinButtonOwner) +PassRefPtrWillBeRawPtr<SpinButtonElement> SpinButtonElement::create(Document& document, SpinButtonOwner& spinButtonOwner) { - RefPtr<SpinButtonElement> element = adoptRef(new SpinButtonElement(document, spinButtonOwner)); - element->setPseudo(AtomicString("-webkit-inner-spin-button", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<SpinButtonElement> element = adoptRefWillBeNoop(new SpinButtonElement(document, spinButtonOwner)); + element->setShadowPseudoId(AtomicString("-webkit-inner-spin-button", AtomicString::ConstructFromLiteral)); element->setAttribute(idAttr, ShadowElementNames::spinButton()); return element.release(); } void SpinButtonElement::detach(const AttachContext& context) { - releaseCapture(); + releaseCapture(EventDispatchDisallowed); HTMLDivElement::detach(context); } @@ -95,7 +94,7 @@ void SpinButtonElement::defaultEventHandler(Event* event) // The following functions of HTMLInputElement may run JavaScript // code which detaches this shadow node. We need to take a reference // and check renderer() after such function calls. - RefPtr<Node> protector(this); + RefPtrWillBeRawPtr<Node> protector(this); if (m_spinButtonOwner) m_spinButtonOwner->focusAndSelectSpinButtonOwner(); if (renderer()) { @@ -111,12 +110,12 @@ void SpinButtonElement::defaultEventHandler(Event* event) } event->setDefaultHandled(); } - } else if (mouseEvent->type() == EventTypeNames::mouseup && mouseEvent->button() == LeftButton) - stopRepeatingTimer(); - else if (event->type() == EventTypeNames::mousemove) { + } else if (mouseEvent->type() == EventTypeNames::mouseup && mouseEvent->button() == LeftButton) { + releaseCapture(); + } else if (event->type() == EventTypeNames::mousemove) { if (box->pixelSnappedBorderBoxRect().contains(local)) { if (!m_capturing) { - if (Frame* frame = document().frame()) { + if (LocalFrame* frame = document().frame()) { frame->eventHandler().setCapturingMouseEventsNode(this); m_capturing = true; if (Page* page = document().page()) @@ -126,7 +125,7 @@ void SpinButtonElement::defaultEventHandler(Event* event) UpDownState oldUpDownState = m_upDownState; m_upDownState = (local.y() < box->height() / 2) ? Up : Down; if (m_upDownState != oldUpDownState) - renderer()->repaint(); + renderer()->paintInvalidationForWholeRenderer(); } else { releaseCapture(); m_upDownState = Indeterminate; @@ -188,17 +187,20 @@ void SpinButtonElement::doStepAction(int amount) m_spinButtonOwner->spinButtonStepDown(); } -void SpinButtonElement::releaseCapture() +void SpinButtonElement::releaseCapture(EventDispatch eventDispatch) { stopRepeatingTimer(); if (m_capturing) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) { + frame->eventHandler().setCapturingMouseEventsNode(nullptr); m_capturing = false; if (Page* page = document().page()) page->chrome().unregisterPopupOpeningObserver(this); } } + if (m_spinButtonOwner) + m_spinButtonOwner->spinButtonDidReleaseMouseCapture(eventDispatch); + } bool SpinButtonElement::matchesReadOnlyPseudoClass() const @@ -215,7 +217,7 @@ void SpinButtonElement::startRepeatingTimer() { m_pressStartingState = m_upDownState; ScrollbarTheme* theme = ScrollbarTheme::theme(); - m_repeatingTimer.start(theme->initialAutoscrollTimerDelay(), theme->autoscrollTimerDelay()); + m_repeatingTimer.start(theme->initialAutoscrollTimerDelay(), theme->autoscrollTimerDelay(), FROM_HERE); } void SpinButtonElement::stopRepeatingTimer() @@ -255,4 +257,10 @@ bool SpinButtonElement::shouldRespondToMouseEvents() return !m_spinButtonOwner || m_spinButtonOwner->shouldSpinButtonRespondToMouseEvents(); } +void SpinButtonElement::trace(Visitor* visitor) +{ + visitor->trace(m_spinButtonOwner); + HTMLDivElement::trace(visitor); +} + } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h index 41de8fcdaee..25c0b30d8b3 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h @@ -40,13 +40,17 @@ public: Down, Up, }; - - class SpinButtonOwner { + enum EventDispatch { + EventDispatchAllowed, + EventDispatchDisallowed, + }; + class SpinButtonOwner : public WillBeGarbageCollectedMixin { public: virtual ~SpinButtonOwner() { } virtual void focusAndSelectSpinButtonOwner() = 0; virtual bool shouldSpinButtonRespondToMouseEvents() = 0; virtual bool shouldSpinButtonRespondToWheelEvents() = 0; + virtual void spinButtonDidReleaseMouseCapture(EventDispatch) = 0; virtual void spinButtonStepDown() = 0; virtual void spinButtonStepUp() = 0; }; @@ -54,10 +58,10 @@ public: // The owner of SpinButtonElement must call removeSpinButtonOwner // because SpinButtonElement can be outlive SpinButtonOwner // implementation, e.g. during event handling. - static PassRefPtr<SpinButtonElement> create(Document&, SpinButtonOwner&); + static PassRefPtrWillBeRawPtr<SpinButtonElement> create(Document&, SpinButtonOwner&); UpDownState upDownState() const { return m_upDownState; } - virtual void releaseCapture(); - void removeSpinButtonOwner() { m_spinButtonOwner = 0; } + void releaseCapture(EventDispatch = EventDispatchAllowed); + void removeSpinButtonOwner() { m_spinButtonOwner = nullptr; } void step(int amount); @@ -66,25 +70,27 @@ public: void forwardEvent(Event*); + virtual void trace(Visitor*) OVERRIDE; + private: SpinButtonElement(Document&, SpinButtonOwner&); - virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; - virtual bool isSpinButtonElement() const { return true; } + virtual void detach(const AttachContext&) OVERRIDE; + virtual bool isSpinButtonElement() const OVERRIDE { return true; } virtual bool isDisabledFormControl() const OVERRIDE { return shadowHost() && shadowHost()->isDisabledFormControl(); } virtual bool matchesReadOnlyPseudoClass() const OVERRIDE; virtual bool matchesReadWritePseudoClass() const OVERRIDE; - virtual void defaultEventHandler(Event*); + virtual void defaultEventHandler(Event*) OVERRIDE; virtual void willOpenPopup() OVERRIDE; void doStepAction(int); void startRepeatingTimer(); void stopRepeatingTimer(); void repeatingTimerFired(Timer<SpinButtonElement>*); - virtual void setHovered(bool = true); + virtual void setHovered(bool = true) OVERRIDE; bool shouldRespondToMouseEvents(); - virtual bool isMouseFocusable() const { return false; } + virtual bool isMouseFocusable() const OVERRIDE { return false; } - SpinButtonOwner* m_spinButtonOwner; + RawPtrWillBeMember<SpinButtonOwner> m_spinButtonOwner; bool m_capturing; UpDownState m_upDownState; UpDownState m_pressStartingState; diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.cpp index a19fef2c9e9..57c9fc665a6 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.cpp +++ b/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.cpp @@ -27,21 +27,18 @@ #include "config.h" #include "core/html/shadow/TextControlInnerElements.h" -#include "HTMLNames.h" +#include "core/HTMLNames.h" #include "core/dom/Document.h" #include "core/dom/NodeRenderStyle.h" #include "core/events/MouseEvent.h" #include "core/events/TextEvent.h" #include "core/events/TextEventInputType.h" -#include "core/events/ThreadLocalEventNames.h" +#include "core/frame/LocalFrame.h" #include "core/html/HTMLInputElement.h" #include "core/html/shadow/ShadowElementNames.h" #include "core/page/EventHandler.h" -#include "core/frame/Frame.h" #include "core/rendering/RenderTextControlSingleLine.h" #include "core/rendering/RenderView.h" -#include "core/speech/SpeechInput.h" -#include "core/speech/SpeechInputEvent.h" #include "platform/UserGestureIndicator.h" namespace WebCore { @@ -53,9 +50,9 @@ TextControlInnerContainer::TextControlInnerContainer(Document& document) { } -PassRefPtr<TextControlInnerContainer> TextControlInnerContainer::create(Document& document) +PassRefPtrWillBeRawPtr<TextControlInnerContainer> TextControlInnerContainer::create(Document& document) { - RefPtr<TextControlInnerContainer> element = adoptRef(new TextControlInnerContainer(document)); + RefPtrWillBeRawPtr<TextControlInnerContainer> element = adoptRefWillBeNoop(new TextControlInnerContainer(document)); element->setAttribute(idAttr, ShadowElementNames::textFieldContainer()); return element.release(); } @@ -73,9 +70,9 @@ EditingViewPortElement::EditingViewPortElement(Document& document) setHasCustomStyleCallbacks(); } -PassRefPtr<EditingViewPortElement> EditingViewPortElement::create(Document& document) +PassRefPtrWillBeRawPtr<EditingViewPortElement> EditingViewPortElement::create(Document& document) { - RefPtr<EditingViewPortElement> element = adoptRef(new EditingViewPortElement(document)); + RefPtrWillBeRawPtr<EditingViewPortElement> element = adoptRefWillBeNoop(new EditingViewPortElement(document)); element->setAttribute(idAttr, ShadowElementNames::editingViewPort()); return element.release(); } @@ -88,9 +85,6 @@ PassRefPtr<RenderStyle> EditingViewPortElement::customStyleForRenderer() style->inheritFrom(shadowHost()->renderStyle()); style->setFlexGrow(1); - // min-width: 0; is needed for correct shrinking. - // FIXME: Remove this line when https://bugs.webkit.org/show_bug.cgi?id=111790 is fixed. - style->setMinWidth(Length(0, Fixed)); style->setDisplay(BLOCK); style->setDirection(LTR); @@ -104,20 +98,20 @@ PassRefPtr<RenderStyle> EditingViewPortElement::customStyleForRenderer() // --------------------------- -inline TextControlInnerTextElement::TextControlInnerTextElement(Document& document) +inline TextControlInnerEditorElement::TextControlInnerEditorElement(Document& document) : HTMLDivElement(document) { setHasCustomStyleCallbacks(); } -PassRefPtr<TextControlInnerTextElement> TextControlInnerTextElement::create(Document& document) +PassRefPtrWillBeRawPtr<TextControlInnerEditorElement> TextControlInnerEditorElement::create(Document& document) { - RefPtr<TextControlInnerTextElement> element = adoptRef(new TextControlInnerTextElement(document)); + RefPtrWillBeRawPtr<TextControlInnerEditorElement> element = adoptRefWillBeNoop(new TextControlInnerEditorElement(document)); element->setAttribute(idAttr, ShadowElementNames::innerEditor()); return element.release(); } -void TextControlInnerTextElement::defaultEventHandler(Event* event) +void TextControlInnerEditorElement::defaultEventHandler(Event* event) { // FIXME: In the future, we should add a way to have default event listeners. // Then we would add one to the text field's inner div, and we wouldn't need this subclass. @@ -136,18 +130,18 @@ void TextControlInnerTextElement::defaultEventHandler(Event* event) HTMLDivElement::defaultEventHandler(event); } -RenderObject* TextControlInnerTextElement::createRenderer(RenderStyle*) +RenderObject* TextControlInnerEditorElement::createRenderer(RenderStyle*) { return new RenderTextControlInnerBlock(this); } -PassRefPtr<RenderStyle> TextControlInnerTextElement::customStyleForRenderer() +PassRefPtr<RenderStyle> TextControlInnerEditorElement::customStyleForRenderer() { RenderObject* parentRenderer = shadowHost()->renderer(); if (!parentRenderer || !parentRenderer->isTextControl()) return originalStyleForRenderer(); RenderTextControl* textControlRenderer = toRenderTextControl(parentRenderer); - return textControlRenderer->createInnerTextStyle(textControlRenderer->style()); + return textControlRenderer->createInnerEditorStyle(textControlRenderer->style()); } // ---------------------------- @@ -157,21 +151,21 @@ inline SearchFieldDecorationElement::SearchFieldDecorationElement(Document& docu { } -PassRefPtr<SearchFieldDecorationElement> SearchFieldDecorationElement::create(Document& document) +PassRefPtrWillBeRawPtr<SearchFieldDecorationElement> SearchFieldDecorationElement::create(Document& document) { - RefPtr<SearchFieldDecorationElement> element = adoptRef(new SearchFieldDecorationElement(document)); + RefPtrWillBeRawPtr<SearchFieldDecorationElement> element = adoptRefWillBeNoop(new SearchFieldDecorationElement(document)); element->setAttribute(idAttr, ShadowElementNames::searchDecoration()); return element.release(); } -const AtomicString& SearchFieldDecorationElement::pseudo() const +const AtomicString& SearchFieldDecorationElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, resultsDecorationId, ("-webkit-search-results-decoration", AtomicString::ConstructFromLiteral)); DEFINE_STATIC_LOCAL(AtomicString, decorationId, ("-webkit-search-decoration", AtomicString::ConstructFromLiteral)); Element* host = shadowHost(); if (!host) return resultsDecorationId; - if (host->hasTagName(inputTag)) { + if (isHTMLInputElement(*host)) { if (toHTMLInputElement(host)->maxResults() < 0) return decorationId; return resultsDecorationId; @@ -206,10 +200,10 @@ inline SearchFieldCancelButtonElement::SearchFieldCancelButtonElement(Document& { } -PassRefPtr<SearchFieldCancelButtonElement> SearchFieldCancelButtonElement::create(Document& document) +PassRefPtrWillBeRawPtr<SearchFieldCancelButtonElement> SearchFieldCancelButtonElement::create(Document& document) { - RefPtr<SearchFieldCancelButtonElement> element = adoptRef(new SearchFieldCancelButtonElement(document)); - element->setPseudo(AtomicString("-webkit-search-cancel-button", AtomicString::ConstructFromLiteral)); + RefPtrWillBeRawPtr<SearchFieldCancelButtonElement> element = adoptRefWillBeNoop(new SearchFieldCancelButtonElement(document)); + element->setShadowPseudoId(AtomicString("-webkit-search-cancel-button", AtomicString::ConstructFromLiteral)); element->setAttribute(idAttr, ShadowElementNames::clearButton()); return element.release(); } @@ -217,8 +211,8 @@ PassRefPtr<SearchFieldCancelButtonElement> SearchFieldCancelButtonElement::creat void SearchFieldCancelButtonElement::detach(const AttachContext& context) { if (m_capturing) { - if (Frame* frame = document().frame()) - frame->eventHandler().setCapturingMouseEventsNode(0); + if (LocalFrame* frame = document().frame()) + frame->eventHandler().setCapturingMouseEventsNode(nullptr); } HTMLDivElement::detach(context); } @@ -227,136 +221,17 @@ void SearchFieldCancelButtonElement::detach(const AttachContext& context) void SearchFieldCancelButtonElement::defaultEventHandler(Event* event) { // If the element is visible, on mouseup, clear the value, and set selection - RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); + RefPtrWillBeRawPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); if (!input || input->isDisabledOrReadOnly()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } - if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { - if (renderer() && renderer()->visibleToHitTesting()) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(this); - m_capturing = true; - } - } - input->focus(); - input->select(); - event->setDefaultHandled(); - } - if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { - if (m_capturing) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(0); - m_capturing = false; - } - if (hovered()) { - String oldValue = input->value(); - input->setValueForUser(""); - input->onSearch(); - event->setDefaultHandled(); - } - } - } - - if (!event->defaultHandled()) - HTMLDivElement::defaultEventHandler(event); -} - -bool SearchFieldCancelButtonElement::willRespondToMouseClickEvents() -{ - const HTMLInputElement* input = toHTMLInputElement(shadowHost()); - if (input && !input->isDisabledOrReadOnly()) - return true; - - return HTMLDivElement::willRespondToMouseClickEvents(); -} - -// ---------------------------- - -#if ENABLE(INPUT_SPEECH) - -inline InputFieldSpeechButtonElement::InputFieldSpeechButtonElement(Document& document) - : HTMLDivElement(document) - , m_capturing(false) - , m_state(Idle) - , m_listenerId(0) -{ -} - -InputFieldSpeechButtonElement::~InputFieldSpeechButtonElement() -{ - SpeechInput* speech = speechInput(); - if (speech && m_listenerId) { // Could be null when page is unloading. - if (m_state != Idle) - speech->cancelRecognition(m_listenerId); - speech->unregisterListener(m_listenerId); - } -} - -PassRefPtr<InputFieldSpeechButtonElement> InputFieldSpeechButtonElement::create(Document& document) -{ - RefPtr<InputFieldSpeechButtonElement> element = adoptRef(new InputFieldSpeechButtonElement(document)); - element->setPseudo(AtomicString("-webkit-input-speech-button", AtomicString::ConstructFromLiteral)); - element->setAttribute(idAttr, ShadowElementNames::speechButton()); - return element.release(); -} - -void InputFieldSpeechButtonElement::defaultEventHandler(Event* event) -{ - // For privacy reasons, only allow clicks directly coming from the user. - if (!UserGestureIndicator::processingUserGesture()) { - HTMLDivElement::defaultEventHandler(event); - return; - } - - // The call to focus() below dispatches a focus event, and an event handler in the page might - // remove the input element from DOM. To make sure it remains valid until we finish our work - // here, we take a temporary reference. - RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); - - if (!input || input->isDisabledOrReadOnly()) { - if (!event->defaultHandled()) - HTMLDivElement::defaultEventHandler(event); - return; - } - // On mouse down, select the text and set focus. - if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { - if (renderer() && renderer()->visibleToHitTesting()) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(this); - m_capturing = true; - } - } - RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); - input->focus(); - input->select(); - event->setDefaultHandled(); - } - // On mouse up, release capture cleanly. - if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { - if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { - if (Frame* frame = document().frame()) { - frame->eventHandler().setCapturingMouseEventsNode(0); - m_capturing = false; - } - } - } - - if (event->type() == EventTypeNames::click && m_listenerId) { - switch (m_state) { - case Idle: - startSpeechInput(); - break; - case Recording: - stopSpeechInput(); - break; - case Recognizing: - // Nothing to do here, we will continue to wait for results. - break; - } + if (event->type() == EventTypeNames::click && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton) { + input->setValueForUser(""); + input->onSearch(); event->setDefaultHandled(); } @@ -364,7 +239,7 @@ void InputFieldSpeechButtonElement::defaultEventHandler(Event* event) HTMLDivElement::defaultEventHandler(event); } -bool InputFieldSpeechButtonElement::willRespondToMouseClickEvents() +bool SearchFieldCancelButtonElement::willRespondToMouseClickEvents() { const HTMLInputElement* input = toHTMLInputElement(shadowHost()); if (input && !input->isDisabledOrReadOnly()) @@ -373,102 +248,4 @@ bool InputFieldSpeechButtonElement::willRespondToMouseClickEvents() return HTMLDivElement::willRespondToMouseClickEvents(); } -void InputFieldSpeechButtonElement::setState(SpeechInputState state) -{ - if (m_state != state) { - m_state = state; - shadowHost()->renderer()->repaint(); - } -} - -SpeechInput* InputFieldSpeechButtonElement::speechInput() -{ - return SpeechInput::from(document().page()); -} - -void InputFieldSpeechButtonElement::didCompleteRecording(int) -{ - setState(Recognizing); -} - -void InputFieldSpeechButtonElement::didCompleteRecognition(int) -{ - setState(Idle); -} - -void InputFieldSpeechButtonElement::setRecognitionResult(int, const SpeechInputResultArray& results) -{ - m_results = results; - - // The call to setValue() below dispatches an event, and an event handler in the page might - // remove the input element from DOM. To make sure it remains valid until we finish our work - // here, we take a temporary reference. - RefPtr<HTMLInputElement> input(toHTMLInputElement(shadowHost())); - if (!input || input->isDisabledOrReadOnly()) - return; - - RefPtr<InputFieldSpeechButtonElement> holdRefButton(this); - if (document().domWindow()) { - // Call selectionChanged, causing the element to cache the selection, - // so that the text event inserts the text in this element even if - // focus has moved away from it. - input->selectionChanged(false); - input->dispatchEvent(TextEvent::create(document().domWindow(), results.isEmpty() ? "" : results[0]->utterance(), TextEventInputOther)); - } - - // This event is sent after the text event so the website can perform actions using the input field content immediately. - // It provides alternative recognition hypotheses and notifies that the results come from speech input. - input->dispatchEvent(SpeechInputEvent::create(EventTypeNames::webkitspeechchange, results)); - - // Check before accessing the renderer as the above event could have potentially turned off - // speech in the input element, hence removing this button and renderer from the hierarchy. - if (renderer()) - renderer()->repaint(); -} - -void InputFieldSpeechButtonElement::attach(const AttachContext& context) -{ - ASSERT(!m_listenerId); - if (SpeechInput* input = SpeechInput::from(document().page())) - m_listenerId = input->registerListener(this); - HTMLDivElement::attach(context); -} - -void InputFieldSpeechButtonElement::detach(const AttachContext& context) -{ - if (m_capturing) { - if (Frame* frame = document().frame()) - frame->eventHandler().setCapturingMouseEventsNode(0); - } - - if (m_listenerId) { - if (m_state != Idle) - speechInput()->cancelRecognition(m_listenerId); - speechInput()->unregisterListener(m_listenerId); - m_listenerId = 0; - } - - HTMLDivElement::detach(context); -} - -void InputFieldSpeechButtonElement::startSpeechInput() -{ - if (m_state != Idle) - return; - - RefPtr<HTMLInputElement> input = toHTMLInputElement(shadowHost()); - AtomicString language = input->computeInheritedLanguage(); - String grammar = input->getAttribute(webkitgrammarAttr); - IntRect rect = document().view()->contentsToRootView(pixelSnappedBoundingBox()); - if (speechInput()->startRecognition(m_listenerId, rect, language, grammar, document().securityOrigin())) - setState(Recording); -} - -void InputFieldSpeechButtonElement::stopSpeechInput() -{ - if (m_state == Recording) - speechInput()->stopRecording(m_listenerId); -} -#endif // ENABLE(INPUT_SPEECH) - } diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.h b/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.h index 6b6fb0ff6f4..65c994d7d2e 100644 --- a/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.h +++ b/chromium/third_party/WebKit/Source/core/html/shadow/TextControlInnerElements.h @@ -28,119 +28,72 @@ #define TextControlInnerElements_h #include "core/html/HTMLDivElement.h" -#include "core/speech/SpeechInputListener.h" #include "wtf/Forward.h" namespace WebCore { -class SpeechInput; - class TextControlInnerContainer FINAL : public HTMLDivElement { public: - static PassRefPtr<TextControlInnerContainer> create(Document&); + static PassRefPtrWillBeRawPtr<TextControlInnerContainer> create(Document&); + protected: - TextControlInnerContainer(Document&); - virtual RenderObject* createRenderer(RenderStyle*); + explicit TextControlInnerContainer(Document&); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; }; class EditingViewPortElement FINAL : public HTMLDivElement { public: - static PassRefPtr<EditingViewPortElement> create(Document&); + static PassRefPtrWillBeRawPtr<EditingViewPortElement> create(Document&); protected: - EditingViewPortElement(Document&); + explicit EditingViewPortElement(Document&); virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE; private: virtual bool supportsFocus() const OVERRIDE { return false; } }; -class TextControlInnerTextElement FINAL : public HTMLDivElement { +class TextControlInnerEditorElement FINAL : public HTMLDivElement { public: - static PassRefPtr<TextControlInnerTextElement> create(Document&); + static PassRefPtrWillBeRawPtr<TextControlInnerEditorElement> create(Document&); - virtual void defaultEventHandler(Event*); + virtual void defaultEventHandler(Event*) OVERRIDE; private: - TextControlInnerTextElement(Document&); - virtual RenderObject* createRenderer(RenderStyle*); + explicit TextControlInnerEditorElement(Document&); + virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE; virtual bool supportsFocus() const OVERRIDE { return false; } }; class SearchFieldDecorationElement FINAL : public HTMLDivElement { public: - static PassRefPtr<SearchFieldDecorationElement> create(Document&); + static PassRefPtrWillBeRawPtr<SearchFieldDecorationElement> create(Document&); - virtual void defaultEventHandler(Event*); + virtual void defaultEventHandler(Event*) OVERRIDE; virtual bool willRespondToMouseClickEvents() OVERRIDE; private: - SearchFieldDecorationElement(Document&); - virtual const AtomicString& pseudo() const OVERRIDE; + explicit SearchFieldDecorationElement(Document&); + virtual const AtomicString& shadowPseudoId() const OVERRIDE; virtual bool supportsFocus() const OVERRIDE { return false; } }; class SearchFieldCancelButtonElement FINAL : public HTMLDivElement { public: - static PassRefPtr<SearchFieldCancelButtonElement> create(Document&); + static PassRefPtrWillBeRawPtr<SearchFieldCancelButtonElement> create(Document&); - virtual void defaultEventHandler(Event*); + virtual void defaultEventHandler(Event*) OVERRIDE; virtual bool willRespondToMouseClickEvents() OVERRIDE; private: - SearchFieldCancelButtonElement(Document&); + explicit SearchFieldCancelButtonElement(Document&); virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; virtual bool supportsFocus() const OVERRIDE { return false; } bool m_capturing; }; -#if ENABLE(INPUT_SPEECH) - -class InputFieldSpeechButtonElement FINAL - : public HTMLDivElement, - public SpeechInputListener { -public: - enum SpeechInputState { - Idle, - Recording, - Recognizing, - }; - - static PassRefPtr<InputFieldSpeechButtonElement> create(Document&); - virtual ~InputFieldSpeechButtonElement(); - - virtual void detach(const AttachContext& = AttachContext()) OVERRIDE; - virtual void defaultEventHandler(Event*); - virtual bool willRespondToMouseClickEvents(); - virtual bool isInputFieldSpeechButtonElement() const { return true; } - SpeechInputState state() const { return m_state; } - void startSpeechInput(); - void stopSpeechInput(); - - // SpeechInputListener methods. - void didCompleteRecording(int); - void didCompleteRecognition(int); - void setRecognitionResult(int, const SpeechInputResultArray&); - -private: - InputFieldSpeechButtonElement(Document&); - SpeechInput* speechInput(); - void setState(SpeechInputState state); - virtual bool isMouseFocusable() const { return false; } - virtual void attach(const AttachContext& = AttachContext()) OVERRIDE; - - bool m_capturing; - SpeechInputState m_state; - int m_listenerId; - SpeechInputResultArray m_results; -}; - -DEFINE_TYPE_CASTS(InputFieldSpeechButtonElement, Element, element, element->isInputFieldSpeechButtonElement(), element.isInputFieldSpeechButtonElement()); - -#endif // ENABLE(INPUT_SPEECH) - } // namespace #endif |