Skip to content

Commit df940eb

Browse files
committed
Add support for write/writeln called with multiple arguments.
1 parent 3737e3c commit df940eb

File tree

3 files changed

+120
-20
lines changed

3 files changed

+120
-20
lines changed

postscribe.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,14 @@
498498
options.afterWrite(str);
499499
}
500500

501-
set(doc, { write: write, writeln: function(str) { write(str + '\n'); } });
501+
set(doc, {
502+
write: function(){
503+
return write(toArray(arguments).join(''));
504+
},
505+
writeln: function(str) {
506+
return write(toArray(arguments).join('') + '\n');
507+
}
508+
});
502509

503510
// Override window.onerror
504511
var oldOnError = active.win.onerror || doNothing;

test/helpers.js

+29-19
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,14 @@ var IFrame = function(id) {
7676
ifr.doc._write = ifr.doc.write;
7777
ifr.doc._writeln = ifr.doc.writeln;
7878

79-
ifr.doc.write = function(str) {
80-
ifr.doc._write(str);
79+
ifr.doc.write = function() {
80+
ifr.doc._write.apply(ifr.doc, [].slice.call(arguments));
8181
}
8282

83-
ifr.doc.writeln = function(str) {
84-
ifr.doc.write(str+'\n');
83+
ifr.doc.writeln = function() {
84+
var args = [].slice.call(arguments);
85+
args.push('\n');
86+
ifr.doc.write.apply(ifr.doc, args);
8587
}
8688

8789
ifr.doc.writeInline = function(js) {
@@ -197,8 +199,8 @@ var execute = function(name, tags, options) {
197199
}, 'Rendering Complete');
198200
},
199201

200-
compareInnerHtml: function(str) {
201-
self.eqPrefix(innerHtml(self.div), tag.id+':'+str);
202+
compareInnerHtml: function() {
203+
self.eqPrefix(innerHtml(self.div), tag.id+':'+[].slice.call(arguments).join(''));
202204
}
203205

204206
};
@@ -238,28 +240,36 @@ var execute = function(name, tags, options) {
238240
autoFix: true
239241
});
240242

241-
self.doc.write = function(str) {
242-
console.log('native docwrite', str);
243+
self.doc.write = function() {
244+
var args = [].slice.call(arguments);
245+
console.log('native docwrite', args);
243246

244247
if(parser) {
245-
parser.append(str);
246-
str = '';
247-
for(var tok; tok = parser.readToken();) {
248-
str += tok.text;
249-
}
248+
$.each(args, function(index, value) {
249+
parser.append(value);
250+
});
251+
args = (function() {
252+
var str = '';
253+
for(var tok; tok = parser.readToken();) {
254+
str += tok.text;
255+
}
256+
return [str];
257+
})();
250258
}
251259

252-
260+
//TODO(dbrans): Add comment explaining why this is commented out.
253261
//str = str.replace(/\.js/g, '.js?'+Math.random());
254262

255-
self.written = self.written + str;
263+
$.each(args, function(index, value) {
264+
self.written = self.written + value;
265+
});
256266

257267
if(options.useInnerHtml) {
258268
self.div.innerHTML = self.written;
259269
} else {
260-
self.doc._write(str);
270+
self.doc._write.apply(self.doc, args);
261271
}
262-
self.compareInnerHtml(str);
272+
self.compareInnerHtml.apply(self, args);
263273
};
264274

265275
return self;
@@ -407,8 +417,8 @@ var execute = function(name, tags, options) {
407417

408418
ifr = IFrame('[ACTUAL]'+name);
409419

410-
ifr.doc.write = function(str) {
411-
ok(false, ifr.doc.currentTag.id + ' - document.write outside: ' + str);
420+
ifr.doc.write = function() {
421+
ok(false, ifr.doc.currentTag.id + ' - document.write outside: ' + [].slice.call(arguments).join(''));
412422
};
413423

414424
for(i = 0; tag = tags[i]; i++) {

test/test.js

+83
Original file line numberDiff line numberDiff line change
@@ -447,5 +447,88 @@ $(document).ready(function(){
447447
}
448448

449449

450+
module('write with multiple arguments');
451+
setOptions({});
452+
453+
testWrite('wma: split mid-element', function(ctx) {
454+
ctx.write('<i', 'mg alt="foo">');
455+
ctx.eq($('img', ctx.doc).attr('alt'));
456+
});
457+
458+
testWrite('wma: split mid-attribute', function(ctx) {
459+
ctx.write('<img a', 'lt="foo">');
460+
ctx.eq($('img', ctx.doc).attr('alt'));
461+
});
462+
463+
testWrite('wma: split mid-attribute-value', function(ctx) {
464+
ctx.write('<img alt="f', 'oo">');
465+
ctx.eq($('img', ctx.doc).attr('alt'));
466+
});
467+
468+
testWrite('wma: empty strings', function(ctx) {
469+
ctx.write('', '<im', '', 'g ', '', 'al', '', 't="f', '', 'oo">', '');
470+
ctx.eq($('img', ctx.doc).attr('alt'));
471+
});
472+
473+
testWrite('wma: docwrite outside parent of script', function(ctx) {
474+
ctx.write('<div>A<script type="', 'text/javascript">\n',
475+
'doc', 'ument.write("B</div>C");\n</script>D');
476+
});
477+
478+
testWrite('wma: SW9', function(ctx) {
479+
ctx.write('<div><i></i></div>', 'foo', '<div>bar', '<i></i>');
480+
});
481+
482+
testWrite('wma: SW10', function(ctx) {
483+
ctx.write('<div><b><i></i></b></div>', 'foo', '<div>bar<i>', '</i>bla');
484+
});
485+
486+
testWrite("wma: TS2", function(ctx) {
487+
ctx.write('<div><i>', '<div>foo', '<div><i>');
488+
});
489+
490+
491+
492+
module('writeln with multiple arguments');
493+
setOptions({});
494+
495+
testWrite('wlma: split mid-element', function(ctx) {
496+
ctx.writeln('<i', 'mg alt="foo">');
497+
ctx.eq($('img', ctx.doc).attr('alt'));
498+
});
499+
500+
testWrite('wlma: split mid-attribute', function(ctx) {
501+
ctx.writeln('<img a', 'lt="foo">');
502+
ctx.eq($('img', ctx.doc).attr('alt'));
503+
});
504+
505+
testWrite('wlma: split mid-attribute-value', function(ctx) {
506+
ctx.writeln('<img alt="f', 'oo">');
507+
ctx.eq($('img', ctx.doc).attr('alt'));
508+
});
509+
510+
testWrite('wlma: empty strings', function(ctx) {
511+
ctx.writeln('', '<im', '', 'g ', '', 'al', '', 't="f', '', 'oo">', '');
512+
ctx.eq($('img', ctx.doc).attr('alt'));
513+
});
514+
515+
testWrite('wlma: docwrite outside parent of script', function(ctx) {
516+
ctx.writeln('<div>A<script type="', 'text/javascript">\n',
517+
'doc', 'ument.write("B</div>C");\n</script>D');
518+
});
519+
520+
testWrite('wlma: SW9', function(ctx) {
521+
ctx.writeln('<div><i></i></div>', 'foo', '<div>bar', '<i></i>');
522+
});
523+
524+
testWrite('wlma: SW10', function(ctx) {
525+
ctx.writeln('<div><b><i></i></b></div>', 'foo', '<div>bar<i>', '</i>bla');
526+
});
527+
528+
testWrite("wlma: TS2", function(ctx) {
529+
ctx.writeln('<div><i>', '<div>foo', '<div><i>');
530+
});
531+
532+
450533
});
451534

0 commit comments

Comments
 (0)