summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/rendering/RenderSlider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderSlider.cpp')
-rw-r--r--Source/WebCore/rendering/RenderSlider.cpp113
1 files changed, 38 insertions, 75 deletions
diff --git a/Source/WebCore/rendering/RenderSlider.cpp b/Source/WebCore/rendering/RenderSlider.cpp
index b73a1ac..b0dc0d9 100644
--- a/Source/WebCore/rendering/RenderSlider.cpp
+++ b/Source/WebCore/rendering/RenderSlider.cpp
@@ -22,6 +22,7 @@
#include "RenderSlider.h"
#include "CSSPropertyNames.h"
+#include "CSSStyleSelector.h"
#include "Document.h"
#include "Event.h"
#include "EventHandler.h"
@@ -60,8 +61,6 @@ RenderSlider::RenderSlider(HTMLInputElement* element)
RenderSlider::~RenderSlider()
{
- if (m_thumb)
- m_thumb->detach();
}
int RenderSlider::baselinePosition(FontBaseline, bool /*firstLine*/, LineDirectionMode, LinePositionMode) const
@@ -100,50 +99,14 @@ void RenderSlider::computePreferredLogicalWidths()
setPreferredLogicalWidthsDirty(false);
}
-void RenderSlider::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
-{
- RenderBlock::styleDidChange(diff, oldStyle);
-
- if (m_thumb)
- m_thumb->renderer()->setStyle(createThumbStyle(style()));
-
- setReplaced(isInline());
-}
-
-PassRefPtr<RenderStyle> RenderSlider::createThumbStyle(const RenderStyle* parentStyle)
-{
- RefPtr<RenderStyle> style;
- RenderStyle* pseudoStyle = getCachedPseudoStyle(SLIDER_THUMB);
- if (pseudoStyle)
- // We may be sharing style with another slider, but we must not share the thumb style.
- style = RenderStyle::clone(pseudoStyle);
- else
- style = RenderStyle::create();
-
- if (parentStyle)
- style->inheritFrom(parentStyle);
-
- style->setDisplay(BLOCK);
-
- if (parentStyle->appearance() == SliderVerticalPart)
- style->setAppearance(SliderThumbVerticalPart);
- else if (parentStyle->appearance() == SliderHorizontalPart)
- style->setAppearance(SliderThumbHorizontalPart);
- else if (parentStyle->appearance() == MediaSliderPart)
- style->setAppearance(MediaSliderThumbPart);
- else if (parentStyle->appearance() == MediaVolumeSliderPart)
- style->setAppearance(MediaVolumeSliderThumbPart);
-
- return style.release();
-}
-
IntRect RenderSlider::thumbRect()
{
- if (!m_thumb)
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ if (!thumbElement)
return IntRect();
IntRect thumbRect;
- RenderBox* thumb = toRenderBox(m_thumb->renderer());
+ RenderBox* thumb = toRenderBox(thumbElement->renderer());
thumbRect.setWidth(thumb->style()->width().calcMinValue(contentWidth()));
thumbRect.setHeight(thumb->style()->height().calcMinValue(contentHeight()));
@@ -165,7 +128,8 @@ void RenderSlider::layout()
{
ASSERT(needsLayout());
- RenderBox* thumb = m_thumb ? toRenderBox(m_thumb->renderer()) : 0;
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ RenderBox* thumb = thumbElement ? toRenderBox(thumbElement->renderer()) : 0;
IntSize baseSize(borderAndPaddingWidth(), borderAndPaddingHeight());
@@ -212,43 +176,35 @@ void RenderSlider::layout()
setNeedsLayout(false);
}
-void RenderSlider::updateFromElement()
+SliderThumbElement* RenderSlider::sliderThumbElement() const
{
- // Layout will take care of the thumb's size and position.
- if (!m_thumb) {
- m_thumb = SliderThumbElement::create(static_cast<HTMLElement*>(node()));
- RefPtr<RenderStyle> thumbStyle = createThumbStyle(style());
- m_thumb->setRenderer(m_thumb->createRenderer(renderArena(), thumbStyle.get()));
- m_thumb->renderer()->setStyle(thumbStyle.release());
- m_thumb->setAttached();
- m_thumb->setInDocument();
- addChild(m_thumb->renderer());
- }
- setNeedsLayout(true);
+ return toSliderThumbElement(static_cast<Element*>(node())->shadowRoot());
}
bool RenderSlider::mouseEventIsInThumb(MouseEvent* evt)
{
- if (!m_thumb || !m_thumb->renderer())
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ if (!thumbElement || !thumbElement->renderer())
return false;
#if ENABLE(VIDEO)
if (style()->appearance() == MediaSliderPart || style()->appearance() == MediaVolumeSliderPart) {
- MediaControlInputElement *sliderThumb = static_cast<MediaControlInputElement*>(m_thumb->renderer()->node());
+ MediaControlInputElement* sliderThumb = static_cast<MediaControlInputElement*>(thumbElement->renderer()->node());
return sliderThumb->hitTest(evt->absoluteLocation());
}
#endif
- FloatPoint localPoint = m_thumb->renderBox()->absoluteToLocal(evt->absoluteLocation(), false, true);
- IntRect thumbBounds = m_thumb->renderBox()->borderBoxRect();
+ FloatPoint localPoint = thumbElement->renderBox()->absoluteToLocal(evt->absoluteLocation(), false, true);
+ IntRect thumbBounds = thumbElement->renderBox()->borderBoxRect();
return thumbBounds.contains(roundedIntPoint(localPoint));
}
FloatPoint RenderSlider::mouseEventOffsetToThumb(MouseEvent* evt)
{
- ASSERT(m_thumb && m_thumb->renderer());
- FloatPoint localPoint = m_thumb->renderBox()->absoluteToLocal(evt->absoluteLocation(), false, true);
- IntRect thumbBounds = m_thumb->renderBox()->borderBoxRect();
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ ASSERT(thumbElement && thumbElement->renderer());
+ FloatPoint localPoint = thumbElement->renderBox()->absoluteToLocal(evt->absoluteLocation(), false, true);
+ IntRect thumbBounds = thumbElement->renderBox()->borderBoxRect();
FloatPoint offset;
offset.setX(thumbBounds.x() + thumbBounds.width() / 2 - localPoint.x());
offset.setY(thumbBounds.y() + thumbBounds.height() / 2 - localPoint.y());
@@ -257,7 +213,8 @@ FloatPoint RenderSlider::mouseEventOffsetToThumb(MouseEvent* evt)
void RenderSlider::setValueForPosition(int position)
{
- if (!m_thumb || !m_thumb->renderer())
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ if (!thumbElement || !thumbElement->renderer())
return;
HTMLInputElement* element = static_cast<HTMLInputElement*>(node());
@@ -282,40 +239,45 @@ void RenderSlider::setValueForPosition(int position)
int RenderSlider::positionForOffset(const IntPoint& p)
{
- if (!m_thumb || !m_thumb->renderer())
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ if (!thumbElement || !thumbElement->renderer())
return 0;
int position;
if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
- position = p.y() - m_thumb->renderBox()->height() / 2;
+ position = p.y() - thumbElement->renderBox()->height() / 2;
else
- position = p.x() - m_thumb->renderBox()->width() / 2;
+ position = p.x() - thumbElement->renderBox()->width() / 2;
return max(0, min(position, trackSize()));
}
int RenderSlider::currentPosition()
{
- ASSERT(m_thumb);
- ASSERT(m_thumb->renderer());
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ ASSERT(thumbElement && thumbElement->renderer());
if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
- return toRenderBox(m_thumb->renderer())->y() - contentBoxRect().y();
- return toRenderBox(m_thumb->renderer())->x() - contentBoxRect().x();
+ return toRenderBox(thumbElement->renderer())->y() - contentBoxRect().y();
+ return toRenderBox(thumbElement->renderer())->x() - contentBoxRect().x();
}
int RenderSlider::trackSize()
{
- ASSERT(m_thumb);
- ASSERT(m_thumb->renderer());
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ ASSERT(thumbElement && thumbElement->renderer());
if (style()->appearance() == SliderVerticalPart || style()->appearance() == MediaVolumeSliderPart)
- return contentHeight() - m_thumb->renderBox()->height();
- return contentWidth() - m_thumb->renderBox()->width();
+ return contentHeight() - thumbElement->renderBox()->height();
+ return contentWidth() - thumbElement->renderBox()->width();
}
void RenderSlider::forwardEvent(Event* event)
{
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ if (!thumbElement)
+ return;
+
if (event->isMouseEvent()) {
MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
if (event->type() == eventNames().mousedownEvent && mouseEvent->button() == LeftButton) {
@@ -326,12 +288,13 @@ void RenderSlider::forwardEvent(Event* event)
}
}
- m_thumb->defaultEventHandler(event);
+ thumbElement->defaultEventHandler(event);
}
bool RenderSlider::inDragMode() const
{
- return m_thumb && m_thumb->inDragMode();
+ SliderThumbElement* thumbElement = sliderThumbElement();
+ return thumbElement && thumbElement->inDragMode();
}
} // namespace WebCore