我有一个<safe-html>
元素工作。在Chrome上进行验证,甚至在Safari上进行后dart2js验证。如果你想让我把它变成pub.dartlang.org上的一个lib,请将它解决。
用法:
<safe-html validator="{{nodeValidator}}">{{someHtml}}</safe-html>
(在你自己的传递validator
是可选如果没有它,我们将使用默认的。)
safe_html.html:
<link rel="import" href="../../../../../../../packages/polymer/polymer.html">
<polymer-element name="safe-html">
<template>
<div id="container"></div>
</template>
<script type="application/dart" src='safe_html.dart'></script>
</polymer-element>
safe_html.dart:
library safe_html;
import 'dart:async';
import "dart:html";
import "package:polymer/polymer.dart";
@CustomTag("safe-html")
class SafeHtml extends PolymerElement {
@published NodeValidator validator = new NodeValidatorBuilder()
..allowHtml5(uriPolicy: new DefaultUriPolicy());
SafeHtml.created() : super.created();
addFragment() {
DivElement container = $['container'];
String fragment = this.text;
container.setInnerHtml(fragment, // Set the fragment in a safe way.
validator: validator);
this.text = ""; // Clear the original fragment passed to the element.
}
attached() {
addFragment();
}
}
class DefaultUriPolicy implements UriPolicy {
DefaultUriPolicy();
// Allow all external, absolute URLs.
RegExp regex = new RegExp(r'(?:http://|https://|//)?.*');
bool allowsUri(String uri) {
return regex.hasMatch(uri);
}
}
如果选择通过自己的NodeValidator
,做到在使用<safe-html>
父元素指定一个getter:
NodeValidator get nodeValidator => new NodeValidatorBuilder()
..allowHtml5(uriPolicy: new ItemUrlPolicy());
正如你可以看到我引用UriPolicy
我保持像uri_policy一个单独的文件。dart:
import 'dart:html';
class ItemUrlPolicy implements UriPolicy {
ItemUrlPolicy();
RegExp regex = new RegExp(r'(?:http://|https://|//)?.*');
bool allowsUri(String uri) {
return regex.hasMatch(uri);
}
}
在GünterZöchbauer和SO上其他有用帖子的作者的许多帮助下。
不应该足以确保'html'不是'null'吗? 'content.setInnerHtml(html,...'之前的if(html == null)html =''' – 2014-10-01 04:13:48
不完全是因为'html'不是'null',它是'this.text = '';'''''''''''''''或者类似的尝试https://github.com/woven/dart-communities/blob/3450a02141e5c748efde178adb7b26dbdcf37573/lib/src/client/components/widgets/safe_html/safe_html.dart这就像它写了一个'null'右里面''之前其他的东西打印 - 只在Safari发布后的Safari浏览器。 –
2014-10-01 04:20:54
我没有Safari来测试,但是你在'this.text ='';'之后分配'html'什么是'this.text'为什么你要用''?''不应该有内容。''只是聚合物的一个占位符,知道在哪里投射聚合物元素的孩子。 –
2014-10-01 04:26:07