js_webextensions

    WebExtensions / chrome.* / browser.* API bindings

    js
    webextensions
    chrome
    firefox
    Download zip
    Author
    Version
    0.13.0
    License
    MIT
    Last updated
    3 hours ago
    Downloads
    31

    Dependencies

    #WebExtensions API

    MoonBit bindings for WebExtensions API (browser extensions).

    https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API

    #Supported APIs

    APIPackageStatusNote
    chromemizchi/js_webextensions/chrome🤖 AI GeneratedUnified wrapper for all APIs
    storagemizchi/js_webextensions/storage🤖 AI Generatedlocal, sync, session storage
    runtimemizchi/js_webextensions/runtime🤖 AI Generatedmessaging, extension info
    tabsmizchi/js_webextensions/tabs🤖 AI Generatedtab management

    #Quick Start (Using Chrome Wrapper)

    // Initialize Chrome wrapper - provides unified access to all APIs
    let chrome = @chrome.chrome()

    // Storage
    chrome.storage.local_area.set_item("key", "value" |> @js.any)
    let value = chrome.storage.local_area.get_item("key")

    // Runtime
    let manifest = chrome.runtime.get_manifest()
    chrome.runtime.send_message(message)

    // Tabs
    let tabs = chrome.tabs.query(options={ active: Some(true) })
    chrome.tabs.create(options={ url: Some("https://example.com") })

    #Usage

    #Storage API

    // Get storage area
    let storage = @storage.local_storage()

    // Set item
    storage.set_item("key", "value" |> @js.any)

    // Get item
    let value = storage.get_item("key")

    // Get all items
    let all = storage.get_all()

    // Remove item
    storage.remove_item("key")

    // Clear all
    storage.clear()

    // Listen for changes
    @storage.on_changed(fn(changes, area_name) {
    @js.log("Storage changed in: \{area_name}")
    })

    #Runtime API

    // Get manifest
    let manifest = @runtime.get_manifest()

    // Get extension URL
    let url = @runtime.get_url("popup.html")

    // Send message (within extension)
    let response = @runtime.send_message(message)

    // Listen for messages
    @runtime.on_message(fn(message, sender, send_response) {
    @js.log("Received message")
    send_response("response" |> @js.any)
    true // Return true to indicate async response
    })

    // Long-lived connections
    let port = @runtime.connect(name="my-port")
    port.post_message("hello" |> @js.any)
    port.on_message(fn(msg) {
    @js.log("Port message received")
    })

    // Listen for extension install
    @runtime.on_installed(fn(details) {
    @js.log("Extension installed/updated")
    })

    #Tabs API

    // Query tabs
    let tabs = @tabs.query(options={ active: Some(true), current_window: Some(true) })

    // Get current tab
    let current = @tabs.get_current()

    // Create tab
    let tab = @tabs.create(options={ url: Some("https://example.com") })

    // Update tab
    @tabs.update(tab_id, { url: Some("https://new-url.com"), ..@tabs.UpdateOptions::default() })

    // Remove tab
    @tabs.remove_tab(tab_id)

    // Send message to content script
    let response = @tabs.send_message(tab_id, message)

    // Listen for tab events
    @tabs.on_created(fn(tab) {
    @js.log("Tab created: \{tab.id}")
    })

    @tabs.on_updated(fn(tab_id, change_info, tab) {
    @js.log("Tab updated")
    })

    @tabs.on_removed(fn(tab_id, remove_info) {
    @js.log("Tab removed")
    })

    #Browser Compatibility

    Works with:
    • Firefox (using browser namespace)
    • Chrome/Chromium (using chrome namespace)
    • Edge, Opera, etc.

    The bindings automatically detect the browser and use the appropriate namespace.

    browser

    fn browser() ->
    Any

    Get the browser global object In Firefox: browser In Chrome: chrome (with Promise polyfill)

    Source Files

    Powered by MoonBit

    Site sourceReport issuePackagesBuild queueSkillsStatistics

    © 2026 mooncakes.io