Source: lib/util/fake_event.js

/**
 * @license
 * Copyright 2016 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

goog.provide('shaka.util.FakeEvent');


/**
 * Create an Event work-alike object based on the provided dictionary.
 * The event should contain all of the same properties from the dict.
 *
 * @param {string} type
 * @param {Object=} dict
 * @constructor
 * @extends {Event}
 */
shaka.util.FakeEvent = function(type, dict = {}) {
  // Take properties from dict if present.
  for (let key in dict) {
    this[key] = dict[key];
  }


  // The properties below cannot be set by the dict.  They are all provided for
  // compatibility with native events.

  /** @const {boolean} */
  this.bubbles = false;

  /** @type {boolean} */
  this.cancelable = false;

  /** @type {boolean} */
  this.defaultPrevented = false;

  /**
   * According to MDN, Chrome uses high-res timers instead of epoch time.
   * Follow suit so that timeStamps on FakeEvents use the same base as
   * on native Events.
   * @const {number}
   * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/timeStamp
   */
  this.timeStamp = window.performance && window.performance.now ?
      window.performance.now() : Date.now();

  /** @const {string} */
  this.type = type;

  /** @const {boolean} */
  this.isTrusted = false;

  /** @type {EventTarget} */
  this.currentTarget = null;

  /** @type {EventTarget} */
  this.target = null;


  /**
   * Non-standard property read by FakeEventTarget to stop processing listeners.
   * @type {boolean}
   */
  this.stopped = false;
};


/**
 * Prevents the default action of the event.  Has no effect if the event isn't
 * cancellable.
 * @override
 */
shaka.util.FakeEvent.prototype.preventDefault = function() {
  if (this.cancelable) {
    this.defaultPrevented = true;
  }
};


/**
 * Stops processing event listeners for this event.  Provided for compatibility
 * with native Events.
 * @override
 */
shaka.util.FakeEvent.prototype.stopImmediatePropagation = function() {
  this.stopped = true;
};


/**
 * Does nothing, since FakeEvents do not bubble.  Provided for compatibility
 * with native Events.
 * @override
 */
shaka.util.FakeEvent.prototype.stopPropagation = function() {};