- From: John Boyer <boyerj@ca.ibm.com>
- Date: Sat, 1 Apr 2006 10:53:59 -0800
- To: David Landwehr <david.landwehr@solidapp.com>
- Cc: w3c-forms@w3.org, www-forms@w3.org
- Message-ID: <OF5BF1B281.9BB1FF92-ON88257143.00636971-88257143.0067D201@ca.ibm.com>
Hi David,
I think the end of your email shows that you are talking about the
*result* of an expression being an empty nodeset.
I agree that this should result in a "no operation".
What I'm talking about, though, is something different. It's not that the
setvalue ref evaluates to an empty nodeset
(as is the case in your example due to some conditional expression).
The problem is that the ref can't even be evaluated because context node
has been deleted by the immediately
preceding action. So the setvalue ref can't return an empty nodeset or
any other result because the condition
for successfully executing an XPath expression does not exist.
There is a key difference between this issue and the one you raised in
[1], though I can speak to that issue as
well based on my recollection of the recent working group telecon
discussion of [1].
In my example, we have a delete followed by setvalue. The problem is
occuring due to the disappearance
of the context node that must be used to evaluate the ref in the setvalue.
The setvalue is an action, not a UI control.
Although it has a "single node binding", this only refers to the attribute
bundle associated with the action. The
single node binding is not a UI binding, as would be the case if it were a
form control. So single node binding of
actions like setvalue or message are not subject to delayed update during
a refresh because they are not
UI bindings but rather ephemeral single node bindings that are evaluated
at the point in time that the action
must be executed.
Your example, a clever one, is different because it places a form control
(an output) into the content of the
message action. So the message action executes, but the question arises
about the schedule of updating
the node to which the contained output is bound.
Others may have different recollections, but I recall the telecon
discussion taking the course that the UI
controls in the message action should behave as if they are created and
bound at the time the message
is executed. An implementation that creates the controls beforehand would
be responsible for updating
the UI it must display immediately before displaying it in such a way that
it is indistinguishable from a UI
that has just been ephemerally generated.
So, in conclusion, I do also agree that nothing in the spec suggests that
a *binding exception* in particular
should occur when the single node binding of an action has no context node
from which to evaluate, but
the XPath implementation we use follows the XPath Rec closely on this
point and generates an internal
error if we hand it a starting context devoid of a context node. We could
generate that exception instead, but
in any case the spec doesn't say what exception to generate, so we picked
binding exception as the most
natural fit because something is wrong with the form author's attempt to
create a single node binding in
an action after a prior action of the form author's design has wiped out
the context node.
John M. Boyer, Ph.D.
Senior Product Architect/Research Scientist
Co-Chair, W3C XForms Working Group
Workplace, Portal and Collaboration Software
IBM Victoria Software Lab
E-Mail: boyerj@ca.ibm.com http://www.ibm.com/software/
Blog: http://www.ibm.com/developerworks/blogs/boyer/index.jsp
David Landwehr <david.landwehr@solidapp.com>
03/31/2006 11:32 PM
To
John Boyer/CanWest/IBM@IBMCA
cc
www-forms@w3.org, w3c-forms@w3.org
Subject
Re: Context consuming actions
Hi John,
I believe this problem is related to the one I send to the list a while
back [1]. In my implementation since the UI's bindings is first rewire in
the refresh event and your event sequence is running in a deferred action
scope then the trigger will first have a null context after the action
block. If you had a xforms:refresh between the delete and setvalue then
the setvalue would get a null context.
So in my implementation I only update the context for the UI in the
refresh handling. I execute the XPath expression on actions for every
execution (I'm unsure if the specification is clear about this). My XPath
implementation can handle that the trigger's context node is no longer in
the document and e.g. <setvalue ref=".."/> evaluate to a null node in
your example.
I wouldn't use an exception for this scenario at all. I thought that a
null context for an action would result in a NOP. That is want I do since
I thought binding-exception was used only when something was bad with a
IDREF pointing no way or to something wrong. Also the point that an
exception terminates processing seems a bit to much for me since it could
be intentional by the author. E.g.
<xforms:setvalue ref="self::node()[conditional expression]" value="[value
expression]"/>
if the conditional expression make the ref evaluate to the empty node-set
would the value expression then also dispatch a binding exception? I guess
it shouldn't and that this scenario is not really different from yours.
Best regards,
David
[1] Question about updating UIInline inside of message
http://lists.w3.org/Archives/Public/www-forms-editor/2006Jan/0009.html
Den Mar 31, 2006 kl. 9:38 PM skrev John Boyer:
We have been assuming up to now that if an action consumes the context
node, then any subsequent action requiring an XPath evaluation should
fail with an exception.
We've been using binding exception as the most reasonable exception,
but because this exact case is not called out in the spec, it seems
reasonable
to ask the community about it...
How are other XForms implementers handling this case?
To be specific, suppose you have an action sequence that
performs a delete action followed by a setvalue. However,
let the delete destroy a node that either is or is an ancestor of
the context node for the action sequence.
What happens when the setvalue runs?
<trigger ref="/some/node">
<label>Don't press me</label>
<action ev:event="DOMActivate">
<delete nodeset="." at="1"/>
<setvalue ref="." value=" 'oops' "/>
</action>
</trigger>
Thanks,
John M. Boyer, Ph.D.
Senior Product Architect/Research Scientist
Co-Chair, W3C XForms Working Group
Workplace, Portal and Collaboration Software
IBM Victoria Software Lab
E-Mail: boyerj@ca.ibm.com http://www.ibm.com/software/
Blog: http://www.ibm.com/developerworks/blogs/boyer/index.jsp
Received on Saturday, 1 April 2006 18:54:24 UTC