chromium/chrome/browser/resources/gaia_auth_host/scroll_helper_injected.js

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

/**
 * @fileoverview
 * -- WebviewScrollShadowsHelper --
 *
 *  Sends scroll information from within the webview. This information is used
 *  to appropriately add classes to the webview in order to display shadows on
 *  top of it. The shadows show to the user if there is content hidden that
 *  could be seen if the user would scroll up/down.
 */

export const WebviewScrollShadowsHelper = (function() {
  function WebviewScrollShadowsHelper() {}

  WebviewScrollShadowsHelper.prototype = {
    init(channel) {
      this.channel_ = channel;

      window.addEventListener('scroll', this.sendScrollInfo_.bind(this));
      window.addEventListener('resize', this.sendScrollInfo_.bind(this));
      this.boundAttachResizeObserver_ = this.attachResizeObserver_.bind(this);
      window.addEventListener('load', this.boundAttachResizeObserver_);
      this.resizeObserver = new ResizeObserver(() => {
        this.sendScrollInfo_();
      });
    },

    // Observe when document.body changes in size.
    attachResizeObserver_(event) {
      this.resizeObserver.observe(document.body);
      window.removeEventListener(event.type, this.boundAttachResizeObserver_);
    },

    sendScrollInfo_(event) {
      this.channel_.send({
        name: 'scrollInfo',
        scrollTop: window.scrollY,
        scrollHeight: document.body.scrollHeight,
      });
    },
  };

  return WebviewScrollShadowsHelper;
})();

export const WebviewScrollShadowsHelperConstructor = function() {
  return new WebviewScrollShadowsHelper();
};