summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderListBox.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderListBox.h')
-rw-r--r--Source/WebCore/rendering/RenderListBox.h150
1 files changed, 89 insertions, 61 deletions
diff --git a/Source/WebCore/rendering/RenderListBox.h b/Source/WebCore/rendering/RenderListBox.h
index ed833e6d8..b1654dfb6 100644
--- a/Source/WebCore/rendering/RenderListBox.h
+++ b/Source/WebCore/rendering/RenderListBox.h
@@ -1,7 +1,7 @@
/*
* This file is part of the select element renderer in WebCore.
*
- * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2009, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -12,7 +12,7 @@
* 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.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
@@ -28,19 +28,19 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef RenderListBox_h
-#define RenderListBox_h
+#pragma once
#include "RenderBlockFlow.h"
#include "ScrollableArea.h"
+#include <wtf/Optional.h>
namespace WebCore {
class HTMLSelectElement;
-class RenderListBox final : public RenderBlockFlow, private ScrollableArea {
+class RenderListBox final : public RenderBlockFlow, public ScrollableArea {
public:
- RenderListBox(HTMLSelectElement&, PassRef<RenderStyle>);
+ RenderListBox(HTMLSelectElement&, RenderStyle&&);
virtual ~RenderListBox();
HTMLSelectElement& selectElement() const;
@@ -59,84 +59,109 @@ public:
int size() const;
+ bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = nullptr, RenderBox* startBox = nullptr, const IntPoint& wheelEventAbsolutePoint = IntPoint()) override;
+
+ bool scrolledToTop() const override;
+ bool scrolledToBottom() const override;
+ bool scrolledToLeft() const override;
+ bool scrolledToRight() const override;
+
private:
+ void willBeDestroyed() override;
+
void element() const = delete;
- virtual const char* renderName() const override { return "RenderListBox"; }
+ const char* renderName() const override { return "RenderListBox"; }
- virtual bool isListBox() const override { return true; }
+ bool isListBox() const override { return true; }
- virtual void updateFromElement() override;
- virtual bool canBeReplacedWithInlineRunIn() const override;
- virtual bool hasControlClip() const override { return true; }
- virtual void paintObject(PaintInfo&, const LayoutPoint&) override;
- virtual LayoutRect controlClipRect(const LayoutPoint&) const override;
+ void updateFromElement() override;
+ bool hasControlClip() const override { return true; }
+ void paintObject(PaintInfo&, const LayoutPoint&) override;
+ LayoutRect controlClipRect(const LayoutPoint&) const override;
- virtual bool isPointInOverflowControl(HitTestResult&, const LayoutPoint& locationInContainer, const LayoutPoint& accumulatedOffset) override;
+ bool isPointInOverflowControl(HitTestResult&, const LayoutPoint& locationInContainer, const LayoutPoint& accumulatedOffset) override;
- virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = nullptr, RenderBox* startBox = nullptr, const IntPoint& wheelEventAbsolutePoint = IntPoint()) override;
- virtual bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = 0) override;
+ bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = nullptr) override;
- virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override;
- virtual void computePreferredLogicalWidths() override;
- virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override;
- virtual void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues&) const override;
+ void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override;
+ void computePreferredLogicalWidths() override;
+ int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override;
+ LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
- virtual void layout() override;
+ void layout() override;
- virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer = 0) override;
+ void addFocusRingRects(Vector<LayoutRect>&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer = nullptr) override;
- virtual bool canBeProgramaticallyScrolled() const override { return true; }
- virtual void autoscroll(const IntPoint&) override;
- virtual void stopAutoscroll() override;
+ bool canBeProgramaticallyScrolled() const override { return true; }
+ void autoscroll(const IntPoint&) override;
+ void stopAutoscroll() override;
virtual bool shouldPanScroll() const { return true; }
- virtual void panScroll(const IntPoint&) override;
+ void panScroll(const IntPoint&) override;
- virtual int verticalScrollbarWidth() const override;
- virtual int scrollLeft() const override;
- virtual int scrollTop() const override;
- virtual int scrollWidth() const override;
- virtual int scrollHeight() const override;
- virtual void setScrollLeft(int) override;
- virtual void setScrollTop(int) override;
+ int verticalScrollbarWidth() const override;
+ int scrollLeft() const override;
+ int scrollTop() const override;
+ int scrollWidth() const override;
+ int scrollHeight() const override;
+ void setScrollLeft(int) override;
+ void setScrollTop(int) override;
- virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override;
+ bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override;
// ScrollableArea interface.
- virtual int scrollSize(ScrollbarOrientation) const override;
- virtual int scrollPosition(Scrollbar*) const override;
- virtual void setScrollOffset(const IntPoint&) override;
- virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) override;
- virtual bool isActive() const override;
- virtual bool isScrollCornerVisible() const override { return false; } // We don't support resize on list boxes yet. If we did these would have to change.
- virtual IntRect scrollCornerRect() const override { return IntRect(); }
- virtual void invalidateScrollCornerRect(const IntRect&) override { }
- virtual IntRect convertFromScrollbarToContainingView(const Scrollbar*, const IntRect&) const override;
- virtual IntRect convertFromContainingViewToScrollbar(const Scrollbar*, const IntRect&) const override;
- virtual IntPoint convertFromScrollbarToContainingView(const Scrollbar*, const IntPoint&) const override;
- virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const override;
- virtual Scrollbar* verticalScrollbar() const override { return m_vBar.get(); }
- virtual IntSize contentsSize() const override;
- virtual IntSize visibleSize() const override { return IntSize(height(), width()); }
- virtual IntPoint lastKnownMousePosition() const override;
- virtual bool isHandlingWheelEvent() const override;
- virtual bool shouldSuspendScrollAnimations() const override;
- virtual bool updatesScrollLayerPositionOnMainThread() const override { return true; }
-
- virtual ScrollableArea* enclosingScrollableArea() const override;
- virtual IntRect scrollableAreaBoundingBox() const override;
+ int scrollSize(ScrollbarOrientation) const override;
+ int scrollOffset(ScrollbarOrientation) const override;
+ void setScrollOffset(const ScrollOffset&) override;
+ ScrollPosition minimumScrollPosition() const override;
+ ScrollPosition maximumScrollPosition() const override;
+ void invalidateScrollbarRect(Scrollbar&, const IntRect&) override;
+ bool isActive() const override;
+ bool isScrollCornerVisible() const override { return false; } // We don't support resize on list boxes yet. If we did these would have to change.
+ IntRect scrollCornerRect() const override { return IntRect(); }
+ void invalidateScrollCornerRect(const IntRect&) override { }
+ IntRect convertFromScrollbarToContainingView(const Scrollbar&, const IntRect&) const override;
+ IntRect convertFromContainingViewToScrollbar(const Scrollbar&, const IntRect&) const override;
+ IntPoint convertFromScrollbarToContainingView(const Scrollbar&, const IntPoint&) const override;
+ IntPoint convertFromContainingViewToScrollbar(const Scrollbar&, const IntPoint&) const override;
+ Scrollbar* verticalScrollbar() const override { return m_vBar.get(); }
+ IntSize contentsSize() const override;
+ IntSize visibleSize() const override { return IntSize(width(), height()); }
+ IntPoint lastKnownMousePosition() const override;
+ bool isHandlingWheelEvent() const override;
+ bool shouldSuspendScrollAnimations() const override;
+ bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const override;
+
+ ScrollableArea* enclosingScrollableArea() const override;
+ bool isScrollableOrRubberbandable() override;
+ bool hasScrollableOrRubberbandableAncestor() override;
+ IntRect scrollableAreaBoundingBox(bool* = nullptr) const override;
+ bool usesMockScrollAnimator() const override;
+ void logMockScrollAnimatorMessage(const String&) const override;
// NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
void scrollTo(int newOffset);
+ using PaintFunction = std::function<void(PaintInfo&, const LayoutPoint&, int listItemIndex)>;
+ void paintItem(PaintInfo&, const LayoutPoint&, PaintFunction);
+
void setHasVerticalScrollbar(bool hasScrollbar);
- PassRefPtr<Scrollbar> createScrollbar();
+ Ref<Scrollbar> createScrollbar();
void destroyScrollbar();
+ int maximumNumberOfItemsThatFitInPaddingBottomArea() const;
+
+ int numberOfVisibleItemsInPaddingTop() const;
+ int numberOfVisibleItemsInPaddingBottom() const;
+
+ void computeFirstIndexesVisibleInPaddingTopBottomAreas();
+
LayoutUnit itemHeight() const;
void valueChanged(unsigned listIndex);
- int numVisibleItems() const;
+
+ enum class ConsiderPadding { Yes, No };
+ int numVisibleItems(ConsiderPadding = ConsiderPadding::No) const;
int numItems() const;
LayoutUnit listHeight() const;
void paintScrollbar(PaintInfo&, const LayoutPoint&);
@@ -144,17 +169,20 @@ private:
void paintItemBackground(PaintInfo&, const LayoutPoint&, int listIndex);
void scrollToRevealSelection();
+ bool shouldPlaceBlockDirectionScrollbarOnLeft() const final { return RenderBlockFlow::shouldPlaceBlockDirectionScrollbarOnLeft(); }
+
bool m_optionsChanged;
bool m_scrollToRevealSelectionAfterLayout;
bool m_inAutoscroll;
int m_optionsWidth;
int m_indexOffset;
+ std::optional<int> m_indexOfFirstVisibleItemInsidePaddingTopArea;
+ std::optional<int> m_indexOfFirstVisibleItemInsidePaddingBottomArea;
+
RefPtr<Scrollbar> m_vBar;
};
-RENDER_OBJECT_TYPE_CASTS(RenderListBox, isListBox())
-
} // namepace WebCore
-#endif // RenderListBox_h
+SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderListBox, isListBox())