diff --git a/demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist b/demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist index 7cbeeade6..e1e71ff06 100644 --- a/demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 0 + Blockly WebView.xcscheme_^#shared#^_ + + orderHint + 0 + diff --git a/demos/mobile/ios/Blockly WebView/ViewController.swift b/demos/mobile/ios/Blockly WebView/ViewController.swift index 6a8f2418d..f8ad8018e 100644 --- a/demos/mobile/ios/Blockly WebView/ViewController.swift +++ b/demos/mobile/ios/Blockly WebView/ViewController.swift @@ -1,6 +1,5 @@ -// // ViewController.swift -// Blockly WebView +// Blockly WebView UI controller. // // Created by Andrew Marshall on 8/7/18. // Copyright © 2018 Google. All rights reserved. @@ -9,30 +8,104 @@ import UIKit import WebKit -class ViewController: UIViewController { + +/// A basic ViewController for a WebView. +/// It handles the initial page load, and functions like window.prompt(). +class ViewController: UIViewController, WKUIDelegate { /// The name used to reference this iOS object when executing callbacks from the JS code. /// If this value is changed, it should also be changed in the `CODE_GENERATOR_BRIDGE_JS` file. fileprivate static let HOST_HTML = "Blockly/webview.html" @IBOutlet weak var webView: WKWebView! - + + /// Additional setup after loading the UI NIB. override func viewDidLoad() { super.viewDidLoad() + webView.uiDelegate = self // Do any additional setup after loading the view, typically from a nib. - loadWebView() + loadWebContent() } - func loadWebView() { - if let htmlUrl = Bundle.main.url(forResource: "webview", withExtension: "html", subdirectory: "Blockly") { + /// Load the root HTML page into the webview. + func loadWebContent() { + if let htmlUrl = Bundle.main.url(forResource: "webview", withExtension: "html", + subdirectory: "Blockly") { webView.load(URLRequest.init(url: htmlUrl)) + } else { + NSLog("Failed to load HTML. Could not find resource.") } } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. + /// Handle window.alert() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptAlertPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping () -> Void) { + + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + let title = NSLocalizedString("OK", comment: "OK Button") + let ok = UIAlertAction(title: title, style: .default) { (action: UIAlertAction) -> Void in + alert.dismiss(animated: true, completion: nil) + } + alert.addAction(ok) + present(alert, animated: true) + completionHandler() + } + + /// Handle window.confirm() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptConfirmPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (Bool) -> Void) { + + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + let closeAndHandle = { (okayed: Bool) in + alert.dismiss(animated: true, completion: nil) + completionHandler(okayed) + } + + let okTitle = NSLocalizedString("OK", comment: "OK button title") + let ok = UIAlertAction(title: okTitle, style: .default) { (action: UIAlertAction) -> Void in + closeAndHandle(true) + } + alert.addAction(ok) + + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel button title") + let cancel = UIAlertAction(title: cancelTitle, style: .default) { + (action: UIAlertAction) -> Void in + closeAndHandle(false) + } + alert.addAction(cancel) + present(alert, animated: true) + } + + /// Handle window.prompt() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptTextInputPanelWithPrompt prompt: String, + defaultText: String?, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (String?) -> Void) { + + let alert = UIAlertController(title: prompt, message: nil, preferredStyle: .alert) + + alert.addTextField { (textField) in + textField.text = defaultText + } + + let okTitle = NSLocalizedString("OK", comment: "OK button title") + let okAction = UIAlertAction(title: okTitle, style: .default) { (_) in + let textInput = alert.textFields![0] as UITextField + completionHandler(textInput.text) + } + alert.addAction(okAction) + + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel button title") + let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) { (_) in + completionHandler(nil) + } + alert.addAction(cancelAction) + + present(alert, animated: true) } - - }