refactor(BrowserAdapter): cleanup
This commit is contained in:
parent
1c012a035f
commit
ca3f9926f9
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user