[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 15:39:57 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit a9e5de5f6be7ad0056d81f3aab57095dc3994a2d
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Nov 10 03:44:33 2010 +0000

    2010-11-09  Mario Sanchez Prada  <msanchez at igalia.com>
    
            Reviewed by Chris Fleizach.
    
            [GTK] Improve accessibility of focusable lists
            https://bugs.webkit.org/show_bug.cgi?id=25679
    
            Emit the 'selected' and 'focused' events as needed.
    
            This is the last bit of a series of patches to fix bug 25679,
            which just ensures that the right signals are emmited whenever a
            selection inside a listbox object changes, that is, the signals
            'state-changed::selected', 'state-changed::focused' and
            'focus-event', along with the right detail for each of them to
            report if the focus/selection has been activated or not.
    
            * accessibility/gtk/AXObjectCacheAtk.cpp:
            (WebCore::notifyChildrenSelectionChange): New, takes care of
            emitting all the needed signals when children selection has
            changed, both from the point of view of the container and the
            selected/unselected items inside of it. It currently supports
            listboxes (html 'select' controls) only.
            (WebCore::AXObjectCache::postPlatformNotification): Replaced some
            old code with a simple call to notifyChildrenSelectionChange().
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71710 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 1c23309..6deaaef 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+2010-11-09  Mario Sanchez Prada  <msanchez at igalia.com>
+
+        Reviewed by Chris Fleizach.
+
+        [GTK] Improve accessibility of focusable lists
+        https://bugs.webkit.org/show_bug.cgi?id=25679
+
+        Emit the 'selected' and 'focused' events as needed.
+
+        This is the last bit of a series of patches to fix bug 25679,
+        which just ensures that the right signals are emmited whenever a
+        selection inside a listbox object changes, that is, the signals
+        'state-changed::selected', 'state-changed::focused' and
+        'focus-event', along with the right detail for each of them to
+        report if the focus/selection has been activated or not.
+
+        * accessibility/gtk/AXObjectCacheAtk.cpp:
+        (WebCore::notifyChildrenSelectionChange): New, takes care of
+        emitting all the needed signals when children selection has
+        changed, both from the point of view of the container and the
+        selected/unselected items inside of it. It currently supports
+        listboxes (html 'select' controls) only.
+        (WebCore::AXObjectCache::postPlatformNotification): Replaced some
+        old code with a simple call to notifyChildrenSelectionChange().
+
 2010-11-09  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp b/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp
index a4ea87c..4216be4 100644
--- a/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp
+++ b/WebCore/accessibility/gtk/AXObjectCacheAtk.cpp
@@ -25,6 +25,7 @@
 #include "AccessibilityRenderObject.h"
 #include "GOwnPtr.h"
 #include "Range.h"
+#include "SelectElement.h"
 #include "TextIterator.h"
 
 namespace WebCore {
@@ -41,17 +42,65 @@ void AXObjectCache::attachWrapper(AccessibilityObject* obj)
     g_object_unref(atkObj);
 }
 
+static void notifyChildrenSelectionChange(AccessibilityObject* object)
+{
+    // This static variable is needed to keep track of the old focused
+    // object as per previous calls to this function, in order to
+    // properly decide whether to emit some signals or not.
+    static RefPtr<AccessibilityObject> oldFocusedObject = 0;
+
+    // Only list boxes supported so far.
+    if (!object || !object->isListBox())
+        return;
+
+    // Emit signal from the listbox's point of view first.
+    g_signal_emit_by_name(object->wrapper(), "selection-changed");
+
+    // Find the item where the selection change was triggered from.
+    AccessibilityObject::AccessibilityChildrenVector items = object->children();
+    SelectElement* select = toSelectElement(static_cast<Element*>(object->node()));
+    if (!select)
+        return;
+    int changedItemIndex = select->activeSelectionStartListIndex();
+    if (changedItemIndex < 0 || changedItemIndex >= static_cast<int>(items.size()))
+        return;
+    AccessibilityObject* item = items.at(changedItemIndex).get();
+
+    // Ensure the oldFocusedObject belongs to the same document that
+    // the current item so further comparisons make sense. Otherwise,
+    // just reset oldFocusedObject so it won't be taken into account.
+    if (item && oldFocusedObject && item->document() != oldFocusedObject->document())
+        oldFocusedObject = 0;
+
+    AtkObject* axItem = item ? item->wrapper() : 0;
+    AtkObject* axOldFocusedObject = oldFocusedObject ? oldFocusedObject->wrapper() : 0;
+
+    // Old focused object just lost focus, so emit the events.
+    if (axOldFocusedObject && axItem != axOldFocusedObject) {
+        g_signal_emit_by_name(axOldFocusedObject, "focus-event", false);
+        g_signal_emit_by_name(axOldFocusedObject, "state-change", "focused", false);
+    }
+
+    // Emit needed events for the currently (un)selected item.
+    if (axItem) {
+        bool isSelected = item->isSelected();
+        g_signal_emit_by_name(axItem, "state-change", "selected", isSelected);
+        g_signal_emit_by_name(axItem, "focus-event", isSelected);
+        g_signal_emit_by_name(axItem, "state-change", "focused", isSelected);
+    }
+
+    // Update pointer to the previously focused object.
+    oldFocusedObject = item;
+}
+
 void AXObjectCache::postPlatformNotification(AccessibilityObject* coreObject, AXNotification notification)
 {
     if (notification == AXCheckedStateChanged) {
         if (!coreObject->isCheckboxOrRadio())
             return;
         g_signal_emit_by_name(coreObject->wrapper(), "state-change", "checked", coreObject->isChecked());
-    } else if (notification == AXSelectedChildrenChanged) {
-        if (!coreObject->isListBox())
-            return;
-        g_signal_emit_by_name(coreObject->wrapper(), "selection-changed");
-    }
+    } else if (notification == AXSelectedChildrenChanged)
+        notifyChildrenSelectionChange(coreObject);
 }
 
 static void emitTextChanged(AccessibilityRenderObject* object, AXObjectCache::AXTextChange textChange, unsigned offset, unsigned count)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list