ClipboardService = require '../lib/clipboard-service' describe "ClipboardService", -> beforeEach -> @onFilePaste = jasmine.createSpy('onFilePaste') @clipboardService = new ClipboardService describe "when html and plain text parts are present", -> beforeEach -> @mockEvent = preventDefault: jasmine.createSpy('preventDefault') clipboardData: getData: -> return 'This is text' if 'text/html' return 'This is plain text' if 'text/plain' return null items: [{ kind: 'string' type: 'text/html' getAsString: -> 'This is text' },{ kind: 'string' type: 'text/plain' getAsString: -> 'This is plain text' }] it "should sanitize the HTML string and call insertHTML", -> spyOn(document, 'execCommand') spyOn(@clipboardService, '_sanitizeInput').andCallThrough() runs -> @clipboardService.onPaste(@mockEvent) waitsFor -> document.execCommand.callCount > 0 runs -> expect(@clipboardService._sanitizeInput).toHaveBeenCalledWith('This is text', 'text/html') [command, a, html] = document.execCommand.mostRecentCall.args expect(command).toEqual('insertHTML') expect(html).toEqual('This is text') describe "when html and plain text parts are present", -> beforeEach -> @mockEvent = preventDefault: jasmine.createSpy('preventDefault') clipboardData: getData: -> return 'This is plain text' if 'text/plain' return null items: [{ kind: 'string' type: 'text/plain' getAsString: -> 'This is plain text' }] it "should sanitize the plain text string and call insertHTML", -> spyOn(document, 'execCommand') spyOn(@clipboardService, '_sanitizeInput').andCallThrough() runs -> @clipboardService.onPaste(@mockEvent) waitsFor -> document.execCommand.callCount > 0 runs -> expect(@clipboardService._sanitizeInput).toHaveBeenCalledWith('This is plain text', 'text/html') [command, a, html] = document.execCommand.mostRecentCall.args expect(command).toEqual('insertHTML') expect(html).toEqual('This is plain text') describe "sanitization", -> tests = [ { in: "" sanitizedAsHTML: "" sanitizedAsPlain: "" }, { in: "Hello World" sanitizedAsHTML: "Hello World" sanitizedAsPlain: "Hello World" }, { in: " Hello World" # Should collapse to 1 space when rendered sanitizedAsHTML: " Hello World" # Preserving 2 spaces sanitizedAsPlain: "  Hello  World" }, { in: " Hello World" sanitizedAsHTML: " Hello World" # Preserving 3 spaces sanitizedAsPlain: "   Hello   World" }, { in: " Hello World" sanitizedAsHTML: " Hello World" # Preserving 4 spaces sanitizedAsPlain: "    Hello    World" }, { in: "Hello\nWorld" sanitizedAsHTML: "Hello
World" # Convert newline to br sanitizedAsPlain: "Hello
World" }, { in: "Hello\rWorld" sanitizedAsHTML: "Hello
World" # Convert carriage return to br sanitizedAsPlain: "Hello
World" }, { in: "Hello\n\n\nWorld" # Never have more than 2 br's in a row sanitizedAsHTML: "Hello

World" # Convert multiple newlines to same number of brs sanitizedAsPlain: "Hello


World" }, { in: " Foo Bar
Baz
" # Strip bad tags sanitizedAsHTML: " Foo Bar Baz" # HTML encode tags for literal display sanitizedAsPlain: "<style>Yo</style> Foo Bar <div>Baz</div>" }, { in: " Yo < script>Boo! < / script >" # Strip non white-list tags and encode malformed ones. sanitizedAsHTML: " Yo < script>Boo! < / script >" # HTML encode tags for literal display sanitizedAsPlain: "<script>Bah</script> Yo < script>Boo! < / script >" }, { in: """ """ # Strip non white-list tags and encode malformed ones. sanitizedAsHTML: "" # HTML encode tags for literal display sanitizedAsPlain: "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1265.21">
<style type="text/css">
li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
ul.ul1 {list-style-type: disc}
</style>
</head>
<body>
<ul class="ul1">
<li class="li1"><b>Packet pickup: </b>I'll pick up my packet at some point on Saturday at Fort Mason. Let me know if you'd like me to get yours. I'll need a photo of your ID and your confirmation number. Also, shirt color preference, I believe. Gray or black? Can't remember...</li>
</ul>
</body>
</html>" } ] it "sanitizes plain text properly", -> for test in tests expect(@clipboardService._sanitizeInput(test.in, "text/plain")).toBe test.sanitizedAsPlain it "sanitizes html text properly", -> for test in tests expect(@clipboardService._sanitizeInput(test.in, "text/html")).toBe test.sanitizedAsHTML