Skip to content

Commit

Permalink
New settings UI
Browse files Browse the repository at this point in the history
  • Loading branch information
kishikawakatsumi committed Mar 29, 2020
1 parent b72533a commit 2599404
Show file tree
Hide file tree
Showing 17 changed files with 874 additions and 842 deletions.
3 changes: 3 additions & 0 deletions ChromeExtension/bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,10 @@ const activate = () => {
return;
}
dispatchMessage("initialize", {
url: parsedUrl.toString("https"),
resource: parsedUrl.resource,
owner: parsedUrl.owner,
name: parsedUrl.name,
href: parsedUrl.href
});

Expand Down
654 changes: 364 additions & 290 deletions SafariExtension/Base.lproj/SafariExtensionViewController.xib

Large diffs are not rendered by default.

139 changes: 46 additions & 93 deletions SafariExtension/SafariExtensionHandler.swift
Original file line number Diff line number Diff line change
@@ -1,40 +1,27 @@
import SafariServices
import OSLog

let log = OSLog(subsystem: "com.kishikawakatsumi.SourceKitForSafari", category: "Safari Extension")

final class SafariExtensionHandler: SFSafariExtensionHandler {
private let service = SourceKitServiceProxy.shared

override init() {
super.init()
Settings.shared.prepare()
}

override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
switch messageName {
case "initialize":
page.getPropertiesWithCompletionHandler { [weak self] (properties) in
guard let self = self else { return }
guard Settings.shared.automaticallyCheckoutsRepository else { break }

guard let properties = properties, let url = properties.url else {
return
}
guard let repositoryURL = self.parseGitHubURL(url) else {
return
}
guard let userInfo = userInfo,
let url = userInfo["url"] as? String,
let owner = userInfo["owner"] as? String, owner != "trending",
let repositoryURL = URL(string: url)?.deletingPathExtension().appendingPathExtension("git")
else { return }

self.service.synchronizeRepository(repositoryURL) { (_, _) in }
}
self.service.synchronizeRepository(repositoryURL) { (_, _) in }
case "didOpen":
guard let userInfo = userInfo,
let resource = userInfo["resource"] as? String,
let slug = userInfo["slug"] as? String,
let filepath = userInfo["filepath"] as? String,
let text = userInfo["text"] as? String
else { break }

os_log("[SafariExtension] didOpen(file: %{public}s)", log: log, type: .debug, filepath)
else { return }

service.sendInitializeRequest(resource: resource, slug: slug) { [weak self] (successfully, _) in
guard let self = self else { return }
Expand Down Expand Up @@ -66,7 +53,7 @@ final class SafariExtensionHandler: SFSafariExtensionHandler {
let line = userInfo["line"] as? Int,
let character = userInfo["character"] as? Int,
let text = userInfo["text"] as? String
else { break }
else { return }
var skip = 0
for character in text {
if character == " " || character == "." {
Expand All @@ -76,8 +63,6 @@ final class SafariExtensionHandler: SFSafariExtensionHandler {
}
}

os_log("[SafariExtension] hover(file: %{public}s, line: %d, character: %d)", log: log, type: .debug, filepath, line, character + skip)

service.sendHoverRequest(resource: resource, slug: slug, path: filepath, line: line, character: character + skip) { (successfully, response) in
if successfully {
if let value = response["value"] as? String {
Expand All @@ -98,7 +83,7 @@ final class SafariExtensionHandler: SFSafariExtensionHandler {
let line = userInfo["line"] as? Int,
let character = userInfo["character"] as? Int,
let text = userInfo["text"] as? String
else { break }
else { return }
var skip = 0
for character in text {
if character == " " || character == "." {
Expand All @@ -108,8 +93,6 @@ final class SafariExtensionHandler: SFSafariExtensionHandler {
}
}

os_log("[SafariExtension] definition(file: %{public}s, line: %d, character: %d)", log: log, type: .debug, filepath, line, character + skip)

service.sendDefinitionRequest(resource: resource, slug: slug, path: filepath, line: line, character: character + skip) { (successfully, response) in
if successfully {
if let value = response["value"] as? [[String: Any]] {
Expand Down Expand Up @@ -156,87 +139,57 @@ final class SafariExtensionHandler: SFSafariExtensionHandler {

override func popoverWillShow(in window: SFSafariWindow) {
let viewController = SafariExtensionViewController.shared
viewController.updateUI()

window.getActiveTab { (activeTab) in
guard let activeTab = activeTab else {
return
}

activeTab.getActivePage { (activePage) in
guard let activePage = activePage else {
return
}

activePage.getPropertiesWithCompletionHandler { [weak self] (properties) in
guard let properties = properties, let url = properties.url else {
return
viewController.updateUI { [weak self] in
guard let self = self else { return }

if Settings.shared.server == .default {
self.service.defaultLanguageServerPath { (successfully, response) in
if successfully {
Settings.shared.serverPath = response
viewController.serverPath = response
}

guard let repositoryURL = self?.parseGitHubURL(url) else {
viewController.repository = ""
return
}

viewController.repository = repositoryURL.absoluteString
}
}
}

if Settings.shared.serverPathOption == .default {
service.defaultLanguageServerPath { (successfully, response) in
self.service.defaultSDKPath(for: Settings.shared.sdk.rawValue) { (successfully, response) in
if successfully {
Settings.shared.serverPath = response
viewController.updateUI()
Settings.shared.sdkPath = response
viewController.sdkPath = response
}
}
}
service.defaultSDKPath(for: Settings.shared.SDKOption.rawValue) { (successfully, response) in
if successfully {
Settings.shared.SDKPath = response
viewController.updateUI()
}
}
}

override func popoverViewController() -> SFSafariExtensionViewController {
let viewController = SafariExtensionViewController.shared
return viewController
}

private func sendLogMessage(_ level: LogLevel, _ message: String) {
SFSafariApplication.getActiveWindow { (window) in
guard let window = window else {
return
}

window.getActiveTab { (activeTab) in
guard let activeTab = activeTab else {
return
}
guard let activeTab = activeTab else { return }

activeTab.getActivePage { (activePage) in
guard let activePage = activePage else {
return
}
guard let activePage = activePage else { return }

activePage.dispatchMessageToScript(withName: "log", userInfo: ["value": "[\(level.rawValue.uppercased())] \(message)"])
activePage.getPropertiesWithCompletionHandler { [weak self] (properties) in
guard let self = self else { return }
guard let properties = properties, let url = properties.url else { return }

guard let repositoryURL = parseGitHubURL(url) else {
viewController.repository = ""
return
}

viewController.repository = repositoryURL.absoluteString
viewController.checkoutDirectory = nil
viewController.lastUpdate = nil

self.service.localCheckoutDirectory(for: repositoryURL) { (successfully, response) in
viewController.checkoutDirectory = successfully ? response : nil
}
self.service.lastUpdate(for: repositoryURL) { (successfully, response) in
viewController.lastUpdate = successfully ? response : nil
}
}
}
}
}
}

private func parseGitHubURL(_ url: URL) -> URL? {
guard let scheme = url.scheme, scheme == "https" ,let host = url.host, host == "github.com", url.pathComponents.count >= 3 else {
return nil
}
return URL(string: "\(scheme)://\(host)/\(url.pathComponents.dropFirst().prefix(2).joined(separator: "/")).git")
}

private enum LogLevel: String {
case debug
case info
case warn
case error
override func popoverViewController() -> SFSafariExtensionViewController {
let viewController = SafariExtensionViewController.shared
return viewController
}
}
Loading

0 comments on commit 2599404

Please sign in to comment.