Title: [164183] trunk/Source/WebCore
- Revision
- 164183
- Author
- [email protected]
- Date
- 2014-02-15 16:36:36 -0800 (Sat, 15 Feb 2014)
Log Message
HTMLTextFormControlElement::subtreeHasChanged should be called before updating selection
https://bugs.webkit.org/show_bug.cgi?id=128870
Reviewed by Darin Adler.
Extracted HTMLTextFormControlElement::didEditInnerTextValue out of HTMLTextFormControlElement::defaultEventHandler
and called it in appliedEditing, unappliedEditing, and reappliedEditing before updating selection.
* editing/Editor.cpp:
(WebCore::notifyTextFromControls): Added.
(WebCore::Editor::appliedEditing): Update text form control's internal states before updating selection.
(WebCore::Editor::unappliedEditing): Ditto.
(WebCore::Editor::reappliedEditing): Ditto.
* html/HTMLTextFormControlElement.cpp:
(WebCore::HTMLTextFormControlElement::didEditInnerTextValue):
* html/TextFieldInputType.cpp:
(WebCore::TextFieldInputType::subtreeHasChanged): Removed a stale assertion from the time we used to do
everything in the render tree.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (164182 => 164183)
--- trunk/Source/WebCore/ChangeLog 2014-02-16 00:26:53 UTC (rev 164182)
+++ trunk/Source/WebCore/ChangeLog 2014-02-16 00:36:36 UTC (rev 164183)
@@ -1,3 +1,24 @@
+2014-02-15 Ryosuke Niwa <[email protected]>
+
+ HTMLTextFormControlElement::subtreeHasChanged should be called before updating selection
+ https://bugs.webkit.org/show_bug.cgi?id=128870
+
+ Reviewed by Darin Adler.
+
+ Extracted HTMLTextFormControlElement::didEditInnerTextValue out of HTMLTextFormControlElement::defaultEventHandler
+ and called it in appliedEditing, unappliedEditing, and reappliedEditing before updating selection.
+
+ * editing/Editor.cpp:
+ (WebCore::notifyTextFromControls): Added.
+ (WebCore::Editor::appliedEditing): Update text form control's internal states before updating selection.
+ (WebCore::Editor::unappliedEditing): Ditto.
+ (WebCore::Editor::reappliedEditing): Ditto.
+ * html/HTMLTextFormControlElement.cpp:
+ (WebCore::HTMLTextFormControlElement::didEditInnerTextValue):
+ * html/TextFieldInputType.cpp:
+ (WebCore::TextFieldInputType::subtreeHasChanged): Removed a stale assertion from the time we used to do
+ everything in the render tree.
+
2014-02-15 Andreas Kling <[email protected]>
Add checked casts for ScriptExecutionContext.
Modified: trunk/Source/WebCore/editing/Editor.cpp (164182 => 164183)
--- trunk/Source/WebCore/editing/Editor.cpp 2014-02-16 00:26:53 UTC (rev 164182)
+++ trunk/Source/WebCore/editing/Editor.cpp 2014-02-16 00:36:36 UTC (rev 164183)
@@ -1055,6 +1055,16 @@
applyCommand(IndentOutdentCommand::create(document(), IndentOutdentCommand::Outdent));
}
+static void notifyTextFromControls(Element* startRoot, Element* endRoot)
+{
+ HTMLTextFormControlElement* startingTextControl = enclosingTextFormControl(firstPositionInOrBeforeNode(startRoot));
+ HTMLTextFormControlElement* endingTextControl = enclosingTextFormControl(firstPositionInOrBeforeNode(endRoot));
+ if (startingTextControl)
+ startingTextControl->didEditInnerTextValue();
+ if (endingTextControl && startingTextControl != endingTextControl)
+ endingTextControl->didEditInnerTextValue();
+}
+
static void dispatchEditableContentChangedEvents(PassRefPtr<Element> prpStartRoot, PassRefPtr<Element> prpEndRoot)
{
RefPtr<Element> startRoot = prpStartRoot;
@@ -1075,6 +1085,8 @@
m_alternativeTextController->respondToAppliedEditing(cmd.get());
+ notifyTextFromControls(composition->startingRootEditableElement(), composition->endingRootEditableElement());
+
// Don't clear the typing style with this selection change. We do those things elsewhere if necessary.
FrameSelection::SetSelectionOptions options = cmd->isDictationCommand() ? FrameSelection::DictationTriggered : 0;
changeSelectionAfterCommand(newSelection, options);
@@ -1101,6 +1113,8 @@
{
document().updateLayout();
+ notifyTextFromControls(cmd->startingRootEditableElement(), cmd->endingRootEditableElement());
+
VisibleSelection newSelection(cmd->startingSelection());
changeSelectionAfterCommand(newSelection, FrameSelection::defaultSetSelectionOptions());
dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(), cmd->endingRootEditableElement());
@@ -1117,6 +1131,8 @@
{
document().updateLayout();
+ notifyTextFromControls(cmd->startingRootEditableElement(), cmd->endingRootEditableElement());
+
VisibleSelection newSelection(cmd->endingSelection());
changeSelectionAfterCommand(newSelection, FrameSelection::defaultSetSelectionOptions());
dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(), cmd->endingRootEditableElement());
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp (164182 => 164183)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2014-02-16 00:26:53 UTC (rev 164182)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.cpp 2014-02-16 00:36:36 UTC (rev 164183)
@@ -102,15 +102,13 @@
HTMLFormControlElementWithState::dispatchBlurEvent(newFocusedElement);
}
-void HTMLTextFormControlElement::defaultEventHandler(Event* event)
+void HTMLTextFormControlElement::didEditInnerTextValue()
{
- if (event->type() == eventNames().webkitEditableContentChangedEvent && renderer() && renderer()->isTextControl()) {
- m_lastChangeWasUserEdit = true;
- subtreeHasChanged();
+ if (!isTextFormControl())
return;
- }
- HTMLFormControlElementWithState::defaultEventHandler(event);
+ m_lastChangeWasUserEdit = true;
+ subtreeHasChanged();
}
void HTMLTextFormControlElement::forwardEvent(Event* event)
Modified: trunk/Source/WebCore/html/HTMLTextFormControlElement.h (164182 => 164183)
--- trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2014-02-16 00:26:53 UTC (rev 164182)
+++ trunk/Source/WebCore/html/HTMLTextFormControlElement.h 2014-02-16 00:36:36 UTC (rev 164183)
@@ -44,6 +44,7 @@
virtual ~HTMLTextFormControlElement();
+ void didEditInnerTextValue();
void forwardEvent(Event*);
virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
@@ -108,7 +109,6 @@
void restoreCachedSelection();
bool hasCachedSelection() const { return m_cachedSelectionStart >= 0; }
- virtual void defaultEventHandler(Event*) override;
virtual void subtreeHasChanged() = 0;
void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
Modified: trunk/Source/WebCore/html/TextFieldInputType.cpp (164182 => 164183)
--- trunk/Source/WebCore/html/TextFieldInputType.cpp 2014-02-16 00:26:53 UTC (rev 164182)
+++ trunk/Source/WebCore/html/TextFieldInputType.cpp 2014-02-16 00:36:36 UTC (rev 164183)
@@ -443,8 +443,6 @@
void TextFieldInputType::subtreeHasChanged()
{
- ASSERT(element().renderer());
-
bool wasChanged = element().wasChangedSinceLastFormControlChangeEvent();
element().setChangedSinceLastFormControlChangeEvent(true);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes