On 7/3/2011 10:26 AM, Ryosuke Niwa wrote:
On Sun, Jul 3, 2011 at 8:41 AM, John J. Barton
<johnjbar...@johnjbarton.com <mailto:johnjbar...@johnjbarton.com>> wrote:
On 7/2/2011 8:50 PM, Boris Zbarsky wrote:
On 7/2/11 1:46 PM, John J. Barton wrote:
2) element transformation. The replacement fires "after" a
mutation.
Library or tools that want to transform the application
dynamically want
to get notification "before" the mutation. A common
solution then is
to bracket changes:
"beforeChange" or "onModelChanging"
"afterChange" or "onModelChanged"
This really only works if you trust the listeners. The
browser core can't trust scripted listeners using Web APIs.....
I don't understand what 'trust' means here. I am not proposing
any change to the privileges of listeners. How can the browser
core "trust" an 'onModelChanged' listener but not an
'onModelChanging' listener?
If the user agent fires a modelChanging event, then the user agent
must verify that the pre-condition of removal is still met after the
the event is fired. This is extremely hard to do and very error-prone.
In the current proposal, the DOM API is manipulated while the
onModelChange mutation listeners run. This manipulation ensures certain
properties of the overall mutation process. However the manipulation
makes the API unreliable and the overall solution forces some use cases
to adopt bizarre solutions.
I am not asking you to support onModelChanging with full DOM API access.
I am asking you to take an open minded look at onModelChanging with
manipulation of the API to maintain the pre-conditions you require.
Instead of surreptitiously changing the DOM API (to cause results to
appear out of order), I am suggesting that the API be explicit. Rather
than silently delaying the results of DOM mutations made in mutation
event handlers, make the delay explicit. Force developers to delay
mutations. Force developers to operate against your system the way you
say they must, rather than pretending that they can mutate in mutation
listeners.
Let's set the onModelChange/onModelChanging differences aside and focus
just on the effective DOM API in mutation listeners. Your proposal is to
change the DOM API experienced in listeners from the DOM API experiences
outside of listeners. The purpose is to control the order of DOM
mutation. You can achieve the same goal in other ways.
For example, consider WebWorkers. There we face a similar problem: the
browser requires certain restrictions on the worker. Direct DOM
mutation must not be allowed. Developers have to work within these
restrictions. Developing with WebWorkers is different from developing in
web pages. But the differences are clear and predictable.
In the present case, imagine that the mutation listeners have only one
function call available: onNextTurn(). Their only option is to stage
work based on the arguments to the listener. Within this model verifying
preconditions is even easier than the current proposal *and* developers
will have a reliable API. This approach makes the properties of the
platform explicit: no mutations within mutations.
jjb