void MiniBrowser::didChangeViewportAttributes(WKViewRef view, WKViewportAttributesRef attributes, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); WKSize viewportSize = NIXViewportAttributesGetSize(attributes); mb->m_viewportWidth = viewportSize.width; mb->m_viewportHeight = viewportSize.height; mb->m_viewportMinScale = NIXViewportAttributesGetMinimumScale(attributes); mb->m_viewportMaxScale = NIXViewportAttributesGetMaximumScale(attributes); mb->m_viewportInitScale = NIXViewportAttributesGetInitialScale(attributes); mb->m_viewportUserScalable = NIXViewportAttributesGetIsUserScalable(attributes); if (mb->m_viewportInitScale < 0) { double scale = mb->scaleToFitContents(); if (scale < mb->m_viewportMinScale) scale = mb->m_viewportMinScale; else if (scale > mb->m_viewportMaxScale) scale = mb->m_viewportMaxScale; mb->m_viewportInitScale = scale; } if (!mb->m_viewportUserScalable) mb->m_viewportMaxScale = mb->m_viewportMinScale = mb->m_viewportInitScale; WKViewSetContentScaleFactor(mb->m_view, mb->m_viewportInitScale); }
void MiniBrowser::didChangeViewportAttributes(NIXView, float width, float height, float minimumScale, float maximumScale, float initialScale, int userScalable, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); mb->m_viewportWidth = width; mb->m_viewportHeight = height; mb->m_viewportMinScale = minimumScale; mb->m_viewportMaxScale = maximumScale; mb->m_viewportInitScale = initialScale; mb->m_viewportUserScalable = userScalable; if (mb->m_viewportInitScale < 0) { double scale = mb->scaleToFitContents(); if (scale < minimumScale) scale = minimumScale; else if (scale > maximumScale) scale = maximumScale; mb->m_viewportInitScale = scale; } if (!mb->m_viewportUserScalable) mb->m_viewportMaxScale = mb->m_viewportMinScale = mb->m_viewportInitScale; NIXViewSetScale(mb->m_view, mb->m_viewportInitScale); }
void MiniBrowser::didFindZoomableArea(WKViewRef, WKPoint target, WKRect area, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); // Zoomable area width is the same as web page width, and this is fully visible. if (mb->m_contentsSize.width == area.size.width && mb->m_contentsSize.width == NIXViewVisibleContentsSize(mb->m_view).width) return; // The zoomed area will look nicer with a horizontal margin. double scale = WKViewGetSize(mb->m_view).width / (area.size.width + horizontalMarginForViewportAdjustment * 2.0); // Trying to zoom to an area with the same scale factor causes a zoom out. if (scale == WKViewGetContentScaleFactor(mb->m_view)) scale = mb->scaleToFitContents(); else { // We want the zoomed content area to fit horizontally in the WebView, // so let's give the scaleAtPoint method a suitable value. target.x = area.origin.x - horizontalMarginForViewportAdjustment; WKViewSetContentPosition(mb->m_view, WKPointMake(target.x, WKViewGetContentPosition(mb->m_view).y)); } mb->scaleAtPoint(target, scale); }