Changeset 162121 in webkit
- Timestamp:
- Jan 16, 2014 2:53:18 AM (10 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r162118 r162121 1 2014-01-16 Ian Henderson <ianh@apple.com> 2 3 Expose scrollView on WKView 4 https://bugs.webkit.org/show_bug.cgi?id=127085 5 6 Reviewed by Antti Koivisto. 7 8 Expose WKView's scroll view as a property. In order to support 9 clients calling setDelegate:, we create a forwarder object that sends 10 delegate methods to both WKView (the "internal delegate") and the 11 publicly-exposed delegate (the "external delegate"). 12 13 * UIProcess/API/Cocoa/WKView.h: 14 * UIProcess/API/ios/WKScrollView.h: 15 * UIProcess/API/ios/WKScrollView.mm: 16 (-[WKScrollViewDelegateForwarder initWithInternalDelegate:externalDelegate:]): 17 (-[WKScrollViewDelegateForwarder methodSignatureForSelector:]): 18 (-[WKScrollViewDelegateForwarder respondsToSelector:]): 19 (-[WKScrollViewDelegateForwarder forwardInvocation:]): 20 (-[WKScrollView setInternalDelegate:]): 21 (-[WKScrollView setDelegate:]): 22 (-[WKScrollView delegate]): 23 Pretend like _externalDelegate is the real delegate to avoid exposing 24 our internal delegate or forwarder object. 25 (-[WKScrollView _updateDelegate]): 26 (-[WKScrollView dealloc]): 27 * UIProcess/API/ios/WKViewIOS.mm: 28 (-[WKView scrollView]): 29 (-[WKView _commonInitializationWithContextRef:pageGroupRef:relatedToPage:]): 30 1 31 2014-01-15 Carlos Garcia Campos <cgarcia@igalia.com> 2 32 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKView.h
r159874 r162121 67 67 @property BOOL drawsTransparentBackground; 68 68 69 #if TARGET_OS_IPHONE 70 @property (nonatomic, readonly) UIScrollView *scrollView; 71 #endif 72 69 73 @end -
trunk/Source/WebKit2/UIProcess/API/ios/WKScrollView.h
r159724 r162121 27 27 28 28 @interface WKScrollView : UIWebScrollView 29 30 @property (nonatomic, assign) id <UIScrollViewDelegate> internalDelegate; 31 29 32 @end -
trunk/Source/WebKit2/UIProcess/API/ios/WKScrollView.mm
r159724 r162121 27 27 #import "WKScrollView.h" 28 28 29 @implementation WKScrollView 29 @interface WKScrollViewDelegateForwarder : NSObject <UIScrollViewDelegate> 30 31 - (instancetype)initWithInternalDelegate:(id <UIScrollViewDelegate>)internalDelegate externalDelegate:(id <UIScrollViewDelegate>)externalDelegate; 32 33 @end 34 35 @implementation WKScrollViewDelegateForwarder { 36 id <UIScrollViewDelegate> _internalDelegate; 37 id <UIScrollViewDelegate> _externalDelegate; 38 } 39 40 - (instancetype)initWithInternalDelegate:(id <UIScrollViewDelegate>)internalDelegate externalDelegate:(id <UIScrollViewDelegate>)externalDelegate 41 { 42 self = [super init]; 43 if (!self) 44 return nil; 45 _internalDelegate = internalDelegate; 46 _externalDelegate = externalDelegate; 47 return self; 48 } 49 50 - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 51 { 52 NSMethodSignature *signature = [super methodSignatureForSelector:aSelector]; 53 if (!signature) 54 signature = [(NSObject *)_internalDelegate methodSignatureForSelector:aSelector]; 55 if (!signature) 56 signature = [(NSObject *)_externalDelegate methodSignatureForSelector:aSelector]; 57 return signature; 58 } 59 60 - (BOOL)respondsToSelector:(SEL)aSelector 61 { 62 return [super respondsToSelector:aSelector] || [_internalDelegate respondsToSelector:aSelector] || [_externalDelegate respondsToSelector:aSelector]; 63 } 64 65 - (void)forwardInvocation:(NSInvocation *)anInvocation 66 { 67 BOOL messageHandled = NO; 68 if ([_internalDelegate respondsToSelector:[anInvocation selector]]) { 69 [anInvocation invokeWithTarget:_internalDelegate]; 70 messageHandled = YES; 71 } 72 if ([_externalDelegate respondsToSelector:[anInvocation selector]]) { 73 [anInvocation invokeWithTarget:_externalDelegate]; 74 messageHandled = YES; 75 } 76 if (!messageHandled) 77 [super forwardInvocation:anInvocation]; 78 } 79 80 @end 81 82 @implementation WKScrollView { 83 id <UIScrollViewDelegate> _externalDelegate; 84 WKScrollViewDelegateForwarder *_delegateForwarder; 85 } 30 86 31 87 - (BOOL)touchesShouldCancelInContentView:(UIView *)contentView … … 34 90 } 35 91 92 - (void)setInternalDelegate:(id <UIScrollViewDelegate>)internalDelegate 93 { 94 if (internalDelegate == _internalDelegate) 95 return; 96 _internalDelegate = internalDelegate; 97 [self _updateDelegate]; 98 } 99 100 - (void)setDelegate:(id <UIScrollViewDelegate>)delegate 101 { 102 if (_externalDelegate == delegate) 103 return; 104 _externalDelegate = delegate; 105 [self _updateDelegate]; 106 } 107 108 - (id <UIScrollViewDelegate>)delegate 109 { 110 return _externalDelegate; 111 } 112 113 - (void)_updateDelegate 114 { 115 WKScrollViewDelegateForwarder *oldForwarder = _delegateForwarder; 116 _delegateForwarder = nil; 117 if (!_externalDelegate) 118 [super setDelegate:_internalDelegate]; 119 else if (!_internalDelegate) 120 [super setDelegate:_externalDelegate]; 121 else { 122 _delegateForwarder = [[WKScrollViewDelegateForwarder alloc] initWithInternalDelegate:_internalDelegate externalDelegate:_externalDelegate]; 123 [super setDelegate:_delegateForwarder]; 124 } 125 [oldForwarder release]; 126 } 127 128 - (void)dealloc 129 { 130 [_delegateForwarder release]; 131 [super dealloc]; 132 } 133 36 134 @end 37 135 -
trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm
r161985 r162121 91 91 } 92 92 93 - (UIScrollView *)scrollView 94 { 95 return _scrollView.get(); 96 } 97 93 98 - (WKBrowsingContextController *)browsingContextController 94 99 { … … 233 238 234 239 _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]); 235 [_scrollView set Delegate:self];240 [_scrollView setInternalDelegate:self]; 236 241 [_scrollView setBouncesZoom:YES]; 237 242
Note: See TracChangeset
for help on using the changeset viewer.