Index: Source/core/html/shadow/SliderThumbElement.cpp |
diff --git a/Source/core/html/shadow/SliderThumbElement.cpp b/Source/core/html/shadow/SliderThumbElement.cpp |
index cf98aea678bfda56afa54b372214bb181d03dd73..059d7f867757942c3903f642a4c7dfd289e0cf65 100644 |
--- a/Source/core/html/shadow/SliderThumbElement.cpp |
+++ b/Source/core/html/shadow/SliderThumbElement.cpp |
@@ -29,7 +29,6 @@ |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
- |
#include "config.h" |
#include "core/html/shadow/SliderThumbElement.h" |
@@ -44,19 +43,14 @@ |
#include "core/page/EventHandler.h" |
#include "core/rendering/RenderFlexibleBox.h" |
#include "core/rendering/RenderSlider.h" |
+#include "core/rendering/RenderSliderContainer.h" |
+#include "core/rendering/RenderSliderThumb.h" |
#include "core/rendering/RenderTheme.h" |
namespace WebCore { |
using namespace HTMLNames; |
-inline static Decimal sliderPosition(HTMLInputElement* element) |
-{ |
- const StepRange stepRange(element->createStepRange(RejectAny)); |
- const Decimal oldValue = parseToDecimalForNumberType(element->value(), stepRange.defaultValue()); |
- return stepRange.proportionFromValue(stepRange.clampValue(oldValue)); |
-} |
- |
inline static bool hasVerticalAppearance(HTMLInputElement* input) |
{ |
ASSERT(input->renderer()); |
@@ -65,129 +59,6 @@ inline static bool hasVerticalAppearance(HTMLInputElement* input) |
return sliderStyle->appearance() == SliderVerticalPart; |
} |
-// -------------------------------- |
- |
-RenderSliderThumb::RenderSliderThumb(SliderThumbElement* element) |
- : RenderBlockFlow(element) |
-{ |
-} |
- |
-void RenderSliderThumb::updateAppearance(RenderStyle* parentStyle) |
-{ |
- 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); |
- else if (parentStyle->appearance() == MediaFullScreenVolumeSliderPart) |
- style()->setAppearance(MediaFullScreenVolumeSliderThumbPart); |
- if (style()->hasAppearance()) |
- RenderTheme::theme().adjustSliderThumbSize(style(), toElement(node())); |
-} |
- |
-bool RenderSliderThumb::isSliderThumb() const |
-{ |
- return true; |
-} |
- |
-// -------------------------------- |
- |
-// FIXME: Find a way to cascade appearance and adjust heights, and get rid of this class. |
-// http://webkit.org/b/62535 |
-class RenderSliderContainer : public RenderFlexibleBox { |
-public: |
- RenderSliderContainer(SliderContainerElement* element) |
- : RenderFlexibleBox(element) { } |
-public: |
- virtual void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues&) const OVERRIDE; |
- |
-private: |
- virtual void layout() OVERRIDE; |
-}; |
- |
-void RenderSliderContainer::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const |
-{ |
- HTMLInputElement* input = toHTMLInputElement(node()->shadowHost()); |
- bool isVertical = hasVerticalAppearance(input); |
- |
- if (input->renderer()->isSlider() && !isVertical && input->list()) { |
- int offsetFromCenter = RenderTheme::theme().sliderTickOffsetFromTrackCenter(); |
- LayoutUnit trackHeight = 0; |
- if (offsetFromCenter < 0) |
- trackHeight = -2 * offsetFromCenter; |
- else { |
- int tickLength = RenderTheme::theme().sliderTickSize().height(); |
- trackHeight = 2 * (offsetFromCenter + tickLength); |
- } |
- float zoomFactor = style()->effectiveZoom(); |
- 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); |
-} |
- |
-void RenderSliderContainer::layout() |
-{ |
- HTMLInputElement* input = toHTMLInputElement(node()->shadowHost()); |
- bool isVertical = hasVerticalAppearance(input); |
- style()->setFlexDirection(isVertical ? FlowColumn : FlowRow); |
- TextDirection oldTextDirection = style()->direction(); |
- if (isVertical) { |
- // FIXME: Work around rounding issues in RTL vertical sliders. We want them to |
- // render identically to LTR vertical sliders. We can remove this work around when |
- // subpixel rendering is enabled on all ports. |
- style()->setDirection(LTR); |
- } |
- |
- Element* thumbElement = input->userAgentShadowRoot()->getElementById(ShadowElementNames::sliderThumb()); |
- Element* trackElement = input->userAgentShadowRoot()->getElementById(ShadowElementNames::sliderTrack()); |
- RenderBox* thumb = thumbElement ? thumbElement->renderBox() : 0; |
- RenderBox* track = trackElement ? trackElement->renderBox() : 0; |
- |
- 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) |
- layoutScope.setChildNeedsLayout(track); |
- |
- RenderFlexibleBox::layout(); |
- |
- style()->setDirection(oldTextDirection); |
- // These should always exist, unless someone mutates the shadow DOM (e.g., in the inspector). |
- if (!thumb || !track) |
- return; |
- |
- double percentageOffset = sliderPosition(input).toDouble(); |
- LayoutUnit availableExtent = isVertical ? track->contentHeight() : track->contentWidth(); |
- availableExtent -= isVertical ? thumb->height() : thumb->width(); |
- LayoutUnit offset = percentageOffset * availableExtent; |
- LayoutPoint thumbLocation = thumb->location(); |
- if (isVertical) |
- thumbLocation.setY(thumbLocation.y() + track->contentHeight() - thumb->height() - offset); |
- else if (style()->isLeftToRightDirection()) |
- thumbLocation.setX(thumbLocation.x() + offset); |
- else |
- thumbLocation.setX(thumbLocation.x() - offset); |
- thumb->setLocation(thumbLocation); |
-} |
- |
-// -------------------------------- |
- |
inline SliderThumbElement::SliderThumbElement(Document& document) |
: HTMLDivElement(document) |
, m_inDragMode(false) |