Title: [93417] trunk/Tools
Revision
93417
Author
[email protected]
Date
2011-08-19 09:14:02 -0700 (Fri, 19 Aug 2011)

Log Message

Add a helper class for swizzling ObjC instance methods to TestWebKitAPI

Fixes <http://webkit.org/b/66565> TestWebKitAPI needs a way to override instance methods of
NSScreen

Reviewed by Anders Carlsson.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Added new files.

* TestWebKitAPI/Tests/TestWebKitAPI/mac/InstanceMethodSwizzler.mm: Added.
(-[SimpleObject setValue:]): Original implementation.

(TestWebKitAPI::setValue2):
(TestWebKitAPI::setValue3):
Swizzled implementations.

(TestWebKitAPI::TEST): Test that we can swizzle and re-swizzle and un-swizzle an ObjC
instance method.

* TestWebKitAPI/mac/InstanceMethodSwizzler.h: Added.
* TestWebKitAPI/mac/InstanceMethodSwizzler.mm: Added.
(TestWebKitAPI::InstanceMethodSwizzler::InstanceMethodSwizzler): Swizzle the method.
(TestWebKitAPI::InstanceMethodSwizzler::~InstanceMethodSwizzler): Unswizzle the method.

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/ChangeLog (93416 => 93417)


--- trunk/Tools/ChangeLog	2011-08-19 16:06:49 UTC (rev 93416)
+++ trunk/Tools/ChangeLog	2011-08-19 16:14:02 UTC (rev 93417)
@@ -1,3 +1,29 @@
+2011-08-19  Adam Roben  <[email protected]>
+
+        Add a helper class for swizzling ObjC instance methods to TestWebKitAPI
+
+        Fixes <http://webkit.org/b/66565> TestWebKitAPI needs a way to override instance methods of
+        NSScreen
+
+        Reviewed by Anders Carlsson.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: Added new files.
+
+        * TestWebKitAPI/Tests/TestWebKitAPI/mac/InstanceMethodSwizzler.mm: Added.
+        (-[SimpleObject setValue:]): Original implementation.
+
+        (TestWebKitAPI::setValue2):
+        (TestWebKitAPI::setValue3):
+        Swizzled implementations.
+
+        (TestWebKitAPI::TEST): Test that we can swizzle and re-swizzle and un-swizzle an ObjC
+        instance method.
+
+        * TestWebKitAPI/mac/InstanceMethodSwizzler.h: Added.
+        * TestWebKitAPI/mac/InstanceMethodSwizzler.mm: Added.
+        (TestWebKitAPI::InstanceMethodSwizzler::InstanceMethodSwizzler): Swizzle the method.
+        (TestWebKitAPI::InstanceMethodSwizzler::~InstanceMethodSwizzler): Unswizzle the method.
+
 2011-08-19  Tom Zakrajsek  <[email protected]>
 
         Fix _path_to_apache() error reporting

Added: trunk/Tools/TestWebKitAPI/Tests/TestWebKitAPI/mac/InstanceMethodSwizzler.mm (0 => 93417)


--- trunk/Tools/TestWebKitAPI/Tests/TestWebKitAPI/mac/InstanceMethodSwizzler.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/TestWebKitAPI/mac/InstanceMethodSwizzler.mm	2011-08-19 16:14:02 UTC (rev 93417)
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "InstanceMethodSwizzler.h"
+
+#import <wtf/RetainPtr.h>
+
+@interface SimpleObject : NSObject
+- (void)setValue:(int*)value;
+@end
+
+@implementation SimpleObject
+- (void)setValue:(int*)value
+{
+    *value = 1;
+}
+@end
+
+namespace TestWebKitAPI {
+
+static void setValue2(id self, SEL _cmd, int* value)
+{
+    *value = 2;
+}
+
+static void setValue3(id self, SEL _cmd, int* value)
+{
+    *value = 3;
+}
+
+TEST(TestWebKitAPI, InstanceMethodSwizzler)
+{
+    RetainPtr<SimpleObject> object(AdoptNS, [[SimpleObject alloc] init]);
+
+    int value = 0;
+
+    [object.get() setValue:&value];
+    EXPECT_EQ(value, 1);
+
+    {
+        InstanceMethodSwizzler swizzle([object.get() class], @selector(setValue:), reinterpret_cast<IMP>(setValue2));
+
+        [object.get() setValue:&value];
+        EXPECT_EQ(value, 2);
+
+        {
+            InstanceMethodSwizzler swizzle([object.get() class], @selector(setValue:), reinterpret_cast<IMP>(setValue3));
+
+            [object.get() setValue:&value];
+            EXPECT_EQ(value, 3);
+        }
+
+        [object.get() setValue:&value];
+        EXPECT_EQ(value, 2);
+    }
+
+    [object.get() setValue:&value];
+    EXPECT_EQ(value, 1);
+}
+
+} // namespace TestWebKitAPI

Added: trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h (0 => 93417)


--- trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h	2011-08-19 16:14:02 UTC (rev 93417)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InstanceMethodSwizzler_h
+#define InstanceMethodSwizzler_h
+
+#include <objc/objc-runtime.h>
+#include <wtf/Noncopyable.h>
+
+namespace TestWebKitAPI {
+
+class InstanceMethodSwizzler {
+    WTF_MAKE_NONCOPYABLE(InstanceMethodSwizzler);
+public:
+    InstanceMethodSwizzler(Class, SEL, IMP);
+    ~InstanceMethodSwizzler();
+
+    Method m_method;
+    IMP m_originalImplementation;
+};
+
+} // namespace TestWebKitAPI
+
+#endif // InstanceMethodSwizzler_h
Property changes on: trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.h
___________________________________________________________________

Added: svn:eol-style

Added: trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.mm (0 => 93417)


--- trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/mac/InstanceMethodSwizzler.mm	2011-08-19 16:14:02 UTC (rev 93417)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "InstanceMethodSwizzler.h"
+
+namespace TestWebKitAPI {
+
+InstanceMethodSwizzler::InstanceMethodSwizzler(Class cls, SEL selector, IMP implementation)
+    : m_method(class_getInstanceMethod(cls, selector))
+    , m_originalImplementation(method_setImplementation(m_method, implementation))
+{
+}
+
+InstanceMethodSwizzler::~InstanceMethodSwizzler()
+{
+    method_setImplementation(m_method, m_originalImplementation);
+}
+
+} // namespace TestWebKitAPI
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to