Changeset 129515 in webkit
- Timestamp:
- Sep 25, 2012, 9:15:12 AM (13 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r129514 r129515 1 2012-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 1 35 2012-09-25 Jocelyn Turcotte <jocelyn.turcotte@digia.com> 2 36 -
trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
r129500 r129515 869 869 870 870 if (m_pageViewportController) 871 m_pageViewportController-> setViewportSize(QSizeF(q->width(), q->height()));871 m_pageViewportController->didChangeViewportSize(QSizeF(q->width(), q->height())); 872 872 } 873 873 -
trunk/Source/WebKit2/UIProcess/PageViewportController.cpp
r129508 r129515 129 129 return; 130 130 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 137 void PageViewportController::didChangeViewportSize(const FloatSize& newSize) 140 138 { 141 139 if (newSize.isEmpty()) … … 151 149 } 152 150 153 void PageViewportController:: setVisibleContentsRect(const FloatRect& visibleContentsRect, float viewportScale, const FloatPoint& trajectoryVector)154 { 155 m_vi sibleContentsRect = visibleContentsRect;151 void PageViewportController::didChangeContentsVisibility(const FloatPoint& viewportPos, float viewportScale, const FloatPoint& trajectoryVector) 152 { 153 m_viewportPos = viewportPos; 156 154 m_effectiveScale = viewportScale; 157 155 syncVisibleContents(trajectoryVector); … … 161 159 { 162 160 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); 167 170 168 171 m_client->didChangeVisibleContents(); … … 223 226 } 224 227 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(); 228 FloatRect 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; 231 232 232 233 return FloatRect(0, 0, horizontalRange, verticalRange); -
trunk/Source/WebKit2/UIProcess/PageViewportController.h
r129508 r129515 75 75 void resumeContent(); 76 76 77 WebCore::FloatRect positionRangeFor ContentAtScale(float viewportScale) const;77 WebCore::FloatRect positionRangeForViewportAtScale(float viewportScale) const; 78 78 79 79 float innerBoundedViewportScale(float) const; … … 92 92 void setHadUserInteraction(bool didUserInteract) { m_hadUserInteraction = didUserInteract; } 93 93 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()); 97 97 98 98 // Notifications from the WebProcess. … … 119 119 bool m_hadUserInteraction; 120 120 121 WebCore::FloatPoint m_viewportPos; 121 122 WebCore::FloatSize m_viewportSize; 122 123 WebCore::FloatSize m_contentsSize; 123 WebCore::FloatRect m_visibleContentsRect;124 124 float m_effectiveScale; // Should always be cssScale * devicePixelRatio. 125 125 -
trunk/Source/WebKit2/UIProcess/PageViewportControllerClient.h
r127720 r129515 34 34 virtual ~PageViewportControllerClient() { } 35 35 36 virtual void set ContentsPosition(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; 38 38 39 39 virtual void didResumeContent() = 0; -
trunk/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp
r129508 r129515 109 109 // Inform the web process about the requested visible content rect immediately so that new tiles 110 110 // are rendered at the final destination during the animation. 111 m_controller-> setVisibleContentsRect(contentRect, viewportScaleForRect(contentRect));111 m_controller->didChangeContentsVisibility(contentRect.topLeft(), viewportScaleForRect(contentRect)); 112 112 113 113 // Since we have to animate scale and position at the same time the scale animation interpolates … … 207 207 const QPointF viewportHotspot = QPointF(x, /* FIXME: visibleCenter */ viewportRect.center().y()); 208 208 209 QPointF endPosition = hotspot * targetScale - viewportHotspot;210 QRectF endPosRange = m_controller->positionRangeFor ContentAtScale(targetScale);209 QPointF endPosition = hotspot - viewportHotspot / targetScale; 210 QRectF endPosRange = m_controller->positionRangeForViewportAtScale(targetScale); 211 211 212 212 endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight()); 213 213 214 QRectF endVisibleContentRect(endPosition / targetScale, viewportRect.size() / targetScale);214 QRectF endVisibleContentRect(endPosition, viewportRect.size() / targetScale); 215 215 216 216 animateContentRectVisible(endVisibleContentRect); … … 244 244 const QPointF viewportHotspot = viewportRect.center(); 245 245 246 QPointF endPosition = hotspot * targetScale - viewportHotspot;247 248 QRectF endPosRange = m_controller->positionRangeFor ContentAtScale(targetScale);246 QPointF endPosition = hotspot - viewportHotspot / targetScale; 247 248 QRectF endPosRange = m_controller->positionRangeForViewportAtScale(targetScale); 249 249 endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight()); 250 250 251 QRectF endVisibleContentRect(endPosition / targetScale, viewportRect.size() / targetScale);251 QRectF endVisibleContentRect(endPosition, viewportRect.size() / targetScale); 252 252 253 253 enum { ZoomIn, ZoomBack, ZoomOut, NoZoom } zoomAction = ZoomIn; … … 259 259 if (fuzzyCompare(targetScale, currentScale, 0.01)) { 260 260 // 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)); 262 262 QRectF targetIntersection = endVisibleContentRect.intersected(targetArea); 263 263 if (!currentContentRect.contains(targetIntersection) … … 275 275 switch (zoomAction) { 276 276 case ZoomIn: 277 m_scaleStack.append(ScaleStackItem(currentScale, m_viewportItem->contentPos().x() ));277 m_scaleStack.append(ScaleStackItem(currentScale, m_viewportItem->contentPos().x() / currentScale)); 278 278 m_zoomOutScale = targetScale; 279 279 break; … … 282 282 targetScale = lastScale.scale; 283 283 // 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); 285 285 endPosition.setX(lastScale.xPosition); 286 endPosRange = m_controller->positionRangeFor ContentAtScale(targetScale);286 endPosRange = m_controller->positionRangeForViewportAtScale(targetScale); 287 287 endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight()); 288 endVisibleContentRect = QRectF(endPosition / targetScale, viewportRect.size() / targetScale);288 endVisibleContentRect = QRectF(endPosition, viewportRect.size() / targetScale); 289 289 break; 290 290 } … … 308 308 const QRectF viewportRect = m_viewportItem->boundingRect(); 309 309 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); 313 314 endPosition = boundPosition(endPosRange.minXMinYCorner(), endPosition, endPosRange.maxXMaxYCorner()); 314 315 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 319 void PageViewportControllerClientQt::setViewportPosition(const FloatPoint& contentsPoint) 320 { 321 QPointF newPosition((m_pageItem->pos() + QPointF(contentsPoint)) * m_pageItem->contentsScale()); 323 322 m_viewportItem->setContentPos(newPosition); 324 323 updateViewportController(); … … 479 478 } 480 479 481 QRectF PageViewportControllerClientQt::visibleContentsRect() const482 {483 const QRectF visibleRect(m_viewportItem->boundingRect().intersected(m_pageItem->boundingRect()));484 return m_viewportItem->mapRectToWebContent(visibleRect);485 }486 487 480 void PageViewportControllerClientQt::didChangeContentsSize() 488 481 { … … 518 511 void PageViewportControllerClientQt::updateViewportController(const QPointF& trajectory, qreal scale) 519 512 { 520 Float Rect 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); 523 516 } 524 517 -
trunk/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.h
r128735 r129515 48 48 ~PageViewportControllerClientQt(); 49 49 50 virtual void set ContentsPosition(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); 52 52 53 53 virtual void didResumeContent(); … … 122 122 123 123 float viewportScaleForRect(const QRectF&) const; 124 QRectF visibleContentsRect() const;125 124 QRectF nearestValidVisibleContentsRect() const; 126 125
Note:
See TracChangeset
for help on using the changeset viewer.