-
Notifications
You must be signed in to change notification settings - Fork 8
/
browser.lua
120 lines (102 loc) 路 3.41 KB
/
browser.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
local Settings = require("hs.settings")
local obj = {}
local snap = L.req("lib.wm.snap")
obj.__index = obj
obj.name = "browser"
obj.debug = false
obj.browsers = C.preferred.browsers
local browser = hs.application.get(Settings.get("group.browsers") or C.preferred.browser or obj.browsers[1])
local dbg = function(str, ...)
str = string.format(":: [%s] %s", obj.name, str)
if obj.debug then return _G.dbg(string.format(str, ...), false) end
end
function obj.hasTab(url)
if browser and hs.fnutils.contains(obj.browsers, browser:name()) then
local _status, returnedObj, _descriptor = hs.osascript.javascript([[
(function() {
var browser = Application(']] .. browser:name() .. [[');
const foundTab = browser.windows().filter((win) => {
const tabIndex = win.tabs().findIndex(tab => tab.url().match(/]] .. string.gsub(url, "/", "\\/") .. [[/));
return tabIndex !== -1
})
return foundTab.length > 0;
})();
]])
return returnedObj
end
return nil
end
function obj.jump(url)
if browser and hs.fnutils.contains(obj.browsers, browser:name()) then
local _success, object, _output = hs.osascript.javascript([[
(function() {
var browser = Application(']] .. browser:name() .. [[');
browser.activate();
for (win of browser.windows()) {
var tabIndex =
win.tabs().findIndex(tab => tab.url().match(/]] .. string.gsub(url, "/", "\\/") .. [[/));
if (tabIndex != -1) {
win.activeTabIndex = (tabIndex + 1);
win.index = 1;
return true;
} else {
return false;
}
}
})();
]])
return object
else
return false
end
end
function obj.splitTab(to_next_screen)
if not snap then
warn("snap module not found..")
return
end
-- Move current window to the left half
if not to_next_screen then snap.left50() end
hs.timer.doAfter(0.25, function()
local supportedBrowsers =
{ "Chromium", "Brave Browser Nightly", "Brave Browser Dev", "Brave Browser", "Brave Browser Beta", "Safari" }
if browser and hs.fnutils.contains(supportedBrowsers, browser:name()) then
dbg("(splitTab) %s", browser:name())
local moveTab = { "Tab", "Move Tab to New Window" }
if string.match(browser:name(), "Safari") then moveTab = { "Window", "Move Tab to New Window" } end
browser:selectMenuItem(moveTab)
-- Move the split tab to the right of the screen
if to_next_screen then
dbg("(splitTab) to_next_screen: %s", C.displays.internal)
browser:selectMenuItem({ "Window", fmt("Move to %s", C.displays.internal) })
snap.maximize()
else
snap.right50()
end
else
warn(fmt("[snap.browser.splitTab] unsupported browser: %s", browser:name()))
end
end)
end
function obj.killTabsByDomain(domain)
if browser and hs.fnutils.contains(obj.browsers, browser:name()) then
hs.osascript.javascript([[
(function() {
var browser = Application(']] .. browser:name() .. [[');
browser.activate();
for (win of browser.windows()) {
for (tab of win.tabs()) {
if (tab.url().match(/]] .. string.gsub(domain, "/", "\\/") .. [[/)) {
console.log("found tab to kill", tab.url())
tab.close()
}
}
}
})();
]])
end
end
function obj:init() return self end
function obj:start() return self end
function obj:stop() return self end
return obj