diff options
author | Adam Chlipala <adam@chlipala.net> | 2011-12-29 10:04:09 -0500 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2011-12-29 10:04:09 -0500 |
commit | 4489a47a9f033309663b611f04c4e03d5a00dec2 (patch) | |
tree | 3bea2df4a99c02478aa6d90efe2682800222c8c2 /doc | |
parent | 5cb6fb95143bacd1a57fb8cc72b7315216fd8ead (diff) |
Discuss a subtlety in the semantics of <dyn>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/manual.tex | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/doc/manual.tex b/doc/manual.tex index 57af9b5f..78b31bd7 100644 --- a/doc/manual.tex +++ b/doc/manual.tex @@ -1903,7 +1903,7 @@ $$\begin{array}{l} \end{array}$$ -\subsection{XML} +\subsection{\label{xml}XML} Ur/Web's library contains an encoding of XML syntax and semantic constraints. We make no effort to follow the standards governing XML schemas. Rather, XML fragments are viewed more as values of ML datatypes, and we only track which tags are allowed inside which other tags. The Ur/Web standard library encodes a very loose version of XHTML, where it is very easy to produce documents which are invalid XHTML, but which still display properly in all major browsers. The main purposes of the invariants that are enforced are first, to provide some documentation about the places where it would make sense to insert XML fragments; and second, to rule out code injection attacks and other abstraction violations related to HTML syntax. @@ -2057,6 +2057,10 @@ $$\begin{array}{l} \hspace{.1in} \to \mt{tag} \; [\mt{Signal} = \mt{signal} \; (\mt{xml} \; ([\mt{Dyn}] \rc \mt{ctx}) \; \mt{use} \; \mt{bind})] \; ([\mt{Dyn}] \rc \mt{ctx}) \; [] \; \mt{use} \; \mt{bind} \end{array}$$ +The semantics of \cd{<dyn>} tags is somewhat subtle. When the signal associated with such a tag changes value, the associated subtree of the HTML page is recreated. Some properties of the subtree, such as attributes and client-side widget values, are specified explicitly in the signal value, so these may be counted on to remain the same after recreation. Other properties, like focus and cursor position within textboxes, are \emph{not} specified by signal values, and these properties will be \emph{reset} upon subtree regeneration. Furthermore, user interaction with widgets may not work properly during regeneration. For instance, clicking a button while it is being regenerated may not trigger its \cd{onclick} event code. + +Currently, the only way to avoid undesired resets is to avoid regeneration of containing subtrees. There are two main strategies for achieving that goal. First, when changes to a subtree can be confined to CSS classes of tags, the \texttt{dynClass} pseudo-attribute may be used instead (see Section \ref{xml}), as it does not regenerate subtrees. Second, a single \cd{<dyn>} tag may be broken into multiple tags, in a way that makes finer-grained dependency structure explicit. This latter strategy can avoid ``spurious'' regenerations that are not actually required to achieve the intended semantics. + Transactions can be run on the client by including them in attributes like the $\mt{Onclick}$ attribute of $\mt{button}$, and GUI widgets like $\mt{ctextbox}$ have $\mt{Source}$ attributes that can be used to connect them to sources, so that their values can be read by code running because of, e.g., an $\mt{Onclick}$ event. \subsubsection{Remote Procedure Calls} |