Skip to content

Commit

Permalink
fix: regression with nullish values in partial string attribute values (
Browse files Browse the repository at this point in the history
#1537)

(cherry picked from commit a469e02)
  • Loading branch information
DylanPiercey committed Apr 13, 2020
1 parent 1fed43e commit 144c352
Show file tree
Hide file tree
Showing 12 changed files with 63 additions and 55 deletions.
8 changes: 5 additions & 3 deletions packages/marko/src/runtime/html/AsyncStream.js
Expand Up @@ -6,7 +6,9 @@ var defaultDocument = typeof document != "undefined" && document;
var RenderResult = require("../RenderResult");
var attrsHelper = require("./helpers/attrs");
var markoAttr = require("./helpers/data-marko");
var escapeXml = require("./helpers/escape-xml").x;
var escapeXmlHelper = require("./helpers/escape-xml");
var escapeXmlOrNullish = escapeXmlHelper.x;
var escapeXmlString = escapeXmlHelper.___escapeXML;
var selfClosingTags = require("self-closing-tags");

var voidWriter = { write: function() {} };
Expand Down Expand Up @@ -551,12 +553,12 @@ var proto = (AsyncStream.prototype = {
},

text: function(str) {
this.write(escapeXml(str));
this.write(escapeXmlOrNullish(str));
},

___beginFragment: function(key, component, preserve) {
if (preserve) {
this.write("<!--F#" + escapeXml(key) + "-->");
this.write("<!--F#" + escapeXmlString(key) + "-->");
}
if (this._elStack) {
this._elStack.push(preserve);
Expand Down
3 changes: 2 additions & 1 deletion packages/marko/src/runtime/html/StringWriter.js
@@ -1,6 +1,7 @@
"use strict";

var escapeDoubleQuotes = require("./helpers/escape-xml").d;
var escapeDoubleQuotes = require("./helpers/escape-quotes")
.___escapeDoubleQuotes;

function StringWriter() {
this._content = "";
Expand Down
6 changes: 3 additions & 3 deletions packages/marko/src/runtime/html/helpers/attr.js
@@ -1,8 +1,8 @@
"use strict";

var escape = require("./escape-xml");
var escapeDoubleQuotes = escape.d;
var escapeSingleQuotes = escape.s;
var escapeQuoteHelpers = require("./escape-quotes");
var escapeDoubleQuotes = escapeQuoteHelpers.___escapeDoubleQuotes;
var escapeSingleQuotes = escapeQuoteHelpers.___escapeSingleQuotes;

module.exports = function attr(name, value) {
switch (typeof value) {
Expand Down
6 changes: 3 additions & 3 deletions packages/marko/src/runtime/html/helpers/data-marko.js
@@ -1,8 +1,8 @@
"use strict";

var escapeXml = require("./escape-xml");
var escapeSingleQuotes = escapeXml.s;
var escapeDoubleQuotes = escapeXml.d;
var escapeQuoteHelpers = require("./escape-quotes");
var escapeSingleQuotes = escapeQuoteHelpers.___escapeSingleQuotes;
var escapeDoubleQuotes = escapeQuoteHelpers.___escapeDoubleQuotes;
var FLAG_WILL_RERENDER_IN_BROWSER = 1;
// var FLAG_HAS_BODY_EL = 2;
// var FLAG_HAS_HEAD_EL = 4;
Expand Down
35 changes: 35 additions & 0 deletions packages/marko/src/runtime/html/helpers/escape-quotes.js
@@ -0,0 +1,35 @@
"use strict";

exports.d = function(value) {
return escapeDoubleQuotes(value + "");
};

exports.___escapeDoubleQuotes = escapeDoubleQuotes;

exports.___escapeSingleQuotes = escapeSingleQuotes;

function escapeSingleQuotes(value) {
return escapeQuote(value, "'", "&#39;");
}

function escapeDoubleQuotes(value) {
return escapeQuote(value, '"', "&#34;");
}

function escapeQuote(str, quote, escaped) {
var result = "";
var lastPos = 0;

for (var i = 0, len = str.length; i < len; i++) {
if (str[i] === quote) {
result += str.slice(lastPos, i) + escaped;
lastPos = i + 1;
}
}

if (lastPos) {
return result + str.slice(lastPos);
}

return str;
}
32 changes: 4 additions & 28 deletions packages/marko/src/runtime/html/helpers/escape-xml.js
@@ -1,14 +1,6 @@
"use strict";

exports.d = function(value) {
return escapeQuote(value, '"', "&#34;");
};

exports.s = function(value) {
return escapeQuote(value, "'", "&#39;");
};

exports.x = function(value) {
module.exports.x = function(value) {
if (value == null) {
return "";
}
Expand All @@ -17,28 +9,12 @@ exports.x = function(value) {
return value.toHTML();
}

return escapeBody(value + "");
return escapeXML(value + "");
};

function escapeQuote(str, quote, escaped) {
var result = "";
var lastPos = 0;

for (var i = 0, len = str.length; i < len; i++) {
if (str[i] === quote) {
result += str.slice(lastPos, i) + escaped;
lastPos = i + 1;
}
}

if (lastPos) {
return result + str.slice(lastPos);
}

return str;
}
exports.___escapeXML = escapeXML;

function escapeBody(str) {
function escapeXML(str) {
var len = str.length;
var result = "";
var lastPos = 0;
Expand Down
2 changes: 1 addition & 1 deletion packages/marko/src/runtime/html/helpers/props-script.js
@@ -1,6 +1,6 @@
"use strict";

var escapeDoubleQuotes = require("./escape-xml").d;
var escapeDoubleQuotes = require("./escape-quotes").___escapeDoubleQuotes;
var escapeScript = require("./escape-script-placeholder");
var assignPropsFunction = `
function ap_(p) {
Expand Down
@@ -0,0 +1 @@
<div data-foo="anull"></div><div data-foo="bnull"></div>
@@ -0,0 +1,2 @@
<div data-foo="a"+input.text/>
<div data-foo=`b${input.text}`/>
@@ -0,0 +1 @@
exports.templateData = { text: null };
@@ -0,0 +1,2 @@
<DIV data-foo="anull">
<DIV data-foo="bnull">
20 changes: 4 additions & 16 deletions packages/translator-default/src/tag/native-tag[html]/attributes.js
@@ -1,9 +1,6 @@
import { types as t } from "@marko/babel-types";
import { normalizeTemplateString } from "@marko/babel-utils";
import {
d as escapeDoubleQuoteAttr,
s as escapeSingleQuoteAttr
} from "marko/src/runtime/html/helpers/escape-xml";
import attrHelper from "marko/src/runtime/html/helpers/attr";
import { evaluateAttr } from "../util";

export default function(path, attrs) {
Expand Down Expand Up @@ -40,19 +37,10 @@ export default function(path, attrs) {
continue;
}

curString += ` ${name}`;

if (computed === "") {
attrsObject.properties.push(
t.objectProperty(t.stringLiteral(name), t.booleanLiteral(true))
);
} else {
curString +=
attr.get("value").isObjectExpression() ||
attr.get("value").isArrayExpression()
? `='${escapeSingleQuoteAttr(computed)}'`
: `="${escapeDoubleQuoteAttr(computed)}"`;
const attrString = attrHelper(name, computed);
curString += attrString;

if (attrString) {
attrsObject.properties.push(
t.objectProperty(t.stringLiteral(name), value)
);
Expand Down

0 comments on commit 144c352

Please sign in to comment.