[GTK] REGRESSION(183368): It made editing tests assert
authorjdiggs@igalia.com <jdiggs@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 May 2015 19:37:55 +0000 (19:37 +0000)
committerjdiggs@igalia.com <jdiggs@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 May 2015 19:37:55 +0000 (19:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=144447

Reviewed by Chris Fleizach.

Don't notify platforms of editing actions of type EditActionUnspecified.
If we don't know what the action is, platform accessibility APIs certainly
won't.

Add AXTextEditTypeAttributesChange and AXTextAttributesChanged as catch-alls
for formatting changes. ATK lacks finely-grained signals through which to
specify which text attributes have changed. If other platforms have such
signals, new types can always be added.

Don't post an accessible replacement notification for AXTextEditTypeCut.
The notification is handled by DeleteSelectionCommand. It is possible for
white space to be inserted in preparation for a cut which was triggering
a not-reached assert, but insertion of whitespace in preparation for a
cut does not seem notification-worthy.

Treat AXTextEditTypeDictation the same as other insertion types (insert,
paste, typing) with respect to replacement notifications.

No new tests. The hundreds of editing tests that had been crashing seem sufficient.

* accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::showIntent):
(WebCore::AXObjectCache::textChangeForEditType):
* accessibility/AXObjectCache.h:
* accessibility/AXTextStateChangeIntent.h:
* accessibility/atk/AXObjectCacheAtk.cpp:
(WebCore::AXObjectCache::nodeTextChangePlatformNotification):
* editing/AppendNodeCommand.cpp:
(WebCore::AppendNodeCommand::doApply):
(WebCore::AppendNodeCommand::doUnapply):
* editing/DeleteFromTextNodeCommand.cpp:
(WebCore::DeleteFromTextNodeCommand::doApply):
(WebCore::DeleteFromTextNodeCommand::doUnapply):
* editing/EditCommand.cpp:
(WebCore::EditCommand::applyEditType):
(WebCore::EditCommand::unapplyEditType):
* editing/InsertIntoTextNodeCommand.cpp:
(WebCore::InsertIntoTextNodeCommand::doApply):
(WebCore::InsertIntoTextNodeCommand::doUnapply):
* editing/InsertNodeBeforeCommand.cpp:
(WebCore::InsertNodeBeforeCommand::doApply):
(WebCore::InsertNodeBeforeCommand::doUnapply):
* editing/ReplaceInsertIntoTextNodeCommand.cpp:
(WebCore::ReplaceInsertIntoTextNodeCommand::notifyAccessibilityForTextChange):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@183683 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AXObjectCache.cpp
Source/WebCore/accessibility/AXObjectCache.h
Source/WebCore/accessibility/AXTextStateChangeIntent.h
Source/WebCore/accessibility/atk/AXObjectCacheAtk.cpp
Source/WebCore/editing/AppendNodeCommand.cpp
Source/WebCore/editing/DeleteFromTextNodeCommand.cpp
Source/WebCore/editing/EditCommand.cpp
Source/WebCore/editing/EditCommand.h
Source/WebCore/editing/InsertIntoTextNodeCommand.cpp
Source/WebCore/editing/InsertNodeBeforeCommand.cpp
Source/WebCore/editing/ReplaceInsertIntoTextNodeCommand.cpp

index 9a51822..6e3e35c 100644 (file)
@@ -1,3 +1,55 @@
+2015-05-01  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        [GTK] REGRESSION(183368): It made editing tests assert
+        https://bugs.webkit.org/show_bug.cgi?id=144447
+
+        Reviewed by Chris Fleizach.
+
+        Don't notify platforms of editing actions of type EditActionUnspecified.
+        If we don't know what the action is, platform accessibility APIs certainly
+        won't.
+
+        Add AXTextEditTypeAttributesChange and AXTextAttributesChanged as catch-alls
+        for formatting changes. ATK lacks finely-grained signals through which to
+        specify which text attributes have changed. If other platforms have such
+        signals, new types can always be added.
+
+        Don't post an accessible replacement notification for AXTextEditTypeCut.
+        The notification is handled by DeleteSelectionCommand. It is possible for
+        white space to be inserted in preparation for a cut which was triggering
+        a not-reached assert, but insertion of whitespace in preparation for a
+        cut does not seem notification-worthy.
+
+        Treat AXTextEditTypeDictation the same as other insertion types (insert,
+        paste, typing) with respect to replacement notifications.
+
+        No new tests. The hundreds of editing tests that had been crashing seem sufficient.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::AXObjectCache::showIntent):
+        (WebCore::AXObjectCache::textChangeForEditType):
+        * accessibility/AXObjectCache.h:
+        * accessibility/AXTextStateChangeIntent.h:
+        * accessibility/atk/AXObjectCacheAtk.cpp:
+        (WebCore::AXObjectCache::nodeTextChangePlatformNotification):
+        * editing/AppendNodeCommand.cpp:
+        (WebCore::AppendNodeCommand::doApply):
+        (WebCore::AppendNodeCommand::doUnapply):
+        * editing/DeleteFromTextNodeCommand.cpp:
+        (WebCore::DeleteFromTextNodeCommand::doApply):
+        (WebCore::DeleteFromTextNodeCommand::doUnapply):
+        * editing/EditCommand.cpp:
+        (WebCore::EditCommand::applyEditType):
+        (WebCore::EditCommand::unapplyEditType):
+        * editing/InsertIntoTextNodeCommand.cpp:
+        (WebCore::InsertIntoTextNodeCommand::doApply):
+        (WebCore::InsertIntoTextNodeCommand::doUnapply):
+        * editing/InsertNodeBeforeCommand.cpp:
+        (WebCore::InsertNodeBeforeCommand::doApply):
+        (WebCore::InsertNodeBeforeCommand::doUnapply):
+        * editing/ReplaceInsertIntoTextNodeCommand.cpp:
+        (WebCore::ReplaceInsertIntoTextNodeCommand::notifyAccessibilityForTextChange):
+
 2015-05-01  Brady Eidson  <beidson@apple.com>
 
         Add API to disable meta refreshes.
 2015-05-01  Brady Eidson  <beidson@apple.com>
 
         Add API to disable meta refreshes.
index 7cf82eb..91ae276 100644 (file)
@@ -916,6 +916,9 @@ void AXObjectCache::showIntent(const AXTextStateChangeIntent &intent)
         case AXTextEditTypePaste:
             dataLog("Paste");
             break;
         case AXTextEditTypePaste:
             dataLog("Paste");
             break;
+        case AXTextEditTypeAttributesChange:
+            dataLog("AttributesChange");
+            break;
         }
         break;
     case AXTextStateChangeTypeSelectionMove:
         }
         break;
     case AXTextStateChangeTypeSelectionMove:
@@ -1342,6 +1345,8 @@ AXTextChange AXObjectCache::textChangeForEditType(AXTextEditType type)
     case AXTextEditTypeTyping:
     case AXTextEditTypePaste:
         return AXTextInserted;
     case AXTextEditTypeTyping:
     case AXTextEditTypePaste:
         return AXTextInserted;
+    case AXTextEditTypeAttributesChange:
+        return AXTextAttributesChanged;
     case AXTextEditTypeUnknown:
         break;
     }
     case AXTextEditTypeUnknown:
         break;
     }
index a7afddd..7a6e174 100644 (file)
@@ -70,7 +70,7 @@ private:
 };
 
 #if !PLATFORM(COCOA)
 };
 
 #if !PLATFORM(COCOA)
-enum AXTextChange { AXTextInserted, AXTextDeleted };
+enum AXTextChange { AXTextInserted, AXTextDeleted, AXTextAttributesChanged };
 #endif
 
 enum PostTarget { TargetElement, TargetObservableParent };
 #endif
 
 enum PostTarget { TargetElement, TargetObservableParent };
index 95c264f..697d8a5 100644 (file)
@@ -42,7 +42,8 @@ enum AXTextEditType {
     AXTextEditTypeTyping, // Insert via typing
     AXTextEditTypeDictation, // Insert via dictation
     AXTextEditTypeCut, // Delete via Cut
     AXTextEditTypeTyping, // Insert via typing
     AXTextEditTypeDictation, // Insert via dictation
     AXTextEditTypeCut, // Delete via Cut
-    AXTextEditTypePaste // Insert via Paste
+    AXTextEditTypePaste, // Insert via Paste
+    AXTextEditTypeAttributesChange // Change font, style, alignment, color, etc.
 };
 
 enum AXTextSelectionDirection {
 };
 
 enum AXTextSelectionDirection {
index ae2560b..4d3834e 100644 (file)
@@ -274,6 +274,9 @@ void AXObjectCache::nodeTextChangePlatformNotification(AccessibilityObject* obje
     case AXTextDeleted:
         detail = "text-remove";
         break;
     case AXTextDeleted:
         detail = "text-remove";
         break;
+    case AXTextAttributesChanged:
+        detail = "text-attributes-changed";
+        break;
     }
 
     String textToEmit = text;
     }
 
     String textToEmit = text;
index ce74f0d..6a8d9e9 100644 (file)
@@ -52,9 +52,6 @@ static void sendAXTextChangedIgnoringLineBreaks(Node* node, AXTextEditType type)
     if (!node)
         return;
 
     if (!node)
         return;
 
-    if (!AXObjectCache::accessibilityEnabled())
-        return;
-
     String text = node->nodeValue();
     // Don't consider linebreaks in this command
     if (text == "\n")
     String text = node->nodeValue();
     // Don't consider linebreaks in this command
     if (text == "\n")
@@ -73,7 +70,8 @@ void AppendNodeCommand::doApply()
 
     m_parent->appendChild(m_node.get(), IGNORE_EXCEPTION);
 
 
     m_parent->appendChild(m_node.get(), IGNORE_EXCEPTION);
 
-    sendAXTextChangedIgnoringLineBreaks(m_node.get(), applyEditType());
+    if (shouldPostAccessibilityNotification())
+        sendAXTextChangedIgnoringLineBreaks(m_node.get(), applyEditType());
 }
 
 void AppendNodeCommand::doUnapply()
 }
 
 void AppendNodeCommand::doUnapply()
@@ -82,7 +80,8 @@ void AppendNodeCommand::doUnapply()
         return;
 
     // Need to notify this before actually deleting the text
         return;
 
     // Need to notify this before actually deleting the text
-    sendAXTextChangedIgnoringLineBreaks(m_node.get(), unapplyEditType());
+    if (shouldPostAccessibilityNotification())
+        sendAXTextChangedIgnoringLineBreaks(m_node.get(), unapplyEditType());
 
     m_node->remove(IGNORE_EXCEPTION);
 }
 
     m_node->remove(IGNORE_EXCEPTION);
 }
index f93cc29..46bf900 100644 (file)
@@ -26,7 +26,6 @@
 #include "config.h"
 #include "DeleteFromTextNodeCommand.h"
 
 #include "config.h"
 #include "DeleteFromTextNodeCommand.h"
 
-#include "AXObjectCache.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Text.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Text.h"
@@ -58,7 +57,7 @@ void DeleteFromTextNodeCommand::doApply()
         return;
     
     // Need to notify this before actually deleting the text
         return;
     
     // Need to notify this before actually deleting the text
-    if (AXObjectCache::accessibilityEnabled())
+    if (shouldPostAccessibilityNotification())
         notifyAccessibilityForTextChange(m_node.get(), applyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 
     m_node->deleteData(m_offset, m_count, ec);
         notifyAccessibilityForTextChange(m_node.get(), applyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 
     m_node->deleteData(m_offset, m_count, ec);
@@ -73,7 +72,7 @@ void DeleteFromTextNodeCommand::doUnapply()
 
     m_node->insertData(m_offset, m_text, IGNORE_EXCEPTION);
 
 
     m_node->insertData(m_offset, m_text, IGNORE_EXCEPTION);
 
-    if (AXObjectCache::accessibilityEnabled())
+    if (shouldPostAccessibilityNotification())
         notifyAccessibilityForTextChange(m_node.get(), unapplyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 }
 
         notifyAccessibilityForTextChange(m_node.get(), unapplyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 }
 
index 6478ae6..4000d42 100644 (file)
@@ -129,6 +129,36 @@ AXTextEditType EditCommand::applyEditType() const
         return AXTextEditTypePaste;
     case EditActionTyping:
         return AXTextEditTypeTyping;
         return AXTextEditTypePaste;
     case EditActionTyping:
         return AXTextEditTypeTyping;
+    case EditActionSetColor:
+    case EditActionSetBackgroundColor:
+    case EditActionTurnOffKerning:
+    case EditActionTightenKerning:
+    case EditActionLoosenKerning:
+    case EditActionUseStandardKerning:
+    case EditActionTurnOffLigatures:
+    case EditActionUseStandardLigatures:
+    case EditActionUseAllLigatures:
+    case EditActionRaiseBaseline:
+    case EditActionLowerBaseline:
+    case EditActionSetTraditionalCharacterShape:
+    case EditActionSetFont:
+    case EditActionChangeAttributes:
+    case EditActionAlignLeft:
+    case EditActionAlignRight:
+    case EditActionCenter:
+    case EditActionJustify:
+    case EditActionSetWritingDirection:
+    case EditActionSubscript:
+    case EditActionSuperscript:
+    case EditActionUnderline:
+    case EditActionOutline:
+    case EditActionUnscript:
+    case EditActionBold:
+    case EditActionItalics:
+    case EditActionFormatBlock:
+    case EditActionIndent:
+    case EditActionOutdent:
+        return AXTextEditTypeAttributesChange;
     // Include default case for unhandled EditAction cases.
     default:
         break;
     // Include default case for unhandled EditAction cases.
     default:
         break;
@@ -149,10 +179,17 @@ AXTextEditType EditCommand::unapplyEditType() const
     case AXTextEditTypeDictation:
     case AXTextEditTypePaste:
         return AXTextEditTypeDelete;
     case AXTextEditTypeDictation:
     case AXTextEditTypePaste:
         return AXTextEditTypeDelete;
+    case AXTextEditTypeAttributesChange:
+        return AXTextEditTypeAttributesChange;
     }
     return AXTextEditTypeUnknown;
 }
 
     }
     return AXTextEditTypeUnknown;
 }
 
+bool EditCommand::shouldPostAccessibilityNotification() const
+{
+    return AXObjectCache::accessibilityEnabled() && editingAction() != EditActionUnspecified;
+}
+
 SimpleEditCommand::SimpleEditCommand(Document& document, EditAction editingAction)
     : EditCommand(document, editingAction)
 {
 SimpleEditCommand::SimpleEditCommand(Document& document, EditAction editingAction)
     : EditCommand(document, editingAction)
 {
index 1a997c9..a783a9b 100644 (file)
@@ -63,6 +63,8 @@ public:
     AXTextEditType applyEditType() const;
     AXTextEditType unapplyEditType() const;
 
     AXTextEditType applyEditType() const;
     AXTextEditType unapplyEditType() const;
 
+    bool shouldPostAccessibilityNotification() const;
+
 protected:
     explicit EditCommand(Document&, EditAction = EditActionUnspecified);
     EditCommand(Document&, const VisibleSelection&, const VisibleSelection&);
 protected:
     explicit EditCommand(Document&, EditAction = EditActionUnspecified);
     EditCommand(Document&, const VisibleSelection&, const VisibleSelection&);
index 94af044..0348b24 100644 (file)
@@ -26,7 +26,6 @@
 #include "config.h"
 #include "InsertIntoTextNodeCommand.h"
 
 #include "config.h"
 #include "InsertIntoTextNodeCommand.h"
 
-#include "AXObjectCache.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Frame.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Frame.h"
@@ -66,7 +65,7 @@ void InsertIntoTextNodeCommand::doApply()
 
     m_node->insertData(m_offset, m_text, IGNORE_EXCEPTION);
 
 
     m_node->insertData(m_offset, m_text, IGNORE_EXCEPTION);
 
-    if (AXObjectCache::accessibilityEnabled())
+    if (shouldPostAccessibilityNotification())
         notifyAccessibilityForTextChange(m_node.get(), applyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 }
 
         notifyAccessibilityForTextChange(m_node.get(), applyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 }
 
@@ -84,7 +83,7 @@ void InsertIntoTextNodeCommand::doUnapply()
         return;
         
     // Need to notify this before actually deleting the text
         return;
         
     // Need to notify this before actually deleting the text
-    if (AXObjectCache::accessibilityEnabled())
+    if (shouldPostAccessibilityNotification())
         notifyAccessibilityForTextChange(m_node.get(), unapplyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 
     m_node->deleteData(m_offset, m_text.length(), IGNORE_EXCEPTION);
         notifyAccessibilityForTextChange(m_node.get(), unapplyEditType(), m_text, VisiblePosition(Position(m_node, m_offset)));
 
     m_node->deleteData(m_offset, m_text.length(), IGNORE_EXCEPTION);
index c6b229b..09f9b1b 100644 (file)
@@ -26,7 +26,6 @@
 #include "config.h"
 #include "InsertNodeBeforeCommand.h"
 
 #include "config.h"
 #include "InsertNodeBeforeCommand.h"
 
-#include "AXObjectCache.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Text.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
 #include "Text.h"
@@ -57,7 +56,7 @@ void InsertNodeBeforeCommand::doApply()
 
     parent->insertBefore(m_insertChild.get(), m_refChild.get(), IGNORE_EXCEPTION);
 
 
     parent->insertBefore(m_insertChild.get(), m_refChild.get(), IGNORE_EXCEPTION);
 
-    if (AXObjectCache::accessibilityEnabled()) {
+    if (shouldPostAccessibilityNotification()) {
         Position position = is<Text>(m_insertChild.get()) ? Position(downcast<Text>(m_insertChild.get()), 0) : createLegacyEditingPosition(m_insertChild.get(), 0);
         notifyAccessibilityForTextChange(m_insertChild.get(), applyEditType(), m_insertChild->nodeValue(), VisiblePosition(position));
     }
         Position position = is<Text>(m_insertChild.get()) ? Position(downcast<Text>(m_insertChild.get()), 0) : createLegacyEditingPosition(m_insertChild.get(), 0);
         notifyAccessibilityForTextChange(m_insertChild.get(), applyEditType(), m_insertChild->nodeValue(), VisiblePosition(position));
     }
@@ -69,7 +68,7 @@ void InsertNodeBeforeCommand::doUnapply()
         return;
 
     // Need to notify this before actually deleting the text
         return;
 
     // Need to notify this before actually deleting the text
-    if (AXObjectCache::accessibilityEnabled()) {
+    if (shouldPostAccessibilityNotification()) {
         Position position = is<Text>(m_insertChild.get()) ? Position(downcast<Text>(m_insertChild.get()), 0) : createLegacyEditingPosition(m_insertChild.get(), 0);
         notifyAccessibilityForTextChange(m_insertChild.get(), unapplyEditType(), m_insertChild->nodeValue(), VisiblePosition(position));
     }
         Position position = is<Text>(m_insertChild.get()) ? Position(downcast<Text>(m_insertChild.get()), 0) : createLegacyEditingPosition(m_insertChild.get(), 0);
         notifyAccessibilityForTextChange(m_insertChild.get(), unapplyEditType(), m_insertChild->nodeValue(), VisiblePosition(position));
     }
index 8348c11..05a36dc 100644 (file)
@@ -40,21 +40,20 @@ ReplaceInsertIntoTextNodeCommand::ReplaceInsertIntoTextNodeCommand(RefPtr<Text>&
 
 void ReplaceInsertIntoTextNodeCommand::notifyAccessibilityForTextChange(Node* node, AXTextEditType type, const String& text, const VisiblePosition& position)
 {
 
 void ReplaceInsertIntoTextNodeCommand::notifyAccessibilityForTextChange(Node* node, AXTextEditType type, const String& text, const VisiblePosition& position)
 {
-    if (!AXObjectCache::accessibilityEnabled())
+    if (!shouldPostAccessibilityNotification())
         return;
     AXObjectCache* cache = document().existingAXObjectCache();
     if (!cache)
         return;
     switch (type) {
         return;
     AXObjectCache* cache = document().existingAXObjectCache();
     if (!cache)
         return;
     switch (type) {
-    case AXTextEditTypeUnknown:
-        break;
+    case AXTextEditTypeAttributesChange:
     case AXTextEditTypeCut:
     case AXTextEditTypeCut:
-    case AXTextEditTypeDictation:
-        ASSERT_NOT_REACHED();
+    case AXTextEditTypeUnknown:
         break;
     case AXTextEditTypeDelete:
         cache->postTextReplacementNotification(node, AXTextEditTypeDelete, text, AXTextEditTypeInsert, m_deletedText, position);
         break;
         break;
     case AXTextEditTypeDelete:
         cache->postTextReplacementNotification(node, AXTextEditTypeDelete, text, AXTextEditTypeInsert, m_deletedText, position);
         break;
+    case AXTextEditTypeDictation:
     case AXTextEditTypeInsert:
     case AXTextEditTypePaste:
     case AXTextEditTypeTyping:
     case AXTextEditTypeInsert:
     case AXTextEditTypePaste:
     case AXTextEditTypeTyping: