refactor(BrowserAdapter): cleanup

This commit is contained in:
Victor Berchet 2016-09-27 17:30:26 -07:00 committed by Chuck Jazdzewski
parent 1c012a035f
commit ca3f9926f9
3 changed files with 137 additions and 199 deletions

View File

@ -7,21 +7,21 @@
*/ */
import {setRootDomAdapter} from '../dom/dom_adapter'; 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'; import {GenericBrowserDomAdapter} from './generic_browser_adapter';
var _attrToPropMap = { const _attrToPropMap = {
'class': 'className', 'class': 'className',
'innerHtml': 'innerHTML', 'innerHtml': 'innerHTML',
'readonly': 'readOnly', 'readonly': 'readOnly',
'tabindex': 'tabIndex' 'tabindex': 'tabIndex',
}; };
const DOM_KEY_LOCATION_NUMPAD = 3; const DOM_KEY_LOCATION_NUMPAD = 3;
// Map to convert some key or keyIdentifier values to what will be returned by getEventKey // 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 // 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/ // cf http://www.w3.org/TR/DOM-Level-3-Events-key/
'\b': 'Backspace', '\b': 'Backspace',
@ -42,7 +42,7 @@ var _keyMap = {
// There is a bug in Chrome for numeric keypad keys: // There is a bug in Chrome for numeric keypad keys:
// https://code.google.com/p/chromium/issues/detail?id=155654 // https://code.google.com/p/chromium/issues/detail?id=155654
// 1, 2, 3 ... are reported as A, B, C ... // 1, 2, 3 ... are reported as A, B, C ...
var _chromeNumKeyPadMap = { const _chromeNumKeyPadMap = {
'A': '1', 'A': '1',
'B': '2', 'B': '2',
'C': '3', 'C': '3',
@ -71,67 +71,45 @@ var _chromeNumKeyPadMap = {
export class BrowserDomAdapter extends GenericBrowserDomAdapter { export class BrowserDomAdapter extends GenericBrowserDomAdapter {
parse(templateHtml: string) { throw new Error('parse not implemented'); } parse(templateHtml: string) { throw new Error('parse not implemented'); }
static makeCurrent() { setRootDomAdapter(new BrowserDomAdapter()); } static makeCurrent() { setRootDomAdapter(new BrowserDomAdapter()); }
hasProperty(element: any /** TODO #9100 */, name: string): boolean { return name in element; } hasProperty(element: Node, name: string): boolean { return name in element; }
setProperty(el: /*element*/ any, name: string, value: any) { el[name] = value; } setProperty(el: Node, name: string, value: any) { (<any>el)[name] = value; }
getProperty(el: /*element*/ any, name: string): any { return el[name]; } getProperty(el: Node, name: string): any { return (<any>el)[name]; }
invoke(el: /*element*/ any, methodName: string, args: any[]): any { invoke(el: Node, methodName: string, args: any[]): any { (<any>el)[methodName](...args); }
el[methodName].apply(el, args);
}
// TODO(tbosch): move this into a separate environment class once we have it // TODO(tbosch): move this into a separate environment class once we have it
logError(error: any /** TODO #9100 */) { logError(error: string) { (window.console.error || window.console.log)(error); }
if (window.console.error) {
window.console.error(error); log(error: string) { window.console.log(error); }
} else {
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); } logGroupEnd() { window.console.groupEnd && window.console.groupEnd(); }
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();
}
}
get attrToPropMap(): any { return _attrToPropMap; } get attrToPropMap(): any { return _attrToPropMap; }
query(selector: string): any { return document.querySelector(selector); } query(selector: string): any { return document.querySelector(selector); }
querySelector(el: any /** TODO #9100 */, selector: string): HTMLElement { querySelector(el: Element, selector: string): HTMLElement {
return el.querySelector(selector); return el.querySelector(selector) as HTMLElement;
} }
querySelectorAll(el: any /** TODO #9100 */, selector: string): any[] { querySelectorAll(el: any, selector: string): any[] { return el.querySelectorAll(selector); }
return el.querySelectorAll(selector); on(el: Node, evt: any, listener: any) { el.addEventListener(evt, listener, false); }
} onAndCancel(el: Node, evt: any, listener: any): Function {
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 {
el.addEventListener(evt, listener, false); el.addEventListener(evt, listener, false);
// Needed to follow Dart's subscription semantic, until fix of // Needed to follow Dart's subscription semantic, until fix of
// https://code.google.com/p/dart/issues/detail?id=17406 // https://code.google.com/p/dart/issues/detail?id=17406
return () => { el.removeEventListener(evt, listener, false); }; 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 { createMouseEvent(eventType: string): MouseEvent {
var evt: MouseEvent = document.createEvent('MouseEvent'); const evt: MouseEvent = document.createEvent('MouseEvent');
evt.initEvent(eventType, true, true); evt.initEvent(eventType, true, true);
return evt; return evt;
} }
createEvent(eventType: any /** TODO #9100 */): Event { createEvent(eventType: any): Event {
var evt: Event = document.createEvent('Event'); const evt: Event = document.createEvent('Event');
evt.initEvent(eventType, true, true); evt.initEvent(eventType, true, true);
return evt; return evt;
} }
@ -142,11 +120,11 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
isPrevented(evt: Event): boolean { isPrevented(evt: Event): boolean {
return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue; return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue;
} }
getInnerHTML(el: any /** TODO #9100 */): string { return el.innerHTML; } getInnerHTML(el: HTMLElement): string { return el.innerHTML; }
getTemplateContent(el: any /** TODO #9100 */): Node { getTemplateContent(el: Node): Node {
return 'content' in el && el instanceof HTMLTemplateElement ? el.content : null; 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; } nodeName(node: Node): string { return node.nodeName; }
nodeValue(node: Node): string { return node.nodeValue; } nodeValue(node: Node): string { return node.nodeValue; }
type(node: HTMLInputElement): string { return node.type; } type(node: HTMLInputElement): string { return node.type; }
@ -157,72 +135,62 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
return node; return node;
} }
} }
firstChild(el: any /** TODO #9100 */): Node { return el.firstChild; } firstChild(el: Node): Node { return el.firstChild; }
nextSibling(el: any /** TODO #9100 */): Node { return el.nextSibling; } nextSibling(el: Node): Node { return el.nextSibling; }
parentElement(el: any /** TODO #9100 */): Node { return el.parentNode; } parentElement(el: Node): Node { return el.parentNode; }
childNodes(el: any /** TODO #9100 */): Node[] { return el.childNodes; } childNodes(el: any): Node[] { return el.childNodes; }
childNodesAsList(el: any /** TODO #9100 */): any[] { childNodesAsList(el: Node): any[] {
var childNodes = el.childNodes; const childNodes = el.childNodes;
var res = new Array(childNodes.length); const res = new Array(childNodes.length);
for (var i = 0; i < childNodes.length; i++) { for (let i = 0; i < childNodes.length; i++) {
res[i] = childNodes[i]; res[i] = childNodes[i];
} }
return res; return res;
} }
clearNodes(el: any /** TODO #9100 */) { clearNodes(el: Node) {
while (el.firstChild) { while (el.firstChild) {
el.removeChild(el.firstChild); el.removeChild(el.firstChild);
} }
} }
appendChild(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { el.appendChild(node); } appendChild(el: Node, node: Node) { el.appendChild(node); }
removeChild(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { el.removeChild(node); } removeChild(el: Node, node: Node) { el.removeChild(node); }
replaceChild(el: Node, newChild: any /** TODO #9100 */, oldChild: any /** TODO #9100 */) { replaceChild(el: Node, newChild: Node, oldChild: Node) { el.replaceChild(newChild, oldChild); }
el.replaceChild(newChild, oldChild); remove(node: Node): Node {
}
remove(node: any /** TODO #9100 */): Node {
if (node.parentNode) { if (node.parentNode) {
node.parentNode.removeChild(node); node.parentNode.removeChild(node);
} }
return node; return node;
} }
insertBefore(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { insertBefore(el: Node, node: Node) { el.parentNode.insertBefore(node, el); }
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 */) { insertAfter(el: Node, node: any) { el.parentNode.insertBefore(node, el.nextSibling); }
nodes.forEach((n: any /** TODO #9100 */) => el.parentNode.insertBefore(n, el)); setInnerHTML(el: Element, value: string) { el.innerHTML = value; }
} getText(el: Node): string { return el.textContent; }
insertAfter(el: any /** TODO #9100 */, node: any /** TODO #9100 */) { setText(el: Node, value: string) { el.textContent = value; }
el.parentNode.insertBefore(node, el.nextSibling); getValue(el: any): string { return el.value; }
} setValue(el: any, value: string) { el.value = value; }
setInnerHTML(el: any /** TODO #9100 */, value: any /** TODO #9100 */) { el.innerHTML = value; } getChecked(el: any): boolean { return el.checked; }
getText(el: any /** TODO #9100 */): string { return el.textContent; } setChecked(el: any, value: boolean) { el.checked = value; }
// 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; }
createComment(text: string): Comment { return document.createComment(text); } createComment(text: string): Comment { return document.createComment(text); }
createTemplate(html: any /** TODO #9100 */): HTMLElement { createTemplate(html: any): HTMLElement {
var t = document.createElement('template'); const t = document.createElement('template');
t.innerHTML = html; t.innerHTML = html;
return t; return t;
} }
createElement(tagName: any /* TODO #9100 */, doc = document): HTMLElement { createElement(tagName: string, doc = document): HTMLElement { return doc.createElement(tagName); }
return doc.createElement(tagName); createElementNS(ns: string, tagName: string, doc = document): Element {
}
createElementNS(ns: any /* TODO #9100 */, tagName: any /* TODO #9100 */, doc = document):
Element {
return doc.createElementNS(ns, tagName); return doc.createElementNS(ns, tagName);
} }
createTextNode(text: string, doc = document): Text { return doc.createTextNode(text); } createTextNode(text: string, doc = document): Text { return doc.createTextNode(text); }
createScriptTag(attrName: string, attrValue: string, doc = document): HTMLScriptElement { createScriptTag(attrName: string, attrValue: string, doc = document): HTMLScriptElement {
var el = <HTMLScriptElement>doc.createElement('SCRIPT'); const el = <HTMLScriptElement>doc.createElement('SCRIPT');
el.setAttribute(attrName, attrValue); el.setAttribute(attrName, attrValue);
return el; return el;
} }
createStyleElement(css: string, doc = document): HTMLStyleElement { createStyleElement(css: string, doc = document): HTMLStyleElement {
var style = <HTMLStyleElement>doc.createElement('style'); const style = <HTMLStyleElement>doc.createElement('style');
this.appendChild(style, this.createTextNode(css)); this.appendChild(style, this.createTextNode(css));
return style; return style;
} }
@ -230,77 +198,63 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
getShadowRoot(el: HTMLElement): DocumentFragment { return (<any>el).shadowRoot; } getShadowRoot(el: HTMLElement): DocumentFragment { return (<any>el).shadowRoot; }
getHost(el: HTMLElement): HTMLElement { return (<any>el).host; } getHost(el: HTMLElement): HTMLElement { return (<any>el).host; }
clone(node: Node): Node { return node.cloneNode(true); } 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); return element.getElementsByClassName(name);
} }
getElementsByTagName(element: any /** TODO #9100 */, name: string): HTMLElement[] { getElementsByTagName(element: any, name: string): HTMLElement[] {
return element.getElementsByTagName(name); return element.getElementsByTagName(name);
} }
classList(element: any /** TODO #9100 */): any[] { classList(element: any): any[] { return Array.prototype.slice.call(element.classList, 0); }
return <any[]>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); }
addClass(element: any /** TODO #9100 */, className: string) { element.classList.add(className); } hasClass(element: any, className: string): boolean {
removeClass(element: any /** TODO #9100 */, className: string) {
element.classList.remove(className);
}
hasClass(element: any /** TODO #9100 */, className: string): boolean {
return element.classList.contains(className); 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; element.style[styleName] = styleValue;
} }
removeStyle(element: any /** TODO #9100 */, stylename: string) { removeStyle(element: any, stylename: string) { element.style[stylename] = null; }
element.style[stylename] = null; getStyle(element: any, stylename: string): string { return element.style[stylename]; }
} hasStyle(element: any, styleName: string, styleValue: string = null): boolean {
getStyle(element: any /** TODO #9100 */, stylename: string): string { const value = this.getStyle(element, styleName) || '';
return element.style[stylename];
}
hasStyle(element: any /** TODO #9100 */, styleName: string, styleValue: string = null): boolean {
var value = this.getStyle(element, styleName) || '';
return styleValue ? value == styleValue : value.length > 0; return styleValue ? value == styleValue : value.length > 0;
} }
tagName(element: any /** TODO #9100 */): string { return element.tagName; } tagName(element: any): string { return element.tagName; }
attributeMap(element: any /** TODO #9100 */): Map<string, string> { attributeMap(element: any): Map<string, string> {
var res = new Map<string, string>(); const res = new Map<string, string>();
var elAttrs = element.attributes; const elAttrs = element.attributes;
for (var i = 0; i < elAttrs.length; i++) { for (let i = 0; i < elAttrs.length; i++) {
var attrib = elAttrs[i]; const attrib = elAttrs[i];
res.set(attrib.name, attrib.value); res.set(attrib.name, attrib.value);
} }
return res; return res;
} }
hasAttribute(element: any /** TODO #9100 */, attribute: string): boolean { hasAttribute(element: Element, attribute: string): boolean {
return element.hasAttribute(attribute); 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); return element.hasAttributeNS(ns, attribute);
} }
getAttribute(element: any /** TODO #9100 */, attribute: string): string { getAttribute(element: Element, attribute: string): string {
return element.getAttribute(attribute); 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); return element.getAttributeNS(ns, name);
} }
setAttribute(element: any /** TODO #9100 */, name: string, value: string) { setAttribute(element: Element, name: string, value: string) { element.setAttribute(name, value); }
element.setAttribute(name, value); setAttributeNS(element: Element, ns: string, name: string, value: string) {
}
setAttributeNS(element: any /** TODO #9100 */, ns: string, name: string, value: string) {
element.setAttributeNS(ns, name, value); element.setAttributeNS(ns, name, value);
} }
removeAttribute(element: any /** TODO #9100 */, attribute: string) { removeAttribute(element: Element, attribute: string) { element.removeAttribute(attribute); }
element.removeAttribute(attribute); removeAttributeNS(element: Element, ns: string, name: string) {
}
removeAttributeNS(element: any /** TODO #9100 */, ns: string, name: string) {
element.removeAttributeNS(ns, name); element.removeAttributeNS(ns, name);
} }
templateAwareRoot(el: any /** TODO #9100 */): any { templateAwareRoot(el: Node): any { return this.isTemplateElement(el) ? this.content(el) : el; }
return this.isTemplateElement(el) ? this.content(el) : el;
}
createHtmlDocument(): HTMLDocument { createHtmlDocument(): HTMLDocument {
return document.implementation.createHTMLDocument('fakeTitle'); return document.implementation.createHTMLDocument('fakeTitle');
} }
defaultDoc(): HTMLDocument { return document; } defaultDoc(): HTMLDocument { return document; }
getBoundingClientRect(el: any /** TODO #9100 */): any { getBoundingClientRect(el: Element): any {
try { try {
return el.getBoundingClientRect(); return el.getBoundingClientRect();
} catch (e) { } catch (e) {
@ -309,45 +263,34 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
} }
getTitle(): string { return document.title; } getTitle(): string { return document.title; }
setTitle(newTitle: string) { document.title = newTitle || ''; } setTitle(newTitle: string) { document.title = newTitle || ''; }
elementMatches(n: any /** TODO #9100 */, selector: string): boolean { elementMatches(n: any, selector: string): boolean {
var matches = false;
if (n instanceof HTMLElement) { if (n instanceof HTMLElement) {
if (n.matches) { return n.matches && n.matches(selector) ||
matches = n.matches(selector); n.msMatchesSelector && n.msMatchesSelector(selector) ||
} else if (n.msMatchesSelector) { n.webkitMatchesSelector && n.webkitMatchesSelector(selector);
matches = n.msMatchesSelector(selector);
} else if (n.webkitMatchesSelector) {
matches = n.webkitMatchesSelector(selector);
}
} }
return matches;
return false;
} }
isTemplateElement(el: any): boolean { isTemplateElement(el: Node): boolean {
return el instanceof HTMLElement && el.nodeName == 'TEMPLATE'; return el instanceof HTMLElement && el.nodeName == 'TEMPLATE';
} }
isTextNode(node: Node): boolean { return node.nodeType === Node.TEXT_NODE; } isTextNode(node: Node): boolean { return node.nodeType === Node.TEXT_NODE; }
isCommentNode(node: Node): boolean { return node.nodeType === Node.COMMENT_NODE; } isCommentNode(node: Node): boolean { return node.nodeType === Node.COMMENT_NODE; }
isElementNode(node: Node): boolean { return node.nodeType === Node.ELEMENT_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; return isPresent(node.shadowRoot) && node instanceof HTMLElement;
} }
isShadowRoot(node: any /** TODO #9100 */): boolean { return node instanceof DocumentFragment; } isShadowRoot(node: any): boolean { return node instanceof DocumentFragment; }
importIntoDoc(node: Node): any { importIntoDoc(node: Node): any { return document.importNode(this.templateAwareRoot(node), true); }
var toImport = node;
if (this.isTemplateElement(node)) {
toImport = this.content(node);
}
return document.importNode(toImport, true);
}
adoptNode(node: Node): any { return document.adoptNode(node); } adoptNode(node: Node): any { return document.adoptNode(node); }
getHref(el: Element): string { return (<any>el).href; } getHref(el: Element): string { return (<any>el).href; }
getEventKey(event: any /** TODO #9100 */): string { getEventKey(event: any): string {
var key = event.key; let key = event.key;
if (isBlank(key)) { if (isBlank(key)) {
key = event.keyIdentifier; key = event.keyIdentifier;
// keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and
// Safari // Safari cf
// cf
// http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces
if (isBlank(key)) { if (isBlank(key)) {
return 'Unidentified'; return 'Unidentified';
@ -358,53 +301,49 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
// There is a bug in Chrome for numeric keypad keys: // There is a bug in Chrome for numeric keypad keys:
// https://code.google.com/p/chromium/issues/detail?id=155654 // https://code.google.com/p/chromium/issues/detail?id=155654
// 1, 2, 3 ... are reported as A, B, C ... // 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 _keyMap[key] || key;
}
return key;
} }
getGlobalEventTarget(target: string): EventTarget { getGlobalEventTarget(target: string): EventTarget {
if (target == 'window') { if (target === 'window') {
return window; return window;
} else if (target == 'document') { }
if (target === 'document') {
return document; return document;
} else if (target == 'body') { }
if (target === 'body') {
return document.body; return document.body;
} }
} }
getHistory(): History { return window.history; } getHistory(): History { return window.history; }
getLocation(): Location { return window.location; } getLocation(): Location { return window.location; }
getBaseHref(): string { getBaseHref(): string {
var href = getBaseElementHref(); const href = getBaseElementHref();
if (isBlank(href)) { return isBlank(href) ? null : relativePath(href);
return null;
}
return relativePath(href);
} }
resetBaseElement(): void { baseElement = null; } resetBaseElement(): void { baseElement = null; }
getUserAgent(): string { return window.navigator.userAgent; } 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); 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); 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 // TODO(tbosch): move this into a separate environment class once we have it
setGlobalVar(path: string, value: any) { setValueOnPath(global, path, value); } setGlobalVar(path: string, value: any) { setValueOnPath(global, path, value); }
supportsWebAnimation(): boolean { return isFunction((<any>Element).prototype['animate']); } supportsWebAnimation(): boolean {
return typeof(<any>Element).prototype['animate'] === 'function';
}
performanceNow(): number { performanceNow(): number {
// performance.now() is not available in all browsers, see // performance.now() is not available in all browsers, see
// http://caniuse.com/#search=performance.now // http://caniuse.com/#search=performance.now
if (isPresent(window.performance) && isPresent(window.performance.now)) { return window.performance && window.performance.now ? window.performance.now() :
return window.performance.now(); new Date().getTime();
} else {
return DateWrapper.toMillis(DateWrapper.now());
}
} }
supportsCookies(): boolean { return true; } supportsCookies(): boolean { return true; }
@ -418,12 +357,11 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
} }
} }
let baseElement: HTMLElement = null;
var baseElement: any /** TODO #9100 */ = null;
function getBaseElementHref(): string { function getBaseElementHref(): string {
if (isBlank(baseElement)) { if (!baseElement) {
baseElement = document.querySelector('base'); baseElement = document.querySelector('base');
if (isBlank(baseElement)) { if (!baseElement) {
return null; return null;
} }
} }
@ -431,9 +369,9 @@ function getBaseElementHref(): string {
} }
// based on urlUtils.js in AngularJS 1 // based on urlUtils.js in AngularJS 1
var urlParsingNode: any /** TODO #9100 */ = null; let urlParsingNode: any;
function relativePath(url: any /** TODO #9100 */): string { function relativePath(url: any): string {
if (isBlank(urlParsingNode)) { if (!urlParsingNode) {
urlParsingNode = document.createElement('a'); urlParsingNode = document.createElement('a');
} }
urlParsingNode.setAttribute('href', url); urlParsingNode.setAttribute('href', url);

View File

@ -7,8 +7,7 @@
*/ */
import {DomAdapter} from '../dom/dom_adapter'; import {DomAdapter} from '../dom/dom_adapter';
import {StringMapWrapper} from '../facade/collection'; import {isPresent} from '../facade/lang';
import {isFunction, isPresent} from '../facade/lang';
@ -24,27 +23,30 @@ export abstract class GenericBrowserDomAdapter extends DomAdapter {
constructor() { constructor() {
super(); super();
try { try {
var element = this.createElement('div', this.defaultDoc()); const element = this.createElement('div', this.defaultDoc());
if (isPresent(this.getStyle(element, 'animationName'))) { if (isPresent(this.getStyle(element, 'animationName'))) {
this._animationPrefix = ''; this._animationPrefix = '';
} else { } else {
var domPrefixes = ['Webkit', 'Moz', 'O', 'ms']; const domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];
for (var i = 0; i < domPrefixes.length; i++) {
for (let i = 0; i < domPrefixes.length; i++) {
if (isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) { if (isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) {
this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-'; this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';
break; break;
} }
} }
} }
var transEndEventNames: {[key: string]: string} = {
const transEndEventNames: {[key: string]: string} = {
WebkitTransition: 'webkitTransitionEnd', WebkitTransition: 'webkitTransitionEnd',
MozTransition: 'transitionend', MozTransition: 'transitionend',
OTransition: 'oTransitionEnd otransitionend', OTransition: 'oTransitionEnd otransitionend',
transition: 'transitionend' transition: 'transitionend'
}; };
StringMapWrapper.forEach(transEndEventNames, (value: string, key: string) => {
Object.keys(transEndEventNames).forEach((key: string) => {
if (isPresent(this.getStyle(element, key))) { if (isPresent(this.getStyle(element, key))) {
this._transitionEnd = value; this._transitionEnd = transEndEventNames[key];
} }
}); });
} catch (e) { } catch (e) {
@ -59,12 +61,10 @@ export abstract class GenericBrowserDomAdapter extends DomAdapter {
} }
supportsDOMEvents(): boolean { return true; } supportsDOMEvents(): boolean { return true; }
supportsNativeShadowDOM(): boolean { supportsNativeShadowDOM(): boolean {
return isFunction((<any>this.defaultDoc().body).createShadowRoot); return typeof(<any>this.defaultDoc().body).createShadowRoot === 'function';
} }
getAnimationPrefix(): string { getAnimationPrefix(): string { return this._animationPrefix ? this._animationPrefix : ''; }
return isPresent(this._animationPrefix) ? this._animationPrefix : ''; getTransitionEnd(): string { return this._transitionEnd ? this._transitionEnd : ''; }
}
getTransitionEnd(): string { return isPresent(this._transitionEnd) ? this._transitionEnd : ''; }
supportsAnimation(): boolean { supportsAnimation(): boolean {
return isPresent(this._animationPrefix) && isPresent(this._transitionEnd); return isPresent(this._animationPrefix) && isPresent(this._transitionEnd);
} }

View File

@ -8,7 +8,7 @@
import {Type} from '@angular/core'; import {Type} from '@angular/core';
var _DOM: DomAdapter = null; let _DOM: DomAdapter = null;
export function getDOM() { export function getDOM() {
return _DOM; return _DOM;