Skip to content

Instantly share code, notes, and snippets.

@patrickshox
patrickshox / script.js
Created November 17, 2020 19:39
How to use singleton pattern to pass data from script to SafariExtensionViewController.swift
document.addEventListener("DOMContentLoaded", function(event) {
let title = document.querySelector("#firstHeading").textContent
safari.extension.dispatchMessage(title);
});
@patrickshox
patrickshox / SafariExtensionHandler.swift
Created November 17, 2020 19:38
How to use singleton pattern to pass data from script to SafariExtensionViewController.swift
import SafariServices
class SafariExtensionHandler: SFSafariExtensionHandler {
override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
SharedData.instance.messageName = messageName
SharedData.instance.userInfo = userInfo
}
override func popoverViewController() -> SFSafariExtensionViewController {
@patrickshox
patrickshox / SafariExtensionViewController.swift
Last active November 17, 2020 19:43
How to use singleton pattern to pass data from script to SafariExtensionViewController.swift
import SafariServices
class SafariExtensionViewController: SFSafariExtensionViewController {
@IBOutlet weak var label: NSTextField!
override func viewWillAppear() {
label.stringValue = SharedData.instance.messageName ?? "default"
}
@patrickshox
patrickshox / SharedData.swift
Created November 17, 2020 19:34
How to use singleton pattern to pass data from script to SafariExtensionViewController.swift
import Foundation
final class SharedData {
private init () {}
static let instance = SharedData()
var messageName: String?
var userInfo: [String : Any]?
}
import Cocoa
import SafariServices.SFSafariApplication
import SafariServices.SFSafariExtensionManager
let defaults = UserDefaults.init(suiteName: "L27L4K8SQU.WikiReminder")
class ViewController: NSViewController {
@IBAction func refreshButtonPressed(_ sender: Any) {
self.recentlyReadLabel.stringValue = defaults!.string(forKey: "WikipediaPageTitle") ?? "No value yet"
@patrickshox
patrickshox / script.js
Created October 28, 2020 14:16
Search highlighted text in DuckDuckGo. An answer to u/OneTrueShady on r/SafariExtensionDevs.
document.addEventListener("contextmenu", handleContextMenu, false);
function handleContextMenu(event) {
var selectedText = window.getSelection().toString();
safari.extension.setContextMenuEventUserInfo(event, {"selectedText": selectedText});
}
@patrickshox
patrickshox / SafariExtensionHandler.swift
Created October 28, 2020 14:15
Search highlighted text in DuckDuckGo. An answer to u/OneTrueShady on r/SafariExtensionDevs.
import SafariServices
class SafariExtensionHandler: SFSafariExtensionHandler {
override func contextMenuItemSelected(withCommand command: String, in page: SFSafariPage, userInfo: [String : Any]? = nil) {
if command == "Search" {
let redirectedURL = URL(string: "https://duckduckgo.com/?q=\(String(describing: userInfo!["selectdText"]))&t=h_&ia=web!")!
page.getContainingTab { (tab) in
tab.navigate(to: redirectedURL)
}
@patrickshox
patrickshox / SafariExtensionHandler.swift
Created October 28, 2020 01:31
Hacky way of logging extension code via the Safari console. An answer to u/OneTrueShady on r/SafariExtensionDevs. Raw
override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
if messageName == "requiredMessage" {
page.dispatchMessageToScript(withName: "logger")
}
}
@patrickshox
patrickshox / script.js
Last active October 28, 2020 13:03
Hacky way of logging extension code via the Safari console. An answer to u/OneTrueShady on r/SafariExtensionDevs.
safari.self.addEventListener("message", function(event) {
if (event.name == "logger") {
console.log("messageRecieved is working just fine.")
}
});
@patrickshox
patrickshox / SafariExtensionHandler.swift
Created October 23, 2020 06:33
Hacky way of implementing non-default search engines. An answer to u/OneTrueShady on r/SafariExtensionDevs.
// Add these functions to your SafariExtensionHandler subclass:
// Given a Google, Yahoo, or Bing URL, this function will return the url encoding
func getQueryStringParameter(url: String) -> String? {
var param = "q"
if url.contains("search.yahoo.com") {
param = "p"
}
guard let url = URLComponents(string: url) else { return nil }
let rawString = url.queryItems?.first(where: { $0.name == param })?.value
let percentEncoding = rawString?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)?.replacingOccurrences(of: "&", with: "%26")