Index: Source/core/rendering/RenderScrollbar.cpp |
diff --git a/Source/core/rendering/RenderScrollbar.cpp b/Source/core/rendering/RenderScrollbar.cpp |
deleted file mode 100644 |
index e5689b296a90e01f3ffaa4bdfe26e417e218715e..0000000000000000000000000000000000000000 |
--- a/Source/core/rendering/RenderScrollbar.cpp |
+++ /dev/null |
@@ -1,356 +0,0 @@ |
-/* |
- * Copyright (C) 2008, 2009 Apple 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 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 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/rendering/RenderScrollbar.h" |
- |
-#include "core/css/PseudoStyleRequest.h" |
-#include "core/frame/FrameView.h" |
-#include "core/frame/LocalFrame.h" |
-#include "core/layout/LayoutPart.h" |
-#include "core/rendering/RenderScrollbarPart.h" |
-#include "core/rendering/RenderScrollbarTheme.h" |
-#include "platform/graphics/GraphicsContext.h" |
- |
-namespace blink { |
- |
-PassRefPtrWillBeRawPtr<Scrollbar> RenderScrollbar::createCustomScrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, Node* ownerNode, LocalFrame* owningFrame) |
-{ |
- return adoptRefWillBeNoop(new RenderScrollbar(scrollableArea, orientation, ownerNode, owningFrame)); |
-} |
- |
-RenderScrollbar::RenderScrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, Node* ownerNode, LocalFrame* owningFrame) |
- : Scrollbar(scrollableArea, orientation, RegularScrollbar, RenderScrollbarTheme::renderScrollbarTheme()) |
- , m_owner(ownerNode) |
- , m_owningFrame(owningFrame) |
-{ |
- ASSERT(ownerNode || owningFrame); |
- |
- // FIXME: We need to do this because RenderScrollbar::styleChanged is called as soon as the scrollbar is created. |
- |
- // Update the scrollbar size. |
- IntRect rect(0, 0, 0, 0); |
- updateScrollbarPart(ScrollbarBGPart); |
- if (RenderScrollbarPart* part = m_parts.get(ScrollbarBGPart)) { |
- part->layout(); |
- rect.setSize(flooredIntSize(part->size())); |
- } else if (this->orientation() == HorizontalScrollbar) { |
- rect.setWidth(this->width()); |
- } else { |
- rect.setHeight(this->height()); |
- } |
- |
- setFrameRect(rect); |
- |
-} |
- |
-RenderScrollbar::~RenderScrollbar() |
-{ |
- if (m_parts.isEmpty()) |
- return; |
- |
- // When a scrollbar is detached from its parent (causing all parts removal) and |
- // ready to be destroyed, its destruction can be delayed because of RefPtr |
- // maintained in other classes such as EventHandler (m_lastScrollbarUnderMouse). |
- // Meanwhile, we can have a call to updateScrollbarPart which recreates the |
- // scrollbar part. So, we need to destroy these parts since we don't want them |
- // to call on a destroyed scrollbar. See webkit bug 68009. |
- updateScrollbarParts(true); |
-} |
- |
-void RenderScrollbar::trace(Visitor* visitor) |
-{ |
-#if ENABLE(OILPAN) |
- visitor->trace(m_owner); |
- visitor->trace(m_owningFrame); |
-#endif |
- Scrollbar::trace(visitor); |
-} |
- |
-RenderBox* RenderScrollbar::owningRenderer() const |
-{ |
- if (m_owningFrame) { |
- RenderBox* currentRenderer = m_owningFrame->ownerRenderer(); |
- return currentRenderer; |
- } |
- return m_owner && m_owner->renderer() ? m_owner->renderer()->enclosingBox() : 0; |
-} |
- |
-void RenderScrollbar::setParent(Widget* parent) |
-{ |
- Scrollbar::setParent(parent); |
- if (!parent) { |
- // Destroy all of the scrollbar's RenderBoxes. |
- updateScrollbarParts(true); |
- } |
-} |
- |
-void RenderScrollbar::setEnabled(bool e) |
-{ |
- bool wasEnabled = enabled(); |
- Scrollbar::setEnabled(e); |
- if (wasEnabled != e) |
- updateScrollbarParts(); |
-} |
- |
-void RenderScrollbar::styleChanged() |
-{ |
- updateScrollbarParts(); |
-} |
- |
-void RenderScrollbar::setHoveredPart(ScrollbarPart part) |
-{ |
- if (part == m_hoveredPart) |
- return; |
- |
- ScrollbarPart oldPart = m_hoveredPart; |
- m_hoveredPart = part; |
- |
- updateScrollbarPart(oldPart); |
- updateScrollbarPart(m_hoveredPart); |
- |
- updateScrollbarPart(ScrollbarBGPart); |
- updateScrollbarPart(TrackBGPart); |
-} |
- |
-void RenderScrollbar::setPressedPart(ScrollbarPart part) |
-{ |
- ScrollbarPart oldPart = m_pressedPart; |
- Scrollbar::setPressedPart(part); |
- |
- updateScrollbarPart(oldPart); |
- updateScrollbarPart(part); |
- |
- updateScrollbarPart(ScrollbarBGPart); |
- updateScrollbarPart(TrackBGPart); |
-} |
- |
-PassRefPtr<LayoutStyle> RenderScrollbar::getScrollbarPseudoStyle(ScrollbarPart partType, PseudoId pseudoId) |
-{ |
- if (!owningRenderer()) |
- return nullptr; |
- |
- RefPtr<LayoutStyle> result = owningRenderer()->getUncachedPseudoStyle(PseudoStyleRequest(pseudoId, this, partType), owningRenderer()->style()); |
- // Scrollbars for root frames should always have background color |
- // unless explicitly specified as transparent. So we force it. |
- // This is because WebKit assumes scrollbar to be always painted and missing background |
- // causes visual artifact like non-paint invalidated dirty region. |
- if (result && m_owningFrame && m_owningFrame->view() && !m_owningFrame->view()->isTransparent() && !result->hasBackground()) |
- result->setBackgroundColor(StyleColor(Color::white)); |
- |
- return result; |
-} |
- |
-void RenderScrollbar::updateScrollbarParts(bool destroy) |
-{ |
- updateScrollbarPart(ScrollbarBGPart, destroy); |
- updateScrollbarPart(BackButtonStartPart, destroy); |
- updateScrollbarPart(ForwardButtonStartPart, destroy); |
- updateScrollbarPart(BackTrackPart, destroy); |
- updateScrollbarPart(ThumbPart, destroy); |
- updateScrollbarPart(ForwardTrackPart, destroy); |
- updateScrollbarPart(BackButtonEndPart, destroy); |
- updateScrollbarPart(ForwardButtonEndPart, destroy); |
- updateScrollbarPart(TrackBGPart, destroy); |
- |
- if (destroy) |
- return; |
- |
- // See if the scrollbar's thickness changed. If so, we need to mark our owning object as needing a layout. |
- bool isHorizontal = orientation() == HorizontalScrollbar; |
- int oldThickness = isHorizontal ? height() : width(); |
- int newThickness = 0; |
- RenderScrollbarPart* part = m_parts.get(ScrollbarBGPart); |
- if (part) { |
- part->layout(); |
- newThickness = isHorizontal ? part->size().height() : part->size().width(); |
- } |
- |
- if (newThickness != oldThickness) { |
- setFrameRect(IntRect(location(), IntSize(isHorizontal ? width() : newThickness, isHorizontal ? newThickness : height()))); |
- if (RenderBox* box = owningRenderer()) { |
- if (box->isRenderBlock()) |
- toRenderBlock(box)->notifyScrollbarThicknessChanged(); |
- box->setChildNeedsLayout(); |
- } |
- } |
-} |
- |
-static PseudoId pseudoForScrollbarPart(ScrollbarPart part) |
-{ |
- switch (part) { |
- case BackButtonStartPart: |
- case ForwardButtonStartPart: |
- case BackButtonEndPart: |
- case ForwardButtonEndPart: |
- return SCROLLBAR_BUTTON; |
- case BackTrackPart: |
- case ForwardTrackPart: |
- return SCROLLBAR_TRACK_PIECE; |
- case ThumbPart: |
- return SCROLLBAR_THUMB; |
- case TrackBGPart: |
- return SCROLLBAR_TRACK; |
- case ScrollbarBGPart: |
- return SCROLLBAR; |
- case NoPart: |
- case AllParts: |
- break; |
- } |
- ASSERT_NOT_REACHED(); |
- return SCROLLBAR; |
-} |
- |
-void RenderScrollbar::updateScrollbarPart(ScrollbarPart partType, bool destroy) |
-{ |
- if (partType == NoPart) |
- return; |
- |
- RefPtr<LayoutStyle> partStyle = !destroy ? getScrollbarPseudoStyle(partType, pseudoForScrollbarPart(partType)) : PassRefPtr<LayoutStyle>(nullptr); |
- |
- bool needRenderer = !destroy && partStyle && partStyle->display() != NONE; |
- |
- if (needRenderer && partStyle->display() != BLOCK) { |
- // See if we are a button that should not be visible according to OS settings. |
- ScrollbarButtonsPlacement buttonsPlacement = theme()->buttonsPlacement(); |
- switch (partType) { |
- case BackButtonStartPart: |
- needRenderer = (buttonsPlacement == ScrollbarButtonsSingle || buttonsPlacement == ScrollbarButtonsDoubleStart || |
- buttonsPlacement == ScrollbarButtonsDoubleBoth); |
- break; |
- case ForwardButtonStartPart: |
- needRenderer = (buttonsPlacement == ScrollbarButtonsDoubleStart || buttonsPlacement == ScrollbarButtonsDoubleBoth); |
- break; |
- case BackButtonEndPart: |
- needRenderer = (buttonsPlacement == ScrollbarButtonsDoubleEnd || buttonsPlacement == ScrollbarButtonsDoubleBoth); |
- break; |
- case ForwardButtonEndPart: |
- needRenderer = (buttonsPlacement == ScrollbarButtonsSingle || buttonsPlacement == ScrollbarButtonsDoubleEnd || |
- buttonsPlacement == ScrollbarButtonsDoubleBoth); |
- break; |
- default: |
- break; |
- } |
- } |
- |
- RenderScrollbarPart* partRenderer = m_parts.get(partType); |
- if (!partRenderer && needRenderer) { |
- partRenderer = RenderScrollbarPart::createAnonymous(&owningRenderer()->document(), this, partType); |
- m_parts.set(partType, partRenderer); |
- } else if (partRenderer && !needRenderer) { |
- m_parts.remove(partType); |
- partRenderer->destroy(); |
- partRenderer = 0; |
- } |
- |
- if (partRenderer) |
- partRenderer->setStyle(partStyle.release()); |
-} |
- |
-IntRect RenderScrollbar::buttonRect(ScrollbarPart partType) |
-{ |
- RenderScrollbarPart* partRenderer = m_parts.get(partType); |
- if (!partRenderer) |
- return IntRect(); |
- |
- partRenderer->layout(); |
- |
- bool isHorizontal = orientation() == HorizontalScrollbar; |
- if (partType == BackButtonStartPart) |
- return IntRect(location(), IntSize(isHorizontal ? partRenderer->pixelSnappedWidth() : width(), isHorizontal ? height() : partRenderer->pixelSnappedHeight())); |
- if (partType == ForwardButtonEndPart) |
- return IntRect(isHorizontal ? x() + width() - partRenderer->pixelSnappedWidth() : x(), |
- isHorizontal ? y() : y() + height() - partRenderer->pixelSnappedHeight(), |
- isHorizontal ? partRenderer->pixelSnappedWidth() : width(), |
- isHorizontal ? height() : partRenderer->pixelSnappedHeight()); |
- |
- if (partType == ForwardButtonStartPart) { |
- IntRect previousButton = buttonRect(BackButtonStartPart); |
- return IntRect(isHorizontal ? x() + previousButton.width() : x(), |
- isHorizontal ? y() : y() + previousButton.height(), |
- isHorizontal ? partRenderer->pixelSnappedWidth() : width(), |
- isHorizontal ? height() : partRenderer->pixelSnappedHeight()); |
- } |
- |
- IntRect followingButton = buttonRect(ForwardButtonEndPart); |
- return IntRect(isHorizontal ? x() + width() - followingButton.width() - partRenderer->pixelSnappedWidth() : x(), |
- isHorizontal ? y() : y() + height() - followingButton.height() - partRenderer->pixelSnappedHeight(), |
- isHorizontal ? partRenderer->pixelSnappedWidth() : width(), |
- isHorizontal ? height() : partRenderer->pixelSnappedHeight()); |
-} |
- |
-IntRect RenderScrollbar::trackRect(int startLength, int endLength) |
-{ |
- RenderScrollbarPart* part = m_parts.get(TrackBGPart); |
- if (part) |
- part->layout(); |
- |
- if (orientation() == HorizontalScrollbar) { |
- int marginLeft = part ? static_cast<int>(part->marginLeft()) : 0; |
- int marginRight = part ? static_cast<int>(part->marginRight()) : 0; |
- startLength += marginLeft; |
- endLength += marginRight; |
- int totalLength = startLength + endLength; |
- return IntRect(x() + startLength, y(), width() - totalLength, height()); |
- } |
- |
- int marginTop = part ? static_cast<int>(part->marginTop()) : 0; |
- int marginBottom = part ? static_cast<int>(part->marginBottom()) : 0; |
- startLength += marginTop; |
- endLength += marginBottom; |
- int totalLength = startLength + endLength; |
- |
- return IntRect(x(), y() + startLength, width(), height() - totalLength); |
-} |
- |
-IntRect RenderScrollbar::trackPieceRectWithMargins(ScrollbarPart partType, const IntRect& oldRect) |
-{ |
- RenderScrollbarPart* partRenderer = m_parts.get(partType); |
- if (!partRenderer) |
- return oldRect; |
- |
- partRenderer->layout(); |
- |
- IntRect rect = oldRect; |
- if (orientation() == HorizontalScrollbar) { |
- rect.setX(rect.x() + partRenderer->marginLeft()); |
- rect.setWidth(rect.width() - partRenderer->marginWidth()); |
- } else { |
- rect.setY(rect.y() + partRenderer->marginTop()); |
- rect.setHeight(rect.height() - partRenderer->marginHeight()); |
- } |
- return rect; |
-} |
- |
-int RenderScrollbar::minimumThumbLength() |
-{ |
- RenderScrollbarPart* partRenderer = m_parts.get(ThumbPart); |
- if (!partRenderer) |
- return 0; |
- partRenderer->layout(); |
- return orientation() == HorizontalScrollbar ? partRenderer->size().width() : partRenderer->size().height(); |
-} |
- |
-} |