From 5f398d14350401be5e9f5823d86aec98b0a8b8e3 Mon Sep 17 00:00:00 2001 From: Jeremy Elbourn Date: Wed, 6 Apr 2016 11:35:17 -0700 Subject: [PATCH] chore: remove facades and dart-specific patterns --- package.json | 2 +- src/components/button/button.spec.ts | 8 +- src/components/button/button.ts | 3 +- src/components/card/card.ts | 4 +- src/components/checkbox/checkbox.spec.ts | 12 +- src/components/checkbox/checkbox.ts | 9 +- src/components/input/input.spec.ts | 8 +- src/components/input/input.ts | 22 +- src/components/list/list.spec.ts | 8 +- src/components/list/list.ts | 3 +- .../progress-circle/progress-circle.spec.ts | 16 +- .../progress-circle/progress-circle.ts | 18 +- src/components/radio/radio.spec.ts | 12 +- src/components/radio/radio.ts | 5 +- src/components/sidenav/sidenav.spec.ts | 13 +- src/components/sidenav/sidenav.ts | 32 +- src/components/toolbar/toolbar.spec.ts | 9 +- src/core/annotations/field-value.ts | 7 +- src/core/annotations/one-of.ts | 33 - src/core/core.ts | 6 - src/core/facade/html.ts | 4 - src/core/facade/test_injector.ts | 157 ----- src/core/facade/testing.ts | 8 - src/core/overlay/overlay-container.ts | 8 +- src/core/overlay/overlay.spec.ts | 22 +- src/core/overlay/overlay.ts | 18 +- .../position/global-position-strategy.spec.ts | 15 +- .../position/global-position-strategy.ts | 15 +- src/core/platform/browser/browser_adapter.ts | 622 ------------------ .../browser/generic_browser_adapter.ts | 77 --- src/core/platform/dom/dom_adapter.ts | 259 -------- src/core/portal/dom-portal-host.ts | 4 +- src/core/portal/portal-directives.ts | 38 +- src/core/portal/portal.spec.ts | 15 +- src/core/rtl/dir.ts | 15 +- src/main.ts | 3 - 36 files changed, 127 insertions(+), 1383 deletions(-) delete mode 100644 src/core/annotations/one-of.ts delete mode 100644 src/core/facade/html.ts delete mode 100644 src/core/facade/test_injector.ts delete mode 100644 src/core/facade/testing.ts delete mode 100644 src/core/platform/browser/browser_adapter.ts delete mode 100644 src/core/platform/browser/generic_browser_adapter.ts delete mode 100644 src/core/platform/dom/dom_adapter.ts diff --git a/package.json b/package.json index 2f1d59714f5..44dfd924af0 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "symlink-or-copy": "^1.0.1", "ts-node": "^0.5.5", "tslint": "^3.5.0", - "typescript": "^1.7.5", + "typescript": "^1.8.0", "typings": "^0.6.8", "which": "^1.2.4" } diff --git a/src/components/button/button.spec.ts b/src/components/button/button.spec.ts index 0db88952f4a..916fd15c2f4 100644 --- a/src/components/button/button.spec.ts +++ b/src/components/button/button.spec.ts @@ -1,13 +1,11 @@ -import { - inject, - TestComponentBuilder -} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + inject, + TestComponentBuilder +} from 'angular2/testing'; import {Component} from 'angular2/core'; import {By} from 'angular2/platform/browser'; diff --git a/src/components/button/button.ts b/src/components/button/button.ts index 7ea362b12c6..5e9bcd85ea4 100644 --- a/src/components/button/button.ts +++ b/src/components/button/button.ts @@ -8,7 +8,6 @@ import { ElementRef, Renderer, } from 'angular2/core'; -import {TimerWrapper} from 'angular2/src/facade/async'; // TODO(jelbourn): Ink ripples. // TODO(jelbourn): Make the `isMouseDown` stuff done with one global listener. @@ -55,7 +54,7 @@ export class MdButton { // button continues to look :active after clicking. // @see http://marcysutton.com/button-focus-hell/ this.isMouseDown = true; - TimerWrapper.setTimeout(() => { this.isMouseDown = false; }, 100); + setTimeout(() => { this.isMouseDown = false; }, 100); } _updateColor(newColor: string) { diff --git a/src/components/card/card.ts b/src/components/card/card.ts index 889c57fe653..6127fbd9cfe 100644 --- a/src/components/card/card.ts +++ b/src/components/card/card.ts @@ -1,5 +1,5 @@ import {Component, ViewEncapsulation, ChangeDetectionStrategy} from 'angular2/core'; -import {CONST_EXPR} from 'angular2/src/facade/lang'; + /* @@ -71,4 +71,4 @@ TODO(kara): update link to demo site when it exists }) export class MdCardTitleGroup {} -export const MD_CARD_DIRECTIVES: any[] = CONST_EXPR([MdCard, MdCardHeader, MdCardTitleGroup]); +export const MD_CARD_DIRECTIVES: any[] = [MdCard, MdCardHeader, MdCardTitleGroup]; diff --git a/src/components/checkbox/checkbox.spec.ts b/src/components/checkbox/checkbox.spec.ts index 4eb2a37a2a6..84a2fa126d4 100644 --- a/src/components/checkbox/checkbox.spec.ts +++ b/src/components/checkbox/checkbox.spec.ts @@ -1,18 +1,14 @@ import { + it, + describe, + expect, + beforeEach, fakeAsync, inject, tick, ComponentFixture, TestComponentBuilder, } from 'angular2/testing'; - -import { - it, - describe, - expect, - beforeEach, -} from '../../core/facade/testing'; - import {Component, DebugElement, EventEmitter} from 'angular2/core'; import {By} from 'angular2/platform/browser'; diff --git a/src/components/checkbox/checkbox.ts b/src/components/checkbox/checkbox.ts index 40c616adbef..43619673cd9 100644 --- a/src/components/checkbox/checkbox.ts +++ b/src/components/checkbox/checkbox.ts @@ -15,9 +15,6 @@ import { NG_VALUE_ACCESSOR, ControlValueAccessor } from 'angular2/src/common/forms/directives/control_value_accessor'; -import {CONST_EXPR} from 'angular2/src/facade/lang'; - -import { OneOf } from '../../core/annotations/one-of'; /** * Monotonically increasing integer used to auto-generate unique ids for checkbox components. @@ -28,11 +25,11 @@ let nextId = 0; * Provider Expression that allows md-checkbox to register as a ControlValueAccessor. This allows it * to support [(ngModel)] and ngControl. */ -const MD_CHECKBOX_CONTROL_VALUE_ACCESSOR = CONST_EXPR(new Provider( +const MD_CHECKBOX_CONTROL_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => MdCheckbox), multi: true - })); + }); /** * Represents the different states that require custom transitions between them. @@ -93,7 +90,7 @@ export class MdCheckbox implements ControlValueAccessor { @Input() id: string = `md-checkbox-${++nextId}`; /** Whether or not the checkbox should come before or after the label. */ - @Input() @OneOf(['start', 'end']) align: string = 'start'; + @Input() align: 'start' | 'end' = 'start'; /** * Whether the checkbox is disabled. When the checkbox is disabled it cannot be interacted with. diff --git a/src/components/input/input.spec.ts b/src/components/input/input.spec.ts index 1cbd7268eec..ad61e8e307b 100644 --- a/src/components/input/input.spec.ts +++ b/src/components/input/input.spec.ts @@ -1,4 +1,7 @@ import { + it, + expect, + beforeEach, fakeAsync, inject, ComponentFixture, @@ -8,11 +11,6 @@ import { } from 'angular2/testing'; import {Component} from 'angular2/core'; import {By} from 'angular2/platform/browser'; -import { - it, - expect, - beforeEach, -} from '../../core/facade/testing'; import { MdInput, MdInputDuplicatedHintException, diff --git a/src/components/input/input.ts b/src/components/input/input.ts index 9076f08e62c..bb44e0a10c6 100644 --- a/src/components/input/input.ts +++ b/src/components/input/input.ts @@ -12,28 +12,28 @@ import { QueryList, OnChanges, } from 'angular2/core'; -import {CONST_EXPR, noop} from 'angular2/src/facade/lang'; import { NG_VALUE_ACCESSOR, ControlValueAccessor } from 'angular2/src/common/forms/directives/control_value_accessor'; import {BaseException} from 'angular2/src/facade/exceptions'; import {BooleanFieldValue} from '../../core/annotations/field-value'; -import {OneOf} from '../../core/annotations/one-of'; -const MD_INPUT_CONTROL_VALUE_ACCESSOR = CONST_EXPR(new Provider( +const noop = () => {}; + +const MD_INPUT_CONTROL_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => MdInput), multi: true - })); + }); // Invalid input type. Using one of these will throw an MdInputUnsupportedTypeException. -const MD_INPUT_INVALID_INPUT_TYPE = CONST_EXPR([ +const MD_INPUT_INVALID_INPUT_TYPE = [ 'file', 'radio', 'checkbox', -]); +]; let nextUniqueId = 0; @@ -81,7 +81,7 @@ export class MdPlaceholder {} }) export class MdHint { // Whether to align the hint label at the start or end of the line. - @Input() @OneOf(['start', 'end']) align: string; + @Input() align: 'start' | 'end' = 'start'; } @@ -129,9 +129,9 @@ export class MdInput implements ControlValueAccessor, AfterContentInit, OnChange /** * Bindings. */ - @Input() @OneOf(['start', 'end']) align: string = 'start'; + @Input() align: 'start' | 'end' = 'start'; + @Input() dividerColor: 'primary' | 'accent' | 'warn' = 'primary'; @Input() @BooleanFieldValue() disabled: boolean = false; - @Input() @OneOf(['primary', 'accent', 'warn']) dividerColor: string = 'primary'; @Input() @BooleanFieldValue() floatingPlaceholder: boolean = true; @Input() hintLabel: string = ''; @Input() id: string = `md-input-${nextUniqueId++}`; @@ -234,8 +234,8 @@ export class MdInput implements ControlValueAccessor, AfterContentInit, OnChange } } -export const MD_INPUT_DIRECTIVES: any[] = CONST_EXPR([ +export const MD_INPUT_DIRECTIVES: any[] = [ MdPlaceholder, MdInput, MdHint, -]); +]; diff --git a/src/components/list/list.spec.ts b/src/components/list/list.spec.ts index 16654b3c99b..1d5ec794e1c 100644 --- a/src/components/list/list.spec.ts +++ b/src/components/list/list.spec.ts @@ -1,13 +1,11 @@ -import { - inject, - TestComponentBuilder -} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + inject, + TestComponentBuilder +} from 'angular2/testing'; import {Component} from 'angular2/core'; import {By} from 'angular2/platform/browser'; diff --git a/src/components/list/list.ts b/src/components/list/list.ts index b1bb308ed62..5914f50c0e8 100644 --- a/src/components/list/list.ts +++ b/src/components/list/list.ts @@ -1,6 +1,5 @@ import {Component, ViewEncapsulation, ContentChildren, ContentChild, QueryList, Directive, ElementRef, Renderer, AfterContentInit} from 'angular2/core'; -import {CONST_EXPR} from 'angular2/src/facade/lang'; @Component({ selector: 'md-list', @@ -60,4 +59,4 @@ export class MdListItem implements AfterContentInit { } } -export const MD_LIST_DIRECTIVES: any[] = CONST_EXPR([MdList, MdListItem, MdLine, MdListAvatar]); +export const MD_LIST_DIRECTIVES: any[] = [MdList, MdListItem, MdLine, MdListAvatar]; diff --git a/src/components/progress-circle/progress-circle.spec.ts b/src/components/progress-circle/progress-circle.spec.ts index 2657590f0a7..dbf3a6d78bb 100644 --- a/src/components/progress-circle/progress-circle.spec.ts +++ b/src/components/progress-circle/progress-circle.spec.ts @@ -1,10 +1,10 @@ -import {inject, TestComponentBuilder} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + inject, + TestComponentBuilder} from 'angular2/testing'; import {Component, DebugElement} from 'angular2/core'; import {By} from 'angular2/platform/browser'; import {MdProgressCircle} from './progress-circle'; @@ -30,18 +30,6 @@ export function main() { }); }); - it('should apply mode of "determinate" if an invalid mode is provided.', (done: () => void) => { - builder - .overrideTemplate(TestApp, '') - .createAsync(TestApp) - .then((fixture) => { - fixture.detectChanges(); - let progressElement = getChildDebugElement(fixture.debugElement, 'md-progress-circle'); - expect(progressElement.componentInstance.mode).toBe('determinate'); - done(); - }); - }); - it('should not modify the mode if a valid mode is provided.', (done: () => void) => { builder .overrideTemplate(TestApp, '') diff --git a/src/components/progress-circle/progress-circle.ts b/src/components/progress-circle/progress-circle.ts index b3296dd07c4..5b0bc877d0f 100644 --- a/src/components/progress-circle/progress-circle.ts +++ b/src/components/progress-circle/progress-circle.ts @@ -4,20 +4,10 @@ import { HostBinding, Input } from 'angular2/core'; -import {isPresent, CONST} from 'angular2/src/facade/lang'; -import {Math} from 'angular2/src/facade/math'; -import {OneOf} from '../../core/annotations/one-of'; // TODO(josephperrott): Benchpress tests. -/** Display modes of Progress Circle */ -@CONST() -class ProgressMode { - @CONST() static DETERMINATE = 'determinate'; - @CONST() static INDETERMINATE = 'indeterminate'; -} - /** * component. @@ -51,9 +41,7 @@ export class MdProgressCircle { * mode is bound to the host as the attribute host. */ @HostBinding('attr.mode') - @Input() - @OneOf([ProgressMode.DETERMINATE, ProgressMode.INDETERMINATE]) - mode: string; + @Input() mode: 'determinate' | 'indeterminate' = 'determinate'; /** @@ -81,7 +69,7 @@ export class MdProgressCircle { /** Sets the progress value, clamping before setting the internal value. */ set value(v: number) { - if (isPresent(v)) { + if (v != null) { this._value = MdProgressCircle.clamp(v); } } @@ -113,6 +101,6 @@ export class MdProgressCircle { export class MdSpinner extends MdProgressCircle { constructor() { super(); - this.mode = ProgressMode.INDETERMINATE; + this.mode = 'indeterminate'; } } diff --git a/src/components/radio/radio.spec.ts b/src/components/radio/radio.spec.ts index 3296c5ea5fb..16464c68d36 100644 --- a/src/components/radio/radio.spec.ts +++ b/src/components/radio/radio.spec.ts @@ -1,15 +1,13 @@ -import { - fakeAsync, - inject, - tick, - TestComponentBuilder -} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + fakeAsync, + inject, + tick, + TestComponentBuilder +} from 'angular2/testing'; import {Component, DebugElement} from 'angular2/core'; import {By} from 'angular2/platform/browser'; diff --git a/src/components/radio/radio.ts b/src/components/radio/radio.ts index 1cbf1b43d7a..70aea7446a1 100644 --- a/src/components/radio/radio.ts +++ b/src/components/radio/radio.ts @@ -20,7 +20,6 @@ import { NG_VALUE_ACCESSOR, ControlValueAccessor } from 'angular2/src/common/forms/directives/control_value_accessor'; -import {CONST_EXPR} from 'angular2/src/facade/lang'; import {MdRadioDispatcher} from './radio_dispatcher'; export {MdRadioDispatcher} from './radio_dispatcher'; @@ -29,11 +28,11 @@ export {MdRadioDispatcher} from './radio_dispatcher'; * Provider Expression that allows md-radio-group to register as a ControlValueAccessor. This * allows it to support [(ngModel)] and ngControl. */ -const MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = CONST_EXPR(new Provider( +const MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => MdRadioGroup), multi: true - })); + }); // TODO(mtlin): // Ink ripple is currently placeholder. diff --git a/src/components/sidenav/sidenav.spec.ts b/src/components/sidenav/sidenav.spec.ts index 4ac02e63177..a3e50fdcea3 100644 --- a/src/components/sidenav/sidenav.spec.ts +++ b/src/components/sidenav/sidenav.spec.ts @@ -1,4 +1,8 @@ import { + it, + describe, + expect, + beforeEach, ComponentFixture, TestComponentBuilder, fakeAsync, @@ -7,15 +11,6 @@ import { tick } from 'angular2/testing'; import {XHR} from 'angular2/src/compiler/xhr'; -import { - it, - describe, - expect, - beforeEach, -} from '../../core/facade/testing'; -import { - getComputedStyle -} from '../../core/facade/html'; import { Component, ViewMetadata diff --git a/src/components/sidenav/sidenav.ts b/src/components/sidenav/sidenav.ts index 6063baa1783..e6e99460e34 100644 --- a/src/components/sidenav/sidenav.ts +++ b/src/components/sidenav/sidenav.ts @@ -11,14 +11,11 @@ import { Output, QueryList, Type, - ChangeDetectionStrategy + ChangeDetectionStrategy, + EventEmitter, } from 'angular2/core'; -import {PromiseWrapper, ObservableWrapper, EventEmitter} from 'angular2/src/facade/async'; -import {iterateListLike} from 'angular2/src/facade/collection'; import {BaseException} from 'angular2/src/facade/exceptions'; -import {CONST_EXPR, isPresent} from 'angular2/src/facade/lang'; import {Dir} from '../../core/rtl/dir'; -import {OneOf} from '../../core/annotations/one-of'; import {PromiseCompleter} from 'angular2/src/facade/promise'; @@ -51,25 +48,25 @@ export class MdDuplicatedSidenavException extends BaseException { }) export class MdSidenav { /** Alignment of the sidenav (direction neutral); whether 'start' or 'end'. */ - @Input() @OneOf(['start', 'end']) align: string = 'start'; + @Input() align: 'start' | 'end' = 'start'; /** Mode of the sidenav; whether 'over' or 'side'. */ - @Input() @OneOf(['over', 'push', 'side']) mode: string = 'over'; + @Input() mode: 'over' | 'push' | 'side' = 'over'; /** Whether the sidenav is opened. */ @Input('opened') private _opened: boolean; /** Event emitted when the sidenav is being opened. Use this to synchronize animations. */ - @Output('open-start') onOpenStart = new EventEmitter(); + @Output('open-start') onOpenStart = new EventEmitter(); /** Event emitted when the sidenav is fully opened. */ - @Output('open') onOpen = new EventEmitter(); + @Output('open') onOpen = new EventEmitter(); /** Event emitted when the sidenav is being closed. Use this to synchronize animations. */ - @Output('close-start') onCloseStart = new EventEmitter(); + @Output('close-start') onCloseStart = new EventEmitter(); /** Event emitted when the sidenav is fully closed. */ - @Output('close') onClose = new EventEmitter(); + @Output('close') onClose = new EventEmitter(); /** @@ -107,14 +104,11 @@ export class MdSidenav { * close() when it's closed. * @param isOpen */ - toggle(isOpen?: boolean): Promise { - if (!isPresent(isOpen)) { - isOpen = !this.opened; - } + toggle(isOpen: boolean = !this.opened): Promise { // Shortcut it if we're already opened. if (isOpen === this.opened) { if (!this._transition) { - return PromiseWrapper.resolve(null); + return Promise.resolve(); } else { return isOpen ? this._openPromise : this._closePromise; } @@ -268,7 +262,7 @@ export class MdSidenavLayout implements AfterContentInit { ngAfterContentInit() { // On changes, assert on consistency. - ObservableWrapper.subscribe(this._sidenavs.changes, () => this._validateDrawers()); + this._sidenavs.changes.subscribe(() => this._validateDrawers()); this._validateDrawers(); } @@ -297,7 +291,7 @@ export class MdSidenavLayout implements AfterContentInit { } // Ensure that we have at most one start and one end sidenav. - iterateListLike(this._sidenavs, (sidenav: any) => { + this._sidenavs.forEach(sidenav => { if (sidenav.align == 'end') { if (this._end != null) { throw new MdDuplicatedSidenavException('end'); @@ -368,4 +362,4 @@ export class MdSidenavLayout implements AfterContentInit { } -export const MD_SIDENAV_DIRECTIVES: Type[] = CONST_EXPR([MdSidenavLayout, MdSidenav]); +export const MD_SIDENAV_DIRECTIVES: Type[] = [MdSidenavLayout, MdSidenav]; diff --git a/src/components/toolbar/toolbar.spec.ts b/src/components/toolbar/toolbar.spec.ts index db3ca4ffb30..d385334d9be 100644 --- a/src/components/toolbar/toolbar.spec.ts +++ b/src/components/toolbar/toolbar.spec.ts @@ -1,15 +1,12 @@ import {Component} from 'angular2/core'; -import { - inject, - TestComponentBuilder -} from 'angular2/testing'; - import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + inject, + TestComponentBuilder +} from 'angular2/testing'; import {By} from 'angular2/platform/browser'; import {MdToolbar} from './toolbar'; diff --git a/src/core/annotations/field-value.ts b/src/core/annotations/field-value.ts index f587ed3cfa8..8c28a515514 100644 --- a/src/core/annotations/field-value.ts +++ b/src/core/annotations/field-value.ts @@ -1,6 +1,3 @@ -import {isPresent} from 'angular2/src/facade/lang'; - - declare var Symbol: any; @@ -22,13 +19,13 @@ function booleanFieldValueFactory() { const defaultValue = target[key]; // Use a fallback if Symbol isn't available. - const localKey = isPresent(Symbol) ? Symbol(key) : `__md_private_symbol_${key}`; + const localKey = Symbol ? Symbol(key) : `__md_private_symbol_${key}`; target[localKey] = defaultValue; Object.defineProperty(target, key, { get() { return this[localKey]; }, set(value: boolean) { - this[localKey] = isPresent(value) && value !== null && String(value) != 'false'; + this[localKey] = value != null && `${value}` !== 'false'; } }); }; diff --git a/src/core/annotations/one-of.ts b/src/core/annotations/one-of.ts deleted file mode 100644 index 7e69d5a5838..00000000000 --- a/src/core/annotations/one-of.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {isPresent} from 'angular2/src/facade/lang'; - - -declare var Symbol: any; - - -/** - * Annotation Factory that only allows a set of values to be set for a property. - * @param values The list of allowed values. The first value listed will be used as a default if - * the set value isn't part of the list of accepted values. - */ -function oneOfFactory(values: any[]) { - return function oneOfMetadata(target: any, key: string): void { - const defaultValue = values[0]; - - // Use a fallback if Symbol isn't available. - const localKey = isPresent(Symbol) ? Symbol(key) : `@@$${key}_`; - target[localKey] = defaultValue; - - Object.defineProperty(target, key, { - get() { return this[localKey]; }, - set(v) { - if (values.indexOf(v) == -1) { - this[localKey] = defaultValue; - } else { - this[localKey] = v; - } - } - }); - }; -} - -export { oneOfFactory as OneOf }; diff --git a/src/core/core.ts b/src/core/core.ts index 1993c1833c4..1ff67fb999e 100644 --- a/src/core/core.ts +++ b/src/core/core.ts @@ -1,12 +1,6 @@ // RTL export * from './rtl/dir'; -// Annotations -export {OneOf} from './annotations/one-of'; - // Portals export * from './portal/portal'; export * from './portal/portal-directives'; - -// Facades -export * from './facade/html'; diff --git a/src/core/facade/html.ts b/src/core/facade/html.ts deleted file mode 100644 index 8e7c8b7c4a9..00000000000 --- a/src/core/facade/html.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export function getComputedStyle(element: HTMLElement, pseudoElt?: string) { - return window.getComputedStyle(element, pseudoElt); -} diff --git a/src/core/facade/test_injector.ts b/src/core/facade/test_injector.ts deleted file mode 100644 index 5e52872210e..00000000000 --- a/src/core/facade/test_injector.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {Injector, Provider, PLATFORM_INITIALIZER} from 'angular2/core'; -import {BaseException} from 'angular2/src/facade/exceptions'; -import {ListWrapper} from 'angular2/src/facade/collection'; -import {FunctionWrapper, isPresent, Type} from 'angular2/src/facade/lang'; - -export class TestInjector { - - private _instantiated: boolean = false; - - private _injector: Injector = null; - - private _providers: Array = []; - - reset() { - this._injector = null; - this._providers = []; - this._instantiated = false; - } - - platformProviders: Array = []; - - applicationProviders: Array = []; - - addProviders(providers: Array) { - if (this._instantiated) { - throw new BaseException('Cannot add providers after test injector is instantiated'); - } - this._providers = ListWrapper.concat(this._providers, providers); - } - - createInjector() { - let rootInjector = Injector.resolveAndCreate(this.platformProviders); - this._injector = rootInjector.resolveAndCreateChild( - ListWrapper.concat(this.applicationProviders, this._providers)); - this._instantiated = true; - return this._injector; - } - - execute(fn: FunctionWithParamTokens): any { - if (!this._instantiated) { - this.createInjector(); - } - return fn.execute(this._injector); - } -} - -let testInjectorCache: TestInjector = null; - -export function getTestInjector() { - if (testInjectorCache == null) { - testInjectorCache = new TestInjector(); - } - return testInjectorCache; -} - -/** - * Set the providers that the test injector should use. These should be providers - * common to every test in the suite. - * - * This may only be called once, to set up the common providers for the current test - * suite on teh current platform. If you absolutely need to change the providers, - * first use `resetBaseTestProviders`. - * - * Test Providers for individual platforms are available from - * 'angular2/platform/testing/'. - */ -export function setBaseTestProviders(platformProviders: Array, - applicationProviders: Array) { - let testInjector = getTestInjector(); - if (testInjector.platformProviders.length > 0 || testInjector.applicationProviders.length > 0) { - throw new BaseException('Cannot set base providers because it has already been called'); - } - testInjector.platformProviders = platformProviders; - testInjector.applicationProviders = applicationProviders; - let injector = testInjector.createInjector(); - let inits: Function[] = injector.getOptional(PLATFORM_INITIALIZER); - if (isPresent(inits)) { - inits.forEach(init => init()); - } - testInjector.reset(); -} - -/** - * Reset the providers for the test injector. - */ -export function resetBaseTestProviders() { - let testInjector = getTestInjector(); - testInjector.platformProviders = []; - testInjector.applicationProviders = []; - testInjector.reset(); -} - -/** - * Allows injecting dependencies in `beforeEach()` and `it()`. - * - * Example: - * - * ``` - * beforeEach(inject([Dependency, AClass], (dep, object) => { - * // some code that uses `dep` and `object` - * // ... - * })); - * - * it('...', inject([AClass], (object) => { - * object.doSomething(); - * expect(...); - * }) - * ``` - * - * Notes: - * - inject is currently a function because of some Traceur limitation the syntax should - * eventually - * becomes `it('...', @Inject (object: AClass, async: AsyncTestCompleter) => { ... });` - * - * @param {Array} tokens - * @param {Function} fn - * @return {FunctionWithParamTokens} - */ -export function inject(tokens: any[], fn: Function): FunctionWithParamTokens { - return new FunctionWithParamTokens(tokens, fn, false); -} - -/** - * Allows injecting dependencies in `beforeEach()` and `it()`. The test must return - * a promise which will resolve when all asynchronous activity is complete. - * - * Example: - * - * ``` - * it('...', injectAsync([AClass], (object) => { - * return object.doSomething().then(() => { - * expect(...); - * }); - * }) - * ``` - * - * @param {Array} tokens - * @param {Function} fn - * @return {FunctionWithParamTokens} - */ -export function injectAsync(tokens: any[], fn: Function): FunctionWithParamTokens { - return new FunctionWithParamTokens(tokens, fn, true); -} - -export class FunctionWithParamTokens { - constructor(private _tokens: any[], private _fn: Function, public isAsync: boolean) {} - - /** - * Returns the value of the executed function. - */ - execute(injector: Injector): any { - let params = this._tokens.map(t => injector.get(t)); - return FunctionWrapper.apply(this._fn, params); - } - - hasToken(token: any): boolean { return this._tokens.indexOf(token) > -1; } -} diff --git a/src/core/facade/testing.ts b/src/core/facade/testing.ts deleted file mode 100644 index 7c7d80b63a0..00000000000 --- a/src/core/facade/testing.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - it, - iit, - describe, - ddescribe, - expect, - beforeEach, -} from 'angular2/testing'; diff --git a/src/core/overlay/overlay-container.ts b/src/core/overlay/overlay-container.ts index a1832258b88..e5e49599f5b 100644 --- a/src/core/overlay/overlay-container.ts +++ b/src/core/overlay/overlay-container.ts @@ -1,4 +1,3 @@ -import {DOM} from '../platform/dom/dom_adapter'; /** @@ -6,9 +5,8 @@ import {DOM} from '../platform/dom/dom_adapter'; * with the 'md-overlay-container' class on the document body. */ export function createOverlayContainer(): Element { - let documentBody = DOM.getGlobalEventTarget('body'); - let container = DOM.createElement('div'); - DOM.addClass(container, 'md-overlay-container'); - DOM.appendChild(documentBody, container); + let container = document.createElement('div'); + container.classList.add('md-overlay-container'); + document.body.appendChild(container); return container; } diff --git a/src/core/overlay/overlay.spec.ts b/src/core/overlay/overlay.spec.ts index 9a2510d8388..97515256278 100644 --- a/src/core/overlay/overlay.spec.ts +++ b/src/core/overlay/overlay.spec.ts @@ -1,27 +1,23 @@ import { + it, + describe, + expect, + beforeEach, inject, TestComponentBuilder, fakeAsync, flushMicrotasks, beforeEachProviders, } from 'angular2/testing'; -import { - it, - describe, - expect, - beforeEach, -} from '../../core/facade/testing'; import { Component, ViewChild, ElementRef, provide, } from 'angular2/core'; -import {BrowserDomAdapter} from '../platform/browser/browser_adapter'; import {TemplatePortalDirective} from '../portal/portal-directives'; import {TemplatePortal, ComponentPortal} from '../portal/portal'; import {Overlay, OVERLAY_CONTAINER_TOKEN} from './overlay'; -import {DOM} from '../platform/dom/dom_adapter'; import {OverlayRef} from './overlay-ref'; import {OverlayState} from './overlay-state'; import {PositionStrategy} from './position/position-strategy'; @@ -29,18 +25,16 @@ import {PositionStrategy} from './position/position-strategy'; export function main() { describe('Overlay', () => { - BrowserDomAdapter.makeCurrent(); - let builder: TestComponentBuilder; let overlay: Overlay; let componentPortal: ComponentPortal; let templatePortal: TemplatePortal; - let overlayContainerElement: Element; + let overlayContainerElement: HTMLElement; beforeEachProviders(() => [ Overlay, provide(OVERLAY_CONTAINER_TOKEN, {useFactory: () => { - overlayContainerElement = DOM.createElement('div'); + overlayContainerElement = document.createElement('div'); return overlayContainerElement; }}) ]); @@ -140,7 +134,7 @@ export function main() { flushMicrotasks(); - expect(DOM.querySelectorAll(overlayContainerElement, '.fake-positioned').length).toBe(1); + expect(overlayContainerElement.querySelectorAll('.fake-positioned').length).toBe(1); })); }); }); @@ -168,7 +162,7 @@ class TestComponentWithTemplatePortals { class FakePositionStrategy implements PositionStrategy { apply(element: Element): Promise { - DOM.addClass(element, 'fake-positioned'); + element.classList.add('fake-positioned'); return Promise.resolve(); } diff --git a/src/core/overlay/overlay.ts b/src/core/overlay/overlay.ts index 87f097ca4dd..c681dda2b98 100644 --- a/src/core/overlay/overlay.ts +++ b/src/core/overlay/overlay.ts @@ -5,11 +5,9 @@ import { Inject, Injectable, ElementRef } from 'angular2/core'; -import {CONST_EXPR} from 'angular2/src/facade/lang'; import {OverlayState} from './overlay-state'; import {DomPortalHost} from '../portal/dom-portal-host'; import {OverlayRef} from './overlay-ref'; -import {DOM} from '../platform/dom/dom_adapter'; import {GlobalPositionStrategy} from './position/global-position-strategy'; import {RelativePositionStrategy} from './position/relative-position-strategy'; @@ -20,7 +18,7 @@ export {OverlayRef} from './overlay-ref'; export {createOverlayContainer} from './overlay-container'; /** Token used to inject the DOM element that serves as the overlay container. */ -export const OVERLAY_CONTAINER_TOKEN = CONST_EXPR(new OpaqueToken('overlayContainer')); +export const OVERLAY_CONTAINER_TOKEN = new OpaqueToken('overlayContainer'); /** Next overlay unique ID. */ let nextUniqueId = 0; @@ -40,7 +38,7 @@ let defaultState = new OverlayState(); @Injectable() export class Overlay { constructor( - @Inject(OVERLAY_CONTAINER_TOKEN) private _overlayContainerElement: Element, + @Inject(OVERLAY_CONTAINER_TOKEN) private _overlayContainerElement: HTMLElement, private _dynamicComponentLoader: DynamicComponentLoader, private _appViewManager: AppViewManager) { } @@ -67,10 +65,10 @@ export class Overlay { * @param state State to apply to the created element. * @returns Promise resolving to the created element. */ - private _createPaneElement(state: OverlayState): Promise { - var pane = DOM.createElement('div'); + private _createPaneElement(state: OverlayState): Promise { + var pane = document.createElement('div'); pane.id = `md-overlay-${nextUniqueId++}`; - DOM.addClass(pane, 'md-overlay-pane'); + pane.classList.add('md-overlay-pane'); this.applyState(pane, state); this._overlayContainerElement.appendChild(pane); @@ -83,7 +81,7 @@ export class Overlay { * @param pane The pane to modify. * @param state The state to apply. */ - applyState(pane: Element, state: OverlayState) { + applyState(pane: HTMLElement, state: OverlayState) { if (state.positionStrategy != null) { state.positionStrategy.apply(pane); } @@ -94,7 +92,7 @@ export class Overlay { * @param pane The DOM element to turn into a portal host. * @returns A portal host for the given DOM element. */ - private _createPortalHost(pane: Element): DomPortalHost { + private _createPortalHost(pane: HTMLElement): DomPortalHost { return new DomPortalHost( pane, this._dynamicComponentLoader, @@ -106,7 +104,7 @@ export class Overlay { * @param pane DOM element for the overlay * @returns {OverlayRef} */ - private _createOverlayRef(pane: Element): OverlayRef { + private _createOverlayRef(pane: HTMLElement): OverlayRef { return new OverlayRef(this._createPortalHost(pane)); } } diff --git a/src/core/overlay/position/global-position-strategy.spec.ts b/src/core/overlay/position/global-position-strategy.spec.ts index 18cde84347e..1d3123dbedd 100644 --- a/src/core/overlay/position/global-position-strategy.spec.ts +++ b/src/core/overlay/position/global-position-strategy.spec.ts @@ -1,27 +1,22 @@ -import { - inject, - fakeAsync, - flushMicrotasks, -} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../../core/facade/testing'; -import {BrowserDomAdapter} from '../../platform/browser/browser_adapter'; -import {DOM} from '../../platform/dom/dom_adapter'; + inject, + fakeAsync, + flushMicrotasks, +} from 'angular2/testing'; import {GlobalPositionStrategy} from './global-position-strategy'; export function main() { describe('GlobalPositonStrategy', () => { - BrowserDomAdapter.makeCurrent(); let element: HTMLElement; let strategy: GlobalPositionStrategy; beforeEach(() => { - element = DOM.createElement('div'); + element = document.createElement('div'); strategy = new GlobalPositionStrategy(); }); diff --git a/src/core/overlay/position/global-position-strategy.ts b/src/core/overlay/position/global-position-strategy.ts index 82fc0941a2e..8b6fce5f303 100644 --- a/src/core/overlay/position/global-position-strategy.ts +++ b/src/core/overlay/position/global-position-strategy.ts @@ -1,5 +1,4 @@ import {PositionStrategy} from './position-strategy'; -import {DOM} from '../../platform/dom/dom_adapter'; /** @@ -86,12 +85,12 @@ export class GlobalPositionStrategy implements PositionStrategy { } /** Apply the position to the element. */ - apply(element: Element): Promise { - DOM.setStyle(element, 'position', this._cssPosition); - DOM.setStyle(element, 'top', this._top); - DOM.setStyle(element, 'left', this._left); - DOM.setStyle(element, 'bottom', this._bottom); - DOM.setStyle(element, 'right', this._right); + apply(element: HTMLElement): Promise { + element.style.position = this._cssPosition; + element.style.top = this._top; + element.style.left = this._left; + element.style.bottom = this._bottom; + element.style.right = this._right; // TODO(jelbourn): we don't want to always overwrite the transform property here, // because it will need to be used for animations. @@ -100,7 +99,7 @@ export class GlobalPositionStrategy implements PositionStrategy { // It's important to trim the result, because the browser will ignore the set operation // if the string contains only whitespace. - DOM.setStyle(element, 'transform', `${tranlateX} ${translateY}`.trim()); + element.style.transform = `${tranlateX} ${translateY}`.trim(); return Promise.resolve(); } diff --git a/src/core/platform/browser/browser_adapter.ts b/src/core/platform/browser/browser_adapter.ts deleted file mode 100644 index 398b583a48f..00000000000 --- a/src/core/platform/browser/browser_adapter.ts +++ /dev/null @@ -1,622 +0,0 @@ -import {ListWrapper} from 'angular2/src/facade/collection'; -import {isBlank, isPresent, global, setValueOnPath, DateWrapper} from 'angular2/src/facade/lang'; -import {GenericBrowserDomAdapter} from './generic_browser_adapter'; -import {setRootDomAdapter} from '../dom/dom_adapter'; - -var _attrToPropMap: {[key: string]: string} = { - 'class': 'className', - 'innerHtml': 'innerHTML', - 'readonly': 'readOnly', - '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: any = { - // 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', - '\t': 'Tab', - '\x7F': 'Delete', - '\x1B': 'Escape', - 'Del': 'Delete', - 'Esc': 'Escape', - 'Left': 'ArrowLeft', - 'Right': 'ArrowRight', - 'Up': 'ArrowUp', - 'Down': 'ArrowDown', - 'Menu': 'ContextMenu', - 'Scroll': 'ScrollLock', - 'Win': 'OS' -}; - -// 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: any = { - 'A': '1', - 'B': '2', - 'C': '3', - 'D': '4', - 'E': '5', - 'F': '6', - 'G': '7', - 'H': '8', - 'I': '9', - 'J': '*', - 'K': '+', - 'M': '-', - 'N': '.', - 'O': '/', - '\x60': '0', - '\x90': 'NumLock' -}; - -/** - * A `DomAdapter` powered by full browser DOM APIs. - */ -/* tslint:disable:requireParameterType */ -export class BrowserDomAdapter extends GenericBrowserDomAdapter { - parse(templateHtml: string) { - throw new Error('parse not implemented'); - } - - static makeCurrent() { - setRootDomAdapter(new BrowserDomAdapter()); - } - - hasProperty(element: any, 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); - } - - // TODO(tbosch): move this into a separate environment class once we have it - logError(error: any) { - if (window.console.error) { - window.console.error(error); - } else { - window.console.log(error); - } - } - - log(error: any) { - window.console.log(error); - } - - logGroup(error: any) { - 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(): {[key: string]: string} { - return _attrToPropMap; - } - - query(selector: string): any { - return document.querySelector(selector); - } - - querySelector(el: any, selector: string): HTMLElement { - return el.querySelector(selector); - } - - querySelectorAll(el: any, selector: string): any[] { - return el.querySelectorAll(selector); - } - - on(el: any, evt: any, listener: any) { - el.addEventListener(evt, listener, false); - } - - onAndCancel(el: any, 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, evt: any) { - el.dispatchEvent(evt); - } - - createMouseEvent(eventType: string): MouseEvent { - var evt: MouseEvent = document.createEvent('MouseEvent'); - evt.initEvent(eventType, true, true); - return evt; - } - - createEvent(eventType: any): Event { - var evt: Event = document.createEvent('Event'); - evt.initEvent(eventType, true, true); - return evt; - } - - preventDefault(evt: Event) { - evt.preventDefault(); - evt.returnValue = false; - } - - isPrevented(evt: Event): boolean { - return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue; - } - - getInnerHTML(el: any): string { - return el.innerHTML; - } - - getOuterHTML(el: any): 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; - } - - content(node: Node): Node { - if (this.hasProperty(node, 'content')) { - return (node).content; - } else { - return node; - } - } - - firstChild(el: any): Node { - return el.firstChild; - } - - nextSibling(el: any): Node { - return el.nextSibling; - } - - parentElement(el: any): Node { - return el.parentNode; - } - - childNodes(el: any): Node[] { - return el.childNodes; - } - - childNodesAsList(el: any): any[] { - var childNodes = el.childNodes; - var res = ListWrapper.createFixedSize(childNodes.length); - for (var i = 0; i < childNodes.length; i++) { - res[i] = childNodes[i]; - } - return res; - } - - clearNodes(el: any): any { - while (el.firstChild) { - el.removeChild(el.firstChild); - } - } - - appendChild(el: any, node: any) { - el.appendChild(node); - } - - removeChild(el: any, node: any) { - el.removeChild(node); - } - - replaceChild(el: Node, newChild: any, oldChild: any) { - el.replaceChild(newChild, oldChild); - } - - remove(node: any): Node { - if (node.parentNode) { - node.parentNode.removeChild(node); - } - return node; - } - - insertBefore(el: any, node: any) { - el.parentNode.insertBefore(node, el); - } - - insertAllBefore(el: any, nodes: any) { - nodes.forEach((n: any) => el.parentNode.insertBefore(n, el)); - } - - insertAfter(el: any, node: any) { - el.parentNode.insertBefore(node, el.nextSibling); - } - - setInnerHTML(el: any, value: any) { - el.innerHTML = value; - } - - getText(el: any): string { - return el.textContent; - } - - // TODO(vicb): removed Element type because it does not support StyleElement - setText(el: any, 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: string): HTMLElement { - var t = document.createElement('template'); - t.innerHTML = html; - return t; - } - - 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'); - el.setAttribute(attrName, attrValue); - return el; - } - - createStyleElement(css: string, doc = document): HTMLStyleElement { - var style = doc.createElement('style'); - this.appendChild(style, this.createTextNode(css)); - return style; - } - - createShadowRoot(el: HTMLElement): DocumentFragment { - return (el).createShadowRoot(); - } - - 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, name: string): HTMLElement[] { - return element.getElementsByClassName(name); - } - - getElementsByTagName(element: any, name: string): HTMLElement[] { - return element.getElementsByTagName(name); - } - - 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, styleName: string, styleValue: string) { - element.style[styleName] = styleValue; - } - - 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 { - var value = this.getStyle(element, styleName) || ''; - return styleValue ? value == styleValue : value.length > 0; - } - - tagName(element: any): string { - return element.tagName; - } - - attributeMap(element: any): Map { - var res = new Map(); - var elAttrs = element.attributes; - for (var i = 0; i < elAttrs.length; i++) { - var attrib = elAttrs[i]; - res.set(attrib.name, attrib.value); - } - return res; - } - - hasAttribute(element: any, attribute: string): boolean { - return element.hasAttribute(attribute); - } - - hasAttributeNS(element: any, ns: string, attribute: string): boolean { - return element.hasAttributeNS(ns, attribute); - } - - getAttribute(element: any, attribute: string): string { - return element.getAttribute(attribute); - } - - getAttributeNS(element: any, ns: string, name: string): string { - return element.getAttributeNS(ns, name); - } - - setAttribute(element: any, name: string, value: string) { - element.setAttribute(name, value); - } - - setAttributeNS(element: any, ns: string, name: string, value: string) { - element.setAttributeNS(ns, name, value); - } - - removeAttribute(element: any, attribute: string) { - element.removeAttribute(attribute); - } - - removeAttributeNS(element: any, ns: string, name: string) { - element.removeAttributeNS(ns, name); - } - - templateAwareRoot(el: any): any { - return this.isTemplateElement(el) ? this.content(el) : el; - } - - createHtmlDocument(): HTMLDocument { - return document.implementation.createHTMLDocument('fakeTitle'); - } - - defaultDoc(): HTMLDocument { - return document; - } - - getBoundingClientRect(el: any): any { - try { - return el.getBoundingClientRect(); - } catch (e) { - return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0}; - } - } - - getTitle(): string { - return document.title; - } - - setTitle(newTitle: string) { - document.title = newTitle || ''; - } - - elementMatches(n: any, selector: string): boolean { - var matches = false; - 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 matches; - } - - isTemplateElement(el: any): 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): boolean { - return node instanceof HTMLElement && isPresent(node.shadowRoot); - } - - isShadowRoot(node: any): 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); - } - - adoptNode(node: Node): any { - return document.adoptNode(node); - } - - getHref(el: Element): string { - return (el).href; - } - - getEventKey(event: any): string { - var key: any = 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 - if (isBlank(key)) { - return 'Unidentified'; - } - if (key.startsWith('U+')) { - key = String.fromCharCode(parseInt(key.substring(2), 16)); - if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) { - // 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[key]; - } - } - } - if (_keyMap.hasOwnProperty(key)) { - key = _keyMap[key]; - } - return key; - } - - getGlobalEventTarget(target: string): EventTarget { - if (target == 'window') { - return window; - } else if (target == 'document') { - return document; - } else 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); - } - - resetBaseElement(): void { - baseElement = null; - } - - getUserAgent(): string { - return window.navigator.userAgent; - } - - setData(element: any, name: string, value: string) { - this.setAttribute(element, 'data-' + name, value); - } - - getData(element: any, name: string): string { - return this.getAttribute(element, 'data-' + name); - } - - 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); - } - - requestAnimationFrame(callback: any): number { - return window.requestAnimationFrame(callback); - } - - cancelAnimationFrame(id: number) { - window.cancelAnimationFrame(id); - } - - 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()); - } - } -} - - -var baseElement: any = null; -function getBaseElementHref(): string { - if (isBlank(baseElement)) { - baseElement = document.querySelector('base'); - if (isBlank(baseElement)) { - return null; - } - } - return baseElement.getAttribute('href'); -} - -// based on urlUtils.js in AngularJS 1 -var urlParsingNode: any = null; -function relativePath(url: any): string { - if (isBlank(urlParsingNode)) { - urlParsingNode = document.createElement('a'); - } - urlParsingNode.setAttribute('href', url); - return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname : - '/' + urlParsingNode.pathname; -} diff --git a/src/core/platform/browser/generic_browser_adapter.ts b/src/core/platform/browser/generic_browser_adapter.ts deleted file mode 100644 index 8d1ae263b82..00000000000 --- a/src/core/platform/browser/generic_browser_adapter.ts +++ /dev/null @@ -1,77 +0,0 @@ -import {StringMapWrapper} from 'angular2/src/facade/collection'; -import {isPresent, isFunction, Type} from 'angular2/src/facade/lang'; -import {DomAdapter} from 'angular2/src/platform/dom/dom_adapter'; -import {XHRImpl} from 'angular2/src/platform/browser/xhr_impl'; - - -/** - * Provides DOM operations in any browser environment. - */ -export abstract class GenericBrowserDomAdapter extends DomAdapter { - private _animationPrefix: string = null; - private _transitionEnd: string = null; - - constructor() { - super(); - try { - var 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++) { - if (isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) { - this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-'; - break; - } - } - } - var transEndEventNames: {[key: string]: string} = { - WebkitTransition: 'webkitTransitionEnd', - MozTransition: 'transitionend', - OTransition: 'oTransitionEnd otransitionend', - transition: 'transitionend' - }; - StringMapWrapper.forEach(transEndEventNames, (value: string, key: string) => { - if (isPresent(this.getStyle(element, key))) { - this._transitionEnd = value; - } - }); - } catch (e) { - this._animationPrefix = null; - this._transitionEnd = null; - } - } - - getXHR(): Type { - return XHRImpl; - } - - getDistributedNodes(el: HTMLElement): Node[] { - return (el).getDistributedNodes(); - } - - resolveAndSetHref(el: HTMLAnchorElement, baseUrl: string, href: string) { - el.href = href == null ? baseUrl : baseUrl + '/../' + href; - } - - supportsDOMEvents(): boolean { - return true; - } - - supportsNativeShadowDOM(): boolean { - return isFunction((this.defaultDoc().body).createShadowRoot); - } - - getAnimationPrefix(): string { - return isPresent(this._animationPrefix) ? this._animationPrefix : ''; - } - - getTransitionEnd(): string { - return isPresent(this._transitionEnd) ? this._transitionEnd : ''; - } - - supportsAnimation(): boolean { - return isPresent(this._animationPrefix) && isPresent(this._transitionEnd); - } -} diff --git a/src/core/platform/dom/dom_adapter.ts b/src/core/platform/dom/dom_adapter.ts deleted file mode 100644 index 22c503678fb..00000000000 --- a/src/core/platform/dom/dom_adapter.ts +++ /dev/null @@ -1,259 +0,0 @@ -import {isBlank, Type} from 'angular2/src/facade/lang'; - -export var DOM: DomAdapter = null; - -export function setRootDomAdapter(adapter: DomAdapter) { - if (isBlank(DOM)) { - DOM = adapter; - } -} - -/* tslint:disable:requireParameterType */ -/** - * Provides DOM operations in an environment-agnostic way. - */ -export abstract class DomAdapter { - abstract hasProperty(element: any, name: string): boolean; - - abstract setProperty(el: Element, name: string, value: any): void; - - abstract getProperty(el: Element, name: string): any; - - abstract invoke(el: Element, methodName: string, args: any[]): any; - - abstract logError(error: any): void; - - abstract log(error: any): void; - - abstract logGroup(error: any): void; - - abstract logGroupEnd(): void; - - /** @deprecated */ - abstract getXHR(): Type; - - /** - * Maps attribute names to their corresponding property names for cases - * where attribute name doesn't match property name. - */ - get attrToPropMap(): {[key: string]: string} { - return this._attrToPropMap; - }; - - set attrToPropMap(value: {[key: string]: string}) { - this._attrToPropMap = value; - }; - - /** @internal */ - _attrToPropMap: {[key: string]: string}; - - abstract parse(templateHtml: string): any; - - abstract query(selector: string): any; - - abstract querySelector(el: any, selector: string): HTMLElement; - - abstract querySelectorAll(el: any, selector: string): any[]; - - abstract on(el: any, evt: any, listener: any): void; - - abstract onAndCancel(el: any, evt: any, listener: any): Function; - - abstract dispatchEvent(el: any, evt: any): void; - - abstract createMouseEvent(eventType: any): any; - - abstract createEvent(eventType: string): any; - - abstract preventDefault(evt: any): void; - - abstract isPrevented(evt: any): boolean; - - abstract getInnerHTML(el: any): string; - - abstract getOuterHTML(el: any): string; - - abstract nodeName(node: any): string; - - abstract nodeValue(node: any): string; - - abstract type(node: any): string; - - abstract content(node: any): any; - - abstract firstChild(el: any): Node; - - abstract nextSibling(el: any): Node; - - abstract parentElement(el: any): Node; - - abstract childNodes(el: any): Node[]; - - abstract childNodesAsList(el: any): Node[]; - - abstract clearNodes(el: any): void; - - abstract appendChild(el: any, node: any): void; - - abstract removeChild(el: any, node: any): void; - - abstract replaceChild(el: any, newNode: any, oldNode: any): void; - - abstract remove(el: any): Node; - - abstract insertBefore(el: any, node: any): void; - - abstract insertAllBefore(el: any, nodes: any): void; - - abstract insertAfter(el: any, node: any): void; - - abstract setInnerHTML(el: any, value: any): void; - - abstract getText(el: any): string; - - abstract setText(el: any, value: string): void; - - abstract getValue(el: any): string; - - abstract setValue(el: any, value: string): void; - - abstract getChecked(el: any): boolean; - - abstract setChecked(el: any, value: boolean): void; - - abstract createComment(text: string): any; - - abstract createTemplate(html: any): HTMLElement; - - abstract createElement(tagName: any, doc?: any): HTMLElement; - - abstract createElementNS(ns: string, tagName: string, doc?: any): Element; - - abstract createTextNode(text: string, doc?: any): Text; - - abstract createScriptTag(attrName: string, attrValue: string, doc?: any): HTMLElement; - - abstract createStyleElement(css: string, doc?: any): HTMLStyleElement; - - abstract createShadowRoot(el: any): any; - - abstract getShadowRoot(el: any): any; - - abstract getHost(el: any): any; - - abstract getDistributedNodes(el: any): Node[]; - - abstract clone /**/(node: Node /*T*/): Node /*T*/; - - abstract getElementsByClassName(element: any, name: string): HTMLElement[]; - - abstract getElementsByTagName(element: any, name: string): HTMLElement[]; - - abstract classList(element: any): any[]; - - abstract addClass(element: any, className: string): void; - - abstract removeClass(element: any, className: string): void; - - abstract hasClass(element: any, className: string): boolean; - - abstract setStyle(element: any, styleName: string, styleValue: string): void; - - abstract removeStyle(element: any, styleName: string): void; - - abstract getStyle(element: any, styleName: string): string; - - abstract hasStyle(element: any, styleName: string, styleValue?: string): boolean; - - abstract tagName(element: any): string; - - abstract attributeMap(element: any): Map; - - abstract hasAttribute(element: any, attribute: string): boolean; - - abstract hasAttributeNS(element: any, ns: string, attribute: string): boolean; - - abstract getAttribute(element: any, attribute: string): string; - - abstract getAttributeNS(element: any, ns: string, attribute: string): string; - - abstract setAttribute(element: any, name: string, value: string): void; - - abstract setAttributeNS(element: any, ns: string, name: string, value: string): void; - - abstract removeAttribute(element: any, attribute: string): void; - - abstract removeAttributeNS(element: any, ns: string, attribute: string): void; - - abstract templateAwareRoot(el: any): any; - - abstract createHtmlDocument(): HTMLDocument; - - abstract defaultDoc(): HTMLDocument; - - abstract getBoundingClientRect(el: any): any; - - abstract getTitle(): string; - - abstract setTitle(newTitle: string): void; - - abstract elementMatches(n: any, selector: string): boolean; - - abstract isTemplateElement(el: any): boolean; - - abstract isTextNode(node: any): boolean; - - abstract isCommentNode(node: any): boolean; - - abstract isElementNode(node: any): boolean; - - abstract hasShadowRoot(node: any): boolean; - - abstract isShadowRoot(node: any): boolean; - - abstract importIntoDoc /**/(node: Node /*T*/): Node /*T*/; - - abstract adoptNode /**/(node: Node /*T*/): Node /*T*/; - - abstract getHref(element: any): string; - - abstract getEventKey(event: any): string; - - abstract resolveAndSetHref(element: any, baseUrl: string, href: string): any; - - abstract supportsDOMEvents(): boolean; - - abstract supportsNativeShadowDOM(): boolean; - - abstract getGlobalEventTarget(target: string): any; - - abstract getHistory(): History; - - abstract getLocation(): Location; - - abstract getBaseHref(): string; - - abstract resetBaseElement(): void; - - abstract getUserAgent(): string; - - abstract setData(element: any, name: string, value: string): void; - - abstract getComputedStyle(element: any): any; - - abstract getData(element: any, name: string): string; - - abstract setGlobalVar(name: string, value: any): void; - - abstract requestAnimationFrame(callback: any): number; - - abstract cancelAnimationFrame(id: any): void; - - abstract performanceNow(): number; - - abstract getAnimationPrefix(): string; - - abstract getTransitionEnd(): string; - - abstract supportsAnimation(): boolean; -} diff --git a/src/core/portal/dom-portal-host.ts b/src/core/portal/dom-portal-host.ts index 3e87d545e1a..7500bf35c28 100644 --- a/src/core/portal/dom-portal-host.ts +++ b/src/core/portal/dom-portal-host.ts @@ -37,9 +37,7 @@ export class DomPortalHost extends BasePortalHost { // is a bug in Angular. portal.locals.forEach((v, k) => viewRef.setLocal(k, v)); - viewRef.rootNodes.forEach(rootNode => { - this._hostDomElement.appendChild(rootNode); - }); + viewRef.rootNodes.forEach(rootNode => this._hostDomElement.appendChild(rootNode)); this.setDisposeFn((() => { let index = viewContainer.indexOf(viewRef); diff --git a/src/core/portal/portal-directives.ts b/src/core/portal/portal-directives.ts index 4f9db8052f4..725144773f2 100644 --- a/src/core/portal/portal-directives.ts +++ b/src/core/portal/portal-directives.ts @@ -1,14 +1,12 @@ -import {Portal} from './portal'; -import {TemplatePortal} from './portal'; -import {ComponentRef} from 'angular2/core'; -import {ComponentPortal} from './portal'; -import {Directive} from 'angular2/core'; -import {TemplateRef} from 'angular2/core'; -import {BasePortalHost} from './portal'; -import {DynamicComponentLoader} from 'angular2/core'; -import {ElementRef} from 'angular2/core'; -import {ViewContainerRef} from 'angular2/core'; - +import { + ComponentRef, + Directive, + TemplateRef, + DynamicComponentLoader, + ElementRef, + ViewContainerRef +} from 'angular2/core'; +import {Portal, TemplatePortal, ComponentPortal, BasePortalHost} from './portal'; /** * Directive version of a `TemplatePortal`. Because the directive *is* a TemplatePortal, @@ -69,12 +67,11 @@ export class PortalHostDirective extends BasePortalHost { let elementRef = portal.origin != null ? portal.origin : this._elementRef; // Typecast is necessary for Dart transpilation. - return > - this._dynamicComponentLoader.loadNextToLocation(portal.component, elementRef) - .then(ref => { - this.setDisposeFn(() => ref.dispose()); - return ref; - }); + return this._dynamicComponentLoader.loadNextToLocation(portal.component, elementRef) + .then(ref => { + this.setDisposeFn(() => ref.dispose()); + return ref; + }); } /** Attach the given TemplatePortal to this PortlHost as an embedded View. */ @@ -86,15 +83,14 @@ export class PortalHostDirective extends BasePortalHost { this.setDisposeFn(() => this._viewContainerRef.clear()); // TODO(jelbourn): return locals from view - // Typecast is necessary for Dart transpilation. - return >> Promise.resolve(new Map()); + return Promise.resolve(new Map()); } /** Detatches the currently attached Portal (if there is one) and attaches the given Portal. */ private _replaceAttachedPortal(p: Portal): void { - let maybeDetach = this.hasAttached() ? this.detach() : Promise.resolve(null); + let maybeDetach = this.hasAttached() ? this.detach() : Promise.resolve(); - maybeDetach.then(_ => { + maybeDetach.then(() => { if (p != null) { this.attach(p); this._portal = p; diff --git a/src/core/portal/portal.spec.ts b/src/core/portal/portal.spec.ts index 712bcc688b0..6cecd14c79f 100644 --- a/src/core/portal/portal.spec.ts +++ b/src/core/portal/portal.spec.ts @@ -1,14 +1,12 @@ -import { - inject, - ComponentFixture, - TestComponentBuilder, -} from 'angular2/testing'; import { it, describe, expect, beforeEach, -} from '../../core/facade/testing'; + inject, + ComponentFixture, + TestComponentBuilder, +} from 'angular2/testing'; import {Component, ViewChildren, QueryList, ElementRef} from 'angular2/core'; import {TemplatePortalDirective} from './portal-directives'; import {Portal} from './portal'; @@ -19,8 +17,6 @@ import {flushMicrotasks} from 'angular2/testing'; import {DynamicComponentLoader} from 'angular2/core'; import {AppViewManager} from 'angular2/core'; import {DomPortalHost} from './dom-portal-host'; -import {BrowserDomAdapter} from '../platform/browser/browser_adapter'; -import {DOM} from '../platform/dom/dom_adapter'; @@ -30,7 +26,6 @@ export function main() { beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { builder = tcb; - BrowserDomAdapter.makeCurrent(); })); describe('PortalHostDirective', () => { @@ -234,7 +229,7 @@ export function main() { fakeAsync((dcl: DynamicComponentLoader, avm: AppViewManager) => { viewManager = avm; componentLoader = dcl; - someDomElement = DOM.createElement('div'); + someDomElement = document.createElement('div'); host = new DomPortalHost(someDomElement, componentLoader, viewManager); builder.createAsync(ArbitraryElementRefComponent).then(fixture => { diff --git a/src/core/rtl/dir.ts b/src/core/rtl/dir.ts index e06b78c36ab..d21757a0c02 100644 --- a/src/core/rtl/dir.ts +++ b/src/core/rtl/dir.ts @@ -1,7 +1,6 @@ -import {EventEmitter} from 'angular2/src/facade/async'; -import {Directive, HostBinding, Output, Input} from 'angular2/core'; -import {OneOf} from '../annotations/one-of'; +import {Directive, HostBinding, Output, Input, EventEmitter} from 'angular2/core'; +export type LayoutDirection = 'ltr' | 'rtl'; /** * Directive to listen to changes of direction of part of the DOM. @@ -15,15 +14,15 @@ import {OneOf} from '../annotations/one-of'; exportAs: '$implicit' }) export class Dir { - @Input('dir') @OneOf(['ltr', 'rtl']) private _dir: string = 'ltr'; + @Input('dir') private _dir: LayoutDirection = 'ltr'; @Output() dirChange = new EventEmitter(); @HostBinding('attr.dir') - get dir(): string { + get dir(): LayoutDirection { return this._dir; } - set dir(v: string) { + set dir(v: LayoutDirection) { let old = this._dir; this._dir = v; if (old != this._dir) { @@ -31,6 +30,6 @@ export class Dir { } } - get value(): string { return this.dir; } - set value(v: string) { this.dir = v; } + get value(): LayoutDirection { return this.dir; } + set value(v: LayoutDirection) { this.dir = v; } } diff --git a/src/main.ts b/src/main.ts index 916d6523a92..f436a9cb7a5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,11 @@ import {bootstrap} from 'angular2/platform/browser'; import {DemoApp} from './demo-app/demo-app'; import {ROUTER_PROVIDERS} from 'angular2/router'; -import {BrowserDomAdapter} from './core/platform/browser/browser_adapter'; import {OVERLAY_CONTAINER_TOKEN} from './core/overlay/overlay'; import {MdLiveAnnouncer} from './core/live-announcer/live-announcer'; import {provide} from 'angular2/core'; import {createOverlayContainer} from './core/overlay/overlay-container'; -BrowserDomAdapter.makeCurrent(); - bootstrap(DemoApp, [ ROUTER_PROVIDERS, MdLiveAnnouncer,