WKWebView на Mac - очистка чувствительных вызовов JavaScript из памяти - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над приложением Mac, написанным на Swift, которое загружает веб-сайт в WKWebView, используя следующий код:

let webConfiguration = WKWebViewConfiguration()
webConfiguration.websiteDataStore = WKWebsiteDataStore.nonPersistent() //set it to "private browsing"
self.webview = WKWebView(frame: .zero, configuration: webConfiguration)
self.webview?.uiDelegate = self
self.webview?.navigationDelegate = self
self.view.addSubview(self.webview!)

let myURL = URL(string: "http://127.0.0.1:8000/")
let mRequest = URLRequest(url: myURL!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData)
self.webview?.load(mRequest)

Затем нативный код вызывает функцию javascript на сайте, используя:

self.webview?.evaluateJavaScript("randomjsfunction('" + secret + "')", completionHandler: nil)

Функция Javascript существует и работает правильно (она просто удаляет элемент со страницы, больше ничего).

После этого WKWebView удаляется вместе с родителем NSViewController, используя:

let myURL = URL(string: "about:blank")
let mRequest = URLRequest(url: myURL!)
self.webview?.load(mRequest)

self.webview?.invalidateRestorableState()

self.webview?.stopLoading()

self.webview?.removeFromSuperview()
self.webview?.uiDelegate = nil
self.webview?.navigationDelegate = nil
self.webview = nil
self.removeFromParent()
self.dismiss(self.parent)

Через несколько минут я создаю дамп памяти процесса, и вызов функции Javascipt вместе с переданными параметрами все еще присутствует в памяти:

Memory dump

Мне нужно убедиться, что параметры вызова Javascript удаляются из памяти, когда он больше не используется.Однако даже уничтожение всего веб-обзора, кажется, не освобождает эту память.

Я пытался добавить вызов JS в usercript, используя функцию addUserScript(), а затем вызывать эту функцию с помощью evaluateJavaScript(), но дажеaddUserScript() вызовы представлены в памяти.

На основании WebPage RunJavaScriptInMainFrame, представленного в дампе, я нашел основную функцию в коде WebKit .Но я не знаю, как продвинуться в этом направлении.

...