[webkit-changes] cvs commit: WebCore/kwq KWQLineEdit.h KWQLineEdit.mm KWQTextArea.h KWQTextArea.mm KWQTextEdit.h KWQTextEdit.mm KWQTextField.h KWQTextField.mm

Timothy thatcher at opensource.apple.com
Thu Nov 10 22:39:38 PST 2005


thatcher    05/11/10 22:39:37

  Modified:    .        Tag: Safari-2-0-branch ChangeLog
               khtml/ecma Tag: Safari-2-0-branch kjs_html.cpp kjs_html.h
               khtml/html Tag: Safari-2-0-branch html_formimpl.cpp
                        html_formimpl.h
               khtml/rendering Tag: Safari-2-0-branch render_form.cpp
                        render_form.h
               kwq      Tag: Safari-2-0-branch KWQLineEdit.h KWQLineEdit.mm
                        KWQTextArea.h KWQTextArea.mm KWQTextEdit.h
                        KWQTextEdit.mm KWQTextField.h KWQTextField.mm
  Log:
          Merged fix from TOT to Safari-2-0-branch
  
      2005-06-22  Kevin Ballard  <kevin at sb.org>
  
          Reviewed by Darin.
  
          Test cases added:
          * crlf.html
          * text-selection.html
          Both of these are attached to the bug separately from the patch,
          because I can't cvs add.
          Reviewer: feel free to remove this comment and tweak the test cases added
          lines to reflect wherever you place these cases in the hierarchy
  
          - Fixes bug <http://bugzilla.opendarwin.org/show_bug.cgi?id=3401>.
            Also fixes issue where setting text of a textarea in code and then
            retrieving it would leave the \r\n sequences in the text, despite
            the textarea translating to \n in all other cases.
  
          * khtml/ecma/kjs_html.cpp:
          (KJS::getInputSelectionStart):
          (KJS::getInputSelectionEnd):
          (KJS::KJS::HTMLElement::getValueProperty):
          (KJS::KJS::HTMLElement::hasProperty):
          (KJS::KJS::HTMLElementFunction::tryCall):
          (KJS::HTMLElement::putValue):
          * khtml/ecma/kjs_html.h:
          (KJS::HTMLElement::):
          * khtml/html/html_formimpl.cpp:
          (DOM::HTMLInputElementImpl::canHaveSelection):
          (DOM::HTMLInputElementImpl::selectionStart):
          (DOM::HTMLInputElementImpl::selectionEnd):
          (DOM::HTMLInputElementImpl::setSelectionStart):
          (DOM::HTMLInputElementImpl::setSelectionEnd):
          (DOM::HTMLInputElementImpl::setSelectionRange):
          (DOM::HTMLInputElementImpl::setValue):
          (DOM::HTMLTextAreaElementImpl::selectionStart):
          (DOM::HTMLTextAreaElementImpl::selectionEnd):
          (DOM::HTMLTextAreaElementImpl::setSelectionStart):
          (DOM::HTMLTextAreaElementImpl::setSelectionEnd):
          (DOM::HTMLTextAreaElementImpl::setSelectionRange):
          (DOM::HTMLTextAreaElementImpl::setValue):
          * khtml/html/html_formimpl.h:
          * khtml/rendering/render_form.cpp:
          (RenderLineEdit::selectionStart):
          (RenderLineEdit::selectionEnd):
          (RenderLineEdit::setSelectionStart):
          (RenderLineEdit::setSelectionEnd):
          (RenderLineEdit::setSelectionRange):
          (RenderTextArea::selectionStart):
          (RenderTextArea::selectionEnd):
          (RenderTextArea::setSelectionStart):
          (RenderTextArea::setSelectionEnd):
          (RenderTextArea::select):
          (RenderTextArea::setSelectionRange):
          * khtml/rendering/render_form.h:
          * kwq/KWQLineEdit.h:
          * kwq/KWQLineEdit.mm:
          (QLineEdit::setCursorPosition):
          (QLineEdit::cursorPosition):
          (QLineEdit::selectAll):
          (QLineEdit::selectionStart):
          (QLineEdit::selectedText):
          (QLineEdit::setSelection):
          * kwq/KWQTextArea.h:
          * kwq/KWQTextArea.mm:
          (-[KWQTextArea setSelectedRange:]):
          (-[KWQTextArea selectedRange]):
          (-[KWQTextArea getCursorPositionAsIndex:inParagraph:]):
          (RangeOfParagraph):
          * kwq/KWQTextEdit.h:
          * kwq/KWQTextEdit.mm:
          (QTextEdit::getCursorPosition):
          (QTextEdit::selectionStart):
          (QTextEdit::selectionEnd):
          (QTextEdit::setSelectionStart):
          (QTextEdit::setSelectionEnd):
          (QTextEdit::selectAll):
          (QTextEdit::setSelectionRange):
          * kwq/KWQTextField.h:
          * kwq/KWQTextField.mm:
          (-[KWQTextFieldController selectedRange]):
          (-[KWQTextFieldController setSelectedRange:]):
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.53  +86 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.1.2.52
  retrieving revision 1.1.2.53
  diff -u -r1.1.2.52 -r1.1.2.53
  --- ChangeLog	11 Nov 2005 05:58:23 -0000	1.1.2.52
  +++ ChangeLog	11 Nov 2005 06:39:20 -0000	1.1.2.53
  @@ -1,6 +1,92 @@
   2005-11-10  Timothy Hatcher  <timothy at apple.com>
   
           Merged fix from TOT to Safari-2-0-branch
  +
  +    2005-06-22  Kevin Ballard  <kevin at sb.org>
  +
  +        Reviewed by Darin.
  +
  +        Test cases added:
  +        * crlf.html
  +        * text-selection.html
  +        Both of these are attached to the bug separately from the patch,
  +        because I can't cvs add.
  +        Reviewer: feel free to remove this comment and tweak the test cases added
  +        lines to reflect wherever you place these cases in the hierarchy
  +
  +        - Fixes bug <http://bugzilla.opendarwin.org/show_bug.cgi?id=3401>.
  +          Also fixes issue where setting text of a textarea in code and then
  +          retrieving it would leave the \r\n sequences in the text, despite
  +          the textarea translating to \n in all other cases.
  +
  +        * khtml/ecma/kjs_html.cpp:
  +        (KJS::getInputSelectionStart):
  +        (KJS::getInputSelectionEnd):
  +        (KJS::KJS::HTMLElement::getValueProperty):
  +        (KJS::KJS::HTMLElement::hasProperty):
  +        (KJS::KJS::HTMLElementFunction::tryCall):
  +        (KJS::HTMLElement::putValue):
  +        * khtml/ecma/kjs_html.h:
  +        (KJS::HTMLElement::):
  +        * khtml/html/html_formimpl.cpp:
  +        (DOM::HTMLInputElementImpl::canHaveSelection):
  +        (DOM::HTMLInputElementImpl::selectionStart):
  +        (DOM::HTMLInputElementImpl::selectionEnd):
  +        (DOM::HTMLInputElementImpl::setSelectionStart):
  +        (DOM::HTMLInputElementImpl::setSelectionEnd):
  +        (DOM::HTMLInputElementImpl::setSelectionRange):
  +        (DOM::HTMLInputElementImpl::setValue):
  +        (DOM::HTMLTextAreaElementImpl::selectionStart):
  +        (DOM::HTMLTextAreaElementImpl::selectionEnd):
  +        (DOM::HTMLTextAreaElementImpl::setSelectionStart):
  +        (DOM::HTMLTextAreaElementImpl::setSelectionEnd):
  +        (DOM::HTMLTextAreaElementImpl::setSelectionRange):
  +        (DOM::HTMLTextAreaElementImpl::setValue):
  +        * khtml/html/html_formimpl.h:
  +        * khtml/rendering/render_form.cpp:
  +        (RenderLineEdit::selectionStart):
  +        (RenderLineEdit::selectionEnd):
  +        (RenderLineEdit::setSelectionStart):
  +        (RenderLineEdit::setSelectionEnd):
  +        (RenderLineEdit::setSelectionRange):
  +        (RenderTextArea::selectionStart):
  +        (RenderTextArea::selectionEnd):
  +        (RenderTextArea::setSelectionStart):
  +        (RenderTextArea::setSelectionEnd):
  +        (RenderTextArea::select):
  +        (RenderTextArea::setSelectionRange):
  +        * khtml/rendering/render_form.h:
  +        * kwq/KWQLineEdit.h:
  +        * kwq/KWQLineEdit.mm:
  +        (QLineEdit::setCursorPosition):
  +        (QLineEdit::cursorPosition):
  +        (QLineEdit::selectAll):
  +        (QLineEdit::selectionStart):
  +        (QLineEdit::selectedText):
  +        (QLineEdit::setSelection):
  +        * kwq/KWQTextArea.h:
  +        * kwq/KWQTextArea.mm:
  +        (-[KWQTextArea setSelectedRange:]):
  +        (-[KWQTextArea selectedRange]):
  +        (-[KWQTextArea getCursorPositionAsIndex:inParagraph:]):
  +        (RangeOfParagraph):
  +        * kwq/KWQTextEdit.h:
  +        * kwq/KWQTextEdit.mm:
  +        (QTextEdit::getCursorPosition):
  +        (QTextEdit::selectionStart):
  +        (QTextEdit::selectionEnd):
  +        (QTextEdit::setSelectionStart):
  +        (QTextEdit::setSelectionEnd):
  +        (QTextEdit::selectAll):
  +        (QTextEdit::setSelectionRange):
  +        * kwq/KWQTextField.h:
  +        * kwq/KWQTextField.mm:
  +        (-[KWQTextFieldController selectedRange]):
  +        (-[KWQTextFieldController setSelectedRange:]):
  +
  +2005-11-10  Timothy Hatcher  <timothy at apple.com>
  +
  +        Merged fix from TOT to Safari-2-0-branch
           All the changes were applied to khtml/editing/htmlediting.[m|h]
           None of the other files exist on the branch, they were split off later.
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.108.6.11 +55 -1     WebCore/khtml/ecma/kjs_html.cpp
  
  Index: kjs_html.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_html.cpp,v
  retrieving revision 1.108.6.10
  retrieving revision 1.108.6.11
  diff -u -r1.108.6.10 -r1.108.6.11
  --- kjs_html.cpp	11 Nov 2005 00:51:38 -0000	1.108.6.10
  +++ kjs_html.cpp	11 Nov 2005 06:39:26 -0000	1.108.6.11
  @@ -783,6 +783,8 @@
     maxLength	KJS::HTMLElement::InputMaxLength	DontDelete
     name		KJS::HTMLElement::InputName		DontDelete
     readOnly	KJS::HTMLElement::InputReadOnly		DontDelete
  +  selectionStart	KJS::HTMLElement::InputSelectionStart	DontDelete
  +  selectionEnd	KJS::HTMLElement::InputSelectionEnd	DontDelete
     size		KJS::HTMLElement::InputSize		DontDelete
     src		KJS::HTMLElement::InputSrc		DontDelete
     tabIndex	KJS::HTMLElement::InputTabIndex		DontDelete
  @@ -793,8 +795,9 @@
     focus		KJS::HTMLElement::InputFocus		DontDelete|Function 0
     select	KJS::HTMLElement::InputSelect		DontDelete|Function 0
     click		KJS::HTMLElement::InputClick		DontDelete|Function 0
  +  setSelectionRange	KJS::HTMLElement::InputSetSelectionRange	DontDelete|Function 2
   @end
  - at begin HTMLTextAreaElementTable 13
  + at begin HTMLTextAreaElementTable 17
     defaultValue	KJS::HTMLElement::TextAreaDefaultValue	DontDelete
     form		KJS::HTMLElement::TextAreaForm		DontDelete|ReadOnly
     accessKey	KJS::HTMLElement::TextAreaAccessKey	DontDelete
  @@ -803,12 +806,15 @@
     name		KJS::HTMLElement::TextAreaName		DontDelete
     readOnly	KJS::HTMLElement::TextAreaReadOnly	DontDelete
     rows		KJS::HTMLElement::TextAreaRows		DontDelete
  +  selectionStart	KJS::HTMLElement::TextAreaSelectionStart	DontDelete
  +  selectionEnd	KJS::HTMLElement::TextAreaSelectionEnd	DontDelete
     tabIndex	KJS::HTMLElement::TextAreaTabIndex	DontDelete
     type		KJS::HTMLElement::TextAreaType		DontDelete|ReadOnly
     value		KJS::HTMLElement::TextAreaValue		DontDelete
     blur		KJS::HTMLElement::TextAreaBlur		DontDelete|Function 0
     focus		KJS::HTMLElement::TextAreaFocus		DontDelete|Function 0
     select	KJS::HTMLElement::TextAreaSelect	DontDelete|Function 0
  +  setSelectionRange	KJS::HTMLElement::TextAreaSetSelectionRange	DontDelete|Function 2
   @end
   @begin HTMLButtonElementTable 7
     form		KJS::HTMLElement::ButtonForm		DontDelete|ReadOnly
  @@ -1266,6 +1272,22 @@
   }
   #endif
   
  +static Value getInputSelectionStart(HTMLInputElementImpl &input)
  +{
  +  if (input.canHaveSelection()) {
  +    return Number(input.selectionStart());
  +  }
  +  return Undefined();
  +}
  +
  +static Value getInputSelectionEnd(HTMLInputElementImpl &input)
  +{
  +  if (input.canHaveSelection()) {
  +    return Number(input.selectionEnd());
  +  }
  +  return Undefined();
  +}
  +
   Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
   {
     DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node);
  @@ -1434,6 +1456,8 @@
       case InputMaxLength:       return Number(input.maxLength());
       case InputName:            return String(input.name());
       case InputReadOnly:        return Boolean(input.readOnly());
  +    case InputSelectionStart:  return getInputSelectionStart(input);
  +    case InputSelectionEnd:    return getInputSelectionEnd(input);
       case InputSize:            return String(input.size());
       case InputSrc:             return String(input.src());
       case InputTabIndex:        return Number(input.tabIndex());
  @@ -1454,6 +1478,8 @@
       case TextAreaName:            return String(textarea.name());
       case TextAreaReadOnly:        return Boolean(textarea.readOnly());
       case TextAreaRows:            return Number(textarea.rows());
  +    case TextAreaSelectionStart:  return Number(textarea.selectionStart());
  +    case TextAreaSelectionEnd:    return Number(textarea.selectionEnd());
       case TextAreaTabIndex:        return Number(textarea.tabIndex());
       case TextAreaType:            return String(textarea.type());
       case TextAreaValue:           return String(textarea.value());
  @@ -2004,6 +2030,22 @@
         if (ok && !(select.options().item(u).isNull()))
           return true;
       }
  +    case ID_INPUT: {
  +      HTMLInputElementImpl &input = static_cast<HTMLInputElementImpl &>(element);
  +      const HashTable* table = classInfo()->propHashTable;
  +      const HashEntry* entry = Lookup::findEntry(table, propertyName);
  +      if (entry) {
  +        switch(entry->value) {
  +          case InputSelectionStart:
  +          case InputSelectionEnd:
  +          case InputSetSelectionRange:
  +            return input.canHaveSelection();
  +          default:
  +            break;
  +        }
  +      }
  +      break;
  +    }
       default:
         break;
     }
  @@ -2129,6 +2171,10 @@
           form.reset();
           return Undefined();
         }
  +      else if (id == KJS::HTMLElement::InputSetSelectionRange) {
  +        input.setSelectionRange(args[0].toInt32(exec), args[1].toInt32(exec));
  +        return Undefined();
  +      }
       }
       break;
       case ID_SELECT: {
  @@ -2198,6 +2244,10 @@
           textarea.select();
           return Undefined();
         }
  +      else if (id == KJS::HTMLElement::TextAreaSetSelectionRange) {
  +        textarea.setSelectionRange(args[0].toInt32(exec), args[1].toInt32(exec));
  +        return Undefined();
  +      }
       }
       break;
       case ID_A: {
  @@ -2558,6 +2608,8 @@
         case InputMaxLength:       { input.setMaxLength(value.toInt32(exec)); return; }
         case InputName:            { input.setName(str); return; }
         case InputReadOnly:        { input.setReadOnly(value.toBoolean(exec)); return; }
  +      case InputSelectionStart:  { input.setSelectionStart(value.toInt32(exec)); return; }
  +      case InputSelectionEnd:    { input.setSelectionEnd(value.toInt32(exec)); return; }
         case InputSize:            { input.setSize(str); return; }
         case InputSrc:             { input.setSrc(str); return; }
         case InputTabIndex:        { input.setTabIndex(value.toInt32(exec)); return; }
  @@ -2578,6 +2630,8 @@
         case TextAreaName:            { textarea.setName(str); return; }
         case TextAreaReadOnly:        { textarea.setReadOnly(value.toBoolean(exec)); return; }
         case TextAreaRows:            { textarea.setRows(value.toInt32(exec)); return; }
  +      case TextAreaSelectionStart:  { textarea.setSelectionStart(value.toInt32(exec)); return; }
  +      case TextAreaSelectionEnd:    { textarea.setSelectionEnd(value.toInt32(exec)); return; }
         case TextAreaTabIndex:        { textarea.setTabIndex(value.toInt32(exec)); return; }
         // read-only: type
         case TextAreaValue:           { textarea.setValue(str); return; }
  
  
  
  1.41.6.3  +3 -1      WebCore/khtml/ecma/kjs_html.h
  
  Index: kjs_html.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_html.h,v
  retrieving revision 1.41.6.2
  retrieving revision 1.41.6.3
  diff -u -r1.41.6.2 -r1.41.6.3
  --- kjs_html.h	2 Aug 2005 21:26:15 -0000	1.41.6.2
  +++ kjs_html.h	11 Nov 2005 06:39:27 -0000	1.41.6.3
  @@ -104,9 +104,11 @@
              InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled,
              InputChecked, InputForm, InputAccessKey, InputAlign, InputAlt,
              InputName, InputSrc, InputUseMap, InputSelect, InputClick,
  -           TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
  +           InputSelectionStart, InputSelectionEnd, InputSetSelectionRange,
  +           TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect, TextAreaSetSelectionRange,
              TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
              TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
  +           TextAreaSelectionStart, TextAreaSelectionEnd,
              TextAreaBlur, TextAreaFocus, ButtonBlur, ButtonFocus, ButtonForm, ButtonTabIndex, ButtonName,
              ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
              LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.156.6.5 +138 -2    WebCore/khtml/html/html_formimpl.cpp
  
  Index: html_formimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/html/html_formimpl.cpp,v
  retrieving revision 1.156.6.4
  retrieving revision 1.156.6.5
  diff -u -r1.156.6.4 -r1.156.6.5
  --- html_formimpl.cpp	2 Sep 2005 22:14:08 -0000	1.156.6.4
  +++ html_formimpl.cpp	11 Nov 2005 06:39:30 -0000	1.156.6.5
  @@ -1389,6 +1389,89 @@
       }
   }
   
  +bool HTMLInputElementImpl::canHaveSelection()
  +{
  +    switch (m_type) {
  +        case TEXT:
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +            return true;
  +        default:
  +            break;
  +    }
  +    return false;
  +}
  +
  +long HTMLInputElementImpl::selectionStart()
  +{
  +    if (!m_render) return 0;
  +    
  +    switch (m_type) {
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +        case TEXT:
  +            return static_cast<RenderLineEdit *>(m_render)->selectionStart();
  +        default:
  +            break;
  +    }
  +    return 0;
  +}
  +
  +long HTMLInputElementImpl::selectionEnd()
  +{
  +    if (!m_render) return 0;
  +    
  +    switch (m_type) {
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +        case TEXT:
  +            return static_cast<RenderLineEdit *>(m_render)->selectionEnd();
  +        default:
  +            break;
  +    }
  +    return 0;
  +}
  +
  +void HTMLInputElementImpl::setSelectionStart(long start)
  +{
  +    if (!m_render) return;
  +    
  +    switch (m_type) {
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +        case TEXT:
  +            static_cast<RenderLineEdit *>(m_render)->setSelectionStart(start);
  +            break;
  +        default:
  +            break;
  +    }
  +}
  +
  +void HTMLInputElementImpl::setSelectionEnd(long end)
  +{
  +    if (!m_render) return;
  +    
  +    switch (m_type) {
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +        case TEXT:
  +            static_cast<RenderLineEdit *>(m_render)->setSelectionEnd(end);
  +            break;
  +        default:
  +            break;
  +    }
  +}
  +
   void HTMLInputElementImpl::select(  )
   {
       if(!m_render) return;
  @@ -1419,6 +1502,23 @@
       }
   }
   
  +void HTMLInputElementImpl::setSelectionRange(long start, long end)
  +{
  +    if (!m_render) return;
  +    
  +    switch (m_type) {
  +        case PASSWORD:
  +#if APPLE_CHANGES
  +        case SEARCH:
  +#endif
  +        case TEXT:
  +            static_cast<RenderLineEdit *>(m_render)->setSelectionRange(start, end);
  +            break;
  +        default:
  +            break;
  +    }
  +}
  +
   void HTMLInputElementImpl::click(bool sendMouseEvents)
   {
       switch (inputType()) {
  @@ -1977,13 +2077,15 @@
   {
       if (m_type == FILE) return;
   
  +    m_valueMatchesRenderer = false;
       if (storesValueSeparateFromAttribute()) {
           m_value = value;
  +        if (m_render)
  +            m_render->updateFromElement();
           setChanged();
       } else {
           setAttribute(ATTR_VALUE, value);
       }
  -    m_valueMatchesRenderer = false;
   }
   
   void HTMLInputElementImpl::setValueFromRenderer(const DOMString &value)
  @@ -3026,6 +3128,32 @@
       // the close() in the rendertree will take care of transferring defaultvalue to 'value'
   }
   
  +long HTMLTextAreaElementImpl::selectionStart()
  +{
  +    if (m_render)
  +        return static_cast<RenderTextArea *>(m_render)->selectionStart();
  +    return 0;
  +}
  +
  +long HTMLTextAreaElementImpl::selectionEnd()
  +{
  +    if (m_render)
  +        return static_cast<RenderTextArea *>(m_render)->selectionEnd();
  +    return 0;
  +}
  +
  +void HTMLTextAreaElementImpl::setSelectionStart(long start)
  +{
  +    if (m_render)
  +        static_cast<RenderTextArea *>(m_render)->setSelectionStart(start);
  +}
  +
  +void HTMLTextAreaElementImpl::setSelectionEnd(long end)
  +{
  +    if (m_render)
  +        static_cast<RenderTextArea *>(m_render)->setSelectionEnd(end);
  +}
  +
   void HTMLTextAreaElementImpl::select(  )
   {
       if (m_render)
  @@ -3033,6 +3161,12 @@
       onSelect();
   }
   
  +void HTMLTextAreaElementImpl::setSelectionRange(long start, long end)
  +{
  +    if (m_render)
  +        static_cast<RenderTextArea *>(m_render)->setSelectionRange(start, end);
  +}
  +
   void HTMLTextAreaElementImpl::childrenChanged()
   {
       setValue(defaultValue());
  @@ -3130,8 +3264,10 @@
   void HTMLTextAreaElementImpl::setValue(const DOMString &value)
   {
       m_value = value.string();
  -    m_valueIsValid = true;
       m_valueMatchesRenderer = false;
  +    if (m_render)
  +        static_cast<RenderTextArea *>(m_render)->updateFromElement();
  +    m_valueIsValid = false; // force the next access to fetch from the renderer
       setChanged(true);
   }
   
  
  
  
  1.67.6.4  +15 -0     WebCore/khtml/html/html_formimpl.h
  
  Index: html_formimpl.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/html/html_formimpl.h,v
  retrieving revision 1.67.6.3
  retrieving revision 1.67.6.4
  diff -u -r1.67.6.3 -r1.67.6.4
  --- html_formimpl.h	2 Sep 2005 22:14:09 -0000	1.67.6.3
  +++ html_formimpl.h	11 Nov 2005 06:39:31 -0000	1.67.6.4
  @@ -329,7 +329,15 @@
       virtual QString state();
       virtual void restoreState(QStringList &);
   
  +    bool canHaveSelection();
  +
  +    long selectionStart();
  +    long selectionEnd();
  +    void setSelectionStart(long);
  +    void setSelectionEnd(long);
  +
       void select();
  +    void setSelectionRange(long, long);
       
       virtual void click(bool sendMouseEvents);
       virtual void accessKeyAction(bool sendToAnyElement);
  @@ -632,7 +640,14 @@
       virtual QString state();
       virtual void restoreState(QStringList &);
   
  +    long selectionStart();
  +    long selectionEnd();
  +
  +    void setSelectionStart(long);
  +    void setSelectionEnd(long);
  +
       void select (  );
  +    void setSelectionRange(long, long);
   
       virtual void childrenChanged();
       virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.102.8.6 +104 -0    WebCore/khtml/rendering/render_form.cpp
  
  Index: render_form.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_form.cpp,v
  retrieving revision 1.102.8.5
  retrieving revision 1.102.8.6
  diff -u -r1.102.8.5 -r1.102.8.6
  --- render_form.cpp	11 Nov 2005 04:29:46 -0000	1.102.8.5
  +++ render_form.cpp	11 Nov 2005 06:39:32 -0000	1.102.8.6
  @@ -696,11 +696,55 @@
       element()->setValueFromRenderer(newText);
   }
   
  +long RenderLineEdit::selectionStart()
  +{
  +    KLineEdit *lineEdit = static_cast<KLineEdit *>(m_widget);
  +    int start = lineEdit->selectionStart();
  +    if (start == -1)
  +        start = lineEdit->cursorPosition();
  +    return start;
  +}
  +
  +long RenderLineEdit::selectionEnd()
  +{
  +    KLineEdit *lineEdit = static_cast<KLineEdit *>(m_widget);
  +    int start = lineEdit->selectionStart();
  +    if (start == -1)
  +        return lineEdit->cursorPosition();
  +    return start + (int)lineEdit->selectedText().length();
  +}
  +
  +void RenderLineEdit::setSelectionStart(long start)
  +{
  +    int realStart = MAX(start, 0);
  +    int length = MAX(selectionEnd() - realStart, 0);
  +    static_cast<KLineEdit *>(m_widget)->setSelection(realStart, length);
  +}
  +
  +void RenderLineEdit::setSelectionEnd(long end)
  +{
  +    int start = selectionStart();
  +    int realEnd = MAX(end, 0);
  +    int length = realEnd - start;
  +    if (length < 0) {
  +        start = realEnd;
  +        length = 0;
  +    }
  +    static_cast<KLineEdit *>(m_widget)->setSelection(start, length);
  +}
  +
   void RenderLineEdit::select()
   {
       static_cast<KLineEdit*>(m_widget)->selectAll();
   }
   
  +void RenderLineEdit::setSelectionRange(long start, long end)
  +{
  +    int realStart = MAX(start, 0);
  +    int length = MAX(end - realStart, 0);
  +    static_cast<KLineEdit *>(m_widget)->setSelection(realStart, length);
  +}
  +
   // ---------------------------------------------------------------------------
   
   RenderFieldset::RenderFieldset(HTMLGenericFormElementImpl *element)
  @@ -1636,11 +1680,71 @@
       m_dirty = true;
   }
   
  +long RenderTextArea::selectionStart()
  +{
  +    QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
  +#if APPLE_CHANGES
  +    return textEdit->selectionStart();
  +#else
  +    // FIXME: I have no way to test Qt, so I'll
  +    // leave this alone for now
  +#error Unimplemented method
  +#endif
  +}
  +
  +long RenderTextArea::selectionEnd()
  +{
  +    QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
  +#if APPLE_CHANGES
  +    return textEdit->selectionEnd();
  +#else
  +    // FIXME: I have no way to test Qt, so I'll
  +    // leave this alone for now
  +#error Unimplemented method
  +#endif
  +}
  +
  +void RenderTextArea::setSelectionStart(long start)
  +{
  +    QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
  +#if APPLE_CHANGES
  +    textEdit->setSelectionStart(start);
  +#else
  +    // FIXME: I have no way to test Qt, so I'll
  +    // leave this alone for now
  +#error Unimplemented method
  +#endif
  +}
  +
  +void RenderTextArea::setSelectionEnd(long end)
  +{
  +    QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
  +#if APPLE_CHANGES
  +    textEdit->setSelectionEnd(end);
  +#else
  +    // FIXME: I have no way to test Qt, so I'll
  +    // leave this alone for now
  +#error Unimplemented method
  +#endif
  +}
  +
   void RenderTextArea::select()
   {
       static_cast<QTextEdit *>(m_widget)->selectAll();
   }
   
  +void RenderTextArea::setSelectionRange(long start, long end)
  +{
  +    QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
  +#if APPLE_CHANGES
  +    textEdit->setSelectionRange(start, end-start);
  +#else
  +    // FIXME: I have no way to test Qt, so I'll
  +    // leave this alone for now
  +#error Unimplemented method
  +#endif
  +}
  +
   // ---------------------------------------------------------------------------
   
   #if APPLE_CHANGES
  
  
  
  1.48.8.1  +13 -1     WebCore/khtml/rendering/render_form.h
  
  Index: render_form.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_form.h,v
  retrieving revision 1.48
  retrieving revision 1.48.8.1
  diff -u -r1.48 -r1.48.8.1
  --- render_form.h	19 Mar 2005 00:34:07 -0000	1.48
  +++ render_form.h	11 Nov 2005 06:39:33 -0000	1.48.8.1
  @@ -243,7 +243,13 @@
       virtual void updateFromElement();
       virtual void setStyle(RenderStyle *);
   
  +    long selectionStart();
  +    long selectionEnd();
  +    void setSelectionStart(long);
  +    void setSelectionEnd(long);
  +    
       void select();
  +    void setSelectionRange(long, long);
   
       KLineEdit *widget() const { return static_cast<KLineEdit*>(m_widget); }
       DOM::HTMLInputElementImpl* element() const
  @@ -463,8 +469,14 @@
   
       QString text();
   
  +    long selectionStart();
  +    long selectionEnd();
  +    void setSelectionStart(long);
  +    void setSelectionEnd(long);
  +    
       void select();
  -
  +    void setSelectionRange(long, long);
  +    
   #if APPLE_CHANGES
       virtual bool canHaveIntrinsicMargins() const { return true; }
   #endif
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.31.10.1 +4 -0      WebCore/kwq/KWQLineEdit.h
  
  Index: KWQLineEdit.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQLineEdit.h,v
  retrieving revision 1.31
  retrieving revision 1.31.10.1
  diff -u -r1.31 -r1.31.10.1
  --- KWQLineEdit.h	20 Oct 2004 19:01:16 -0000	1.31
  +++ KWQLineEdit.h	11 Nov 2005 06:39:34 -0000	1.31.10.1
  @@ -67,6 +67,10 @@
       
       void selectAll();
       
  +    int selectionStart() const;
  +    QString selectedText() const;
  +    void setSelection(int, int);
  +    
       QSize sizeForCharacterWidth(int numCharacters) const;
       int baselinePosition(int height) const;
       
  
  
  
  1.65.8.2  +35 -3     WebCore/kwq/KWQLineEdit.mm
  
  Index: KWQLineEdit.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQLineEdit.mm,v
  retrieving revision 1.65.8.1
  retrieving revision 1.65.8.2
  diff -u -r1.65.8.1 -r1.65.8.2
  --- KWQLineEdit.mm	22 Jul 2005 01:18:36 -0000	1.65.8.1
  +++ KWQLineEdit.mm	11 Nov 2005 06:39:34 -0000	1.65.8.2
  @@ -75,14 +75,18 @@
       KWQ_UNBLOCK_EXCEPTIONS;
   }
   
  -void QLineEdit::setCursorPosition(int)
  +void QLineEdit::setCursorPosition(int pos)
   {
  -    // Don't do anything here.
  +    KWQ_BLOCK_EXCEPTIONS;
  +    [m_controller setSelectedRange:NSMakeRange(pos, 0)];
  +    KWQ_UNBLOCK_EXCEPTIONS;
   }
   
   int QLineEdit::cursorPosition() const
   {
  -    // Not needed.  We ignore setCursorPosition().
  +    KWQ_BLOCK_EXCEPTIONS;
  +    return [m_controller selectedRange].location;
  +    KWQ_UNBLOCK_EXCEPTIONS;
       return 0;
   }
   
  @@ -171,6 +175,7 @@
       return [m_controller maximumLength];
   }
   
  +
   void QLineEdit::selectAll()
   {
       if (!hasFocus()) {
  @@ -185,6 +190,33 @@
       }
   }
   
  +int QLineEdit::selectionStart() const
  +{
  +    KWQ_BLOCK_EXCEPTIONS;
  +    if ([m_controller hasSelection]) {
  +        return [m_controller selectedRange].location;
  +    }
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +    return -1;
  +}
  +
  +QString QLineEdit::selectedText() const
  +{
  +    KWQ_BLOCK_EXCEPTIONS;
  +    NSRange range = [m_controller selectedRange];
  +    NSString *str = [m_controller string];
  +    return QString::fromNSString([str substringWithRange:range]);
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +    return QString();
  +}
  +
  +void QLineEdit::setSelection(int start, int length)
  +{
  +    KWQ_BLOCK_EXCEPTIONS;
  +    [m_controller setSelectedRange:NSMakeRange(start, length)];
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +}
  +
   bool QLineEdit::edited() const
   {
       return [m_controller edited];
  
  
  
  1.18.10.2 +2 -0      WebCore/kwq/KWQTextArea.h
  
  Index: KWQTextArea.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextArea.h,v
  retrieving revision 1.18.10.1
  retrieving revision 1.18.10.2
  diff -u -r1.18.10.1 -r1.18.10.2
  --- KWQTextArea.h	11 Nov 2005 01:18:56 -0000	1.18.10.1
  +++ KWQTextArea.h	11 Nov 2005 06:39:34 -0000	1.18.10.2
  @@ -66,6 +66,8 @@
   - (BOOL)wordWrap;
   
   - (void)selectAll;
  +- (void)setSelectedRange:(NSRange)aRange;
  +- (NSRange)selectedRange;
   
   - (NSSize)sizeWithColumns:(int)columns rows:(int)rows;
   
  
  
  
  1.72.8.7  +69 -9     WebCore/kwq/KWQTextArea.mm
  
  Index: KWQTextArea.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextArea.mm,v
  retrieving revision 1.72.8.6
  retrieving revision 1.72.8.7
  diff -u -r1.72.8.6 -r1.72.8.7
  --- KWQTextArea.mm	11 Nov 2005 01:45:56 -0000	1.72.8.6
  +++ KWQTextArea.mm	11 Nov 2005 06:39:34 -0000	1.72.8.7
  @@ -249,6 +249,66 @@
       [textView selectAll:nil];
   }
   
  +- (void)setSelectedRange:(NSRange)aRange
  +{
  +    NSString *text = [textView string];
  +    // Ok, the selection has to match up with the string returned by -text
  +    // and since -text translates \r\n to \n, we have to modify our selection
  +    // if a \r\n sequence is anywhere in or before the selection
  +    unsigned count = 0;
  +    NSRange foundRange, searchRange = NSMakeRange(0, aRange.location);
  +    while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
  +           foundRange.location != NSNotFound) {
  +        count++;
  +        searchRange.location = NSMaxRange(foundRange);
  +        if (searchRange.location >= aRange.location) break;
  +        searchRange.length = aRange.location - searchRange.location;
  +    }
  +    aRange.location += count;
  +    count = 0;
  +    searchRange = NSMakeRange(aRange.location, aRange.length);
  +    while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
  +           foundRange.location != NSNotFound) {
  +        count++;
  +        searchRange.location = NSMaxRange(foundRange);
  +        if (searchRange.location >= NSMaxRange(aRange)) break;
  +        searchRange.length = NSMaxRange(aRange) - searchRange.location;
  +    }
  +    aRange.length += count;
  +    [textView setSelectedRange:aRange];
  +}
  +
  +- (NSRange)selectedRange
  +{
  +    NSRange aRange = [textView selectedRange];
  +    if (aRange.location == NSNotFound) {
  +        return aRange;
  +    }
  +    // Same issue as with -setSelectedRange: regarding \r\n sequences
  +    unsigned count = 0;
  +    NSRange foundRange, searchRange = NSMakeRange(0, aRange.location);
  +    NSString *text = [textView string];
  +    while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
  +           foundRange.location != NSNotFound) {
  +        count++;
  +        searchRange.location = NSMaxRange(foundRange);
  +        if (searchRange.location >= aRange.location) break;
  +        searchRange.length = aRange.location - searchRange.location;
  +    }
  +    aRange.location -= count;
  +    count = 0;
  +    searchRange = NSMakeRange(aRange.location, aRange.length);
  +    while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
  +           foundRange.location != NSNotFound) {
  +        count++;
  +        searchRange.location = NSMaxRange(foundRange);
  +        if (searchRange.location >= NSMaxRange(aRange)) break;
  +        searchRange.length = NSMaxRange(aRange) - searchRange.location;
  +    }
  +    aRange.length -= count;
  +    return aRange;
  +}
  +
   - (void)setEditable:(BOOL)flag
   {
       [textView setEditableIfEnabled:flag];
  @@ -298,7 +358,7 @@
       
       int paragraphSoFar = 0;
       NSRange searchRange = NSMakeRange(0, [text length]);
  -
  +    
       while (true) {
           // FIXME: Doesn't work for CR-separated or CRLF-separated text.
   	NSRange newlineRange = [text rangeOfString:@"\n" options:NSLiteralSearch range:searchRange];
  @@ -307,13 +367,13 @@
   	}
           
   	paragraphSoFar++;
  -
  +        
           unsigned advance = newlineRange.location + 1 - searchRange.location;
  -
  +        
   	searchRange.length -= advance;
   	searchRange.location += advance;
       }
  -
  +    
       *paragraph = paragraphSoFar;
       *index = selectedRange.location - searchRange.location;
   }
  @@ -322,7 +382,7 @@
   {
       int paragraphSoFar = 0;
       NSRange searchRange = NSMakeRange(0, [text length]);
  -
  +    
       NSRange newlineRange;
       while (true) {
           // FIXME: Doesn't work for CR-separated or CRLF-separated text.
  @@ -330,13 +390,13 @@
   	if (newlineRange.location == NSNotFound) {
   	    break;
   	}
  -
  +        
   	if (paragraphSoFar == paragraph) {
   	    break;
   	}
  -
  +        
   	paragraphSoFar++;
  -
  +        
           unsigned advance = newlineRange.location + 1 - searchRange.location;
   	if (searchRange.length <= advance) {
   	    searchRange.location = NSNotFound;
  @@ -347,7 +407,7 @@
   	searchRange.length -= advance;
   	searchRange.location += advance;
       }
  -
  +    
       if (paragraphSoFar < paragraph) {
           return NSMakeRange(NSNotFound, 0);
       }
  
  
  
  1.23.8.2  +6 -0      WebCore/kwq/KWQTextEdit.h
  
  Index: KWQTextEdit.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextEdit.h,v
  retrieving revision 1.23.8.1
  retrieving revision 1.23.8.2
  diff -u -r1.23.8.1 -r1.23.8.2
  --- KWQTextEdit.h	11 Nov 2005 01:18:57 -0000	1.23.8.1
  +++ KWQTextEdit.h	11 Nov 2005 06:39:35 -0000	1.23.8.2
  @@ -73,8 +73,14 @@
       void setScrollBarModes(ScrollBarMode hMode, ScrollBarMode vMode);
   
       void setWritingDirection(QPainter::TextDirection);
  +
  +    long selectionStart();
  +    long selectionEnd();
  +    void setSelectionStart(long);
  +    void setSelectionEnd(long);
       
       void selectAll();
  +    void setSelectionRange(long, long);
   
       QSize sizeWithColumnsAndRows(int numColumns, int numRows) const;
   
  
  
  
  1.44.8.3  +122 -3    WebCore/kwq/KWQTextEdit.mm
  
  Index: KWQTextEdit.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextEdit.mm,v
  retrieving revision 1.44.8.2
  retrieving revision 1.44.8.3
  diff -u -r1.44.8.2 -r1.44.8.3
  --- KWQTextEdit.mm	11 Nov 2005 01:18:57 -0000	1.44.8.2
  +++ KWQTextEdit.mm	11 Nov 2005 06:39:35 -0000	1.44.8.3
  @@ -81,10 +81,10 @@
   {
       KWQTextArea *textView = (KWQTextArea *)getView();
       if (index)
  -	*index = 0;
  +        *index = 0;
       if (paragraph)
  -	*paragraph = 0;
  -
  +        *paragraph = 0;
  +    
       KWQ_BLOCK_EXCEPTIONS;
       [textView getCursorPositionAsIndex:index inParagraph:paragraph];
       KWQ_UNBLOCK_EXCEPTIONS;
  @@ -185,6 +185,99 @@
       KWQ_UNBLOCK_EXCEPTIONS;
   }
   
  +long QTextEdit::selectionStart()
  +{
  +    KWQTextArea *textView = (KWQTextArea *)getView();
  +    
  +    KWQ_BLOCK_EXCEPTIONS;
  +    NSRange range = [textView selectedRange];
  +    if (range.location == NSNotFound)
  +        return 0;
  +    return range.location;
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +    
  +    return 0;
  +}
  +
  +long QTextEdit::selectionEnd()
  +{
  +    KWQTextArea *textView = (KWQTextArea *)getView();
  +    
  +    KWQ_BLOCK_EXCEPTIONS;
  +    NSRange range = [textView selectedRange];
  +    if (range.location == NSNotFound)
  +        return 0;
  +    return NSMaxRange(range);
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +    
  +    return 0;
  +}
  +
  +void QTextEdit::setSelectionStart(long start)
  +{
  +    KWQTextArea *textView = (KWQTextArea *)getView();
  +    
  +    KWQ_BLOCK_EXCEPTIONS;
  +    NSRange range = [textView selectedRange];
  +    if (range.location == NSNotFound) {
  +        range.location = 0;
  +        range.length = 0;
  +    }
  +    
  +    // coerce start to a valid value
  +    long maxLength = [[textView text] length];
  +    long newStart = start;
  +    if (newStart < 0)
  +        newStart = 0;
  +    if (newStart > maxLength)
  +        newStart = maxLength;
  +    
  +    if ((unsigned)newStart < range.location + range.length) {
  +        // If we're expanding or contracting, but not collapsing the selection
  +        range.length += range.location - newStart;
  +        range.location = newStart;
  +    } else {
  +        // ok, we're collapsing the selection
  +        range.location = newStart;
  +        range.length = 0;
  +    }
  +    
  +    [textView setSelectedRange:range];
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +}
  +
  +void QTextEdit::setSelectionEnd(long end)
  +{
  +    KWQTextArea *textView = (KWQTextArea *)getView();
  +    
  +    KWQ_BLOCK_EXCEPTIONS;
  +    NSRange range = [textView selectedRange];
  +    if (range.location == NSNotFound) {
  +        range.location = 0;
  +        range.length = 0;
  +    }
  +    
  +    // coerce end to a valid value
  +    long maxLength = [[textView text] length];
  +    long newEnd = end;
  +    if (newEnd < 0)
  +        newEnd = 0;
  +    if (newEnd > maxLength)
  +        newEnd = maxLength;
  +    
  +    if ((unsigned)newEnd >= range.location) {
  +        // If we're just changing the selection length, but not location..
  +        range.length = newEnd - range.location;
  +    } else {
  +        // ok, we've collapsed the selection and are moving it
  +        range.location = newEnd;
  +        range.length = 0;
  +    }
  +    
  +    [textView setSelectedRange:range];
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +}
  +
   void QTextEdit::selectAll()
   {
       KWQTextArea *textView = (KWQTextArea *)getView();
  @@ -194,6 +287,32 @@
       KWQ_UNBLOCK_EXCEPTIONS;
   }
   
  +void QTextEdit::setSelectionRange(long start, long length)
  +{
  +    KWQTextArea *textView = (KWQTextArea *)getView();
  +
  +    KWQ_BLOCK_EXCEPTIONS;
  +    long newStart = start;
  +    long newLength = length;
  +    if (newStart < 0) {
  +        // truncate the length by the negative start
  +        newLength = length + newStart;
  +        newStart = 0;
  +    }
  +    if (newLength < 0) {
  +        newLength = 0;
  +    }
  +    int maxlen = [[textView text] length];
  +    if (newStart > maxlen) {
  +        newStart = maxlen;
  +    }
  +    if (newStart + newLength > maxlen) {
  +        newLength = maxlen - newStart;
  +    }
  +    [textView setSelectedRange:NSMakeRange(newStart, newLength)];
  +    KWQ_UNBLOCK_EXCEPTIONS;
  +}
  +
   void QTextEdit::setFont(const QFont &font)
   {
       QWidget::setFont(font);
  
  
  
  1.20.8.1  +3 -0      WebCore/kwq/KWQTextField.h
  
  Index: KWQTextField.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextField.h,v
  retrieving revision 1.20
  retrieving revision 1.20.8.1
  diff -u -r1.20 -r1.20.8.1
  --- KWQTextField.h	24 Jan 2005 20:48:25 -0000	1.20
  +++ KWQTextField.h	11 Nov 2005 06:39:35 -0000	1.20.8.1
  @@ -55,6 +55,9 @@
   - (void)setBaseWritingDirection:(NSWritingDirection)direction;
   - (NSWritingDirection)baseWritingDirection;
   
  +- (NSRange)selectedRange;
  +- (void)setSelectedRange:(NSRange)range;
  +
   - (NSString *)string;
   
   @end
  
  
  
  1.77.8.2  +24 -3     WebCore/kwq/KWQTextField.mm
  
  Index: KWQTextField.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQTextField.mm,v
  retrieving revision 1.77.8.1
  retrieving revision 1.77.8.2
  diff -u -r1.77.8.1 -r1.77.8.2
  --- KWQTextField.mm	10 Nov 2005 18:22:34 -0000	1.77.8.1
  +++ KWQTextField.mm	11 Nov 2005 06:39:35 -0000	1.77.8.2
  @@ -355,7 +355,7 @@
   - (NSRange)selectedRange
   {
       NSText *editor = [field _KWQ_currentEditor];
  -    return editor ? [editor selectedRange] : NSMakeRange(NSNotFound, 0);
  +    return editor ? [editor selectedRange] : lastSelectedRange;
   }
   
   - (void)setSelectedRange:(NSRange)range
  @@ -363,9 +363,30 @@
       // Range check just in case the saved range has gotten out of sync.
       // Even though we don't see this in testing, we really don't want
       // an exception in this case, so we protect ourselves.
  -    NSText *editor = [field _KWQ_currentEditor];    
  -    if (NSMaxRange(range) <= [[editor string] length]) {
  +    NSText *editor = [field _KWQ_currentEditor];
  +    if (editor) { // if we have no focus, we don't have a current editor
  +        unsigned len = [[editor string] length];
  +        if (NSMaxRange(range) > len) {
  +            if (range.location > len) {
  +                range.location = len;
  +                range.length = 0;
  +            } else {
  +                range.length = len - range.location;
  +            }
  +        }
           [editor setSelectedRange:range];
  +    } else {
  +        // set the lastSavedRange, so it will be used when given focus
  +        unsigned len = [[field stringValue] length];
  +        if (NSMaxRange(range) > len) {
  +            if (range.location > len) {
  +                range.location = len;
  +                range.length = 0;
  +            } else {
  +                range.length = len - range.location;
  +            }
  +        }
  +        lastSelectedRange = range;
       }
   }
   
  
  
  



More information about the webkit-changes mailing list