chromium/ios/web/js_features/scroll_helper/resources/scroll_helper.ts

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';

/**
 * @fileoverview APIs used for the scroll workaround. See crbug.com/554257.
 */

let webViewScrollViewIsDragging = false;

/**
 * Tracks whether user is in the middle of scrolling/dragging. If user is
 * scrolling, ignore window.scrollTo() until user stops scrolling.
 */
gCrWeb.setWebViewScrollViewIsDragging = function(state: boolean) {
  webViewScrollViewIsDragging = state;
}

const originalWindowScrollTo_: Function = window.scrollTo;

/**
 * Wraps the original window.scrollTo() to suppress it as long as
 * webViewScrollViewIsDragging is true. Use apply() with called
 * arguments since there are two variants of window.scrollTo:
 * scrollTo(x, y) and scrollTo(options).
 */
window.scrollTo = function() {
  if (webViewScrollViewIsDragging) return;
  originalWindowScrollTo_.apply(null, arguments);
};