126 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {Inject, Injectable} from 'angular2/src/di/annotations_impl';
 | 
						|
import {MapWrapper, ListWrapper, List, Map} from 'angular2/src/facade/collection';
 | 
						|
import {PromiseWrapper, Promise} from 'angular2/src/facade/async';
 | 
						|
import {DOM} from 'angular2/src/dom/dom_adapter';
 | 
						|
 | 
						|
import {DomRenderer, DOCUMENT_TOKEN} from 'angular2/src/render/dom/dom_renderer';
 | 
						|
import {DefaultDomCompiler} from 'angular2/src/render/dom/compiler/compiler';
 | 
						|
import {DomView} from 'angular2/src/render/dom/view/view';
 | 
						|
import {RenderViewRef, ProtoViewDto, ViewDefinition, EventDispatcher, DirectiveMetadata} from 'angular2/src/render/api';
 | 
						|
import {resolveInternalDomView} from 'angular2/src/render/dom/view/view';
 | 
						|
import {el, dispatchEvent} from 'angular2/test_lib';
 | 
						|
 | 
						|
export class TestView {
 | 
						|
  rawView:DomView;
 | 
						|
  viewRef:RenderViewRef;
 | 
						|
  events:List;
 | 
						|
 | 
						|
  constructor(viewRef:RenderViewRef) {
 | 
						|
    this.viewRef = viewRef;
 | 
						|
    this.rawView = resolveInternalDomView(viewRef);
 | 
						|
    this.events = [];
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@IMPLEMENTS(EventDispatcher)
 | 
						|
class LoggingEventDispatcher {
 | 
						|
  log:List;
 | 
						|
 | 
						|
  constructor(log:List) {
 | 
						|
    this.log = log;
 | 
						|
  }
 | 
						|
 | 
						|
  dispatchEvent(
 | 
						|
    elementIndex:number, eventName:string, locals:Map<string, any>
 | 
						|
  ) {
 | 
						|
    ListWrapper.push(this.log, [elementIndex, eventName, locals]);
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
@Injectable()
 | 
						|
export class DomTestbed {
 | 
						|
  renderer:DomRenderer;
 | 
						|
  compiler:DefaultDomCompiler;
 | 
						|
  rootEl;
 | 
						|
 | 
						|
  constructor(renderer:DomRenderer, compiler:DefaultDomCompiler, @Inject(DOCUMENT_TOKEN) document) {
 | 
						|
    this.renderer = renderer;
 | 
						|
    this.compiler = compiler;
 | 
						|
    this.rootEl = el('<div id="root"></div>');
 | 
						|
    var oldRoots = DOM.querySelectorAll(document, '#root');
 | 
						|
    for (var i=0; i<oldRoots.length; i++) {
 | 
						|
      DOM.remove(oldRoots[i]);
 | 
						|
    }
 | 
						|
    DOM.appendChild(DOM.querySelector(document, 'body'), this.rootEl);
 | 
						|
  }
 | 
						|
 | 
						|
  compileAll(directivesOrViewDefinitions:List):Promise<List<ProtoViewDto>> {
 | 
						|
    return PromiseWrapper.all(
 | 
						|
      ListWrapper.map(directivesOrViewDefinitions, (entry) => {
 | 
						|
        if (entry instanceof DirectiveMetadata) {
 | 
						|
          return this.compiler.compileHost(entry);
 | 
						|
        } else {
 | 
						|
          return this.compiler.compile(entry);
 | 
						|
        }
 | 
						|
      })
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  _createTestView(viewRef:RenderViewRef) {
 | 
						|
    var testView = new TestView(viewRef);
 | 
						|
    this.renderer.setEventDispatcher(viewRef, new LoggingEventDispatcher(testView.events));
 | 
						|
    return testView;
 | 
						|
  }
 | 
						|
 | 
						|
  createRootView(rootProtoView:ProtoViewDto):TestView {
 | 
						|
    var viewRef = this.renderer.createRootHostView(rootProtoView.render, '#root');
 | 
						|
    this.renderer.hydrateView(viewRef);
 | 
						|
    return this._createTestView(viewRef);
 | 
						|
  }
 | 
						|
 | 
						|
  createComponentView(parentViewRef:RenderViewRef, boundElementIndex:number, componentProtoView:ProtoViewDto):TestView {
 | 
						|
    var componentViewRef = this.renderer.createView(componentProtoView.render);
 | 
						|
    this.renderer.attachComponentView(parentViewRef, boundElementIndex, componentViewRef);
 | 
						|
    this.renderer.hydrateView(componentViewRef);
 | 
						|
    return this._createTestView(componentViewRef);
 | 
						|
  }
 | 
						|
 | 
						|
  createRootViews(protoViews:List<ProtoViewDto>):List<TestView> {
 | 
						|
    var views = [];
 | 
						|
    var lastView = this.createRootView(protoViews[0]);
 | 
						|
    ListWrapper.push(views, lastView);
 | 
						|
    for (var i=1; i<protoViews.length; i++) {
 | 
						|
      lastView = this.createComponentView(lastView.viewRef, 0, protoViews[i]);
 | 
						|
      ListWrapper.push(views, lastView);
 | 
						|
    }
 | 
						|
    return views;
 | 
						|
  }
 | 
						|
 | 
						|
  destroyComponentView(parentViewRef:RenderViewRef, boundElementIndex:number, componentView:RenderViewRef) {
 | 
						|
    this.renderer.dehydrateView(componentView);
 | 
						|
    this.renderer.detachComponentView(parentViewRef, boundElementIndex, componentView);
 | 
						|
  }
 | 
						|
 | 
						|
  createViewInContainer(parentViewRef:RenderViewRef, boundElementIndex:number, atIndex:number, protoView:ProtoViewDto):TestView {
 | 
						|
    var viewRef = this.renderer.createView(protoView.render);
 | 
						|
    this.renderer.attachViewInContainer(parentViewRef, boundElementIndex, atIndex, viewRef);
 | 
						|
    this.renderer.hydrateView(viewRef);
 | 
						|
    return this._createTestView(viewRef);
 | 
						|
  }
 | 
						|
 | 
						|
  destroyViewInContainer(parentViewRef:RenderViewRef, boundElementIndex:number, atIndex:number, viewRef:RenderViewRef) {
 | 
						|
    this.renderer.dehydrateView(viewRef);
 | 
						|
    this.renderer.detachViewInContainer(parentViewRef, boundElementIndex, atIndex, viewRef);
 | 
						|
    this.renderer.destroyView(viewRef);
 | 
						|
  }
 | 
						|
 | 
						|
  triggerEvent(viewRef:RenderViewRef, boundElementIndex:number, eventName:string) {
 | 
						|
    var element = resolveInternalDomView(viewRef).boundElements[boundElementIndex];
 | 
						|
    dispatchEvent(element, eventName);
 | 
						|
  }
 | 
						|
 | 
						|
}
 |