2014-09-19 16:38:37 -07:00
|
|
|
library angular.core.facade.dom;
|
2014-09-18 14:56:38 -07:00
|
|
|
|
|
|
|
|
import 'dart:html';
|
2015-01-13 13:06:09 -08:00
|
|
|
import 'dart:js' show JsObject, context;
|
2014-09-18 14:56:38 -07:00
|
|
|
|
2015-01-30 09:43:21 +01:00
|
|
|
export 'dart:html' show
|
|
|
|
|
document,
|
|
|
|
|
DocumentFragment,
|
|
|
|
|
Element,
|
|
|
|
|
location,
|
|
|
|
|
Node,
|
|
|
|
|
StyleElement,
|
|
|
|
|
TemplateElement,
|
|
|
|
|
Text,
|
|
|
|
|
window;
|
2014-09-19 16:38:37 -07:00
|
|
|
|
2014-11-11 17:33:47 -08:00
|
|
|
// TODO(tbosch): Is there a builtin one? Why is Dart
|
|
|
|
|
// removing unknown elements by default?
|
|
|
|
|
class IdentitySanitizer implements NodeTreeSanitizer {
|
|
|
|
|
void sanitizeTree(Node node) {}
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-29 09:50:49 -08:00
|
|
|
final _window = context['window'];
|
|
|
|
|
final _gc = context['gc'];
|
2015-01-13 13:06:09 -08:00
|
|
|
|
2015-01-29 09:50:49 -08:00
|
|
|
void gc() {
|
2015-01-13 13:06:09 -08:00
|
|
|
if (_gc != null) {
|
|
|
|
|
_gc.apply(const []);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-11 17:33:47 -08:00
|
|
|
final identitySanitizer = new IdentitySanitizer();
|
|
|
|
|
|
2014-09-18 14:56:38 -07:00
|
|
|
class DOM {
|
2015-01-29 09:50:49 -08:00
|
|
|
static query(String selector) => document.querySelector(selector);
|
|
|
|
|
|
|
|
|
|
static Element querySelector(el, String selector) =>
|
|
|
|
|
el.querySelector(selector);
|
|
|
|
|
|
|
|
|
|
static ElementList querySelectorAll(el, String selector) =>
|
|
|
|
|
el.querySelectorAll(selector);
|
|
|
|
|
|
|
|
|
|
static void on(EventTarget element, String event, callback(arg)) {
|
2015-01-12 11:50:54 -08:00
|
|
|
// 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);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static void dispatchEvent(EventTarget el, Event evt) {
|
2015-01-12 11:50:54 -08:00
|
|
|
el.dispatchEvent(evt);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static MouseEvent createMouseEvent(String eventType) =>
|
|
|
|
|
new MouseEvent(eventType, canBubble: true);
|
2015-02-03 07:27:09 -08:00
|
|
|
static createEvent(eventType) =>
|
|
|
|
|
new Event(eventType, canBubble: true);
|
2015-01-29 09:50:49 -08:00
|
|
|
static String getInnerHTML(Element el) => el.innerHtml;
|
|
|
|
|
static String getOuterHTML(Element el) => el.outerHtml;
|
|
|
|
|
static void setInnerHTML(Element el, String value) {
|
2014-09-18 14:56:38 -07:00
|
|
|
el.innerHtml = value;
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static Node firstChild(el) => el.firstChild;
|
|
|
|
|
static Node nextSibling(Node el) => el.nextNode;
|
|
|
|
|
static Element parentElement(Node el) => el.parent;
|
|
|
|
|
static List<Node> childNodes(Node el) => el.childNodes;
|
|
|
|
|
static List childNodesAsList(Node el) => childNodes(el).toList();
|
|
|
|
|
static void clearNodes(Node el) {
|
|
|
|
|
el.nodes = const [];
|
2014-10-27 11:47:13 -04:00
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static void appendChild(Node el, Node node) {
|
2014-11-11 17:33:47 -08:00
|
|
|
el.append(node);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static void removeChild(Element el, Node node) {
|
2014-11-21 15:13:01 -08:00
|
|
|
node.remove();
|
|
|
|
|
}
|
2015-01-30 09:43:21 +01:00
|
|
|
static Element remove(Element el) {
|
|
|
|
|
return el..remove();
|
|
|
|
|
}
|
|
|
|
|
static insertBefore(Node el, node) {
|
2015-01-02 14:23:59 -08:00
|
|
|
el.parentNode.insertBefore(node, el);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static void insertAllBefore(Node el, Iterable<Node> nodes) {
|
2015-01-02 14:23:59 -08:00
|
|
|
el.parentNode.insertAllBefore(nodes, el);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static void insertAfter(Node el, Node node) {
|
2014-11-21 15:13:01 -08:00
|
|
|
el.parentNode.insertBefore(node, el.nextNode);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static String getText(Node el) => el.text;
|
2015-01-30 09:43:21 +01:00
|
|
|
static void setText(Node el, String value) {
|
|
|
|
|
el.text = value;
|
2014-09-26 11:20:08 -07:00
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static TemplateElement createTemplate(String html) {
|
2014-11-11 17:33:47 -08:00
|
|
|
var t = new TemplateElement();
|
2015-01-29 09:50:49 -08:00
|
|
|
t.setInnerHtml(html, treeSanitizer: identitySanitizer);
|
2014-09-28 13:55:01 -07:00
|
|
|
return t;
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static Element createElement(String tagName, [HtmlDocument doc = null]) {
|
2014-11-07 14:30:04 -08:00
|
|
|
if (doc == null) doc = document;
|
|
|
|
|
return doc.createElement(tagName);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static createScriptTag(String attrName, String attrValue,
|
|
|
|
|
[HtmlDocument doc = null]) {
|
2015-01-02 14:23:59 -08:00
|
|
|
if (doc == null) doc = document;
|
|
|
|
|
var el = doc.createElement("SCRIPT");
|
|
|
|
|
el.setAttribute(attrName, attrValue);
|
|
|
|
|
return el;
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static clone(Node node) => node.clone(true);
|
|
|
|
|
static bool hasProperty(Element element, String name) =>
|
|
|
|
|
new JsObject.fromBrowserObject(element).hasProperty(name);
|
|
|
|
|
static List<Node> getElementsByClassName(Element element, String name) =>
|
|
|
|
|
element.getElementsByClassName(name);
|
|
|
|
|
static List<Node> getElementsByTagName(Element element, String name) =>
|
|
|
|
|
element.querySelectorAll(name);
|
|
|
|
|
static List<String> classList(Element element) => element.classes.toList();
|
|
|
|
|
static void addClass(Element element, String classname) {
|
2014-11-11 17:33:47 -08:00
|
|
|
element.classes.add(classname);
|
|
|
|
|
}
|
2015-02-05 14:03:58 -08:00
|
|
|
static void removeClass(Element element, String classname) {
|
|
|
|
|
element.classes.remove(classname);
|
|
|
|
|
}
|
2015-01-29 09:50:49 -08:00
|
|
|
static bool hasClass(Element element, String classname) =>
|
|
|
|
|
element.classes.contains(classname);
|
|
|
|
|
|
2015-02-05 16:49:42 -08:00
|
|
|
static setStyle(Element element, String stylename, String stylevalue) {
|
|
|
|
|
element.style.setProperty(stylename, stylevalue);
|
|
|
|
|
}
|
|
|
|
|
static removeStyle(Element element, String stylename) {
|
|
|
|
|
element.style.removeProperty(stylename);
|
|
|
|
|
}
|
|
|
|
|
static getStyle(Element element, String stylename) {
|
|
|
|
|
return element.style.getPropertyValue(stylename);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-29 09:50:49 -08:00
|
|
|
static String tagName(Element element) => element.tagName;
|
|
|
|
|
|
|
|
|
|
static Map<String, String> attributeMap(Element element) =>
|
|
|
|
|
element.attributes;
|
|
|
|
|
|
|
|
|
|
static String getAttribute(Element element, String attribute) =>
|
|
|
|
|
element.getAttribute(attribute);
|
|
|
|
|
|
2015-01-30 09:43:21 +01:00
|
|
|
static void setAttribute(Element element, String name, String value) {
|
|
|
|
|
element.setAttribute(name, value);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-29 09:50:49 -08:00
|
|
|
static Node templateAwareRoot(Element el) =>
|
|
|
|
|
el is TemplateElement ? el.content : el;
|
|
|
|
|
|
|
|
|
|
static HtmlDocument createHtmlDocument() =>
|
|
|
|
|
document.implementation.createHtmlDocument('fakeTitle');
|
|
|
|
|
|
|
|
|
|
static HtmlDocument defaultDoc() => document;
|
|
|
|
|
static bool elementMatches(n, String selector) =>
|
|
|
|
|
n is Element && n.matches(selector);
|
2014-09-26 11:20:08 -07:00
|
|
|
}
|