Files
sdk/pkg/template_binding/test/utils.dart
T
jmesserly@google.com 360ea42322 Rename mdv -> template_binding, remove experiemntal apis from dart:html
essentially, we trade off reduce dart:html API surface area for more annoying usage of these APIs. Since Polymer hides most of this, I suspect it won't be too annoying in practice.

Sample usage:

    nodeBind(node).bind(...)

    templateBind(node).model = ...;

R=sigmund@google.com

Review URL: https://codereview.chromium.org//34453003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29057 260f80e4-7a28-3924-810f-c04153c831b5
2013-10-23 02:11:49 +00:00

97 lines
2.4 KiB
Dart

// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library template_binding.test.utils;
import 'dart:html';
import 'package:observe/observe.dart';
import 'package:template_binding/template_binding.dart';
import 'package:unittest/unittest.dart';
import 'package:observe/src/microtask.dart';
export 'package:observe/src/microtask.dart';
final bool parserHasNativeTemplate = () {
var div = new DivElement()..innerHtml = '<table><template>';
return div.firstChild.firstChild != null &&
div.firstChild.firstChild.tagName == 'TEMPLATE';
}();
recursivelySetTemplateModel(element, model, [delegate]) {
for (var node in element.queryAll('*')) {
if (isSemanticTemplate(node)) {
templateBind(node)
..bindingDelegate = delegate
..model = model;
}
}
}
dispatchEvent(type, target) {
target.dispatchEvent(new Event(type, cancelable: false));
}
class FooBarModel extends Observable {
@observable var foo;
@observable var bar;
FooBarModel([this.foo, this.bar]);
}
@reflectable
class FooBarNotifyModel extends ChangeNotifier implements FooBarModel {
var _foo;
var _bar;
FooBarNotifyModel([this._foo, this._bar]);
get foo => _foo;
set foo(value) {
_foo = notifyPropertyChange(#foo, _foo, value);
}
get bar => _bar;
set bar(value) {
_bar = notifyPropertyChange(#bar, _bar, value);
}
}
observeTest(name, testCase) => test(name, wrapMicrotask(testCase));
solo_observeTest(name, testCase) => solo_test(name, wrapMicrotask(testCase));
DivElement testDiv;
createTestHtml(s) {
var div = new DivElement();
div.setInnerHtml(s, treeSanitizer: new NullTreeSanitizer());
testDiv.append(div);
for (var node in div.queryAll('*')) {
if (isSemanticTemplate(node)) TemplateBindExtension.decorate(node);
}
return div;
}
createShadowTestHtml(s) {
var div = new DivElement();
var root = div.createShadowRoot();
root.setInnerHtml(s, treeSanitizer: new NullTreeSanitizer());
testDiv.append(div);
for (var node in root.querySelectorAll('*')) {
if (isSemanticTemplate(node)) TemplateBindExtension.decorate(node);
}
return root;
}
/**
* Sanitizer which does nothing.
*/
class NullTreeSanitizer implements NodeTreeSanitizer {
void sanitizeTree(Node node) {}
}