- From: Ehsan Akhgari <ehsan@mozilla.com>
- Date: Mon, 12 Mar 2012 19:06:41 -0400
I agree that nested transactions are a bad idea, and we probably don't want them. Cheers, -- Ehsan <http://ehsanakhgari.org/> On Mon, Mar 12, 2012 at 2:19 AM, Ryosuke Niwa <rniwa at webkit.org> wrote: > Hi, > > Consider the following scenario: > > <div id="um1" undoscope><span id="um2" undoscope></span></div> > <script> > ... > um1.undoManager.transact({ // transaction 1 > executeAutomatic: function() { > um2.undoManager.transact({ // transaction 2 > executeAutomatic: function () { > um2.appendChild(document.createTextNode('In um2')); // statement 1 > um1.appendChild(document.createTextNode('In um1')); // statement 2 > } > } > }); > </script> > > In this case, the DOM mutation made by the statement 1 will be managed by > the undo manager of um2. The DOM mutation made by statement 2 won't be > managed by the same undo manager because the mutation happens outside of > the undo scope it manages [1]. > > However, because we're still in the process of applying the transaction 1 > and therefore the DOM mutation made by the statement 2 becomes part of the > transaction 1. > > This behavior is very subtle and counter-intutive. To get rid of this > rather unintuitive behavior, I propose that we prohibit nested > transactions. Meaning that while executing any transaction, script cannot > create any new transaction elsewhere in the page. (Note that UndoManager > spec already prohibits nested transactions in the same undo scope.) > > An interesting consequence of this proposal is that, it will also get rid > of nested executions of execCommand since execCommand needs to be > implemented as a DOM transaction. > > [1] http://rniwa.com/editing/undomanager.html#automatic-dom-transactions > > Best, > Ryosuke Niwa > Software Engineer > Google Inc. >
Received on Monday, 12 March 2012 16:06:41 UTC