This source file includes following definitions.
- setSize
- setLocation
- attachToLayerTree
- setupScrollbar
- registerLayersWithTreeView
- clearLayersForTreeView
- scrollSize
- minimumScrollPosition
- maximumScrollPosition
- scrollableAreaBoundingBox
- contentsSize
- invalidateScrollbarRect
- setScrollOffset
- layerForContainer
- layerForScrolling
- layerForHorizontalScrollbar
- layerForVerticalScrollbar
- notifyAnimationStarted
- paintContents
- debugName
#include "config.h"
#include "PinchViewport.h"
#include "core/frame/FrameHost.h"
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/Page.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
#include "core/rendering/RenderView.h"
#include "core/rendering/compositing/RenderLayerCompositor.h"
#include "platform/geometry/FloatSize.h"
#include "platform/graphics/GraphicsLayer.h"
#include "platform/graphics/GraphicsLayerFactory.h"
#include "platform/scroll/Scrollbar.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCompositorSupport.h"
#include "public/platform/WebLayer.h"
#include "public/platform/WebLayerTreeView.h"
#include "public/platform/WebScrollbar.h"
#include "public/platform/WebScrollbarLayer.h"
using blink::WebLayer;
using blink::WebLayerTreeView;
using blink::WebScrollbar;
using blink::WebScrollbarLayer;
using WebCore::FrameHost;
using WebCore::GraphicsLayer;
using WebCore::GraphicsLayerFactory;
namespace WebCore {
PinchViewport::PinchViewport(FrameHost& owner)
: m_frameHost(owner)
{
}
PinchViewport::~PinchViewport() { }
void PinchViewport::setSize(const IntSize& newSize)
{
if (!m_innerViewportContainerLayer || !m_innerViewportScrollLayer)
return;
m_innerViewportContainerLayer->setSize(newSize);
m_innerViewportScrollLayer->setSize(newSize);
setupScrollbar(WebScrollbar::Horizontal);
setupScrollbar(WebScrollbar::Vertical);
}
void PinchViewport::setLocation(const IntPoint& newLocation)
{
IntPoint location(newLocation);
location.shrunkTo(maximumScrollPosition());
location.expandedTo(minimumScrollPosition());
m_visibleRect.setLocation(newLocation);
ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
ASSERT(coordinator);
coordinator->scrollableAreaScrollLayerDidChange(this);
}
void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, GraphicsLayerFactory* graphicsLayerFactory)
{
if (!currentLayerTreeRoot) {
m_innerViewportScrollLayer->removeAllChildren();
return;
}
if (currentLayerTreeRoot->parent() && currentLayerTreeRoot->parent() == m_innerViewportScrollLayer)
return;
if (!m_innerViewportScrollLayer) {
ASSERT(!m_overlayScrollbarHorizontal
&& !m_overlayScrollbarVertical
&& !m_pageScaleLayer
&& !m_innerViewportContainerLayer);
m_innerViewportContainerLayer = GraphicsLayer::create(graphicsLayerFactory, this);
m_pageScaleLayer = GraphicsLayer::create(graphicsLayerFactory, this);
m_innerViewportScrollLayer = GraphicsLayer::create(graphicsLayerFactory, this);
m_overlayScrollbarHorizontal = GraphicsLayer::create(graphicsLayerFactory, this);
m_overlayScrollbarVertical = GraphicsLayer::create(graphicsLayerFactory, this);
WebCore::ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
ASSERT(coordinator);
coordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true);
m_innerViewportContainerLayer->setMasksToBounds(false);
m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer(
m_innerViewportContainerLayer->platformLayer());
m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true);
m_innerViewportContainerLayer->addChild(m_pageScaleLayer.get());
m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get());
m_innerViewportContainerLayer->addChild(m_overlayScrollbarHorizontal.get());
m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get());
coordinator->scrollableAreaScrollLayerDidChange(this);
setupScrollbar(WebScrollbar::Horizontal);
setupScrollbar(WebScrollbar::Vertical);
}
m_innerViewportScrollLayer->removeAllChildren();
m_innerViewportScrollLayer->addChild(currentLayerTreeRoot);
}
void PinchViewport::setupScrollbar(WebScrollbar::Orientation orientation)
{
bool isHorizontal = orientation == WebScrollbar::Horizontal;
GraphicsLayer* scrollbarGraphicsLayer = isHorizontal ?
m_overlayScrollbarHorizontal.get() : m_overlayScrollbarVertical.get();
OwnPtr<WebScrollbarLayer>& webScrollbarLayer = isHorizontal ?
m_webOverlayScrollbarHorizontal : m_webOverlayScrollbarVertical;
const int overlayScrollbarThickness = m_frameHost.settings().pinchOverlayScrollbarThickness();
if (!webScrollbarLayer) {
ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator();
ASSERT(coordinator);
ScrollbarOrientation webcoreOrientation = isHorizontal ? HorizontalScrollbar : VerticalScrollbar;
webScrollbarLayer = coordinator->createSolidColorScrollbarLayer(webcoreOrientation, overlayScrollbarThickness, false);
webScrollbarLayer->setClipLayer(m_innerViewportContainerLayer->platformLayer());
scrollbarGraphicsLayer->setContentsToPlatformLayer(webScrollbarLayer->layer());
scrollbarGraphicsLayer->setDrawsContent(false);
}
int xPosition = isHorizontal ? 0 : m_innerViewportContainerLayer->size().width() - overlayScrollbarThickness;
int yPosition = isHorizontal ? m_innerViewportContainerLayer->size().height() - overlayScrollbarThickness : 0;
int width = isHorizontal ? m_innerViewportContainerLayer->size().width() - overlayScrollbarThickness : overlayScrollbarThickness;
int height = isHorizontal ? overlayScrollbarThickness : m_innerViewportContainerLayer->size().height() - overlayScrollbarThickness;
scrollbarGraphicsLayer->setPosition(IntPoint(xPosition, yPosition));
scrollbarGraphicsLayer->setSize(IntSize(width, height));
scrollbarGraphicsLayer->setContentsRect(IntRect(0, 0, width, height));
}
void PinchViewport::registerLayersWithTreeView(WebLayerTreeView* layerTreeView) const
{
ASSERT(layerTreeView);
ASSERT(m_frameHost.page().mainFrame());
ASSERT(m_frameHost.page().mainFrame()->contentRenderer());
RenderLayerCompositor* compositor = m_frameHost.page().mainFrame()->contentRenderer()->compositor();
WebLayer* scrollLayer = compositor->scrollLayer()->platformLayer();
m_webOverlayScrollbarHorizontal->setScrollLayer(scrollLayer);
m_webOverlayScrollbarVertical->setScrollLayer(scrollLayer);
ASSERT(compositor);
layerTreeView->registerViewportLayers(
m_pageScaleLayer->platformLayer(),
m_innerViewportScrollLayer->platformLayer(),
scrollLayer);
}
void PinchViewport::clearLayersForTreeView(WebLayerTreeView* layerTreeView) const
{
ASSERT(layerTreeView);
layerTreeView->clearViewportLayers();
}
int PinchViewport::scrollSize(ScrollbarOrientation orientation) const
{
IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition();
return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scrollDimensions.height();
}
IntPoint PinchViewport::minimumScrollPosition() const
{
return IntPoint();
}
IntPoint PinchViewport::maximumScrollPosition() const
{
IntPoint maxScrollPosition(contentsSize() - visibleRect().size());
maxScrollPosition.clampNegativeToZero();
return maxScrollPosition;
}
IntRect PinchViewport::scrollableAreaBoundingBox() const
{
LocalFrame* frame = m_frameHost.page().mainFrame();
if (!frame || !frame->view())
return IntRect();
return frame->view()->frameRect();
}
IntSize PinchViewport::contentsSize() const
{
LocalFrame* frame = m_frameHost.page().mainFrame();
if (!frame || !frame->view())
return IntSize();
return frame->view()->unscaledVisibleContentSize(IncludeScrollbars);
}
void PinchViewport::invalidateScrollbarRect(Scrollbar*, const IntRect&)
{
}
void PinchViewport::setScrollOffset(const IntPoint& offset)
{
setLocation(offset);
}
GraphicsLayer* PinchViewport::layerForContainer() const
{
return m_innerViewportContainerLayer.get();
}
GraphicsLayer* PinchViewport::layerForScrolling() const
{
return m_innerViewportScrollLayer.get();
}
GraphicsLayer* PinchViewport::layerForHorizontalScrollbar() const
{
return m_overlayScrollbarHorizontal.get();
}
GraphicsLayer* PinchViewport::layerForVerticalScrollbar() const
{
return m_overlayScrollbarVertical.get();
}
void PinchViewport::notifyAnimationStarted(const GraphicsLayer*, double monotonicTime)
{
}
void PinchViewport::paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& inClip)
{
}
String PinchViewport::debugName(const GraphicsLayer* graphicsLayer)
{
String name;
if (graphicsLayer == m_innerViewportContainerLayer.get()) {
name = "Inner Viewport Container Layer";
} else if (graphicsLayer == m_pageScaleLayer.get()) {
name = "Page Scale Layer";
} else if (graphicsLayer == m_innerViewportScrollLayer.get()) {
name = "Inner Viewport Scroll Layer";
} else if (graphicsLayer == m_overlayScrollbarHorizontal.get()) {
name = "Overlay Scrollbar Horizontal Layer";
} else if (graphicsLayer == m_overlayScrollbarVertical.get()) {
name = "Overlay Scrollbar Vertical Layer";
} else {
ASSERT_NOT_REACHED();
}
return name;
}
}