Changeset 94252 in webkit
- Timestamp:
- Aug 31, 2011 5:00:12 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r94251 r94252 1 2011-08-31 Ryosuke Niwa <rniwa@webkit.org> 2 3 Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement 4 https://bugs.webkit.org/show_bug.cgi?id=67320 5 6 Reviewed by Darin Adler. 7 8 Moved and renamed RenderText::text and RenderText::textWithHardLineBreaks to 9 HTMLTextFormControlElement::innerTextValue and HTMLTextFormControlElement::valueWithHardLineBreaks. 10 11 * accessibility/AccessibilityRenderObject.cpp: 12 (WebCore::AccessibilityRenderObject::text): 13 * html/HTMLInputElement.cpp: 14 (WebCore::HTMLInputElement::subtreeHasChanged): 15 * html/HTMLTextAreaElement.cpp: 16 (WebCore::HTMLTextAreaElement::appendFormData): Calls valueWithHardLineBreaks. It doesn't have to check 17 the existence of renderer anymore because valueWithHardLineBreaks returns value() when renderer do not 18 exist unlike RenderText::textWithHardLineBreaks returned emptyString() in such cases. This is the only place 19 valueWithHardLineBreaks is ever called; but we can't move valueWithHardLineBreaks because it calls 20 finishText. 21 (WebCore::HTMLTextAreaElement::handleBeforeTextInsertedEvent): 22 (WebCore::HTMLTextAreaElement::updateValue): 23 * html/HTMLTextFormControlElement.cpp: 24 (WebCore::HTMLTextFormControlElement::selectedText): 25 (WebCore::HTMLTextFormControlElement::setInnerTextValue): 26 (WebCore::finishText): Moved from RenderText.cpp 27 (WebCore::HTMLTextFormControlElement::innerTextValue): Ditto. 28 (WebCore::getNextSoftBreak): Ditto. 29 (WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks): Ditto; this function returns value() 30 when there are no renderers or root inline boxes instead of emptyString(). 31 * html/HTMLTextFormControlElement.h: 32 * html/NumberInputType.cpp: 33 (WebCore::NumberInputType::hasUnacceptableValue): 34 * html/SearchInputType.cpp: 35 (WebCore::SearchInputType::startSearchEventTimer): 36 * html/TextFieldInputType.cpp: 37 (WebCore::TextFieldInputType::handleBeforeTextInsertedEvent): 38 * rendering/RenderTextControl.cpp: 39 * rendering/RenderTextControl.h: 40 1 41 2011-08-31 Jeff Miller <jeffm@apple.com> 2 42 -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp
r94149 r94252 1952 1952 if (!isTextControl() || isPasswordField()) 1953 1953 return String(); 1954 1955 if (isNativeTextControl()) 1956 return toRenderTextControl(m_renderer)->text(); 1957 1954 1958 1955 Node* node = m_renderer->node(); 1959 1956 if (!node) 1960 1957 return String(); 1958 1959 if (isNativeTextControl()) 1960 return toRenderTextControl(m_renderer)->textFormControlElement()->value(); 1961 1961 1962 if (!node->isElementNode()) 1962 1963 return String(); -
trunk/Source/WebCore/html/HTMLInputElement.cpp
r94158 r94252 629 629 // sanitizeUserInputValue(). 630 630 // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent. 631 String value = toRenderTextControl(renderer())->text();631 String value = innerTextValue(); 632 632 if (isAcceptableValue(value)) 633 633 setValueFromRenderer(sanitizeValue(convertFromVisibleValue(value))); -
trunk/Source/WebCore/html/HTMLTextAreaElement.cpp
r94068 r94252 172 172 document()->updateLayout(); 173 173 174 // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer. 175 // While we have no evidence this has ever been a practical problem, it would be best to fix it some day. 176 RenderTextControl* control = toRenderTextControl(renderer()); 177 const String& text = (m_wrap == HardWrap && control) ? control->textWithHardLineBreaks() : value(); 174 const String& text = (m_wrap == HardWrap) ? valueWithHardLineBreaks() : value(); 178 175 encoding.appendData(name(), text); 179 176 return true; … … 254 251 unsigned unsignedMaxLength = static_cast<unsigned>(signedMaxLength); 255 252 256 unsigned currentLength = numGraphemeClusters( toRenderTextControl(renderer())->text());253 unsigned currentLength = numGraphemeClusters(innerTextValue()); 257 254 // selectionLength represents the selection length of this text field to be 258 255 // removed by this insertion. … … 290 287 291 288 ASSERT(renderer()); 292 m_value = toRenderTextControl(renderer())->text();289 m_value = innerTextValue(); 293 290 const_cast<HTMLTextAreaElement*>(this)->setFormControlValueMatchesRenderer(true); 294 291 const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged(); -
trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp
r94068 r94252 43 43 #include "RenderTheme.h" 44 44 #include "ScriptEventListener.h" 45 #include "Text.h" 45 46 #include "TextIterator.h" 46 47 #include <wtf/Vector.h> 48 #include <wtf/text/StringBuilder.h> 47 49 48 50 namespace WebCore { … … 187 189 String HTMLTextFormControlElement::selectedText() const 188 190 { 189 // FIXME: We should be able to extract selected contents even if there were no renderer. 190 if (!renderer() || renderer()->isTextControl()) 191 if (!isTextFormControl()) 191 192 return String(); 192 193 RenderTextControl* textControl = toRenderTextControl(renderer()); 194 return textControl->text().substring(selectionStart(), selectionEnd() - selectionStart()); 193 return value().substring(selectionStart(), selectionEnd() - selectionStart()); 195 194 } 196 195 … … 455 454 void HTMLTextFormControlElement::setInnerTextValue(const String& value) 456 455 { 457 if (!renderer() || !isTextFormControl()) 458 return; 459 460 RenderTextControl* textControl = toRenderTextControl(renderer()); 461 bool textIsChanged = value != textControl->text(); 456 if (!isTextFormControl()) 457 return; 458 459 bool textIsChanged = value != innerTextValue(); 462 460 if (textIsChanged || !innerTextElement()->hasChildNodes()) { 463 if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())464 document()->axObjectCache()->postNotification( textControl, AXObjectCache::AXValueChanged, false);461 if (textIsChanged && document() && renderer() && AXObjectCache::accessibilityEnabled()) 462 document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXValueChanged, false); 465 463 466 464 ExceptionCode ec = 0; … … 477 475 } 478 476 477 static String finishText(StringBuilder& result) 478 { 479 // Remove one trailing newline; there's always one that's collapsed out by rendering. 480 size_t size = result.length(); 481 if (size && result[size - 1] == '\n') 482 result.resize(--size); 483 return result.toString(); 484 } 485 486 String HTMLTextFormControlElement::innerTextValue() const 487 { 488 HTMLElement* innerText = innerTextElement(); 489 if (!innerText || !isTextFormControl()) 490 return emptyString(); 491 492 StringBuilder result; 493 for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) { 494 if (node->hasTagName(brTag)) 495 result.append(newlineCharacter); 496 else if (node->isTextNode()) 497 result.append(static_cast<Text*>(node)->data()); 498 } 499 return finishText(result); 500 } 501 502 static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset) 503 { 504 RootInlineBox* next; 505 for (; line; line = next) { 506 next = line->nextRootBox(); 507 if (next && !line->endsWithBreak()) { 508 ASSERT(line->lineBreakObj()); 509 breakNode = line->lineBreakObj()->node(); 510 breakOffset = line->lineBreakPos(); 511 line = next; 512 return; 513 } 514 } 515 breakNode = 0; 516 breakOffset = 0; 517 } 518 519 String HTMLTextFormControlElement::valueWithHardLineBreaks() const 520 { 521 // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer. 522 // While we have no evidence this has ever been a practical problem, it would be best to fix it some day. 523 HTMLElement* innerText = innerTextElement(); 524 if (!innerText || !isTextFormControl()) 525 return value(); 526 527 RenderBlock* renderer = toRenderBlock(innerText->renderer()); 528 if (!renderer) 529 return value(); 530 531 Node* breakNode; 532 unsigned breakOffset; 533 RootInlineBox* line = renderer->firstRootBox(); 534 if (!line) 535 return value(); 536 537 getNextSoftBreak(line, breakNode, breakOffset); 538 539 StringBuilder result; 540 for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) { 541 if (node->hasTagName(brTag)) 542 result.append(newlineCharacter); 543 else if (node->isTextNode()) { 544 String data = static_cast<Text*>(node)->data(); 545 unsigned length = data.length(); 546 unsigned position = 0; 547 while (breakNode == node && breakOffset <= length) { 548 if (breakOffset > position) { 549 result.append(data.characters() + position, breakOffset - position); 550 position = breakOffset; 551 result.append(newlineCharacter); 552 } 553 getNextSoftBreak(line, breakNode, breakOffset); 554 } 555 result.append(data.characters() + position, length - position); 556 } 557 while (breakNode == node) 558 getNextSoftBreak(line, breakNode, breakOffset); 559 } 560 return finishText(result); 561 } 562 479 563 HTMLTextFormControlElement* enclosingTextFormControl(const Position& position) 480 564 { -
trunk/Source/WebCore/html/HTMLTextFormControlElement.h
r94068 r94252 78 78 bool lastChangeWasUserEdit() const; 79 79 void setInnerTextValue(const String&); 80 String innerTextValue() const; 80 81 81 82 protected: … … 101 102 102 103 void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; } 104 105 String valueWithHardLineBreaks() const; 103 106 private: 104 107 int computeSelectionStart() const; -
trunk/Source/WebCore/html/NumberInputType.cpp
r92600 r94252 319 319 bool NumberInputType::hasUnacceptableValue() 320 320 { 321 return element()->renderer() && !isAcceptableValue( toRenderTextControl(element()->renderer())->text());321 return element()->renderer() && !isAcceptableValue(element()->innerTextValue()); 322 322 } 323 323 -
trunk/Source/WebCore/html/SearchInputType.cpp
r91058 r94252 129 129 { 130 130 ASSERT(element()->renderer()); 131 unsigned length = toRenderTextControlSingleLine(element()->renderer())->text().length();131 unsigned length = element()->innerTextValue().length(); 132 132 133 133 if (!length) { -
trunk/Source/WebCore/html/TextFieldInputType.cpp
r91982 r94252 293 293 // because they can be mismatched by sanitizeValue() in 294 294 // HTMLInputElement::subtreeHasChanged() in some cases. 295 unsigned oldLength = numGraphemeClusters( toRenderTextControlSingleLine(element()->renderer())->text());295 unsigned oldLength = numGraphemeClusters(element()->innerTextValue()); 296 296 297 297 // selectionLength represents the selection length of this text field to be -
trunk/Source/WebCore/rendering/RenderTextControl.cpp
r94047 r94252 23 23 #include "RenderTextControl.h" 24 24 25 #include "Editor.h" 26 #include "Frame.h" 27 #include "HTMLBRElement.h" 28 #include "HTMLInputElement.h" 29 #include "HTMLNames.h" 25 #include "HTMLTextFormControlElement.h" 30 26 #include "HitTestResult.h" 31 #include "Position.h"32 #include "RenderLayer.h"33 27 #include "RenderText.h" 34 28 #include "ScrollbarTheme.h" 35 #include "Text.h"36 29 #include "TextIterator.h" 37 #include <wtf/text/StringBuilder.h>30 #include "VisiblePosition.h" 38 31 #include <wtf/unicode/CharacterNames.h> 39 32 … … 41 34 42 35 namespace WebCore { 43 44 using namespace HTMLNames;45 36 46 37 // Value chosen by observation. This can be tweaked. … … 161 152 it.advance(index - 1); 162 153 return VisiblePosition(it.range()->endPosition(), UPSTREAM); 163 }164 165 static String finishText(StringBuilder& result)166 {167 // Remove one trailing newline; there's always one that's collapsed out by rendering.168 size_t size = result.length();169 if (size && result[size - 1] == '\n')170 result.resize(--size);171 return result.toString();172 }173 174 String RenderTextControl::text()175 {176 HTMLElement* innerText = innerTextElement();177 if (!innerText)178 return emptyString();179 180 StringBuilder result;181 for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) {182 if (node->hasTagName(brTag))183 result.append(newlineCharacter);184 else if (node->isTextNode())185 result.append(static_cast<Text*>(node)->data());186 }187 return finishText(result);188 }189 190 static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset)191 {192 RootInlineBox* next;193 for (; line; line = next) {194 next = line->nextRootBox();195 if (next && !line->endsWithBreak()) {196 ASSERT(line->lineBreakObj());197 breakNode = line->lineBreakObj()->node();198 breakOffset = line->lineBreakPos();199 line = next;200 return;201 }202 }203 breakNode = 0;204 breakOffset = 0;205 }206 207 String RenderTextControl::textWithHardLineBreaks()208 {209 HTMLElement* innerText = innerTextElement();210 if (!innerText)211 return emptyString();212 213 RenderBlock* renderer = toRenderBlock(innerText->renderer());214 if (!renderer)215 return emptyString();216 217 Node* breakNode;218 unsigned breakOffset;219 RootInlineBox* line = renderer->firstRootBox();220 if (!line)221 return emptyString();222 223 getNextSoftBreak(line, breakNode, breakOffset);224 225 StringBuilder result;226 for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) {227 if (node->hasTagName(brTag))228 result.append(newlineCharacter);229 else if (node->isTextNode()) {230 String data = static_cast<Text*>(node)->data();231 unsigned length = data.length();232 unsigned position = 0;233 while (breakNode == node && breakOffset <= length) {234 if (breakOffset > position) {235 result.append(data.characters() + position, breakOffset - position);236 position = breakOffset;237 result.append(newlineCharacter);238 }239 getNextSoftBreak(line, breakNode, breakOffset);240 }241 result.append(data.characters() + position, length - position);242 }243 while (breakNode == node)244 getNextSoftBreak(line, breakNode, breakOffset);245 }246 return finishText(result);247 154 } 248 155 -
trunk/Source/WebCore/rendering/RenderTextControl.h
r94047 r94252 35 35 HTMLTextFormControlElement* textFormControlElement() const; 36 36 virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0; 37 38 String text();39 String textWithHardLineBreaks();40 37 41 38 VisiblePosition visiblePositionForIndex(int index) const; -
trunk/Source/WebKit/qt/Api/qwebpage.cpp
r93303 r94252 1440 1440 } 1441 1441 case Qt::ImSurroundingText: { 1442 if (renderTextControl ) {1443 QString text = renderTextControl->text ();1442 if (renderTextControl && renderTextControl->textFormControlElement()) { 1443 QString text = renderTextControl->textFormControlElement()->value(); 1444 1444 RefPtr<Range> range = editor->compositionRange(); 1445 1445 if (range) … … 1450 1450 } 1451 1451 case Qt::ImCurrentSelection: { 1452 if (!editor->hasComposition() && renderTextControl ) {1452 if (!editor->hasComposition() && renderTextControl && renderTextControl->textFormControlElement()) { 1453 1453 int start = frame->selection()->start().offsetInContainerNode(); 1454 1454 int end = frame->selection()->end().offsetInContainerNode(); 1455 1455 if (end > start) 1456 return QVariant(QString(renderTextControl->text ()).mid(start, end - start));1456 return QVariant(QString(renderTextControl->textFormControlElement()->value()).mid(start, end - start)); 1457 1457 } 1458 1458 return QVariant(); -
trunk/Source/WebKit/qt/ChangeLog
r94182 r94252 1 2011-08-31 Ryosuke Niwa <rniwa@webkit.org> 2 3 Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement 4 https://bugs.webkit.org/show_bug.cgi?id=67320 5 6 Reviewed by Darin Adler. 7 8 Call HTMLTextFormControlElement::value() instead of RenderText::text() 9 10 * Api/qwebpage.cpp: 11 (QWebPage::inputMethodQuery): 12 1 13 2011-08-31 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> 2 14
Note: See TracChangeset
for help on using the changeset viewer.