Exemplo n.º 1
0
static std::unique_ptr<Array<protocol::LayerTree::ScrollRect>>
buildScrollRectsForLayer(GraphicsLayer* graphicsLayer,
                         bool reportWheelScrollers) {
  std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> scrollRects =
      Array<protocol::LayerTree::ScrollRect>::create();
  WebLayer* webLayer = graphicsLayer->platformLayer();
  WebVector<WebRect> nonFastScrollableRects =
      webLayer->nonFastScrollableRegion();
  for (size_t i = 0; i < nonFastScrollableRects.size(); ++i) {
    scrollRects->addItem(buildScrollRect(
        nonFastScrollableRects[i],
        protocol::LayerTree::ScrollRect::TypeEnum::RepaintsOnScroll));
  }
  WebVector<WebRect> touchEventHandlerRects =
      webLayer->touchEventHandlerRegion();
  for (size_t i = 0; i < touchEventHandlerRects.size(); ++i) {
    scrollRects->addItem(buildScrollRect(
        touchEventHandlerRects[i],
        protocol::LayerTree::ScrollRect::TypeEnum::TouchEventHandler));
  }
  if (reportWheelScrollers) {
    WebRect webRect(webLayer->position().x, webLayer->position().y,
                    webLayer->bounds().width, webLayer->bounds().height);
    scrollRects->addItem(buildScrollRect(
        webRect, protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler));
  }
  return scrollRects->length() ? std::move(scrollRects) : nullptr;
}
Exemplo n.º 2
0
static PassRefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > buildScrollRectsForLayer(GraphicsLayer* graphicsLayer)
{
    RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > scrollRects = TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>::create();
    WebLayer* webLayer = graphicsLayer->platformLayer();
    for (size_t i = 0; i < webLayer->nonFastScrollableRegion().size(); ++i) {
        scrollRects->addItem(buildScrollRect(webLayer->nonFastScrollableRegion()[i], TypeBuilder::LayerTree::ScrollRect::Type::RepaintsOnScroll));
    }
    for (size_t i = 0; i < webLayer->touchEventHandlerRegion().size(); ++i) {
        scrollRects->addItem(buildScrollRect(webLayer->touchEventHandlerRegion()[i], TypeBuilder::LayerTree::ScrollRect::Type::TouchEventHandler));
    }
    if (webLayer->haveWheelEventHandlers()) {
        WebRect webRect(webLayer->position().x, webLayer->position().y, webLayer->bounds().width, webLayer->bounds().height);
        scrollRects->addItem(buildScrollRect(webRect, TypeBuilder::LayerTree::ScrollRect::Type::WheelEventHandler));
    }
    return scrollRects->length() ? scrollRects.release() : nullptr;
}
Exemplo n.º 3
0
static std::unique_ptr<protocol::LayerTree::Layer> buildObjectForLayer(
    GraphicsLayer* graphicsLayer,
    int nodeId,
    bool reportWheelEventListeners) {
  WebLayer* webLayer = graphicsLayer->platformLayer();
  std::unique_ptr<protocol::LayerTree::Layer> layerObject =
      protocol::LayerTree::Layer::create()
          .setLayerId(idForLayer(graphicsLayer))
          .setOffsetX(webLayer->position().x)
          .setOffsetY(webLayer->position().y)
          .setWidth(webLayer->bounds().width)
          .setHeight(webLayer->bounds().height)
          .setPaintCount(graphicsLayer->paintCount())
          .setDrawsContent(webLayer->drawsContent())
          .build();

  if (nodeId)
    layerObject->setBackendNodeId(nodeId);

  GraphicsLayer* parent = graphicsLayer->parent();
  if (parent)
    layerObject->setParentLayerId(idForLayer(parent));
  if (!graphicsLayer->contentsAreVisible())
    layerObject->setInvisible(true);
  const TransformationMatrix& transform = graphicsLayer->transform();
  if (!transform.isIdentity()) {
    TransformationMatrix::FloatMatrix4 flattenedMatrix;
    transform.toColumnMajorFloatArray(flattenedMatrix);
    std::unique_ptr<Array<double>> transformArray = Array<double>::create();
    for (size_t i = 0; i < WTF_ARRAY_LENGTH(flattenedMatrix); ++i)
      transformArray->addItem(flattenedMatrix[i]);
    layerObject->setTransform(std::move(transformArray));
    const FloatPoint3D& transformOrigin = graphicsLayer->transformOrigin();
    // FIXME: rename these to setTransformOrigin*
    if (webLayer->bounds().width > 0)
      layerObject->setAnchorX(transformOrigin.x() / webLayer->bounds().width);
    else
      layerObject->setAnchorX(0.0);
    if (webLayer->bounds().height > 0)
      layerObject->setAnchorY(transformOrigin.y() / webLayer->bounds().height);
    else
      layerObject->setAnchorY(0.0);
    layerObject->setAnchorZ(transformOrigin.z());
  }
  std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> scrollRects =
      buildScrollRectsForLayer(graphicsLayer, reportWheelEventListeners);
  if (scrollRects)
    layerObject->setScrollRects(std::move(scrollRects));
  return layerObject;
}
TEST_F(ScrollingCoordinatorTest, fractionalScrollingNonLayerFixedPosition)
{
    registerMockedHttpURLLoad("fractional-scroll-fixed-position.html");
    navigateTo(m_baseURL + "fractional-scroll-fixed-position.html");
    // Prevent fixed-position element from getting its own layer.
    webViewImpl()->settings()->setPreferCompositingToLCDTextEnabled(false);
    forceFullCompositingUpdate();

    FrameView* frameView = frame()->view();
    frameView->scrollTo(DoublePoint(1.5, 1.5));
    WebLayer* rootScrollLayer = getRootScrollLayer();
    // Scroll on main if there is non-composited fixed position element.
    // And the containing scroll layer should not get fractional scroll offset.
    ASSERT_TRUE(rootScrollLayer->shouldScrollOnMainThread());
    ASSERT_EQ(1.0, rootScrollLayer->scrollPositionDouble().x);
    ASSERT_EQ(1.0, rootScrollLayer->scrollPositionDouble().y);
    ASSERT_EQ(0.0, rootScrollLayer->position().x);
    ASSERT_EQ(0.0, rootScrollLayer->position().y);
}