[Cocoa] Wrappers mishandle NULL values in arrays and dictionaries
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Nov 2013 21:56:07 +0000 (21:56 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Nov 2013 21:56:07 +0000 (21:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123671

Reviewed by Darin Adler.

* Shared/Cocoa/WKNSArray.mm:
(-[WKNSArray objectAtIndex:]): Represent a NULL object as NSNull.
* Shared/Cocoa/WKNSDictionary.mm:
(-[WKNSDictionary objectForKey:]): Represent a NULL value as NSNull.
* Shared/ImmutableDictionary.h:
(WebKit::ImmutableDictionary::get): Added this overload that returns whether the key exists.

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

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/Cocoa/WKNSArray.mm
Source/WebKit2/Shared/Cocoa/WKNSDictionary.mm
Source/WebKit2/Shared/ImmutableDictionary.h

index 0efce69..7b7dd28 100644 (file)
@@ -1,5 +1,19 @@
 2013-11-02  Dan Bernstein  <mitz@apple.com>
 
+        [Cocoa] Wrappers mishandle NULL values in arrays and dictionaries
+        https://bugs.webkit.org/show_bug.cgi?id=123671
+
+        Reviewed by Darin Adler.
+
+        * Shared/Cocoa/WKNSArray.mm:
+        (-[WKNSArray objectAtIndex:]): Represent a NULL object as NSNull.
+        * Shared/Cocoa/WKNSDictionary.mm:
+        (-[WKNSDictionary objectForKey:]): Represent a NULL value as NSNull.
+        * Shared/ImmutableDictionary.h:
+        (WebKit::ImmutableDictionary::get): Added this overload that returns whether the key exists.
+
+2013-11-02  Dan Bernstein  <mitz@apple.com>
+
         Fixed release builds.
 
         * Shared/Cocoa/WKNSDictionary.mm:
index faa132a..e54caba 100644 (file)
@@ -50,7 +50,8 @@ using namespace WebKit;
 
 - (id)objectAtIndex:(NSUInteger)i
 {
-    return reinterpret_cast<ImmutableArray*>(&_array)->at(i)->wrapper();
+    APIObject* object = reinterpret_cast<ImmutableArray*>(&_array)->at(i);
+    return object ? object->wrapper() : [NSNull null];
 }
 
 #pragma mark NSCopying protocol implementation
index 07094c6..e80f454 100644 (file)
@@ -61,10 +61,12 @@ using namespace WebKit;
     if (![key isKindOfClass:[NSString class]])
         return nil;
 
-    if (APIObject* value = reinterpret_cast<ImmutableDictionary*>(&_dictionary)->get((NSString *)key))
-        return value->wrapper();
+    bool exists;
+    APIObject* value = reinterpret_cast<ImmutableDictionary*>(&_dictionary)->get((NSString *)key, exists);
+    if (!exists)
+        return nil;
 
-    return nil;
+    return value ? value->wrapper() : [NSNull null];
 }
 
 - (NSEnumerator *)keyEnumerator
index 1e977e1..e2a1f88 100644 (file)
@@ -73,6 +73,13 @@ public:
         return m_map.get(key);
     }
 
+    APIObject* get(const String& key, bool& exists)
+    {
+        const auto& it = m_map.find(key);
+        exists = it != m_map.end();
+        return it->value.get();
+    }
+
     PassRefPtr<ImmutableArray> keys() const;
 
     size_t size() { return m_map.size(); }