feat(core): speed up view creation via code gen for view factories.

BREAKING CHANGE:
- Platform pipes can only contain types and arrays of types,
  but no bindings any more.
- When using transformers, platform pipes need to be specified explicitly
  in the pubspec.yaml via the new config option
  `platform_pipes`.
- `Compiler.compileInHost` now returns a `HostViewFactoryRef`
- Component view is not yet created when component constructor is called.
  -> use `onInit` lifecycle callback to access the view of a component
- `ViewRef#setLocal` has been moved to new type `EmbeddedViewRef`
- `internalView` is gone, use `EmbeddedViewRef.rootNodes` to access
  the root nodes of an embedded view
- `renderer.setElementProperty`, `..setElementStyle`, `..setElementAttribute` now
  take a native element instead of an ElementRef
- `Renderer` interface now operates on plain native nodes,
  instead of `RenderElementRef`s or `RenderViewRef`s

Closes #5993
This commit is contained in:
Tobias Bosch
2015-12-02 10:35:51 -08:00
parent a08f50badd
commit 7ae23adaff
191 changed files with 6476 additions and 10232 deletions
@@ -1,56 +0,0 @@
import {
AsyncTestCompleter,
inject,
describe,
ddescribe,
beforeEach,
it,
expect
} from "angular2/testing_internal";
import {RenderProtoViewRef} from "angular2/src/core/render/api";
import {RenderProtoViewRefStore} from "angular2/src/web_workers/shared/render_proto_view_ref_store";
import {
WebWorkerRenderProtoViewRef
} from "angular2/src/web_workers/shared/render_proto_view_ref_store";
export function main() {
describe("RenderProtoViewRefStore", () => {
describe("on WebWorker", () => {
var store: RenderProtoViewRefStore;
beforeEach(() => { store = new RenderProtoViewRefStore(true); });
it("should allocate refs", () => {
expect((<WebWorkerRenderProtoViewRef>store.allocate()).refNumber).toBe(0);
expect((<WebWorkerRenderProtoViewRef>store.allocate()).refNumber).toBe(1);
});
it("should be serializable", () => {
var protoView = store.allocate();
expect(store.deserialize(store.serialize(protoView))).toEqual(protoView);
});
});
describe("on UI", () => {
var store: RenderProtoViewRefStore;
beforeEach(() => { store = new RenderProtoViewRefStore(false); });
it("should associate views with the correct references", () => {
var renderProtoViewRef = new RenderProtoViewRef();
store.store(renderProtoViewRef, 100);
expect(store.deserialize(100)).toBe(renderProtoViewRef);
});
it("should be serializable", () => {
var renderProtoViewRef = new RenderProtoViewRef();
store.store(renderProtoViewRef, 0);
var deserialized = store.deserialize(store.serialize(renderProtoViewRef));
expect(deserialized).toBe(renderProtoViewRef);
});
});
});
}
@@ -0,0 +1,37 @@
import {
AsyncTestCompleter,
inject,
describe,
ddescribe,
beforeEach,
it,
expect
} from "angular2/testing_internal";
import {RenderStore} from "angular2/src/web_workers/shared/render_store";
export function main() {
describe("RenderStoreSpec", () => {
var store: RenderStore;
beforeEach(() => { store = new RenderStore(); });
it('should allocate ids', () => {
expect(store.allocateId()).toBe(0);
expect(store.allocateId()).toBe(1);
});
it('should serialize objects', () => {
var id = store.allocateId();
var obj = 'testObject';
store.store(obj, id);
expect(store.serialize(obj)).toBe(id);
});
it('should deserialize objects', () => {
var id = store.allocateId();
var obj = 'testObject';
store.store(obj, id);
expect(store.deserialize(id)).toBe(obj);
});
});
}
@@ -1,144 +0,0 @@
import {
AsyncTestCompleter,
beforeEach,
inject,
describe,
it,
expect
} from "angular2/testing_internal";
import {
RenderViewWithFragments,
RenderViewRef,
RenderFragmentRef
} from "angular2/src/core/render/api";
import {
RenderViewWithFragmentsStore,
WebWorkerRenderViewRef,
WebWorkerRenderFragmentRef
} from "angular2/src/web_workers/shared/render_view_with_fragments_store";
import {ListWrapper} from "angular2/src/facade/collection";
export function main() {
describe("RenderViewWithFragmentsStore", () => {
describe("on WebWorker", () => {
var store: RenderViewWithFragmentsStore;
beforeEach(() => { store = new RenderViewWithFragmentsStore(true); });
it("should allocate fragmentCount + 1 refs", () => {
var view: RenderViewWithFragments = store.allocate(10);
var viewRef: WebWorkerRenderViewRef = <WebWorkerRenderViewRef>view.viewRef;
expect(viewRef.refNumber).toEqual(0);
var fragmentRefs: WebWorkerRenderFragmentRef[] =
<WebWorkerRenderFragmentRef[]>view.fragmentRefs;
expect(fragmentRefs.length).toEqual(10);
for (var i = 0; i < fragmentRefs.length; i++) {
expect(fragmentRefs[i].refNumber).toEqual(i + 1);
}
});
it("should not reuse a reference", () => {
store.allocate(10);
var view = store.allocate(0);
var viewRef = <WebWorkerRenderViewRef>view.viewRef;
expect(viewRef.refNumber).toEqual(11);
});
it("should be serializable", () => {
var view = store.allocate(1);
expect(store.deserializeViewWithFragments(store.serializeViewWithFragments(view)))
.toEqual(view);
});
it("should remove a view and all attached fragments", () => {
const NUM_FRAGMENTS = 5;
var view = store.allocate(NUM_FRAGMENTS);
var viewRef = (<WebWorkerRenderViewRef>view.viewRef).refNumber;
store.remove(view.viewRef);
expect(store.deserializeRenderViewRef(viewRef++)).toBeNull();
for (var i = 0; i < NUM_FRAGMENTS; i++) {
expect(store.deserializeRenderFragmentRef(viewRef++)).toBeNull();
}
});
});
describe("on UI", () => {
var store: RenderViewWithFragmentsStore;
beforeEach(() => { store = new RenderViewWithFragmentsStore(false); });
function createMockRenderViewWithFragments(): RenderViewWithFragments {
var view = new MockRenderViewRef();
var fragments = ListWrapper.createGrowableSize(20);
for (var i = 0; i < 20; i++) {
fragments[i] = new MockRenderFragmentRef();
}
return new RenderViewWithFragments(view, fragments);
}
it("should associate views with the correct references", () => {
var renderViewWithFragments = createMockRenderViewWithFragments();
store.store(renderViewWithFragments, 100);
expect(store.deserializeRenderViewRef(100)).toBe(renderViewWithFragments.viewRef);
for (var i = 0; i < renderViewWithFragments.fragmentRefs.length; i++) {
expect(store.deserializeRenderFragmentRef(101 + i))
.toBe(renderViewWithFragments.fragmentRefs[i]);
}
});
describe("RenderViewWithFragments", () => {
it("should be serializable", () => {
var renderViewWithFragments = createMockRenderViewWithFragments();
store.store(renderViewWithFragments, 0);
var deserialized = store.deserializeViewWithFragments(
store.serializeViewWithFragments(renderViewWithFragments));
expect(deserialized.viewRef).toBe(renderViewWithFragments.viewRef);
expect(deserialized.fragmentRefs.length)
.toEqual(renderViewWithFragments.fragmentRefs.length);
for (var i = 0; i < deserialized.fragmentRefs.length; i++) {
var val = deserialized.fragmentRefs[i];
expect(val).toBe(renderViewWithFragments.fragmentRefs[i]);
};
});
});
describe("RenderViewRef", () => {
it("should be serializable", () => {
var renderViewWithFragments = createMockRenderViewWithFragments();
store.store(renderViewWithFragments, 0);
var deserialized = store.deserializeRenderViewRef(
store.serializeRenderViewRef(renderViewWithFragments.viewRef));
expect(deserialized).toBe(renderViewWithFragments.viewRef);
});
});
describe("RenderFragmentRef", () => {
it("should be serializable", () => {
var renderViewWithFragments = createMockRenderViewWithFragments();
store.store(renderViewWithFragments, 0);
var serialized =
store.serializeRenderFragmentRef(renderViewWithFragments.fragmentRefs[0]);
var deserialized = store.deserializeRenderFragmentRef(serialized);
expect(deserialized).toBe(renderViewWithFragments.fragmentRefs[0]);
});
});
});
});
}
class MockRenderViewRef extends RenderViewRef {
constructor() { super(); }
}
class MockRenderFragmentRef extends RenderFragmentRef {
constructor() { super(); }
}
@@ -18,10 +18,7 @@ import {
import {ObservableWrapper, PromiseWrapper} from 'angular2/src/facade/async';
import {provide} from 'angular2/core';
import {ON_WEB_WORKER} from 'angular2/src/web_workers/shared/api';
import {RenderProtoViewRefStore} from 'angular2/src/web_workers/shared/render_proto_view_ref_store';
import {
RenderViewWithFragmentsStore
} from 'angular2/src/web_workers/shared/render_view_with_fragments_store';
import {RenderStore} from 'angular2/src/web_workers/shared/render_store';
export function main() {
const CHANNEL = "UIMessageBroker Test Channel";
@@ -31,11 +28,7 @@ export function main() {
const RESULT = 20;
const ID = "methodId";
beforeEachProviders(() => [
provide(ON_WEB_WORKER, {useValue: true}),
RenderProtoViewRefStore,
RenderViewWithFragmentsStore
]);
beforeEachProviders(() => [provide(ON_WEB_WORKER, {useValue: true}), RenderStore]);
describe("UIMessageBroker", () => {
var messageBuses;