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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
** Usable
- [X] Decorations api (just for statusline)
- [X] web.schedule
- [X] Create view with html (web.view.set_html())
- [X] Expose JS <-> lua in page (web.view.expose())
- [X] Tests for api
- [X] Run JS in page (web.view.run_js())
- [X] KeyPressed event
- [X] f-key navigation
- [ ] On finder stop, exit find mode
- [ ] web.decorations.*.set_size()
- [ ] web.keymap.configure_mode(modename, { passthrough = false })
- [ ] web.view.reload
- [ ] Load assets directory into build
- [ ] Fullscreen
- [ ] Zoom in/out
- [ ] Use table for all internals api options?
- [ ] Generate docs for api
- [ ] Show number of tabs in statusline
- [ ] web.view.reload()
** Bugs
- [ ] Managing focus in decorations?
- [ ] INVESTIGATE: Check why urlchanged doesnt fire for first url open sometimes
- [ ] INVESTIGATE: Segfault on close sometimes
- [ ] API's don't validate types. (type conversion segfaults)
- [ ] web.view apis in `-e` flag from "clients" (non-servers calls) don't work
** Next
- [ ] Granular updates in statusline plugin instead of set_html multiple times
- [ ] Permission management (list/allow/deny) lua api
- [ ] Tests for window
- [ ] More tests for stack
- [ ] Tests for router
- [ ] Read page contents via lua
- [ ] User data/profiles management
- [ ] Create window with new profile
- [ ] Configuration validation
- [ ] web.win.* apis (list, current_id)
- [ ] Allow toggling devtools
- [X] Set search text as the user is typing (dmenu -r)
- [ ] Log stdout, errors and results from lua somewhere
- [ ] Conflict in keymap (keymap already exists)
- [ ] Allow pattern filtering for event listeners
- [ ] Allow tab_id, win_id filtering for event listeners
- [ ] Handle resource cleanup + signal disconnecting
- [ ] Private window (in-memory profile)
** Later
- [ ] Bookmarking
- [ ] User scripts (greasemonkey?)
- [ ] User stylesheets (per site and global?)
- [ ] Support multiple modes for keymap.set: `web.keymap.set({'n','i'}, ...)`
- [ ] static linking for qt
- [X] vendor web.inspect with build
- [ ] Right click context menu items
- [ ] Listen to renderprocesstermination signal
- [ ] Change instance manager command format
** Later later
- [ ] Custom file picker
- [ ] remote debugging with cdp (spider-repl)
** Maybe
- [ ] Floating webviews?
- [ ] Move modal keymap management into lua?
** Notes
- view = 0, nil, none: Current view
- Win = 0: Current window
- Win = nil, none: All windows or current window based on operation
- Keep track of last focused window (current window is last focused)
#+begin_src lua
web.view.set_url(url) -- Set url for current view
web.view.set_url(url, { view = 1 }) -- Set url for view 1
web.view.set_url(url, { view = 1, win = 1 }) -- Set url for view 1 in win 1
web.view.set_url(url, { win = 1 }) -- Set url for current view in win 1
web.view.create(url, { win = 1 }) -- New view in win 1
web.view.create(url) -- New view in current window
web.view.close({ view = 1 }) -- Close view 1
web.view.close() -- Close current view in current window
web.view.list({ win = nil }) -- List all tabs
web.view.list({ win = 1 }) -- List win 1 tabs
web.view.select({ view = 1, win = 1 }) -- Select win 1 view
web.view.select({ view = 1, win = 0 }) -- Select view 1 in current window
web.view.select({ view = 1 }) -- Select view 1
web.view.current({ win = 1 }) -- Current view in win 1
web.view.current() -- Current view in current win
web.history.back(1) -- Back for current view in current window
web.history.back(1, { view = 1 }) -- Back for view 1
web.history.back(1, { win = 1 }) -- Back for current view in win 1
web.keymap.set('n', '<c-r>', ..., { view = 1 }) -- Set keymap for view 1
web.keymap.set('n', '<c-r>', ..., { win = 1 }) -- Set keymap for win 1
web.opt.new_tab_url = 'https://duckduckgo.com'
-- Search api
web.search.set_search_text('whatever')
web.search.next()
web.search.prev()
web.search.get_search_text()
web.search.current()
web.search.total()
web.decorations.top.enable()
web.decorations.top.disable()
web.decorations.top.set_size(20)
local view_id = web.decorations.top.view()
web.view.set_html('<div>Hello world</div>', { view = view })
web.decorations.top.destroy() -- Maybe to destroy unwanted webviews
-- Show tabs in top decoration
web.view.expose_js('openTab', function(tabId)
web.view.select({ view = tabId })
end, { view = web.decorations.top.view() })
web.event.add_listener({ 'TabOpen', 'TabClose' }, {
callback = function()
local tabs_html = ''
local views = web.view.list()
for index, view in ipairs(web.view.list()) do
local text = index..': '..view.title..' ('..view.url..')'
local tab = '<span onclick="_nullbrowser.rpc.openTab('..view.id..')">' .. text .. '</span>')
tabs_html = tabs_html .. tab
end
web.view.set_html(tabs_html, { view = web.decorations.top.view() })
end,
})
#+end_src
|