/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.safehtml.client; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * A tag interface that facilitates compile-time binding of HTML templates to * generate SafeHtml strings. * * <p> * Example usage: * * <pre> * public interface MyTemplate extends SafeHtmlTemplates { * @Template("<span class=\"{3}\">{0}: <a href=\"{1}\">{2}</a></span>") * SafeHtml messageWithLink(SafeHtml message, String url, String linkText, * String style); * } * * private static final MyTemplate TEMPLATE = GWT.create(MyTemplate.class); * * public void useTemplate(...) { * SafeHtml message; * String url; * String linkText; * String style; * // ... * SafeHtml messageWithLink = * TEMPLATE.messageWithLink(message, url, linkText, style); * } * </pre> * * <p> * Instantiating a {@code SafeHtmlTemplates} interface with {@code GWT.create()} * returns an instance of an implementation that is generated at compile time. * The code generator parses the value of each template method's * {@code @Template} annotation as an HTML template, with template * variables denoted by curly-brace placeholders that refer by index to the * corresponding template method parameter. * * <p> * The code generator's template parser is lenient, and will accept HTML that is * not well-formed; the accepted set of HTML is similar to what is typically * accepted by browsers. However, the following constraints on the HTML template * are enforced: * * <ol> * <li>Template variables may not appear in a JavaScript context (inside a * {@code <script>} tag, or in an {@code onClick} etc handler).</li> * <li>Template variables may not appear inside HTML comments.</li> * <li>If a template variable appears inside the value of an attribute, the * value must be enclosed in quotes.</li> * <li>Template variables may not appear in the context of an attribute name, * nor elsewhere inside a tag except within a quoted attribute value.</li> * <li>The template must end in "inner HTML" context, and not inside a tag or * attribute.</li> * </ol> * * <p> * <b>Limitation:</b> For templates with template variables in a CSS (style) * context, the current implementation of the code generator does not guarantee * that the generated template method produces values that adhere to the * {@code SafeHtml} type contract. When the code generator encounters a template * with a variable in a style attribute or tag, such as, * {@code <div style=\"{0}\">}, a warning will be emitted. In this * case, developers are advised to carefully review uses of this template to * ensure that parameters passed to the template are from a trusted source or * suitably sanitized. * * <p> Future implementations of the code generator may place additional * constraints on template parameters in style contexts. */ public interface SafeHtmlTemplates { /** * The HTML template. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Template { String value(); } }