void PageViewportController::didRenderFrame(const IntSize& contentsSize, const IntRect& coveredRect) { if (m_clientContentsSize != contentsSize) { m_clientContentsSize = contentsSize; // Only update the viewport's contents dimensions along with its render if the // size actually changed since animations on the page trigger DidRenderFrame // messages without causing dimension changes. m_client->didChangeContentsSize(contentsSize); } m_lastFrameCoveredRect = coveredRect; // Apply any scale or scroll position we locked to be set on the viewport // only when there is something to display there. The scale goes first to // avoid offsetting our deferred position by scaling at the viewport center. // All position and scale changes resulting from a web process event should // go through here to be applied on the viewport to avoid showing incomplete // tiles to the user during a few milliseconds. if (m_effectiveScaleIsLocked) { m_client->setContentsScale(m_effectiveScale, false); m_effectiveScaleIsLocked = false; } if (m_viewportPosIsLocked) { FloatPoint clampedPos = clampViewportToContents(m_viewportPos, m_effectiveScale); // There might be rendered frames not covering our requested position yet, wait for it. if (FloatRect(clampedPos, viewportSizeInContentsCoordinates()).intersects(coveredRect)) { m_client->setViewportPosition(clampedPos); m_viewportPosIsLocked = false; } } }
void PageViewportController::pageDidRequestScroll(const IntPoint& cssPosition) { // Ignore the request if suspended. Can only happen due to delay in event delivery. if (m_activeDeferrerCount) return; m_client->setViewportPosition(clampViewportToContents(cssPosition, m_effectiveScale)); }
void PageViewportController::syncVisibleContents(const FloatPoint& trajectoryVector) { DrawingAreaProxy* const drawingArea = m_webPageProxy->drawingArea(); if (!drawingArea || m_viewportSize.isEmpty() || m_contentsSize.isEmpty()) return; FloatRect visibleContentsRect(clampViewportToContents(m_viewportPos, m_effectiveScale), viewportSizeInContentsCoordinates()); visibleContentsRect.intersect(FloatRect(FloatPoint::zero(), m_contentsSize)); drawingArea->setVisibleContentsRect(visibleContentsRect, m_effectiveScale, trajectoryVector); m_client->didChangeVisibleContents(); }
void PageViewportController::pageDidRequestScroll(const IntPoint& cssPosition) { // Ignore the request if suspended. Can only happen due to delay in event delivery. if (m_hasSuspendedContent) return; FloatRect endVisibleContentRect(clampViewportToContents(cssPosition, m_effectiveScale), viewportSizeInContentsCoordinates()); if (m_lastFrameCoveredRect.intersects(endVisibleContentRect)) m_client->setViewportPosition(endVisibleContentRect.location()); else // Keep the unclamped position in case the contents size is changed later on. applyPositionAfterRenderingContents(cssPosition); }