Acabei de testar alguns navegadores usando esse pouco de JavaScript:
function log_newline(msg, test_value) {
if (!test_value) {
test_value = document.getElementById('test').value;
}
console.log(msg + ': ' + (test_value.match(/\r/) ? 'CR' : '')
+ ' ' + (test_value.match(/\n/) ? 'LF' : ''));
}
log_newline('HTML source');
log_newline('JS string', "foo\nbar");
log_newline('JS template literal', `bar
baz`);
<textarea id="test" name="test">
</textarea>
IE8 e Opera 9 no Windows \r\n. Todos os outros navegadores que testei (Safari 4 e Firefox 3.5 no Windows e Firefox 3.0 no Linux) usam \n. Todos eles podem lidar \nmuito bem ao definir o valor, embora o IE e o Opera os convertam \r\nnovamente em internamente. Há um artigo do SitePoint com mais alguns detalhes chamados Finalizações de linha em Javascript .
Observe também que isso é independente das terminações de linha reais no próprio arquivo HTML (ambos \ne \r\nfornecem os mesmos resultados).
Ao enviar um formulário, todos os navegadores podem canonizar novas linhas %0D%0Ana codificação de URL. Para ver isso, carregue, por exemplo, data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>e pressione o botão enviar. (Alguns navegadores bloqueiam o carregamento da página enviada, mas você pode ver os valores do formulário codificado por URL no console.)
Eu não acho que você realmente precise fazer muita determinação, no entanto. Se você quiser apenas dividir o texto em novas linhas, faça algo assim:
lines = foo.value.split(/\r\n|\r|\n/g);