diff --git a/MVMCoreUI/Atomic/Atoms/Views/WebView.swift b/MVMCoreUI/Atomic/Atoms/Views/WebView.swift index 64343aa7..b3016e00 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/WebView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/WebView.swift @@ -19,6 +19,9 @@ import WebKit var dynamicHeight: Bool = true var callHandlerName: String? + var webviewModel: WebViewModel? { + return model as? WebViewModel + } override open func setupView() { super.setupView() @@ -34,14 +37,6 @@ import WebKit if let messageHandlerName = messageHandler { wkUserController.add(self, name: messageHandlerName) } - //inital-scale is necessary to update display correct scale - let source: String = "var meta = document.createElement('meta');" + - "meta.name = 'viewport';" + - //depends on how much clint driven - "meta.content = 'initial-scale=1.0';" + - "var head = document.getElementsByTagName('head')[0];" + "head.appendChild(meta);"; - let wkScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true) - wkUserController.addUserScript(wkScript) //server driven addition script if let jsScript = jsScript { @@ -65,12 +60,11 @@ import WebKit guard let model = model as? WebViewModel else { return } self.delegateObject = delegateObject - if model.callHandler != nil || model.jsScript != nil { + if model.callHandler != nil || model.jsScript != nil { /* webView's configuration property is immutable. In order to add call handler into webview, need to create a new webview. - callHanlder - */ +*/ webView?.removeFromSuperview() let webView = createWebView(messageHandler: model.callHandler, jsScript:model.jsScript) addSubview(webView) @@ -91,7 +85,6 @@ import WebKit webView?.loadHTMLString(htmlString, baseURL: nil) } bringSubviewToFront(loadingSpinner) - //TO DO: local path? } func pinSpinnerView() { @@ -115,20 +108,29 @@ extension WebView : WKUIDelegate { // hide loading loadingSpinner.pause() + //update webview's heigth when webview is ready if !dynamicHeight { return } - //update webview's heigth when webview is ready - webView.evaluateJavaScript("document.readyState", completionHandler: { [weak self] (result, error) in - if result == nil || error != nil { - return - } - webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (result, error) in - guard let height = result as? CGFloat else { return } - self?.webViewHeight?.constant = height - self?.delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self!) + if let _ = webviewModel?.jsScript { +/* evaluateJavaScript only works when webview contains userscrpt. + otherwise, it would return WKErrorDomain Code=4 "A JavaScript exception occurred" + */ + webView.evaluateJavaScript("document.readyState", completionHandler: { [weak self] (result, error) in + if result == nil || error != nil { + return + } + webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (result, error) in + guard let height = result as? CGFloat else { return } + self?.webViewHeight?.constant = height + self?.delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self!) + }) }) - }) + } else { + //get webview's content viewheight when no javescript setup + self.webViewHeight?.constant = webView.scrollView.contentSize.height + self.delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self) + } } public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {