| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" | 5 #import "ios/web/web_state/ui/crw_web_controller_container_view.h" |
| 6 | 6 |
| 7 #include "base/ios/weak_nsobject.h" | |
| 8 #include "base/logging.h" | 7 #include "base/logging.h" |
| 9 #include "base/mac/scoped_nsobject.h" | 8 #include "base/mac/scoped_nsobject.h" |
| 10 #import "ios/web/public/web_state/ui/crw_content_view.h" | 9 #import "ios/web/public/web_state/ui/crw_content_view.h" |
| 11 #import "ios/web/public/web_state/ui/crw_native_content.h" | 10 #import "ios/web/public/web_state/ui/crw_native_content.h" |
| 12 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" | 11 #import "ios/web/public/web_state/ui/crw_web_view_content_view.h" |
| 13 #import "ios/web/web_state/crw_web_view_proxy_impl.h" | 12 #import "ios/web/web_state/crw_web_view_proxy_impl.h" |
| 14 | 13 |
| 14 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 15 #error "This file requires ARC support." |
| 16 #endif |
| 17 |
| 15 #pragma mark - CRWToolbarContainerView | 18 #pragma mark - CRWToolbarContainerView |
| 16 | 19 |
| 17 // Class that manages the display of toolbars. | 20 // Class that manages the display of toolbars. |
| 18 @interface CRWToolbarContainerView : UIView { | 21 @interface CRWToolbarContainerView : UIView { |
| 19 // Backing object for |self.toolbars|. | 22 // Backing object for |self.toolbars|. |
| 20 base::scoped_nsobject<NSMutableArray> _toolbars; | 23 base::scoped_nsobject<NSMutableArray> _toolbars; |
| 21 } | 24 } |
| 22 | 25 |
| 23 // The toolbars currently managed by this view. | 26 // The toolbars currently managed by this view. |
| 24 @property(nonatomic, retain, readonly) NSMutableArray* toolbars; | 27 @property(nonatomic, strong, readonly) NSMutableArray* toolbars; |
| 25 | 28 |
| 26 // Adds |toolbar| as a subview and bottom aligns to any previously added | 29 // Adds |toolbar| as a subview and bottom aligns to any previously added |
| 27 // toolbars. | 30 // toolbars. |
| 28 - (void)addToolbar:(UIView*)toolbar; | 31 - (void)addToolbar:(UIView*)toolbar; |
| 29 | 32 |
| 30 // Removes |toolbar| from the container view. | 33 // Removes |toolbar| from the container view. |
| 31 - (void)removeToolbar:(UIView*)toolbar; | 34 - (void)removeToolbar:(UIView*)toolbar; |
| 32 | 35 |
| 33 @end | 36 @end |
| 34 | 37 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 [self.toolbars removeObject:toolbar]; | 86 [self.toolbars removeObject:toolbar]; |
| 84 [toolbar removeFromSuperview]; | 87 [toolbar removeFromSuperview]; |
| 85 } | 88 } |
| 86 | 89 |
| 87 @end | 90 @end |
| 88 | 91 |
| 89 #pragma mark - CRWWebControllerContainerView | 92 #pragma mark - CRWWebControllerContainerView |
| 90 | 93 |
| 91 @interface CRWWebControllerContainerView () { | 94 @interface CRWWebControllerContainerView () { |
| 92 // The delegate passed on initialization. | 95 // The delegate passed on initialization. |
| 93 base::WeakNSProtocol<id<CRWWebControllerContainerViewDelegate>> _delegate; | 96 __weak id<CRWWebControllerContainerViewDelegate> _delegate; |
| 94 // Backing objects for corresponding properties. | 97 // Backing objects for corresponding properties. |
| 95 base::scoped_nsobject<CRWWebViewContentView> _webViewContentView; | 98 base::scoped_nsobject<CRWWebViewContentView> _webViewContentView; |
| 96 base::scoped_nsprotocol<id<CRWNativeContent>> _nativeController; | 99 base::scoped_nsprotocol<id<CRWNativeContent>> _nativeController; |
| 97 base::scoped_nsobject<CRWContentView> _transientContentView; | 100 base::scoped_nsobject<CRWContentView> _transientContentView; |
| 98 base::scoped_nsobject<CRWToolbarContainerView> _toolbarContainerView; | 101 base::scoped_nsobject<CRWToolbarContainerView> _toolbarContainerView; |
| 99 } | 102 } |
| 100 | 103 |
| 101 // Redefine properties as readwrite. | 104 // Redefine properties as readwrite. |
| 102 @property(nonatomic, retain, readwrite) | 105 @property(nonatomic, strong, readwrite) |
| 103 CRWWebViewContentView* webViewContentView; | 106 CRWWebViewContentView* webViewContentView; |
| 104 @property(nonatomic, retain, readwrite) id<CRWNativeContent> nativeController; | 107 @property(nonatomic, strong, readwrite) id<CRWNativeContent> nativeController; |
| 105 @property(nonatomic, retain, readwrite) CRWContentView* transientContentView; | 108 @property(nonatomic, strong, readwrite) CRWContentView* transientContentView; |
| 106 | 109 |
| 107 // Container view that displays any added toolbars. It is always the top-most | 110 // Container view that displays any added toolbars. It is always the top-most |
| 108 // subview, and is bottom aligned with the CRWWebControllerContainerView. | 111 // subview, and is bottom aligned with the CRWWebControllerContainerView. |
| 109 @property(nonatomic, retain, readonly) | 112 @property(nonatomic, strong, readonly) |
| 110 CRWToolbarContainerView* toolbarContainerView; | 113 CRWToolbarContainerView* toolbarContainerView; |
| 111 | 114 |
| 112 // Convenience getter for the proxy object. | 115 // Convenience getter for the proxy object. |
| 113 @property(nonatomic, readonly) CRWWebViewProxyImpl* contentViewProxy; | 116 @property(weak, nonatomic, readonly) CRWWebViewProxyImpl* contentViewProxy; |
| 114 | 117 |
| 115 // Returns |self.bounds| after being inset at the top by the header height | 118 // Returns |self.bounds| after being inset at the top by the header height |
| 116 // returned by the delegate. This is only used to lay out native controllers, | 119 // returned by the delegate. This is only used to lay out native controllers, |
| 117 // as the header height is already accounted for in the scroll view content | 120 // as the header height is already accounted for in the scroll view content |
| 118 // insets for other CRWContentViews. | 121 // insets for other CRWContentViews. |
| 119 @property(nonatomic, readonly) CGRect visibleFrame; | 122 @property(nonatomic, readonly) CGRect visibleFrame; |
| 120 | 123 |
| 121 @end | 124 @end |
| 122 | 125 |
| 123 @implementation CRWWebControllerContainerView | 126 @implementation CRWWebControllerContainerView |
| 127 @synthesize delegate = _delegate; |
| 124 | 128 |
| 125 - (instancetype)initWithDelegate: | 129 - (instancetype)initWithDelegate: |
| 126 (id<CRWWebControllerContainerViewDelegate>)delegate { | 130 (id<CRWWebControllerContainerViewDelegate>)delegate { |
| 127 self = [super initWithFrame:CGRectZero]; | 131 self = [super initWithFrame:CGRectZero]; |
| 128 if (self) { | 132 if (self) { |
| 129 DCHECK(delegate); | 133 DCHECK(delegate); |
| 130 _delegate.reset(delegate); | 134 _delegate = delegate; |
| 131 self.backgroundColor = [UIColor whiteColor]; | 135 self.backgroundColor = [UIColor whiteColor]; |
| 132 self.autoresizingMask = | 136 self.autoresizingMask = |
| 133 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; | 137 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; |
| 134 } | 138 } |
| 135 return self; | 139 return self; |
| 136 } | 140 } |
| 137 | 141 |
| 138 - (instancetype)initWithCoder:(NSCoder*)decoder { | 142 - (instancetype)initWithCoder:(NSCoder*)decoder { |
| 139 NOTREACHED(); | 143 NOTREACHED(); |
| 140 return nil; | 144 return nil; |
| 141 } | 145 } |
| 142 | 146 |
| 143 - (instancetype)initWithFrame:(CGRect)frame { | 147 - (instancetype)initWithFrame:(CGRect)frame { |
| 144 NOTREACHED(); | 148 NOTREACHED(); |
| 145 return nil; | 149 return nil; |
| 146 } | 150 } |
| 147 | 151 |
| 148 - (void)dealloc { | 152 - (void)dealloc { |
| 149 self.contentViewProxy.contentView = nil; | 153 self.contentViewProxy.contentView = nil; |
| 150 [super dealloc]; | |
| 151 } | 154 } |
| 152 | 155 |
| 153 #pragma mark Accessors | 156 #pragma mark Accessors |
| 154 | 157 |
| 155 - (id<CRWWebControllerContainerViewDelegate>)delegate { | |
| 156 return _delegate.get(); | |
| 157 } | |
| 158 | |
| 159 - (void)setDelegate:(id<CRWWebControllerContainerViewDelegate>)delegate { | |
| 160 _delegate.reset(delegate); | |
| 161 } | |
| 162 | |
| 163 - (CRWWebViewContentView*)webViewContentView { | 158 - (CRWWebViewContentView*)webViewContentView { |
| 164 return _webViewContentView.get(); | 159 return _webViewContentView.get(); |
| 165 } | 160 } |
| 166 | 161 |
| 167 - (void)setWebViewContentView:(CRWWebViewContentView*)webViewContentView { | 162 - (void)setWebViewContentView:(CRWWebViewContentView*)webViewContentView { |
| 168 if (![_webViewContentView isEqual:webViewContentView]) { | 163 if (![_webViewContentView isEqual:webViewContentView]) { |
| 169 [_webViewContentView removeFromSuperview]; | 164 [_webViewContentView removeFromSuperview]; |
| 170 _webViewContentView.reset([webViewContentView retain]); | 165 _webViewContentView.reset(webViewContentView); |
| 171 [_webViewContentView setFrame:self.bounds]; | 166 [_webViewContentView setFrame:self.bounds]; |
| 172 [self addSubview:_webViewContentView]; | 167 [self addSubview:_webViewContentView]; |
| 173 } | 168 } |
| 174 } | 169 } |
| 175 | 170 |
| 176 - (id<CRWNativeContent>)nativeController { | 171 - (id<CRWNativeContent>)nativeController { |
| 177 return _nativeController.get(); | 172 return _nativeController.get(); |
| 178 } | 173 } |
| 179 | 174 |
| 180 - (void)setNativeController:(id<CRWNativeContent>)nativeController { | 175 - (void)setNativeController:(id<CRWNativeContent>)nativeController { |
| 181 if (![_nativeController isEqual:nativeController]) { | 176 if (![_nativeController isEqual:nativeController]) { |
| 182 base::WeakNSProtocol<id> oldController(_nativeController); | 177 __weak id oldController = _nativeController; |
| 183 [[oldController view] removeFromSuperview]; | 178 [[oldController view] removeFromSuperview]; |
| 184 _nativeController.reset([nativeController retain]); | 179 _nativeController.reset(nativeController); |
| 185 // TODO(crbug.com/503297): Re-enable this DCHECK once native controller | 180 // TODO(crbug.com/503297): Re-enable this DCHECK once native controller |
| 186 // leaks are fixed. | 181 // leaks are fixed. |
| 187 // DCHECK(!oldController); | 182 // DCHECK(!oldController); |
| 188 } | 183 } |
| 189 } | 184 } |
| 190 | 185 |
| 191 - (CRWContentView*)transientContentView { | 186 - (CRWContentView*)transientContentView { |
| 192 return _transientContentView.get(); | 187 return _transientContentView.get(); |
| 193 } | 188 } |
| 194 | 189 |
| 195 - (void)setTransientContentView:(CRWContentView*)transientContentView { | 190 - (void)setTransientContentView:(CRWContentView*)transientContentView { |
| 196 if (![_transientContentView isEqual:transientContentView]) { | 191 if (![_transientContentView isEqual:transientContentView]) { |
| 197 [_transientContentView removeFromSuperview]; | 192 [_transientContentView removeFromSuperview]; |
| 198 _transientContentView.reset([transientContentView retain]); | 193 _transientContentView.reset(transientContentView); |
| 199 } | 194 } |
| 200 } | 195 } |
| 201 | 196 |
| 202 - (void)setToolbarContainerView:(CRWToolbarContainerView*)toolbarContainerView { | 197 - (void)setToolbarContainerView:(CRWToolbarContainerView*)toolbarContainerView { |
| 203 if (![_toolbarContainerView isEqual:toolbarContainerView]) { | 198 if (![_toolbarContainerView isEqual:toolbarContainerView]) { |
| 204 [_toolbarContainerView removeFromSuperview]; | 199 [_toolbarContainerView removeFromSuperview]; |
| 205 _toolbarContainerView.reset([toolbarContainerView retain]); | 200 _toolbarContainerView.reset(toolbarContainerView); |
| 206 } | 201 } |
| 207 } | 202 } |
| 208 | 203 |
| 209 - (UIView*)toolbarContainerView { | 204 - (UIView*)toolbarContainerView { |
| 210 return _toolbarContainerView.get(); | 205 return _toolbarContainerView.get(); |
| 211 } | 206 } |
| 212 | 207 |
| 213 - (CRWWebViewProxyImpl*)contentViewProxy { | 208 - (CRWWebViewProxyImpl*)contentViewProxy { |
| 214 return [_delegate contentViewProxyForContainerView:self]; | 209 return [_delegate contentViewProxyForContainerView:self]; |
| 215 } | 210 } |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 - (void)clearTransientContentView { | 300 - (void)clearTransientContentView { |
| 306 self.transientContentView = nil; | 301 self.transientContentView = nil; |
| 307 self.contentViewProxy.contentView = self.webViewContentView; | 302 self.contentViewProxy.contentView = self.webViewContentView; |
| 308 } | 303 } |
| 309 | 304 |
| 310 #pragma mark Toolbars | 305 #pragma mark Toolbars |
| 311 | 306 |
| 312 - (void)addToolbar:(UIView*)toolbar { | 307 - (void)addToolbar:(UIView*)toolbar { |
| 313 // Create toolbar container if necessary. | 308 // Create toolbar container if necessary. |
| 314 if (!self.toolbarContainerView) { | 309 if (!self.toolbarContainerView) { |
| 315 self.toolbarContainerView = [ | 310 self.toolbarContainerView = |
| 316 [[CRWToolbarContainerView alloc] initWithFrame:CGRectZero] autorelease]; | 311 [[CRWToolbarContainerView alloc] initWithFrame:CGRectZero]; |
| 317 } | 312 } |
| 318 // Add the toolbar to the container. | 313 // Add the toolbar to the container. |
| 319 [self.toolbarContainerView addToolbar:toolbar]; | 314 [self.toolbarContainerView addToolbar:toolbar]; |
| 320 [self setNeedsLayout]; | 315 [self setNeedsLayout]; |
| 321 } | 316 } |
| 322 | 317 |
| 323 - (void)addToolbars:(NSArray*)toolbars { | 318 - (void)addToolbars:(NSArray*)toolbars { |
| 324 DCHECK(toolbars); | 319 DCHECK(toolbars); |
| 325 for (UIView* toolbar in toolbars) | 320 for (UIView* toolbar in toolbars) |
| 326 [self addToolbar:toolbar]; | 321 [self addToolbar:toolbar]; |
| 327 } | 322 } |
| 328 | 323 |
| 329 - (void)removeToolbar:(UIView*)toolbar { | 324 - (void)removeToolbar:(UIView*)toolbar { |
| 330 // Remove the toolbar from the container view. | 325 // Remove the toolbar from the container view. |
| 331 [self.toolbarContainerView removeToolbar:toolbar]; | 326 [self.toolbarContainerView removeToolbar:toolbar]; |
| 332 // Reset the container if there are no more toolbars. | 327 // Reset the container if there are no more toolbars. |
| 333 if ([self.toolbarContainerView.toolbars count]) | 328 if ([self.toolbarContainerView.toolbars count]) |
| 334 [self setNeedsLayout]; | 329 [self setNeedsLayout]; |
| 335 else | 330 else |
| 336 self.toolbarContainerView = nil; | 331 self.toolbarContainerView = nil; |
| 337 } | 332 } |
| 338 | 333 |
| 339 - (void)removeAllToolbars { | 334 - (void)removeAllToolbars { |
| 340 // Resetting the property will remove the toolbars from the hierarchy. | 335 // Resetting the property will remove the toolbars from the hierarchy. |
| 341 self.toolbarContainerView = nil; | 336 self.toolbarContainerView = nil; |
| 342 } | 337 } |
| 343 | 338 |
| 344 @end | 339 @end |
| OLD | NEW |