Changeset 129515 in webkit


Ignore:
Timestamp:
Sep 25, 2012, 9:15:12 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

[Qt] Unify the PageViewportController<->Client interface regarding positions
https://bugs.webkit.org/show_bug.cgi?id=97220

Patch by Jocelyn Turcotte <jocelyn.turcotte@digia.com> on 2012-09-25
Reviewed by Kenneth Rohde Christiansen.

  • Make sure that css units are used for all position arguments
  • Make sure that all positions represent the viewport relatively to the contents rather than the other way around
  • Delay clamping the viewport to the contents size in the controller rather than in the client
  • UIProcess/API/qt/qquickwebview.cpp:

(QQuickWebViewFlickablePrivate::updateViewportSize):

  • UIProcess/PageViewportController.cpp:

(WebKit::PageViewportController::pageDidRequestScroll):
(WebKit::PageViewportController::didChangeViewportSize):
(WebKit::PageViewportController::didChangeContentsVisibility):
(WebKit::PageViewportController::syncVisibleContents):
(WebKit::PageViewportController::positionRangeForViewportAtScale):

  • UIProcess/PageViewportController.h:

(PageViewportController):

  • UIProcess/PageViewportControllerClient.h:

(PageViewportControllerClient):

  • UIProcess/qt/PageViewportControllerClientQt.cpp:

(WebKit::PageViewportControllerClientQt::animateContentRectVisible):
(WebKit::PageViewportControllerClientQt::focusEditableArea):
(WebKit::PageViewportControllerClientQt::zoomToAreaGestureEnded):
(WebKit::PageViewportControllerClientQt::nearestValidVisibleContentsRect):
(WebKit::PageViewportControllerClientQt::setViewportPosition):
(WebKit::PageViewportControllerClientQt::updateViewportController):

  • UIProcess/qt/PageViewportControllerClientQt.h:

(PageViewportControllerClientQt):

Location:
trunk/Source/WebKit2
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r129514 r129515  
     12012-09-25  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
     2
     3        [Qt] Unify the PageViewportController<->Client interface regarding positions
     4        https://bugs.webkit.org/show_bug.cgi?id=97220
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        - Make sure that css units are used for all position arguments
     9        - Make sure that all positions represent the viewport relatively to the contents
     10          rather than the other way around
     11        - Delay clamping the viewport to the contents size in the controller rather than in the client
     12
     13        * UIProcess/API/qt/qquickwebview.cpp:
     14        (QQuickWebViewFlickablePrivate::updateViewportSize):
     15        * UIProcess/PageViewportController.cpp:
     16        (WebKit::PageViewportController::pageDidRequestScroll):
     17        (WebKit::PageViewportController::didChangeViewportSize):
     18        (WebKit::PageViewportController::didChangeContentsVisibility):
     19        (WebKit::PageViewportController::syncVisibleContents):
     20        (WebKit::PageViewportController::positionRangeForViewportAtScale):
     21        * UIProcess/PageViewportController.h:
     22        (PageViewportController):
     23        * UIProcess/PageViewportControllerClient.h:
     24        (PageViewportControllerClient):
     25        * UIProcess/qt/PageViewportControllerClientQt.cpp:
     26        (WebKit::PageViewportControllerClientQt::animateContentRectVisible):
     27        (WebKit::PageViewportControllerClientQt::focusEditableArea):
     28        (WebKit::PageViewportControllerClientQt::zoomToAreaGestureEnded):
     29        (WebKit::PageViewportControllerClientQt::nearestValidVisibleContentsRect):
     30        (WebKit::PageViewportControllerClientQt::setViewportPosition):
     31        (WebKit::PageViewportControllerClientQt::updateViewportController):
     32        * UIProcess/qt/PageViewportControllerClientQt.h:
     33        (PageViewportControllerClientQt):
     34
    1352012-09-25  Jocelyn Turcotte  <jocelyn.turcotte@digia.com>
    236
  • trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp

    r129500 r129515  
    869869
    870870    if (m_pageViewportController)
    871         m_pageViewportController->setViewportSize(QSizeF(q->width(), q->height()));
     871        m_pageViewportController->didChangeViewportSize(QSizeF(q->width(), q->height()));
    872872}
    873873
  • trunk/Source/WebKit2/UIProcess/PageViewportController.cpp

    r129508 r129515  
    129129        return;
    130130
    131     FloatRect endPosRange = positionRangeForContentAtScale(m_effectiveScale);
    132     FloatPoint endPosition(cssPosition);
    133     endPosition.scale(m_effectiveScale, m_effectiveScale);
    134     endPosition = boundPosition(endPosRange.minXMinYCorner(), endPosition, endPosRange.maxXMaxYCorner());
    135 
    136     m_client->setContentsPosition(endPosition);
    137 }
    138 
    139 void PageViewportController::setViewportSize(const FloatSize& newSize)
     131    FloatRect endPosRange = positionRangeForViewportAtScale(m_effectiveScale);
     132    FloatPoint endPosition = boundPosition(endPosRange.minXMinYCorner(), cssPosition, endPosRange.maxXMaxYCorner());
     133
     134    m_client->setViewportPosition(endPosition);
     135}
     136
     137void PageViewportController::didChangeViewportSize(const FloatSize& newSize)
    140138{
    141139    if (newSize.isEmpty())
     
    151149}
    152150
    153 void PageViewportController::setVisibleContentsRect(const FloatRect& visibleContentsRect, float viewportScale, const FloatPoint& trajectoryVector)
    154 {
    155     m_visibleContentsRect = visibleContentsRect;
     151void PageViewportController::didChangeContentsVisibility(const FloatPoint& viewportPos, float viewportScale, const FloatPoint& trajectoryVector)
     152{
     153    m_viewportPos = viewportPos;
    156154    m_effectiveScale = viewportScale;
    157155    syncVisibleContents(trajectoryVector);
     
    161159{
    162160    DrawingAreaProxy* const drawingArea = m_webPageProxy->drawingArea();
    163     if (!drawingArea || m_viewportSize.isEmpty() || m_contentsSize.isEmpty() || m_visibleContentsRect.isEmpty())
    164         return;
    165 
    166     drawingArea->setVisibleContentsRect(m_visibleContentsRect, m_effectiveScale, trajectoryVector);
     161    if (!drawingArea || m_viewportSize.isEmpty() || m_contentsSize.isEmpty())
     162        return;
     163
     164    FloatRect endPosRange = positionRangeForViewportAtScale(m_effectiveScale);
     165    FloatPoint endPosition = boundPosition(endPosRange.minXMinYCorner(), m_viewportPos, endPosRange.maxXMaxYCorner());
     166
     167    FloatRect visibleContentsRect(endPosition, m_viewportSize / m_effectiveScale);
     168    visibleContentsRect.intersect(FloatRect(FloatPoint::zero(), m_contentsSize));
     169    drawingArea->setVisibleContentsRect(visibleContentsRect, m_effectiveScale, trajectoryVector);
    167170
    168171    m_client->didChangeVisibleContents();
     
    223226}
    224227
    225 FloatRect PageViewportController::positionRangeForContentAtScale(float viewportScale) const
    226 {
    227     const FloatSize contentSize = m_contentsSize * viewportScale;
    228 
    229     const float horizontalRange = contentSize.width() - m_viewportSize.width();
    230     const float verticalRange = contentSize.height() - m_viewportSize.height();
     228FloatRect PageViewportController::positionRangeForViewportAtScale(float viewportScale) const
     229{
     230    const float horizontalRange = m_contentsSize.width() - m_viewportSize.width() / viewportScale;
     231    const float verticalRange = m_contentsSize.height() - m_viewportSize.height() / viewportScale;
    231232
    232233    return FloatRect(0, 0, horizontalRange, verticalRange);
  • trunk/Source/WebKit2/UIProcess/PageViewportController.h

    r129508 r129515  
    7575    void resumeContent();
    7676
    77     WebCore::FloatRect positionRangeForContentAtScale(float viewportScale) const;
     77    WebCore::FloatRect positionRangeForViewportAtScale(float viewportScale) const;
    7878
    7979    float innerBoundedViewportScale(float) const;
     
    9292    void setHadUserInteraction(bool didUserInteract) { m_hadUserInteraction = didUserInteract; }
    9393
    94     // Notifications to the WebProcess.
    95     void setViewportSize(const WebCore::FloatSize& newSize);
    96     void setVisibleContentsRect(const WebCore::FloatRect& visibleContentsRect, float viewportScale, const WebCore::FloatPoint& trajectoryVector = WebCore::FloatPoint::zero());
     94    // Notifications from the viewport.
     95    void didChangeViewportSize(const WebCore::FloatSize& newSize);
     96    void didChangeContentsVisibility(const WebCore::FloatPoint& viewportPos, float viewportScale, const WebCore::FloatPoint& trajectoryVector = WebCore::FloatPoint::zero());
    9797
    9898    // Notifications from the WebProcess.
     
    119119    bool m_hadUserInteraction;
    120120
     121    WebCore::FloatPoint m_viewportPos;
    121122    WebCore::FloatSize m_viewportSize;
    122123    WebCore::FloatSize m_contentsSize;
    123     WebCore::FloatRect m_visibleContentsRect;
    124124    float m_effectiveScale; // Should always be cssScale * devicePixelRatio.
    125125
  • trunk/Source/WebKit2/UIProcess/PageViewportControllerClient.h

    r127720 r129515  
    3434    virtual ~PageViewportControllerClient() { }
    3535
    36     virtual void setContentsPosition(const WebCore::FloatPoint& localPoint) = 0;
    37     virtual void setContentsScale(float localScale, bool treatAsInitialValue) = 0;
     36    virtual void setViewportPosition(const WebCore::FloatPoint& contentsPoint) = 0;
     37    virtual void setContentsScale(float, bool treatAsInitialValue) = 0;
    3838
    3939    virtual void didResumeContent() = 0;
  • trunk/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp

    r129508 r129515  
    109109    // Inform the web process about the requested visible content rect immediately so that new tiles
    110110    // are rendered at the final destination during the animation.
    111     m_controller->setVisibleContentsRect(contentRect, viewportScaleForRect(contentRect));
     111    m_controller->didChangeContentsVisibility(contentRect.topLeft(), viewportScaleForRect(contentRect));
    112112
    113113    // Since we have to animate scale and position at the same time the scale animation interpolates
     
    207207    const QPointF viewportHotspot = QPointF(x, /* FIXME: visibleCenter */ viewportRect.center().y());
    208208
    209     QPointF endPosition = hotspot * targetScale - viewportHotspot;
    210     QRectF endPosRange = m_controller->positionRangeForContentAtScale(targetScale);
     209    QPointF endPosition = hotspot - viewportHotspot / targetScale;
     210    QRectF endPosRange = m_controller->positionRangeForViewportAtScale(targetScale);
    211211
    212212    endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight());
    213213
    214     QRectF endVisibleContentRect(endPosition / targetScale, viewportRect.size() / targetScale);
     214    QRectF endVisibleContentRect(endPosition, viewportRect.size() / targetScale);
    215215
    216216    animateContentRectVisible(endVisibleContentRect);
     
    244244    const QPointF viewportHotspot = viewportRect.center();
    245245
    246     QPointF endPosition = hotspot * targetScale - viewportHotspot;
    247 
    248     QRectF endPosRange = m_controller->positionRangeForContentAtScale(targetScale);
     246    QPointF endPosition = hotspot - viewportHotspot / targetScale;
     247
     248    QRectF endPosRange = m_controller->positionRangeForViewportAtScale(targetScale);
    249249    endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight());
    250250
    251     QRectF endVisibleContentRect(endPosition / targetScale, viewportRect.size() / targetScale);
     251    QRectF endVisibleContentRect(endPosition, viewportRect.size() / targetScale);
    252252
    253253    enum { ZoomIn, ZoomBack, ZoomOut, NoZoom } zoomAction = ZoomIn;
     
    259259        if (fuzzyCompare(targetScale, currentScale, 0.01)) {
    260260            // If moving the viewport would expose more of the targetRect and move at least 40 pixels, update position but do not scale out.
    261             QRectF currentContentRect(visibleContentsRect());
     261            QRectF currentContentRect(m_viewportItem->mapRectToWebContent(viewportRect));
    262262            QRectF targetIntersection = endVisibleContentRect.intersected(targetArea);
    263263            if (!currentContentRect.contains(targetIntersection)
     
    275275    switch (zoomAction) {
    276276    case ZoomIn:
    277         m_scaleStack.append(ScaleStackItem(currentScale, m_viewportItem->contentPos().x()));
     277        m_scaleStack.append(ScaleStackItem(currentScale, m_viewportItem->contentPos().x() / currentScale));
    278278        m_zoomOutScale = targetScale;
    279279        break;
     
    282282        targetScale = lastScale.scale;
    283283        // Recalculate endPosition and bound it according to new scale.
    284         endPosition.setY(hotspot.y() * targetScale - viewportHotspot.y());
     284        endPosition.setY(hotspot.y() - viewportHotspot.y() / targetScale);
    285285        endPosition.setX(lastScale.xPosition);
    286         endPosRange = m_controller->positionRangeForContentAtScale(targetScale);
     286        endPosRange = m_controller->positionRangeForViewportAtScale(targetScale);
    287287        endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight());
    288         endVisibleContentRect = QRectF(endPosition / targetScale, viewportRect.size() / targetScale);
     288        endVisibleContentRect = QRectF(endPosition, viewportRect.size() / targetScale);
    289289        break;
    290290    }
     
    308308    const QRectF viewportRect = m_viewportItem->boundingRect();
    309309    QPointF viewportHotspot = viewportRect.center();
    310     QPointF endPosition = m_viewportItem->mapToWebContent(viewportHotspot) * targetScale - viewportHotspot;
    311 
    312     FloatRect endPosRange = m_controller->positionRangeForContentAtScale(targetScale);
     310    // Keep the center at the position of the old center, and substract viewportHotspot / targetScale to get the top left position.
     311    QPointF endPosition = m_viewportItem->mapToWebContent(viewportHotspot) - viewportHotspot / targetScale;
     312
     313    FloatRect endPosRange = m_controller->positionRangeForViewportAtScale(targetScale);
    313314    endPosition = boundPosition(endPosRange.minXMinYCorner(), endPosition, endPosRange.maxXMaxYCorner());
    314315
    315     QRectF endVisibleContentRect(endPosition / targetScale, viewportRect.size() / targetScale);
    316 
    317     return endVisibleContentRect;
    318 }
    319 
    320 void PageViewportControllerClientQt::setContentsPosition(const FloatPoint& localPoint)
    321 {
    322     QPointF newPosition(m_pageItem->pos() + QPointF(localPoint));
     316    return QRectF(endPosition, viewportRect.size() / targetScale);
     317}
     318
     319void PageViewportControllerClientQt::setViewportPosition(const FloatPoint& contentsPoint)
     320{
     321    QPointF newPosition((m_pageItem->pos() + QPointF(contentsPoint)) * m_pageItem->contentsScale());
    323322    m_viewportItem->setContentPos(newPosition);
    324323    updateViewportController();
     
    479478}
    480479
    481 QRectF PageViewportControllerClientQt::visibleContentsRect() const
    482 {
    483     const QRectF visibleRect(m_viewportItem->boundingRect().intersected(m_pageItem->boundingRect()));
    484     return m_viewportItem->mapRectToWebContent(visibleRect);
    485 }
    486 
    487480void PageViewportControllerClientQt::didChangeContentsSize()
    488481{
     
    518511void PageViewportControllerClientQt::updateViewportController(const QPointF& trajectory, qreal scale)
    519512{
    520     FloatRect currentVisibleRect(visibleContentsRect());
    521     float viewportScale = (scale < 0) ? viewportScaleForRect(currentVisibleRect) : scale;
    522     m_controller->setVisibleContentsRect(currentVisibleRect, viewportScale, trajectory);
     513    FloatPoint viewportPos = m_viewportItem->mapToWebContent(QPointF());
     514    float viewportScale = (scale < 0) ? m_pageItem->contentsScale() : scale;
     515    m_controller->didChangeContentsVisibility(viewportPos, viewportScale, trajectory);
    523516}
    524517
  • trunk/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.h

    r128735 r129515  
    4848    ~PageViewportControllerClientQt();
    4949
    50     virtual void setContentsPosition(const WebCore::FloatPoint& localPoint);
    51     virtual void setContentsScale(float localScale, bool treatAsInitialValue);
     50    virtual void setViewportPosition(const WebCore::FloatPoint& contentsPoint);
     51    virtual void setContentsScale(float scale, bool treatAsInitialValue);
    5252
    5353    virtual void didResumeContent();
     
    122122
    123123    float viewportScaleForRect(const QRectF&) const;
    124     QRectF visibleContentsRect() const;
    125124    QRectF nearestValidVisibleContentsRect() const;
    126125
Note: See TracChangeset for help on using the changeset viewer.