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