From ca3f9926f96ce9b6c0987f0cb807e8cc26ec2b23 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Tue, 27 Sep 2016 17:30:26 -0700 Subject: [PATCH] refactor(BrowserAdapter): cleanup --- .../src/browser/browser_adapter.ts | 308 +++++++----------- .../src/browser/generic_browser_adapter.ts | 26 +- .../platform-browser/src/dom/dom_adapter.ts | 2 +- 3 files changed, 137 insertions(+), 199 deletions(-) diff --git a/modules/@angular/platform-browser/src/browser/browser_adapter.ts b/modules/@angular/platform-browser/src/browser/browser_adapter.ts index b0963ea18b..87f16893a9 100644 --- a/modules/@angular/platform-browser/src/browser/browser_adapter.ts +++ b/modules/@angular/platform-browser/src/browser/browser_adapter.ts @@ -7,21 +7,21 @@ */ import {setRootDomAdapter} from '../dom/dom_adapter'; -import {DateWrapper, global, isBlank, isFunction, isPresent, setValueOnPath} from '../facade/lang'; +import {global, isBlank, isPresent, setValueOnPath} from '../facade/lang'; import {GenericBrowserDomAdapter} from './generic_browser_adapter'; -var _attrToPropMap = { +const _attrToPropMap = { 'class': 'className', 'innerHtml': 'innerHTML', 'readonly': 'readOnly', - 'tabindex': 'tabIndex' + 'tabindex': 'tabIndex', }; const DOM_KEY_LOCATION_NUMPAD = 3; // Map to convert some key or keyIdentifier values to what will be returned by getEventKey -var _keyMap = { +const _keyMap: {[k: string]: string} = { // The following values are here for cross-browser compatibility and to match the W3C standard // cf http://www.w3.org/TR/DOM-Level-3-Events-key/ '\b': 'Backspace', @@ -42,7 +42,7 @@ var _keyMap = { // There is a bug in Chrome for numeric keypad keys: // https://code.google.com/p/chromium/issues/detail?id=155654 // 1, 2, 3 ... are reported as A, B, C ... -var _chromeNumKeyPadMap = { +const _chromeNumKeyPadMap = { 'A': '1', 'B': '2', 'C': '3', @@ -71,67 +71,45 @@ var _chromeNumKeyPadMap = { export class BrowserDomAdapter extends GenericBrowserDomAdapter { parse(templateHtml: string) { throw new Error('parse not implemented'); } static makeCurrent() { setRootDomAdapter(new BrowserDomAdapter()); } - hasProperty(element: any /** TODO #9100 */, name: string): boolean { return name in element; } - setProperty(el: /*element*/ any, name: string, value: any) { el[name] = value; } - getProperty(el: /*element*/ any, name: string): any { return el[name]; } - invoke(el: /*element*/ any, methodName: string, args: any[]): any { - el[methodName].apply(el, args); - } + hasProperty(element: Node, name: string): boolean { return name in element; } + setProperty(el: Node, name: string, value: any) { (el)[name] = value; } + getProperty(el: Node, name: string): any { return (el)[name]; } + invoke(el: Node, methodName: string, args: any[]): any { (el)[methodName](...args); } // TODO(tbosch): move this into a separate environment class once we have it - logError(error: any /** TODO #9100 */) { - if (window.console.error) { - window.console.error(error); - } else { - window.console.log(error); - } + logError(error: string) { (window.console.error || window.console.log)(error); } + + log(error: string) { window.console.log(error); } + + logGroup(error: string) { + window.console.group && window.console.group(error); + this.logError(error); } - log(error: any /** TODO #9100 */) { window.console.log(error); } - - logGroup(error: any /** TODO #9100 */) { - if (window.console.group) { - window.console.group(error); - this.logError(error); - } else { - window.console.log(error); - } - } - - logGroupEnd() { - if (window.console.groupEnd) { - window.console.groupEnd(); - } - } + logGroupEnd() { window.console.groupEnd && window.console.groupEnd(); } get attrToPropMap(): any { return _attrToPropMap; } query(selector: string): any { return document.querySelector(selector); } - querySelector(el: any /** TODO #9100 */, selector: string): HTMLElement { - return el.querySelector(selector); + querySelector(el: Element, selector: string): HTMLElement { + return el.querySelector(selector) as HTMLElement; } - querySelectorAll(el: any /** TODO #9100 */, selector: string): any[] { - return el.querySelectorAll(selector); - } - on(el: any /** TODO #9100 */, evt: any /** TODO #9100 */, listener: any /** TODO #9100 */) { - el.addEventListener(evt, listener, false); - } - onAndCancel( - el: any /** TODO #9100 */, evt: any /** TODO #9100 */, - listener: any /** TODO #9100 */): Function { + querySelectorAll(el: any, selector: string): any[] { return el.querySelectorAll(selector); } + on(el: Node, evt: any, listener: any) { el.addEventListener(evt, listener, false); } + onAndCancel(el: Node, evt: any, listener: any): Function { el.addEventListener(evt, listener, false); // Needed to follow Dart's subscription semantic, until fix of // https://code.google.com/p/dart/issues/detail?id=17406 return () => { el.removeEventListener(evt, listener, false); }; } - dispatchEvent(el: any /** TODO #9100 */, evt: any /** TODO #9100 */) { el.dispatchEvent(evt); } + dispatchEvent(el: Node, evt: any) { el.dispatchEvent(evt); } createMouseEvent(eventType: string): MouseEvent { - var evt: MouseEvent = document.createEvent('MouseEvent'); + const evt: MouseEvent = document.createEvent('MouseEvent'); evt.initEvent(eventType, true, true); return evt; } - createEvent(eventType: any /** TODO #9100 */): Event { - var evt: Event = document.createEvent('Event'); + createEvent(eventType: any): Event { + const evt: Event = document.createEvent('Event'); evt.initEvent(eventType, true, true); return evt; } @@ -142,11 +120,11 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { isPrevented(evt: Event): boolean { return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue; } - getInnerHTML(el: any /** TODO #9100 */): string { return el.innerHTML; } - getTemplateContent(el: any /** TODO #9100 */): Node { + getInnerHTML(el: HTMLElement): string { return el.innerHTML; } + getTemplateContent(el: Node): Node { return 'content' in el && el instanceof HTMLTemplateElement ? el.content : null; } - getOuterHTML(el: any /** TODO #9100 */): string { return el.outerHTML; } + getOuterHTML(el: HTMLElement): string { return el.outerHTML; } nodeName(node: Node): string { return node.nodeName; } nodeValue(node: Node): string { return node.nodeValue; } type(node: HTMLInputElement): string { return node.type; } @@ -157,72 +135,62 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { return node; } } - firstChild(el: any /** TODO #9100 */): Node { return el.firstChild; } - nextSibling(el: any /** TODO #9100 */): Node { return el.nextSibling; } - parentElement(el: any /** TODO #9100 */): Node { return el.parentNode; } - childNodes(el: any /** TODO #9100 */): Node[] { return el.childNodes; } - childNodesAsList(el: any /** TODO #9100 */): any[] { - var childNodes = el.childNodes; - var res = new Array(childNodes.length); - for (var i = 0; i < childNodes.length; i++) { + firstChild(el: Node): Node { return el.firstChild; } + nextSibling(el: Node): Node { return el.nextSibling; } + parentElement(el: Node): Node { return el.parentNode; } + childNodes(el: any): Node[] { return el.childNodes; } + childNodesAsList(el: Node): any[] { + const childNodes = el.childNodes; + const res = new Array(childNodes.length); + for (let i = 0; i < childNodes.length; i++) { res[i] = childNodes[i]; } return res; } - clearNodes(el: any /** TODO #9100 */) { + clearNodes(el: Node) { while (el.firstChild) { el.removeChild(el.firstChild); } } - appendChild(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { el.appendChild(node); } - removeChild(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { el.removeChild(node); } - replaceChild(el: Node, newChild: any /** TODO #9100 */, oldChild: any /** TODO #9100 */) { - el.replaceChild(newChild, oldChild); - } - remove(node: any /** TODO #9100 */): Node { + appendChild(el: Node, node: Node) { el.appendChild(node); } + removeChild(el: Node, node: Node) { el.removeChild(node); } + replaceChild(el: Node, newChild: Node, oldChild: Node) { el.replaceChild(newChild, oldChild); } + remove(node: Node): Node { if (node.parentNode) { node.parentNode.removeChild(node); } return node; } - insertBefore(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { - el.parentNode.insertBefore(node, el); + insertBefore(el: Node, node: Node) { el.parentNode.insertBefore(node, el); } + insertAllBefore(el: Node, nodes: Node[]) { + nodes.forEach((n: any) => el.parentNode.insertBefore(n, el)); } - insertAllBefore(el: any /** TODO #9100 */, nodes: any /** TODO #9100 */) { - nodes.forEach((n: any /** TODO #9100 */) => el.parentNode.insertBefore(n, el)); - } - insertAfter(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { - el.parentNode.insertBefore(node, el.nextSibling); - } - setInnerHTML(el: any /** TODO #9100 */, value: any /** TODO #9100 */) { el.innerHTML = value; } - getText(el: any /** TODO #9100 */): string { return el.textContent; } - // TODO(vicb): removed Element type because it does not support StyleElement - setText(el: any /** TODO #9100 */, value: string) { el.textContent = value; } - getValue(el: any /** TODO #9100 */): string { return el.value; } - setValue(el: any /** TODO #9100 */, value: string) { el.value = value; } - getChecked(el: any /** TODO #9100 */): boolean { return el.checked; } - setChecked(el: any /** TODO #9100 */, value: boolean) { el.checked = value; } + insertAfter(el: Node, node: any) { el.parentNode.insertBefore(node, el.nextSibling); } + setInnerHTML(el: Element, value: string) { el.innerHTML = value; } + getText(el: Node): string { return el.textContent; } + setText(el: Node, value: string) { el.textContent = value; } + getValue(el: any): string { return el.value; } + setValue(el: any, value: string) { el.value = value; } + getChecked(el: any): boolean { return el.checked; } + setChecked(el: any, value: boolean) { el.checked = value; } createComment(text: string): Comment { return document.createComment(text); } - createTemplate(html: any /** TODO #9100 */): HTMLElement { - var t = document.createElement('template'); + createTemplate(html: any): HTMLElement { + const t = document.createElement('template'); t.innerHTML = html; return t; } - createElement(tagName: any /* TODO #9100 */, doc = document): HTMLElement { - return doc.createElement(tagName); - } - createElementNS(ns: any /* TODO #9100 */, tagName: any /* TODO #9100 */, doc = document): - Element { + createElement(tagName: string, doc = document): HTMLElement { return doc.createElement(tagName); } + createElementNS(ns: string, tagName: string, doc = document): Element { return doc.createElementNS(ns, tagName); } createTextNode(text: string, doc = document): Text { return doc.createTextNode(text); } createScriptTag(attrName: string, attrValue: string, doc = document): HTMLScriptElement { - var el = doc.createElement('SCRIPT'); + const el = doc.createElement('SCRIPT'); el.setAttribute(attrName, attrValue); return el; } createStyleElement(css: string, doc = document): HTMLStyleElement { - var style = doc.createElement('style'); + const style = doc.createElement('style'); this.appendChild(style, this.createTextNode(css)); return style; } @@ -230,77 +198,63 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { getShadowRoot(el: HTMLElement): DocumentFragment { return (el).shadowRoot; } getHost(el: HTMLElement): HTMLElement { return (el).host; } clone(node: Node): Node { return node.cloneNode(true); } - getElementsByClassName(element: any /** TODO #9100 */, name: string): HTMLElement[] { + getElementsByClassName(element: any, name: string): HTMLElement[] { return element.getElementsByClassName(name); } - getElementsByTagName(element: any /** TODO #9100 */, name: string): HTMLElement[] { + getElementsByTagName(element: any, name: string): HTMLElement[] { return element.getElementsByTagName(name); } - classList(element: any /** TODO #9100 */): any[] { - return Array.prototype.slice.call(element.classList, 0); - } - addClass(element: any /** TODO #9100 */, className: string) { element.classList.add(className); } - removeClass(element: any /** TODO #9100 */, className: string) { - element.classList.remove(className); - } - hasClass(element: any /** TODO #9100 */, className: string): boolean { + classList(element: any): any[] { return Array.prototype.slice.call(element.classList, 0); } + addClass(element: any, className: string) { element.classList.add(className); } + removeClass(element: any, className: string) { element.classList.remove(className); } + hasClass(element: any, className: string): boolean { return element.classList.contains(className); } - setStyle(element: any /** TODO #9100 */, styleName: string, styleValue: string) { + setStyle(element: any, styleName: string, styleValue: string) { element.style[styleName] = styleValue; } - removeStyle(element: any /** TODO #9100 */, stylename: string) { - element.style[stylename] = null; - } - getStyle(element: any /** TODO #9100 */, stylename: string): string { - return element.style[stylename]; - } - hasStyle(element: any /** TODO #9100 */, styleName: string, styleValue: string = null): boolean { - var value = this.getStyle(element, styleName) || ''; + removeStyle(element: any, stylename: string) { element.style[stylename] = null; } + getStyle(element: any, stylename: string): string { return element.style[stylename]; } + hasStyle(element: any, styleName: string, styleValue: string = null): boolean { + const value = this.getStyle(element, styleName) || ''; return styleValue ? value == styleValue : value.length > 0; } - tagName(element: any /** TODO #9100 */): string { return element.tagName; } - attributeMap(element: any /** TODO #9100 */): Map { - var res = new Map(); - var elAttrs = element.attributes; - for (var i = 0; i < elAttrs.length; i++) { - var attrib = elAttrs[i]; + tagName(element: any): string { return element.tagName; } + attributeMap(element: any): Map { + const res = new Map(); + const elAttrs = element.attributes; + for (let i = 0; i < elAttrs.length; i++) { + const attrib = elAttrs[i]; res.set(attrib.name, attrib.value); } return res; } - hasAttribute(element: any /** TODO #9100 */, attribute: string): boolean { + hasAttribute(element: Element, attribute: string): boolean { return element.hasAttribute(attribute); } - hasAttributeNS(element: any /** TODO #9100 */, ns: string, attribute: string): boolean { + hasAttributeNS(element: Element, ns: string, attribute: string): boolean { return element.hasAttributeNS(ns, attribute); } - getAttribute(element: any /** TODO #9100 */, attribute: string): string { + getAttribute(element: Element, attribute: string): string { return element.getAttribute(attribute); } - getAttributeNS(element: any /** TODO #9100 */, ns: string, name: string): string { + getAttributeNS(element: Element, ns: string, name: string): string { return element.getAttributeNS(ns, name); } - setAttribute(element: any /** TODO #9100 */, name: string, value: string) { - element.setAttribute(name, value); - } - setAttributeNS(element: any /** TODO #9100 */, ns: string, name: string, value: string) { + setAttribute(element: Element, name: string, value: string) { element.setAttribute(name, value); } + setAttributeNS(element: Element, ns: string, name: string, value: string) { element.setAttributeNS(ns, name, value); } - removeAttribute(element: any /** TODO #9100 */, attribute: string) { - element.removeAttribute(attribute); - } - removeAttributeNS(element: any /** TODO #9100 */, ns: string, name: string) { + removeAttribute(element: Element, attribute: string) { element.removeAttribute(attribute); } + removeAttributeNS(element: Element, ns: string, name: string) { element.removeAttributeNS(ns, name); } - templateAwareRoot(el: any /** TODO #9100 */): any { - return this.isTemplateElement(el) ? this.content(el) : el; - } + templateAwareRoot(el: Node): any { return this.isTemplateElement(el) ? this.content(el) : el; } createHtmlDocument(): HTMLDocument { return document.implementation.createHTMLDocument('fakeTitle'); } defaultDoc(): HTMLDocument { return document; } - getBoundingClientRect(el: any /** TODO #9100 */): any { + getBoundingClientRect(el: Element): any { try { return el.getBoundingClientRect(); } catch (e) { @@ -309,45 +263,34 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { } getTitle(): string { return document.title; } setTitle(newTitle: string) { document.title = newTitle || ''; } - elementMatches(n: any /** TODO #9100 */, selector: string): boolean { - var matches = false; + elementMatches(n: any, selector: string): boolean { if (n instanceof HTMLElement) { - if (n.matches) { - matches = n.matches(selector); - } else if (n.msMatchesSelector) { - matches = n.msMatchesSelector(selector); - } else if (n.webkitMatchesSelector) { - matches = n.webkitMatchesSelector(selector); - } + return n.matches && n.matches(selector) || + n.msMatchesSelector && n.msMatchesSelector(selector) || + n.webkitMatchesSelector && n.webkitMatchesSelector(selector); } - return matches; + + return false; } - isTemplateElement(el: any): boolean { + isTemplateElement(el: Node): boolean { return el instanceof HTMLElement && el.nodeName == 'TEMPLATE'; } isTextNode(node: Node): boolean { return node.nodeType === Node.TEXT_NODE; } isCommentNode(node: Node): boolean { return node.nodeType === Node.COMMENT_NODE; } isElementNode(node: Node): boolean { return node.nodeType === Node.ELEMENT_NODE; } - hasShadowRoot(node: any /** TODO #9100 */): boolean { + hasShadowRoot(node: any): boolean { return isPresent(node.shadowRoot) && node instanceof HTMLElement; } - isShadowRoot(node: any /** TODO #9100 */): boolean { return node instanceof DocumentFragment; } - importIntoDoc(node: Node): any { - var toImport = node; - if (this.isTemplateElement(node)) { - toImport = this.content(node); - } - return document.importNode(toImport, true); - } + isShadowRoot(node: any): boolean { return node instanceof DocumentFragment; } + importIntoDoc(node: Node): any { return document.importNode(this.templateAwareRoot(node), true); } adoptNode(node: Node): any { return document.adoptNode(node); } getHref(el: Element): string { return (el).href; } - getEventKey(event: any /** TODO #9100 */): string { - var key = event.key; + getEventKey(event: any): string { + let key = event.key; if (isBlank(key)) { key = event.keyIdentifier; // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and - // Safari - // cf + // Safari cf // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces if (isBlank(key)) { return 'Unidentified'; @@ -358,53 +301,49 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { // There is a bug in Chrome for numeric keypad keys: // https://code.google.com/p/chromium/issues/detail?id=155654 // 1, 2, 3 ... are reported as A, B, C ... - key = (_chromeNumKeyPadMap as any /** TODO #9100 */)[key]; + key = (_chromeNumKeyPadMap as any)[key]; } } } - if (_keyMap.hasOwnProperty(key)) { - key = (_keyMap as any /** TODO #9100 */)[key]; - } - return key; + + return _keyMap[key] || key; } getGlobalEventTarget(target: string): EventTarget { - if (target == 'window') { + if (target === 'window') { return window; - } else if (target == 'document') { + } + if (target === 'document') { return document; - } else if (target == 'body') { + } + if (target === 'body') { return document.body; } } getHistory(): History { return window.history; } getLocation(): Location { return window.location; } getBaseHref(): string { - var href = getBaseElementHref(); - if (isBlank(href)) { - return null; - } - return relativePath(href); + const href = getBaseElementHref(); + return isBlank(href) ? null : relativePath(href); } resetBaseElement(): void { baseElement = null; } getUserAgent(): string { return window.navigator.userAgent; } - setData(element: any /** TODO #9100 */, name: string, value: string) { + setData(element: Element, name: string, value: string) { this.setAttribute(element, 'data-' + name, value); } - getData(element: any /** TODO #9100 */, name: string): string { + getData(element: Element, name: string): string { return this.getAttribute(element, 'data-' + name); } - getComputedStyle(element: any /** TODO #9100 */): any { return getComputedStyle(element); } + getComputedStyle(element: any): any { return getComputedStyle(element); } // TODO(tbosch): move this into a separate environment class once we have it setGlobalVar(path: string, value: any) { setValueOnPath(global, path, value); } - supportsWebAnimation(): boolean { return isFunction((Element).prototype['animate']); } + supportsWebAnimation(): boolean { + return typeof(Element).prototype['animate'] === 'function'; + } performanceNow(): number { // performance.now() is not available in all browsers, see // http://caniuse.com/#search=performance.now - if (isPresent(window.performance) && isPresent(window.performance.now)) { - return window.performance.now(); - } else { - return DateWrapper.toMillis(DateWrapper.now()); - } + return window.performance && window.performance.now ? window.performance.now() : + new Date().getTime(); } supportsCookies(): boolean { return true; } @@ -418,12 +357,11 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { } } - -var baseElement: any /** TODO #9100 */ = null; +let baseElement: HTMLElement = null; function getBaseElementHref(): string { - if (isBlank(baseElement)) { + if (!baseElement) { baseElement = document.querySelector('base'); - if (isBlank(baseElement)) { + if (!baseElement) { return null; } } @@ -431,9 +369,9 @@ function getBaseElementHref(): string { } // based on urlUtils.js in AngularJS 1 -var urlParsingNode: any /** TODO #9100 */ = null; -function relativePath(url: any /** TODO #9100 */): string { - if (isBlank(urlParsingNode)) { +let urlParsingNode: any; +function relativePath(url: any): string { + if (!urlParsingNode) { urlParsingNode = document.createElement('a'); } urlParsingNode.setAttribute('href', url); diff --git a/modules/@angular/platform-browser/src/browser/generic_browser_adapter.ts b/modules/@angular/platform-browser/src/browser/generic_browser_adapter.ts index b0480e651c..60b4230851 100644 --- a/modules/@angular/platform-browser/src/browser/generic_browser_adapter.ts +++ b/modules/@angular/platform-browser/src/browser/generic_browser_adapter.ts @@ -7,8 +7,7 @@ */ import {DomAdapter} from '../dom/dom_adapter'; -import {StringMapWrapper} from '../facade/collection'; -import {isFunction, isPresent} from '../facade/lang'; +import {isPresent} from '../facade/lang'; @@ -24,27 +23,30 @@ export abstract class GenericBrowserDomAdapter extends DomAdapter { constructor() { super(); try { - var element = this.createElement('div', this.defaultDoc()); + const element = this.createElement('div', this.defaultDoc()); if (isPresent(this.getStyle(element, 'animationName'))) { this._animationPrefix = ''; } else { - var domPrefixes = ['Webkit', 'Moz', 'O', 'ms']; - for (var i = 0; i < domPrefixes.length; i++) { + const domPrefixes = ['Webkit', 'Moz', 'O', 'ms']; + + for (let i = 0; i < domPrefixes.length; i++) { if (isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) { this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-'; break; } } } - var transEndEventNames: {[key: string]: string} = { + + const transEndEventNames: {[key: string]: string} = { WebkitTransition: 'webkitTransitionEnd', MozTransition: 'transitionend', OTransition: 'oTransitionEnd otransitionend', transition: 'transitionend' }; - StringMapWrapper.forEach(transEndEventNames, (value: string, key: string) => { + + Object.keys(transEndEventNames).forEach((key: string) => { if (isPresent(this.getStyle(element, key))) { - this._transitionEnd = value; + this._transitionEnd = transEndEventNames[key]; } }); } catch (e) { @@ -59,12 +61,10 @@ export abstract class GenericBrowserDomAdapter extends DomAdapter { } supportsDOMEvents(): boolean { return true; } supportsNativeShadowDOM(): boolean { - return isFunction((this.defaultDoc().body).createShadowRoot); + return typeof(this.defaultDoc().body).createShadowRoot === 'function'; } - getAnimationPrefix(): string { - return isPresent(this._animationPrefix) ? this._animationPrefix : ''; - } - getTransitionEnd(): string { return isPresent(this._transitionEnd) ? this._transitionEnd : ''; } + getAnimationPrefix(): string { return this._animationPrefix ? this._animationPrefix : ''; } + getTransitionEnd(): string { return this._transitionEnd ? this._transitionEnd : ''; } supportsAnimation(): boolean { return isPresent(this._animationPrefix) && isPresent(this._transitionEnd); } diff --git a/modules/@angular/platform-browser/src/dom/dom_adapter.ts b/modules/@angular/platform-browser/src/dom/dom_adapter.ts index ac16c914a5..9682584b28 100644 --- a/modules/@angular/platform-browser/src/dom/dom_adapter.ts +++ b/modules/@angular/platform-browser/src/dom/dom_adapter.ts @@ -8,7 +8,7 @@ import {Type} from '@angular/core'; -var _DOM: DomAdapter = null; +let _DOM: DomAdapter = null; export function getDOM() { return _DOM;