Source: browser/isSupportPassive.ts

/**
 * @interface IPassive
 * @property {Boolean} passive - passive 지원 유무
 * @see https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners?hl=ko
 */
interface IPassive {
  passive: boolean;
}

/**
 * passive 옵션 지원 유무 반환
 * @memberof module:browser
 * @function
 * @return {Boolean}
 * @see https://github.com/WICG/EventListenerOptions/pull/30
 * @see https://github.com/cubiq/iscroll/blob/master/demos/demoUtils.js#L2-L12
 * @see https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners?hl=ko
 * @example
import { isSupportPassive } from '@nonoll/code-snippet/browser';
console.log(isSupportPassive()); // true or false
 */
/* istanbul ignore next */
export const isSupportPassive = (): boolean => {
  let supportPassiveOption = false;

  try {
    const options = Object.defineProperty({}, 'passive', { get: () => supportPassiveOption = true });
    addEventListener('test_passive_option', null, options);
  } catch (e) {}

  return supportPassiveOption;
};

/**
 * 실행된 browser 에서 지원하는 passive 옵션 값 반환
 * @memberof module:browser
 * @function
 * @return {(IPassive|Boolean)}
 * @see https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners?hl=ko
 * @example
import { getPassiveOption } from '@nonoll/code-snippet/browser';
console.log(getPassiveOption()); // IPassive or false
 */
export const getPassiveOption = (): IPassive | boolean => isSupportPassive() ? { passive: true } : /* istanbul ignore next */ false;