Skip to content

Commit 129c19d

Browse files
author
Jonathan D.A. Jewell
committed
Auto-commit: Sync changes [2026-02-10]
1 parent 40225d9 commit 129c19d

17 files changed

Lines changed: 682 additions & 1 deletion
6 KB
Binary file not shown.

lib/ocaml/BrowserAPI.ast

-14.9 KB
Binary file not shown.

lib/ocaml/BrowserAPI.cmi

8.71 KB
Binary file not shown.

lib/ocaml/BrowserAPI.cmj

129 Bytes
Binary file not shown.

lib/ocaml/BrowserAPI.cmt

37.7 KB
Binary file not shown.

lib/ocaml/BrowserAPI.res

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
// SPDX-License-Identifier: PMPL-1.0-or-later
2+
// Copyright (C) 2026 Jonathan D.A. Jewell <jonathan.jewell@open.ac.uk>
3+
4+
/**
5+
* Firefox Browser API Bindings
6+
*
7+
* Type-safe bindings for Firefox WebExtension APIs.
8+
*/
9+
10+
// Browser namespace (Firefox uses `browser`, Chrome uses `chrome`)
11+
@val @scope("globalThis")
12+
external browser: {..} = "browser"
13+
14+
module Storage = {
15+
type storageArea
16+
17+
@send
18+
external get: (storageArea, array<string>) => promise<Js.Dict.t<Js.Json.t>> = "get"
19+
20+
@send
21+
external set: (storageArea, Js.Dict.t<Js.Json.t>) => promise<unit> = "set"
22+
23+
@send
24+
external remove: (storageArea, array<string>) => promise<unit> = "remove"
25+
26+
@send
27+
external clear: storageArea => promise<unit> = "clear"
28+
29+
@get
30+
external local: {..} => storageArea = "local"
31+
32+
@get
33+
external sync: {..} => storageArea = "sync"
34+
}
35+
36+
module BrowserSettings = {
37+
type setting<'a>
38+
39+
type settingDetails = {
40+
value: Js.Json.t,
41+
levelOfControl: string,
42+
}
43+
44+
@send
45+
external get: (setting<'a>, {..}) => promise<settingDetails> = "get"
46+
47+
@send
48+
external set: (setting<'a>, {"value": Js.Json.t}) => promise<bool> = "set"
49+
50+
@send
51+
external clear: (setting<'a>, {..}) => promise<bool> = "clear"
52+
}
53+
54+
module Privacy = {
55+
type privacySetting<'a>
56+
57+
@send
58+
external get: (privacySetting<'a>, {..}) => promise<BrowserSettings.settingDetails> = "get"
59+
60+
@send
61+
external set: (privacySetting<'a>, {"value": Js.Json.t}) => promise<bool> = "set"
62+
}
63+
64+
module Permissions = {
65+
type permissions = {
66+
permissions: option<array<string>>,
67+
origins: option<array<string>>,
68+
}
69+
70+
@scope("browser") @val
71+
external request: permissions => promise<bool> = "permissions.request"
72+
73+
@scope("browser") @val
74+
external contains: permissions => promise<bool> = "permissions.contains"
75+
76+
@scope("browser") @val
77+
external remove: permissions => promise<bool> = "permissions.remove"
78+
79+
@scope("browser") @val
80+
external getAll: unit => promise<permissions> = "permissions.getAll"
81+
}
82+
83+
module Runtime = {
84+
type browserInfo = {
85+
name: string,
86+
vendor: string,
87+
version: string,
88+
buildID: string,
89+
}
90+
91+
@scope("browser") @val
92+
external getBrowserInfo: unit => promise<browserInfo> = "runtime.getBrowserInfo"
93+
94+
@scope("browser") @val
95+
external getManifest: unit => {..} = "runtime.getManifest"
96+
97+
@scope("browser") @val
98+
external openOptionsPage: unit => promise<unit> = "runtime.openOptionsPage"
99+
100+
type messageResponse
101+
102+
@scope("browser") @val
103+
external sendMessage: Js.Json.t => promise<messageResponse> = "runtime.sendMessage"
104+
}
105+
106+
module Tabs = {
107+
type tab = {
108+
id: option<int>,
109+
index: int,
110+
windowId: int,
111+
highlighted: bool,
112+
active: bool,
113+
pinned: bool,
114+
url: option<string>,
115+
title: option<string>,
116+
}
117+
118+
@scope("browser") @val
119+
external query: {..} => promise<array<tab>> = "tabs.query"
120+
121+
@scope("browser") @val
122+
external getCurrent: unit => promise<tab> = "tabs.getCurrent"
123+
124+
@scope("browser") @val
125+
external create: {..} => promise<tab> = "tabs.create"
126+
}
127+
128+
module Notifications = {
129+
type notificationOptions = {
130+
@as("type") notificationType: string,
131+
title: string,
132+
message: string,
133+
iconUrl: option<string>,
134+
}
135+
136+
@scope("browser") @val
137+
external create: (option<string>, notificationOptions) => promise<string> = "notifications.create"
138+
139+
@scope("browser") @val
140+
external clear: string => promise<bool> = "notifications.clear"
141+
}
142+
143+
// Helper to check if running in Firefox
144+
let isFirefox = () => {
145+
try {
146+
let _ = browser
147+
true
148+
} catch {
149+
| _ => false
150+
}
151+
}
152+
153+
// Get browser compatibility info
154+
let getBrowserCompat = async (): Types.browserCompatibility => {
155+
try {
156+
let info = await Runtime.getBrowserInfo()
157+
{
158+
isGecko: true,
159+
geckoVersion: Some(info.version),
160+
isFirefox: String.includes(info.name, "Firefox"),
161+
isLibrewolf: String.includes(info.name, "LibreWolf"),
162+
isWaterfox: String.includes(info.name, "Waterfox"),
163+
isPaleMoon: String.includes(info.name, "Pale Moon"),
164+
supportedFlags: [],
165+
}
166+
} catch {
167+
| _ => {
168+
isGecko: false,
169+
geckoVersion: None,
170+
isFirefox: false,
171+
isLibrewolf: false,
172+
isWaterfox: false,
173+
isPaleMoon: false,
174+
supportedFlags: [],
175+
}
176+
}
177+
}

lib/ocaml/DatabaseUpdater.ast

-17.8 KB
Binary file not shown.

lib/ocaml/DatabaseUpdater.cmi

5.43 KB
Binary file not shown.

lib/ocaml/DatabaseUpdater.cmj

532 Bytes
Binary file not shown.

lib/ocaml/DatabaseUpdater.cmt

99.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)