Reviewers: jgw, Description: Description: ============ TextBoxImplIE6#getSelectionLength() uses some hacks to figure out how many /r/n appear in a TextArea. The loop works for a TextArea but can result in an infinite loop in a TextBox.
Fix: ==== This patch splits the implementations for a TextArea and a TextBox, since a TextBox in IE cannot have /r/n anyway. We now use the original implementation for TextBoxes. Testing: ======= I manually verified that this fixes the associated issue in IE. Please review this at http://gwt-code-reviews.appspot.com/52801 Affected files: user/src/com/google/gwt/user/client/ui/TextArea.java user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java Index: user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java =================================================================== --- user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java (revision 5721) +++ user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java (working copy) @@ -44,6 +44,10 @@ return getCursorPos(elem); } + public int getTextAreaSelectionLength(Element elem) { + return getSelectionLength(elem); + } + public native void setSelectionRange(Element elem, int pos, int length) /*-{ try { elem.setSelectionRange(pos, pos + length); Index: user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java =================================================================== --- user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java (revision 5721) +++ user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java (working copy) @@ -42,19 +42,7 @@ var tr = elem.document.selection.createRange(); if (tr.parentElement() !== elem) return 0; - var trLength = tr.text.length; - - // Subtract characters from the end to account for trimmed newlines. - var offset = 0; - var tr2 = tr.duplicate(); - tr2.moveEnd('character', -1); - var tr2Length = tr2.text.length; - while (tr2Length == trLength && tr2.parentElement() == elem && tr.compareEndPoints('StartToEnd', tr2) <= 0) { - offset += 2; - tr2.moveEnd('character', -1); - tr2Length = tr2.text.length; - } - return trLength + offset; + return tr.text.length; } catch (e) { return 0; @@ -95,6 +83,31 @@ } }-*/; + @Override + public native int getTextAreaSelectionLength(Element elem) /*-{ + try { + var tr = elem.document.selection.createRange(); + if (tr.parentElement() !== elem) + return 0; + var trLength = tr.text.length; + + // Subtract characters from the end to account for trimmed newlines. + var offset = 0; + var tr2 = tr.duplicate(); + tr2.moveEnd('character', -1); + var tr2Length = tr2.text.length; + while (tr2Length == trLength && tr2.parentElement() == elem && tr.compareEndPoints('StartToEnd', tr2) <= 0) { + offset += 2; + tr2.moveEnd('character', -1); + tr2Length = tr2.text.length; + } + return trLength + offset; + } + catch (e) { + return 0; + } + }-*/; + /** * Moving the start 1 character will move across a \r\n, but \r\n counts as * two characters, so we need to offset the position accordingly. Index: user/src/com/google/gwt/user/client/ui/TextArea.java =================================================================== --- user/src/com/google/gwt/user/client/ui/TextArea.java (revision 5721) +++ user/src/com/google/gwt/user/client/ui/TextArea.java (working copy) @@ -103,7 +103,7 @@ @Override public int getSelectionLength() { - return getImpl().getSelectionLength(getElement()); + return getImpl().getTextAreaSelectionLength(getElement()); } /** --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---