diff --git a/addons/web/static/lib/qweb/qweb-test-output.xml b/addons/web/static/lib/qweb/qweb-test-output.xml
index 1135ad9f251..8725bb00a8f 100644
--- a/addons/web/static/lib/qweb/qweb-test-output.xml
+++ b/addons/web/static/lib/qweb/qweb-test-output.xml
@@ -9,6 +9,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -20,4 +33,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/web/static/lib/qweb/qweb-test.js.html b/addons/web/static/lib/qweb/qweb-test.js.html
index b768ed9a5a8..e6095a6259a 100644
--- a/addons/web/static/lib/qweb/qweb-test.js.html
+++ b/addons/web/static/lib/qweb/qweb-test.js.html
@@ -35,11 +35,22 @@
assert.equal(render('esc-variable', {ok: 'ok'}), "ok", "Render a string variable");
assert.equal(render('esc-toescape', {ok: ''}), "<ok>", "Render a string with data to escape");
});
+ QUnit.test("Formatted escaped output", function (assert) {
+ assert.equal(render('escf-literal', {}), "ok", "Render a literal string");
+ assert.equal(render('escf-variable', {ok: 'ok'}), "ok", "Render a string variable");
+ assert.equal(render('escf-toescape', {ok: ''}), "<ok>", "Render a string with data to escape");
+ assert.equal(render('escf-mix', {ok: 'ok'}), "[ok]", "Render a string with additions around the format");
+ });
QUnit.test("Basic unescaped output", function (assert) {
assert.equal(render('raw-literal', {}), "ok", "Render a literal string");
assert.equal(render('raw-variable', {ok: 'ok'}), "ok", "Render a string variable");
assert.equal(render('raw-notescaped', {ok: ''}), "", "Render a string with data not escaped");
});
+ QUnit.test("Formatted unescaped output", function (assert) {
+ assert.equal(render('rawf-literal', {}), "ok", "Render a literal string");
+ assert.equal(render('rawf-variable', {ok: 'ok'}), "ok", "Render a string variable");
+ assert.equal(render('rawf-notescaped', {ok: ''}), "", "Render a string with data not escaped");
+ });
QUnit.module("Context-setting tests", {
setup: function () {
diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js
index e4a792e856f..08208fbe3a6 100644
--- a/addons/web/static/lib/qweb/qweb2.js
+++ b/addons/web/static/lib/qweb/qweb2.js
@@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var QWeb2 = {
expressions_cache: {},
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,typeof,eval,void,Math,RegExp,Array,Object,Date'.split(','),
- ACTIONS_PRECEDENCE: 'foreach,if,call,set,esc,raw,js,debug,log'.split(','),
+ ACTIONS_PRECEDENCE: 'foreach,if,call,set,escf,esc,rawf,raw,js,debug,log'.split(','),
WORD_REPLACEMENT: {
'and': '&&',
'or': '||',
@@ -739,11 +739,21 @@ QWeb2.Element = (function() {
}
},
compile_action_esc : function(value) {
- this.top("r.push(context.engine.tools.html_escape(" + (this.format_expression(value)) + "));");
+ this.top("r.push(context.engine.tools.html_escape("
+ + this.format_expression(value)
+ + "));");
+ },
+ compile_action_escf : function (value) {
+ this.top("r.push(context.engine.tools.html_escape("
+ + this.string_interpolation(value)
+ + '));');
},
compile_action_raw : function(value) {
this.top("r.push(" + (this.format_expression(value)) + ");");
},
+ compile_action_rawf: function (value) {
+ this.top('r.push(' + this.string_interpolation(value) + ');');
+ },
compile_action_js : function(value) {
this.top("(function(" + value + ") {");
this.bottom("})(dict);");