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::pageDidRequestScroll(WKViewRef, WKPoint position, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); if (!NIXViewIsSuspended(mb->m_view)) WKViewSetContentPosition(mb->m_view, mb->adjustScrollPositionToBoundaries(position)); mb->scheduleUpdateDisplay(); }
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::didChangeContentsSize(WKViewRef, WKSize size, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); mb->m_contentsSize = size; if (mb->isMobileMode()) mb->adjustScrollPosition(); }
void MiniBrowser::webProcessCrashed(WKViewRef, WKURLRef url, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); //const string urlString = createStdStringFromWKString(url); //cerr << "The web process has crashed on '" << urlString << "', reloading page...\n"; //WKURLRef wkUrl = WKURLCreateWithUTF8CString(urlString.c_str()); WKPageLoadURL(mb->pageRef(), url); }
gboolean MiniBrowser::callUpdateDisplay(gpointer data) { MiniBrowser* browser = reinterpret_cast<MiniBrowser*>(data); assert(browser->m_displayUpdateScheduled); browser->m_displayUpdateScheduled = false; browser->updateDisplay(); return 0; }
void MiniBrowser::doneWithGestureEvent(WKViewRef, const NIXGestureEvent* event, bool wasEventHandled, const void* clientInfo) { if (wasEventHandled) return; MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); if (event->type == kNIXInputEventTypeGestureSingleTap && mb->m_shouldFocusEditableArea) { mb->m_shouldFocusEditableArea = false; mb->adjustViewportToTextInputArea(); } mb->m_postponeTextInputUpdates = true; }
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); }
void MiniBrowser::webProcessRelaunched(WKViewRef, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); cout << "The web process has been restarted.\n"; mb->scheduleUpdateDisplay(); }
void MiniBrowser::viewNeedsDisplay(WKViewRef, WKRect area, const void* clientInfo) { UNUSED_PARAM(area); MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); mb->scheduleUpdateDisplay(); }
void MiniBrowser::didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef, WKTypeRef, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); mb->m_control->updateUrlText(mb->activeUrl().c_str()); }
void MiniBrowser::pageDidRequestScroll(NIXView, WKPoint position, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); if (!NIXViewIsSuspended(mb->m_view)) NIXViewSetScrollPosition(mb->m_view, mb->adjustScrollPositionToBoundaries(position)); }