Changeset 162121 in webkit


Ignore:
Timestamp:
Jan 16, 2014 2:53:18 AM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Expose scrollView on WKView
https://bugs.webkit.org/show_bug.cgi?id=127085

Patch by Ian Henderson <ianh@apple.com> on 2014-01-16
Reviewed by Antti Koivisto.

Expose WKView's scroll view as a property. In order to support
clients calling setDelegate:, we create a forwarder object that sends
delegate methods to both WKView (the "internal delegate") and the
publicly-exposed delegate (the "external delegate").

  • UIProcess/API/Cocoa/WKView.h:
  • UIProcess/API/ios/WKScrollView.h:
  • UIProcess/API/ios/WKScrollView.mm:

(-[WKScrollViewDelegateForwarder initWithInternalDelegate:externalDelegate:]):
(-[WKScrollViewDelegateForwarder methodSignatureForSelector:]):
(-[WKScrollViewDelegateForwarder respondsToSelector:]):
(-[WKScrollViewDelegateForwarder forwardInvocation:]):
(-[WKScrollView setInternalDelegate:]):
(-[WKScrollView setDelegate:]):
(-[WKScrollView delegate]):
Pretend like _externalDelegate is the real delegate to avoid exposing
our internal delegate or forwarder object.
(-[WKScrollView _updateDelegate]):
(-[WKScrollView dealloc]):

  • UIProcess/API/ios/WKViewIOS.mm:

(-[WKView scrollView]):
(-[WKView _commonInitializationWithContextRef:pageGroupRef:relatedToPage:]):

Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r162118 r162121  
     12014-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
    1312014-01-15  Carlos Garcia Campos  <cgarcia@igalia.com>
    232
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKView.h

    r159874 r162121  
    6767@property BOOL drawsTransparentBackground;
    6868
     69#if TARGET_OS_IPHONE
     70@property (nonatomic, readonly) UIScrollView *scrollView;
     71#endif
     72
    6973@end
  • trunk/Source/WebKit2/UIProcess/API/ios/WKScrollView.h

    r159724 r162121  
    2727
    2828@interface WKScrollView : UIWebScrollView
     29
     30@property (nonatomic, assign) id <UIScrollViewDelegate> internalDelegate;
     31
    2932@end
  • trunk/Source/WebKit2/UIProcess/API/ios/WKScrollView.mm

    r159724 r162121  
    2727#import "WKScrollView.h"
    2828
    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}
    3086
    3187- (BOOL)touchesShouldCancelInContentView:(UIView *)contentView
     
    3490}
    3591
     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
    36134@end
    37135
  • trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm

    r161985 r162121  
    9191}
    9292
     93- (UIScrollView *)scrollView
     94{
     95    return _scrollView.get();
     96}
     97
    9398- (WKBrowsingContextController *)browsingContextController
    9499{
     
    233238
    234239    _scrollView = adoptNS([[WKScrollView alloc] initWithFrame:bounds]);
    235     [_scrollView setDelegate:self];
     240    [_scrollView setInternalDelegate:self];
    236241    [_scrollView setBouncesZoom:YES];
    237242
Note: See TracChangeset for help on using the changeset viewer.