JSFiddle - React, Tailwind, and code Playground

HTML

<pre id="log"></pre>

JavaScript

if (typeof navigator !== 'undefined') {
  log(navigator.userAgent);
}

// latin
detectMaxStringLength('m');

setTimeout(function() {
  // russian
  detectMaxStringLength('я');

  setTimeout(function() {
    // emoji
    detectMaxStringLength('😀');
  }, 100);
}, 100);

function log(message) {
  if (typeof document !== 'undefined') {
    document.getElementById('log').innerText += message + '\n';
  } else {
    console.log(message);
  }
}

function detectMaxStringLength(char) {
  var s = char;

  console.log('Fast search...');
  while (true) {
    try {
      s = s + s;
    } catch (e) {
      console.log(e.name, e.message);
      console.log('Fast search:', s.length);
      break;
    }
  }

  console.log('Slow search...');
  var length = s.length;
  while (true) {
    try {
      length = Math.max(length >> 1, 1);
      s = s + (s.substr(0, length));
      console.log('Slow search:', s.length);
    } catch (e) {
      console.log(e.name, e.message);
      console.log('Slow search:', s.length);
      if (length === 1) {
        break;
      }
    }
  }

  log('Max string length for "' + char + '": ' + s.length);
}