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

Reply via email to