elm: fix for invalid attribute matching
authorRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Fri, 2 Feb 2018 07:53:42 +0000 (08:53 +0100)
committerJiyoun Park <jy0703.park@samsung.com>
Tue, 3 Apr 2018 15:16:30 +0000 (00:16 +0900)
Summary:
Fixes invalid attribute matching in at-spi's collection interface's GetMatches***
functions.

Reviewers: stanluk

Reviewed By: stanluk

Subscribers: lukasz.stanislawski, cedric

Differential Revision: https://phab.enlightenment.org/D5774

src/lib/elementary/elm_atspi_bridge.c

index e938932..eddafc8 100644 (file)
@@ -16,6 +16,7 @@
 #include "atspi/atspi-constants.h"
 
 #include <stdint.h>
+#include <assert.h>
 #include <Elementary.h>
 #include "elm_priv.h"
 //TIZEN_ONLY(20171222): include eo info header for class check
@@ -3464,26 +3465,82 @@ _collection_match_roles_lookup(Eo *obj, struct collection_match_rule *rule)
 }
 
 static Eina_Bool
-_collection_match_attributes_helper(Eina_List *obj_attribs, Eina_List *attribs, Eina_Bool compare, Eina_Bool ret_if_compare, Eina_Bool ret_default)
+_collection_match_attributes_helper(Eina_List *obj_attribs, Eina_List *attribs, AtspiCollectionMatchType mode)
 {
    Eina_List *l, *l2;
    Efl_Access_Attribute *attr, *attr2;
+   Eina_Bool obj_empty = eina_list_count(obj_attribs) == 0;
+   Eina_Bool empty = eina_list_count(attribs) == 0;
 
+   switch (mode)
+     {
+        case ATSPI_Collection_MATCH_ANY:
+           if (empty || obj_empty) return EINA_FALSE;
+           break;
+        case ATSPI_Collection_MATCH_ALL:
+           if (empty) return EINA_TRUE;
+           if (obj_empty) return EINA_FALSE;
+           break;
+        case ATSPI_Collection_MATCH_NONE:
+           if (empty || obj_empty) return EINA_TRUE;
+           break;
+        case ATSPI_Collection_MATCH_EMPTY:
+           if (empty && obj_empty) return EINA_TRUE;
+           if (empty || obj_empty) return EINA_FALSE;
+           break;
+        case ATSPI_Collection_MATCH_INVALID:
+        case ATSPI_Collection_MATCH_LAST_DEFINED:
+           assert(0);
+           break;
+     }
    EINA_LIST_FOREACH(attribs, l, attr)
      {
-        EINA_LIST_FOREACH(obj_attribs, l2, attr2)
-          {
-             if ((attr->key && attr2->key &&
-                  attr->value && attr2->value &&
-                  !strcmp(attr->key, attr2->key) &&
-                  !strcmp(attr->value, attr2->value)) == compare)
-               {
-                  return ret_if_compare;
-               }
-          }
+       Eina_Bool found = EINA_FALSE;
+       EINA_LIST_FOREACH(obj_attribs, l2, attr2)
+         {
+            Eina_Bool compare = (attr->key && attr2->key &&
+                 attr->value && attr2->value &&
+                 !strcmp(attr->key, attr2->key) &&
+                 !strcmp(attr->value, attr2->value));
+            if (compare)
+              {
+                 found = EINA_TRUE;
+                 break;
+              }
+         }
+       switch (mode)
+         {
+            case ATSPI_Collection_MATCH_EMPTY:
+            case ATSPI_Collection_MATCH_ALL:
+               if (!found) return EINA_FALSE;
+               break;
+            case ATSPI_Collection_MATCH_ANY:
+               if (found) return EINA_TRUE;
+               break;
+            case ATSPI_Collection_MATCH_NONE:
+               if (found) return EINA_FALSE;
+               break;
+            case ATSPI_Collection_MATCH_INVALID:
+            case ATSPI_Collection_MATCH_LAST_DEFINED:
+               assert(0);
+               break;
+         }
      }
 
-   return ret_default;
+   switch (mode)
+     {
+        case ATSPI_Collection_MATCH_EMPTY:
+        case ATSPI_Collection_MATCH_ALL:
+        case ATSPI_Collection_MATCH_NONE:
+           return EINA_TRUE;
+        case ATSPI_Collection_MATCH_ANY:
+           return EINA_FALSE;
+        case ATSPI_Collection_MATCH_INVALID:
+        case ATSPI_Collection_MATCH_LAST_DEFINED:
+           assert(0);
+           break;
+     }
+   return EINA_FALSE;
 }
 
 static Eina_Bool
@@ -3500,18 +3557,13 @@ _collection_match_attributes_lookup(Eo *obj, struct collection_match_rule *rule)
            ret = EINA_TRUE;
            break;
         case ATSPI_Collection_MATCH_ALL:
-           ret = _collection_match_attributes_helper(
-              obj_attribs, rule->attributes, EINA_FALSE, EINA_FALSE, EINA_TRUE);
-           break;
         case ATSPI_Collection_MATCH_ANY:
-           ret = _collection_match_attributes_helper(
-              obj_attribs, rule->attributes, EINA_TRUE, EINA_TRUE, EINA_FALSE);
-           break;
         case ATSPI_Collection_MATCH_NONE:
-           ret = _collection_match_attributes_helper(
-              obj_attribs, rule->attributes, EINA_TRUE, EINA_FALSE, EINA_TRUE);
+        case ATSPI_Collection_MATCH_EMPTY:
+           ret = _collection_match_attributes_helper(obj_attribs, rule->attributes, rule->attributematchtype);
            break;
         default:
+           DBG("invalid match type");
            break;
      }