The section 5.6.2. APIs for the text field selections http://www.whatwg.org/specs/web-apps/current-work/#textFieldSelection
defines attributes selectionStart and selectionEnd and method setSelectionRange(). These features are enough to identify the selected data and possibly modify the contents of text field by scripting so that the modification is affected by selected region. There're some problems, though. I represent the following use case: A page contains a textarea. Author adds an additional button for adding a pair of parenthesis around the selected text. The javascript code for this feature (given that "e" is the text field element) is e.value = e.value.substr(0,e.selectionStart) + "(" + e.value.substr(e.selectionStart,e.selectionEnd) + ")" + e.value.substr(e.selectionEnd); The problems with the above code: 1) From the UA view, the entire contents of the field has been replaced with a new value and therefore the undo feature of the field cannot represent the fact that the script only added character "(" before the selection and character ")" after the selection. A method to update only the selected part of the value would be needed to correctly describe the real change to the value to the UA. 2) There's no good way to set the selection because if the scripts calls setSelectionRange() the UA "must set the selection of the text field" but it is not required to modify the focus or scrolled part of the text field in any way. In addition, there's no way to query the scroll position of the selection so the script cannot work around this issue either. As a result, setSelectionRange() may be used to set the selection but the selected selection may end up being out of the view from the user point of view. As textarea element may have soft wrapping enabled, the script has no way to even compute the correct line number for the selection start. For the issue 1) I suggest adding a new method replaceSelectionText(in string selection_value) which replaces the section of field's value between offsets selectionStart and selectionEnd with the string selection_value. This replacement should not destroy the text field's undo history - instead it should be treated similarly to paste (text) operation. For the issue 2) I suggest changing the behavior of setSelectionRange() to require that the selection must be made visible to the user. Perhaps something along the lines "UA must scroll the text field so that the start of the selection is visible." As an alternative, a method such as void focusSelection() could be added so that the script may hint the UA that the selection should be made visible after the script has called setSelectionRange() and replaceSelectionText() multiple times (so that these actions do not repeatedly scroll the text field's viewport). -- Mikko
signature.asc
Description: OpenPGP digital signature