main code repository.
Revision | 8ac0a283903de3db8e348cb042c33f622e918c9d (tree) |
---|---|
Time | 2017-05-20 22:25:30 |
Author | masakih <masakih@user...> |
Commiter | masakih |
WKWebViewを使用するようにした
@@ -1,14 +1,15 @@ | ||
1 | -<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
2 | -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> | |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12120" systemVersion="16E195" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> | |
3 | 3 | <dependencies> |
4 | - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/> | |
5 | - <plugIn identifier="com.apple.WebKitIBPlugin" version="10117"/> | |
4 | + <deployment identifier="macosx"/> | |
5 | + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12120"/> | |
6 | + <plugIn identifier="com.apple.WebKitIBPlugin" version="12120"/> | |
7 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
6 | 8 | </dependencies> |
7 | 9 | <objects> |
8 | 10 | <customObject id="-2" userLabel="File's Owner" customClass="GameViewController"> |
9 | 11 | <connections> |
10 | 12 | <outlet property="view" destination="YNN-D2-9Iy" id="BXQ-FB-QGS"/> |
11 | - <outlet property="webView" destination="Ame-96-zHa" id="7fa-m4-PKM"/> | |
12 | 13 | </connections> |
13 | 14 | </customObject> |
14 | 15 | <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> |
@@ -16,17 +16,22 @@ fileprivate extension Selector { | ||
16 | 16 | static let screenShot = #selector(GameViewController.screenShot(_:)) |
17 | 17 | } |
18 | 18 | |
19 | +func viewHierarchy(_ view: NSView) { | |
20 | + print(view) | |
21 | + view.subviews.forEach { viewHierarchy($0) } | |
22 | +} | |
23 | + | |
19 | 24 | class GameViewController: NSViewController { |
20 | 25 | private static let gamePageURL = "http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/" |
21 | 26 | private static let loginPageURLPrefix = "https://www.dmm.com/my/-/login/=/" |
22 | 27 | |
23 | - @IBOutlet var webView: WebView! | |
28 | + var webView: WKWebView! | |
24 | 29 | |
25 | 30 | override var nibName: String! { |
26 | 31 | return "GameViewController" |
27 | 32 | } |
28 | 33 | |
29 | - fileprivate var flashTopLeft = NSPoint(x: 2600, y: 1445) | |
34 | + fileprivate var flashTopLeft = NSPoint(x: 500, y: 20) | |
30 | 35 | private var clipView: NSClipView { |
31 | 36 | return view as! NSClipView // swiftlint:disable:this force_cast |
32 | 37 | } |
@@ -34,31 +39,49 @@ class GameViewController: NSViewController { | ||
34 | 39 | override func viewDidLoad() { |
35 | 40 | super.viewDidLoad() |
36 | 41 | |
42 | + let pref = WKPreferences() | |
43 | + pref.plugInsEnabled = true | |
44 | + let config = WKWebViewConfiguration() | |
45 | + config.preferences = pref | |
46 | + config.applicationNameForUserAgent = AppDelegate.shared.appNameForUserAgent | |
47 | + let frame = CGRect(x: 0, y: 0, width: 2000, height: 2_000) | |
48 | + webView = WKWebView(frame: frame, configuration: config) | |
49 | + webView.navigationDelegate = self | |
50 | + | |
37 | 51 | clipView.documentView = webView |
38 | 52 | |
39 | 53 | adjustFlash() |
40 | 54 | |
41 | - webView.mainFrame.frameView.allowsScrolling = false | |
55 | + webView.allowsBackForwardNavigationGestures = false | |
56 | + webView.allowsMagnification = false | |
57 | + webView.allowsLinkPreview = false | |
58 | + | |
59 | + loadURLString(urlString: GameViewController.gamePageURL) | |
60 | + } | |
61 | + | |
62 | + func loadURLString(urlString: String) { | |
63 | + guard let url = URL(string: urlString) else { return } | |
64 | + print("load \(urlString)") | |
42 | 65 | |
43 | - webView.applicationNameForUserAgent = AppDelegate.shared.appNameForUserAgent | |
44 | - webView.mainFrameURL = GameViewController.gamePageURL | |
66 | + let req = URLRequest(url: url) | |
67 | + webView.load(req) | |
45 | 68 | } |
46 | 69 | func adjustFlash() { |
47 | - webView.superview?.scroll(flashTopLeft) | |
70 | + clipView.scroll(flashTopLeft) | |
48 | 71 | } |
49 | 72 | |
50 | 73 | @IBAction func reloadContent(_ sender: AnyObject?) { |
51 | - guard let _ = webView.mainFrameURL | |
74 | + guard let _ = webView.url | |
52 | 75 | else { |
53 | - webView.mainFrameURL = GameViewController.gamePageURL | |
76 | + loadURLString(urlString: GameViewController.gamePageURL) | |
54 | 77 | return |
55 | 78 | } |
56 | 79 | // ゲームページでない場合はゲームページを表示する |
57 | - if webView.mainFrameURL != GameViewController.gamePageURL { | |
58 | - webView.mainFrameURL = GameViewController.gamePageURL | |
80 | + if let url = webView?.url, url.absoluteString != GameViewController.gamePageURL { | |
81 | + loadURLString(urlString: GameViewController.gamePageURL) | |
59 | 82 | return |
60 | 83 | } |
61 | - if webView.mainFrameURL.hasPrefix(GameViewController.loginPageURLPrefix) { | |
84 | + if let url = webView.url, url.absoluteString.hasPrefix(GameViewController.loginPageURLPrefix) { | |
62 | 85 | webView.reload(sender) |
63 | 86 | return |
64 | 87 | } |
@@ -111,8 +134,7 @@ class GameViewController: NSViewController { | ||
111 | 134 | |
112 | 135 | override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { |
113 | 136 | if menuItem.action == .reloadContent { |
114 | - guard let _ = webView.mainFrame, | |
115 | - let frameURL = webView.mainFrameURL | |
137 | + guard let frameURL = webView.url?.absoluteString | |
116 | 138 | else { return true } |
117 | 139 | switch frameURL { |
118 | 140 | case GameViewController.gamePageURL: |
@@ -134,6 +156,46 @@ class GameViewController: NSViewController { | ||
134 | 156 | } |
135 | 157 | } |
136 | 158 | |
159 | +extension GameViewController: WKNavigationDelegate { | |
160 | + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { | |
161 | + webView.evaluateJavaScript( | |
162 | + ["var iframe = document.getElementById('game_frame');", | |
163 | + "var validIframe = 0;", | |
164 | + "var atop = 0;", | |
165 | + "var aleft = 0;", | |
166 | + "var aWidfth = 0;", | |
167 | + "if(iframe) {", | |
168 | + " validIframe = 1;", | |
169 | + " var rect = iframe.getBoundingClientRect();", | |
170 | + " atop = rect.top;", | |
171 | + " aleft = rect.left;", | |
172 | + " aWidth = rect.width;", | |
173 | + "}", | |
174 | + "var dict = {valid:validIframe, top:atop, left:aleft, width:aWidth};", | |
175 | + "dict;"] | |
176 | + .reduce("", +) | |
177 | + ) { (dict, error) in | |
178 | + error.map { print($0) } | |
179 | + | |
180 | + guard let param = dict as? [String: Any] else { return } | |
181 | + guard let valid = param["valid"] as? Int else { return } | |
182 | + guard valid == 1 else { return } | |
183 | + guard let top = param["top"] as? Int, | |
184 | + let left = param["left"] as? Int, | |
185 | + let width = param["width"] as? Int | |
186 | + else { return } | |
187 | + | |
188 | + DispatchQueue.main.async { [weak self] in | |
189 | + guard let `self` = self else { return } | |
190 | + | |
191 | + self.flashTopLeft = NSPoint(x: CGFloat(left + (width - 800) / 2), | |
192 | + y: CGFloat(top + 16)) | |
193 | + self.adjustFlash() | |
194 | + } | |
195 | + } | |
196 | + } | |
197 | +} | |
198 | + | |
137 | 199 | extension GameViewController: WebFrameLoadDelegate, WebUIDelegate { |
138 | 200 | private static let excludeMenuItemTag = [ |
139 | 201 | WebMenuItemTagOpenLinkInNewWindow, |