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 (94%) 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 d0c2e10178f..e66bfc81b71 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 54d0f5f37a4..8a7c831161b 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 57856c054b5..b7a776c8cc9 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 164a4bc1290..e7a55cc7426 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 93286a47689..11aef8f54ab 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 992d0777d26..7ca4bc4681c 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 0db94d21a84..bd6784301ab 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 00000000000..92a18bef8e0 --- /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 00000000000..61ae1b68095 --- /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 00000000000..9270dfbef16 --- /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 bef53faf0c8..1a6446d565e 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 a9130d6aba7..1ed6a2242d9 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 f766c2ee9d3..3498b85d05c 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 aca1a83a949..00000000000 --- 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 2710501401a..37e7b9c6eb0 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 c32977d1948..5a413126571 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 5cc33b98bb2..d7de254ffa1 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 6bbcbee8870..96e154e6d8c 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 19b6e6d4319..b43b69776f6 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 67a41fd3f84..30216a44b46 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 fff487c881d..20d32cbfb4f 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 27e42ea6bdc..20e10fe73bc 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 ef3f20a69a0..f58c803510e 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 5cb7f7a351e..477c89079ab 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 9b20996ceab..00000000000 --- 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 ab85513b487..00000000000 --- 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 8d36b8e5054..741cffb8e40 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 00000000000..ce98e774b18 --- /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 6b745d343f6..79af0e6a60c 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 00000000000..8b16c8324e2 --- /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 94% 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 1e5ee4cc7ac..1094e75389c 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 878c2a63d72..aa8f8803415 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 9c56d8ac72a..c3683403dac 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 7045f990ddf..6c87ee8f690 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 fc33b5b0b97..41804d8eb40 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 633a2cb2d93..8fc869f63eb 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 00000000000..cb06c62e389 --- /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 6b8630e6b42..0229de4bc19 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 54c74db4185..46217b70df2 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 00000000000..7f074e0f629 --- /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 aefd31c5e66..d4b4665b282 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 b8e1bcd3afe..6ed42fe206c 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 6c9141ada59..f038ecd0cfa 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 d56853c68e2..4a48ea72b9f 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 635d6fedbb8..d744cad2719 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 72ff6abd37f..3fe5d62bcc4 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 1a05c952f13..9c97b6f9d13 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 abfee91c4cf..42aa128fbe9 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 92abec8901e..a237c13dec9 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 18b753d8055..87037163308 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 b3c29ca74c9..7eec9d15a65 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 677c9b11f9a..9560c83a0fc 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 0550a8b0108..5f3806a7ea1 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 c044adc29e4..5b8e1af2df8 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 0e898f5fe4d..fe80304bd50 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 72fdbbe22ef..fdf3b887366 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 6abfbdfd0d1..685253041ff 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 f12b41d07f3..86f90232d07 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 df4031ddeab..731e68d9826 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 bab6fd1763a..5636b719bdc 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 d755b0f803f..23c9182ff2f 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 98357801700..b09680308b1 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 4f7d7f27841..b09be3df047 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 7d09bc93c9d..26bde578a52 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 f751d156240..f6fb51b8bc8 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 bc538e3ea10..4c545d61480 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 2d12d1782b5..f3ec7c0b963 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 647c628ffb9..b8eda62cb91 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 91906410c03..80a782d6549 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 884fa6fd784..4e4dfa14c7d 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 4e85d2c06d3..a17bed2d606 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 4876f62a738..9b9d455bcd3 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 5e5a6e5c6d3..f6e18165685 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 e6e479f3b43..cc415816632 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 9beff593144..a7286027b72 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 884a9ceca07..4850b68b651 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 1ddbe04ff7f..cd51d97f017 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 cbc582def7b..4d6e6304bbc 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 4a3c437915c..00e9152d693 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 7fc8b433d44..4050be058be 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 b197c7c9e1a..3ff9ec546a7 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 010f71c233f..8d9b673bf2d 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 8c8efe931c6..3c674c3c347 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 417b2703d36..0832aa9e5aa 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 581f50692e8..c3ac1f90233 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 80ca59a83f0..12d0a008bf7 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 c750946140a..73af757b7e0 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 55a9dfbff06..7d0fe545d46 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 c2346e27c2e..7e0d705a1bb 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 7101fd5a3a7..b8a5f095a44 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 8ccbd2a0bd9..c378cda53d7 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 65f8aaeb420..af7df74fd17 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 b29fa934e70..1bbb17f48f1 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 8f70546ed2e..38a55ff7210 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 4ecdd7a8c9e..9f7a5f275b7 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 21416aa5a58..295e034a49e 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 b8613f334fa..494202bc557 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 88a8733d5f7..143e9ebe4f6 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 47b68cc56d4..de31b4ea240 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 d3b8f285511..ec52a41bd0b 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 49a3d92c966..b2ee4382339 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 3adae444b66..5075ac27890 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 5a54b5743bc..dc6e4a561fd 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 469e5a71096..57a0fcbab92 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 232c8568c53..c820485f9cf 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 144930c51e3..49a9fabd1d1 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 00000000000..0844607ba3c --- /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 c72665954b2..e7976db0ab2 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 ef45433c5cf..4e2f9f4d29d 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"} ]