/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

/**
 * @fileoverview Extern definitions for types missing in the Closure externs,
 * but used in TypeScript platform `.d.ts`.
 * We suppress checkTypes to handle the scenario where a user doesn't use the
 * Closure externs (e.g. in a service worker).
 * @externs
 * @suppress {checkTypes}
 */

/** @typedef {!IArrayLike} */
var ArrayLike;

/** @typedef {!IteratorIterable} */
var IterableIterator;

/** @typedef {!IIterableResult} */
var IteratorYieldResult;
/** @typedef {!IIterableResult} */
var IteratorReturnResult;

/** @typedef {!HTMLCollection} */
var HTMLCollectionOf;

/** @typedef {!HTMLTableCellElement} */
var HTMLTableDataCellElement;

/**
 * Does not have an equivalent in Closure's externs.
 * @typedef {!HTMLTableCellElement}
 */
var HTMLTableHeaderCellElement;

/**
 * Closure's NodeList is parameterized itself, there is no NodeListOf.
 * @constructor
 * @template T
 * @extends {NodeList<T>}
 */
var NodeListOf;

/**
 * Closure models this as a plain Array.
 * @typedef {!IArrayLike<string>|null}
 */
var RegExpExecArray;

/**
 * @record
 * @template T
 * @extends {Array<T>}
 */
function ReadonlyArray() {}

/**
 * @constructor
 * @template K, V
 * @extends {Map<K, V>}
 */
function ReadonlyMap() {}

/**
 * @constructor
 * @template T
 * @extends {Set<T>}
 */
function ReadonlySet() {}

/**
 * @record
 * @template T
 * @extends {IThenable<T>}
 */
function PromiseLike() {};

/** @typedef {function(new:Promise)} */
var PromiseConstructor;

/** @typedef {function(new:Promise, function(function(*=), function(*=)))} */
var PromiseConstructorLike;

/** @typedef {?} */
var SymbolConstructor;

/** @typedef {!Object} */
var GlobalFetch;

/**
 * @interface
 * @extends {WorkerGlobalScope}
 * @extends {Window}
 */
var WindowOrWorkerGlobalScope;

/** @record */
function CanvasDrawImage() {}

/** @constructor */
function CryptoKey() {};
/** @constructor */
function CryptoKeyPair() {};

/** @typedef {!{handleEvent: function(Event):void}} */
var EventListenerObject;

/** @record */
function ImportMeta() {};

// Representations for TS' EventMap objects.
// These are types that contain a mapping from event names to event object
// types. User code can augment them, which produces externs.js files that then
// reference the EventMap types - even though they are not defined in Closure.
// Defining them here works around the problem.

/** @interface */
class HTMLElementEventMap {}
/** @interface */
class ElementEventMap {}
/** @interface */
class GlobalEventHandlersEventMap {}
/** @interface */
class DocumentAndElementEventHandlersEventMap {}

@@ -2657,24 +2657,110 @@
 nterface */%0A
+class DocumentEventMap %7B%7D%0A/** @interface */%0Aclass WindowEventMap %7B%7D%0A/** @interface */%0A
 class Global

Add DocumentEventMap and WindowEventMap to the EventMap list in closure_externs.js