<html>
  <head>
    <script>
      window.onload = function() {
        if (window.testRunner) {
          testRunner.dumpAsText();
          testRunner.waitUntilDone();
        }
        var oSelection=window.getSelection();
        document.execCommand("SelectAll", false, false);
        var oRange = oSelection.getRangeAt(0);
        var oInsertedElement = document.getElementById("div");
        oRange.insertNode(oInsertedElement);
        document.execCommand("SelectAll", false);
        oSelection.modify('extend', 'backward', 'lineboundary');
        var oRange = oSelection.getRangeAt(0);
        var oDocumentFragment = oRange.cloneContents();
        var oParent = document.getElementById("ruby");
        oParent.appendChild(oDocumentFragment);
        document.execCommand('SelectToMark',false,false);
        var oRange = oSelection.getRangeAt(0);
        oRange.deleteContents();
        window.requestAnimationFrame(function(){
          oParent.remove();
          var oSuccessMessage = document.createElement("p");
          oSuccessMessage.innerHTML = "If this string appears, and the renderer hasn't crashed, then the bug is fixed.";
          document.body.appendChild(oSuccessMessage);
          if (window.testRunner)
            testRunner.notifyDone();
        });
      };
    </script>
  </head>
  <body>
    <ruby id="ruby">
      <rbc>
        The quick brown fox jumped over the lazy dog.  Now is the time for all good men to come to the aid of their country.  She sell seashells by the seashore.
      </rbc>
      <rt>
        <button>
          <div id="div" />
        </button>
      </rt>
      <rtc />
      *
    </ruby>
  </body>
</html>
