tinymce.full.js
function handleLastBlockCharacterDelete(isForward, rng) {
          var path, blockElm, newBlockElm, clonedBlockElm, sibling,
            container, offset, br, currentFormatNodes;

          function cloneTextBlockWithFormats(blockElm, node) {
            currentFormatNodes = $(node).parents().filter(function (idx, node) {
              return !!editor.schema.getTextInlineElements()[node.nodeName];
            });

            newBlockElm = blockElm.cloneNode(false);

            currentFormatNodes = Tools.map(currentFormatNodes, function (formatNode) {
              formatNode = formatNode.cloneNode(false);

              if (newBlockElm.hasChildNodes()) {
                formatNode.appendChild(newBlockElm.firstChild);
                newBlockElm.appendChild(formatNode);
              } else {
                newBlockElm.appendChild(formatNode);
              }

              newBlockElm.appendChild(formatNode);

              return formatNode;
            });

            if (currentFormatNodes.length) {
              br = dom.create('br');
              currentFormatNodes[0].appendChild(br);
              dom.replace(newBlockElm, blockElm);

              rng.setStartBefore(br);
              rng.setEndBefore(br);
              editor.selection.setRng(rng);

              return br;
            }

            return null;
          }

          function isTextBlock(node) {
            return node && editor.schema.getTextBlockElements()[node.tagName];
          }

          if (!rng.collapsed) {
            return;
          }

          container = rng.startContainer;
          offset = rng.startOffset;
          blockElm = dom.getParent(container, dom.isBlock);
          if (!isTextBlock(blockElm)) {
            return;
          }

          if (container.nodeType == 1) {
            container = container.childNodes[offset];
            if (container && container.tagName != 'BR') {
              return;
            }

            if (isForward) {
              sibling = blockElm.nextSibling;
            } else {
              sibling = blockElm.previousSibling;
            }

            if (dom.isEmpty(blockElm) && isTextBlock(sibling) && dom.isEmpty(sibling)) {
              if (cloneTextBlockWithFormats(blockElm, container)) {
                dom.remove(sibling);
                return true;
              }
            }
          } else if (container.nodeType == 3) {
            path = NodePath.create(blockElm, container);
            clonedBlockElm = blockElm.cloneNode(true);
            container = NodePath.resolve(clonedBlockElm, path);

            if (isForward) {
              if (offset >= container.data.length) {
                return;
              }

              container.deleteData(offset, 1);
            } else {
              if (offset <= 0) {
                return;
              }

              container.deleteData(offset - 1, 1);
            }

            if (dom.isEmpty(clonedBlockElm)) {
              return cloneTextBlockWithFormats(blockElm, container);
            }
          }
        }
function handleLastBlockCharacterDelete(isForward, rng) {
          var path, blockElm, newBlockElm, clonedBlockElm, sibling,
            container, offset, br, currentFormatNodes;

          function cloneTextBlockWithFormats(blockElm, node) {
            currentFormatNodes = $(node).parents().filter(function (idx, node) {
              return !!editor.schema.getTextInlineElements()[node.nodeName];
            });

            newBlockElm = blockElm.cloneNode(false);

            currentFormatNodes = Tools.map(currentFormatNodes, function (formatNode) {
              formatNode = formatNode.cloneNode(false);

              if (newBlockElm.hasChildNodes()) {
                formatNode.appendChild(newBlockElm.firstChild);
                newBlockElm.appendChild(formatNode);
              } else {
                newBlockElm.appendChild(formatNode);
              }

              newBlockElm.appendChild(formatNode);

              return formatNode;
            });

            if (currentFormatNodes.length) {
              br = dom.create('br');
              currentFormatNodes[0].appendChild(br);
              dom.replace(newBlockElm, blockElm);

              rng.setStartBefore(br);
              rng.setEndBefore(br);
              editor.selection.setRng(rng);

              return br;
            }

            return null;
          }

          function isTextBlock(node) {
            return node && editor.schema.getTextBlockElements()[node.tagName];
          }

          if (!rng.collapsed) {
            return;
          }

          container = rng.startContainer;
          offset = rng.startOffset;
          blockElm = dom.getParent(container, dom.isBlock);
          if (!isTextBlock(blockElm)) {
            return;
          }

          if (container.nodeType == 1) {
            container = container.childNodes[offset];
            if (container && container.tagName != 'BR') {
              return;
            }

            if (isForward) {
              sibling = blockElm.nextSibling;
            } else {
              sibling = blockElm.previousSibling;
            }

            if (dom.isEmpty(blockElm) && isTextBlock(sibling) && dom.isEmpty(sibling)) {
              if (cloneTextBlockWithFormats(blockElm, container)) {
                dom.remove(sibling);
                return true;
              }
            }
          } else if (container.nodeType == 3) {
            path = NodePath.create(blockElm, container);
            clonedBlockElm = blockElm.cloneNode(true);
            container = NodePath.resolve(clonedBlockElm, path);

            if (isForward) {
              if (offset >= container.data.length) {
                return;
              }

              container.deleteData(offset, 1);
            } else {
              if (offset <= 0) {
                return;
              }

              container.deleteData(offset - 1, 1);
            }

            if (dom.isEmpty(clonedBlockElm)) {
              return cloneTextBlockWithFormats(blockElm, container);
            }
          }
        }
function handleLastBlockCharacterDelete ( isForward , rng ) { var path , blockElm , newBlockElm , clonedBlockElm , sibling , container , offset , br , currentFormatNodes ; function cloneTextBlockWithFormats ( blockElm , node ) { currentFormatNodes = $ ( node ) . parents ( ) . filter ( function ( idx , node ) { return ! ! editor . schema . getTextInlineElements ( ) [ node . nodeName ] ; } ) ; newBlockElm = blockElm . cloneNode ( false ) ; currentFormatNodes = Tools . map ( currentFormatNodes , function ( formatNode ) { formatNode = formatNode . cloneNode ( false ) ; if ( newBlockElm . hasChildNodes ( ) ) { formatNode . appendChild ( newBlockElm . firstChild ) ; newBlockElm . appendChild ( formatNode ) ; } else { newBlockElm . appendChild ( formatNode ) ; } newBlockElm . appendChild ( formatNode ) ; return formatNode ; } ) ; if ( currentFormatNodes . length ) { br = dom . create ( 'br' ) ; currentFormatNodes [ 0 ] . appendChild ( br ) ; dom . replace ( newBlockElm , blockElm ) ; rng . setStartBefore ( br ) ; rng . setEndBefore ( br ) ; editor . selection . setRng ( rng ) ; return br ; } return null ; } function isTextBlock ( node ) { return node && editor . schema . getTextBlockElements ( ) [ node . tagName ] ; } if ( ! rng . collapsed ) { return ; } container = rng . startContainer ; offset = rng . startOffset ; blockElm = dom . getParent ( container , dom . isBlock ) ; if ( ! isTextBlock ( blockElm ) ) { return ; } if ( container . nodeType == 1 ) { container = container . childNodes [ offset ] ; if ( container && container . tagName != 'BR' ) { return ; } if ( isForward ) { sibling = blockElm . nextSibling ; } else { sibling = blockElm . previousSibling ; } if ( dom . isEmpty ( blockElm ) && isTextBlock ( sibling ) && dom . isEmpty ( sibling ) ) { if ( cloneTextBlockWithFormats ( blockElm , container ) ) { dom . remove ( sibling ) ; return true ; } } } else if ( container . nodeType == 3 ) { path = NodePath . create ( blockElm , container ) ; clonedBlockElm = blockElm . cloneNode ( true ) ; container = NodePath . resolve ( clonedBlockElm , path ) ; if ( isForward ) { if ( offset >= container . data . length ) { return ; } container . deleteData ( offset , 1 ) ; } else { if ( offset <= 0 ) { return ; } container . deleteData ( offset - 1 , 1 ) ; } if ( dom . isEmpty ( clonedBlockElm ) ) { return cloneTextBlockWithFormats ( blockElm , container ) ; } } }
This retains the formatting if the last character is to be deleted.

Backspace on this: <p><b><i>a|</i></b></p> would become <p>|</p> in WebKit.
With this patch: <p><b><i>|<br></i></b></p>
This retains the formatting if the last character is to be deleted .