void ScrollView::scrollTo(const IntSize& newOffset)
{
    IntSize scrollDelta = newOffset - m_scrollOffset;
    if (scrollDelta == IntSize())
        return;
    m_scrollOffset = newOffset;

#if PLATFORM(ANDROID)
    if (parent()) {
        FrameView* frameView = this->frameView();
        // IFrames are composited on a layer, we do not need to repaint them
        // when scrolling
        if (frameView) {
            RenderView* renderer = frameView->frame()->contentRenderer();
            if (renderer) {
                RenderLayer* layer = renderer->layer();
                if (layer->backing()) {
                    GraphicsLayerAndroid* backing = static_cast<GraphicsLayerAndroid*>(
                        layer->backing()->graphicsLayer());
                    backing->updateScrollOffset();
                }
            }
            return;
        }
    }
#endif

    if (scrollbarsSuppressed())
        return;

    repaintFixedElementsAfterScrolling();
    scrollContents(scrollDelta);
}
示例#2
0
void GraphicsLayerAndroid::gatherRootLayers(Vector<const RenderLayer*>& list)
{
    RenderLayer* renderLayer = renderLayerFromClient(m_client);
    if (renderLayer) {
        const RenderLayer* rootLayer = renderLayer->root();
        bool found = false;
        for (unsigned int i = 0; i < list.size(); i++) {
            const RenderLayer* current = list[i];
            if (current == rootLayer) {
                found = true;
                break;
            }
        }
        if (!found)
            list.append(rootLayer);
    }

    for (unsigned int i = 0; i < m_children.size(); i++) {
        GraphicsLayerAndroid* layer = static_cast<GraphicsLayerAndroid*>(m_children[i]);
        layer->gatherRootLayers(list);
    }
}
示例#3
0
WebCore::GraphicsLayer* ChromeClientAndroid::layersSync()
{
    if (m_rootGraphicsLayer && m_needsLayerSync && m_webFrame) {
        // We may have more than one frame, so let's first update all of them
        // (webkit may want to update the GraphicsLayer tree, and we do *not* want
        // to find this out when we are painting, as it means we could be summarily
        // deallocated while painting...)
        GraphicsLayerAndroid* rootLayer = static_cast<GraphicsLayerAndroid*>(m_rootGraphicsLayer);
        Vector<const RenderLayer*> listRootLayers;
        rootLayer->gatherRootLayers(listRootLayers);

        for (unsigned int i = 0; i < listRootLayers.size(); i++) {
            RenderLayer* layer = const_cast<RenderLayer*>(listRootLayers[i]);
            layer->compositor()->updateCompositingLayers();
        }

        Frame* frame = m_webFrame->page()->mainFrame();
        if (FrameView* frameView = frame->view())
            frameView->syncCompositingStateIncludingSubframes();
    }
    m_needsLayerSync = false;
    return m_rootGraphicsLayer;
}