Diff
Modified: trunk/Source/WebCore/ChangeLog (94251 => 94252)
--- trunk/Source/WebCore/ChangeLog 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/ChangeLog 2011-09-01 00:00:12 UTC (rev 94252)
@@ -1,3 +1,43 @@
+2011-08-31 Ryosuke Niwa <rn...@webkit.org>
+
+ Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement
+ https://bugs.webkit.org/show_bug.cgi?id=67320
+
+ Reviewed by Darin Adler.
+
+ Moved and renamed RenderText::text and RenderText::textWithHardLineBreaks to
+ HTMLTextFormControlElement::innerTextValue and HTMLTextFormControlElement::valueWithHardLineBreaks.
+
+ * accessibility/AccessibilityRenderObject.cpp:
+ (WebCore::AccessibilityRenderObject::text):
+ * html/HTMLInputElement.cpp:
+ (WebCore::HTMLInputElement::subtreeHasChanged):
+ * html/HTMLTextAreaElement.cpp:
+ (WebCore::HTMLTextAreaElement::appendFormData): Calls valueWithHardLineBreaks. It doesn't have to check
+ the existence of renderer anymore because valueWithHardLineBreaks returns value() when renderer do not
+ exist unlike RenderText::textWithHardLineBreaks returned emptyString() in such cases. This is the only place
+ valueWithHardLineBreaks is ever called; but we can't move valueWithHardLineBreaks because it calls
+ finishText.
+ (WebCore::HTMLTextAreaElement::handleBeforeTextInsertedEvent):
+ (WebCore::HTMLTextAreaElement::updateValue):
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::selectedText):
+ (WebCore::HTMLTextFormControlElement::setInnerTextValue):
+ (WebCore::finishText): Moved from RenderText.cpp
+ (WebCore::HTMLTextFormControlElement::innerTextValue): Ditto.
+ (WebCore::getNextSoftBreak): Ditto.
+ (WebCore::HTMLTextFormControlElement::valueWithHardLineBreaks): Ditto; this function returns value()
+ when there are no renderers or root inline boxes instead of emptyString().
+ * html/HTMLTextFormControlElement.h:
+ * html/NumberInputType.cpp:
+ (WebCore::NumberInputType::hasUnacceptableValue):
+ * html/SearchInputType.cpp:
+ (WebCore::SearchInputType::startSearchEventTimer):
+ * html/TextFieldInputType.cpp:
+ (WebCore::TextFieldInputType::handleBeforeTextInsertedEvent):
+ * rendering/RenderTextControl.cpp:
+ * rendering/RenderTextControl.h:
+
2011-08-31 Jeff Miller <je...@apple.com>
REGRESSION(92210): AVFoundation media engine is disabled on OS X
Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (94251 => 94252)
--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -1951,13 +1951,14 @@
if (!isTextControl() || isPasswordField())
return String();
-
- if (isNativeTextControl())
- return toRenderTextControl(m_renderer)->text();
-
+
Node* node = m_renderer->node();
if (!node)
return String();
+
+ if (isNativeTextControl())
+ return toRenderTextControl(m_renderer)->textFormControlElement()->value();
+
if (!node->isElementNode())
return String();
Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -628,7 +628,7 @@
// HTMLInputElement::handleBeforeTextInsertedEvent() has already called
// sanitizeUserInputValue().
// sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent.
- String value = toRenderTextControl(renderer())->text();
+ String value = innerTextValue();
if (isAcceptableValue(value))
setValueFromRenderer(sanitizeValue(convertFromVisibleValue(value)));
// Recalc for :invalid and hasUnacceptableValue() change.
Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -171,10 +171,7 @@
document()->updateLayout();
- // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer.
- // While we have no evidence this has ever been a practical problem, it would be best to fix it some day.
- RenderTextControl* control = toRenderTextControl(renderer());
- const String& text = (m_wrap == HardWrap && control) ? control->textWithHardLineBreaks() : value();
+ const String& text = (m_wrap == HardWrap) ? valueWithHardLineBreaks() : value();
encoding.appendData(name(), text);
return true;
}
@@ -253,7 +250,7 @@
return;
unsigned unsignedMaxLength = static_cast<unsigned>(signedMaxLength);
- unsigned currentLength = numGraphemeClusters(toRenderTextControl(renderer())->text());
+ unsigned currentLength = numGraphemeClusters(innerTextValue());
// selectionLength represents the selection length of this text field to be
// removed by this insertion.
// If the text field has no focus, we don't need to take account of the
@@ -289,7 +286,7 @@
return;
ASSERT(renderer());
- m_value = toRenderTextControl(renderer())->text();
+ m_value = innerTextValue();
const_cast<HTMLTextAreaElement*>(this)->setFormControlValueMatchesRenderer(true);
const_cast<HTMLTextAreaElement*>(this)->notifyFormStateChanged();
m_isDirty = true;
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -42,8 +42,10 @@
#include "RenderTextControl.h"
#include "RenderTheme.h"
#include "ScriptEventListener.h"
+#include "Text.h"
#include "TextIterator.h"
#include <wtf/Vector.h>
+#include <wtf/text/StringBuilder.h>
namespace WebCore {
@@ -186,12 +188,9 @@
String HTMLTextFormControlElement::selectedText() const
{
- // FIXME: We should be able to extract selected contents even if there were no renderer.
- if (!renderer() || renderer()->isTextControl())
+ if (!isTextFormControl())
return String();
-
- RenderTextControl* textControl = toRenderTextControl(renderer());
- return textControl->text().substring(selectionStart(), selectionEnd() - selectionStart());
+ return value().substring(selectionStart(), selectionEnd() - selectionStart());
}
void HTMLTextFormControlElement::dispatchFormControlChangeEvent()
@@ -454,14 +453,13 @@
void HTMLTextFormControlElement::setInnerTextValue(const String& value)
{
- if (!renderer() || !isTextFormControl())
+ if (!isTextFormControl())
return;
- RenderTextControl* textControl = toRenderTextControl(renderer());
- bool textIsChanged = value != textControl->text();
+ bool textIsChanged = value != innerTextValue();
if (textIsChanged || !innerTextElement()->hasChildNodes()) {
- if (textIsChanged && document() && AXObjectCache::accessibilityEnabled())
- document()->axObjectCache()->postNotification(textControl, AXObjectCache::AXValueChanged, false);
+ if (textIsChanged && document() && renderer() && AXObjectCache::accessibilityEnabled())
+ document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXValueChanged, false);
ExceptionCode ec = 0;
innerTextElement()->setInnerText(value, ec);
@@ -476,6 +474,92 @@
setFormControlValueMatchesRenderer(true);
}
+static String finishText(StringBuilder& result)
+{
+ // Remove one trailing newline; there's always one that's collapsed out by rendering.
+ size_t size = result.length();
+ if (size && result[size - 1] == '\n')
+ result.resize(--size);
+ return result.toString();
+}
+
+String HTMLTextFormControlElement::innerTextValue() const
+{
+ HTMLElement* innerText = innerTextElement();
+ if (!innerText || !isTextFormControl())
+ return emptyString();
+
+ StringBuilder result;
+ for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) {
+ if (node->hasTagName(brTag))
+ result.append(newlineCharacter);
+ else if (node->isTextNode())
+ result.append(static_cast<Text*>(node)->data());
+ }
+ return finishText(result);
+}
+
+static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset)
+{
+ RootInlineBox* next;
+ for (; line; line = next) {
+ next = line->nextRootBox();
+ if (next && !line->endsWithBreak()) {
+ ASSERT(line->lineBreakObj());
+ breakNode = line->lineBreakObj()->node();
+ breakOffset = line->lineBreakPos();
+ line = next;
+ return;
+ }
+ }
+ breakNode = 0;
+ breakOffset = 0;
+}
+
+String HTMLTextFormControlElement::valueWithHardLineBreaks() const
+{
+ // FIXME: It's not acceptable to ignore the HardWrap setting when there is no renderer.
+ // While we have no evidence this has ever been a practical problem, it would be best to fix it some day.
+ HTMLElement* innerText = innerTextElement();
+ if (!innerText || !isTextFormControl())
+ return value();
+
+ RenderBlock* renderer = toRenderBlock(innerText->renderer());
+ if (!renderer)
+ return value();
+
+ Node* breakNode;
+ unsigned breakOffset;
+ RootInlineBox* line = renderer->firstRootBox();
+ if (!line)
+ return value();
+
+ getNextSoftBreak(line, breakNode, breakOffset);
+
+ StringBuilder result;
+ for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) {
+ if (node->hasTagName(brTag))
+ result.append(newlineCharacter);
+ else if (node->isTextNode()) {
+ String data = ""
+ unsigned length = data.length();
+ unsigned position = 0;
+ while (breakNode == node && breakOffset <= length) {
+ if (breakOffset > position) {
+ result.append(data.characters() + position, breakOffset - position);
+ position = breakOffset;
+ result.append(newlineCharacter);
+ }
+ getNextSoftBreak(line, breakNode, breakOffset);
+ }
+ result.append(data.characters() + position, length - position);
+ }
+ while (breakNode == node)
+ getNextSoftBreak(line, breakNode, breakOffset);
+ }
+ return finishText(result);
+}
+
HTMLTextFormControlElement* enclosingTextFormControl(const Position& position)
{
ASSERT(position.isNull() || position.anchorType() == Position::PositionIsOffsetInAnchor
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.h (94251 => 94252)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2011-09-01 00:00:12 UTC (rev 94252)
@@ -77,6 +77,7 @@
void notifyFormStateChanged();
bool lastChangeWasUserEdit() const;
void setInnerTextValue(const String&);
+ String innerTextValue() const;
protected:
HTMLTextFormControlElement(const QualifiedName&, Document*, HTMLFormElement*);
@@ -100,6 +101,8 @@
virtual void subtreeHasChanged() = 0;
void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
+
+ String valueWithHardLineBreaks() const;
private:
int computeSelectionStart() const;
int computeSelectionEnd() const;
Modified: trunk/Source/WebCore/html/NumberInputType.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/NumberInputType.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/NumberInputType.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -318,7 +318,7 @@
bool NumberInputType::hasUnacceptableValue()
{
- return element()->renderer() && !isAcceptableValue(toRenderTextControl(element()->renderer())->text());
+ return element()->renderer() && !isAcceptableValue(element()->innerTextValue());
}
bool NumberInputType::shouldRespectSpeechAttribute()
Modified: trunk/Source/WebCore/html/SearchInputType.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/SearchInputType.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/SearchInputType.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -128,7 +128,7 @@
void SearchInputType::startSearchEventTimer()
{
ASSERT(element()->renderer());
- unsigned length = toRenderTextControlSingleLine(element()->renderer())->text().length();
+ unsigned length = element()->innerTextValue().length();
if (!length) {
stopSearchEventTimer();
Modified: trunk/Source/WebCore/html/TextFieldInputType.cpp (94251 => 94252)
--- trunk/Source/WebCore/html/TextFieldInputType.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/html/TextFieldInputType.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -292,7 +292,7 @@
// We use RenderTextControlSingleLine::text() instead of InputElement::value()
// because they can be mismatched by sanitizeValue() in
// HTMLInputElement::subtreeHasChanged() in some cases.
- unsigned oldLength = numGraphemeClusters(toRenderTextControlSingleLine(element()->renderer())->text());
+ unsigned oldLength = numGraphemeClusters(element()->innerTextValue());
// selectionLength represents the selection length of this text field to be
// removed by this insertion.
Modified: trunk/Source/WebCore/rendering/RenderTextControl.cpp (94251 => 94252)
--- trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/rendering/RenderTextControl.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -22,27 +22,18 @@
#include "config.h"
#include "RenderTextControl.h"
-#include "Editor.h"
-#include "Frame.h"
-#include "HTMLBRElement.h"
-#include "HTMLInputElement.h"
-#include "HTMLNames.h"
+#include "HTMLTextFormControlElement.h"
#include "HitTestResult.h"
-#include "Position.h"
-#include "RenderLayer.h"
#include "RenderText.h"
#include "ScrollbarTheme.h"
-#include "Text.h"
#include "TextIterator.h"
-#include <wtf/text/StringBuilder.h>
+#include "VisiblePosition.h"
#include <wtf/unicode/CharacterNames.h>
using namespace std;
namespace WebCore {
-using namespace HTMLNames;
-
// Value chosen by observation. This can be tweaked.
static const int minColorContrastValue = 1300;
@@ -162,90 +153,6 @@
return VisiblePosition(it.range()->endPosition(), UPSTREAM);
}
-static String finishText(StringBuilder& result)
-{
- // Remove one trailing newline; there's always one that's collapsed out by rendering.
- size_t size = result.length();
- if (size && result[size - 1] == '\n')
- result.resize(--size);
- return result.toString();
-}
-
-String RenderTextControl::text()
-{
- HTMLElement* innerText = innerTextElement();
- if (!innerText)
- return emptyString();
-
- StringBuilder result;
- for (Node* node = innerText; node; node = node->traverseNextNode(innerText)) {
- if (node->hasTagName(brTag))
- result.append(newlineCharacter);
- else if (node->isTextNode())
- result.append(static_cast<Text*>(node)->data());
- }
- return finishText(result);
-}
-
-static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset)
-{
- RootInlineBox* next;
- for (; line; line = next) {
- next = line->nextRootBox();
- if (next && !line->endsWithBreak()) {
- ASSERT(line->lineBreakObj());
- breakNode = line->lineBreakObj()->node();
- breakOffset = line->lineBreakPos();
- line = next;
- return;
- }
- }
- breakNode = 0;
- breakOffset = 0;
-}
-
-String RenderTextControl::textWithHardLineBreaks()
-{
- HTMLElement* innerText = innerTextElement();
- if (!innerText)
- return emptyString();
-
- RenderBlock* renderer = toRenderBlock(innerText->renderer());
- if (!renderer)
- return emptyString();
-
- Node* breakNode;
- unsigned breakOffset;
- RootInlineBox* line = renderer->firstRootBox();
- if (!line)
- return emptyString();
-
- getNextSoftBreak(line, breakNode, breakOffset);
-
- StringBuilder result;
- for (Node* node = innerText->firstChild(); node; node = node->traverseNextNode(innerText)) {
- if (node->hasTagName(brTag))
- result.append(newlineCharacter);
- else if (node->isTextNode()) {
- String data = ""
- unsigned length = data.length();
- unsigned position = 0;
- while (breakNode == node && breakOffset <= length) {
- if (breakOffset > position) {
- result.append(data.characters() + position, breakOffset - position);
- position = breakOffset;
- result.append(newlineCharacter);
- }
- getNextSoftBreak(line, breakNode, breakOffset);
- }
- result.append(data.characters() + position, length - position);
- }
- while (breakNode == node)
- getNextSoftBreak(line, breakNode, breakOffset);
- }
- return finishText(result);
-}
-
int RenderTextControl::scrollbarThickness() const
{
// FIXME: We should get the size of the scrollbar from the RenderTheme instead.
Modified: trunk/Source/WebCore/rendering/RenderTextControl.h (94251 => 94252)
--- trunk/Source/WebCore/rendering/RenderTextControl.h 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebCore/rendering/RenderTextControl.h 2011-09-01 00:00:12 UTC (rev 94252)
@@ -35,9 +35,6 @@
HTMLTextFormControlElement* textFormControlElement() const;
virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const = 0;
- String text();
- String textWithHardLineBreaks();
-
VisiblePosition visiblePositionForIndex(int index) const;
protected:
Modified: trunk/Source/WebKit/qt/Api/qwebpage.cpp (94251 => 94252)
--- trunk/Source/WebKit/qt/Api/qwebpage.cpp 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebKit/qt/Api/qwebpage.cpp 2011-09-01 00:00:12 UTC (rev 94252)
@@ -1439,8 +1439,8 @@
return QVariant(frame->selection()->extent().offsetInContainerNode());
}
case Qt::ImSurroundingText: {
- if (renderTextControl) {
- QString text = renderTextControl->text();
+ if (renderTextControl && renderTextControl->textFormControlElement()) {
+ QString text = renderTextControl->textFormControlElement()->value();
RefPtr<Range> range = editor->compositionRange();
if (range)
text.remove(range->startPosition().offsetInContainerNode(), TextIterator::rangeLength(range.get()));
@@ -1449,11 +1449,11 @@
return QVariant();
}
case Qt::ImCurrentSelection: {
- if (!editor->hasComposition() && renderTextControl) {
+ if (!editor->hasComposition() && renderTextControl && renderTextControl->textFormControlElement()) {
int start = frame->selection()->start().offsetInContainerNode();
int end = frame->selection()->end().offsetInContainerNode();
if (end > start)
- return QVariant(QString(renderTextControl->text()).mid(start, end - start));
+ return QVariant(QString(renderTextControl->textFormControlElement()->value()).mid(start, end - start));
}
return QVariant();
Modified: trunk/Source/WebKit/qt/ChangeLog (94251 => 94252)
--- trunk/Source/WebKit/qt/ChangeLog 2011-08-31 23:55:01 UTC (rev 94251)
+++ trunk/Source/WebKit/qt/ChangeLog 2011-09-01 00:00:12 UTC (rev 94252)
@@ -1,3 +1,15 @@
+2011-08-31 Ryosuke Niwa <rn...@webkit.org>
+
+ Move text() and textWithHardLineBreaks() from RenderTextControl to HTMLTextFormControlElement
+ https://bugs.webkit.org/show_bug.cgi?id=67320
+
+ Reviewed by Darin Adler.
+
+ Call HTMLTextFormControlElement::value() instead of RenderText::text()
+
+ * Api/qwebpage.cpp:
+ (QWebPage::inputMethodQuery):
+
2011-08-31 Caio Marcelo de Oliveira Filho <caio.olive...@openbossa.org>
[Qt] Unskip API test for load signals order