refactor(browser): merge static & dynamic platforms
This commit is contained in:
parent
6c99746f0b
commit
54f8308999
1
build.sh
1
build.sh
|
@ -43,7 +43,6 @@ for PACKAGE in \
|
|||
compiler \
|
||||
common \
|
||||
platform-browser \
|
||||
platform-browser-dynamic \
|
||||
platform-server \
|
||||
http \
|
||||
router \
|
||||
|
|
|
@ -33,7 +33,7 @@ module.exports = function(config) {
|
|||
'test-main.js',
|
||||
{pattern: 'dist/all/empty.*', included: false, watched: false},
|
||||
{pattern: 'modules/@angular/platform-browser/test/static_assets/**', included: false, watched: false},
|
||||
{pattern: 'modules/@angular/platform-browser-dynamic/test/browser/static_assets/**', included: false, watched: false}
|
||||
{pattern: 'modules/@angular/platform-browser/test/browser/static_assets/**', included: false, watched: false}
|
||||
],
|
||||
|
||||
exclude: [
|
||||
|
|
|
@ -48,7 +48,7 @@ let _PLACEHOLDER_EXPANDED_REGEXP = RegExpWrapper.create(`\\<ph(\\s)+name=("(\\w)
|
|||
* Partitioning transforms an array of HtmlAst into an array of Part.
|
||||
* A part can optionally contain a root element or a root text node. And it can also contain
|
||||
* children.
|
||||
* A part can contain i18n property, in which case it needs to be transalted.
|
||||
* A part can contain i18n property, in which case it needs to be translated.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {UrlResolver} from '@angular/compiler';
|
||||
|
||||
var MyApp: any;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {NG_VALIDATORS} from '@angular/common';
|
||||
import {Provider} from '@angular/core';
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {Observable, Subscriber} from 'rxjs/Rx';
|
||||
|
||||
// #docregion AsyncPipe
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion DatePipe
|
||||
@Component({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion JsonPipe
|
||||
@Component({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion LowerUpperPipe
|
||||
@Component({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion NumberPipe
|
||||
@Component({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion SlicePipe_string
|
||||
@Component({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
|
||||
// #docregion bootstrap
|
||||
@Component({selector: 'my-app', template: 'Hello {{ name }}!'})
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, createPlatform, coreLoadAndBootstrap, ReflectiveInjector} from '@angular/core';
|
||||
import {BROWSER_PROVIDERS, BROWSER_APP_STATIC_PROVIDERS} from '@angular/platform-browser';
|
||||
import {BROWSER_PLATFORM_PROVIDERS, BROWSER_APP_STATIC_PROVIDERS} from '@angular/platform-browser';
|
||||
|
||||
var appProviders: any[] = [];
|
||||
|
||||
|
@ -8,7 +8,7 @@ var appProviders: any[] = [];
|
|||
class MyApp {
|
||||
}
|
||||
|
||||
var platform = createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PROVIDERS));
|
||||
var platform = createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PLATFORM_PROVIDERS));
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate([BROWSER_APP_STATIC_PROVIDERS, appProviders],
|
||||
platform.injector);
|
||||
coreLoadAndBootstrap(appInjector, MyApp);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// #docregion enableProdMode
|
||||
import {enableProdMode} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {MyComponent} from './my_component';
|
||||
|
||||
enableProdMode();
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import {Component} from '@angular/core';
|
||||
import {ELEMENT_PROBE_PROVIDERS} from '@angular/platform-browser';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {Component} from "@angular/core";
|
||||
import {ELEMENT_PROBE_PROVIDERS, bootstrap} from "@angular/platform-browser";
|
||||
|
||||
@Component({selector: 'my-component'})
|
||||
class MyAppComponent {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {provide, Component, ComponentRef} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {
|
||||
CanActivate,
|
||||
RouteConfig,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {provide, Component, ComponentRef} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {
|
||||
CanDeactivate,
|
||||
RouteConfig,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide, ComponentRef} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {
|
||||
OnActivate,
|
||||
ComponentInstruction,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, Injectable, provide, ComponentRef} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {
|
||||
OnDeactivate,
|
||||
ComponentInstruction,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, provide, ComponentRef} from '@angular/core';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {
|
||||
RouteConfig,
|
||||
ComponentInstruction,
|
||||
|
|
|
@ -366,85 +366,80 @@ var CORE_TESTING: string[] = [
|
|||
|
||||
var PLATFORM_BROWSER: string[] = [
|
||||
'__platform_browser_private__',
|
||||
'BROWSER_APP_STATIC_PROVIDERS',
|
||||
'BROWSER_PROVIDERS',
|
||||
'BROWSER_APP_COMMON_PROVIDERS',
|
||||
'BROWSER_SANITIZATION_PROVIDERS',
|
||||
'DOCUMENT',
|
||||
'ELEMENT_PROBE_PROVIDERS',
|
||||
'DomEventsPlugin',
|
||||
'KeyEventsPlugin',
|
||||
'EVENT_MANAGER_PLUGINS',
|
||||
'EventManager',
|
||||
'HAMMER_GESTURE_CONFIG',
|
||||
'HammerGestureConfig',
|
||||
'AngularEntrypoint:dart',
|
||||
'bootstrap',
|
||||
'bootstrapApp',
|
||||
'bootstrapRender',
|
||||
'bootstrapStatic',
|
||||
'bootstrapStaticApp',
|
||||
'bootstrapStaticRender',
|
||||
'BROWSER_APP_COMMON_PROVIDERS',
|
||||
'BROWSER_APP_PROVIDERS',
|
||||
'BROWSER_APP_STATIC_PROVIDERS',
|
||||
'BROWSER_PLATFORM_PROVIDERS',
|
||||
'BROWSER_SANITIZATION_PROVIDERS',
|
||||
'browserPlatform',
|
||||
'BrowserPlatformLocation',
|
||||
'AngularEntrypoint:dart',
|
||||
'By',
|
||||
'DomSanitizationService',
|
||||
'SecurityContext',
|
||||
'Title',
|
||||
'disableDebugTools',
|
||||
'enableDebugTools',
|
||||
'CACHED_TEMPLATE_PROVIDER',
|
||||
'ClientMessageBroker',
|
||||
'ClientMessageBrokerFactory',
|
||||
'disableDebugTools',
|
||||
'DOCUMENT',
|
||||
'DomEventsPlugin',
|
||||
'DomSanitizationService',
|
||||
'ELEMENT_PROBE_PROVIDERS',
|
||||
'enableDebugTools',
|
||||
'EVENT_MANAGER_PLUGINS',
|
||||
'EventManager',
|
||||
'FnArg',
|
||||
'HAMMER_GESTURE_CONFIG',
|
||||
'HammerGestureConfig',
|
||||
'initializeGenericWorkerRenderer',
|
||||
'KeyEventsPlugin',
|
||||
'MessageBus',
|
||||
'PRIMITIVE',
|
||||
'ReceivedMessage',
|
||||
'SecurityContext',
|
||||
'ServiceMessageBroker',
|
||||
'ServiceMessageBrokerFactory',
|
||||
'Title',
|
||||
'UiArguments',
|
||||
'UrlChangeEvent:dart',
|
||||
'UrlChangeListener:dart',
|
||||
'WebWorkerInstance',
|
||||
'WORKER_APP_APPLICATION_COMMON_PROVIDERS',
|
||||
'WORKER_APP_APPLICATION_PROVIDERS',
|
||||
'WORKER_APP_LOCATION_PROVIDERS',
|
||||
'WORKER_APP_PLATFORM_PROVIDERS',
|
||||
'WORKER_APP_STATIC_APPLICATION_PROVIDERS',
|
||||
'WORKER_RENDER_APPLICATION_COMMON_PROVIDERS',
|
||||
'WORKER_RENDER_APPLICATION_PROVIDERS',
|
||||
'WORKER_RENDER_APPLICATION_PROVIDERS',
|
||||
'WORKER_RENDER_LOCATION_PROVIDERS',
|
||||
'WORKER_RENDER_PLATFORM_PROVIDERS',
|
||||
'WORKER_RENDER_STARTABLE_MESSAGING_SERVICE',
|
||||
'WORKER_RENDER_STATIC_APPLICATION_PROVIDERS',
|
||||
'WORKER_SCRIPT',
|
||||
'WORKER_APP_LOCATION_PROVIDERS',
|
||||
'WORKER_RENDER_LOCATION_PROVIDERS',
|
||||
'workerAppPlatform',
|
||||
'workerRenderPlatform',
|
||||
'WebWorkerInstance',
|
||||
'bootstrapStaticApp',
|
||||
'bootstrapStaticRender',
|
||||
'initializeGenericWorkerRenderer'
|
||||
'workerRenderPlatform'
|
||||
];
|
||||
|
||||
var PLATFORM_BROWSER_TESTING: string[] = [
|
||||
'TEST_BROWSER_STATIC_APPLICATION_PROVIDERS',
|
||||
'TEST_BROWSER_STATIC_PLATFORM_PROVIDERS',
|
||||
'ADDITIONAL_TEST_BROWSER_PROVIDERS', // This should be made private
|
||||
'ADDITIONAL_TEST_BROWSER_STATIC_PROVIDERS', // This should be made private
|
||||
'BrowserDetection',
|
||||
'browserDetection',
|
||||
'dispatchEvent',
|
||||
'DOMTestComponentRenderer',
|
||||
'el',
|
||||
'expect',
|
||||
'normalizeCSS',
|
||||
'stringifyElement'
|
||||
];
|
||||
|
||||
var PLATFORM_BROWSER_DYNAMIC: string[] = [
|
||||
'BROWSER_APP_DYNAMIC_PROVIDERS',
|
||||
'CACHED_TEMPLATE_PROVIDER',
|
||||
'bootstrap',
|
||||
'UrlChangeEvent:dart',
|
||||
'UrlChangeListener:dart',
|
||||
'WORKER_APP_DYNAMIC_APPLICATION_PROVIDERS',
|
||||
'WORKER_RENDER_DYNAMIC_APPLICATION_PROVIDERS',
|
||||
'bootstrapApp',
|
||||
'bootstrapRender'
|
||||
];
|
||||
|
||||
var PLATFORM_BROWSER_DYNAMIC_TESTING: string[] = [
|
||||
'TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS',
|
||||
'TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS',
|
||||
'ADDITIONAL_DYNAMIC_TEST_BROWSER_PROVIDERS',
|
||||
'DOMTestComponentRenderer'
|
||||
'stringifyElement',
|
||||
'TEST_BROWSER_APPLICATION_PROVIDERS',
|
||||
'TEST_BROWSER_PLATFORM_PROVIDERS',
|
||||
'TEST_BROWSER_STATIC_APPLICATION_PROVIDERS',
|
||||
'TEST_BROWSER_STATIC_PLATFORM_PROVIDERS'
|
||||
];
|
||||
|
||||
var PLATFORM_SERVER: string[] = ['Parse5DomAdapter'];
|
||||
|
@ -547,8 +542,6 @@ var API = {
|
|||
'upgrade': UPGRADE,
|
||||
'platform-browser': PLATFORM_BROWSER,
|
||||
'platform-browser/testing': PLATFORM_BROWSER_TESTING,
|
||||
'platform-browser-dynamic': PLATFORM_BROWSER_DYNAMIC,
|
||||
'platform-browser-dynamic/testing': PLATFORM_BROWSER_DYNAMIC_TESTING,
|
||||
'platform-server': PLATFORM_SERVER,
|
||||
'platform-server/testing': PLATFORM_SERVER_TESTING
|
||||
};
|
||||
|
@ -578,8 +571,6 @@ export function main() {
|
|||
'upgrade',
|
||||
'platform-browser',
|
||||
'platform-browser/testing',
|
||||
'platform-browser-dynamic',
|
||||
'platform-browser-dynamic/testing',
|
||||
'platform-server',
|
||||
'platform-server/testing'
|
||||
];
|
||||
|
|
|
@ -14,8 +14,6 @@ import * as router_testing from '@angular/router/testing';
|
|||
import * as upgrade from '@angular/upgrade';
|
||||
import * as platformBrowser from '@angular/platform-browser';
|
||||
import * as platformBrowser_testing from '@angular/platform-browser/testing';
|
||||
import * as platformBrowserDynamic from '@angular/platform-browser-dynamic';
|
||||
import * as platformBrowserDynamic_testing from '@angular/platform-browser-dynamic/testing';
|
||||
import * as platformServer from '@angular/platform-server';
|
||||
import * as platformServer_testing from '@angular/platform-server/testing';
|
||||
|
||||
|
@ -36,8 +34,6 @@ const LIB_MAP = {
|
|||
'upgrade': upgrade,
|
||||
'platform-browser': platformBrowser,
|
||||
'platform-browser/testing': platformBrowser_testing,
|
||||
'platform-browser-dynamic': platformBrowserDynamic,
|
||||
'platform-browser-dynamic/testing': platformBrowserDynamic_testing,
|
||||
'platform-server': platformServer,
|
||||
'platform-server/testing': platformServer_testing
|
||||
};
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
export '../core/private_export.dart';
|
|
@ -1,4 +0,0 @@
|
|||
import {__core_private__ as r, __core_private_types__ as t} from '@angular/core';
|
||||
|
||||
export type ReflectionCapabilities = t.ReflectionCapabilities;
|
||||
export var ReflectionCapabilities: typeof t.ReflectionCapabilities = r.ReflectionCapabilities;
|
|
@ -1,4 +0,0 @@
|
|||
export * from './src/platform_browser_dynamic';
|
||||
|
||||
export * from './src/worker_render';
|
||||
export * from './src/worker_app';
|
|
@ -1,20 +0,0 @@
|
|||
{
|
||||
"name": "@angular/platform-browser-dynamic",
|
||||
"version": "$$ANGULAR_VERSION$$",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"jsnext:main": "esm/index.js",
|
||||
"typings": "index.d.ts",
|
||||
"author": "angular",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@angular/core": "$$ANGULAR_VERSION$$",
|
||||
"@angular/common": "$$ANGULAR_VERSION$$",
|
||||
"@angular/compiler": "$$ANGULAR_VERSION$$",
|
||||
"@angular/platform-browser": "$$ANGULAR_VERSION$$"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/angular/angular.git"
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
export '../core/private_export.dart';
|
|
@ -1,7 +0,0 @@
|
|||
import {__platform_browser_private__ as _} from '@angular/platform-browser';
|
||||
|
||||
export type DomAdapter = _.DomAdapter;
|
||||
export function getDOM(): _.DomAdapter {
|
||||
return _.getDOM()
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
|
||||
export default {
|
||||
entry: '../../../dist/packages-dist/platform-browser-dynamic/esm/index.js',
|
||||
dest: '../../../dist/packages-dist/platform-browser-dynamic/esm/platform-browser-dynamic.umd.js',
|
||||
format: 'umd',
|
||||
moduleName: 'ng.platformBrowserDynamic',
|
||||
globals: {
|
||||
'@angular/core': 'ng.core',
|
||||
'@angular/common': 'ng.common',
|
||||
'@angular/compiler': 'ng.compiler',
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
'rxjs/Subject': 'Rx',
|
||||
'rxjs/observable/PromiseObservable': 'Rx', // this is wrong, but this stuff has changed in rxjs b.6 so we need to fix it when we update.
|
||||
'rxjs/operator/toPromise': 'Rx.Observable.prototype',
|
||||
'rxjs/Observable': 'Rx'
|
||||
},
|
||||
plugins: [
|
||||
// nodeResolve({ jsnext: true, main: true }),
|
||||
]
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
../../facade/src
|
|
@ -1,5 +0,0 @@
|
|||
/**
|
||||
* All channels used by angular's WebWorker components are listed here.
|
||||
* You should not use these channels in your application code.
|
||||
*/
|
||||
export const XHR_CHANNEL = "ng-XHR";
|
|
@ -1,48 +0,0 @@
|
|||
library angular2.src.services.xhr_cache;
|
||||
|
||||
import 'dart:async' show Future;
|
||||
import 'dart:html';
|
||||
import 'dart:js' as js;
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/compiler/xhr.dart';
|
||||
import 'package:angular2/src/facade/exceptions.dart' show BaseException;
|
||||
|
||||
/**
|
||||
* An implementation of XHR that uses a template cache to avoid doing an actual
|
||||
* XHR.
|
||||
*
|
||||
* The template cache needs to be built and loaded into window.$templateCache
|
||||
* via a separate mechanism.
|
||||
*/
|
||||
@Injectable()
|
||||
class CachedXHR extends XHR {
|
||||
js.JsObject _cache;
|
||||
String _baseUri;
|
||||
|
||||
CachedXHR() {
|
||||
if (js.context.hasProperty(r'$templateCache')) {
|
||||
this._cache = js.context[r'$templateCache'];
|
||||
} else {
|
||||
throw new BaseException(
|
||||
r'CachedXHR: Template cache was not found in $templateCache.');
|
||||
}
|
||||
this._baseUri = window.location.protocol +
|
||||
'//' +
|
||||
window.location.host +
|
||||
window.location.pathname;
|
||||
int lastSlash = this._baseUri.lastIndexOf('/');
|
||||
this._baseUri = this._baseUri.substring(0, lastSlash + 1);
|
||||
}
|
||||
|
||||
Future<String> get(String url) {
|
||||
if (url.startsWith(this._baseUri)) {
|
||||
url = url.substring(this._baseUri.length);
|
||||
}
|
||||
if (this._cache.hasProperty(url)) {
|
||||
return new Future.value(this._cache[url]);
|
||||
} else {
|
||||
return new Future.error(
|
||||
'CachedXHR: Did not find cached template for ' + url);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
library angular2.src.services.xhr_impl;
|
||||
|
||||
import 'dart:async' show Future;
|
||||
import 'dart:html' show HttpRequest;
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/compiler/xhr.dart';
|
||||
|
||||
@Injectable()
|
||||
class XHRImpl extends XHR {
|
||||
Future<String> get(String url) {
|
||||
return HttpRequest.request(url).then((HttpRequest req) => req.responseText,
|
||||
onError: (_) => new Future.error('Failed to load $url'));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
"use strict";
|
||||
var __extends = (this && this.__extends) || function (d, b) {
|
||||
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
var compiler_1 = require('@angular/compiler');
|
||||
var promise_1 = require('../../src/facade/promise');
|
||||
var lang_1 = require('../../src/facade/lang');
|
||||
var XHRImpl = (function (_super) {
|
||||
__extends(XHRImpl, _super);
|
||||
function XHRImpl() {
|
||||
_super.apply(this, arguments);
|
||||
}
|
||||
XHRImpl.prototype.get = function (url) {
|
||||
var completer = promise_1.PromiseWrapper.completer();
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', url, true);
|
||||
xhr.responseType = 'text';
|
||||
xhr.onload = function () {
|
||||
// responseText is the old-school way of retrieving response (supported by IE8 & 9)
|
||||
// response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
|
||||
var response = lang_1.isPresent(xhr.response) ? xhr.response : xhr.responseText;
|
||||
// normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
|
||||
var status = xhr.status === 1223 ? 204 : xhr.status;
|
||||
// fix status code when it is 0 (0 status is undocumented).
|
||||
// Occurs when accessing file resources or on Android 4.1 stock browser
|
||||
// while retrieving files from application cache.
|
||||
if (status === 0) {
|
||||
status = response ? 200 : 0;
|
||||
}
|
||||
if (200 <= status && status <= 300) {
|
||||
completer.resolve(response);
|
||||
}
|
||||
else {
|
||||
completer.reject("Failed to load " + url, null);
|
||||
}
|
||||
};
|
||||
xhr.onerror = function () { completer.reject("Failed to load " + url, null); };
|
||||
xhr.send();
|
||||
return completer.promise;
|
||||
};
|
||||
return XHRImpl;
|
||||
}(compiler_1.XHR));
|
||||
exports.XHRImpl = XHRImpl;
|
||||
//# sourceMappingURL=xhr_impl.js.map
|
|
@ -1 +0,0 @@
|
|||
<span>from external template</span>
|
|
@ -1,7 +0,0 @@
|
|||
library angular2.test.testing.testing_browser_pec;
|
||||
|
||||
/**
|
||||
* This is intentionally left blank. The public test lib is only for TS/JS
|
||||
* apps.
|
||||
*/
|
||||
main() {}
|
|
@ -1,16 +0,0 @@
|
|||
import 'dart:js' as js;
|
||||
|
||||
void setTemplateCache(Map cache) {
|
||||
if (cache == null) {
|
||||
if (js.context.hasProperty(r'$templateCache')) {
|
||||
js.context.deleteProperty(r'$templateCache');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
js.JsObject jsMap = new js.JsObject(js.context['Object']);
|
||||
for (String key in cache.keys) {
|
||||
jsMap[key] = cache[key];
|
||||
}
|
||||
js.context[r'$templateCache'] = jsMap;
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
export * from './testing/browser';
|
||||
export * from './testing/dom_test_component_renderer';
|
|
@ -1,33 +0,0 @@
|
|||
{
|
||||
"angularCompilerOptions": {
|
||||
"skipTemplateCodegen": true
|
||||
},
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"declaration": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"module": "es2015",
|
||||
"moduleResolution": "node",
|
||||
"outDir": "../../../dist/packages-dist/platform-browser-dynamic/esm",
|
||||
"paths": {
|
||||
"@angular/common": ["../../../dist/packages-dist/common/"],
|
||||
"@angular/compiler": ["../../../dist/packages-dist/compiler/"],
|
||||
"@angular/compiler/testing": ["../../../dist/packages-dist/compiler/testing"],
|
||||
"@angular/core": ["../../../dist/packages-dist/core/"],
|
||||
"@angular/platform-browser": ["../../../dist/packages-dist/platform-browser"],
|
||||
"@angular/platform-browser/testing": ["../../../dist/packages-dist/platform-browser/testing"]
|
||||
},
|
||||
"rootDir": ".",
|
||||
"sourceMap": true,
|
||||
"inlineSources": true,
|
||||
"target": "es2015"
|
||||
},
|
||||
"files": [
|
||||
"index.ts",
|
||||
"testing.ts",
|
||||
"../typings/hammerjs/hammerjs.d.ts",
|
||||
"../typings/jasmine/jasmine.d.ts",
|
||||
"../../../node_modules/zone.js/dist/zone.js.d.ts"
|
||||
]
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"angularCompilerOptions": {
|
||||
"skipTemplateCodegen": true
|
||||
},
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"declaration": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"outDir": "../../../dist/packages-dist/platform-browser-dynamic/",
|
||||
"paths": {
|
||||
"@angular/core": ["../../../dist/packages-dist/core"],
|
||||
"@angular/common": ["../../../dist/packages-dist/common"],
|
||||
"@angular/compiler": ["../../../dist/packages-dist/compiler"],
|
||||
"@angular/compiler/testing": ["../../../dist/packages-dist/compiler/testing"],
|
||||
"@angular/platform-browser": ["../../../dist/packages-dist/platform-browser"],
|
||||
"@angular/platform-browser/testing": ["../../../dist/packages-dist/platform-browser/testing"]
|
||||
},
|
||||
"rootDir": ".",
|
||||
"sourceMap": true,
|
||||
"inlineSources": true,
|
||||
"target": "es5"
|
||||
},
|
||||
"files": [
|
||||
"index.ts",
|
||||
"testing.ts",
|
||||
"../typings/es6-collections/es6-collections.d.ts",
|
||||
"../typings/es6-promise/es6-promise.d.ts",
|
||||
"../manual_typings/globals.d.ts",
|
||||
"../typings/hammerjs/hammerjs.d.ts",
|
||||
"../typings/jasmine/jasmine.d.ts",
|
||||
"../../../node_modules/zone.js/dist/zone.js.d.ts"
|
||||
]
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
export '../core/private_export.dart';
|
|
@ -1,6 +1,52 @@
|
|||
export * from './src/platform_browser';
|
||||
export {DomEventsPlugin} from './src/dom/events/dom_events';
|
||||
export {KeyEventsPlugin} from './src/dom/events/key_events';
|
||||
export {EventManager, EVENT_MANAGER_PLUGINS} from './src/dom/events/event_manager';
|
||||
export {HAMMER_GESTURE_CONFIG, HammerGestureConfig} from './src/dom/events/hammer_gestures';
|
||||
export {ELEMENT_PROBE_PROVIDERS} from './src/dom/debug/ng_probe';
|
||||
export {By} from './src/dom/debug/by';
|
||||
export {DOCUMENT} from './src/dom/dom_tokens';
|
||||
|
||||
export * from './src/worker_render';
|
||||
export * from './src/worker_app';
|
||||
export {BrowserPlatformLocation} from './src/browser/location/browser_platform_location';
|
||||
export {Title} from './src/browser/title';
|
||||
export {enableDebugTools, disableDebugTools} from './src/browser/tools/tools';
|
||||
|
||||
export {
|
||||
DomSanitizationService,
|
||||
SafeHtml,
|
||||
SafeScript,
|
||||
SafeStyle,
|
||||
SafeUrl,
|
||||
SafeResourceUrl,
|
||||
SecurityContext
|
||||
} from './src/security/dom_sanitization_service';
|
||||
|
||||
export * from './src/platform/common/browser';
|
||||
export * from './src/platform/static/browser';
|
||||
export * from './src/platform/dynamic/browser';
|
||||
|
||||
// Web Workers
|
||||
export {
|
||||
ClientMessageBroker,
|
||||
ClientMessageBrokerFactory,
|
||||
FnArg,
|
||||
UiArguments
|
||||
} from './src/web_workers/shared/client_message_broker';
|
||||
export {
|
||||
ReceivedMessage,
|
||||
ServiceMessageBroker,
|
||||
ServiceMessageBrokerFactory
|
||||
} from './src/web_workers/shared/service_message_broker';
|
||||
export {PRIMITIVE} from './src/web_workers/shared/serializer';
|
||||
export * from './src/web_workers/shared/message_bus';
|
||||
export {WORKER_APP_LOCATION_PROVIDERS} from './src/web_workers/worker/location_providers';
|
||||
export {WORKER_RENDER_LOCATION_PROVIDERS} from './src/web_workers/ui/location_providers';
|
||||
|
||||
export * from './src/platform/common/worker_render';
|
||||
export * from './src/platform/common/worker_app';
|
||||
export * from './src/platform/dynamic/worker_render';
|
||||
export * from './src/platform/dynamic/worker_app';
|
||||
export * from './src/platform/static/worker_render';
|
||||
export * from './src/platform/static/worker_app';
|
||||
|
||||
export * from './private_export';
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
export './src/dom/dom_adapter.dart' show DomAdapter, setRootDomAdapter;
|
||||
export '../src/animate/animation_builder' show AnimationBuilder, Animation;
|
||||
export '../src/animate/css_animation_builder' show CssAnimationBuilder;
|
||||
export '../src/animate/browser_details' show BrowserDetails;
|
||||
export './src/animate/css_animation_options' show CssAnimationOptions;
|
||||
export './src/animate/animation' show Animation;
|
|
@ -5,7 +5,7 @@ import * as css_animation_options from './src/animate/css_animation_options';
|
|||
import * as animation from './src/animate/animation';
|
||||
import * as dom_adapter from './src/dom/dom_adapter';
|
||||
import * as browser_adapter from './src/browser/browser_adapter';
|
||||
import * as browser_common from './src/browser_common';
|
||||
import * as browser_common from './src/platform/common/browser';
|
||||
|
||||
export namespace __platform_browser_private__ {
|
||||
export type DomAdapter = dom_adapter.DomAdapter;
|
||||
|
@ -13,25 +13,5 @@ export namespace __platform_browser_private__ {
|
|||
|
||||
export function getDOM(): DomAdapter { return dom_adapter.getDOM(); }
|
||||
|
||||
export function setDOM(adapter: DomAdapter) { return dom_adapter.setDOM(adapter); }
|
||||
|
||||
export var setRootDomAdapter = dom_adapter.setRootDomAdapter;
|
||||
|
||||
export type BrowserDomAdapter = browser_adapter.BrowserDomAdapter;
|
||||
export var BrowserDomAdapter = browser_adapter.BrowserDomAdapter;
|
||||
|
||||
export type AnimationBuilder = animation_builder.AnimationBuilder;
|
||||
export var AnimationBuilder = animation_builder.AnimationBuilder;
|
||||
|
||||
export type CssAnimationBuilder = css_animation_builder.CssAnimationBuilder;
|
||||
export var CssAnimationBuilder = css_animation_builder.CssAnimationBuilder;
|
||||
|
||||
export type CssAnimationOptions = css_animation_options.CssAnimationOptions;
|
||||
export var CssAnimationOptions = css_animation_options.CssAnimationOptions;
|
||||
|
||||
export type Animation = animation.Animation;
|
||||
export var Animation = animation.Animation;
|
||||
|
||||
export type BrowserDetails = browser_details.BrowserDetails;
|
||||
export var BrowserDetails = browser_details.BrowserDetails;
|
||||
}
|
||||
|
|
|
@ -1,536 +0,0 @@
|
|||
library angular.core.facade.dom;
|
||||
|
||||
import 'dart:html';
|
||||
import 'package:angular2/platform/common_dom.dart' show setRootDomAdapter;
|
||||
import 'generic_browser_adapter.dart' show GenericBrowserDomAdapter;
|
||||
import 'package:angular2/src/facade/browser.dart';
|
||||
import 'package:angular2/src/facade/lang.dart' show isBlank, isPresent;
|
||||
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<String, bool> _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<String, String> get attrToPropMap => const <String, String>{
|
||||
'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.parentNode;
|
||||
List<Node> 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<Node> 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<Node> getElementsByClassName(Element element, String name) =>
|
||||
element.getElementsByClassName(name);
|
||||
List<Node> getElementsByTagName(Element element, String name) =>
|
||||
element.querySelectorAll(name);
|
||||
List<String> 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);
|
||||
}
|
||||
|
||||
bool hasStyle(Element element, String styleName, [String styleValue]) {
|
||||
var value = this.getStyle(element, styleName);
|
||||
return isPresent(styleValue) ? value == styleValue : value.length > 0;
|
||||
}
|
||||
|
||||
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<String, String> 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);
|
||||
|
||||
bool hasAttributeNS(Element element, String ns, String attribute) =>
|
||||
element.getAttributeNS(ns, attribute) != null;
|
||||
|
||||
String getAttribute(Element element, String attribute) =>
|
||||
element.getAttribute(attribute);
|
||||
|
||||
String getAttributeNS(Element element, String ns, String attribute) =>
|
||||
element.getAttributeNS(ns, 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);
|
||||
}
|
||||
|
||||
void removeAttributeNS(Element element, String ns, String name) {
|
||||
element.getNamespacedAttributes(ns).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}';
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
import {PromiseWrapper} from '../../src/facade/async';
|
||||
import {DomAdapter} from '@angular/platform-browser/src/dom/dom_adapter';
|
||||
import {ElementRef} from '@angular/core/src/linker/element_ref';
|
||||
|
||||
export class Rectangle {
|
||||
left;
|
||||
right;
|
||||
top;
|
||||
bottom;
|
||||
height;
|
||||
width;
|
||||
constructor(left, top, width, height) {
|
||||
this.left = left;
|
||||
this.right = left + width;
|
||||
this.top = top;
|
||||
this.bottom = top + height;
|
||||
this.height = height;
|
||||
this.width = width;
|
||||
}
|
||||
}
|
||||
|
||||
export class Ruler {
|
||||
domAdapter: DomAdapter;
|
||||
constructor(domAdapter: DomAdapter) { this.domAdapter = domAdapter; }
|
||||
|
||||
measure(el: ElementRef): Promise<Rectangle> {
|
||||
var clntRect = <any>this.domAdapter.getBoundingClientRect(el.nativeElement);
|
||||
|
||||
// even if getBoundingClientRect is synchronous we use async API in preparation for further
|
||||
// changes
|
||||
return PromiseWrapper.resolve(
|
||||
new Rectangle(clntRect.left, clntRect.top, clntRect.width, clntRect.height));
|
||||
}
|
||||
}
|
|
@ -1,188 +0,0 @@
|
|||
library testability.browser_testability;
|
||||
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/platform/common_dom.dart';
|
||||
|
||||
import 'dart:html';
|
||||
import 'dart:js' as js;
|
||||
|
||||
// Work around http://dartbug.com/17752, copied from
|
||||
// https://github.com/angular/angular.dart/blob/master/lib/introspection.dart
|
||||
// Proxies a Dart function that accepts up to 10 parameters.
|
||||
js.JsFunction _jsFunction(Function fn) {
|
||||
const Object X = __varargSentinel;
|
||||
return new js.JsFunction.withThis((thisArg,
|
||||
[o1 = X,
|
||||
o2 = X,
|
||||
o3 = X,
|
||||
o4 = X,
|
||||
o5 = X,
|
||||
o6 = X,
|
||||
o7 = X,
|
||||
o8 = X,
|
||||
o9 = X,
|
||||
o10 = X]) {
|
||||
return __invokeFn(fn, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10);
|
||||
});
|
||||
}
|
||||
|
||||
const Object __varargSentinel = const Object();
|
||||
|
||||
__invokeFn(fn, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10) {
|
||||
var args = [o1, o2, o3, o4, o5, o6, o7, o8, o9, o10];
|
||||
while (args.length > 0 && identical(args.last, __varargSentinel)) {
|
||||
args.removeLast();
|
||||
}
|
||||
return _jsify(Function.apply(fn, args));
|
||||
}
|
||||
|
||||
// Helper function to JSify a Dart object. While this is *required* to JSify
|
||||
// the result of a scope.eval(), other uses are not required and are used to
|
||||
// work around http://dartbug.com/17752 in a convenient way (that bug affects
|
||||
// dart2js in checked mode.)
|
||||
_jsify(var obj) {
|
||||
if (obj == null || obj is js.JsObject) {
|
||||
return obj;
|
||||
}
|
||||
if (obj is _JsObjectProxyable) {
|
||||
return obj._toJsObject();
|
||||
}
|
||||
if (obj is Function) {
|
||||
return _jsFunction(obj);
|
||||
}
|
||||
if ((obj is Map) || (obj is Iterable)) {
|
||||
var mappedObj = (obj is Map)
|
||||
? new Map.fromIterables(obj.keys, obj.values.map(_jsify))
|
||||
: obj.map(_jsify);
|
||||
if (obj is List) {
|
||||
return new js.JsArray.from(mappedObj);
|
||||
} else {
|
||||
return new js.JsObject.jsify(mappedObj);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
abstract class _JsObjectProxyable {
|
||||
js.JsObject _toJsObject();
|
||||
}
|
||||
|
||||
class PublicTestability implements _JsObjectProxyable {
|
||||
Testability _testability;
|
||||
PublicTestability(Testability testability) {
|
||||
this._testability = testability;
|
||||
}
|
||||
|
||||
bool isStable() {
|
||||
return this._testability.isStable();
|
||||
}
|
||||
|
||||
whenStable(Function callback) {
|
||||
return this._testability.whenStable(callback);
|
||||
}
|
||||
|
||||
findBindings(Element elem, String binding, bool exactMatch) {
|
||||
return this._testability.findBindings(elem, binding, exactMatch);
|
||||
}
|
||||
|
||||
js.JsObject _toJsObject() {
|
||||
return _jsify({
|
||||
'findBindings': (bindingString, [exactMatch, allowNonElementNodes]) =>
|
||||
findBindings(bindingString, exactMatch, allowNonElementNodes),
|
||||
'isStable': () => isStable(),
|
||||
'whenStable': (callback) => whenStable((didWork) => callback.apply([didWork]))
|
||||
})..['_dart_'] = this;
|
||||
}
|
||||
}
|
||||
|
||||
class BrowserGetTestability implements GetTestability {
|
||||
const BrowserGetTestability();
|
||||
|
||||
static init() {
|
||||
setTestabilityGetter(const BrowserGetTestability());
|
||||
}
|
||||
|
||||
void addToWindow(TestabilityRegistry registry) {
|
||||
var jsRegistry = js.context['ngTestabilityRegistries'];
|
||||
if (jsRegistry == null) {
|
||||
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 getAllAngularTestabilities = () {
|
||||
var registry = js.context['ngTestabilityRegistries'];
|
||||
var result = [];
|
||||
for (int i = 0; i < registry.length; i++) {
|
||||
var testabilities =
|
||||
registry[i].callMethod('getAllAngularTestabilities');
|
||||
if (testabilities != null) result.addAll(testabilities);
|
||||
}
|
||||
return _jsify(result);
|
||||
};
|
||||
js.context['getAllAngularTestabilities'] =
|
||||
_jsify(getAllAngularTestabilities);
|
||||
|
||||
var whenAllStable = _jsify((callback) {
|
||||
var testabilities = getAllAngularTestabilities();
|
||||
var count = testabilities.length;
|
||||
var didWork = false;
|
||||
var decrement = _jsify((bool didWork_) {
|
||||
didWork = didWork || didWork_;
|
||||
count--;
|
||||
if (count == 0) {
|
||||
callback.apply([didWork]);
|
||||
}
|
||||
});
|
||||
testabilities.forEach((testability) {
|
||||
testability.callMethod('whenStable', [decrement]);
|
||||
});
|
||||
});
|
||||
if (js.context['frameworkStabilizers'] == null) {
|
||||
js.context['frameworkStabilizers'] = new js.JsArray();
|
||||
}
|
||||
js.context['frameworkStabilizers'].add(whenAllStable);
|
||||
}
|
||||
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 (getDOM().isShadowRoot(elem)) {
|
||||
return this.findTestabilityInTree(registry, getDOM().getHost(elem), true);
|
||||
}
|
||||
return this.findTestabilityInTree(registry, getDOM().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));
|
||||
});
|
||||
object['getAllAngularTestabilities'] = _jsify(() {
|
||||
var publicTestabilities = registry
|
||||
.getAllTestabilities()
|
||||
.map((testability) => new PublicTestability(testability));
|
||||
return _jsify(publicTestabilities);
|
||||
});
|
||||
return object;
|
||||
}
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
library angular.events;
|
||||
|
||||
import 'dart:html';
|
||||
import './hammer_common.dart';
|
||||
import 'package:angular2/src/facade/exceptions.dart' show BaseException;
|
||||
import "package:angular2/src/core/di.dart" show Injectable, Inject, OpaqueToken;
|
||||
|
||||
import 'dart:js' as js;
|
||||
|
||||
const OpaqueToken HAMMER_GESTURE_CONFIG = const OpaqueToken("HammerGestureConfig");
|
||||
|
||||
overrideDefault(js.JsObject mc, String eventName, Object config) {
|
||||
var jsObj = mc.callMethod('get', [eventName]);
|
||||
jsObj.callMethod('set', [
|
||||
new js.JsObject.jsify(config)
|
||||
]);
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
class HammerGestureConfig {
|
||||
List<String> events = [];
|
||||
Map overrides = {};
|
||||
|
||||
buildHammer(Element element) {
|
||||
var mc = new js.JsObject(js.context['Hammer'], [element]);
|
||||
overrideDefault(mc, 'pinch', {'enable': true});
|
||||
overrideDefault(mc, 'rotate', {'enable': true});
|
||||
this.overrides.forEach((Object config, String eventName) => overrideDefault(mc, eventName, config));
|
||||
return mc;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
class HammerGesturesPlugin extends HammerGesturesPluginCommon {
|
||||
HammerGestureConfig _config;
|
||||
|
||||
HammerGesturesPlugin(@Inject(HAMMER_GESTURE_CONFIG) this._config) {}
|
||||
|
||||
bool supports(String eventName) {
|
||||
if (!super.supports(eventName) && !this.isCustomEvent(eventName)) return false;
|
||||
|
||||
if (!js.context.hasProperty('Hammer')) {
|
||||
throw new BaseException(
|
||||
'Hammer.js is not loaded, can not bind ${eventName} event');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
addEventListener(Element element, String eventName, Function handler) {
|
||||
var zone = this.manager.getZone();
|
||||
eventName = eventName.toLowerCase();
|
||||
|
||||
zone.runOutsideAngular(() {
|
||||
// Creating the manager bind events, must be done outside of angular
|
||||
var mc = this._config.buildHammer(element);
|
||||
|
||||
mc.callMethod('on', [
|
||||
eventName,
|
||||
(eventObj) {
|
||||
zone.runGuarded(() {
|
||||
var dartEvent = new HammerEvent._fromJsEvent(eventObj);
|
||||
handler(dartEvent);
|
||||
});
|
||||
}
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
isCustomEvent(String eventName) { return this._config.events.indexOf(eventName) > -1; }
|
||||
|
||||
}
|
||||
|
||||
class HammerEvent {
|
||||
num angle;
|
||||
num centerX;
|
||||
num centerY;
|
||||
int deltaTime;
|
||||
int deltaX;
|
||||
int deltaY;
|
||||
int direction;
|
||||
int distance;
|
||||
num rotation;
|
||||
num scale;
|
||||
Node target;
|
||||
int timeStamp;
|
||||
String type;
|
||||
num velocity;
|
||||
num velocityX;
|
||||
num velocityY;
|
||||
js.JsObject jsEvent;
|
||||
|
||||
HammerEvent._fromJsEvent(js.JsObject event) {
|
||||
angle = event['angle'];
|
||||
var center = event['center'];
|
||||
centerX = center['x'];
|
||||
centerY = center['y'];
|
||||
deltaTime = event['deltaTime'];
|
||||
deltaX = event['deltaX'];
|
||||
deltaY = event['deltaY'];
|
||||
direction = event['direction'];
|
||||
distance = event['distance'];
|
||||
rotation = event['rotation'];
|
||||
scale = event['scale'];
|
||||
target = event['target'];
|
||||
timeStamp = event['timeStamp'];
|
||||
type = event['type'];
|
||||
velocity = event['velocity'];
|
||||
velocityX = event['velocityX'];
|
||||
velocityY = event['velocityY'];
|
||||
jsEvent = event;
|
||||
}
|
||||
}
|
|
@ -7,42 +7,33 @@ import {
|
|||
APPLICATION_COMMON_PROVIDERS,
|
||||
PLATFORM_COMMON_PROVIDERS,
|
||||
OpaqueToken,
|
||||
Testability
|
||||
} from '@angular/core';
|
||||
import {wtfInit, SanitizationService} from '../core_private';
|
||||
import {COMMON_DIRECTIVES, COMMON_PIPES, FORM_PROVIDERS} from '@angular/common';
|
||||
import {
|
||||
DomSanitizationService,
|
||||
DomSanitizationServiceImpl
|
||||
} from './security/dom_sanitization_service';
|
||||
Testability,
|
||||
PlatformRef,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform,
|
||||
ReflectiveInjector
|
||||
} from "@angular/core";
|
||||
import {isBlank} from "../../facade/lang";
|
||||
import {wtfInit, SanitizationService} from "../../../core_private";
|
||||
import {COMMON_DIRECTIVES, COMMON_PIPES, FORM_PROVIDERS, PlatformLocation} from "@angular/common";
|
||||
import {DomSanitizationService, DomSanitizationServiceImpl} from "../../security/dom_sanitization_service";
|
||||
import {BrowserDomAdapter} from "../../browser/browser_adapter";
|
||||
import {BrowserGetTestability} from "../../browser/testability";
|
||||
import {getDOM} from "../../dom/dom_adapter";
|
||||
import {DOCUMENT} from "../../dom/dom_tokens";
|
||||
import {EVENT_MANAGER_PLUGINS, EventManager} from "../../dom/events/event_manager";
|
||||
import {DomRootRenderer, DomRootRenderer_} from "../../dom/dom_renderer";
|
||||
import {SharedStylesHost, DomSharedStylesHost} from "../../dom/shared_styles_host";
|
||||
import {KeyEventsPlugin} from "../../dom/events/key_events";
|
||||
import {ELEMENT_PROBE_PROVIDERS} from "../../dom/debug/ng_probe";
|
||||
import {DomEventsPlugin} from "../../dom/events/dom_events";
|
||||
import {HAMMER_GESTURE_CONFIG, HammerGestureConfig, HammerGesturesPlugin} from "../../dom/events/hammer_gestures";
|
||||
import {AnimationBuilder} from "../../animate/animation_builder";
|
||||
import {BrowserDetails} from "../../animate/browser_details";
|
||||
import {BrowserPlatformLocation} from "../../browser/location/browser_platform_location";
|
||||
|
||||
import {IS_DART} from './facade/lang';
|
||||
import {BrowserDomAdapter} from './browser/browser_adapter';
|
||||
import {BrowserGetTestability} from './browser/testability';
|
||||
import {getDOM} from './dom/dom_adapter';
|
||||
import {DOCUMENT} from './dom/dom_tokens';
|
||||
import {EVENT_MANAGER_PLUGINS, EventManager} from './dom/events/event_manager';
|
||||
import {DomRootRenderer, DomRootRenderer_} from './dom/dom_renderer';
|
||||
import {SharedStylesHost} from './dom/shared_styles_host';
|
||||
import {KeyEventsPlugin} from './dom/events/key_events';
|
||||
import {ELEMENT_PROBE_PROVIDERS} from './dom/debug/ng_probe';
|
||||
import {DomEventsPlugin} from './dom/events/dom_events';
|
||||
import {
|
||||
HAMMER_GESTURE_CONFIG,
|
||||
HammerGestureConfig,
|
||||
HammerGesturesPlugin
|
||||
} from './dom/events/hammer_gestures';
|
||||
import {DomSharedStylesHost} from './dom/shared_styles_host';
|
||||
import {AnimationBuilder} from './animate/animation_builder';
|
||||
import {BrowserDetails} from './animate/browser_details';
|
||||
import {PlatformLocation} from '@angular/common';
|
||||
import {BrowserPlatformLocation} from './browser/location/browser_platform_location';
|
||||
export {Title} from './browser/title';
|
||||
export {BrowserDomAdapter} from './browser/browser_adapter';
|
||||
export {enableDebugTools, disableDebugTools} from './browser/tools/tools';
|
||||
export {By} from './dom/debug/by';
|
||||
|
||||
export const BROWSER_PLATFORM_MARKER =
|
||||
const BROWSER_PLATFORM_MARKER =
|
||||
/*@ts2dart_const*/ new OpaqueToken('BrowserPlatformMarker');
|
||||
|
||||
/**
|
||||
|
@ -50,23 +41,13 @@ export const BROWSER_PLATFORM_MARKER =
|
|||
*
|
||||
* Used automatically by `bootstrap`, or can be passed to {@link platform}.
|
||||
*/
|
||||
export const BROWSER_PROVIDERS: Array<any /*Type | Provider | any[]*/> = /*@ts2dart_const*/[
|
||||
export const BROWSER_PLATFORM_PROVIDERS: Array<any /*Type | Provider | any[]*/> = /*@ts2dart_const*/[
|
||||
/*@ts2dart_Provider*/ {provide: BROWSER_PLATFORM_MARKER, useValue: true},
|
||||
PLATFORM_COMMON_PROVIDERS,
|
||||
/*@ts2dart_Provider*/ {provide: PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true},
|
||||
/*@ts2dart_Provider*/ {provide: PlatformLocation, useClass: BrowserPlatformLocation}
|
||||
];
|
||||
|
||||
function _exceptionHandler(): ExceptionHandler {
|
||||
// !IS_DART is required because we must rethrow exceptions in JS,
|
||||
// but must not rethrow exceptions in Dart
|
||||
return new ExceptionHandler(getDOM(), !IS_DART);
|
||||
}
|
||||
|
||||
function _document(): any {
|
||||
return getDOM().defaultDoc();
|
||||
}
|
||||
|
||||
export const BROWSER_SANITIZATION_PROVIDERS: Array<any> = /*@ts2dart_const*/[
|
||||
/* @ts2dart_Provider */ {provide: SanitizationService, useExisting: DomSanitizationService},
|
||||
/* @ts2dart_Provider */ {provide: DomSanitizationService, useClass: DomSanitizationServiceImpl},
|
||||
|
@ -101,11 +82,23 @@ export const BROWSER_APP_COMMON_PROVIDERS: Array<any /*Type | Provider | any[]*/
|
|||
ELEMENT_PROBE_PROVIDERS
|
||||
];
|
||||
|
||||
export function browserPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PLATFORM_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(BROWSER_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
export {HAMMER_GESTURE_CONFIG, HammerGestureConfig} from '../src/dom/events/hammer_gestures';
|
||||
|
||||
export function initDomAdapter() {
|
||||
function initDomAdapter() {
|
||||
BrowserDomAdapter.makeCurrent();
|
||||
wtfInit();
|
||||
BrowserGetTestability.init();
|
||||
}
|
||||
|
||||
function _exceptionHandler(): ExceptionHandler {
|
||||
return new ExceptionHandler(getDOM());
|
||||
}
|
||||
|
||||
function _document(): any {
|
||||
return getDOM().defaultDoc();
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
import {WebWorkerRootRenderer} from '../web_workers/worker/renderer';
|
||||
import {print} from '../../src/facade/lang';
|
||||
import {WebWorkerRootRenderer} from '../../web_workers/worker/renderer';
|
||||
import {print, isBlank} from '../../../src/facade/lang';
|
||||
import {
|
||||
PLATFORM_DIRECTIVES,
|
||||
PLATFORM_PIPES,
|
||||
|
@ -7,21 +7,26 @@ import {
|
|||
APPLICATION_COMMON_PROVIDERS,
|
||||
PLATFORM_COMMON_PROVIDERS,
|
||||
OpaqueToken,
|
||||
RootRenderer
|
||||
RootRenderer,
|
||||
PlatformRef,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform,
|
||||
ReflectiveInjector
|
||||
} from '@angular/core';
|
||||
import {COMMON_DIRECTIVES, COMMON_PIPES, FORM_PROVIDERS} from '@angular/common';
|
||||
import {
|
||||
ClientMessageBrokerFactory,
|
||||
ClientMessageBrokerFactory_
|
||||
} from '../web_workers/shared/client_message_broker';
|
||||
} from '../../web_workers/shared/client_message_broker';
|
||||
import {
|
||||
ServiceMessageBrokerFactory,
|
||||
ServiceMessageBrokerFactory_
|
||||
} from '../web_workers/shared/service_message_broker';
|
||||
import {Serializer} from '../web_workers/shared/serializer';
|
||||
import {ON_WEB_WORKER} from '../web_workers/shared/api';
|
||||
import {RenderStore} from '../web_workers/shared/render_store';
|
||||
import {BROWSER_SANITIZATION_PROVIDERS} from '../browser_common';
|
||||
} from '../../web_workers/shared/service_message_broker';
|
||||
import {Serializer} from '../../web_workers/shared/serializer';
|
||||
import {ON_WEB_WORKER} from '../../web_workers/shared/api';
|
||||
import {RenderStore} from '../../web_workers/shared/render_store';
|
||||
import {BROWSER_SANITIZATION_PROVIDERS} from './browser';
|
||||
|
||||
class PrintLogger {
|
||||
log = print;
|
||||
|
@ -30,7 +35,7 @@ class PrintLogger {
|
|||
logGroupEnd() {}
|
||||
}
|
||||
|
||||
export const WORKER_APP_PLATFORM_MARKER =
|
||||
const WORKER_APP_PLATFORM_MARKER =
|
||||
/*@ts2dart_const*/ new OpaqueToken('WorkerAppPlatformMarker');
|
||||
|
||||
export const WORKER_APP_PLATFORM_PROVIDERS: Array<any /*Type | Provider | any[]*/> =
|
||||
|
@ -57,6 +62,13 @@ export const WORKER_APP_APPLICATION_COMMON_PROVIDERS: Array<any /*Type | Provide
|
|||
/* @ts2dart_Provider */ {provide: ExceptionHandler, useFactory: _exceptionHandler, deps: []}
|
||||
];
|
||||
|
||||
export function workerAppPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_APP_PLATFORM_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(WORKER_APP_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
function _exceptionHandler(): ExceptionHandler {
|
||||
return new ExceptionHandler(new PrintLogger());
|
||||
}
|
||||
}
|
|
@ -1,40 +1,47 @@
|
|||
import {IS_DART} from '../../src/facade/lang';
|
||||
import {MessageBus} from '../web_workers/shared/message_bus';
|
||||
import {NgZone, Provider, Injector, OpaqueToken, Testability} from '@angular/core';
|
||||
import {wtfInit} from '../../core_private';
|
||||
import {isBlank} from "../../../src/facade/lang";
|
||||
import {MessageBus} from "../../web_workers/shared/message_bus";
|
||||
import {
|
||||
NgZone,
|
||||
Injector,
|
||||
OpaqueToken,
|
||||
Testability,
|
||||
ExceptionHandler,
|
||||
APPLICATION_COMMON_PROVIDERS,
|
||||
PLATFORM_COMMON_PROVIDERS,
|
||||
RootRenderer,
|
||||
PLATFORM_INITIALIZER
|
||||
} from '@angular/core';
|
||||
import {getDOM} from '../dom/dom_adapter';
|
||||
import {DomEventsPlugin} from '../dom/events/dom_events';
|
||||
import {KeyEventsPlugin} from '../dom/events/key_events';
|
||||
import {HammerGesturesPlugin} from '../dom/events/hammer_gestures';
|
||||
import {DOCUMENT} from '../dom/dom_tokens';
|
||||
import {DomRootRenderer, DomRootRenderer_} from '../dom/dom_renderer';
|
||||
import {DomSharedStylesHost, SharedStylesHost} from '../dom/shared_styles_host';
|
||||
import {BrowserDetails} from '../animate/browser_details';
|
||||
import {AnimationBuilder} from '../animate/animation_builder';
|
||||
import {BrowserGetTestability} from '../browser/testability';
|
||||
import {BrowserDomAdapter} from '../browser/browser_adapter';
|
||||
import {MessageBasedRenderer} from '../web_workers/ui/renderer';
|
||||
PLATFORM_INITIALIZER,
|
||||
PlatformRef,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform,
|
||||
ReflectiveInjector
|
||||
} from "@angular/core";
|
||||
import {wtfInit} from "../../../core_private";
|
||||
import {getDOM} from "../../dom/dom_adapter";
|
||||
import {DomEventsPlugin} from "../../dom/events/dom_events";
|
||||
import {KeyEventsPlugin} from "../../dom/events/key_events";
|
||||
import {HammerGesturesPlugin, HAMMER_GESTURE_CONFIG, HammerGestureConfig} from "../../dom/events/hammer_gestures";
|
||||
import {DOCUMENT} from "../../dom/dom_tokens";
|
||||
import {DomRootRenderer, DomRootRenderer_} from "../../dom/dom_renderer";
|
||||
import {DomSharedStylesHost, SharedStylesHost} from "../../dom/shared_styles_host";
|
||||
import {BrowserDetails} from "../../animate/browser_details";
|
||||
import {AnimationBuilder} from "../../animate/animation_builder";
|
||||
import {BrowserGetTestability} from "../../browser/testability";
|
||||
import {BrowserDomAdapter} from "../../browser/browser_adapter";
|
||||
import {MessageBasedRenderer} from "../../web_workers/ui/renderer";
|
||||
import {
|
||||
ServiceMessageBrokerFactory,
|
||||
ServiceMessageBrokerFactory_
|
||||
} from '../web_workers/shared/service_message_broker';
|
||||
import {
|
||||
ClientMessageBrokerFactory,
|
||||
ClientMessageBrokerFactory_
|
||||
} from '../web_workers/shared/client_message_broker';
|
||||
import {Serializer} from '../web_workers/shared/serializer';
|
||||
import {ON_WEB_WORKER} from '../web_workers/shared/api';
|
||||
import {RenderStore} from '../web_workers/shared/render_store';
|
||||
import {HAMMER_GESTURE_CONFIG, HammerGestureConfig} from '../dom/events/hammer_gestures';
|
||||
import {EventManager, EVENT_MANAGER_PLUGINS} from '../dom/events/event_manager';
|
||||
import {BROWSER_SANITIZATION_PROVIDERS} from '../browser_common';
|
||||
} from "../../web_workers/shared/service_message_broker";
|
||||
import {ClientMessageBrokerFactory, ClientMessageBrokerFactory_} from "../../web_workers/shared/client_message_broker";
|
||||
import {Serializer} from "../../web_workers/shared/serializer";
|
||||
import {ON_WEB_WORKER} from "../../web_workers/shared/api";
|
||||
import {RenderStore} from "../../web_workers/shared/render_store";
|
||||
import {EventManager, EVENT_MANAGER_PLUGINS} from "../../dom/events/event_manager";
|
||||
import {BROWSER_SANITIZATION_PROVIDERS} from "../common/browser";
|
||||
|
||||
const WORKER_RENDER_PLATFORM_MARKER =
|
||||
/*@ts2dart_const*/ new OpaqueToken('WorkerRenderPlatformMarker');
|
||||
|
||||
export const WORKER_SCRIPT: OpaqueToken = /*@ts2dart_const*/ new OpaqueToken("WebWorkerScript");
|
||||
|
||||
|
@ -47,9 +54,6 @@ export const WORKER_SCRIPT: OpaqueToken = /*@ts2dart_const*/ new OpaqueToken("We
|
|||
export const WORKER_RENDER_STARTABLE_MESSAGING_SERVICE =
|
||||
/*@ts2dart_const*/ new OpaqueToken('WorkerRenderStartableMsgService');
|
||||
|
||||
export const WORKER_RENDER_PLATFORM_MARKER =
|
||||
/*@ts2dart_const*/ new OpaqueToken('WorkerRenderPlatformMarker');
|
||||
|
||||
export const WORKER_RENDER_PLATFORM_PROVIDERS: Array<any /*Type | Provider | any[]*/> = /*@ts2dart_const*/[
|
||||
PLATFORM_COMMON_PROVIDERS,
|
||||
/*@ts2dart_const*/ (/* @ts2dart_Provider */ {provide: WORKER_RENDER_PLATFORM_MARKER, useValue: true}),
|
||||
|
@ -95,14 +99,21 @@ export function initializeGenericWorkerRenderer(injector: Injector) {
|
|||
zone.runGuarded(() => { services.forEach((svc) => { svc.start(); }); });
|
||||
}
|
||||
|
||||
export function initWebWorkerRenderPlatform(): void {
|
||||
function initWebWorkerRenderPlatform(): void {
|
||||
BrowserDomAdapter.makeCurrent();
|
||||
wtfInit();
|
||||
BrowserGetTestability.init();
|
||||
}
|
||||
|
||||
export function workerRenderPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_RENDER_PLATFORM_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(WORKER_RENDER_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
function _exceptionHandler(): ExceptionHandler {
|
||||
return new ExceptionHandler(getDOM(), !IS_DART);
|
||||
return new ExceptionHandler(getDOM());
|
||||
}
|
||||
|
||||
function _document(): any {
|
|
@ -7,14 +7,12 @@ import {
|
|||
} from '@angular/core';
|
||||
|
||||
import {COMPILER_PROVIDERS, XHR} from '@angular/compiler';
|
||||
import {CachedXHR} from '../src/xhr/xhr_cache';
|
||||
import {isPresent} from '../src/facade/lang';
|
||||
import {XHRImpl} from '../src/xhr/xhr_impl';
|
||||
import {
|
||||
browserPlatform,
|
||||
BROWSER_APP_COMMON_PROVIDERS,
|
||||
} from '@angular/platform-browser';
|
||||
import {ReflectionCapabilities} from '../core_private';
|
||||
import {CachedXHR} from '../../../src/xhr/xhr_cache';
|
||||
import {isPresent} from '../../../src/facade/lang';
|
||||
import {XHRImpl} from '../../../src/xhr/xhr_impl';
|
||||
import {browserPlatform, BROWSER_APP_COMMON_PROVIDERS} from '../common/browser';
|
||||
|
||||
import {ReflectionCapabilities} from '../../../core_private';
|
||||
|
||||
export const CACHED_TEMPLATE_PROVIDER: Array<any /*Type | Provider | any[]*/> =
|
||||
/*@ts2dart_const*/[{provide: XHR, useClass: CachedXHR}];
|
||||
|
@ -22,7 +20,7 @@ export const CACHED_TEMPLATE_PROVIDER: Array<any /*Type | Provider | any[]*/> =
|
|||
/**
|
||||
* An array of providers that should be passed into `application()` when bootstrapping a component.
|
||||
*/
|
||||
export const BROWSER_APP_DYNAMIC_PROVIDERS: Array<any /*Type | Provider | any[]*/> =
|
||||
export const BROWSER_APP_PROVIDERS: Array<any /*Type | Provider | any[]*/> =
|
||||
/*@ts2dart_const*/[
|
||||
BROWSER_APP_COMMON_PROVIDERS,
|
||||
COMPILER_PROVIDERS,
|
||||
|
@ -102,7 +100,7 @@ export function bootstrap(
|
|||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
|
||||
reflector.reflectionCapabilities = new ReflectionCapabilities();
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate(
|
||||
[BROWSER_APP_DYNAMIC_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
[BROWSER_APP_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
browserPlatform().injector);
|
||||
return coreLoadAndBootstrap(appInjector, appComponentType);
|
||||
}
|
|
@ -1,18 +1,18 @@
|
|||
import {WORKER_APP_APPLICATION_PROVIDERS, workerAppPlatform} from '@angular/platform-browser';
|
||||
import {WORKER_APP_STATIC_APPLICATION_PROVIDERS} from '../static/worker_app';
|
||||
import {workerAppPlatform} from '../common/worker_app';
|
||||
import {COMPILER_PROVIDERS, XHR} from '@angular/compiler';
|
||||
import {WebWorkerXHRImpl} from './web_workers/worker/xhr_impl';
|
||||
import {isPresent} from './facade/lang';
|
||||
import {WebWorkerXHRImpl} from '../../web_workers/worker/xhr_impl';
|
||||
import {isPresent} from '../../facade/lang';
|
||||
|
||||
import {
|
||||
PlatformRef,
|
||||
Type,
|
||||
ComponentRef,
|
||||
ReflectiveInjector,
|
||||
coreLoadAndBootstrap,
|
||||
} from '@angular/core';
|
||||
|
||||
export const WORKER_APP_DYNAMIC_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_APP_APPLICATION_PROVIDERS,
|
||||
export const WORKER_APP_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_APP_STATIC_APPLICATION_PROVIDERS,
|
||||
COMPILER_PROVIDERS,
|
||||
WebWorkerXHRImpl,
|
||||
/* @ts2dart_Provider */ {provide: XHR, useExisting: WebWorkerXHRImpl}
|
||||
|
@ -22,7 +22,7 @@ export function bootstrapApp(
|
|||
appComponentType: Type,
|
||||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate(
|
||||
[WORKER_APP_DYNAMIC_APPLICATION_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
[WORKER_APP_APPLICATION_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
workerAppPlatform().injector);
|
||||
return coreLoadAndBootstrap(appInjector, appComponentType);
|
||||
}
|
|
@ -1,21 +1,14 @@
|
|||
import {XHR} from "@angular/compiler";
|
||||
import {XHRImpl} from "./xhr/xhr_impl";
|
||||
import {MessageBasedXHRImpl} from "./web_workers/ui/xhr_impl";
|
||||
import {
|
||||
WORKER_RENDER_APPLICATION_PROVIDERS,
|
||||
WORKER_RENDER_STARTABLE_MESSAGING_SERVICE
|
||||
} from '@angular/platform-browser';
|
||||
import {
|
||||
ApplicationRef,
|
||||
PlatformRef,
|
||||
ReflectiveInjector,
|
||||
} from '@angular/core';
|
||||
import {workerRenderPlatform, WORKER_SCRIPT} from '@angular/platform-browser';
|
||||
import {isPresent} from './facade/lang';
|
||||
import {PromiseWrapper} from './facade/async';
|
||||
import {XHRImpl} from "../../xhr/xhr_impl";
|
||||
import {MessageBasedXHRImpl} from "../../web_workers/ui/xhr_impl";
|
||||
import {WORKER_RENDER_STATIC_APPLICATION_PROVIDERS} from "../static/worker_render";
|
||||
import {ApplicationRef, ReflectiveInjector} from "@angular/core";
|
||||
import {workerRenderPlatform, WORKER_SCRIPT, WORKER_RENDER_STARTABLE_MESSAGING_SERVICE} from "../common/worker_render";
|
||||
import {isPresent} from "../../facade/lang";
|
||||
import {PromiseWrapper} from "../../facade/async";
|
||||
|
||||
export const WORKER_RENDER_DYNAMIC_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_RENDER_APPLICATION_PROVIDERS,
|
||||
export const WORKER_RENDER_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_RENDER_STATIC_APPLICATION_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: XHR, useClass: XHRImpl},
|
||||
MessageBasedXHRImpl,
|
||||
/* @ts2dart_Provider */ {provide: WORKER_RENDER_STARTABLE_MESSAGING_SERVICE, useExisting: MessageBasedXHRImpl, multi: true},
|
||||
|
@ -26,7 +19,7 @@ export function bootstrapRender(
|
|||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ApplicationRef> {
|
||||
var app = ReflectiveInjector.resolveAndCreate(
|
||||
[
|
||||
WORKER_RENDER_DYNAMIC_APPLICATION_PROVIDERS,
|
||||
WORKER_RENDER_APPLICATION_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: WORKER_SCRIPT, useValue: workerScriptUri},
|
||||
isPresent(customProviders) ? customProviders : []
|
||||
],
|
|
@ -1,43 +1,21 @@
|
|||
import {
|
||||
ComponentRef,
|
||||
coreLoadAndBootstrap,
|
||||
ReflectiveInjector,
|
||||
PlatformRef,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform
|
||||
ReflectiveInjector
|
||||
} from '@angular/core';
|
||||
|
||||
import {Type, isPresent, isBlank} from './facade/lang';
|
||||
import {Type, isPresent} from '../../facade/lang';
|
||||
import {
|
||||
BROWSER_APP_COMMON_PROVIDERS,
|
||||
BROWSER_PROVIDERS,
|
||||
BROWSER_PLATFORM_MARKER
|
||||
} from './browser_common';
|
||||
export {ELEMENT_PROBE_PROVIDERS} from './dom/debug/ng_probe';
|
||||
export {BrowserPlatformLocation} from './browser/location/browser_platform_location';
|
||||
export {
|
||||
BROWSER_PROVIDERS,
|
||||
By,
|
||||
Title,
|
||||
enableDebugTools,
|
||||
disableDebugTools,
|
||||
} from './browser_common';
|
||||
browserPlatform
|
||||
} from '../common/browser';
|
||||
|
||||
/**
|
||||
* An array of providers that should be passed into `application()` when bootstrapping a component
|
||||
* when all templates have been precompiled offline.
|
||||
* when all templates have been pre-compiled.
|
||||
*/
|
||||
export const BROWSER_APP_STATIC_PROVIDERS: Array<any /*Type | Provider | any[]*/> =
|
||||
/*@ts2dart_const*/ BROWSER_APP_COMMON_PROVIDERS;
|
||||
|
||||
export function browserPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(BROWSER_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link bootstrap} for more information.
|
||||
*/
|
|
@ -0,0 +1,45 @@
|
|||
import {APP_INITIALIZER, NgZone, ReflectiveInjector, ComponentRef, coreLoadAndBootstrap} from '@angular/core';
|
||||
import {Type, isPresent} from '../../../src/facade/lang';
|
||||
import {workerAppPlatform} from '../common/worker_app';
|
||||
import {WorkerDomAdapter} from '../../web_workers/worker/worker_adapter';
|
||||
import {
|
||||
PostMessageBus,
|
||||
PostMessageBusSink,
|
||||
PostMessageBusSource
|
||||
} from '../../web_workers/shared/post_message_bus';
|
||||
import {WORKER_APP_APPLICATION_COMMON_PROVIDERS} from '../common/worker_app';
|
||||
import {MessageBus} from '../../web_workers/shared/message_bus';
|
||||
|
||||
// TODO(jteplitz602) remove this and compile with lib.webworker.d.ts (#3492)
|
||||
let _postMessage = {
|
||||
postMessage: (message: any, transferrables?:[ArrayBuffer]) => {
|
||||
(<any>postMessage)(message, transferrables);
|
||||
}
|
||||
};
|
||||
|
||||
export const WORKER_APP_STATIC_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_APP_APPLICATION_COMMON_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: MessageBus, useFactory: createMessageBus, deps: [NgZone]},
|
||||
/* @ts2dart_Provider */ {provide: APP_INITIALIZER, useValue: setupWebWorker, multi: true}
|
||||
];
|
||||
|
||||
export function bootstrapStaticApp(
|
||||
appComponentType: Type,
|
||||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate(
|
||||
[WORKER_APP_STATIC_APPLICATION_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
workerAppPlatform().injector);
|
||||
return coreLoadAndBootstrap(appInjector, appComponentType);
|
||||
}
|
||||
|
||||
function createMessageBus(zone: NgZone): MessageBus {
|
||||
let sink = new PostMessageBusSink(_postMessage);
|
||||
let source = new PostMessageBusSource();
|
||||
let bus = new PostMessageBus(sink, source);
|
||||
bus.attachToZone(zone);
|
||||
return bus;
|
||||
}
|
||||
|
||||
function setupWebWorker(): void {
|
||||
WorkerDomAdapter.makeCurrent();
|
||||
}
|
|
@ -2,17 +2,24 @@ import {
|
|||
PostMessageBus,
|
||||
PostMessageBusSink,
|
||||
PostMessageBusSource
|
||||
} from '../web_workers/shared/post_message_bus';
|
||||
import {MessageBus} from '../web_workers/shared/message_bus';
|
||||
} from '../../web_workers/shared/post_message_bus';
|
||||
import {MessageBus} from '../../web_workers/shared/message_bus';
|
||||
import {Injector, Injectable, APP_INITIALIZER} from '@angular/core';
|
||||
import {
|
||||
WORKER_RENDER_APPLICATION_COMMON_PROVIDERS,
|
||||
WORKER_SCRIPT,
|
||||
initializeGenericWorkerRenderer
|
||||
} from './worker_render_common';
|
||||
import {BaseException} from '../../src/facade/exceptions';
|
||||
} from '../common/worker_render';
|
||||
import {BaseException} from '../../../src/facade/exceptions';
|
||||
|
||||
export {WORKER_RENDER_STARTABLE_MESSAGING_SERVICE} from './worker_render_common';
|
||||
|
||||
import {isPresent} from '../../facade/lang';
|
||||
import {PromiseWrapper} from '../../facade/async';
|
||||
import {
|
||||
ApplicationRef,
|
||||
ReflectiveInjector,
|
||||
} from '@angular/core';
|
||||
import {workerRenderPlatform} from '../common/worker_render';
|
||||
|
||||
/**
|
||||
* Wrapper class that exposes the Worker
|
||||
|
@ -33,7 +40,7 @@ export class WebWorkerInstance {
|
|||
/**
|
||||
* An array of providers that should be passed into `application()` when initializing a new Worker.
|
||||
*/
|
||||
export const WORKER_RENDER_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = /*@ts2dart_const*/[
|
||||
export const WORKER_RENDER_STATIC_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = /*@ts2dart_const*/[
|
||||
WORKER_RENDER_APPLICATION_COMMON_PROVIDERS, WebWorkerInstance,
|
||||
/*@ts2dart_Provider*/ {
|
||||
provide: APP_INITIALIZER,
|
||||
|
@ -48,6 +55,23 @@ export const WORKER_RENDER_APPLICATION_PROVIDERS: Array<any /*Type | Provider |
|
|||
}
|
||||
];
|
||||
|
||||
export function bootstrapStaticRender(
|
||||
workerScriptUri: string,
|
||||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ApplicationRef> {
|
||||
var app = ReflectiveInjector.resolveAndCreate(
|
||||
[
|
||||
WORKER_RENDER_STATIC_APPLICATION_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: WORKER_SCRIPT, useValue: workerScriptUri},
|
||||
isPresent(customProviders) ? customProviders : []
|
||||
],
|
||||
workerRenderPlatform().injector);
|
||||
// Return a promise so that we keep the same semantics as Dart,
|
||||
// and we might want to wait for the app side to come up
|
||||
// in the future...
|
||||
return PromiseWrapper.resolve(app.get(ApplicationRef));
|
||||
}
|
||||
|
||||
|
||||
function initWebWorkerApplication(injector: Injector): void {
|
||||
var scriptUri: string;
|
||||
try {
|
|
@ -1,35 +0,0 @@
|
|||
export {DomEventsPlugin} from './dom/events/dom_events';
|
||||
export {KeyEventsPlugin} from './dom/events/key_events';
|
||||
|
||||
export {EventManager, EVENT_MANAGER_PLUGINS} from './dom/events/event_manager';
|
||||
export {ELEMENT_PROBE_PROVIDERS} from './dom/debug/ng_probe';
|
||||
export {
|
||||
BROWSER_APP_COMMON_PROVIDERS,
|
||||
BROWSER_SANITIZATION_PROVIDERS,
|
||||
BROWSER_PROVIDERS,
|
||||
By,
|
||||
Title,
|
||||
enableDebugTools,
|
||||
disableDebugTools,
|
||||
HAMMER_GESTURE_CONFIG,
|
||||
HammerGestureConfig
|
||||
} from './browser_common';
|
||||
|
||||
export {DOCUMENT} from './dom/dom_tokens';
|
||||
|
||||
export {
|
||||
DomSanitizationService,
|
||||
SafeHtml,
|
||||
SafeScript,
|
||||
SafeStyle,
|
||||
SafeUrl,
|
||||
SafeResourceUrl,
|
||||
SecurityContext
|
||||
} from './security/dom_sanitization_service';
|
||||
|
||||
export {
|
||||
bootstrapStatic,
|
||||
browserPlatform,
|
||||
BROWSER_APP_STATIC_PROVIDERS,
|
||||
BrowserPlatformLocation
|
||||
} from './platform_browser_static';
|
|
@ -1,223 +0,0 @@
|
|||
library angular2.src.web_workers.debug_tools.multi_client_server_message_bus;
|
||||
|
||||
import 'dart:io';
|
||||
import 'dart:convert' show JSON;
|
||||
import 'dart:async';
|
||||
import 'package:angular2/src/web_workers/shared/messaging_api.dart';
|
||||
import 'package:angular2/src/web_workers/shared/generic_message_bus.dart';
|
||||
|
||||
// TODO(jteplitz602): Remove hard coded result type and
|
||||
// clear messageHistory once app is done with it #3859
|
||||
class MultiClientServerMessageBus extends GenericMessageBus {
|
||||
bool hasPrimary = false;
|
||||
|
||||
@override
|
||||
MultiClientServerMessageBusSink get sink => super.sink;
|
||||
@override
|
||||
MultiClientServerMessageBusSource get source => super.source;
|
||||
|
||||
MultiClientServerMessageBus(MultiClientServerMessageBusSink sink,
|
||||
MultiClientServerMessageBusSource source)
|
||||
: super(sink, source);
|
||||
|
||||
MultiClientServerMessageBus.fromHttpServer(HttpServer server)
|
||||
: super(new MultiClientServerMessageBusSink(),
|
||||
new MultiClientServerMessageBusSource()) {
|
||||
source.onResult.listen(_resultReceived);
|
||||
server.listen((HttpRequest request) {
|
||||
if (request.uri.path == "/ws") {
|
||||
WebSocketTransformer.upgrade(request).then((WebSocket socket) {
|
||||
var wrapper = new WebSocketWrapper(
|
||||
sink.messageHistory, sink.resultMarkers, socket);
|
||||
if (!hasPrimary) {
|
||||
wrapper.setPrimary(true);
|
||||
hasPrimary = true;
|
||||
}
|
||||
sink.addConnection(wrapper);
|
||||
source.addConnection(wrapper);
|
||||
|
||||
wrapper.stream.listen(null, onDone: _handleDisconnect(wrapper));
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _resultReceived(_) {
|
||||
sink.resultReceived();
|
||||
}
|
||||
|
||||
Function _handleDisconnect(WebSocketWrapper wrapper) {
|
||||
return () {
|
||||
sink.removeConnection(wrapper);
|
||||
if (wrapper.isPrimary) {
|
||||
hasPrimary = false;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class WebSocketWrapper {
|
||||
WebSocket _socket;
|
||||
Stream stream;
|
||||
int _numResultsReceived = 0;
|
||||
bool _isPrimary = false;
|
||||
bool caughtUp = false;
|
||||
List<String> _messageHistory;
|
||||
List<int> _resultMarkers;
|
||||
StreamController<String> _sendStream;
|
||||
|
||||
WebSocketWrapper(this._messageHistory, this._resultMarkers, this._socket) {
|
||||
stream = _socket.asBroadcastStream();
|
||||
stream.listen((encodedMessage) {
|
||||
var messages = JSON.decode(encodedMessage);
|
||||
messages.forEach((data) {
|
||||
var message = data['message'];
|
||||
if (message is Map && message.containsKey("type")) {
|
||||
if (message['type'] == 'result') {
|
||||
resultReceived();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
_sendStream = new StreamController<String>();
|
||||
_socket.addStream(_sendStream.stream);
|
||||
}
|
||||
|
||||
void send(String data) {
|
||||
_sendStream.add(data);
|
||||
}
|
||||
|
||||
bool get isPrimary => _isPrimary;
|
||||
|
||||
void resultReceived() {
|
||||
if (!isPrimary && !caughtUp) {
|
||||
_numResultsReceived++;
|
||||
sendToMarker(_numResultsReceived);
|
||||
}
|
||||
}
|
||||
|
||||
void setPrimary(bool primary) {
|
||||
_isPrimary = primary;
|
||||
if (primary) {
|
||||
caughtUp = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Sends up to the given result marker
|
||||
void sendToMarker(int markerIndex) {
|
||||
int numMessages;
|
||||
int curr;
|
||||
if (markerIndex >= _resultMarkers.length) {
|
||||
// we're past the final result marker so send all messages in history
|
||||
curr = (_resultMarkers.length > 0)
|
||||
? _resultMarkers[_resultMarkers.length - 1]
|
||||
: 0;
|
||||
numMessages = _messageHistory.length - curr;
|
||||
caughtUp = true;
|
||||
} else {
|
||||
curr = (markerIndex == 0) ? 0 : _resultMarkers[markerIndex - 1];
|
||||
var end = _resultMarkers[markerIndex];
|
||||
numMessages = end - curr;
|
||||
}
|
||||
while (numMessages > 0) {
|
||||
send(_messageHistory[curr]);
|
||||
curr++;
|
||||
numMessages--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MultiClientServerMessageBusSink extends GenericMessageBusSink {
|
||||
final List<String> messageHistory = new List<String>();
|
||||
final Set<WebSocketWrapper> openConnections = new Set<WebSocketWrapper>();
|
||||
final List<int> resultMarkers = new List<int>();
|
||||
|
||||
void resultReceived() {
|
||||
resultMarkers.add(messageHistory.length);
|
||||
}
|
||||
|
||||
void addConnection(WebSocketWrapper webSocket) {
|
||||
openConnections.add(webSocket);
|
||||
// send messages up to the first result marker to this socket
|
||||
webSocket.sendToMarker(0);
|
||||
}
|
||||
|
||||
void removeConnection(WebSocketWrapper webSocket) {
|
||||
openConnections.remove(webSocket);
|
||||
}
|
||||
|
||||
@override
|
||||
void sendMessages(List<dynamic> messages) {
|
||||
String encodedMessages = JSON.encode(messages);
|
||||
openConnections.forEach((WebSocketWrapper webSocket) {
|
||||
if (webSocket.caughtUp) {
|
||||
webSocket.send(encodedMessages);
|
||||
}
|
||||
});
|
||||
messageHistory.add(encodedMessages);
|
||||
}
|
||||
}
|
||||
|
||||
class MultiClientServerMessageBusSource extends GenericMessageBusSource {
|
||||
Function onResultReceived;
|
||||
final StreamController mainController;
|
||||
final StreamController resultController = new StreamController();
|
||||
|
||||
MultiClientServerMessageBusSource._(controller)
|
||||
: mainController = controller,
|
||||
super(controller.stream);
|
||||
|
||||
factory MultiClientServerMessageBusSource() {
|
||||
return new MultiClientServerMessageBusSource._(
|
||||
new StreamController.broadcast());
|
||||
}
|
||||
|
||||
Stream get onResult => resultController.stream;
|
||||
|
||||
void addConnection(WebSocketWrapper webSocket) {
|
||||
if (webSocket.isPrimary) {
|
||||
webSocket.stream.listen((encodedMessages) {
|
||||
var decodedMessages = _decodeMessages(encodedMessages);
|
||||
decodedMessages.forEach((decodedMessage) {
|
||||
var message = decodedMessage['message'];
|
||||
if (message is Map && message.containsKey("type")) {
|
||||
if (message['type'] == 'result') {
|
||||
// tell the bus that a result was received on the primary
|
||||
resultController.add(message);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mainController.add(decodedMessages);
|
||||
});
|
||||
} else {
|
||||
webSocket.stream.listen((encodedMessages) {
|
||||
// handle events from non-primary connection.
|
||||
var decodedMessages = _decodeMessages(encodedMessages);
|
||||
var eventMessages = new List<Map<String, dynamic>>();
|
||||
decodedMessages.forEach((decodedMessage) {
|
||||
var channel = decodedMessage['channel'];
|
||||
if (channel == EVENT_CHANNEL) {
|
||||
eventMessages.add(decodedMessage);
|
||||
}
|
||||
});
|
||||
if (eventMessages.length > 0) {
|
||||
mainController.add(eventMessages);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
List<dynamic> _decodeMessages(dynamic messages) {
|
||||
return JSON.decode(messages);
|
||||
}
|
||||
|
||||
// This is a noop for the MultiClientBus because it has to decode the JSON messages before
|
||||
// the generic bus receives them in order to check for results and forward events
|
||||
// from the non-primary connection.
|
||||
@override
|
||||
List<dynamic> decodeMessages(dynamic messages) {
|
||||
return messages;
|
||||
}
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
library angular2.src.web_workers.debug_tools.single_client_server_message_bus;
|
||||
|
||||
import 'dart:io';
|
||||
import 'dart:convert' show JSON;
|
||||
import 'package:angular2/src/web_workers/shared/generic_message_bus.dart';
|
||||
|
||||
class SingleClientServerMessageBus extends GenericMessageBus {
|
||||
bool connected = false;
|
||||
|
||||
@override
|
||||
SingleClientServerMessageBusSink get sink => super.sink;
|
||||
@override
|
||||
SingleClientServerMessageBusSource get source => super.source;
|
||||
|
||||
SingleClientServerMessageBus(SingleClientServerMessageBusSink sink,
|
||||
SingleClientServerMessageBusSource source)
|
||||
: super(sink, source);
|
||||
|
||||
SingleClientServerMessageBus.fromHttpServer(HttpServer server)
|
||||
: super(new SingleClientServerMessageBusSink(),
|
||||
new SingleClientServerMessageBusSource()) {
|
||||
server.listen((HttpRequest request) {
|
||||
if (request.uri.path == "/ws") {
|
||||
if (!connected) {
|
||||
WebSocketTransformer.upgrade(request).then((WebSocket socket) {
|
||||
sink.setConnection(socket);
|
||||
|
||||
var stream = socket.asBroadcastStream();
|
||||
source.attachTo(stream);
|
||||
stream.listen(null, onDone: _handleDisconnect);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
connected = false;
|
||||
});
|
||||
connected = true;
|
||||
} else {
|
||||
// refuse additional clients
|
||||
request.response.statusCode = HttpStatus.SERVICE_UNAVAILABLE;
|
||||
request.response.write("Maximum number of clients connected.");
|
||||
request.response.close();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _handleDisconnect() {
|
||||
sink.removeConnection();
|
||||
connected = false;
|
||||
}
|
||||
}
|
||||
|
||||
class SingleClientServerMessageBusSink extends GenericMessageBusSink {
|
||||
final List<String> _messageBuffer = new List<String>();
|
||||
WebSocket _socket = null;
|
||||
|
||||
void setConnection(WebSocket webSocket) {
|
||||
_socket = webSocket;
|
||||
_sendBufferedMessages();
|
||||
}
|
||||
|
||||
void removeConnection() {
|
||||
_socket = null;
|
||||
}
|
||||
|
||||
@override
|
||||
void sendMessages(List<dynamic> message) {
|
||||
String encodedMessages = JSON.encode(message);
|
||||
if (_socket != null) {
|
||||
_socket.add(encodedMessages);
|
||||
} else {
|
||||
_messageBuffer.add(encodedMessages);
|
||||
}
|
||||
}
|
||||
|
||||
void _sendBufferedMessages() {
|
||||
_messageBuffer.forEach((message) => _socket.add(message));
|
||||
_messageBuffer.clear();
|
||||
}
|
||||
}
|
||||
|
||||
class SingleClientServerMessageBusSource extends GenericMessageBusSource {
|
||||
SingleClientServerMessageBusSource() : super(null);
|
||||
|
||||
@override
|
||||
List<dynamic> decodeMessages(dynamic messages) {
|
||||
return JSON.decode(messages);
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
library angular2.src.web_workers.worker.web_socket_message_bus;
|
||||
|
||||
import 'dart:html';
|
||||
import 'dart:convert' show JSON;
|
||||
import 'package:angular2/src/web_workers/shared/generic_message_bus.dart';
|
||||
|
||||
class WebSocketMessageBus extends GenericMessageBus {
|
||||
WebSocketMessageBus(
|
||||
WebSocketMessageBusSink sink, WebSocketMessageBusSource source)
|
||||
: super(sink, source);
|
||||
|
||||
WebSocketMessageBus.fromWebSocket(WebSocket webSocket)
|
||||
: super(new WebSocketMessageBusSink(webSocket),
|
||||
new WebSocketMessageBusSource(webSocket));
|
||||
}
|
||||
|
||||
class WebSocketMessageBusSink extends GenericMessageBusSink {
|
||||
final WebSocket _webSocket;
|
||||
|
||||
WebSocketMessageBusSink(this._webSocket);
|
||||
|
||||
void sendMessages(List<dynamic> messages) {
|
||||
_webSocket.send(JSON.encode(messages));
|
||||
}
|
||||
}
|
||||
|
||||
class WebSocketMessageBusSource extends GenericMessageBusSource {
|
||||
WebSocketMessageBusSource(WebSocket webSocket) : super(webSocket.onMessage);
|
||||
|
||||
List<dynamic> decodeMessages(MessageEvent event) {
|
||||
var messages = event.data;
|
||||
return JSON.decode(messages);
|
||||
}
|
||||
}
|
|
@ -1,156 +0,0 @@
|
|||
library angular2.src.web_workers.shared.generic_message_bus;
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:angular2/src/facade/async.dart' show EventEmitter;
|
||||
import 'package:angular2/src/web_workers/shared/message_bus.dart'
|
||||
show MessageBus, MessageBusSink, MessageBusSource;
|
||||
import 'package:angular2/src/core/zone/ng_zone.dart';
|
||||
import 'package:angular2/src/facade/lang.dart';
|
||||
import 'package:angular2/src/facade/exceptions.dart';
|
||||
|
||||
class GenericMessageBus implements MessageBus {
|
||||
final MessageBusSink _sink;
|
||||
final MessageBusSource _source;
|
||||
|
||||
MessageBusSink get sink => _sink;
|
||||
MessageBusSource get source => _source;
|
||||
|
||||
GenericMessageBus(MessageBusSink sink, MessageBusSource source)
|
||||
: _sink = sink,
|
||||
_source = source;
|
||||
|
||||
void attachToZone(NgZone zone) {
|
||||
_sink.attachToZone(zone);
|
||||
_source.attachToZone(zone);
|
||||
}
|
||||
|
||||
void initChannel(String channel, [bool runInZone = true]) {
|
||||
_sink.initChannel(channel, runInZone);
|
||||
_source.initChannel(channel, runInZone);
|
||||
}
|
||||
|
||||
EventEmitter from(String channel) {
|
||||
return _source.from(channel);
|
||||
}
|
||||
|
||||
EventEmitter to(String channel) {
|
||||
return _sink.to(channel);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class GenericMessageBusSink implements MessageBusSink {
|
||||
NgZone _zone;
|
||||
final _channels = new Map<String, _Channel>();
|
||||
final _messageBuffer = new List<dynamic>();
|
||||
|
||||
void attachToZone(NgZone zone) {
|
||||
_zone = zone;
|
||||
_zone.runOutsideAngular(() {
|
||||
_zone.onStable.listen((_) {
|
||||
if (_messageBuffer.length > 0) {
|
||||
sendMessages(_messageBuffer);
|
||||
_messageBuffer.clear();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void initChannel(String channelName, [bool runInZone = true]) {
|
||||
if (_channels.containsKey(channelName)) {
|
||||
throw new BaseException("${channelName} has already been initialized.");
|
||||
}
|
||||
|
||||
var emitter = new EventEmitter();
|
||||
var channel = new _Channel(emitter, runInZone);
|
||||
|
||||
emitter.listen((data) {
|
||||
var message = {'channel': channelName, 'message': data};
|
||||
if (runInZone) {
|
||||
_messageBuffer.add(message);
|
||||
} else {
|
||||
sendMessages([message]);
|
||||
}
|
||||
});
|
||||
|
||||
_channels[channelName] = channel;
|
||||
}
|
||||
|
||||
EventEmitter to(String channelName) {
|
||||
if (_channels.containsKey(channelName)) {
|
||||
return _channels[channelName].emitter;
|
||||
} else {
|
||||
throw new BaseException(
|
||||
"${channelName} is not set up. Did you forget to call initChannel?");
|
||||
}
|
||||
}
|
||||
|
||||
void sendMessages(List<dynamic> messages);
|
||||
}
|
||||
|
||||
abstract class GenericMessageBusSource implements MessageBusSource {
|
||||
Stream _stream;
|
||||
final _channels = new Map<String, _Channel>();
|
||||
NgZone _zone;
|
||||
|
||||
Stream get stream => _stream;
|
||||
|
||||
GenericMessageBusSource(Stream stream) {
|
||||
attachTo(stream);
|
||||
}
|
||||
|
||||
void attachTo(Stream stream) {
|
||||
_stream = stream;
|
||||
if (stream != null) {
|
||||
stream.listen((messages) {
|
||||
List<dynamic> decodedMessages = decodeMessages(messages);
|
||||
if (decodedMessages != null) {
|
||||
decodedMessages.forEach((message) => _handleMessage(message));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void attachToZone(NgZone zone) {
|
||||
_zone = zone;
|
||||
}
|
||||
|
||||
void initChannel(String channelName, [bool runInZone = true]) {
|
||||
if (_channels.containsKey(channelName)) {
|
||||
throw new BaseException("${channelName} has already been initialized.");
|
||||
}
|
||||
|
||||
var emitter = new EventEmitter();
|
||||
var channelInfo = new _Channel(emitter, runInZone);
|
||||
_channels[channelName] = channelInfo;
|
||||
}
|
||||
|
||||
EventEmitter from(String channelName) {
|
||||
if (_channels.containsKey(channelName)) {
|
||||
return _channels[channelName].emitter;
|
||||
} else {
|
||||
throw new BaseException(
|
||||
"${channelName} is not set up. Did you forget to call initChannel?");
|
||||
}
|
||||
}
|
||||
|
||||
void _handleMessage(dynamic data) {
|
||||
var channelName = data['channel'];
|
||||
if (_channels.containsKey(channelName)) {
|
||||
var channelInfo = _channels[channelName];
|
||||
if (channelInfo.runInZone) {
|
||||
_zone.run(() => channelInfo.emitter.add(data['message']));
|
||||
} else {
|
||||
channelInfo.emitter.add(data['message']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<dynamic> decodeMessages(dynamic message);
|
||||
}
|
||||
|
||||
class _Channel {
|
||||
EventEmitter emitter;
|
||||
bool runInZone;
|
||||
|
||||
_Channel(this.emitter, this.runInZone);
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
library angular2.src.web_workers.shared.isolate_message_bus;
|
||||
|
||||
import 'dart:isolate';
|
||||
import 'package:angular2/src/web_workers/shared/generic_message_bus.dart';
|
||||
|
||||
class IsolateMessageBus extends GenericMessageBus {
|
||||
IsolateMessageBus(IsolateMessageBusSink sink, IsolateMessageBusSource source)
|
||||
: super(sink, source);
|
||||
}
|
||||
|
||||
class IsolateMessageBusSink extends GenericMessageBusSink {
|
||||
final SendPort _port;
|
||||
|
||||
IsolateMessageBusSink(SendPort port) : _port = port;
|
||||
|
||||
@override
|
||||
void sendMessages(List<dynamic> messages) {
|
||||
_port.send(messages);
|
||||
}
|
||||
}
|
||||
|
||||
class IsolateMessageBusSource extends GenericMessageBusSource {
|
||||
IsolateMessageBusSource(ReceivePort port) : super(port.asBroadcastStream());
|
||||
|
||||
@override
|
||||
List<dynamic> decodeMessages(dynamic messages) {
|
||||
if (messages is SendPort) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
}
|
|
@ -5,3 +5,4 @@
|
|||
export const RENDERER_CHANNEL = "ng-Renderer";
|
||||
export const EVENT_CHANNEL = "ng-Events";
|
||||
export const ROUTER_CHANNEL = "ng-Router";
|
||||
export const XHR_CHANNEL = "ng-XHR";
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
// PostMessageBus can't be implemented in dart since dart doesn't use postMessage
|
||||
// This file is only here to prevent ts2dart from trying to transpile the PostMessageBus
|
||||
library angular2.src.web_workers.shared.post_message_bus;
|
|
@ -1,108 +0,0 @@
|
|||
library angular2.src.web_workers.event_serializer;
|
||||
|
||||
import 'dart:core';
|
||||
import 'dart:html';
|
||||
|
||||
// List of all elements with HTML value attribute.
|
||||
// Taken from: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes
|
||||
final Set<String> NODES_WITH_VALUE = new Set<String>.from([
|
||||
"input",
|
||||
"select",
|
||||
"option",
|
||||
"button",
|
||||
"li",
|
||||
"meter",
|
||||
"progress",
|
||||
"param",
|
||||
"textarea"
|
||||
]);
|
||||
|
||||
Map<String, dynamic> serializeGenericEvent(dynamic e) {
|
||||
var serialized = new Map<String, dynamic>();
|
||||
serialized['bubbles'] = e.bubbles;
|
||||
serialized['cancelable'] = e.cancelable;
|
||||
serialized['defaultPrevented'] = e.defaultPrevented;
|
||||
serialized['eventPhase'] = e.eventPhase;
|
||||
serialized['timeStamp'] = e.timeStamp;
|
||||
serialized['type'] = e.type;
|
||||
return serialized;
|
||||
}
|
||||
|
||||
// TODO(jteplitz602): Allow users to specify the properties they need rather than always
|
||||
// adding value #3374
|
||||
Map<String, dynamic> serializeEventWithTarget(dynamic e) {
|
||||
var serializedEvent = serializeGenericEvent(e);
|
||||
return addTarget(e, serializedEvent);
|
||||
}
|
||||
|
||||
Map<String, dynamic> serializeMouseEvent(dynamic e) {
|
||||
var serialized = new Map<String, dynamic>();
|
||||
serialized['altKey'] = e.altKey;
|
||||
serialized['bubbles'] = e.bubbles;
|
||||
serialized['button'] = e.button;
|
||||
serialized['cancelable'] = e.cancelable;
|
||||
serialized['client'] = serializePoint(e.client);
|
||||
serialized['ctrlKey'] = e.ctrlKey;
|
||||
serialized['defaultPrevented'] = e.defaultPrevented;
|
||||
serialized['detail'] = e.detail;
|
||||
serialized['eventPhase'] = e.eventPhase;
|
||||
serialized['layer'] = serializePoint(e.layer);
|
||||
serialized['metaKey'] = e.metaKey;
|
||||
serialized['offset'] = serializePoint(e.offset);
|
||||
serialized['page'] = serializePoint(e.page);
|
||||
serialized['region'] = e.region;
|
||||
serialized['screen'] = serializePoint(e.screen);
|
||||
serialized['shiftKey'] = e.shiftKey;
|
||||
serialized['timeStamp'] = e.timeStamp;
|
||||
serialized['type'] = e.type;
|
||||
return serialized;
|
||||
}
|
||||
|
||||
Map<String, dynamic> serializePoint(Point point) {
|
||||
var serialized = new Map<String, dynamic>();
|
||||
serialized['magnitude'] = point.magnitude;
|
||||
serialized['x'] = point.x;
|
||||
serialized['y'] = point.y;
|
||||
return serialized;
|
||||
}
|
||||
|
||||
Map<String, dynamic> serializeKeyboardEvent(dynamic e) {
|
||||
var serialized = new Map<String, dynamic>();
|
||||
serialized['altKey'] = e.altKey;
|
||||
serialized['bubbles'] = e.bubbles;
|
||||
serialized['cancelable'] = e.cancelable;
|
||||
serialized['charCode'] = e.charCode;
|
||||
serialized['ctrlKey'] = e.ctrlKey;
|
||||
serialized['defaultPrevented'] = e.defaultPrevented;
|
||||
serialized['detail'] = e.detail;
|
||||
serialized['eventPhase'] = e.eventPhase;
|
||||
serialized['keyCode'] = e.keyCode;
|
||||
serialized['keyLocation'] = e.keyLocation;
|
||||
serialized['location'] = e.location;
|
||||
serialized['repeat'] = e.repeat;
|
||||
serialized['shiftKey'] = e.shiftKey;
|
||||
serialized['timeStamp'] = e.timeStamp;
|
||||
serialized['type'] = e.type;
|
||||
//return addTarget(e, serialized);
|
||||
return serialized;
|
||||
}
|
||||
|
||||
Map<String, dynamic> serializeTransitionEvent(dynamic e) {
|
||||
var serialized = serializeGenericEvent(e);
|
||||
serialized['propertyName'] = e.propertyName;
|
||||
serialized['elapsedTime'] = e.elapsedTime;
|
||||
serialized['pseudoElement'] = e.pseudoElement;
|
||||
return addTarget(e, serialized);
|
||||
}
|
||||
|
||||
// TODO(jteplitz602): #3374. See above.
|
||||
Map<String, dynamic> addTarget(
|
||||
dynamic e, Map<String, dynamic> serializedEvent) {
|
||||
if (NODES_WITH_VALUE.contains(e.target.tagName.toLowerCase())) {
|
||||
serializedEvent['target'] = {'value': e.target.value};
|
||||
if (e.target is InputElement) {
|
||||
serializedEvent['target']['files'] = e.target.files;
|
||||
}
|
||||
}
|
||||
return serializedEvent;
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import {Injectable} from '@angular/core';
|
||||
import {PRIMITIVE, ServiceMessageBrokerFactory} from '@angular/platform-browser';
|
||||
import {PRIMITIVE} from '../shared/serializer';
|
||||
import {ServiceMessageBrokerFactory} from '../shared/service_message_broker';
|
||||
import {XHR_CHANNEL} from '../shared/messaging_api';
|
||||
import {XHR} from '@angular/compiler';
|
||||
import {FunctionWrapper} from '../../facade/lang';
|
|
@ -1,73 +0,0 @@
|
|||
library angular2.src.web_workers.worker.event_deserializer;
|
||||
|
||||
class GenericEvent {
|
||||
Map<String, dynamic> properties;
|
||||
EventTarget _target = null;
|
||||
|
||||
GenericEvent(this.properties);
|
||||
|
||||
bool get bubbles => properties['bubbles'];
|
||||
bool get cancelable => properties['cancelable'];
|
||||
bool get defaultPrevented => properties['defaultPrevented'];
|
||||
int get eventPhase => properties['eventPhase'];
|
||||
int get timeStamp => properties['timeStamp'];
|
||||
String get type => properties['type'];
|
||||
bool get altKey => properties['altKey'];
|
||||
|
||||
int get charCode => properties['charCode'];
|
||||
bool get ctrlKey => properties['ctrlKey'];
|
||||
int get detail => properties['detail'];
|
||||
int get keyCode => properties['keyCode'];
|
||||
int get keyLocation => properties['keyLocation'];
|
||||
Point get layer => _getPoint('layer');
|
||||
int get location => properties['location'];
|
||||
bool get repeat => properties['repeat'];
|
||||
bool get shiftKey => properties['shiftKey'];
|
||||
|
||||
int get button => properties['button'];
|
||||
Point get client => _getPoint('client');
|
||||
bool get metaKey => properties['metaKey'];
|
||||
Point get offset => _getPoint('offset');
|
||||
Point get page => _getPoint('page');
|
||||
Point get screen => _getPoint('screen');
|
||||
|
||||
String get propertyName => properties['propertyName'];
|
||||
num get elapsedTime => properties['elapsedTime'];
|
||||
String get pseudoElement => properties['pseudoElement'];
|
||||
|
||||
EventTarget get target {
|
||||
if (_target != null) {
|
||||
return _target;
|
||||
} else if (properties.containsKey("target")) {
|
||||
_target = new EventTarget(properties['target']);
|
||||
return _target;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
dynamic _getPoint(name) {
|
||||
Map<String, dynamic> point = properties[name];
|
||||
return new Point(point['x'], point['y'], point['magnitude']);
|
||||
}
|
||||
}
|
||||
|
||||
class EventTarget {
|
||||
dynamic value;
|
||||
|
||||
EventTarget(Map<String, dynamic> properties) {
|
||||
value = properties['value'];
|
||||
}
|
||||
}
|
||||
|
||||
class Point {
|
||||
int x;
|
||||
int y;
|
||||
double magnitude;
|
||||
|
||||
Point(this.x, this.y, this.magnitude);
|
||||
}
|
||||
|
||||
GenericEvent deserializeGenericEvent(Map<String, dynamic> serializedEvent) {
|
||||
return new GenericEvent(serializedEvent);
|
||||
}
|
|
@ -1,390 +0,0 @@
|
|||
library angular2.dom.webWorkerAdapter;
|
||||
|
||||
import 'abstract_html_adapter.dart';
|
||||
import 'package:angular2/platform/common_dom.dart';
|
||||
|
||||
/**
|
||||
* This adapter is required to log error messages.
|
||||
*
|
||||
* Note: other methods all throw as the DOM is not accessible directly
|
||||
* in web worker context.
|
||||
*/
|
||||
class WebWorkerDomAdapter implements DomAdapter {
|
||||
static void makeCurrent() {
|
||||
setRootDomAdapter(new WebWorkerDomAdapter());
|
||||
}
|
||||
|
||||
logError(error) {
|
||||
print('${error}');
|
||||
}
|
||||
|
||||
log(error) {
|
||||
print('${error}');
|
||||
}
|
||||
|
||||
logGroup(error) {
|
||||
print('${error}');
|
||||
}
|
||||
|
||||
logGroupEnd() {}
|
||||
|
||||
hasProperty(element, String name) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
void setProperty(Element element, String name, Object value) =>
|
||||
throw 'not implemented';
|
||||
|
||||
getProperty(Element element, String name) => throw 'not implemented';
|
||||
|
||||
invoke(Element element, String methodName, List args) =>
|
||||
throw 'not implemented';
|
||||
|
||||
get attrToPropMap => throw 'not implemented';
|
||||
|
||||
set attrToPropMap(value) {
|
||||
throw 'readonly';
|
||||
}
|
||||
|
||||
getGlobalEventTarget(String target) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getTitle() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setTitle(String newTitle) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
String getEventKey(event) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
void replaceChild(el, newNode, oldNode) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
dynamic getBoundingClientRect(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
Type getXHR() => throw 'not implemented';
|
||||
|
||||
Element parse(String templateHtml) => throw 'not implemented';
|
||||
query(selector) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
querySelector(el, String selector) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
List querySelectorAll(el, String selector) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
on(el, evt, listener) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
Function onAndCancel(el, evt, listener) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
dispatchEvent(el, evt) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createMouseEvent(eventType) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createEvent(eventType) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
preventDefault(evt) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
isPrevented(evt) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getInnerHTML(el) => throw 'not implemented';
|
||||
|
||||
getOuterHTML(el) => throw 'not implemented';
|
||||
|
||||
String nodeName(node) => throw 'not implemented';
|
||||
|
||||
String nodeValue(node) => throw 'not implemented';
|
||||
|
||||
String type(node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
content(node) => throw 'not implemented';
|
||||
|
||||
firstChild(el) => throw 'not implemented';
|
||||
|
||||
nextSibling(el) => throw 'not implemented';
|
||||
|
||||
parentElement(el) => throw 'not implemented';
|
||||
|
||||
List childNodes(el) => throw 'not implemented';
|
||||
List childNodesAsList(el) => throw 'not implemented';
|
||||
clearNodes(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
appendChild(el, node) => throw 'not implemented';
|
||||
removeChild(el, node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
remove(el) => throw 'not implemented';
|
||||
insertBefore(el, node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
insertAllBefore(el, nodes) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
insertAfter(el, node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setInnerHTML(el, value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getText(el) => throw 'not implemented';
|
||||
|
||||
setText(el, String value) => throw 'not implemented';
|
||||
|
||||
getValue(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setValue(el, String value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getChecked(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setChecked(el, bool value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createComment(String text) => throw 'not implemented';
|
||||
createTemplate(String html) => throw 'not implemented';
|
||||
createElement(tagName, [doc]) => throw 'not implemented';
|
||||
|
||||
createElementNS(ns, tagName, [doc]) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createTextNode(String text, [doc]) => throw 'not implemented';
|
||||
|
||||
createScriptTag(String attrName, String attrValue, [doc]) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createStyleElement(String css, [doc]) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
createShadowRoot(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getShadowRoot(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getHost(el) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
clone(node) => throw 'not implemented';
|
||||
getElementsByClassName(element, String name) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getElementsByTagName(element, String name) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
List classList(element) => throw 'not implemented';
|
||||
|
||||
addClass(element, String className) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
removeClass(element, String className) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
hasClass(element, String className) => throw 'not implemented';
|
||||
|
||||
setStyle(element, String styleName, String styleValue) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
bool hasStyle(Element element, String styleName, [String styleValue]) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
removeStyle(element, String styleName) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getStyle(element, String styleName) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
String tagName(element) => throw 'not implemented';
|
||||
|
||||
attributeMap(element) => throw 'not implemented';
|
||||
|
||||
hasAttribute(element, String attribute) => throw 'not implemented';
|
||||
|
||||
hasAttributeNS(element, String ns, String attribute) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getAttribute(element, String attribute) => throw 'not implemented';
|
||||
|
||||
getAttributeNS(element, String ns, String attribute) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setAttribute(element, String name, String value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
setAttributeNS(element, String ns, String name, String value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
removeAttribute(element, String attribute) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
removeAttributeNS(element, String ns, String attribute) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
templateAwareRoot(el) => throw 'not implemented';
|
||||
|
||||
createHtmlDocument() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
defaultDoc() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
bool elementMatches(n, String selector) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
bool isTemplateElement(Element el) => throw 'not implemented';
|
||||
|
||||
bool isTextNode(node) => throw 'not implemented';
|
||||
bool isCommentNode(node) => throw 'not implemented';
|
||||
|
||||
bool isElementNode(node) => throw 'not implemented';
|
||||
|
||||
bool hasShadowRoot(node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
bool isShadowRoot(node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
importIntoDoc(node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
adoptNode(node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
String getHref(element) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
void resolveAndSetHref(element, baseUrl, href) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
List getDistributedNodes(Node) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
bool supportsDOMEvents() => throw 'not implemented';
|
||||
|
||||
bool supportsNativeShadowDOM() => throw 'not implemented';
|
||||
|
||||
getHistory() => throw 'not implemented';
|
||||
|
||||
getLocation() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getBaseHref() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
resetBaseElement() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
String getUserAgent() => throw 'not implemented';
|
||||
|
||||
void setData(Element element, String name, String value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getComputedStyle(element) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
String getData(Element element, String name) => throw 'not implemented';
|
||||
|
||||
// TODO(tbosch): move this into a separate environment class once we have it
|
||||
setGlobalVar(String name, value) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
requestAnimationFrame(callback) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
cancelAnimationFrame(id) {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
performanceNow() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getAnimationPrefix() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
getTransitionEnd() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
|
||||
supportsAnimation() {
|
||||
throw 'not implemented';
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@ import {
|
|||
UiArguments,
|
||||
ClientMessageBroker,
|
||||
ClientMessageBrokerFactory
|
||||
} from '@angular/platform-browser';
|
||||
} from '../shared/client_message_broker';
|
||||
import {XHR_CHANNEL} from '../shared/messaging_api';
|
||||
|
||||
/**
|
|
@ -1,37 +0,0 @@
|
|||
library angular2.src.platform.worker_app;
|
||||
|
||||
import 'package:angular2/src/core/zone/ng_zone.dart';
|
||||
import 'package:angular2/src/platform/server/webworker_adapter.dart';
|
||||
import 'package:angular2/src/platform/worker_app_common.dart';
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/web_workers/shared/isolate_message_bus.dart';
|
||||
import 'package:angular2/src/web_workers/shared/message_bus.dart';
|
||||
import 'dart:isolate';
|
||||
|
||||
const OpaqueToken RENDER_SEND_PORT = const OpaqueToken("RenderSendPort");
|
||||
|
||||
const List<dynamic> WORKER_APP_APPLICATION_PROVIDERS = const [
|
||||
WORKER_APP_APPLICATION_COMMON,
|
||||
const Provider(MessageBus,
|
||||
useFactory: createMessageBus, deps: const [NgZone, RENDER_SEND_PORT]),
|
||||
const Provider(APP_INITIALIZER, useValue: setupIsolate, multi: true)
|
||||
];
|
||||
|
||||
MessageBus createMessageBus(NgZone zone, SendPort replyTo) {
|
||||
ReceivePort rPort = new ReceivePort();
|
||||
var sink = new WebWorkerMessageBusSink(replyTo, rPort);
|
||||
var source = new IsolateMessageBusSource(rPort);
|
||||
var bus = new IsolateMessageBus(sink, source);
|
||||
bus.attachToZone(zone);
|
||||
return bus;
|
||||
}
|
||||
|
||||
setupIsolate() {
|
||||
WebWorkerDomAdapter.makeCurrent();
|
||||
}
|
||||
|
||||
class WebWorkerMessageBusSink extends IsolateMessageBusSink {
|
||||
WebWorkerMessageBusSink(SendPort sPort, ReceivePort rPort) : super(sPort) {
|
||||
sPort.send(rPort.sendPort);
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
import {APP_INITIALIZER, NgZone} from '@angular/core';
|
||||
import {WorkerDomAdapter} from '../web_workers/worker/worker_adapter';
|
||||
import {
|
||||
PostMessageBus,
|
||||
PostMessageBusSink,
|
||||
PostMessageBusSource
|
||||
} from '../web_workers/shared/post_message_bus';
|
||||
import {WORKER_APP_APPLICATION_COMMON_PROVIDERS} from './worker_app_common';
|
||||
import {MessageBus} from '../web_workers/shared/message_bus';
|
||||
|
||||
// TODO(jteplitz602) remove this and compile with lib.webworker.d.ts (#3492)
|
||||
let _postMessage = {
|
||||
postMessage: (message: any, transferrables?:[ArrayBuffer]) => {
|
||||
(<any>postMessage)(message, transferrables);
|
||||
}
|
||||
};
|
||||
|
||||
export const WORKER_APP_APPLICATION_PROVIDERS: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_APP_APPLICATION_COMMON_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: MessageBus, useFactory: createMessageBus, deps: [NgZone]},
|
||||
/* @ts2dart_Provider */ {provide: APP_INITIALIZER, useValue: setupWebWorker, multi: true}
|
||||
];
|
||||
|
||||
function createMessageBus(zone: NgZone): MessageBus {
|
||||
let sink = new PostMessageBusSink(_postMessage);
|
||||
let source = new PostMessageBusSource();
|
||||
let bus = new PostMessageBus(sink, source);
|
||||
bus.attachToZone(zone);
|
||||
return bus;
|
||||
}
|
||||
|
||||
function setupWebWorker(): void {
|
||||
WorkerDomAdapter.makeCurrent();
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
library angular2.src.platform.worker_render;
|
||||
|
||||
import 'package:angular2/src/platform/worker_render_common.dart'
|
||||
show
|
||||
WORKER_RENDER_APPLICATION_COMMON_PROVIDERS,
|
||||
WORKER_RENDER_MESSAGING_PROVIDERS,
|
||||
WORKER_SCRIPT,
|
||||
initializeGenericWorkerRenderer;
|
||||
import 'package:angular2/src/web_workers/shared/isolate_message_bus.dart';
|
||||
import 'package:angular2/src/web_workers/shared/message_bus.dart';
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/core/di.dart';
|
||||
import 'dart:isolate';
|
||||
import 'dart:async';
|
||||
|
||||
const WORKER_RENDER_APP_PROVIDERS = WORKER_RENDER_APPLICATION_COMMON_PROVIDERS;
|
||||
|
||||
Future<List> initIsolate(String scriptUri) async {
|
||||
var instance = await spawnIsolate(Uri.parse(scriptUri));
|
||||
|
||||
return [
|
||||
WORKER_RENDER_APPLICATION_COMMON,
|
||||
new Provider(WebWorkerInstance, useValue: instance),
|
||||
new Provider(APP_INITIALIZER,
|
||||
useFactory: (injector) => () => initializeGenericWorkerRenderer(injector),
|
||||
multi: true,
|
||||
deps: [Injector]),
|
||||
new Provider(MessageBus, useValue: instance.bus)
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawns a new class and initializes the WebWorkerInstance
|
||||
*/
|
||||
Future<WebWorkerInstance> spawnIsolate(Uri uri) async {
|
||||
var receivePort = new ReceivePort();
|
||||
var isolateEndSendPort = receivePort.sendPort;
|
||||
var isolate = await Isolate.spawnUri(uri, const [], isolateEndSendPort);
|
||||
var source = new UIMessageBusSource(receivePort);
|
||||
var sendPort = await source.sink;
|
||||
var sink = new IsolateMessageBusSink(sendPort);
|
||||
var bus = new IsolateMessageBus(sink, source);
|
||||
|
||||
return new WebWorkerInstance(isolate, bus);
|
||||
}
|
||||
|
||||
class UIMessageBusSource extends IsolateMessageBusSource {
|
||||
UIMessageBusSource(ReceivePort port) : super(port);
|
||||
|
||||
Future<SendPort> get sink => stream.firstWhere((message) {
|
||||
return message is SendPort;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper class that exposes the Isolate
|
||||
* and underlying {@link MessageBus} for lower level message passing.
|
||||
*/
|
||||
class WebWorkerInstance {
|
||||
Isolate worker;
|
||||
MessageBus bus;
|
||||
|
||||
WebWorkerInstance(this.worker, this.bus);
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
library angular2.platform.worker_app;
|
||||
|
||||
import "package:angular2/src/platform/worker_app_common.dart";
|
||||
import "package:angular2/src/platform/worker_app.dart";
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/facade/lang.dart';
|
||||
import 'dart:isolate';
|
||||
import 'dart:async';
|
||||
|
||||
export "package:angular2/src/platform/worker_app_common.dart"
|
||||
show WORKER_APP_PLATFORM_PROVIDERS, WORKER_APP_APPLICATION_COMMON_PROVIDERS;
|
||||
export "package:angular2/src/core/angular_entrypoint.dart"
|
||||
show AngularEntrypoint;
|
||||
export "package:angular2/src/platform/worker_app.dart"
|
||||
show WORKER_APP_APPLICATION_PROVIDERS, RENDER_SEND_PORT;
|
||||
export 'package:angular2/src/web_workers/shared/client_message_broker.dart'
|
||||
show ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments;
|
||||
export 'package:angular2/src/web_workers/shared/service_message_broker.dart'
|
||||
show ReceivedMessage, ServiceMessageBroker, ServiceMessageBrokerFactory;
|
||||
export 'package:angular2/src/web_workers/shared/serializer.dart' show PRIMITIVE;
|
||||
export 'package:angular2/src/web_workers/shared/message_bus.dart';
|
||||
export 'package:angular2/src/web_workers/worker/location_providers.dart'
|
||||
show WORKER_APP_ROUTER;
|
||||
|
||||
PlatformRef _platform = null;
|
||||
SendPort _renderSendPort = null;
|
||||
|
||||
PlatformRef workerAppPlatform(SendPort renderSendPort) {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate([
|
||||
WORKER_APP_PLATFORM_PROVIDERS,
|
||||
new Provider(RENDER_SEND_PORT, useValue: renderSendPort)
|
||||
]));
|
||||
}
|
||||
var platform = assertPlatform(WORKER_APP_PLATFORM_MARKER);
|
||||
if (platform.injector.get(RENDER_SEND_PORT, null) != renderSendPort) {
|
||||
throw 'Platform has already been created with a different SendPort. Please destroy it first.';
|
||||
}
|
||||
return platform;
|
||||
}
|
||||
|
||||
Future<ComponentRef<dynamic>> bootstrapApp(
|
||||
SendPort renderSendPort,
|
||||
Type appComponentType,
|
||||
[List<dynamic /*Type | Provider | any[]*/> customProviders]) {
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate([
|
||||
WORKER_APP_APPLICATION_PROVIDERS,
|
||||
isPresent(customProviders) ? customProviders : []
|
||||
], workerAppPlatform(renderSendPort).injector);
|
||||
return coreLoadAndBootstrap(appInjector, appComponentType);
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
import {isPresent, isBlank} from './facade/lang';
|
||||
import {
|
||||
WORKER_APP_PLATFORM_PROVIDERS,
|
||||
WORKER_APP_PLATFORM_MARKER
|
||||
} from './webworker/worker_app_common';
|
||||
import {WORKER_APP_APPLICATION_PROVIDERS} from './webworker/worker_app';
|
||||
import {
|
||||
PlatformRef,
|
||||
Type,
|
||||
ComponentRef,
|
||||
ReflectiveInjector,
|
||||
coreLoadAndBootstrap,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform
|
||||
} from '@angular/core';
|
||||
|
||||
export {
|
||||
WORKER_APP_PLATFORM_PROVIDERS,
|
||||
WORKER_APP_APPLICATION_COMMON_PROVIDERS
|
||||
} from './webworker/worker_app_common';
|
||||
export {WORKER_APP_APPLICATION_PROVIDERS} from './webworker/worker_app';
|
||||
export {
|
||||
ClientMessageBroker,
|
||||
ClientMessageBrokerFactory,
|
||||
FnArg,
|
||||
UiArguments
|
||||
} from './web_workers/shared/client_message_broker';
|
||||
export {
|
||||
ReceivedMessage,
|
||||
ServiceMessageBroker,
|
||||
ServiceMessageBrokerFactory
|
||||
} from './web_workers/shared/service_message_broker';
|
||||
export {PRIMITIVE} from './web_workers/shared/serializer';
|
||||
export * from './web_workers/shared/message_bus';
|
||||
export {WORKER_APP_LOCATION_PROVIDERS} from './web_workers/worker/location_providers';
|
||||
|
||||
export function workerAppPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_APP_PLATFORM_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(WORKER_APP_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
export function bootstrapStaticApp(
|
||||
appComponentType: Type,
|
||||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ComponentRef<any>> {
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate(
|
||||
[WORKER_APP_APPLICATION_PROVIDERS, isPresent(customProviders) ? customProviders : []],
|
||||
workerAppPlatform().injector);
|
||||
return coreLoadAndBootstrap(appInjector, appComponentType);
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
library angular2.platform.worker_render;
|
||||
|
||||
import 'package:angular2/src/platform/worker_render.dart';
|
||||
import 'package:angular2/src/platform/worker_render_common.dart';
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/facade/lang.dart';
|
||||
import 'dart:async';
|
||||
|
||||
export 'package:angular2/src/platform/worker_render_common.dart'
|
||||
show
|
||||
WORKER_SCRIPT,
|
||||
WORKER_RENDER_PLATFORM,
|
||||
WORKER_RENDER_APPLICATION_COMMON,
|
||||
initializeGenericWorkerRenderer;
|
||||
|
||||
export 'package:angular2/src/platform/worker_render.dart'
|
||||
show WebWorkerInstance;
|
||||
|
||||
export '../src/web_workers/shared/client_message_broker.dart'
|
||||
show ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments;
|
||||
|
||||
export '../src/web_workers/shared/service_message_broker.dart'
|
||||
show ReceivedMessage, ServiceMessageBroker, ServiceMessageBrokerFactory;
|
||||
|
||||
export '../src/web_workers/shared/serializer.dart' show PRIMITIVE;
|
||||
export '../src/web_workers/shared/message_bus.dart';
|
||||
export '../src/web_workers/ui/location_providers.dart' show WORKER_RENDER_ROUTER;
|
||||
|
||||
|
||||
const WORKER_RENDER_APP = WORKER_RENDER_APPLICATION_COMMON;
|
||||
|
||||
PlatformRef workerStaticRenderPlatform() {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_RENDER_PLATFORM));
|
||||
}
|
||||
return assertPlatform(WORKER_RENDER_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
Future<ApplicationRef> bootstrapStaticRender(
|
||||
String workerScriptUri,
|
||||
[List<dynamic /*Type | Provider | any[]*/> customProviders]) {
|
||||
return initIsolate(workerScriptUri).then( (appProviders) {
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate([
|
||||
appProviders,
|
||||
isPresent(customProviders) ? customProviders : []
|
||||
], workerRenderPlatform().injector);
|
||||
return appInjector.get(ApplicationRef);
|
||||
});
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
import {isPresent, isBlank} from './facade/lang';
|
||||
import {PromiseWrapper} from './facade/async';
|
||||
import {
|
||||
ApplicationRef,
|
||||
PlatformRef,
|
||||
ReflectiveInjector,
|
||||
getPlatform,
|
||||
createPlatform,
|
||||
assertPlatform
|
||||
} from '@angular/core';
|
||||
import {WORKER_RENDER_APPLICATION_PROVIDERS} from './webworker/worker_render';
|
||||
import {
|
||||
WORKER_SCRIPT,
|
||||
WORKER_RENDER_PLATFORM_PROVIDERS,
|
||||
WORKER_RENDER_PLATFORM_MARKER
|
||||
} from './webworker/worker_render_common';
|
||||
|
||||
export {
|
||||
WORKER_SCRIPT,
|
||||
WORKER_RENDER_PLATFORM_PROVIDERS,
|
||||
initializeGenericWorkerRenderer,
|
||||
WORKER_RENDER_APPLICATION_COMMON_PROVIDERS
|
||||
} from './webworker/worker_render_common';
|
||||
export {
|
||||
WORKER_RENDER_APPLICATION_PROVIDERS,
|
||||
WORKER_RENDER_STARTABLE_MESSAGING_SERVICE,
|
||||
WebWorkerInstance
|
||||
} from './webworker/worker_render';
|
||||
export {
|
||||
ClientMessageBroker,
|
||||
ClientMessageBrokerFactory,
|
||||
FnArg,
|
||||
UiArguments
|
||||
} from './web_workers/shared/client_message_broker';
|
||||
export {
|
||||
ReceivedMessage,
|
||||
ServiceMessageBroker,
|
||||
ServiceMessageBrokerFactory
|
||||
} from './web_workers/shared/service_message_broker';
|
||||
export {PRIMITIVE} from './web_workers/shared/serializer';
|
||||
export * from './web_workers/shared/message_bus';
|
||||
|
||||
export {WORKER_RENDER_LOCATION_PROVIDERS} from '../src/web_workers/ui/location_providers';
|
||||
|
||||
export function workerRenderPlatform(): PlatformRef {
|
||||
if (isBlank(getPlatform())) {
|
||||
createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_RENDER_PLATFORM_PROVIDERS));
|
||||
}
|
||||
return assertPlatform(WORKER_RENDER_PLATFORM_MARKER);
|
||||
}
|
||||
|
||||
export function bootstrapStaticRender(
|
||||
workerScriptUri: string,
|
||||
customProviders?: Array<any /*Type | Provider | any[]*/>): Promise<ApplicationRef> {
|
||||
var app = ReflectiveInjector.resolveAndCreate(
|
||||
[
|
||||
WORKER_RENDER_APPLICATION_PROVIDERS,
|
||||
/* @ts2dart_Provider */ {provide: WORKER_SCRIPT, useValue: workerScriptUri},
|
||||
isPresent(customProviders) ? customProviders : []
|
||||
],
|
||||
workerRenderPlatform().injector);
|
||||
// Return a promise so that we keep the same semantics as Dart,
|
||||
// and we might want to wait for the app side to come up
|
||||
// in the future...
|
||||
return PromiseWrapper.resolve(app.get(ApplicationRef));
|
||||
}
|
|
@ -10,27 +10,21 @@ import {
|
|||
xdescribe,
|
||||
xit
|
||||
} from '@angular/core/testing/testing_internal';
|
||||
import {
|
||||
fakeAsync,
|
||||
flushMicrotasks,
|
||||
Log,
|
||||
tick,
|
||||
} from '@angular/core/testing';
|
||||
import {Log} from '@angular/core/testing';
|
||||
import {AsyncTestCompleter} from '@angular/core/testing/testing_internal';
|
||||
import {IS_DART, isPresent, stringify} from '../../src/facade/lang';
|
||||
import {BROWSER_PROVIDERS} from '@angular/platform-browser';
|
||||
import {BROWSER_APP_DYNAMIC_PROVIDERS} from '@angular/platform-browser-dynamic';
|
||||
import {bootstrap} from '@angular/platform-browser-dynamic';
|
||||
import {ApplicationRef, PlatformRef} from '@angular/core/src/application_ref';
|
||||
import {stringify} from '../../src/facade/lang';
|
||||
import {BROWSER_PLATFORM_PROVIDERS} from '@angular/platform-browser';
|
||||
import {BROWSER_APP_PROVIDERS} from '@angular/platform-browser';
|
||||
import {bootstrap} from '@angular/platform-browser';
|
||||
import {ApplicationRef} from '@angular/core/src/application_ref';
|
||||
import {Console} from '@angular/core/src/console';
|
||||
import {Component, Directive, OnDestroy} from '@angular/core';
|
||||
import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter';
|
||||
import {DOCUMENT} from '@angular/platform-browser/src/dom/dom_tokens';
|
||||
import {PromiseWrapper, TimerWrapper} from '../../src/facade/async';
|
||||
import {PromiseWrapper} from '../../src/facade/async';
|
||||
import {
|
||||
provide,
|
||||
Inject,
|
||||
Injector,
|
||||
PLATFORM_INITIALIZER,
|
||||
APP_INITIALIZER,
|
||||
coreLoadAndBootstrap,
|
||||
|
@ -215,9 +209,9 @@ export function main() {
|
|||
|
||||
it('should unregister change detectors when components are disposed',
|
||||
inject([AsyncTestCompleter], (async) => {
|
||||
var platform = createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PROVIDERS));
|
||||
var platform = createPlatform(ReflectiveInjector.resolveAndCreate(BROWSER_PLATFORM_PROVIDERS));
|
||||
var app =
|
||||
ReflectiveInjector.resolveAndCreate([BROWSER_APP_DYNAMIC_PROVIDERS, testProviders],
|
||||
ReflectiveInjector.resolveAndCreate([BROWSER_APP_PROVIDERS, testProviders],
|
||||
platform.injector)
|
||||
.get(ApplicationRef);
|
||||
coreLoadAndBootstrap(app.injector, HelloRootCmp)
|
||||
|
@ -251,7 +245,7 @@ export function main() {
|
|||
|
||||
it("should run platform initializers", inject([Log], (log: Log) => {
|
||||
let p = createPlatform(ReflectiveInjector.resolveAndCreate([
|
||||
BROWSER_PROVIDERS,
|
||||
BROWSER_PLATFORM_PROVIDERS,
|
||||
provide(PLATFORM_INITIALIZER, {useValue: log.fn("platform_init1"), multi: true}),
|
||||
provide(PLATFORM_INITIALIZER, {useValue: log.fn("platform_init2"), multi: true})
|
||||
]));
|
||||
|
@ -259,7 +253,7 @@ export function main() {
|
|||
log.clear();
|
||||
var a = ReflectiveInjector.resolveAndCreate(
|
||||
[
|
||||
BROWSER_APP_DYNAMIC_PROVIDERS,
|
||||
BROWSER_APP_PROVIDERS,
|
||||
provide(APP_INITIALIZER, {useValue: log.fn("app_init1"), multi: true}),
|
||||
provide(APP_INITIALIZER, {useValue: log.fn("app_init2"), multi: true})
|
||||
],
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
import 'dart:html';
|
||||
|
||||
Rectangle createRectangle(left, top, width, height) {
|
||||
return new Rectangle(left, top, width, height);
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
import {
|
||||
inject,
|
||||
describe,
|
||||
it,
|
||||
expect,
|
||||
} from '@angular/core/testing/testing_internal';
|
||||
import {AsyncTestCompleter, SpyObject} from '@angular/core/testing/testing_internal';
|
||||
import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter';
|
||||
import {Ruler, Rectangle} from '@angular/platform-browser/src/browser/ruler';
|
||||
import {createRectangle} from './rectangle_mock';
|
||||
import {SpyDomAdapter, SpyElementRef} from '@angular/core/test/spies';
|
||||
|
||||
function assertDimensions(rect: Rectangle, left, right, top, bottom, width, height) {
|
||||
expect(rect.left).toEqual(left);
|
||||
expect(rect.right).toEqual(right);
|
||||
expect(rect.top).toEqual(top);
|
||||
expect(rect.bottom).toEqual(bottom);
|
||||
expect(rect.width).toEqual(width);
|
||||
expect(rect.height).toEqual(height);
|
||||
}
|
||||
|
||||
export function main() {
|
||||
describe('ruler service', () => {
|
||||
|
||||
it('should allow measuring ElementRefs', inject([AsyncTestCompleter], (async) => {
|
||||
var ruler = new Ruler(SpyObject.stub(
|
||||
new SpyDomAdapter(), {'getBoundingClientRect': createRectangle(10, 20, 200, 100)}));
|
||||
var elRef = <any>new SpyElementRef();
|
||||
ruler.measure(elRef).then((rect) => {
|
||||
assertDimensions(rect, 10, 210, 20, 120, 200, 100);
|
||||
async.done();
|
||||
});
|
||||
}));
|
||||
|
||||
|
||||
it('should return 0 for all rectangle values while measuring elements in a document fragment',
|
||||
inject([AsyncTestCompleter], (async) => {
|
||||
var ruler = new Ruler(getDOM());
|
||||
var elRef = <any>new SpyElementRef();
|
||||
elRef.prop("nativeElement", getDOM().createElement('div'));
|
||||
ruler.measure(elRef).then((rect) => {
|
||||
// here we are using an element created in a doc fragment so all the measures will come
|
||||
// back as 0
|
||||
assertDimensions(rect, 0, 0, 0, 0, 0, 0);
|
||||
async.done();
|
||||
});
|
||||
}));
|
||||
|
||||
});
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
import {describe, it, iit, ddescribe, expect} from '@angular/core/testing';
|
||||
import {BrowserDetection} from '@angular/platform-browser/testing';
|
||||
import {BrowserDetection} from '../testing/browser_util';
|
||||
import {StringMapWrapper} from '../src/facade/collection';
|
||||
|
||||
export function main() {
|
||||
|
|
|
@ -25,7 +25,7 @@ import {ROUTER_DIRECTIVES, Routes, Route} from '@angular/router';
|
|||
import {Component, bind} from '@angular/core';
|
||||
import {PromiseWrapper} from '../src/facade/promise';
|
||||
import {XHR} from '@angular/compiler';
|
||||
import {XHRImpl} from '../../platform-browser-dynamic/src/xhr/xhr_impl';
|
||||
import {XHRImpl} from '../src/xhr/xhr_impl';
|
||||
import {TestComponentBuilder} from '@angular/compiler/testing';
|
||||
|
||||
// Components for the tests.
|
|
@ -1,7 +0,0 @@
|
|||
library angular2.test.testing.testing_spec;
|
||||
|
||||
/**
|
||||
* This is intentionally left blank. The public test lib is only for TS/JS
|
||||
* apps.
|
||||
*/
|
||||
main() {}
|
|
@ -1,29 +0,0 @@
|
|||
library angular2.test.web_workers.debug_tools.bootstrap;
|
||||
|
||||
import 'package:angular2/src/platform/server/html_adapter.dart';
|
||||
import "package:angular2/src/testing/testing_internal_core.dart";
|
||||
import "package:angular2/src/core/reflection/reflection_capabilities.dart";
|
||||
import "package:angular2/src/core/reflection/reflection.dart";
|
||||
import "package:angular2/src/platform/worker_app_common.dart"
|
||||
show WORKER_APP_APPLICATION_COMMON;
|
||||
import "package:angular2/platform/worker_app.dart" show WORKER_APP_PLATFORM;
|
||||
import "package:angular2/core.dart";
|
||||
import "../shared/web_worker_test_util.dart";
|
||||
import "dart:convert";
|
||||
|
||||
main() {
|
||||
Html5LibDomAdapter.makeCurrent();
|
||||
testSetup();
|
||||
|
||||
describe("WORKER_APP_COMMON_PROVIDERS", () {
|
||||
it("should be able to load in a Dart VM", () {
|
||||
reflector.reflectionCapabilities = new ReflectionCapabilities();
|
||||
var buses = createPairedMessageBuses();
|
||||
disposePlatform();
|
||||
var platform = createPlatform(ReflectiveInjector.resolveAndCreate(WORKER_APP_PLATFORM));
|
||||
var appInjector = ReflectiveInjector.resolveAndCreate(WORKER_APP_APPLICATION_COMMON,
|
||||
platform.injector);
|
||||
appInjector.get(ApplicationRef);
|
||||
});
|
||||
});
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
library angular2.test.web_workers.debug_tools.message_bus_common;
|
||||
|
||||
import "dart:convert" show JSON;
|
||||
import "package:angular2/src/web_workers/shared/message_bus.dart";
|
||||
import "package:angular2/src/testing/testing_internal_core.dart"
|
||||
show AsyncTestCompleter, expect, SpyObject;
|
||||
|
||||
var MESSAGE = const {'test': 10};
|
||||
const CHANNEL = "TEST_CHANNEL";
|
||||
|
||||
void expectSinkSendsEncodedJson(SpyObject socket, MessageBusSink sink,
|
||||
String sendMethodName, AsyncTestCompleter async) {
|
||||
socket.spy(sendMethodName).andCallFake((message) {
|
||||
expectMessageEquality(message, MESSAGE, CHANNEL);
|
||||
async.done();
|
||||
});
|
||||
sink.to(CHANNEL).add(MESSAGE);
|
||||
}
|
||||
|
||||
void expectMessageEquality(String message, Map expectedData, String channel) {
|
||||
expect(JSON.decode(message)).toEqual([
|
||||
{'channel': channel, 'message': expectedData}
|
||||
]);
|
||||
}
|
|
@ -1,235 +0,0 @@
|
|||
library angular2.test.web_workers.debug_tools.multi_client_server_message_bus;
|
||||
|
||||
import "dart:io";
|
||||
import "dart:async";
|
||||
import "package:angular2/src/testing/testing_internal_core.dart"
|
||||
show
|
||||
AsyncTestCompleter,
|
||||
SpyObject,
|
||||
beforeEach,
|
||||
beforeEachProviders,
|
||||
describe,
|
||||
expect,
|
||||
iit,
|
||||
inject,
|
||||
it,
|
||||
proxy,
|
||||
testSetup;
|
||||
import 'package:angular2/src/platform/server/html_adapter.dart';
|
||||
import "package:angular2/src/web_workers/debug_tools/multi_client_server_message_bus.dart";
|
||||
import "package:angular2/src/web_workers/shared/messaging_api.dart";
|
||||
import "./message_bus_common.dart";
|
||||
import "./spy_web_socket.dart";
|
||||
import "dart:convert" show JSON;
|
||||
import 'dart:math';
|
||||
|
||||
main() {
|
||||
Html5LibDomAdapter.makeCurrent();
|
||||
testSetup();
|
||||
|
||||
List<String> messageHistory = new List<String>();
|
||||
List<int> resultMarkers = new List<int>();
|
||||
describe("MultiClientServerMessageBusSink", () {
|
||||
const CHANNEL = "TEST_CHANNEL";
|
||||
var MESSAGE = const {'test': 10};
|
||||
|
||||
beforeEach(() {
|
||||
messageHistory.clear();
|
||||
resultMarkers.clear();
|
||||
});
|
||||
|
||||
it(
|
||||
"should send messages to all connected clients",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
const NUM_CLIENTS = 5;
|
||||
var sink = new MultiClientServerMessageBusSink();
|
||||
sink.initChannel(CHANNEL, false);
|
||||
int numMessagesSent = 0;
|
||||
// initialize all the sockets
|
||||
var sockets = new List<WebSocketWrapper>(NUM_CLIENTS);
|
||||
for (var i = 0; i < sockets.length; i++) {
|
||||
var messageSent =
|
||||
false; // ensure this socket only receives one message
|
||||
var socketWrapper = createSocket(messageHandler: (message) {
|
||||
expect(messageSent).toEqual(false);
|
||||
messageSent = true;
|
||||
expectMessageEquality(message, MESSAGE, CHANNEL);
|
||||
numMessagesSent++;
|
||||
if (numMessagesSent == NUM_CLIENTS) {
|
||||
async.done();
|
||||
}
|
||||
});
|
||||
var socket = socketWrapper.socket;
|
||||
sockets[i] =
|
||||
new WebSocketWrapper(messageHistory, resultMarkers, socket);
|
||||
sink.addConnection(sockets[i]);
|
||||
}
|
||||
sink.to(CHANNEL).add(MESSAGE);
|
||||
}));
|
||||
});
|
||||
|
||||
describe("WebSocketWrapper", () {
|
||||
beforeEach(() {
|
||||
messageHistory.clear();
|
||||
resultMarkers.clear();
|
||||
});
|
||||
|
||||
/**
|
||||
* Generates the given number of random messages, inserts them into messageHistory,
|
||||
* and then returns a cloned version of messageHistory
|
||||
*/
|
||||
List<String> generateRandomMessages(int numMessages) {
|
||||
const MAX = 1 << 31;
|
||||
var random = new Random();
|
||||
for (var i = 0; i < numMessages; i++) {
|
||||
var message = {'value': random.nextInt(MAX)};
|
||||
messageHistory.add(JSON.encode([
|
||||
{'channel': CHANNEL, 'message': message}
|
||||
]));
|
||||
}
|
||||
// copy the message history to ensure the test fails if the wrapper modifies the list
|
||||
return new List.from(messageHistory);
|
||||
}
|
||||
|
||||
it(
|
||||
"should send all messages when there are no markers",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
const NUM_MESSAGES = 10;
|
||||
var messageHistoryClone = generateRandomMessages(NUM_MESSAGES);
|
||||
|
||||
int numMessagesSent = 0;
|
||||
var socketWrapper = createSocket(messageHandler: (message) {
|
||||
expect(message).toEqual(messageHistoryClone[numMessagesSent]);
|
||||
//expectMessageEquality(message, expected, CHANNEL);
|
||||
numMessagesSent++;
|
||||
if (numMessagesSent == messageHistoryClone.length) {
|
||||
async.done();
|
||||
}
|
||||
});
|
||||
var wrapper = new WebSocketWrapper(
|
||||
messageHistory, resultMarkers, socketWrapper.socket);
|
||||
wrapper.sendToMarker(0);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should send between two markers",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
const NUM_MESSAGES = 50;
|
||||
const FIRST_MARKER = 5;
|
||||
const SECOND_MARKER = 15;
|
||||
var messageHistoryClone = generateRandomMessages(NUM_MESSAGES);
|
||||
|
||||
int numMessagesSent = 0;
|
||||
resultMarkers.add(FIRST_MARKER);
|
||||
resultMarkers.add(SECOND_MARKER);
|
||||
var socketWrapper = createSocket(messageHandler: (message) {
|
||||
expect(message)
|
||||
.toEqual(messageHistoryClone[FIRST_MARKER + numMessagesSent]);
|
||||
numMessagesSent++;
|
||||
if (numMessagesSent == SECOND_MARKER - FIRST_MARKER) {
|
||||
async.done();
|
||||
}
|
||||
});
|
||||
var wrapper = new WebSocketWrapper(
|
||||
messageHistory, resultMarkers, socketWrapper.socket);
|
||||
wrapper.sendToMarker(1);
|
||||
}));
|
||||
});
|
||||
|
||||
describe("MultiClientServerMessageBusSource", () {
|
||||
beforeEach(() {
|
||||
messageHistory.clear();
|
||||
resultMarkers.clear();
|
||||
});
|
||||
|
||||
void sendMessage(StreamController controller, dynamic message) {
|
||||
controller.add(JSON.encode([message]));
|
||||
}
|
||||
|
||||
void testForwardingMessages(bool primary, bool events, Function done) {
|
||||
var result = createSocket();
|
||||
var controller = result.controller;
|
||||
var socket =
|
||||
new WebSocketWrapper(messageHistory, resultMarkers, result.socket);
|
||||
socket.setPrimary(primary);
|
||||
|
||||
var source = new MultiClientServerMessageBusSource();
|
||||
source.addConnection(socket);
|
||||
|
||||
var channel = events ? EVENT_CHANNEL : CHANNEL;
|
||||
source.initChannel(channel, false);
|
||||
source.from(channel).listen((message) {
|
||||
expect(message).toEqual(MESSAGE);
|
||||
done();
|
||||
});
|
||||
|
||||
var message = {'channel': channel, 'message': MESSAGE};
|
||||
sendMessage(controller, message);
|
||||
}
|
||||
|
||||
it(
|
||||
"should forward messages from the primary",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
testForwardingMessages(true, false, async.done);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should forward event channel messages from non primaries",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
testForwardingMessages(false, true, async.done);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should forward event channel messages from the primary",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
testForwardingMessages(true, true, async.done);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should mark results from the primary",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var result = createSocket();
|
||||
var controller = result.controller;
|
||||
var socket = new WebSocketWrapper(
|
||||
messageHistory, resultMarkers, result.socket);
|
||||
socket.setPrimary(true);
|
||||
|
||||
var source = new MultiClientServerMessageBusSource();
|
||||
source.onResult.listen((result) => async.done());
|
||||
source.initChannel(CHANNEL, false);
|
||||
source.addConnection(socket);
|
||||
|
||||
var message = {
|
||||
'channel': CHANNEL,
|
||||
'message': {'type': 'result'}
|
||||
};
|
||||
sendMessage(controller, message);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new SpyWebSocket that calls messageHandler when a new message is sent.
|
||||
* Also returns a StreamController instance that you can use to send messages to anything
|
||||
* that is subscribed to this socket.
|
||||
*/
|
||||
SpySocketWrapper createSocket({Function messageHandler}) {
|
||||
var socket = new SpyWebSocket();
|
||||
if (messageHandler != null) {
|
||||
socket.spy("add").andCallFake(messageHandler);
|
||||
socket
|
||||
.spy("addStream")
|
||||
.andCallFake((Stream stream) => stream.listen(messageHandler));
|
||||
}
|
||||
|
||||
var controller = new StreamController<String>.broadcast();
|
||||
socket.spy("asBroadcastStream").andCallFake(() => controller.stream);
|
||||
return new SpySocketWrapper(socket, controller);
|
||||
}
|
||||
|
||||
class SpySocketWrapper {
|
||||
SpyWebSocket socket;
|
||||
StreamController controller;
|
||||
|
||||
SpySocketWrapper(this.socket, this.controller);
|
||||
}
|
|
@ -1,106 +0,0 @@
|
|||
library angular2.test.web_workers.debug_tools.single_client_server_message_bus;
|
||||
|
||||
import "dart:io";
|
||||
import "dart:async";
|
||||
import "package:angular2/src/testing/testing_internal_core.dart"
|
||||
show
|
||||
AsyncTestCompleter,
|
||||
SpyObject,
|
||||
beforeEach,
|
||||
beforeEachProviders,
|
||||
describe,
|
||||
expect,
|
||||
inject,
|
||||
it,
|
||||
proxy,
|
||||
testSetup;
|
||||
import 'package:angular2/src/platform/server/html_adapter.dart';
|
||||
import "package:angular2/src/web_workers/debug_tools/single_client_server_message_bus.dart";
|
||||
import "./message_bus_common.dart";
|
||||
import "./spy_web_socket.dart";
|
||||
import "dart:convert" show JSON;
|
||||
|
||||
main() {
|
||||
Html5LibDomAdapter.makeCurrent();
|
||||
testSetup();
|
||||
|
||||
var MESSAGE = const {'test': 10};
|
||||
const CHANNEL = "TEST_CHANNEL";
|
||||
describe("SingleClientServerMessageBusSink", () {
|
||||
it(
|
||||
"should send JSON encoded data over the WebSocket",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var socket = new SpyWebSocket();
|
||||
var sink = new SingleClientServerMessageBusSink();
|
||||
sink.initChannel(CHANNEL, false);
|
||||
|
||||
sink.setConnection(socket);
|
||||
expectSinkSendsEncodedJson(socket, sink, "add", async);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should buffer messages before connect",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var sink = new SingleClientServerMessageBusSink();
|
||||
sink.initChannel(CHANNEL, false);
|
||||
sink.to(CHANNEL).add(MESSAGE);
|
||||
|
||||
var socket = new SpyWebSocket();
|
||||
socket.spy("add").andCallFake((message) {
|
||||
expectMessageEquality(message, MESSAGE, CHANNEL);
|
||||
async.done();
|
||||
});
|
||||
sink.setConnection(socket);
|
||||
}));
|
||||
|
||||
it(
|
||||
"should buffer messages in between disconnect and connect",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var SECOND_MESSAGE = const {'test': 12, 'second': 'hi'};
|
||||
var sink = new SingleClientServerMessageBusSink();
|
||||
sink.initChannel(CHANNEL, false);
|
||||
|
||||
sink.to(CHANNEL).add(MESSAGE);
|
||||
|
||||
var socket = new SpyWebSocket();
|
||||
sink.setConnection(socket);
|
||||
|
||||
int numMessages = 0;
|
||||
|
||||
socket.spy("add").andCallFake((message) {
|
||||
numMessages++;
|
||||
if (numMessages == 1) {
|
||||
expectMessageEquality(message, MESSAGE, CHANNEL);
|
||||
} else {
|
||||
expectMessageEquality(message, SECOND_MESSAGE, CHANNEL);
|
||||
async.done();
|
||||
}
|
||||
});
|
||||
|
||||
sink.removeConnection();
|
||||
sink.to(CHANNEL).add(SECOND_MESSAGE);
|
||||
sink.setConnection(socket);
|
||||
}));
|
||||
});
|
||||
|
||||
describe("SingleClientServerMessageBusSource", () {
|
||||
it(
|
||||
"should decode JSON messages and emit them",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
StreamController<String> controller =
|
||||
new StreamController.broadcast();
|
||||
|
||||
var source = new SingleClientServerMessageBusSource();
|
||||
source.initChannel(CHANNEL, false);
|
||||
source.attachTo(controller.stream);
|
||||
source.from(CHANNEL).listen((message) {
|
||||
expect(message).toEqual(MESSAGE);
|
||||
async.done();
|
||||
});
|
||||
|
||||
controller.add(JSON.encode([
|
||||
{'channel': CHANNEL, 'message': MESSAGE}
|
||||
]));
|
||||
}));
|
||||
});
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
/**
|
||||
* Contains code shared between all server message bus tests
|
||||
*/
|
||||
library angular2.test.web_workers.debug_tools.server_message_bus_common;
|
||||
|
||||
import "package:angular2/src/testing/testing_internal_core.dart";
|
||||
import "dart:io";
|
||||
|
||||
@proxy
|
||||
class SpyWebSocket extends SpyObject implements WebSocket {
|
||||
SpyWebSocket() : super(SpyWebSocket);
|
||||
noSuchMethod(m) {
|
||||
return super.noSuchMethod(m);
|
||||
}
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
library angular2.test.web_workers.debug_tools.web_socket_server_message_bus;
|
||||
|
||||
import "package:angular2/testing_internal.dart"
|
||||
show
|
||||
AsyncTestCompleter,
|
||||
inject,
|
||||
describe,
|
||||
it,
|
||||
expect,
|
||||
beforeEach,
|
||||
beforeEachProviders,
|
||||
SpyObject;
|
||||
import "package:angular2/src/web_workers/debug_tools/web_socket_message_bus.dart";
|
||||
import "dart:html" show WebSocket, MessageEvent;
|
||||
import "./message_bus_common.dart";
|
||||
import "dart:async";
|
||||
import "dart:convert" show JSON;
|
||||
|
||||
main() {
|
||||
var MESSAGE = const {'test': 10};
|
||||
const CHANNEL = "TEST_CHANNEL";
|
||||
|
||||
describe("WebSocketMessageBusSink", () {
|
||||
it(
|
||||
"should send JSON encoded data over the WebSocket",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var socket = new SpyWebSocket();
|
||||
var sink = new WebSocketMessageBusSink(socket);
|
||||
sink.initChannel(CHANNEL, false);
|
||||
expectSinkSendsEncodedJson(socket, sink, "send", async);
|
||||
}));
|
||||
});
|
||||
|
||||
describe("WebSocketMessageBusSource", () {
|
||||
it(
|
||||
"should decode JSON messages and emit them",
|
||||
inject([AsyncTestCompleter], (async) {
|
||||
var socket = new SpyWebSocket();
|
||||
StreamController<MessageEvent> controller =
|
||||
new StreamController.broadcast();
|
||||
socket.spy("get:onMessage").andCallFake(() => controller.stream);
|
||||
var source = new WebSocketMessageBusSource(socket);
|
||||
source.initChannel(CHANNEL, false);
|
||||
|
||||
source.from(CHANNEL).listen((message) {
|
||||
expect(message).toEqual(MESSAGE);
|
||||
async.done();
|
||||
});
|
||||
|
||||
var event = new SpyMessageEvent();
|
||||
event.spy("get:data").andCallFake(() => JSON.encode([
|
||||
{'channel': CHANNEL, 'message': MESSAGE}
|
||||
]));
|
||||
controller.add(event);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
@proxy
|
||||
class SpyMessageEvent extends SpyObject implements MessageEvent {
|
||||
SpyMessageEvent() : super(SpyMessageEvent);
|
||||
}
|
||||
|
||||
@proxy
|
||||
class SpyWebSocket extends SpyObject implements WebSocket {
|
||||
SpyWebSocket() : super(SpyWebSocket);
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
library angular2.test.web_workers.shared.message_bus_util;
|
||||
|
||||
import 'dart:isolate';
|
||||
import 'package:angular2/src/web_workers/shared/message_bus.dart'
|
||||
show MessageBus;
|
||||
import 'package:angular2/src/web_workers/shared/isolate_message_bus.dart';
|
||||
|
||||
/*
|
||||
* Returns an IsolateMessageBus thats sink is connected to its own source.
|
||||
* Useful for testing the sink and source.
|
||||
*/
|
||||
MessageBus createConnectedMessageBus() {
|
||||
var receivePort = new ReceivePort();
|
||||
var sendPort = receivePort.sendPort;
|
||||
|
||||
var sink = new IsolateMessageBusSink(sendPort);
|
||||
var source = new IsolateMessageBusSource(receivePort);
|
||||
|
||||
return new IsolateMessageBus(sink, source);
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
library angular2.test.web_workers.worker.mock_event_emitter;
|
||||
|
||||
import 'dart:core';
|
||||
import 'dart:async';
|
||||
import "package:angular2/src/facade/async.dart";
|
||||
|
||||
class MockEventEmitter<T> extends EventEmitter<T> {
|
||||
final controller = new StreamController.broadcast(sync: true);
|
||||
|
||||
@override
|
||||
StreamSubscription listen(void onData(dynamic line),
|
||||
{void onError(Error error), void onDone(), bool cancelOnError}) {
|
||||
return controller.stream.listen(onData,
|
||||
onError: onError, onDone: onDone, cancelOnError: cancelOnError);
|
||||
}
|
||||
|
||||
@override
|
||||
void add(value) {
|
||||
controller.add(value);
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
library web_workers.spies;
|
||||
|
||||
import 'package:angular2/src/web_workers/shared/client_message_broker.dart';
|
||||
import 'package:angular2/src/testing/testing_internal_core.dart';
|
||||
|
||||
@proxy
|
||||
class SpyMessageBroker extends SpyObject implements ClientMessageBroker {}
|
|
@ -2,7 +2,7 @@ import {inject, describe, it, expect} from '@angular/core/testing/testing_intern
|
|||
import {AsyncTestCompleter} from '@angular/core/testing/testing_internal';
|
||||
|
||||
import {SpyMessageBroker} from '@angular/platform-browser/test/web_workers/worker/spies';
|
||||
import {WebWorkerXHRImpl} from '@angular/platform-browser-dynamic/src/web_workers/worker/xhr_impl';
|
||||
import {WebWorkerXHRImpl} from '@angular/platform-browser/src/web_workers/worker/xhr_impl';
|
||||
import {PromiseWrapper} from '../../../src/facade/async';
|
||||
import {
|
||||
MockMessageBrokerFactory,
|
|
@ -6,9 +6,9 @@ import {
|
|||
iit,
|
||||
inject,
|
||||
it,
|
||||
xit
|
||||
xit,
|
||||
AsyncTestCompleter
|
||||
} from '@angular/core/testing/testing_internal';
|
||||
import {AsyncTestCompleter} from '@angular/core/testing/testing_internal';
|
||||
import {XHRImpl} from '../../src/xhr/xhr_impl';
|
||||
import {PromiseWrapper} from '../../src/facade/async';
|
||||
import {IS_DART} from '../../src/facade/lang';
|
||||
|
@ -24,7 +24,7 @@ export function main() {
|
|||
// static_assets/200.html.
|
||||
// We currently have no way of detecting this.
|
||||
var urlBase = IS_DART ? '' : '/base/modules/@angular/';
|
||||
var url200 = urlBase + 'platform-browser-dynamic/test/browser/static_assets/200.html';
|
||||
var url200 = urlBase + 'platform-browser/test/browser/static_assets/200.html';
|
||||
var url404 = '/bad/path/404.html';
|
||||
|
||||
beforeEach(() => { xhr = new XHRImpl(); });
|
|
@ -1,3 +1,5 @@
|
|||
export * from './testing/browser_util';
|
||||
export * from './testing/browser_static';
|
||||
export * from './testing/matchers';
|
||||
export * from './testing/browser';
|
||||
export * from './testing/dom_test_component_renderer';
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue