From 2c8fcec432ce352d6d514304445dd06a29aed364 Mon Sep 17 00:00:00 2001 From: vsavkin Date: Tue, 17 Nov 2015 15:24:36 -0800 Subject: [PATCH] refactor(core): move render/dom from core Currently, core depends on DomRenderer, which depends on the browser. This means that if you depend on angular2/core, you will always pull in the browser dom adapter and the browser render, regardless if you need them or not. This PR moves the browser dom adapter and the browser renderer out of core. BREAKING CHANGE If you import browser adapter or dom renderer directly (not via angular2/core), you will have to change the import path. --- modules/angular2/angular2.dart | 3 +- modules/angular2/angular2.ts | 1 + modules/angular2/compiler.ts | 3 +- modules/angular2/core.dart | 5 +- modules/angular2/core.ts | 10 +- modules/angular2/platform/browser.ts | 11 +- modules/angular2/platform/browser_static.ts | 10 +- modules/angular2/platform/common_dom.ts | 7 + modules/angular2/platform/server.dart | 2 + modules/angular2/platform/server.ts | 2 + modules/angular2/render.ts | 5 +- modules/angular2/src/animate/animation.ts | 2 +- .../src/core/application_common_providers.ts | 2 +- modules/angular2/src/core/debug.ts | 6 - .../angular2/src/core/debug/debug_element.ts | 18 - modules/angular2/src/core/di/injector.ts | 1 - .../src/core/dom/browser_adapter.dart | 522 +----------------- modules/angular2/src/core/dom/dom_adapter.ts | 2 +- modules/angular2/src/core/linker.ts | 2 +- .../src/core/linker/proto_view_factory.ts | 2 +- .../src/core/linker/template_commands.ts | 2 +- modules/angular2/src/core/linker/view.ts | 2 +- modules/angular2/src/core/render.ts | 8 +- .../render/{dom/events => }/event_manager.ts | 30 +- modules/angular2/src/core/render/render.ts | 10 - .../src/core/render/{dom => }/util.ts | 0 modules/angular2/src/core/services.ts | 4 - .../src/core/testability/testability.ts | 34 +- .../src/platform/browser/browser_adapter.dart | 520 +++++++++++++++++ .../browser}/browser_adapter.ts | 2 +- .../angular2/src/platform/browser/debug/by.ts | 19 + .../debug/debug_element_view_listener.ts | 2 +- .../browser}/generic_browser_adapter.ts | 2 +- .../services => platform/browser}/ruler.ts | 0 .../browser/testability.dart} | 48 +- .../browser/testability.ts} | 35 +- .../services => platform/browser}/title.ts | 0 .../angular2/src/platform/browser_common.ts | 34 +- .../render => platform}/dom/dom_renderer.ts | 30 +- .../render => platform}/dom/dom_tokens.ts | 0 .../src/platform/dom/events/dom_events.ts | 25 + .../dom/events/hammer_common.ts | 2 +- .../dom/events/hammer_gestures.dart | 0 .../dom/events/hammer_gestures.ts | 0 .../dom/events/key_events.ts | 2 +- .../dom/shared_styles_host.ts | 0 modules/angular2/src/platform/dom/util.ts | 15 + .../server}/abstract_html_adapter.dart | 2 +- .../dom => platform/server}/html_adapter.dart | 2 +- .../server}/parse5_adapter.dart | 0 .../dom => platform/server}/parse5_adapter.ts | 2 +- .../server}/webworker_adapter.dart | 2 +- .../angular2/src/testing/benchmark_util.ts | 2 +- .../src/testing/test_component_builder.ts | 2 +- modules/angular2/src/testing/test_injector.ts | 26 +- .../src/web_workers/ui/di_bindings.ts | 21 +- modules/angular2/src/web_workers/ui/impl.ts | 2 +- .../src/web_workers/worker/application.dart | 2 +- .../src/web_workers/worker/application.ts | 2 +- .../test/common/forms/integration_spec.ts | 2 +- .../test/core/debug/debug_element_spec.ts | 3 +- .../dom/html5lib_adapter.server.spec.dart | 2 +- .../test/core/forward_ref_integration_spec.ts | 2 +- .../linker/dynamic_component_loader_spec.ts | 6 +- .../core/linker/integration_dart_spec.dart | 2 +- .../test/core/linker/integration_spec.ts | 2 +- .../linker/projection_integration_spec.ts | 6 +- .../core/linker/query_integration_spec.ts | 5 +- .../core/linker/view_manager_utils_spec.ts | 2 +- .../render/dom/events/event_manager_spec.ts | 7 +- .../core/render/dom/events/key_events_spec.ts | 2 +- .../render/dom/shared_styles_host_spec.ts | 2 +- .../angular2/test/platform/bootstrap_spec.ts | 2 +- .../debug/debug_element_view_listener_spec.ts | 6 +- .../browser}/rectangle_mock.dart | 0 .../browser}/rectangle_mock.ts | 0 .../browser}/ruler_spec.ts | 4 +- .../browser}/static_assets/200.html | 0 .../browser}/title_spec.ts | 3 +- .../angular2/test/platform/xhr_impl_spec.ts | 4 +- modules/angular2/test/public_api_spec.ts | 179 +++++- .../integration/router_integration_spec.ts | 2 +- .../angular2/test/router/route_config_spec.ts | 2 +- .../angular2/test/router/router_link_spec.ts | 2 +- .../debug_tools/bootstrap.server.spec.dart | 2 +- .../worker/renderer_integration_spec.ts | 2 +- modules/angular2/web_worker/worker.ts | 8 +- modules/angular2_material/test/button_spec.ts | 10 +- .../test/test_url_resolver.dart | 2 +- .../change_detection_benchmark.ts | 2 +- .../src/compiler/compiler_benchmark.ts | 2 +- .../src/compiler/selector_benchmark.ts | 2 +- modules/benchmarks/src/di/di_benchmark.ts | 2 +- .../element_injector_benchmark.ts | 2 +- .../src/largetable/largetable_benchmark.ts | 2 +- .../src/static_tree/tree_benchmark.ts | 2 +- modules/benchmarks/src/tree/tree_benchmark.ts | 2 +- modules/playground/src/key_events/index.ts | 2 +- .../playground/src/material/button/index.ts | 3 +- .../playground/src/material/checkbox/index.ts | 11 +- .../playground/src/material/demo_common.dart | 2 +- .../playground/src/material/demo_common.ts | 2 +- .../playground/src/material/dialog/index.ts | 2 +- .../src/material/grid_list/index.ts | 3 +- .../playground/src/material/input/index.ts | 3 +- .../playground/src/material/radio/index.ts | 3 +- .../src/web_workers/todo/server_index.dart | 2 +- .../src/transform/common/url_resolver.dart | 2 +- .../ng_deps_linker.dart | 2 +- .../directive_processor/transformer.dart | 2 +- .../stylesheet_compiler/transformer.dart | 2 +- .../template_compiler/transformer.dart | 2 +- .../directive_processor/all_tests.dart | 2 +- .../test/transform/integration/all_tests.dart | 2 +- .../template_compiler/all_tests.dart | 2 +- test-init.dart | 2 +- test-main.js | 2 +- tools/broccoli/broccoli-check-imports.ts | 113 ++++ tools/broccoli/trees/browser_tree.ts | 4 + tools/broccoli/trees/node_tree.ts | 5 +- 120 files changed, 1163 insertions(+), 806 deletions(-) create mode 100644 modules/angular2/platform/common_dom.ts create mode 100644 modules/angular2/platform/server.dart create mode 100644 modules/angular2/platform/server.ts delete mode 100644 modules/angular2/src/core/debug.ts rename modules/angular2/src/core/render/{dom/events => }/event_manager.ts (66%) delete mode 100644 modules/angular2/src/core/render/render.ts rename modules/angular2/src/core/render/{dom => }/util.ts (100%) delete mode 100644 modules/angular2/src/core/services.ts create mode 100644 modules/angular2/src/platform/browser/browser_adapter.dart rename modules/angular2/src/{core/dom => platform/browser}/browser_adapter.ts (99%) create mode 100644 modules/angular2/src/platform/browser/debug/by.ts rename modules/angular2/src/{core => platform/browser}/debug/debug_element_view_listener.ts (96%) rename modules/angular2/src/{core/dom => platform/browser}/generic_browser_adapter.ts (97%) rename modules/angular2/src/{core/services => platform/browser}/ruler.ts (100%) rename modules/angular2/src/{core/testability/browser_testability.dart => platform/browser/testability.dart} (77%) rename modules/angular2/src/{core/testability/browser_testability.ts => platform/browser/testability.ts} (54%) rename modules/angular2/src/{core/services => platform/browser}/title.ts (100%) rename modules/angular2/src/{core/render => platform}/dom/dom_renderer.ts (97%) rename modules/angular2/src/{core/render => platform}/dom/dom_tokens.ts (100%) create mode 100644 modules/angular2/src/platform/dom/events/dom_events.ts rename modules/angular2/src/{core/render => platform}/dom/events/hammer_common.ts (94%) rename modules/angular2/src/{core/render => platform}/dom/events/hammer_gestures.dart (100%) rename modules/angular2/src/{core/render => platform}/dom/events/hammer_gestures.ts (100%) rename modules/angular2/src/{core/render => platform}/dom/events/key_events.ts (98%) rename modules/angular2/src/{core/render => platform}/dom/shared_styles_host.ts (100%) create mode 100644 modules/angular2/src/platform/dom/util.ts rename modules/angular2/src/{core/dom => platform/server}/abstract_html_adapter.dart (99%) rename modules/angular2/src/{core/dom => platform/server}/html_adapter.dart (88%) rename modules/angular2/src/{core/dom => platform/server}/parse5_adapter.dart (100%) rename modules/angular2/src/{core/dom => platform/server}/parse5_adapter.ts (99%) rename modules/angular2/src/{core/dom => platform/server}/webworker_adapter.dart (86%) rename modules/angular2/test/{core => platform/browser}/debug/debug_element_view_listener_spec.ts (92%) rename modules/angular2/test/{core/services => platform/browser}/rectangle_mock.dart (100%) rename modules/angular2/test/{core/services => platform/browser}/rectangle_mock.ts (100%) rename modules/angular2/test/{core/services => platform/browser}/ruler_spec.ts (92%) rename modules/angular2/test/{core/services => platform/browser}/static_assets/200.html (100%) rename modules/angular2/test/{core/services => platform/browser}/title_spec.ts (93%) create mode 100644 tools/broccoli/broccoli-check-imports.ts diff --git a/modules/angular2/angular2.dart b/modules/angular2/angular2.dart index d0c2e10178..e66bfc81b7 100644 --- a/modules/angular2/angular2.dart +++ b/modules/angular2/angular2.dart @@ -12,4 +12,5 @@ export 'package:angular2/profile.dart'; export 'package:angular2/lifecycle_hooks.dart'; export 'package:angular2/src/core/application_tokens.dart' hide APP_COMPONENT_REF_PROMISE, APP_ID_RANDOM_PROVIDER; -export 'package:angular2/src/core/render/dom/dom_tokens.dart'; +export 'package:angular2/src/platform/dom/dom_tokens.dart'; +export 'package:angular2/compiler.dart' show UrlResolver, AppRootUrl; \ No newline at end of file diff --git a/modules/angular2/angular2.ts b/modules/angular2/angular2.ts index 54d0f5f37a..8a7c831161 100644 --- a/modules/angular2/angular2.ts +++ b/modules/angular2/angular2.ts @@ -4,3 +4,4 @@ export * from './profile'; export * from './lifecycle_hooks'; export * from './platform/browser'; export * from './upgrade'; +export {UrlResolver, AppRootUrl} from './compiler'; diff --git a/modules/angular2/compiler.ts b/modules/angular2/compiler.ts index 57856c054b..b7a776c8cc 100644 --- a/modules/angular2/compiler.ts +++ b/modules/angular2/compiler.ts @@ -5,4 +5,5 @@ */ export * from './src/compiler/url_resolver'; export * from './src/compiler/xhr'; -export * from './src/compiler/compiler'; \ No newline at end of file +export * from './src/compiler/compiler'; +export * from './src/compiler/app_root_url'; \ No newline at end of file diff --git a/modules/angular2/core.dart b/modules/angular2/core.dart index 164a4bc129..e7a55cc742 100644 --- a/modules/angular2/core.dart +++ b/modules/angular2/core.dart @@ -9,15 +9,16 @@ export 'package:angular2/src/common/pipes.dart'; export 'package:angular2/src/facade/facade.dart'; export 'package:angular2/src/core/application_ref.dart' hide ApplicationRef_, PlatformRef_; -export 'package:angular2/src/core/services.dart'; export 'package:angular2/src/core/linker.dart'; export 'package:angular2/src/core/zone.dart'; export 'package:angular2/src/core/render.dart'; export 'package:angular2/src/common/directives.dart'; export 'package:angular2/src/common/forms.dart'; -export 'package:angular2/src/core/debug.dart'; +export 'package:angular2/src/core/debug/debug_element.dart' show DebugElement, Scope, inspectElement, asNativeElements; +export 'package:angular2/src/core/testability/testability.dart'; export 'package:angular2/src/core/change_detection.dart'; export 'package:angular2/src/core/platform_directives_and_pipes.dart'; export 'package:angular2/src/core/platform_common_providers.dart'; export 'package:angular2/src/core/application_common_providers.dart'; export 'package:angular2/src/core/reflection/reflection.dart'; +export 'package:angular2/src/core/dom/dom_adapter.dart'; diff --git a/modules/angular2/core.ts b/modules/angular2/core.ts index 93286a4768..11aef8f54a 100644 --- a/modules/angular2/core.ts +++ b/modules/angular2/core.ts @@ -8,7 +8,6 @@ export * from './src/core/util'; export * from './src/core/di'; export * from './src/common/pipes'; export * from './src/facade/facade'; -export * from './src/core/services'; export * from './src/core/linker'; export {platform, createNgZone, PlatformRef, ApplicationRef} from './src/core/application_ref'; export {APP_ID, APP_COMPONENT} from './src/core/application_tokens'; @@ -16,10 +15,17 @@ export * from './src/core/zone'; export * from './src/core/render'; export * from './src/common/directives'; export * from './src/common/forms'; -export * from './src/core/debug'; +export { + DebugElement, + Scope, + inspectElement, + asNativeElements +} from './src/core/debug/debug_element'; +export * from './src/core/testability/testability'; export * from './src/core/change_detection'; export * from './src/core/platform_directives_and_pipes'; export * from './src/core/dev_mode'; export * from './src/core/reflection/reflection'; export * from './src/core/application_common_providers'; export * from './src/core/platform_common_providers'; +export * from './src/core/dom/dom_adapter'; diff --git a/modules/angular2/platform/browser.ts b/modules/angular2/platform/browser.ts index 992d0777d2..7ca4bc4681 100644 --- a/modules/angular2/platform/browser.ts +++ b/modules/angular2/platform/browser.ts @@ -1,4 +1,13 @@ -export {BROWSER_PROVIDERS} from 'angular2/src/platform/browser_common'; +export { + BROWSER_PROVIDERS, + ELEMENT_PROBE_BINDINGS, + ELEMENT_PROBE_PROVIDERS, + inspectNativeElement, + BrowserDomAdapter, + By, + Title, + DOCUMENT +} from 'angular2/src/platform/browser_common'; import {Type, isPresent, CONST_EXPR} from 'angular2/src/facade/lang'; import {Promise} from 'angular2/src/facade/promise'; diff --git a/modules/angular2/platform/browser_static.ts b/modules/angular2/platform/browser_static.ts index 0db94d21a8..bd6784301a 100644 --- a/modules/angular2/platform/browser_static.ts +++ b/modules/angular2/platform/browser_static.ts @@ -1,4 +1,12 @@ -export {BROWSER_PROVIDERS} from 'angular2/src/platform/browser_common'; +export { + BROWSER_PROVIDERS, + ELEMENT_PROBE_BINDINGS, + ELEMENT_PROBE_PROVIDERS, + inspectNativeElement, + BrowserDomAdapter, + By, + Title +} from 'angular2/src/platform/browser_common'; import {Type, isPresent, CONST_EXPR} from 'angular2/src/facade/lang'; import {Promise} from 'angular2/src/facade/promise'; diff --git a/modules/angular2/platform/common_dom.ts b/modules/angular2/platform/common_dom.ts new file mode 100644 index 0000000000..92a18bef8e --- /dev/null +++ b/modules/angular2/platform/common_dom.ts @@ -0,0 +1,7 @@ +/** + * This is a set of classes and objects that can be used both in the browser and on the server. + */ +export {DomRenderer} from 'angular2/src/platform/dom/dom_renderer'; +export {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; +export {SharedStylesHost, DomSharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; +export {DomEventsPlugin} from 'angular2/src/platform/dom/events/dom_events'; \ No newline at end of file diff --git a/modules/angular2/platform/server.dart b/modules/angular2/platform/server.dart new file mode 100644 index 0000000000..61ae1b6809 --- /dev/null +++ b/modules/angular2/platform/server.dart @@ -0,0 +1,2 @@ +// TODO: vsavkin add SERVER_PROVIDERS and SERVER_APP_PROVIDERS +export 'package:angular2/src/platform/server/html_adapter.dart'; diff --git a/modules/angular2/platform/server.ts b/modules/angular2/platform/server.ts new file mode 100644 index 0000000000..9270dfbef1 --- /dev/null +++ b/modules/angular2/platform/server.ts @@ -0,0 +1,2 @@ +// TODO: vsavkin add SERVER_PROVIDERS and SERVER_APP_PROVIDERS +export {Parse5DomAdapter} from 'angular2/src/platform/server/parse5_adapter'; \ No newline at end of file diff --git a/modules/angular2/render.ts b/modules/angular2/render.ts index bef53faf0c..1a6446d565 100644 --- a/modules/angular2/render.ts +++ b/modules/angular2/render.ts @@ -1,7 +1,4 @@ /** - * This file is only used for dart applications and for internal examples - * that compile with both JavaScript and Dart. - * - * JavaScript users should import from angular2/core. + * @deprecated import angular2/render/dom instead */ export * from './src/core/render'; diff --git a/modules/angular2/src/animate/animation.ts b/modules/angular2/src/animate/animation.ts index a9130d6aba..1ed6a2242d 100644 --- a/modules/angular2/src/animate/animation.ts +++ b/modules/angular2/src/animate/animation.ts @@ -6,7 +6,7 @@ import { isPresent } from 'angular2/src/facade/lang'; import {Math} from 'angular2/src/facade/math'; -import {camelCaseToDashCase} from 'angular2/src/core/render/dom/util'; +import {camelCaseToDashCase} from 'angular2/src/platform/dom/util'; import {StringMapWrapper} from 'angular2/src/facade/collection'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; diff --git a/modules/angular2/src/core/application_common_providers.ts b/modules/angular2/src/core/application_common_providers.ts index f766c2ee9d..3498b85d05 100644 --- a/modules/angular2/src/core/application_common_providers.ts +++ b/modules/angular2/src/core/application_common_providers.ts @@ -24,7 +24,7 @@ import {Compiler} from './linker/compiler'; import {Compiler_} from "./linker/compiler"; import {DynamicComponentLoader} from './linker/dynamic_component_loader'; import {DynamicComponentLoader_} from "./linker/dynamic_component_loader"; -import {EventManager} from './render/dom/events/event_manager'; +import {EventManager} from './render'; /** * A default set of providers which should be included in any Angular diff --git a/modules/angular2/src/core/debug.ts b/modules/angular2/src/core/debug.ts deleted file mode 100644 index aca1a83a94..0000000000 --- a/modules/angular2/src/core/debug.ts +++ /dev/null @@ -1,6 +0,0 @@ -export {DebugElement, asNativeElements, By, Scope, inspectElement} from './debug/debug_element'; -export { - inspectNativeElement, - ELEMENT_PROBE_PROVIDERS, - ELEMENT_PROBE_BINDINGS -} from './debug/debug_element_view_listener'; diff --git a/modules/angular2/src/core/debug/debug_element.ts b/modules/angular2/src/core/debug/debug_element.ts index 2710501401..37e7b9c6eb 100644 --- a/modules/angular2/src/core/debug/debug_element.ts +++ b/modules/angular2/src/core/debug/debug_element.ts @@ -1,9 +1,6 @@ import {Type, isPresent, isBlank} from 'angular2/src/facade/lang'; import {ListWrapper, MapWrapper, Predicate} from 'angular2/src/facade/collection'; import {unimplemented} from 'angular2/src/facade/exceptions'; - -import {DOM} from 'angular2/src/core/dom/dom_adapter'; - import {ElementInjector} from 'angular2/src/core/linker/element_injector'; import {AppView, ViewType} from 'angular2/src/core/linker/view'; import {internalView} from 'angular2/src/core/linker/view_ref'; @@ -203,18 +200,3 @@ export class Scope { return scope; } } - -export class By { - static all(): Function { return (debugElement) => true; } - - static css(selector: string): Predicate { - return (debugElement) => { - return isPresent(debugElement.nativeElement) ? - DOM.elementMatches(debugElement.nativeElement, selector) : - false; - }; - } - static directive(type: Type): Predicate { - return (debugElement) => { return debugElement.hasDirective(type); }; - } -} diff --git a/modules/angular2/src/core/di/injector.ts b/modules/angular2/src/core/di/injector.ts index c32977d194..5a41312657 100644 --- a/modules/angular2/src/core/di/injector.ts +++ b/modules/angular2/src/core/di/injector.ts @@ -20,7 +20,6 @@ import {FunctionWrapper, Type, isPresent, isBlank, CONST_EXPR} from 'angular2/sr import {Key} from './key'; import {SelfMetadata, HostMetadata, SkipSelfMetadata} from './metadata'; - // Threshold for the dynamic version const _MAX_CONSTRUCTION_COUNTER = 10; diff --git a/modules/angular2/src/core/dom/browser_adapter.dart b/modules/angular2/src/core/dom/browser_adapter.dart index 5cc33b98bb..d7de254ffa 100644 --- a/modules/angular2/src/core/dom/browser_adapter.dart +++ b/modules/angular2/src/core/dom/browser_adapter.dart @@ -1,520 +1,4 @@ -library angular.core.facade.dom; +@Deprecated('import this library from "package:angular2/platform/browser_static.dart"') +library angular2.browser_adapter_reexport; -import 'dart:html'; -import 'dom_adapter.dart' show setRootDomAdapter; -import 'generic_browser_adapter.dart' show GenericBrowserDomAdapter; -import 'package:angular2/src/facade/browser.dart'; -import 'dart:js' as js; - -// WARNING: Do not expose outside this class. Parsing HTML using this -// sanitizer is a security risk. -class _IdentitySanitizer implements NodeTreeSanitizer { - void sanitizeTree(Node node) {} -} - -final _identitySanitizer = new _IdentitySanitizer(); - -final _keyCodeToKeyMap = const { - 8: 'Backspace', - 9: 'Tab', - 12: 'Clear', - 13: 'Enter', - 16: 'Shift', - 17: 'Control', - 18: 'Alt', - 19: 'Pause', - 20: 'CapsLock', - 27: 'Escape', - 32: ' ', - 33: 'PageUp', - 34: 'PageDown', - 35: 'End', - 36: 'Home', - 37: 'ArrowLeft', - 38: 'ArrowUp', - 39: 'ArrowRight', - 40: 'ArrowDown', - 45: 'Insert', - 46: 'Delete', - 65: 'a', - 66: 'b', - 67: 'c', - 68: 'd', - 69: 'e', - 70: 'f', - 71: 'g', - 72: 'h', - 73: 'i', - 74: 'j', - 75: 'k', - 76: 'l', - 77: 'm', - 78: 'n', - 79: 'o', - 80: 'p', - 81: 'q', - 82: 'r', - 83: 's', - 84: 't', - 85: 'u', - 86: 'v', - 87: 'w', - 88: 'x', - 89: 'y', - 90: 'z', - 91: 'OS', - 93: 'ContextMenu', - 96: '0', - 97: '1', - 98: '2', - 99: '3', - 100: '4', - 101: '5', - 102: '6', - 103: '7', - 104: '8', - 105: '9', - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111: '/', - 112: 'F1', - 113: 'F2', - 114: 'F3', - 115: 'F4', - 116: 'F5', - 117: 'F6', - 118: 'F7', - 119: 'F8', - 120: 'F9', - 121: 'F10', - 122: 'F11', - 123: 'F12', - 144: 'NumLock', - 145: 'ScrollLock' -}; - -final bool _supportsTemplateElement = () { - try { - return new TemplateElement().content != null; - } catch (_) { - return false; - } -}(); - -class BrowserDomAdapter extends GenericBrowserDomAdapter { - js.JsFunction _setProperty; - js.JsFunction _getProperty; - js.JsFunction _hasProperty; - Map _hasPropertyCache; - BrowserDomAdapter() { - _hasPropertyCache = new Map(); - _setProperty = js.context.callMethod( - 'eval', ['(function(el, prop, value) { el[prop] = value; })']); - _getProperty = js.context - .callMethod('eval', ['(function(el, prop) { return el[prop]; })']); - _hasProperty = js.context - .callMethod('eval', ['(function(el, prop) { return prop in el; })']); - } - static void makeCurrent() { - setRootDomAdapter(new BrowserDomAdapter()); - } - - bool hasProperty(Element element, String name) { - // Always return true as the serverside version html_adapter.dart does so. - // TODO: change this once we have schema support. - // Note: This nees to kept in sync with html_adapter.dart! - return true; - } - - void setProperty(Element element, String name, Object value) { - var cacheKey = "${element.tagName}.${name}"; - var hasProperty = this._hasPropertyCache[cacheKey]; - if (hasProperty == null) { - hasProperty = this._hasProperty.apply([element, name]); - this._hasPropertyCache[cacheKey] = hasProperty; - } - if (hasProperty) { - _setProperty.apply([element, name, value]); - } - } - - getProperty(Element element, String name) => - _getProperty.apply([element, name]); - - invoke(Element element, String methodName, List args) => - this.getProperty(element, methodName).apply(args, thisArg: element); - - // TODO(tbosch): move this into a separate environment class once we have it - logError(error) { - window.console.error(error); - } - - log(error) { - window.console.log(error); - } - - logGroup(error) { - window.console.group(error); - this.logError(error); - } - - logGroupEnd() { - window.console.groupEnd(); - } - - @override - Map get attrToPropMap => const { - 'class': 'className', - 'innerHtml': 'innerHTML', - 'readonly': 'readOnly', - 'tabindex': 'tabIndex', - }; - - Element query(String selector) => document.querySelector(selector); - - Element querySelector(el, String selector) => el.querySelector(selector); - - ElementList querySelectorAll(el, String selector) => - el.querySelectorAll(selector); - - void on(EventTarget element, String event, callback(arg)) { - // due to https://code.google.com/p/dart/issues/detail?id=17406 - // addEventListener misses zones so we use element.on. - element.on[event].listen(callback); - } - - Function onAndCancel(EventTarget element, String event, callback(arg)) { - // due to https://code.google.com/p/dart/issues/detail?id=17406 - // addEventListener misses zones so we use element.on. - var subscription = element.on[event].listen(callback); - return subscription.cancel; - } - - void dispatchEvent(EventTarget el, Event evt) { - el.dispatchEvent(evt); - } - - MouseEvent createMouseEvent(String eventType) => - new MouseEvent(eventType, canBubble: true); - Event createEvent(String eventType) => new Event(eventType, canBubble: true); - void preventDefault(Event evt) { - evt.preventDefault(); - } - - bool isPrevented(Event evt) { - return evt.defaultPrevented; - } - - String getInnerHTML(Element el) => el.innerHtml; - String getOuterHTML(Element el) => el.outerHtml; - void setInnerHTML(Element el, String value) { - el.innerHtml = value; - } - - String nodeName(Node el) => el.nodeName; - String nodeValue(Node el) => el.nodeValue; - String type(InputElement el) => el.type; - Node content(TemplateElement el) => - _supportsTemplateElement ? el.content : el; - Node firstChild(el) => el.firstChild; - Node nextSibling(Node el) => el.nextNode; - Element parentElement(Node el) => el.parent; - List childNodes(Node el) => el.childNodes; - List childNodesAsList(Node el) => childNodes(el).toList(); - void clearNodes(Node el) { - el.nodes = const []; - } - - void appendChild(Node el, Node node) { - el.append(node); - } - - void removeChild(el, Node node) { - node.remove(); - } - - void replaceChild(Node el, Node newNode, Node oldNode) { - oldNode.replaceWith(newNode); - } - - ChildNode remove(ChildNode el) { - return el..remove(); - } - - void insertBefore(Node el, node) { - el.parentNode.insertBefore(node, el); - } - - void insertAllBefore(Node el, Iterable nodes) { - el.parentNode.insertAllBefore(nodes, el); - } - - void insertAfter(Node el, Node node) { - el.parentNode.insertBefore(node, el.nextNode); - } - - String getText(Node el) => el.text; - void setText(Node el, String value) { - el.text = value; - } - - String getValue(el) => el.value; - void setValue(el, String value) { - el.value = value; - } - - bool getChecked(InputElement el) => el.checked; - void setChecked(InputElement el, bool isChecked) { - el.checked = isChecked; - } - - Comment createComment(String text) { - return new Comment(text); - } - - TemplateElement createTemplate(String html) { - var t = new TemplateElement(); - // We do not sanitize because templates are part of the application code - // not user code. - t.setInnerHtml(html, treeSanitizer: _identitySanitizer); - return t; - } - - Element createElement(String tagName, [HtmlDocument doc = null]) { - if (doc == null) doc = document; - return doc.createElement(tagName); - } - - Element createElementNS(String ns, String tagName, [HtmlDocument doc = null]) { - if (doc == null) doc = document; - return doc.createElementNS(ns, tagName); - } - - Text createTextNode(String text, [HtmlDocument doc = null]) { - return new Text(text); - } - - createScriptTag(String attrName, String attrValue, - [HtmlDocument doc = null]) { - if (doc == null) doc = document; - var el = doc.createElement('SCRIPT'); - el.setAttribute(attrName, attrValue); - return el; - } - - StyleElement createStyleElement(String css, [HtmlDocument doc = null]) { - if (doc == null) doc = document; - var el = doc.createElement('STYLE'); - el.text = css; - return el; - } - - ShadowRoot createShadowRoot(Element el) => el.createShadowRoot(); - ShadowRoot getShadowRoot(Element el) => el.shadowRoot; - Element getHost(Element el) => (el as ShadowRoot).host; - clone(Node node) => node.clone(true); - List getElementsByClassName(Element element, String name) => - element.getElementsByClassName(name); - List getElementsByTagName(Element element, String name) => - element.querySelectorAll(name); - List classList(Element element) => element.classes.toList(); - void addClass(Element element, String classname) { - element.classes.add(classname); - } - - void removeClass(Element element, String classname) { - element.classes.remove(classname); - } - - bool hasClass(Element element, String classname) => - element.classes.contains(classname); - - void setStyle(Element element, String stylename, String stylevalue) { - element.style.setProperty(stylename, stylevalue); - } - - void removeStyle(Element element, String stylename) { - element.style.removeProperty(stylename); - } - - String getStyle(Element element, String stylename) { - return element.style.getPropertyValue(stylename); - } - - String tagName(Element element) => element.tagName; - - Map attributeMap(Element element) { - var result = {}; - result.addAll(element.attributes); - // TODO(tbosch): element.getNamespacedAttributes() somehow does not return the attribute value - var xlinkHref = element.getAttributeNS('http://www.w3.org/1999/xlink', 'href'); - if (xlinkHref != null) { - result['xlink:href'] = xlinkHref; - } - return result; - } - - bool hasAttribute(Element element, String attribute) => - element.attributes.containsKey(attribute); - - String getAttribute(Element element, String attribute) => - element.getAttribute(attribute); - - void setAttribute(Element element, String name, String value) { - element.setAttribute(name, value); - } - - void setAttributeNS(Element element, String ns, String name, String value) { - element.setAttributeNS(ns, name, value); - } - - void removeAttribute(Element element, String name) { - //there is no removeAttribute method as of now in Dart: - //https://code.google.com/p/dart/issues/detail?id=19934 - element.attributes.remove(name); - } - - Node templateAwareRoot(Element el) => el is TemplateElement ? el.content : el; - - HtmlDocument createHtmlDocument() => - document.implementation.createHtmlDocument('fakeTitle'); - - HtmlDocument defaultDoc() => document; - Rectangle getBoundingClientRect(el) => el.getBoundingClientRect(); - String getTitle() => document.title; - void setTitle(String newTitle) { - document.title = newTitle; - } - - bool elementMatches(n, String selector) => - n is Element && n.matches(selector); - bool isTemplateElement(Element el) => el is TemplateElement; - bool isTextNode(Node node) => node.nodeType == Node.TEXT_NODE; - bool isCommentNode(Node node) => node.nodeType == Node.COMMENT_NODE; - bool isElementNode(Node node) => node.nodeType == Node.ELEMENT_NODE; - bool hasShadowRoot(Node node) { - return node is Element && node.shadowRoot != null; - } - - bool isShadowRoot(Node node) { - return node is ShadowRoot; - } - - Node importIntoDoc(Node node) { - return document.importNode(node, true); - } - - Node adoptNode(Node node) { - return document.adoptNode(node); - } - - String getHref(AnchorElement element) { - return element.href; - } - - String getEventKey(KeyboardEvent event) { - int keyCode = event.keyCode; - return _keyCodeToKeyMap.containsKey(keyCode) - ? _keyCodeToKeyMap[keyCode] - : 'Unidentified'; - } - - getGlobalEventTarget(String target) { - if (target == "window") { - return window; - } else if (target == "document") { - return document; - } else if (target == "body") { - return document.body; - } - } - - getHistory() { - return window.history; - } - - getLocation() { - return window.location; - } - - String getBaseHref() { - var href = getBaseElementHref(); - if (href == null) { - return null; - } - return _relativePath(href); - } - - resetBaseElement() { - baseElement = null; - } - - String getUserAgent() { - return window.navigator.userAgent; - } - - void setData(Element element, String name, String value) { - element.dataset[name] = value; - } - - String getData(Element element, String name) { - return element.dataset[name]; - } - - getComputedStyle(elem) => elem.getComputedStyle(); - - // TODO(tbosch): move this into a separate environment class once we have it - setGlobalVar(String path, value) { - var parts = path.split('.'); - var obj = js.context; - while (parts.length > 1) { - var name = parts.removeAt(0); - if (obj.hasProperty(name)) { - obj = obj[name]; - } else { - obj = obj[name] = new js.JsObject(js.context['Object']); - } - } - obj[parts.removeAt(0)] = value; - } - - requestAnimationFrame(callback) { - return window.requestAnimationFrame(callback); - } - - cancelAnimationFrame(id) { - window.cancelAnimationFrame(id); - } - - num performanceNow() { - return window.performance.now(); - } - - parse(s) { - throw 'not implemented'; - } -} - -var baseElement = null; -String getBaseElementHref() { - if (baseElement == null) { - baseElement = document.querySelector('base'); - if (baseElement == null) { - return null; - } - } - return baseElement.getAttribute('href'); -} - -// based on urlUtils.js in AngularJS 1 -AnchorElement _urlParsingNode = null; -String _relativePath(String url) { - if (_urlParsingNode == null) { - _urlParsingNode = new AnchorElement(); - } - _urlParsingNode.href = url; - var pathname = _urlParsingNode.pathname; - return (pathname[0] == '/') ? pathname : '/${pathname}'; -} +export 'package:angular2/src/platform/browser/browser_adapter.dart'; \ No newline at end of file diff --git a/modules/angular2/src/core/dom/dom_adapter.ts b/modules/angular2/src/core/dom/dom_adapter.ts index 6bbcbee887..96e154e6d8 100644 --- a/modules/angular2/src/core/dom/dom_adapter.ts +++ b/modules/angular2/src/core/dom/dom_adapter.ts @@ -1,6 +1,6 @@ import {isBlank, Type} from 'angular2/src/facade/lang'; -export var DOM: DomAdapter; +export var DOM: DomAdapter = null; export function setRootDomAdapter(adapter: DomAdapter) { if (isBlank(DOM)) { diff --git a/modules/angular2/src/core/linker.ts b/modules/angular2/src/core/linker.ts index 19b6e6d431..b43b69776f 100644 --- a/modules/angular2/src/core/linker.ts +++ b/modules/angular2/src/core/linker.ts @@ -19,4 +19,4 @@ export {ElementRef} from './linker/element_ref'; export {TemplateRef} from './linker/template_ref'; export {ViewRef, HostViewRef, ProtoViewRef} from './linker/view_ref'; export {ViewContainerRef} from './linker/view_container_ref'; -export {ComponentRef} from './linker/dynamic_component_loader'; +export {ComponentRef} from './linker/dynamic_component_loader'; \ No newline at end of file diff --git a/modules/angular2/src/core/linker/proto_view_factory.ts b/modules/angular2/src/core/linker/proto_view_factory.ts index 67a41fd3f8..30216a44b4 100644 --- a/modules/angular2/src/core/linker/proto_view_factory.ts +++ b/modules/angular2/src/core/linker/proto_view_factory.ts @@ -30,7 +30,7 @@ import { NgContentCmd } from './template_commands'; -import {Renderer} from 'angular2/render'; +import {Renderer} from 'angular2/src/core/render/api'; import {APP_ID} from 'angular2/src/core/application_tokens'; diff --git a/modules/angular2/src/core/linker/template_commands.ts b/modules/angular2/src/core/linker/template_commands.ts index fff487c881..20d32cbfb4 100644 --- a/modules/angular2/src/core/linker/template_commands.ts +++ b/modules/angular2/src/core/linker/template_commands.ts @@ -8,7 +8,7 @@ import { RenderNgContentCmd, RenderBeginComponentCmd, RenderEmbeddedTemplateCmd -} from 'angular2/src/core/render/render'; +} from 'angular2/src/core/render/api'; import {ViewEncapsulation} from 'angular2/src/core/metadata'; // Export ViewEncapsulation so that compiled templates only need to depend // on template_commands. diff --git a/modules/angular2/src/core/linker/view.ts b/modules/angular2/src/core/linker/view.ts index 27e42ea6bd..20e10fe73b 100644 --- a/modules/angular2/src/core/linker/view.ts +++ b/modules/angular2/src/core/linker/view.ts @@ -28,7 +28,7 @@ import {RenderEventDispatcher} from 'angular2/src/core/render/api'; import {ViewRef, ProtoViewRef, internalView} from './view_ref'; import {ElementRef} from './element_ref'; import {ProtoPipes} from 'angular2/src/core/pipes/pipes'; -import {camelCaseToDashCase} from 'angular2/src/core/render/dom/util'; +import {camelCaseToDashCase} from 'angular2/src/core/render/util'; import {TemplateCmd} from './template_commands'; import {ViewRef_, ProtoViewRef_} from "./view_ref"; diff --git a/modules/angular2/src/core/render.ts b/modules/angular2/src/core/render.ts index ef3f20a69a..f58c803510 100644 --- a/modules/angular2/src/core/render.ts +++ b/modules/angular2/src/core/render.ts @@ -7,7 +7,6 @@ export { RenderProtoViewRef, RenderFragmentRef, RenderViewWithFragments, - DOCUMENT, RenderTemplateCmd, RenderCommandVisitor, RenderTextCmd, @@ -15,5 +14,8 @@ export { RenderBeginElementCmd, RenderBeginComponentCmd, RenderEmbeddedTemplateCmd, - RenderBeginCmd -} from './render/render'; + RenderBeginCmd, + RenderComponentTemplate +} from './render/api'; + +export {EventManager, EventManagerPlugin, EVENT_MANAGER_PLUGINS} from './render/event_manager'; \ No newline at end of file diff --git a/modules/angular2/src/core/render/dom/events/event_manager.ts b/modules/angular2/src/core/render/event_manager.ts similarity index 66% rename from modules/angular2/src/core/render/dom/events/event_manager.ts rename to modules/angular2/src/core/render/event_manager.ts index 5cb7f7a351..477c89079a 100644 --- a/modules/angular2/src/core/render/dom/events/event_manager.ts +++ b/modules/angular2/src/core/render/event_manager.ts @@ -1,9 +1,8 @@ import {CONST_EXPR} from 'angular2/src/facade/lang'; import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; -import {ListWrapper} from 'angular2/src/facade/collection'; -import {DOM} from 'angular2/src/core/dom/dom_adapter'; -import {NgZone} from 'angular2/src/core/zone/ng_zone'; import {Injectable, Inject, OpaqueToken} from 'angular2/src/core/di'; +import {NgZone} from 'angular2/src/core/zone/ng_zone'; +import {ListWrapper} from 'angular2/src/facade/collection'; export const EVENT_MANAGER_PLUGINS: OpaqueToken = CONST_EXPR(new OpaqueToken("EventManagerPlugins")); @@ -55,27 +54,4 @@ export class EventManagerPlugin { addGlobalEventListener(element: string, eventName: string, handler: Function): Function { throw "not implemented"; } -} - -@Injectable() -export class DomEventsPlugin extends EventManagerPlugin { - manager: EventManager; - - // This plugin should come last in the list of plugins, because it accepts all - // events. - supports(eventName: string): boolean { return true; } - - addEventListener(element: HTMLElement, eventName: string, handler: Function) { - var zone = this.manager.getZone(); - var outsideHandler = (event) => zone.run(() => handler(event)); - this.manager.getZone().runOutsideAngular(() => { DOM.on(element, eventName, outsideHandler); }); - } - - addGlobalEventListener(target: string, eventName: string, handler: Function): Function { - var element = DOM.getGlobalEventTarget(target); - var zone = this.manager.getZone(); - var outsideHandler = (event) => zone.run(() => handler(event)); - return this.manager.getZone().runOutsideAngular( - () => { return DOM.onAndCancel(element, eventName, outsideHandler); }); - } -} +} \ No newline at end of file diff --git a/modules/angular2/src/core/render/render.ts b/modules/angular2/src/core/render/render.ts deleted file mode 100644 index 9b20996cea..0000000000 --- a/modules/angular2/src/core/render/render.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @module - * @description - * This module provides advanced support for extending dom strategy. - */ - -export * from './dom/shared_styles_host'; -export * from './dom/dom_renderer'; -export * from './dom/dom_tokens'; -export * from './api'; diff --git a/modules/angular2/src/core/render/dom/util.ts b/modules/angular2/src/core/render/util.ts similarity index 100% rename from modules/angular2/src/core/render/dom/util.ts rename to modules/angular2/src/core/render/util.ts diff --git a/modules/angular2/src/core/services.ts b/modules/angular2/src/core/services.ts deleted file mode 100644 index ab85513b48..0000000000 --- a/modules/angular2/src/core/services.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Public API for Services -export {AppRootUrl} from 'angular2/src/compiler/app_root_url'; -export {UrlResolver} from 'angular2/src/compiler/url_resolver'; -export {Title} from 'angular2/src/core/services/title'; diff --git a/modules/angular2/src/core/testability/testability.ts b/modules/angular2/src/core/testability/testability.ts index 8d36b8e505..741cffb8e4 100644 --- a/modules/angular2/src/core/testability/testability.ts +++ b/modules/angular2/src/core/testability/testability.ts @@ -1,5 +1,4 @@ import {Injectable} from 'angular2/src/core/di'; -import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {Map, MapWrapper, ListWrapper} from 'angular2/src/facade/collection'; import {CONST, CONST_EXPR} from 'angular2/src/facade/lang'; import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; @@ -94,39 +93,38 @@ export class TestabilityRegistry { /** @internal */ _applications = new Map(); - constructor() { testabilityGetter.addToWindow(this); } + constructor() { _testabilityGetter.addToWindow(this); } registerApplication(token: any, testability: Testability) { this._applications.set(token, testability); } + getTestability(elem: any): Testability { return this._applications.get(elem); } + getAllTestabilities(): Testability[] { return MapWrapper.values(this._applications); } findTestabilityInTree(elem: Node, findInAncestors: boolean = true): Testability { - if (elem == null) { - return null; - } - if (this._applications.has(elem)) { - return this._applications.get(elem); - } else if (!findInAncestors) { - return null; - } - if (DOM.isShadowRoot(elem)) { - return this.findTestabilityInTree(DOM.getHost(elem)); - } - return this.findTestabilityInTree(DOM.parentElement(elem)); + return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors); } } -export interface GetTestability { addToWindow(registry: TestabilityRegistry): void; } +export interface GetTestability { + addToWindow(registry: TestabilityRegistry): void; + findTestabilityInTree(registry: TestabilityRegistry, elem: any, + findInAncestors: boolean): Testability; +} @CONST() -class NoopGetTestability implements GetTestability { +class _NoopGetTestability implements GetTestability { addToWindow(registry: TestabilityRegistry): void {} + findTestabilityInTree(registry: TestabilityRegistry, elem: any, + findInAncestors: boolean): Testability { + return null; + } } export function setTestabilityGetter(getter: GetTestability): void { - testabilityGetter = getter; + _testabilityGetter = getter; } -var testabilityGetter: GetTestability = CONST_EXPR(new NoopGetTestability()); +var _testabilityGetter: GetTestability = CONST_EXPR(new _NoopGetTestability()); diff --git a/modules/angular2/src/platform/browser/browser_adapter.dart b/modules/angular2/src/platform/browser/browser_adapter.dart new file mode 100644 index 0000000000..ce98e774b1 --- /dev/null +++ b/modules/angular2/src/platform/browser/browser_adapter.dart @@ -0,0 +1,520 @@ +library angular.core.facade.dom; + +import 'dart:html'; +import 'package:angular2/core.dart' show setRootDomAdapter; +import 'generic_browser_adapter.dart' show GenericBrowserDomAdapter; +import 'package:angular2/src/facade/browser.dart'; +import 'dart:js' as js; + +// WARNING: Do not expose outside this class. Parsing HTML using this +// sanitizer is a security risk. +class _IdentitySanitizer implements NodeTreeSanitizer { + void sanitizeTree(Node node) {} +} + +final _identitySanitizer = new _IdentitySanitizer(); + +final _keyCodeToKeyMap = const { + 8: 'Backspace', + 9: 'Tab', + 12: 'Clear', + 13: 'Enter', + 16: 'Shift', + 17: 'Control', + 18: 'Alt', + 19: 'Pause', + 20: 'CapsLock', + 27: 'Escape', + 32: ' ', + 33: 'PageUp', + 34: 'PageDown', + 35: 'End', + 36: 'Home', + 37: 'ArrowLeft', + 38: 'ArrowUp', + 39: 'ArrowRight', + 40: 'ArrowDown', + 45: 'Insert', + 46: 'Delete', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 91: 'OS', + 93: 'ContextMenu', + 96: '0', + 97: '1', + 98: '2', + 99: '3', + 100: '4', + 101: '5', + 102: '6', + 103: '7', + 104: '8', + 105: '9', + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111: '/', + 112: 'F1', + 113: 'F2', + 114: 'F3', + 115: 'F4', + 116: 'F5', + 117: 'F6', + 118: 'F7', + 119: 'F8', + 120: 'F9', + 121: 'F10', + 122: 'F11', + 123: 'F12', + 144: 'NumLock', + 145: 'ScrollLock' +}; + +final bool _supportsTemplateElement = () { + try { + return new TemplateElement().content != null; + } catch (_) { + return false; + } +}(); + +class BrowserDomAdapter extends GenericBrowserDomAdapter { + js.JsFunction _setProperty; + js.JsFunction _getProperty; + js.JsFunction _hasProperty; + Map _hasPropertyCache; + BrowserDomAdapter() { + _hasPropertyCache = new Map(); + _setProperty = js.context.callMethod( + 'eval', ['(function(el, prop, value) { el[prop] = value; })']); + _getProperty = js.context + .callMethod('eval', ['(function(el, prop) { return el[prop]; })']); + _hasProperty = js.context + .callMethod('eval', ['(function(el, prop) { return prop in el; })']); + } + static void makeCurrent() { + setRootDomAdapter(new BrowserDomAdapter()); + } + + bool hasProperty(Element element, String name) { + // Always return true as the serverside version html_adapter.dart does so. + // TODO: change this once we have schema support. + // Note: This nees to kept in sync with html_adapter.dart! + return true; + } + + void setProperty(Element element, String name, Object value) { + var cacheKey = "${element.tagName}.${name}"; + var hasProperty = this._hasPropertyCache[cacheKey]; + if (hasProperty == null) { + hasProperty = this._hasProperty.apply([element, name]); + this._hasPropertyCache[cacheKey] = hasProperty; + } + if (hasProperty) { + _setProperty.apply([element, name, value]); + } + } + + getProperty(Element element, String name) => + _getProperty.apply([element, name]); + + invoke(Element element, String methodName, List args) => + this.getProperty(element, methodName).apply(args, thisArg: element); + + // TODO(tbosch): move this into a separate environment class once we have it + logError(error) { + window.console.error(error); + } + + log(error) { + window.console.log(error); + } + + logGroup(error) { + window.console.group(error); + this.logError(error); + } + + logGroupEnd() { + window.console.groupEnd(); + } + + @override + Map get attrToPropMap => const { + 'class': 'className', + 'innerHtml': 'innerHTML', + 'readonly': 'readOnly', + 'tabindex': 'tabIndex', + }; + + Element query(String selector) => document.querySelector(selector); + + Element querySelector(el, String selector) => el.querySelector(selector); + + ElementList querySelectorAll(el, String selector) => + el.querySelectorAll(selector); + + void on(EventTarget element, String event, callback(arg)) { + // due to https://code.google.com/p/dart/issues/detail?id=17406 + // addEventListener misses zones so we use element.on. + element.on[event].listen(callback); + } + + Function onAndCancel(EventTarget element, String event, callback(arg)) { + // due to https://code.google.com/p/dart/issues/detail?id=17406 + // addEventListener misses zones so we use element.on. + var subscription = element.on[event].listen(callback); + return subscription.cancel; + } + + void dispatchEvent(EventTarget el, Event evt) { + el.dispatchEvent(evt); + } + + MouseEvent createMouseEvent(String eventType) => + new MouseEvent(eventType, canBubble: true); + Event createEvent(String eventType) => new Event(eventType, canBubble: true); + void preventDefault(Event evt) { + evt.preventDefault(); + } + + bool isPrevented(Event evt) { + return evt.defaultPrevented; + } + + String getInnerHTML(Element el) => el.innerHtml; + String getOuterHTML(Element el) => el.outerHtml; + void setInnerHTML(Element el, String value) { + el.innerHtml = value; + } + + String nodeName(Node el) => el.nodeName; + String nodeValue(Node el) => el.nodeValue; + String type(InputElement el) => el.type; + Node content(TemplateElement el) => + _supportsTemplateElement ? el.content : el; + Node firstChild(el) => el.firstChild; + Node nextSibling(Node el) => el.nextNode; + Element parentElement(Node el) => el.parent; + List childNodes(Node el) => el.childNodes; + List childNodesAsList(Node el) => childNodes(el).toList(); + void clearNodes(Node el) { + el.nodes = const []; + } + + void appendChild(Node el, Node node) { + el.append(node); + } + + void removeChild(el, Node node) { + node.remove(); + } + + void replaceChild(Node el, Node newNode, Node oldNode) { + oldNode.replaceWith(newNode); + } + + ChildNode remove(ChildNode el) { + return el..remove(); + } + + void insertBefore(Node el, node) { + el.parentNode.insertBefore(node, el); + } + + void insertAllBefore(Node el, Iterable nodes) { + el.parentNode.insertAllBefore(nodes, el); + } + + void insertAfter(Node el, Node node) { + el.parentNode.insertBefore(node, el.nextNode); + } + + String getText(Node el) => el.text; + void setText(Node el, String value) { + el.text = value; + } + + String getValue(el) => el.value; + void setValue(el, String value) { + el.value = value; + } + + bool getChecked(InputElement el) => el.checked; + void setChecked(InputElement el, bool isChecked) { + el.checked = isChecked; + } + + Comment createComment(String text) { + return new Comment(text); + } + + TemplateElement createTemplate(String html) { + var t = new TemplateElement(); + // We do not sanitize because templates are part of the application code + // not user code. + t.setInnerHtml(html, treeSanitizer: _identitySanitizer); + return t; + } + + Element createElement(String tagName, [HtmlDocument doc = null]) { + if (doc == null) doc = document; + return doc.createElement(tagName); + } + + Element createElementNS(String ns, String tagName, [HtmlDocument doc = null]) { + if (doc == null) doc = document; + return doc.createElementNS(ns, tagName); + } + + Text createTextNode(String text, [HtmlDocument doc = null]) { + return new Text(text); + } + + createScriptTag(String attrName, String attrValue, + [HtmlDocument doc = null]) { + if (doc == null) doc = document; + var el = doc.createElement('SCRIPT'); + el.setAttribute(attrName, attrValue); + return el; + } + + StyleElement createStyleElement(String css, [HtmlDocument doc = null]) { + if (doc == null) doc = document; + var el = doc.createElement('STYLE'); + el.text = css; + return el; + } + + ShadowRoot createShadowRoot(Element el) => el.createShadowRoot(); + ShadowRoot getShadowRoot(Element el) => el.shadowRoot; + Element getHost(Element el) => (el as ShadowRoot).host; + clone(Node node) => node.clone(true); + List getElementsByClassName(Element element, String name) => + element.getElementsByClassName(name); + List getElementsByTagName(Element element, String name) => + element.querySelectorAll(name); + List classList(Element element) => element.classes.toList(); + void addClass(Element element, String classname) { + element.classes.add(classname); + } + + void removeClass(Element element, String classname) { + element.classes.remove(classname); + } + + bool hasClass(Element element, String classname) => + element.classes.contains(classname); + + void setStyle(Element element, String stylename, String stylevalue) { + element.style.setProperty(stylename, stylevalue); + } + + void removeStyle(Element element, String stylename) { + element.style.removeProperty(stylename); + } + + String getStyle(Element element, String stylename) { + return element.style.getPropertyValue(stylename); + } + + String tagName(Element element) => element.tagName; + + Map attributeMap(Element element) { + var result = {}; + result.addAll(element.attributes); + // TODO(tbosch): element.getNamespacedAttributes() somehow does not return the attribute value + var xlinkHref = element.getAttributeNS('http://www.w3.org/1999/xlink', 'href'); + if (xlinkHref != null) { + result['xlink:href'] = xlinkHref; + } + return result; + } + + bool hasAttribute(Element element, String attribute) => + element.attributes.containsKey(attribute); + + String getAttribute(Element element, String attribute) => + element.getAttribute(attribute); + + void setAttribute(Element element, String name, String value) { + element.setAttribute(name, value); + } + + void setAttributeNS(Element element, String ns, String name, String value) { + element.setAttributeNS(ns, name, value); + } + + void removeAttribute(Element element, String name) { + //there is no removeAttribute method as of now in Dart: + //https://code.google.com/p/dart/issues/detail?id=19934 + element.attributes.remove(name); + } + + Node templateAwareRoot(Element el) => el is TemplateElement ? el.content : el; + + HtmlDocument createHtmlDocument() => + document.implementation.createHtmlDocument('fakeTitle'); + + HtmlDocument defaultDoc() => document; + Rectangle getBoundingClientRect(el) => el.getBoundingClientRect(); + String getTitle() => document.title; + void setTitle(String newTitle) { + document.title = newTitle; + } + + bool elementMatches(n, String selector) => + n is Element && n.matches(selector); + bool isTemplateElement(Element el) => el is TemplateElement; + bool isTextNode(Node node) => node.nodeType == Node.TEXT_NODE; + bool isCommentNode(Node node) => node.nodeType == Node.COMMENT_NODE; + bool isElementNode(Node node) => node.nodeType == Node.ELEMENT_NODE; + bool hasShadowRoot(Node node) { + return node is Element && node.shadowRoot != null; + } + + bool isShadowRoot(Node node) { + return node is ShadowRoot; + } + + Node importIntoDoc(Node node) { + return document.importNode(node, true); + } + + Node adoptNode(Node node) { + return document.adoptNode(node); + } + + String getHref(AnchorElement element) { + return element.href; + } + + String getEventKey(KeyboardEvent event) { + int keyCode = event.keyCode; + return _keyCodeToKeyMap.containsKey(keyCode) + ? _keyCodeToKeyMap[keyCode] + : 'Unidentified'; + } + + getGlobalEventTarget(String target) { + if (target == "window") { + return window; + } else if (target == "document") { + return document; + } else if (target == "body") { + return document.body; + } + } + + getHistory() { + return window.history; + } + + getLocation() { + return window.location; + } + + String getBaseHref() { + var href = getBaseElementHref(); + if (href == null) { + return null; + } + return _relativePath(href); + } + + resetBaseElement() { + baseElement = null; + } + + String getUserAgent() { + return window.navigator.userAgent; + } + + void setData(Element element, String name, String value) { + element.dataset[name] = value; + } + + String getData(Element element, String name) { + return element.dataset[name]; + } + + getComputedStyle(elem) => elem.getComputedStyle(); + + // TODO(tbosch): move this into a separate environment class once we have it + setGlobalVar(String path, value) { + var parts = path.split('.'); + var obj = js.context; + while (parts.length > 1) { + var name = parts.removeAt(0); + if (obj.hasProperty(name)) { + obj = obj[name]; + } else { + obj = obj[name] = new js.JsObject(js.context['Object']); + } + } + obj[parts.removeAt(0)] = value; + } + + requestAnimationFrame(callback) { + return window.requestAnimationFrame(callback); + } + + cancelAnimationFrame(id) { + window.cancelAnimationFrame(id); + } + + num performanceNow() { + return window.performance.now(); + } + + parse(s) { + throw 'not implemented'; + } +} + +var baseElement = null; +String getBaseElementHref() { + if (baseElement == null) { + baseElement = document.querySelector('base'); + if (baseElement == null) { + return null; + } + } + return baseElement.getAttribute('href'); +} + +// based on urlUtils.js in AngularJS 1 +AnchorElement _urlParsingNode = null; +String _relativePath(String url) { + if (_urlParsingNode == null) { + _urlParsingNode = new AnchorElement(); + } + _urlParsingNode.href = url; + var pathname = _urlParsingNode.pathname; + return (pathname[0] == '/') ? pathname : '/${pathname}'; +} diff --git a/modules/angular2/src/core/dom/browser_adapter.ts b/modules/angular2/src/platform/browser/browser_adapter.ts similarity index 99% rename from modules/angular2/src/core/dom/browser_adapter.ts rename to modules/angular2/src/platform/browser/browser_adapter.ts index 6b745d343f..79af0e6a60 100644 --- a/modules/angular2/src/core/dom/browser_adapter.ts +++ b/modules/angular2/src/platform/browser/browser_adapter.ts @@ -1,6 +1,6 @@ import {MapWrapper, ListWrapper} from 'angular2/src/facade/collection'; import {isBlank, isPresent, global, setValueOnPath, DateWrapper} from 'angular2/src/facade/lang'; -import {setRootDomAdapter} from './dom_adapter'; +import {setRootDomAdapter} from 'angular2/src/core/dom/dom_adapter'; import {GenericBrowserDomAdapter} from './generic_browser_adapter'; var _attrToPropMap = { diff --git a/modules/angular2/src/platform/browser/debug/by.ts b/modules/angular2/src/platform/browser/debug/by.ts new file mode 100644 index 0000000000..8b16c8324e --- /dev/null +++ b/modules/angular2/src/platform/browser/debug/by.ts @@ -0,0 +1,19 @@ +import {Type, isPresent, isBlank} from 'angular2/src/facade/lang'; +import {Predicate} from 'angular2/src/facade/collection'; +import {DOM} from 'angular2/src/core/dom/dom_adapter'; +import {DebugElement} from 'angular2/core'; + +export class By { + static all(): Function { return (debugElement) => true; } + + static css(selector: string): Predicate { + return (debugElement) => { + return isPresent(debugElement.nativeElement) ? + DOM.elementMatches(debugElement.nativeElement, selector) : + false; + }; + } + static directive(type: Type): Predicate { + return (debugElement) => { return debugElement.hasDirective(type); }; + } +} diff --git a/modules/angular2/src/core/debug/debug_element_view_listener.ts b/modules/angular2/src/platform/browser/debug/debug_element_view_listener.ts similarity index 96% rename from modules/angular2/src/core/debug/debug_element_view_listener.ts rename to modules/angular2/src/platform/browser/debug/debug_element_view_listener.ts index 1e5ee4cc7a..1094e75389 100644 --- a/modules/angular2/src/core/debug/debug_element_view_listener.ts +++ b/modules/angular2/src/platform/browser/debug/debug_element_view_listener.ts @@ -5,7 +5,7 @@ import {AppViewListener} from 'angular2/src/core/linker/view_listener'; import {AppView} from 'angular2/src/core/linker/view'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {Renderer} from 'angular2/src/core/render/api'; -import {DebugElement, DebugElement_} from './debug_element'; +import {DebugElement, DebugElement_} from 'angular2/src/core/debug/debug_element'; const NG_ID_PROPERTY = 'ngid'; const INSPECT_GLOBAL_NAME = 'ng.probe'; diff --git a/modules/angular2/src/core/dom/generic_browser_adapter.ts b/modules/angular2/src/platform/browser/generic_browser_adapter.ts similarity index 97% rename from modules/angular2/src/core/dom/generic_browser_adapter.ts rename to modules/angular2/src/platform/browser/generic_browser_adapter.ts index 878c2a63d7..aa8f880341 100644 --- a/modules/angular2/src/core/dom/generic_browser_adapter.ts +++ b/modules/angular2/src/platform/browser/generic_browser_adapter.ts @@ -1,6 +1,6 @@ import {ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection'; import {isPresent, isFunction, Type} from 'angular2/src/facade/lang'; -import {DomAdapter} from './dom_adapter'; +import {DomAdapter} from 'angular2/src/core/dom/dom_adapter'; import {XHRImpl} from 'angular2/src/platform/browser/xhr_impl'; diff --git a/modules/angular2/src/core/services/ruler.ts b/modules/angular2/src/platform/browser/ruler.ts similarity index 100% rename from modules/angular2/src/core/services/ruler.ts rename to modules/angular2/src/platform/browser/ruler.ts diff --git a/modules/angular2/src/core/testability/browser_testability.dart b/modules/angular2/src/platform/browser/testability.dart similarity index 77% rename from modules/angular2/src/core/testability/browser_testability.dart rename to modules/angular2/src/platform/browser/testability.dart index 9c56d8ac72..c3683403da 100644 --- a/modules/angular2/src/core/testability/browser_testability.dart +++ b/modules/angular2/src/platform/browser/testability.dart @@ -1,6 +1,6 @@ library testability.browser_testability; -import './testability.dart'; +import 'package:angular2/core.dart'; import 'dart:html'; import 'dart:js' as js; @@ -107,20 +107,20 @@ class BrowserGetTestability implements GetTestability { js.context['ngTestabilityRegistries'] = jsRegistry = new js.JsArray(); js.context['getAngularTestability'] = _jsify((Element elem, [bool findInAncestors = true]) { - var registry = js.context['ngTestabilityRegistries']; - for (int i = 0; i < registry.length; i++) { - var result = registry[i] - .callMethod('getAngularTestability', [elem, findInAncestors]); - if (result != null) return result; - } - throw 'Could not find testability for element.'; - }); + var registry = js.context['ngTestabilityRegistries']; + for (int i = 0; i < registry.length; i++) { + var result = registry[i] + .callMethod('getAngularTestability', [elem, findInAncestors]); + if (result != null) return result; + } + throw 'Could not find testability for element.'; + }); js.context['getAllAngularTestabilities'] = _jsify(() { var registry = js.context['ngTestabilityRegistries']; var result = []; for (int i = 0; i < registry.length; i++) { var testabilities = - registry[i].callMethod('getAllAngularTestabilities'); + registry[i].callMethod('getAllAngularTestabilities'); if (testabilities != null) result.addAll(testabilities); } return _jsify(result); @@ -129,15 +129,31 @@ class BrowserGetTestability implements GetTestability { jsRegistry.add(this._createRegistry(registry)); } + findTestabilityInTree(TestabilityRegistry registry, dynamic elem, bool findInAncestors) { + if (elem == null) { + return null; + } + var t = registry.getTestability(elem); + if (t != null) { + return t; + } else if (!findInAncestors) { + return null; + } + if (DOM.isShadowRoot(elem)) { + return this.findTestabilityInTree(registry, DOM.getHost(elem), true); + } + return this.findTestabilityInTree(registry, DOM.parentElement(elem), true); + } + js.JsObject _createRegistry(TestabilityRegistry registry) { var object = new js.JsObject(js.context['Object']); object['getAngularTestability'] = _jsify((Element elem, bool findInAncestors) { - var testability = registry.findTestabilityInTree(elem, findInAncestors); - return testability == null - ? null - : _jsify(new PublicTestability(testability)); - }); + var testability = registry.findTestabilityInTree(elem, findInAncestors); + return testability == null + ? null + : _jsify(new PublicTestability(testability)); + }); object['getAllAngularTestabilities'] = _jsify(() { var publicTestabilities = registry .getAllTestabilities() @@ -146,4 +162,4 @@ class BrowserGetTestability implements GetTestability { }); return object; } -} +} \ No newline at end of file diff --git a/modules/angular2/src/core/testability/browser_testability.ts b/modules/angular2/src/platform/browser/testability.ts similarity index 54% rename from modules/angular2/src/core/testability/browser_testability.ts rename to modules/angular2/src/platform/browser/testability.ts index 7045f990dd..6c87ee8f69 100644 --- a/modules/angular2/src/core/testability/browser_testability.ts +++ b/modules/angular2/src/platform/browser/testability.ts @@ -1,10 +1,17 @@ +import {Map, MapWrapper, ListWrapper} from 'angular2/src/facade/collection'; +import {CONST, CONST_EXPR, global, isPresent} from 'angular2/src/facade/lang'; +import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; +import {PromiseWrapper, ObservableWrapper} from 'angular2/src/facade/async'; + +import {DOM} from 'angular2/src/core/dom/dom_adapter'; + import { + Injectable, TestabilityRegistry, Testability, GetTestability, setTestabilityGetter -} from 'angular2/src/core/testability/testability'; -import {global} from 'angular2/src/facade/lang'; +} from 'angular2/core'; class PublicTestability { /** @internal */ @@ -29,18 +36,34 @@ export class BrowserGetTestability implements GetTestability { static init() { setTestabilityGetter(new BrowserGetTestability()); } addToWindow(registry: TestabilityRegistry): void { - global.getAngularTestability = function(elem: Element, - findInAncestors: boolean = true): PublicTestability { + global.getAngularTestability = (elem: any, findInAncestors: boolean = true) => { var testability = registry.findTestabilityInTree(elem, findInAncestors); - if (testability == null) { throw new Error('Could not find testability for element.'); } return new PublicTestability(testability); }; - global.getAllAngularTestabilities = function(): PublicTestability[] { + + global.getAllAngularTestabilities = () => { var testabilities = registry.getAllTestabilities(); return testabilities.map((testability) => { return new PublicTestability(testability); }); }; } + + findTestabilityInTree(registry: TestabilityRegistry, elem: any, + findInAncestors: boolean): Testability { + if (elem == null) { + return null; + } + var t = registry.getTestability(elem); + if (isPresent(t)) { + return t; + } else if (!findInAncestors) { + return null; + } + if (DOM.isShadowRoot(elem)) { + return this.findTestabilityInTree(registry, DOM.getHost(elem), true); + } + return this.findTestabilityInTree(registry, DOM.parentElement(elem), true); + } } diff --git a/modules/angular2/src/core/services/title.ts b/modules/angular2/src/platform/browser/title.ts similarity index 100% rename from modules/angular2/src/core/services/title.ts rename to modules/angular2/src/platform/browser/title.ts diff --git a/modules/angular2/src/platform/browser_common.ts b/modules/angular2/src/platform/browser_common.ts index fc33b5b0b9..41804d8eb4 100644 --- a/modules/angular2/src/platform/browser_common.ts +++ b/modules/angular2/src/platform/browser_common.ts @@ -10,7 +10,8 @@ import { Reflector, reflector, APPLICATION_COMMON_PROVIDERS, - PLATFORM_COMMON_PROVIDERS + PLATFORM_COMMON_PROVIDERS, + EVENT_MANAGER_PLUGINS } from "angular2/core"; import {COMMON_DIRECTIVES, COMMON_PIPES, FORM_PROVIDERS} from "angular2/common"; import {Renderer} from 'angular2/render'; @@ -18,21 +19,28 @@ import {Testability} from 'angular2/src/core/testability/testability'; // TODO change these imports once dom_adapter is moved out of core import {DOM} from 'angular2/src/core/dom/dom_adapter'; -import { - DomEventsPlugin, - EVENT_MANAGER_PLUGINS -} from 'angular2/src/core/render/dom/events/event_manager'; -import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events'; -import {HammerGesturesPlugin} from 'angular2/src/core/render/dom/events/hammer_gestures'; -import {DOCUMENT} from 'angular2/src/core/render/dom/dom_tokens'; -import {DomRenderer, DomRenderer_} from 'angular2/src/core/render/dom/dom_renderer'; -import {DomSharedStylesHost} from 'angular2/src/core/render/dom/shared_styles_host'; -import {SharedStylesHost} from "angular2/src/core/render/dom/shared_styles_host"; +import {DomEventsPlugin} from 'angular2/src/platform/dom/events/dom_events'; +import {KeyEventsPlugin} from 'angular2/src/platform/dom/events/key_events'; +import {HammerGesturesPlugin} from 'angular2/src/platform/dom/events/hammer_gestures'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; +import {DomRenderer, DomRenderer_} from 'angular2/src/platform/dom/dom_renderer'; +import {DomSharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; +import {SharedStylesHost} from "angular2/src/platform/dom/shared_styles_host"; import {BrowserDetails} from "angular2/src/animate/browser_details"; import {AnimationBuilder} from "angular2/src/animate/animation_builder"; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; -import {BrowserGetTestability} from 'angular2/src/core/testability/browser_testability'; +import {BrowserDomAdapter} from './browser/browser_adapter'; +import {BrowserGetTestability} from 'angular2/src/platform/browser/testability'; import {wtfInit} from 'angular2/src/core/profile/wtf_init'; +export {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; +export {Title} from 'angular2/src/platform/browser/title'; +export { + // DebugElementViewListener, + ELEMENT_PROBE_PROVIDERS, + ELEMENT_PROBE_BINDINGS, + inspectNativeElement +} from 'angular2/src/platform/browser/debug/debug_element_view_listener'; +export {By} from 'angular2/src/platform/browser/debug/by'; +export {BrowserDomAdapter} from './browser/browser_adapter'; export const BROWSER_PROVIDERS: Array = CONST_EXPR([PLATFORM_COMMON_PROVIDERS]); diff --git a/modules/angular2/src/core/render/dom/dom_renderer.ts b/modules/angular2/src/platform/dom/dom_renderer.ts similarity index 97% rename from modules/angular2/src/core/render/dom/dom_renderer.ts rename to modules/angular2/src/platform/dom/dom_renderer.ts index 633a2cb2d9..8fc869f63e 100644 --- a/modules/angular2/src/core/render/dom/dom_renderer.ts +++ b/modules/angular2/src/platform/dom/dom_renderer.ts @@ -1,5 +1,6 @@ import {Inject, Injectable, OpaqueToken} from 'angular2/src/core/di'; import {AnimationBuilder} from 'angular2/src/animate/animation_builder'; + import { isPresent, isBlank, @@ -8,14 +9,10 @@ import { stringify, StringWrapper } from 'angular2/src/facade/lang'; + import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; - -import {DOM} from 'angular2/src/core/dom/dom_adapter'; - -import {EventManager} from './events/event_manager'; - import {DomSharedStylesHost} from './shared_styles_host'; -import {WtfScopeFn, wtfLeave, wtfCreateScope} from '../../profile/profile'; +import {WtfScopeFn, wtfLeave, wtfCreateScope} from 'angular2/src/core/profile/profile'; import { Renderer, @@ -26,15 +23,28 @@ import { RenderViewWithFragments, RenderTemplateCmd, RenderEventDispatcher, - RenderComponentTemplate -} from '../api'; + RenderComponentTemplate, + EventManager +} from 'angular2/core'; import {DOCUMENT} from './dom_tokens'; -import {createRenderView, NodeFactory, encapsulateStyles} from '../view_factory'; -import {DefaultRenderView, DefaultRenderFragmentRef, DefaultProtoViewRef} from '../view'; +import { + createRenderView, + NodeFactory, + encapsulateStyles +} from 'angular2/src/core/render/view_factory'; +import { + DefaultRenderView, + DefaultRenderFragmentRef, + DefaultProtoViewRef +} from 'angular2/src/core/render/view'; import {camelCaseToDashCase} from './util'; import {ViewEncapsulation} from 'angular2/src/core/metadata'; + +// TODO move it once DomAdapter is moved +import {DOM} from 'angular2/src/core/dom/dom_adapter'; + // TODO(tbosch): solve SVG properly once https://github.com/angular/angular/issues/4417 is done const XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink'; const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; diff --git a/modules/angular2/src/core/render/dom/dom_tokens.ts b/modules/angular2/src/platform/dom/dom_tokens.ts similarity index 100% rename from modules/angular2/src/core/render/dom/dom_tokens.ts rename to modules/angular2/src/platform/dom/dom_tokens.ts diff --git a/modules/angular2/src/platform/dom/events/dom_events.ts b/modules/angular2/src/platform/dom/events/dom_events.ts new file mode 100644 index 0000000000..cb06c62e38 --- /dev/null +++ b/modules/angular2/src/platform/dom/events/dom_events.ts @@ -0,0 +1,25 @@ +import {DOM} from 'angular2/src/core/dom/dom_adapter'; +import {Injectable, EventManagerPlugin, EventManager} from 'angular2/core'; + +@Injectable() +export class DomEventsPlugin extends EventManagerPlugin { + manager: EventManager; + + // This plugin should come last in the list of plugins, because it accepts all + // events. + supports(eventName: string): boolean { return true; } + + addEventListener(element: HTMLElement, eventName: string, handler: Function) { + var zone = this.manager.getZone(); + var outsideHandler = (event) => zone.run(() => handler(event)); + this.manager.getZone().runOutsideAngular(() => { DOM.on(element, eventName, outsideHandler); }); + } + + addGlobalEventListener(target: string, eventName: string, handler: Function): Function { + var element = DOM.getGlobalEventTarget(target); + var zone = this.manager.getZone(); + var outsideHandler = (event) => zone.run(() => handler(event)); + return this.manager.getZone().runOutsideAngular( + () => { return DOM.onAndCancel(element, eventName, outsideHandler); }); + } +} diff --git a/modules/angular2/src/core/render/dom/events/hammer_common.ts b/modules/angular2/src/platform/dom/events/hammer_common.ts similarity index 94% rename from modules/angular2/src/core/render/dom/events/hammer_common.ts rename to modules/angular2/src/platform/dom/events/hammer_common.ts index 6b8630e6b4..0229de4bc1 100644 --- a/modules/angular2/src/core/render/dom/events/hammer_common.ts +++ b/modules/angular2/src/platform/dom/events/hammer_common.ts @@ -1,4 +1,4 @@ -import {EventManagerPlugin} from './event_manager'; +import {EventManagerPlugin} from 'angular2/core'; import {StringMapWrapper} from 'angular2/src/facade/collection'; var _eventNames = { diff --git a/modules/angular2/src/core/render/dom/events/hammer_gestures.dart b/modules/angular2/src/platform/dom/events/hammer_gestures.dart similarity index 100% rename from modules/angular2/src/core/render/dom/events/hammer_gestures.dart rename to modules/angular2/src/platform/dom/events/hammer_gestures.dart diff --git a/modules/angular2/src/core/render/dom/events/hammer_gestures.ts b/modules/angular2/src/platform/dom/events/hammer_gestures.ts similarity index 100% rename from modules/angular2/src/core/render/dom/events/hammer_gestures.ts rename to modules/angular2/src/platform/dom/events/hammer_gestures.ts diff --git a/modules/angular2/src/core/render/dom/events/key_events.ts b/modules/angular2/src/platform/dom/events/key_events.ts similarity index 98% rename from modules/angular2/src/core/render/dom/events/key_events.ts rename to modules/angular2/src/platform/dom/events/key_events.ts index 54c74db418..46217b70df 100644 --- a/modules/angular2/src/core/render/dom/events/key_events.ts +++ b/modules/angular2/src/platform/dom/events/key_events.ts @@ -7,7 +7,7 @@ import { NumberWrapper } from 'angular2/src/facade/lang'; import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection'; -import {EventManagerPlugin} from './event_manager'; +import {EventManagerPlugin} from 'angular2/core'; import {NgZone} from 'angular2/src/core/zone/ng_zone'; import {Injectable} from 'angular2/src/core/di'; diff --git a/modules/angular2/src/core/render/dom/shared_styles_host.ts b/modules/angular2/src/platform/dom/shared_styles_host.ts similarity index 100% rename from modules/angular2/src/core/render/dom/shared_styles_host.ts rename to modules/angular2/src/platform/dom/shared_styles_host.ts diff --git a/modules/angular2/src/platform/dom/util.ts b/modules/angular2/src/platform/dom/util.ts new file mode 100644 index 0000000000..7f074e0f62 --- /dev/null +++ b/modules/angular2/src/platform/dom/util.ts @@ -0,0 +1,15 @@ +import {StringWrapper} from 'angular2/src/facade/lang'; + +var CAMEL_CASE_REGEXP = /([A-Z])/g; +var DASH_CASE_REGEXP = /-([a-z])/g; + + +export function camelCaseToDashCase(input: string): string { + return StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, + (m) => { return '-' + m[1].toLowerCase(); }); +} + +export function dashCaseToCamelCase(input: string): string { + return StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, + (m) => { return m[1].toUpperCase(); }); +} diff --git a/modules/angular2/src/core/dom/abstract_html_adapter.dart b/modules/angular2/src/platform/server/abstract_html_adapter.dart similarity index 99% rename from modules/angular2/src/core/dom/abstract_html_adapter.dart rename to modules/angular2/src/platform/server/abstract_html_adapter.dart index aefd31c5e6..d4b4665b28 100644 --- a/modules/angular2/src/core/dom/abstract_html_adapter.dart +++ b/modules/angular2/src/platform/server/abstract_html_adapter.dart @@ -3,7 +3,7 @@ library angular2.dom.abstractHtmlAdapter; import 'package:html/parser.dart' as parser; import 'package:html/dom.dart'; -import 'dom_adapter.dart'; +import 'package:angular2/core.dart'; import 'package:angular2/src/compiler/xhr.dart'; const _attrToPropMap = const { diff --git a/modules/angular2/src/core/dom/html_adapter.dart b/modules/angular2/src/platform/server/html_adapter.dart similarity index 88% rename from modules/angular2/src/core/dom/html_adapter.dart rename to modules/angular2/src/platform/server/html_adapter.dart index b8e1bcd3af..6ed42fe206 100644 --- a/modules/angular2/src/core/dom/html_adapter.dart +++ b/modules/angular2/src/platform/server/html_adapter.dart @@ -1,7 +1,7 @@ library angular2.dom.htmlAdapter; import 'abstract_html_adapter.dart'; -import 'dom_adapter.dart'; +import 'package:angular2/core.dart' show setRootDomAdapter; import 'dart:io'; class Html5LibDomAdapter extends AbstractHtml5LibAdapter { diff --git a/modules/angular2/src/core/dom/parse5_adapter.dart b/modules/angular2/src/platform/server/parse5_adapter.dart similarity index 100% rename from modules/angular2/src/core/dom/parse5_adapter.dart rename to modules/angular2/src/platform/server/parse5_adapter.dart diff --git a/modules/angular2/src/core/dom/parse5_adapter.ts b/modules/angular2/src/platform/server/parse5_adapter.ts similarity index 99% rename from modules/angular2/src/core/dom/parse5_adapter.ts rename to modules/angular2/src/platform/server/parse5_adapter.ts index 6c9141ada5..f038ecd0cf 100644 --- a/modules/angular2/src/core/dom/parse5_adapter.ts +++ b/modules/angular2/src/platform/server/parse5_adapter.ts @@ -4,7 +4,7 @@ var serializer = new parse5.Serializer(parse5.TreeAdapters.htmlparser2); var treeAdapter = parser.treeAdapter; import {MapWrapper, ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection'; -import {DomAdapter, setRootDomAdapter} from './dom_adapter'; +import {DomAdapter, setRootDomAdapter} from 'angular2/core'; import { isPresent, isBlank, diff --git a/modules/angular2/src/core/dom/webworker_adapter.dart b/modules/angular2/src/platform/server/webworker_adapter.dart similarity index 86% rename from modules/angular2/src/core/dom/webworker_adapter.dart rename to modules/angular2/src/platform/server/webworker_adapter.dart index d56853c68e..4a48ea72b9 100644 --- a/modules/angular2/src/core/dom/webworker_adapter.dart +++ b/modules/angular2/src/platform/server/webworker_adapter.dart @@ -1,7 +1,7 @@ library angular2.dom.webWorkerAdapter; import 'abstract_html_adapter.dart'; -import 'dom_adapter.dart'; +import 'package:angular2/core.dart' show setRootDomAdapter; class WebWorkerDomAdapter extends AbstractHtml5LibAdapter { static void makeCurrent() { diff --git a/modules/angular2/src/testing/benchmark_util.ts b/modules/angular2/src/testing/benchmark_util.ts index 635d6fedbb..d744cad271 100644 --- a/modules/angular2/src/testing/benchmark_util.ts +++ b/modules/angular2/src/testing/benchmark_util.ts @@ -1,4 +1,4 @@ -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {document, window} from 'angular2/src/facade/browser'; import {NumberWrapper, isBlank} from 'angular2/src/facade/lang'; import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; diff --git a/modules/angular2/src/testing/test_component_builder.ts b/modules/angular2/src/testing/test_component_builder.ts index 72ff6abd37..3fe5d62bcc 100644 --- a/modules/angular2/src/testing/test_component_builder.ts +++ b/modules/angular2/src/testing/test_component_builder.ts @@ -17,7 +17,7 @@ import { import {el} from './utils'; -import {DOCUMENT} from 'angular2/src/core/render/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {DebugElement, DebugElement_} from 'angular2/src/core/debug/debug_element'; diff --git a/modules/angular2/src/testing/test_injector.ts b/modules/angular2/src/testing/test_injector.ts index 1a05c952f1..9c97b6f9d1 100644 --- a/modules/angular2/src/testing/test_injector.ts +++ b/modules/angular2/src/testing/test_injector.ts @@ -21,12 +21,7 @@ import {NgZone} from 'angular2/src/core/zone/ng_zone'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; -import { - EventManager, - DomEventsPlugin, - EVENT_MANAGER_PLUGINS -} from 'angular2/src/core/render/dom/events/event_manager'; - +import {EventManager, EVENT_MANAGER_PLUGINS} from 'angular2/core'; import {MockDirectiveResolver} from 'angular2/src/mock/directive_resolver_mock'; import {MockViewResolver} from 'angular2/src/mock/view_resolver_mock'; import {MockLocationStrategy} from 'angular2/src/mock/mock_location_strategy'; @@ -36,7 +31,9 @@ import {MockNgZone} from 'angular2/src/mock/ng_zone_mock'; import {TestComponentBuilder} from './test_component_builder'; import {Injector} from 'angular2/src/core/di'; -import {ELEMENT_PROBE_PROVIDERS} from 'angular2/src/core/debug'; +import { + ELEMENT_PROBE_PROVIDERS +} from 'angular2/src/platform/browser/debug/debug_element_view_listener'; import {ListWrapper} from 'angular2/src/facade/collection'; import {FunctionWrapper, Type} from 'angular2/src/facade/lang'; @@ -45,17 +42,18 @@ import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view import {AppViewManager} from 'angular2/src/core/linker/view_manager'; import {AppViewManagerUtils} from 'angular2/src/core/linker/view_manager_utils'; import {Renderer} from 'angular2/src/core/render/api'; -import { - DomRenderer, - DOCUMENT, - SharedStylesHost, - DomSharedStylesHost -} from 'angular2/src/core/render/render'; + +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; +import {DomRenderer} from 'angular2/src/platform/dom/dom_renderer'; +import {DomSharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; +import {SharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; +import {DomEventsPlugin} from 'angular2/src/platform/dom/events/dom_events'; + import {APP_ID} from 'angular2/src/core/application_tokens'; import {Serializer} from "angular2/src/web_workers/shared/serializer"; import {Log} from './utils'; import {COMPILER_PROVIDERS} from 'angular2/src/compiler/compiler'; -import {DomRenderer_} from "angular2/src/core/render/dom/dom_renderer"; +import {DomRenderer_} from "angular2/src/platform/dom/dom_renderer"; import {DynamicComponentLoader_} from "angular2/src/core/linker/dynamic_component_loader"; import {AppViewManager_} from "angular2/src/core/linker/view_manager"; diff --git a/modules/angular2/src/web_workers/ui/di_bindings.ts b/modules/angular2/src/web_workers/ui/di_bindings.ts index abfee91c4c..42aa128fbe 100644 --- a/modules/angular2/src/web_workers/ui/di_bindings.ts +++ b/modules/angular2/src/web_workers/ui/di_bindings.ts @@ -5,26 +5,21 @@ import {AnimationBuilder} from 'angular2/src/animate/animation_builder'; import {BrowserDetails} from 'angular2/src/animate/browser_details'; import {Reflector, reflector} from 'angular2/src/core/reflection/reflection'; import {Parser, Lexer} from 'angular2/src/core/change_detection/change_detection'; -import { - EventManager, - DomEventsPlugin, - EVENT_MANAGER_PLUGINS -} from 'angular2/src/core/render/dom/events/event_manager'; +import {EventManager, EVENT_MANAGER_PLUGINS} from 'angular2/core'; import {ProtoViewFactory} from 'angular2/src/core/linker/proto_view_factory'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; -import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events'; -import {HammerGesturesPlugin} from 'angular2/src/core/render/dom/events/hammer_gestures'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; +import {KeyEventsPlugin} from 'angular2/src/platform/dom/events/key_events'; +import {HammerGesturesPlugin} from 'angular2/src/platform/dom/events/hammer_gestures'; import {AppViewPool, APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view_pool'; import {Renderer} from 'angular2/src/core/render/api'; import {AppRootUrl} from 'angular2/src/compiler/app_root_url'; -import {DomRenderer, DomRenderer_, DOCUMENT} from 'angular2/src/core/render/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; +import {DomRenderer, DomRenderer_} from 'angular2/src/platform/dom/dom_renderer'; +import {DomEventsPlugin} from 'angular2/src/platform/dom/events/dom_events'; import {APP_ID_RANDOM_PROVIDER} from 'angular2/src/core/application_tokens'; import {ElementSchemaRegistry} from 'angular2/src/compiler/schema/element_schema_registry'; import {DomElementSchemaRegistry} from 'angular2/src/compiler/schema/dom_element_schema_registry'; -import { - SharedStylesHost, - DomSharedStylesHost -} from 'angular2/src/core/render/dom/shared_styles_host'; +import {SharedStylesHost, DomSharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {NgZone} from 'angular2/src/core/zone/ng_zone'; import {AppViewManager, AppViewManager_} from 'angular2/src/core/linker/view_manager'; diff --git a/modules/angular2/src/web_workers/ui/impl.ts b/modules/angular2/src/web_workers/ui/impl.ts index 92abec8901..a237c13dec 100644 --- a/modules/angular2/src/web_workers/ui/impl.ts +++ b/modules/angular2/src/web_workers/ui/impl.ts @@ -9,7 +9,7 @@ import {createInjector} from "./di_bindings"; import {MessageBus, MessageBusSink} from "angular2/src/web_workers/shared/message_bus"; import {createNgZone} from 'angular2/src/core/application_ref'; import {Injectable} from 'angular2/src/core/di'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {wtfInit} from 'angular2/src/core/profile/wtf_init'; import {WebWorkerSetup} from 'angular2/src/web_workers/ui/setup'; import {MessageBasedRenderer} from 'angular2/src/web_workers/ui/renderer'; diff --git a/modules/angular2/src/web_workers/worker/application.dart b/modules/angular2/src/web_workers/worker/application.dart index 18b753d805..8703716330 100644 --- a/modules/angular2/src/web_workers/worker/application.dart +++ b/modules/angular2/src/web_workers/worker/application.dart @@ -10,7 +10,7 @@ import "package:angular2/src/core/linker/dynamic_component_loader.dart" import "dart:isolate"; import "dart:async"; import 'dart:core'; -import 'package:angular2/src/core/dom/webworker_adapter.dart'; +import 'package:angular2/src/platform/server/webworker_adapter.dart'; /** * Bootstrapping a Webworker Application diff --git a/modules/angular2/src/web_workers/worker/application.ts b/modules/angular2/src/web_workers/worker/application.ts index b3c29ca74c..7eec9d15a6 100644 --- a/modules/angular2/src/web_workers/worker/application.ts +++ b/modules/angular2/src/web_workers/worker/application.ts @@ -10,7 +10,7 @@ import {Promise} from 'angular2/src/facade/async'; import {bootstrapWebWorkerCommon} from "angular2/src/web_workers/worker/application_common"; import {ComponentRef} from "angular2/src/core/linker/dynamic_component_loader"; export * from "angular2/src/web_workers/shared/message_bus"; -import {Parse5DomAdapter} from 'angular2/src/core/dom/parse5_adapter'; +import {Parse5DomAdapter} from 'angular2/src/platform/server/parse5_adapter'; // TODO(jteplitz602) remove this and compile with lib.webworker.d.ts (#3492) interface PostMessageInterface { diff --git a/modules/angular2/test/common/forms/integration_spec.ts b/modules/angular2/test/common/forms/integration_spec.ts index 677c9b11f9..9560c83a0f 100644 --- a/modules/angular2/test/common/forms/integration_spec.ts +++ b/modules/angular2/test/common/forms/integration_spec.ts @@ -36,7 +36,7 @@ import { forwardRef, Validator } from 'angular2/core'; -import {By} from 'angular2/src/core/debug'; +import {By} from 'angular2/platform/browser'; import {ListWrapper} from 'angular2/src/facade/collection'; import {ObservableWrapper} from 'angular2/src/facade/async'; import {CONST_EXPR} from 'angular2/src/facade/lang'; diff --git a/modules/angular2/test/core/debug/debug_element_spec.ts b/modules/angular2/test/core/debug/debug_element_spec.ts index 0550a8b010..5f3806a7ea 100644 --- a/modules/angular2/test/core/debug/debug_element_spec.ts +++ b/modules/angular2/test/core/debug/debug_element_spec.ts @@ -19,7 +19,8 @@ import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {PromiseWrapper, EventEmitter, ObservableWrapper} from 'angular2/src/facade/async'; import {Injectable, NgFor, NgIf} from 'angular2/core'; -import {By, Scope} from 'angular2/src/core/debug'; +import {Scope} from 'angular2/core'; +import {By} from 'angular2/platform/browser'; import { Directive, diff --git a/modules/angular2/test/core/dom/html5lib_adapter.server.spec.dart b/modules/angular2/test/core/dom/html5lib_adapter.server.spec.dart index c044adc29e..5b8e1af2df 100644 --- a/modules/angular2/test/core/dom/html5lib_adapter.server.spec.dart +++ b/modules/angular2/test/core/dom/html5lib_adapter.server.spec.dart @@ -2,7 +2,7 @@ library angular2.dom.html5lib_adapter.test; import 'package:guinness/guinness.dart'; import 'package:unittest/unittest.dart' hide expect; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; // A smoke-test of the adapter. It is primarily tested by the compiler. main() { diff --git a/modules/angular2/test/core/forward_ref_integration_spec.ts b/modules/angular2/test/core/forward_ref_integration_spec.ts index 0e898f5fe4..fe80304bd5 100644 --- a/modules/angular2/test/core/forward_ref_integration_spec.ts +++ b/modules/angular2/test/core/forward_ref_integration_spec.ts @@ -24,7 +24,7 @@ import { View } from 'angular2/core'; import {Type} from 'angular2/src/facade/lang'; -import {asNativeElements} from 'angular2/src/core/debug'; +import {asNativeElements} from 'angular2/core'; export function main() { describe("forwardRef integration", function() { diff --git a/modules/angular2/test/core/linker/dynamic_component_loader_spec.ts b/modules/angular2/test/core/linker/dynamic_component_loader_spec.ts index 72fdbbe22e..fdf3b88736 100644 --- a/modules/angular2/test/core/linker/dynamic_component_loader_spec.ts +++ b/modules/angular2/test/core/linker/dynamic_component_loader_spec.ts @@ -17,12 +17,12 @@ import { } from 'angular2/testing_internal'; import {OnDestroy} from 'angular2/lifecycle_hooks'; -import {Injector, NgIf} from 'angular2/core'; -import {inspectElement, By} from 'angular2/src/core/debug'; +import {Injector, NgIf, inspectElement} from 'angular2/core'; +import {By} from 'angular2/platform/browser'; import {Component, View, ViewMetadata} from 'angular2/src/core/metadata'; import {DynamicComponentLoader} from 'angular2/src/core/linker/dynamic_component_loader'; import {ElementRef} from 'angular2/src/core/linker/element_ref'; -import {DOCUMENT} from 'angular2/src/core/render/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {ComponentFixture_} from "angular2/src/testing/test_component_builder"; diff --git a/modules/angular2/test/core/linker/integration_dart_spec.dart b/modules/angular2/test/core/linker/integration_dart_spec.dart index 6abfbdfd0d..685253041f 100644 --- a/modules/angular2/test/core/linker/integration_dart_spec.dart +++ b/modules/angular2/test/core/linker/integration_dart_spec.dart @@ -3,7 +3,7 @@ library angular2.test.di.integration_dart_spec; import 'package:angular2/angular2.dart'; import 'package:angular2/core.dart'; -import 'package:angular2/src/core/debug.dart'; +import 'package:angular2/src/core/debug/debug_element.dart'; import 'package:angular2/testing_internal.dart'; import 'package:observe/observe.dart'; import 'package:angular2/src/core/change_detection/differs/default_iterable_differ.dart'; diff --git a/modules/angular2/test/core/linker/integration_spec.ts b/modules/angular2/test/core/linker/integration_spec.ts index f12b41d07f..86f90232d0 100644 --- a/modules/angular2/test/core/linker/integration_spec.ts +++ b/modules/angular2/test/core/linker/integration_spec.ts @@ -91,7 +91,7 @@ import {Compiler} from 'angular2/src/core/linker/compiler'; import {ElementRef} from 'angular2/src/core/linker/element_ref'; import {TemplateRef} from 'angular2/src/core/linker/template_ref'; -import {DomRenderer} from 'angular2/src/core/render/dom/dom_renderer'; +import {DomRenderer} from 'angular2/src/platform/dom/dom_renderer'; import {IS_DART} from 'angular2/src/facade/lang'; const ANCHOR_ELEMENT = CONST_EXPR(new OpaqueToken('AnchorElement')); diff --git a/modules/angular2/test/core/linker/projection_integration_spec.ts b/modules/angular2/test/core/linker/projection_integration_spec.ts index df4031ddea..731e68d982 100644 --- a/modules/angular2/test/core/linker/projection_integration_spec.ts +++ b/modules/angular2/test/core/linker/projection_integration_spec.ts @@ -9,7 +9,7 @@ import { expect, iit, inject, - beforeEachBindings, + beforeEachProviders, it, xit, containsRegexp, @@ -36,11 +36,11 @@ import { ViewEncapsulation, ViewMetadata } from 'angular2/core'; -import {By} from 'angular2/src/core/debug'; +import {By} from 'angular2/platform/browser'; export function main() { describe('projection', () => { - beforeEachBindings(() => [provide(AppViewListener, {useClass: AppViewListener})]); + beforeEachProviders(() => [provide(AppViewListener, {useClass: AppViewListener})]); it('should support simple components', inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { diff --git a/modules/angular2/test/core/linker/query_integration_spec.ts b/modules/angular2/test/core/linker/query_integration_spec.ts index bab6fd1763..5636b719bd 100644 --- a/modules/angular2/test/core/linker/query_integration_spec.ts +++ b/modules/angular2/test/core/linker/query_integration_spec.ts @@ -37,9 +37,8 @@ import { AfterViewChecked } from 'angular2/core'; -import {asNativeElements} from 'angular2/src/core/debug'; - -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {asNativeElements} from 'angular2/core'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; export function main() { BrowserDomAdapter.makeCurrent(); diff --git a/modules/angular2/test/core/linker/view_manager_utils_spec.ts b/modules/angular2/test/core/linker/view_manager_utils_spec.ts index d755b0f803..23c9182ff2 100644 --- a/modules/angular2/test/core/linker/view_manager_utils_spec.ts +++ b/modules/angular2/test/core/linker/view_manager_utils_spec.ts @@ -42,7 +42,7 @@ import { import {DirectiveResolver} from 'angular2/src/core/linker/directive_resolver'; import {Component} from 'angular2/src/core/metadata'; import {AppViewManagerUtils} from 'angular2/src/core/linker/view_manager_utils'; -import {RenderViewWithFragments} from 'angular2/src/core/render/render'; +import {RenderViewWithFragments} from 'angular2/render'; export function main() { // TODO(tbosch): add more tests here! diff --git a/modules/angular2/test/core/render/dom/events/event_manager_spec.ts b/modules/angular2/test/core/render/dom/events/event_manager_spec.ts index 9835780170..b09680308b 100644 --- a/modules/angular2/test/core/render/dom/events/event_manager_spec.ts +++ b/modules/angular2/test/core/render/dom/events/event_manager_spec.ts @@ -9,11 +9,8 @@ import { beforeEach, el } from 'angular2/testing_internal'; -import { - EventManager, - EventManagerPlugin, - DomEventsPlugin -} from 'angular2/src/core/render/dom/events/event_manager'; +import {EventManager, EventManagerPlugin} from 'angular2/core'; +import {DomEventsPlugin} from 'angular2/src/platform/dom/events/dom_events'; import {NgZone} from 'angular2/src/core/zone/ng_zone'; import {ListWrapper, Map, MapWrapper} from 'angular2/src/facade/collection'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; diff --git a/modules/angular2/test/core/render/dom/events/key_events_spec.ts b/modules/angular2/test/core/render/dom/events/key_events_spec.ts index 4f7d7f2784..b09be3df04 100644 --- a/modules/angular2/test/core/render/dom/events/key_events_spec.ts +++ b/modules/angular2/test/core/render/dom/events/key_events_spec.ts @@ -9,7 +9,7 @@ import { beforeEach, el } from 'angular2/testing_internal'; -import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events'; +import {KeyEventsPlugin} from 'angular2/src/platform/dom/events/key_events'; export function main() { describe('KeyEvents', () => { diff --git a/modules/angular2/test/core/render/dom/shared_styles_host_spec.ts b/modules/angular2/test/core/render/dom/shared_styles_host_spec.ts index 7d09bc93c9..26bde578a5 100644 --- a/modules/angular2/test/core/render/dom/shared_styles_host_spec.ts +++ b/modules/angular2/test/core/render/dom/shared_styles_host_spec.ts @@ -17,7 +17,7 @@ import { } from 'angular2/testing_internal'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; -import {DomSharedStylesHost} from 'angular2/src/core/render/dom/shared_styles_host'; +import {DomSharedStylesHost} from 'angular2/src/platform/dom/shared_styles_host'; export function main() { describe('DomSharedStylesHost', () => { diff --git a/modules/angular2/test/platform/bootstrap_spec.ts b/modules/angular2/test/platform/bootstrap_spec.ts index f751d15624..f6fb51b8bc 100644 --- a/modules/angular2/test/platform/bootstrap_spec.ts +++ b/modules/angular2/test/platform/bootstrap_spec.ts @@ -16,7 +16,7 @@ import {ApplicationRef} from 'angular2/src/core/application_ref'; import {Component, Directive, View, OnDestroy, platform} from 'angular2/core'; import {BROWSER_PROVIDERS, BROWSER_APP_PROVIDERS} from 'angular2/platform/browser'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; -import {DOCUMENT} from 'angular2/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; import {PromiseWrapper} from 'angular2/src/facade/async'; import {provide, Inject, Injector} from 'angular2/core'; import {ExceptionHandler} from 'angular2/src/facade/exceptions'; diff --git a/modules/angular2/test/core/debug/debug_element_view_listener_spec.ts b/modules/angular2/test/platform/browser/debug/debug_element_view_listener_spec.ts similarity index 92% rename from modules/angular2/test/core/debug/debug_element_view_listener_spec.ts rename to modules/angular2/test/platform/browser/debug/debug_element_view_listener_spec.ts index bc538e3ea1..4c545d6148 100644 --- a/modules/angular2/test/core/debug/debug_element_view_listener_spec.ts +++ b/modules/angular2/test/platform/browser/debug/debug_element_view_listener_spec.ts @@ -8,7 +8,7 @@ import { expect, iit, inject, - beforeEachBindings, + beforeEachProviders, it, xit, TestComponentBuilder, @@ -16,7 +16,7 @@ import { import {global} from 'angular2/src/facade/lang'; import {APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view_pool'; import {provide, Component, Directive, Injectable, View} from 'angular2/core'; -import {inspectNativeElement} from 'angular2/src/core/debug'; +import {inspectNativeElement} from 'angular2/platform/browser'; import {IS_DART} from 'angular2/src/facade/lang'; @Component({selector: 'my-comp'}) @@ -28,7 +28,7 @@ class MyComp { export function main() { describe('element probe', function() { - beforeEachBindings(() => [provide(APP_VIEW_POOL_CAPACITY, {useValue: 0})]); + beforeEachProviders(() => [provide(APP_VIEW_POOL_CAPACITY, {useValue: 0})]); it('should return a TestElement from a dom element', inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { diff --git a/modules/angular2/test/core/services/rectangle_mock.dart b/modules/angular2/test/platform/browser/rectangle_mock.dart similarity index 100% rename from modules/angular2/test/core/services/rectangle_mock.dart rename to modules/angular2/test/platform/browser/rectangle_mock.dart diff --git a/modules/angular2/test/core/services/rectangle_mock.ts b/modules/angular2/test/platform/browser/rectangle_mock.ts similarity index 100% rename from modules/angular2/test/core/services/rectangle_mock.ts rename to modules/angular2/test/platform/browser/rectangle_mock.ts diff --git a/modules/angular2/test/core/services/ruler_spec.ts b/modules/angular2/test/platform/browser/ruler_spec.ts similarity index 92% rename from modules/angular2/test/core/services/ruler_spec.ts rename to modules/angular2/test/platform/browser/ruler_spec.ts index 2d12d1782b..f3ec7c0b96 100644 --- a/modules/angular2/test/core/services/ruler_spec.ts +++ b/modules/angular2/test/platform/browser/ruler_spec.ts @@ -9,11 +9,11 @@ import { expect, SpyObject } from 'angular2/testing_internal'; -import {SpyElementRef, SpyDomAdapter} from '../spies'; +import {SpyElementRef, SpyDomAdapter} from '../../core/spies'; import {DOM, DomAdapter} from 'angular2/src/core/dom/dom_adapter'; -import {Ruler, Rectangle} from 'angular2/src/core/services/ruler'; +import {Ruler, Rectangle} from 'angular2/src/platform/browser/ruler'; import {createRectangle} from './rectangle_mock'; function assertDimensions(rect: Rectangle, left, right, top, bottom, width, height) { diff --git a/modules/angular2/test/core/services/static_assets/200.html b/modules/angular2/test/platform/browser/static_assets/200.html similarity index 100% rename from modules/angular2/test/core/services/static_assets/200.html rename to modules/angular2/test/platform/browser/static_assets/200.html diff --git a/modules/angular2/test/core/services/title_spec.ts b/modules/angular2/test/platform/browser/title_spec.ts similarity index 93% rename from modules/angular2/test/core/services/title_spec.ts rename to modules/angular2/test/platform/browser/title_spec.ts index 647c628ffb..b8eda62cb9 100644 --- a/modules/angular2/test/core/services/title_spec.ts +++ b/modules/angular2/test/platform/browser/title_spec.ts @@ -1,7 +1,6 @@ import {ddescribe, describe, it, iit, xit, expect, afterEach} from 'angular2/testing_internal'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; - -import {Title} from 'angular2/src/core/services/title'; +import {Title} from 'angular2/platform/browser'; export function main() { describe('title service', () => { diff --git a/modules/angular2/test/platform/xhr_impl_spec.ts b/modules/angular2/test/platform/xhr_impl_spec.ts index 91906410c0..80a782d654 100644 --- a/modules/angular2/test/platform/xhr_impl_spec.ts +++ b/modules/angular2/test/platform/xhr_impl_spec.ts @@ -16,8 +16,8 @@ import {PromiseWrapper} from 'angular2/src/facade/async'; export function main() { describe('XHRImpl', () => { var xhr: XHRImpl; - var url200 = '/base/modules/angular2/test/core/services/static_assets/200.html'; - var url404 = '/base/modules/angular2/test/core/services/static_assets/404.html'; + var url200 = '/base/modules/angular2/test/platform/browser/static_assets/200.html'; + var url404 = '/base/modules/angular2/test/platform/browser/static_assets/404.html'; beforeEach(() => { xhr = new XHRImpl(); }); diff --git a/modules/angular2/test/public_api_spec.ts b/modules/angular2/test/public_api_spec.ts index 884fa6fd78..4e4dfa14c7 100644 --- a/modules/angular2/test/public_api_spec.ts +++ b/modules/angular2/test/public_api_spec.ts @@ -129,6 +129,121 @@ var NG_ALL = [ 'Binding.toValue', 'BROWSER_APP_PROVIDERS:js', 'BROWSER_PROVIDERS:js', + + 'BrowserDomAdapter:js', + 'BrowserDomAdapter#makeCurrent():js', + 'BrowserDomAdapter.addClass():js', + 'BrowserDomAdapter.adoptNode():js', + 'BrowserDomAdapter.appendChild():js', + 'BrowserDomAdapter.attrToPropMap:js', + 'BrowserDomAdapter.attributeMap():js', + 'BrowserDomAdapter.cancelAnimationFrame():js', + 'BrowserDomAdapter.childNodes():js', + 'BrowserDomAdapter.childNodesAsList():js', + 'BrowserDomAdapter.classList():js', + 'BrowserDomAdapter.clearNodes():js', + 'BrowserDomAdapter.clone():js', + 'BrowserDomAdapter.content():js', + 'BrowserDomAdapter.createComment():js', + 'BrowserDomAdapter.createElement():js', + 'BrowserDomAdapter.createElementNS():js', + 'BrowserDomAdapter.createEvent():js', + 'BrowserDomAdapter.createHtmlDocument():js', + 'BrowserDomAdapter.createMouseEvent():js', + 'BrowserDomAdapter.createScriptTag():js', + 'BrowserDomAdapter.createShadowRoot():js', + 'BrowserDomAdapter.createStyleElement():js', + 'BrowserDomAdapter.createTemplate():js', + 'BrowserDomAdapter.createTextNode():js', + 'BrowserDomAdapter.defaultDoc():js', + 'BrowserDomAdapter.dispatchEvent():js', + 'BrowserDomAdapter.elementMatches():js', + 'BrowserDomAdapter.firstChild():js', + 'BrowserDomAdapter.getAnimationPrefix():js', + 'BrowserDomAdapter.getAttribute():js', + 'BrowserDomAdapter.getBaseHref():js', + 'BrowserDomAdapter.getBoundingClientRect():js', + 'BrowserDomAdapter.getChecked():js', + 'BrowserDomAdapter.getComputedStyle():js', + 'BrowserDomAdapter.getData():js', + 'BrowserDomAdapter.getDistributedNodes():js', + 'BrowserDomAdapter.getElementsByClassName():js', + 'BrowserDomAdapter.getElementsByTagName():js', + 'BrowserDomAdapter.getEventKey():js', + 'BrowserDomAdapter.getGlobalEventTarget():js', + 'BrowserDomAdapter.getHistory():js', + 'BrowserDomAdapter.getHost():js', + 'BrowserDomAdapter.getHref():js', + 'BrowserDomAdapter.getInnerHTML():js', + 'BrowserDomAdapter.getLocation():js', + 'BrowserDomAdapter.getOuterHTML():js', + 'BrowserDomAdapter.getProperty():js', + 'BrowserDomAdapter.getShadowRoot():js', + 'BrowserDomAdapter.getStyle():js', + 'BrowserDomAdapter.getText():js', + 'BrowserDomAdapter.getTitle():js', + 'BrowserDomAdapter.getTransitionEnd():js', + 'BrowserDomAdapter.getUserAgent():js', + 'BrowserDomAdapter.getValue():js', + 'BrowserDomAdapter.getXHR():js', + 'BrowserDomAdapter.hasAttribute():js', + 'BrowserDomAdapter.hasClass():js', + 'BrowserDomAdapter.hasProperty():js', + 'BrowserDomAdapter.hasShadowRoot():js', + 'BrowserDomAdapter.importIntoDoc():js', + 'BrowserDomAdapter.insertAfter():js', + 'BrowserDomAdapter.insertAllBefore():js', + 'BrowserDomAdapter.insertBefore():js', + 'BrowserDomAdapter.invoke():js', + 'BrowserDomAdapter.isCommentNode():js', + 'BrowserDomAdapter.isElementNode():js', + 'BrowserDomAdapter.isPrevented():js', + 'BrowserDomAdapter.isShadowRoot():js', + 'BrowserDomAdapter.isTemplateElement():js', + 'BrowserDomAdapter.isTextNode():js', + 'BrowserDomAdapter.log():js', + 'BrowserDomAdapter.logError():js', + 'BrowserDomAdapter.logGroup():js', + 'BrowserDomAdapter.logGroupEnd():js', + 'BrowserDomAdapter.nextSibling():js', + 'BrowserDomAdapter.nodeName():js', + 'BrowserDomAdapter.nodeValue():js', + 'BrowserDomAdapter.on():js', + 'BrowserDomAdapter.onAndCancel():js', + 'BrowserDomAdapter.parentElement():js', + 'BrowserDomAdapter.parse():js', + 'BrowserDomAdapter.performanceNow():js', + 'BrowserDomAdapter.preventDefault():js', + 'BrowserDomAdapter.query():js', + 'BrowserDomAdapter.querySelector():js', + 'BrowserDomAdapter.querySelectorAll():js', + 'BrowserDomAdapter.remove():js', + 'BrowserDomAdapter.removeAttribute():js', + 'BrowserDomAdapter.removeChild():js', + 'BrowserDomAdapter.removeClass():js', + 'BrowserDomAdapter.removeStyle():js', + 'BrowserDomAdapter.replaceChild():js', + 'BrowserDomAdapter.requestAnimationFrame():js', + 'BrowserDomAdapter.resetBaseElement():js', + 'BrowserDomAdapter.resolveAndSetHref():js', + 'BrowserDomAdapter.setAttribute():js', + 'BrowserDomAdapter.setAttributeNS():js', + 'BrowserDomAdapter.setChecked():js', + 'BrowserDomAdapter.setData():js', + 'BrowserDomAdapter.setGlobalVar():js', + 'BrowserDomAdapter.setInnerHTML():js', + 'BrowserDomAdapter.setProperty():js', + 'BrowserDomAdapter.setStyle():js', + 'BrowserDomAdapter.setText():js', + 'BrowserDomAdapter.setTitle():js', + 'BrowserDomAdapter.setValue():js', + 'BrowserDomAdapter.supportsAnimation():js', + 'BrowserDomAdapter.supportsDOMEvents():js', + 'BrowserDomAdapter.supportsNativeShadowDOM():js', + 'BrowserDomAdapter.tagName():js', + 'BrowserDomAdapter.templateAwareRoot():js', + 'BrowserDomAdapter.type():js', + 'Provider', 'Provider.dependencies', 'Provider.multi', @@ -144,10 +259,10 @@ var NG_ALL = [ 'ProviderBuilder.toValue()', 'ProviderBuilder.token', 'ProviderBuilder.token=', - 'By#all()', - 'By#css()', - 'By#directive()', - 'By', + 'By#all():js', + 'By#css():js', + 'By#directive():js', + 'By:js', 'CORE_DIRECTIVES', 'COMMON_DIRECTIVES', 'PLATFORM_DIRECTIVES:js', @@ -479,14 +594,19 @@ var NG_ALL = [ 'DirectiveResolver', 'DirectiveResolver.resolve()', 'DynamicComponentLoader', + 'DomAdapter', + 'DomAdapter.attrToPropMap:dart', + 'DomAdapter.attrToPropMap=:dart', + 'setRootDomAdapter()', + 'DOM', /* Abstract methods 'DynamicComponentLoader.loadAsRoot()', 'DynamicComponentLoader.loadIntoLocation()', 'DynamicComponentLoader.loadNextToLocation()', */ - 'ELEMENT_PROBE_PROVIDERS', - 'ELEMENT_PROBE_BINDINGS', + 'ELEMENT_PROBE_PROVIDERS:js', + 'ELEMENT_PROBE_BINDINGS:js', 'ElementRef', 'ElementRef.boundElementIndex', 'ElementRef.boundElementIndex=', @@ -494,6 +614,17 @@ var NG_ALL = [ 'ElementRef.parentView', 'ElementRef.parentView=', 'ElementRef.renderView', + 'EVENT_MANAGER_PLUGINS', + 'EventManager', + 'EventManager.addEventListener()', + 'EventManager.addGlobalEventListener()', + 'EventManager.getZone()', + 'EventManagerPlugin', + 'EventManagerPlugin.addEventListener()', + 'EventManagerPlugin.addGlobalEventListener()', + 'EventManagerPlugin.supports()', + 'EventManagerPlugin.manager:dart', + 'EventManagerPlugin.manager=:dart', 'ErrorHandlingFn:dart', 'Output', 'Output.bindingPropertyName', @@ -1112,10 +1243,27 @@ var NG_ALL = [ Abstract method 'TemplateRef.hasLocal()', */ + 'Testability', + 'Testability.decreasePendingRequestCount()', + 'Testability.findBindings()', + 'Testability.findProviders()', + 'Testability.getPendingRequestCount()', + 'Testability.increasePendingRequestCount()', + 'Testability.isAngularEventPending()', + 'Testability.isStable()', + 'Testability.whenStable()', + 'TestabilityRegistry', + 'TestabilityRegistry.findTestabilityInTree()', + 'TestabilityRegistry.getAllTestabilities()', + 'TestabilityRegistry.getTestability()', + 'TestabilityRegistry.registerApplication()', + 'GetTestability:dart', + 'setTestabilityGetter()', + 'Type:js', - 'Title', - 'Title.getTitle()', - 'Title.setTitle()', + 'Title:js', + 'Title.getTitle():js', + 'Title.setTitle():js', 'TypeLiteral', 'TypeLiteral.type', 'UpperCasePipe', @@ -1242,7 +1390,7 @@ var NG_ALL = [ 'createNgZone()', 'forwardRef():js', 'inspectElement()', - 'inspectNativeElement()', + 'inspectNativeElement():js', 'platform():js', 'resolveForwardRef():js', 'wtfCreateScope():js', @@ -1313,6 +1461,17 @@ var NG_ALL = [ 'RenderElementRef.renderView=', 'RenderEventDispatcher:dart', 'RenderNgContentCmd.index', + 'RenderComponentTemplate', + 'RenderComponentTemplate.commands', + 'RenderComponentTemplate.commands=', + 'RenderComponentTemplate.encapsulation', + 'RenderComponentTemplate.encapsulation=', + 'RenderComponentTemplate.id', + 'RenderComponentTemplate.id=', + 'RenderComponentTemplate.shortId', + 'RenderComponentTemplate.shortId=', + 'RenderComponentTemplate.styles', + 'RenderComponentTemplate.styles=', 'Stream:dart', 'Stream.any():dart', 'Stream.asBroadcastStream():dart', diff --git a/modules/angular2/test/router/integration/router_integration_spec.ts b/modules/angular2/test/router/integration/router_integration_spec.ts index 4e85d2c06d..a17bed2d60 100644 --- a/modules/angular2/test/router/integration/router_integration_spec.ts +++ b/modules/angular2/test/router/integration/router_integration_spec.ts @@ -18,7 +18,7 @@ import {bootstrap} from 'angular2/bootstrap'; import {Component, Directive, View} from 'angular2/src/core/metadata'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {provide} from 'angular2/core'; -import {DOCUMENT} from 'angular2/src/core/render/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; import {RouteConfig, Route, Redirect} from 'angular2/src/router/route_config_decorator'; import {PromiseWrapper} from 'angular2/src/facade/async'; import {BaseException, WrappedException} from 'angular2/src/facade/exceptions'; diff --git a/modules/angular2/test/router/route_config_spec.ts b/modules/angular2/test/router/route_config_spec.ts index 4876f62a73..9b9d455bcd 100644 --- a/modules/angular2/test/router/route_config_spec.ts +++ b/modules/angular2/test/router/route_config_spec.ts @@ -15,7 +15,7 @@ import {bootstrap} from 'angular2/bootstrap'; import {Component, Directive, View} from 'angular2/src/core/metadata'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {provide} from 'angular2/core'; -import {DOCUMENT} from 'angular2/src/core/render/render'; +import {DOCUMENT} from 'angular2/src/platform/dom/dom_tokens'; import {Type} from 'angular2/src/facade/lang'; import { diff --git a/modules/angular2/test/router/router_link_spec.ts b/modules/angular2/test/router/router_link_spec.ts index 5e5a6e5c6d..f6e1816568 100644 --- a/modules/angular2/test/router/router_link_spec.ts +++ b/modules/angular2/test/router/router_link_spec.ts @@ -17,7 +17,7 @@ import { import {SpyRouter, SpyLocation} from './spies'; import {provide, Component, View} from 'angular2/core'; -import {By} from 'angular2/src/core/debug'; +import {By} from 'angular2/platform/browser'; import { Location, diff --git a/modules/angular2/test/web_workers/debug_tools/bootstrap.server.spec.dart b/modules/angular2/test/web_workers/debug_tools/bootstrap.server.spec.dart index e6e479f3b4..cc41581663 100644 --- a/modules/angular2/test/web_workers/debug_tools/bootstrap.server.spec.dart +++ b/modules/angular2/test/web_workers/debug_tools/bootstrap.server.spec.dart @@ -1,6 +1,6 @@ library angular2.test.web_workers.debug_tools.bootstrap; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import "package:angular2/testing_internal.dart"; import "package:angular2/src/core/reflection/reflection_capabilities.dart"; import "package:angular2/src/core/reflection/reflection.dart"; diff --git a/modules/angular2/test/web_workers/worker/renderer_integration_spec.ts b/modules/angular2/test/web_workers/worker/renderer_integration_spec.ts index 9beff59314..a7286027b7 100644 --- a/modules/angular2/test/web_workers/worker/renderer_integration_spec.ts +++ b/modules/angular2/test/web_workers/worker/renderer_integration_spec.ts @@ -39,7 +39,7 @@ import { RenderFragmentRef, Renderer } from "angular2/src/core/render/api"; -import {DomRenderer, DomRenderer_} from 'angular2/src/core/render/dom/dom_renderer'; +import {DomRenderer, DomRenderer_} from 'angular2/src/platform/dom/dom_renderer'; import {DefaultRenderView} from 'angular2/src/core/render/view'; import { RenderProtoViewRefStore, diff --git a/modules/angular2/web_worker/worker.ts b/modules/angular2/web_worker/worker.ts index 884a9ceca0..4850b68b65 100644 --- a/modules/angular2/web_worker/worker.ts +++ b/modules/angular2/web_worker/worker.ts @@ -8,7 +8,9 @@ export * from 'angular2/src/facade/facade'; // web_worker exports its own // export * from '../src/core/application'; export * from '../src/core/application_ref'; -export * from '../src/core/services'; +export * from '../src/platform/browser/ruler'; +export * from '../src/platform/browser/title'; +export * from '../src/compiler/url_resolver'; export * from '../src/core/linker'; export * from '../src/core/zone'; // Do not export render in web_worker @@ -31,10 +33,10 @@ export { RenderBeginComponentCmd, RenderEmbeddedTemplateCmd, RenderBeginCmd -} from '../src/core/render/render'; +} from '../src/core/render/api'; export * from '../src/common/directives'; export * from '../src/common/forms'; -export * from '../src/core/debug'; +export {DebugElement} from '../src/core/debug/debug_element'; export * from '../src/core/change_detection'; export * from '../profile'; diff --git a/modules/angular2_material/test/button_spec.ts b/modules/angular2_material/test/button_spec.ts index 1ddbe04ff7..cd51d97f01 100644 --- a/modules/angular2_material/test/button_spec.ts +++ b/modules/angular2_material/test/button_spec.ts @@ -2,7 +2,7 @@ import { AsyncTestCompleter, TestComponentBuilder, beforeEach, - beforeEachBindings, + beforeEachProviders, ddescribe, describe, el, @@ -14,7 +14,8 @@ import { } from 'angular2/testing_internal'; import {DebugElement} from 'angular2/src/core/debug/debug_element'; -import {Component, View, ViewMetadata, UrlResolver, bind, provide} from 'angular2/core'; +import {Component, View, ViewMetadata, bind, provide} from 'angular2/core'; +import {UrlResolver} from 'angular2/compiler'; import {MdButton, MdAnchor} from 'angular2_material/src/components/button/button'; @@ -25,11 +26,10 @@ export function main() { describe('MdButton', () => { let builder: TestComponentBuilder; - beforeEachBindings(() => [ + beforeEachProviders(() => [ // Need a custom URL resolver for ng-material template files in order for them to work // with both JS and Dart output. - bind(UrlResolver) - .toValue(new TestUrlResolver()), + provide(UrlResolver, {useValue: new TestUrlResolver()}) ]); beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; })); diff --git a/modules/angular2_material/test/test_url_resolver.dart b/modules/angular2_material/test/test_url_resolver.dart index cbc582def7..4d6e6304bb 100644 --- a/modules/angular2_material/test/test_url_resolver.dart +++ b/modules/angular2_material/test/test_url_resolver.dart @@ -1,6 +1,6 @@ library ng_material.test_url_resolver; -import 'package:angular2/src/core/dom/browser_adapter.dart'; +import 'package:angular2/src/platform/browser/browser_adapter.dart'; import 'package:angular2/src/compiler/url_resolver.dart'; void commonDemoSetup() { diff --git a/modules/benchmarks/src/change_detection/change_detection_benchmark.ts b/modules/benchmarks/src/change_detection/change_detection_benchmark.ts index 4a3c437915..00e9152d69 100644 --- a/modules/benchmarks/src/change_detection/change_detection_benchmark.ts +++ b/modules/benchmarks/src/change_detection/change_detection_benchmark.ts @@ -1,7 +1,7 @@ import {reflector} from 'angular2/src/core/reflection/reflection'; import {isPresent} from 'angular2/src/facade/lang'; import {getIntParameter, bindAction, microBenchmark} from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import { Lexer, diff --git a/modules/benchmarks/src/compiler/compiler_benchmark.ts b/modules/benchmarks/src/compiler/compiler_benchmark.ts index 7fc8b433d4..4050be058b 100644 --- a/modules/benchmarks/src/compiler/compiler_benchmark.ts +++ b/modules/benchmarks/src/compiler/compiler_benchmark.ts @@ -1,5 +1,5 @@ import {bootstrap} from 'angular2/bootstrap'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {PromiseWrapper} from 'angular2/src/facade/async'; import {ListWrapper, Map, MapWrapper} from 'angular2/src/facade/collection'; diff --git a/modules/benchmarks/src/compiler/selector_benchmark.ts b/modules/benchmarks/src/compiler/selector_benchmark.ts index b197c7c9e1..3ff9ec546a 100644 --- a/modules/benchmarks/src/compiler/selector_benchmark.ts +++ b/modules/benchmarks/src/compiler/selector_benchmark.ts @@ -2,7 +2,7 @@ import {SelectorMatcher} from "angular2/src/compiler/selector"; import {CssSelector} from "angular2/src/compiler/selector"; import {StringWrapper, Math} from 'angular2/src/facade/lang'; import {getIntParameter, bindAction} from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; export function main() { BrowserDomAdapter.makeCurrent(); diff --git a/modules/benchmarks/src/di/di_benchmark.ts b/modules/benchmarks/src/di/di_benchmark.ts index 010f71c233..8d9b673bf2 100644 --- a/modules/benchmarks/src/di/di_benchmark.ts +++ b/modules/benchmarks/src/di/di_benchmark.ts @@ -2,7 +2,7 @@ import {Injectable, Injector, Key, bind, provide} from "angular2/core"; import {reflector} from 'angular2/src/core/reflection/reflection'; import {ReflectionCapabilities} from 'angular2/src/core/reflection/reflection_capabilities'; import {getIntParameter, bindAction, microBenchmark} from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; var count = 0; diff --git a/modules/benchmarks/src/element_injector/element_injector_benchmark.ts b/modules/benchmarks/src/element_injector/element_injector_benchmark.ts index 8c8efe931c..3c674c3c34 100644 --- a/modules/benchmarks/src/element_injector/element_injector_benchmark.ts +++ b/modules/benchmarks/src/element_injector/element_injector_benchmark.ts @@ -3,7 +3,7 @@ import {ReflectionCapabilities} from 'angular2/src/core/reflection/reflection_ca import {Injectable, Injector} from 'angular2/core'; import {ProtoElementInjector, DirectiveProvider} from 'angular2/src/core/linker/element_injector'; import {getIntParameter, bindAction, microBenchmark} from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; var count = 0; diff --git a/modules/benchmarks/src/largetable/largetable_benchmark.ts b/modules/benchmarks/src/largetable/largetable_benchmark.ts index 417b2703d3..0832aa9e5a 100644 --- a/modules/benchmarks/src/largetable/largetable_benchmark.ts +++ b/modules/benchmarks/src/largetable/largetable_benchmark.ts @@ -20,7 +20,7 @@ import { NgSwitchDefault } from 'angular2/core'; import {ApplicationRef} from 'angular2/src/core/application_ref'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view_pool'; import {ListWrapper} from 'angular2/src/facade/collection'; diff --git a/modules/benchmarks/src/static_tree/tree_benchmark.ts b/modules/benchmarks/src/static_tree/tree_benchmark.ts index 581f50692e..c3ac1f9023 100644 --- a/modules/benchmarks/src/static_tree/tree_benchmark.ts +++ b/modules/benchmarks/src/static_tree/tree_benchmark.ts @@ -23,7 +23,7 @@ import { windowProfile, windowProfileEnd } from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view_pool'; function createBindings(): Provider[] { diff --git a/modules/benchmarks/src/tree/tree_benchmark.ts b/modules/benchmarks/src/tree/tree_benchmark.ts index 80ca59a83f..12d0a008bf 100644 --- a/modules/benchmarks/src/tree/tree_benchmark.ts +++ b/modules/benchmarks/src/tree/tree_benchmark.ts @@ -22,7 +22,7 @@ import { windowProfile, windowProfileEnd } from 'angular2/src/testing/benchmark_util'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; import {APP_VIEW_POOL_CAPACITY} from 'angular2/src/core/linker/view_pool'; function createProviders(): Provider[] { diff --git a/modules/playground/src/key_events/index.ts b/modules/playground/src/key_events/index.ts index c750946140..73af757b7e 100644 --- a/modules/playground/src/key_events/index.ts +++ b/modules/playground/src/key_events/index.ts @@ -1,6 +1,6 @@ import {bootstrap} from 'angular2/bootstrap'; import {Component, View} from 'angular2/core'; -import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events'; +import {KeyEventsPlugin} from 'angular2/src/platform/dom/events/key_events'; @Component({selector: 'key-events-app'}) @View({ diff --git a/modules/playground/src/material/button/index.ts b/modules/playground/src/material/button/index.ts index 55a9dfbff0..7d0fe545d4 100644 --- a/modules/playground/src/material/button/index.ts +++ b/modules/playground/src/material/button/index.ts @@ -1,5 +1,6 @@ import {bootstrap} from 'angular2/bootstrap'; -import {bind, provide, Component, NgFor, UrlResolver, View, ViewEncapsulation} from 'angular2/core'; +import {bind, provide, Component, NgFor, View, ViewEncapsulation} from 'angular2/core'; +import {UrlResolver} from 'angular2/compiler'; import {MdButton, MdAnchor} from 'angular2_material/src/components/button/button'; import {commonDemoSetup, DemoUrlResolver} from '../demo_common'; diff --git a/modules/playground/src/material/checkbox/index.ts b/modules/playground/src/material/checkbox/index.ts index c2346e27c2..7e0d705a1b 100644 --- a/modules/playground/src/material/checkbox/index.ts +++ b/modules/playground/src/material/checkbox/index.ts @@ -1,13 +1,6 @@ import {bootstrap} from 'angular2/bootstrap'; -import { - bind, - provide, - Component, - Directive, - UrlResolver, - View, - ViewEncapsulation -} from 'angular2/core'; +import {bind, provide, Component, Directive, View, ViewEncapsulation} from 'angular2/core'; +import {UrlResolver} from 'angular2/compiler'; import {MdCheckbox} from 'angular2_material/src/components/checkbox/checkbox'; import {commonDemoSetup, DemoUrlResolver} from '../demo_common'; diff --git a/modules/playground/src/material/demo_common.dart b/modules/playground/src/material/demo_common.dart index 7101fd5a3a..b8a5f095a4 100644 --- a/modules/playground/src/material/demo_common.dart +++ b/modules/playground/src/material/demo_common.dart @@ -1,6 +1,6 @@ library angular2_examples.material.demo_common; -import 'package:angular2/src/core/dom/browser_adapter.dart'; +import 'package:angular2/src/platform/browser/browser_adapter.dart'; import 'package:angular2/src/compiler/url_resolver.dart'; void commonDemoSetup() { diff --git a/modules/playground/src/material/demo_common.ts b/modules/playground/src/material/demo_common.ts index 8ccbd2a0bd..c378cda53d 100644 --- a/modules/playground/src/material/demo_common.ts +++ b/modules/playground/src/material/demo_common.ts @@ -3,7 +3,7 @@ import {UrlResolver} from 'angular2/src/compiler/url_resolver'; import {isPresent, isBlank, RegExpWrapper, StringWrapper} from 'angular2/src/facade/lang'; import {DOM} from 'angular2/src/core/dom/dom_adapter'; import {Injectable} from 'angular2/core'; -import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter'; +import {BrowserDomAdapter} from 'angular2/src/platform/browser/browser_adapter'; export function commonDemoSetup(): void { diff --git a/modules/playground/src/material/dialog/index.ts b/modules/playground/src/material/dialog/index.ts index 65f8aaeb42..af7df74fd1 100644 --- a/modules/playground/src/material/dialog/index.ts +++ b/modules/playground/src/material/dialog/index.ts @@ -5,10 +5,10 @@ import { ElementRef, ComponentRef, Component, - UrlResolver, View, ViewEncapsulation } from 'angular2/core'; +import {UrlResolver} from 'angular2/compiler'; import { MdDialog, MdDialogRef, diff --git a/modules/playground/src/material/grid_list/index.ts b/modules/playground/src/material/grid_list/index.ts index b29fa934e7..1bbb17f48f 100644 --- a/modules/playground/src/material/grid_list/index.ts +++ b/modules/playground/src/material/grid_list/index.ts @@ -1,6 +1,7 @@ import {bootstrap} from 'angular2/bootstrap'; -import {bind, provide, Component, UrlResolver, View, ViewEncapsulation} from 'angular2/core'; +import {bind, provide, Component, View, ViewEncapsulation} from 'angular2/core'; import {MdGridList, MdGridTile} from 'angular2_material/src/components/grid_list/grid_list'; +import {UrlResolver} from 'angular2/compiler'; import {commonDemoSetup, DemoUrlResolver} from '../demo_common'; diff --git a/modules/playground/src/material/input/index.ts b/modules/playground/src/material/input/index.ts index 8f70546ed2..38a55ff721 100644 --- a/modules/playground/src/material/input/index.ts +++ b/modules/playground/src/material/input/index.ts @@ -1,6 +1,7 @@ import {bootstrap} from 'angular2/bootstrap'; -import {bind, provide, Component, UrlResolver, View, ViewEncapsulation} from 'angular2/core'; +import {bind, provide, Component, View, ViewEncapsulation} from 'angular2/core'; import {MdInputContainer, MdInput} from 'angular2_material/src/components/input/input'; +import {UrlResolver} from 'angular2/compiler'; import {commonDemoSetup, DemoUrlResolver} from '../demo_common'; @Component({selector: 'demo-app'}) diff --git a/modules/playground/src/material/radio/index.ts b/modules/playground/src/material/radio/index.ts index 4ecdd7a8c9..9f7a5f275b 100644 --- a/modules/playground/src/material/radio/index.ts +++ b/modules/playground/src/material/radio/index.ts @@ -1,5 +1,6 @@ import {bootstrap} from 'angular2/bootstrap'; -import {bind, provide, Component, UrlResolver, View, ViewEncapsulation} from 'angular2/core'; +import {bind, provide, Component, View, ViewEncapsulation} from 'angular2/core'; +import {UrlResolver} from 'angular2/compiler'; import {MdRadioButton, MdRadioGroup} from 'angular2_material/src/components/radio/radio_button'; import {MdRadioDispatcher} from 'angular2_material/src/components/radio/radio_dispatcher'; import {commonDemoSetup, DemoUrlResolver} from '../demo_common'; diff --git a/modules/playground/src/web_workers/todo/server_index.dart b/modules/playground/src/web_workers/todo/server_index.dart index 21416aa5a5..295e034a49 100644 --- a/modules/playground/src/web_workers/todo/server_index.dart +++ b/modules/playground/src/web_workers/todo/server_index.dart @@ -6,7 +6,7 @@ import "package:angular2/src/web_workers/worker/application_common.dart" import 'dart:io'; import "package:angular2/src/core/reflection/reflection_capabilities.dart"; import "package:angular2/src/core/reflection/reflection.dart"; -import "package:angular2/src/core/dom/html_adapter.dart"; +import "package:angular2/src/platform/server/html_adapter.dart"; void main() { Html5LibDomAdapter.makeCurrent(); diff --git a/modules_dart/transform/lib/src/transform/common/url_resolver.dart b/modules_dart/transform/lib/src/transform/common/url_resolver.dart index b8613f334f..494202bc55 100644 --- a/modules_dart/transform/lib/src/transform/common/url_resolver.dart +++ b/modules_dart/transform/lib/src/transform/common/url_resolver.dart @@ -1,6 +1,6 @@ library angular2.transform.template_compiler.url_resolver; -import 'package:angular2/src/core/services.dart'; +import 'package:angular2/compiler.dart'; import 'package:barback/barback.dart'; class TransformerUrlResolver implements UrlResolver { diff --git a/modules_dart/transform/lib/src/transform/directive_metadata_linker/ng_deps_linker.dart b/modules_dart/transform/lib/src/transform/directive_metadata_linker/ng_deps_linker.dart index 88a8733d5f..143e9ebe4f 100644 --- a/modules_dart/transform/lib/src/transform/directive_metadata_linker/ng_deps_linker.dart +++ b/modules_dart/transform/lib/src/transform/directive_metadata_linker/ng_deps_linker.dart @@ -2,7 +2,7 @@ library angular2.transform.directive_metadata_linker.ng_deps_linker; import 'dart:async'; -import 'package:angular2/src/core/services.dart'; +import 'package:angular2/compiler.dart' show UrlResolver; import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/logging.dart'; import 'package:angular2/src/transform/common/names.dart'; diff --git a/modules_dart/transform/lib/src/transform/directive_processor/transformer.dart b/modules_dart/transform/lib/src/transform/directive_processor/transformer.dart index 47b68cc56d..de31b4ea24 100644 --- a/modules_dart/transform/lib/src/transform/directive_processor/transformer.dart +++ b/modules_dart/transform/lib/src/transform/directive_processor/transformer.dart @@ -5,7 +5,7 @@ import 'dart:convert'; import 'package:barback/barback.dart'; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/names.dart'; import 'package:angular2/src/transform/common/options.dart'; diff --git a/modules_dart/transform/lib/src/transform/stylesheet_compiler/transformer.dart b/modules_dart/transform/lib/src/transform/stylesheet_compiler/transformer.dart index d3b8f28551..ec52a41bd0 100644 --- a/modules_dart/transform/lib/src/transform/stylesheet_compiler/transformer.dart +++ b/modules_dart/transform/lib/src/transform/stylesheet_compiler/transformer.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'package:barback/barback.dart'; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/names.dart'; import 'package:angular2/src/transform/common/zone.dart' as zone; diff --git a/modules_dart/transform/lib/src/transform/template_compiler/transformer.dart b/modules_dart/transform/lib/src/transform/template_compiler/transformer.dart index 49a3d92c96..b2ee438233 100644 --- a/modules_dart/transform/lib/src/transform/template_compiler/transformer.dart +++ b/modules_dart/transform/lib/src/transform/template_compiler/transformer.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'package:barback/barback.dart'; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/code/ng_deps_code.dart'; import 'package:angular2/src/transform/common/formatter.dart'; diff --git a/modules_dart/transform/test/transform/directive_processor/all_tests.dart b/modules_dart/transform/test/transform/directive_processor/all_tests.dart index 3adae444b6..5075ac2789 100644 --- a/modules_dart/transform/test/transform/directive_processor/all_tests.dart +++ b/modules_dart/transform/test/transform/directive_processor/all_tests.dart @@ -7,7 +7,7 @@ import 'package:dart_style/dart_style.dart'; import 'package:guinness/guinness.dart'; import 'package:angular2/src/core/change_detection/change_detection.dart'; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/src/core/linker/interfaces.dart' show LifecycleHooks; import 'package:angular2/src/transform/common/annotation_matcher.dart'; import 'package:angular2/src/transform/common/asset_reader.dart'; diff --git a/modules_dart/transform/test/transform/integration/all_tests.dart b/modules_dart/transform/test/transform/integration/all_tests.dart index 5a54b5743b..dc6e4a561f 100644 --- a/modules_dart/transform/test/transform/integration/all_tests.dart +++ b/modules_dart/transform/test/transform/integration/all_tests.dart @@ -1,6 +1,6 @@ library angular2.test.transform.integration; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/transformer.dart'; import 'package:code_transformers/tests.dart'; import 'package:dart_style/dart_style.dart'; diff --git a/modules_dart/transform/test/transform/template_compiler/all_tests.dart b/modules_dart/transform/test/transform/template_compiler/all_tests.dart index 469e5a7109..57a0fcbab9 100644 --- a/modules_dart/transform/test/transform/template_compiler/all_tests.dart +++ b/modules_dart/transform/test/transform/template_compiler/all_tests.dart @@ -10,7 +10,7 @@ import 'package:guinness/guinness.dart'; import 'package:angular2/src/core/change_detection/codegen_name_util.dart' show CONTEXT_ACCESSOR; -import 'package:angular2/src/core/dom/html_adapter.dart'; +import 'package:angular2/src/platform/server/html_adapter.dart'; import 'package:angular2/src/transform/template_compiler/generator.dart'; import 'package:angular2/src/transform/common/zone.dart' as zone; diff --git a/test-init.dart b/test-init.dart index 232c8568c5..c820485f9c 100644 --- a/test-init.dart +++ b/test-init.dart @@ -1,4 +1,4 @@ -import 'package:angular2/src/core/dom/browser_adapter.dart'; +import 'package:angular2/src/platform/browser/browser_adapter.dart'; main() { BrowserDomAdapter.makeCurrent(); diff --git a/test-main.js b/test-main.js index 144930c51e..49a9fabd1d 100644 --- a/test-main.js +++ b/test-main.js @@ -21,7 +21,7 @@ System.config({ window.angularDevMode = true; // Import all the specs, execute their `main()` method and kick off Karma (Jasmine). -System.import('angular2/src/core/dom/browser_adapter').then(function(browser_adapter) { +System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) { browser_adapter.BrowserDomAdapter.makeCurrent(); }).then(function() { return Promise.all( diff --git a/tools/broccoli/broccoli-check-imports.ts b/tools/broccoli/broccoli-check-imports.ts new file mode 100644 index 0000000000..0844607ba3 --- /dev/null +++ b/tools/broccoli/broccoli-check-imports.ts @@ -0,0 +1,113 @@ +import fs = require('fs'); +import fse = require('fs-extra'); +import path = require('path'); +import {wrapDiffingPlugin, DiffingBroccoliPlugin, DiffResult} from './diffing-broccoli-plugin'; + +/** + * Checks that modules do not import files that are not supposed to import. + * + * This guarantees that platform-independent modules remain platoform-independent. + */ +class CheckImports implements DiffingBroccoliPlugin { + static IMPORT_DECL_REGEXP = new RegExp(`^import[^;]+;`, "mg"); + static IMPORT_PATH_REGEXP = new RegExp(`['"]([^'"]+)+['"]`, "m"); + + static ALLOWED_IMPORTS = { + "angular2/src/core": [ + "angular2/src/core", + "angular2/src/facade", + ], + "angular2/src/facade": ["angular2/src/facade", "@reactivex/rxjs"], + // enable these + //"angular2/src/common": [ + // "angular2/core", + // "angular2/src/facade", + // "angular2/src/common" + //], + //"angular2/src/render": [ + // "angular2/animate", + // "angular2/core", + // "angular2/src/facade", + //] + }; + + private initRun = true; + + constructor(private inputPath, private cachePath, private options) {} + + rebuild(treeDiff: DiffResult) { + const errors = this.checkAllPaths(treeDiff); + if (errors.length > 0) { + throw new Error( + `The following imports are not allowed because they break barrel boundaries:\n${errors.join("\n")}`); + } + this.symlinkInputAndCacheIfNeeded(); + return treeDiff; + } + + private checkAllPaths(treeDiff: DiffResult) { + const changesFiles = treeDiff.addedPaths.concat(treeDiff.changedPaths); + return flatMap(changesFiles, _ => this.checkFilePath(_)); + } + + private symlinkInputAndCacheIfNeeded() { + if (this.initRun) { + fs.rmdirSync(this.cachePath); + fs.symlinkSync(this.inputPath, this.cachePath); + } + this.initRun = false; + } + + private checkFilePath(filePath: string) { + const sourceFilePath = path.join(this.inputPath, filePath); + if (endsWith(sourceFilePath, ".ts") && fs.existsSync(sourceFilePath)) { + const content = fs.readFileSync(sourceFilePath, "UTF-8"); + const imports = content.match(CheckImports.IMPORT_DECL_REGEXP); + if (imports) { + return imports.filter(i => !this.isAllowedImport(filePath, i)) + .map(i => this.formatError(filePath, i)); + } else { + return []; + } + } + return []; + } + + private isAllowedImport(sourceFile: string, importDecl: string): boolean { + const res = CheckImports.IMPORT_PATH_REGEXP.exec(importDecl); + if (!res || res.length < 2) return true; // non-es6 import + const importPath = res[1]; + + if (startsWith(importPath, "./") || startsWith(importPath, "../")) return true; + + const c = CheckImports.ALLOWED_IMPORTS; + for (var prop in c) { + if (c.hasOwnProperty(prop) && startsWith(sourceFile, prop)) { + const allowedPaths = c[prop]; + return allowedPaths.filter(p => startsWith(importPath, p)).length > 0; + } + } + + return true; + } + + private formatError(filePath: string, importPath: string): string { + const i = importPath.replace(new RegExp(`\n`, 'g'), "\\n"); + return `${filePath}: ${i}`; + } +} + + +function startsWith(str: string, substring: string): boolean { + return str.substring(0, substring.length) === substring; +} + +function endsWith(str: string, substring: string): boolean { + return str.indexOf(substring, str.length - substring.length) !== -1; +} + +function flatMap(arr: T[], fn: (t: T) => U[]): U[] { + return [].concat(...arr.map(fn)); +} + +export default wrapDiffingPlugin(CheckImports); diff --git a/tools/broccoli/trees/browser_tree.ts b/tools/broccoli/trees/browser_tree.ts index c72665954b..e7976db0ab 100644 --- a/tools/broccoli/trees/browser_tree.ts +++ b/tools/broccoli/trees/browser_tree.ts @@ -11,6 +11,7 @@ import destCopy from '../broccoli-dest-copy'; import flatten from '../broccoli-flatten'; import mergeTrees from '../broccoli-merge-trees'; import replace from '../broccoli-replace'; +import checkImports from '../broccoli-check-imports'; const kServedPaths = [ @@ -133,6 +134,9 @@ module.exports = function makeBrowserTree(options, destinationPath) { } }; + // Check that imports do not break barrel boundaries + modulesTree = checkImports(modulesTree); + modulesTree = replace(modulesTree, { files: ["playground*/**/*.js"], patterns: [{match: /\$SCRIPTS\$/, replacement: jsReplace('SCRIPTS')}] diff --git a/tools/broccoli/trees/node_tree.ts b/tools/broccoli/trees/node_tree.ts index ef45433c5c..4e2f9f4d29 100644 --- a/tools/broccoli/trees/node_tree.ts +++ b/tools/broccoli/trees/node_tree.ts @@ -89,8 +89,9 @@ module.exports = function makeNodeTree(projects, destinationPath) { { match: /^/, replacement: - () => `var parse5Adapter = require('angular2/src/core/dom/parse5_adapter');\r\n` + - `parse5Adapter.Parse5DomAdapter.makeCurrent();` + () => + `var parse5Adapter = require('angular2/src/platform/server/parse5_adapter');\r\n` + + `parse5Adapter.Parse5DomAdapter.makeCurrent();` }, {match: /$/, replacement: (_, relativePath) => "\r\n main(); \r\n"} ]