<html>
  <head>
    <script>
      window.onload = function() {
        if (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 (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>
