     // MARK: Refresh
     
     @objc public func refresh() {
+        shouldPerformWebRefreshAfterScrollViewDeceleration = true
+    }
+
+    internal func performWebViewRefresh() {
         #if DEBUG // on debug builds, reload everything including JS and CSS
             webView.reloadFromOrigin()
         #else // on release builds, just reload the page with a different cache policy

    private var leadImageHeight: CGFloat = 210

    private var contentSizeObservation: NSKeyValueObservation? = nil
    lazy var refreshControl: UIRefreshControl = {
        let rc = UIRefreshControl()
        rc.addTarget(self, action: #selector(refresh), for: .valueChanged)

        super.scrollViewWillBeginDragging(scrollView)
        dismissReferencesPopover()
    }

    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        super.scrollViewDidEndDecelerating(scrollView)
        if shouldPerformWebRefreshAfterScrollViewDeceleration {
            webView.scrollView.showsVerticalScrollIndicator = false
            performWebViewRefresh()
        }
    }
    
    // MARK: Analytics
    
