CB-11818 - Avoid retain cycle: WKUserContentController retains its message handler, to break it we cannot pass directly CDVWKWebViewEngine's instance
This closes #17 Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine/commit/608855bb Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine/tree/608855bb Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine/diff/608855bb Branch: refs/heads/1.1.x Commit: 608855bbcb2f16e307f45aca6beef5a4f75e1b36 Parents: 10075b9 Author: Luca Torella <l...@scandit.com> Authored: Mon Sep 5 23:53:17 2016 +0200 Committer: Shazron Abdullah <shaz...@apache.org> Committed: Wed Sep 28 11:10:16 2016 -0700 ---------------------------------------------------------------------- src/ios/CDVWKWebViewEngine.m | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugin-wkwebview-engine/blob/608855bb/src/ios/CDVWKWebViewEngine.m ---------------------------------------------------------------------- diff --git a/src/ios/CDVWKWebViewEngine.m b/src/ios/CDVWKWebViewEngine.m index f60eace..50a872c 100644 --- a/src/ios/CDVWKWebViewEngine.m +++ b/src/ios/CDVWKWebViewEngine.m @@ -26,10 +26,20 @@ #define CDV_BRIDGE_NAME @"cordova" #define CDV_WKWEBVIEW_FILE_URL_LOAD_SELECTOR @"loadFileURL:allowingReadAccessToURL:" +@interface CDVWKWeakScriptMessageHandler : NSObject <WKScriptMessageHandler> + +@property (nonatomic, weak, readonly) id<WKScriptMessageHandler>scriptMessageHandler; + +- (instancetype)initWithScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler; + +@end + + @interface CDVWKWebViewEngine () @property (nonatomic, strong, readwrite) UIView* engineWebView; @property (nonatomic, strong, readwrite) id <WKUIDelegate> uiDelegate; +@property (nonatomic, weak) id <WKScriptMessageHandler> weakScriptMessageHandler; @end @@ -76,8 +86,10 @@ self.uiDelegate = [[CDVWKWebViewUIDelegate alloc] initWithTitle:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]]; + CDVWKWeakScriptMessageHandler *weakScriptMessageHandler = [[CDVWKWeakScriptMessageHandler alloc] initWithScriptMessageHandler:self]; + WKUserContentController* userContentController = [[WKUserContentController alloc] init]; - [userContentController addScriptMessageHandler:self name:CDV_BRIDGE_NAME]; + [userContentController addScriptMessageHandler:weakScriptMessageHandler name:CDV_BRIDGE_NAME]; WKWebViewConfiguration* configuration = [self createConfigurationFromSettings:settings]; configuration.userContentController = userContentController; @@ -401,4 +413,25 @@ return decisionHandler(NO); } + +@end + +#pragma mark - CDVWKWeakScriptMessageHandler + +@implementation CDVWKWeakScriptMessageHandler + +- (instancetype)initWithScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler +{ + self = [super init]; + if (self) { + _scriptMessageHandler = scriptMessageHandler; + } + return self; +} + +- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message +{ + [self.scriptMessageHandler userContentController:userContentController didReceiveScriptMessage:message]; +} + @end --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cordova.apache.org For additional commands, e-mail: commits-h...@cordova.apache.org