Axion Платформа Скачать
Documentation · Engine · 04

WebView слой

Мост между window.axion и подсистемами Engine: RPC-диспетчер, проверка прав, доставка событий.

04 WebView слой

Модуль webview — это мост между JavaScript API приложения (window.axion) и подсистемами Engine. Каждый RPC-вызов из JS проходит через Capability Broker, затем Permission Broker, и только потом выполняется.

4.1AppContext

Для каждого окна приложения создаётся контекст, идентифицирующий владельца:

use axion_engine::webview::AppContext;

let ctx = AppContext::new("my_app", "My App", "1.0.0");

Контекст используется Permission Broker для проверки, кому принадлежит запрос.

4.2RPC-диспетчер

Обработка вызова — функция webview::call():

use axion_engine::webview;
use serde_json::json;

let result = webview::call(
    &engine,       // AxionEngine
    &broker,       // CapabilityBroker
    &permissions,  // PermissionBroker
    &ctx,          // AppContext
    "fs.readFile", // метод из window.axion
    &json!(["main.js"]),
);

Поддерживаемые методы включают: fs.*, workspace.*, process.run, network.*, storage.*, secrets.*, ipc.call, window.*, events.*, capabilities.*, system.*, identity.

Управление окном (window.*) из JS: window.open, window.close, window.setTitle, window.hide, window.show, window.minimize, window.maximize, window.restore, window.toggleMaximize, window.setFullscreen(on), window.setSize(w, h), window.setPosition(x, y), window.setResizable(on), window.setDecorations(on) (скрыть/показать системный titlebar), window.setAlwaysOnTop(on), window.focus, window.state. Все команды окна гейтятся capability window.open.

4.3Поток permissions

Каждый вызов проходит двухуровневую проверку:

  1. Capability Broker — проверяет, заявлена ли capability в manifest приложения и покрывает ли она scope/target;
  2. Permission Broker — проверяет пользовательскую политику: Allowed, Denied или NeedsConfirmation.

Если результат — NeedsConfirmation, Engine выдаёт одноразовый ticket и возвращает структурированную ошибку:

AXION_PERMISSION_NEEDED ticket=550e8400-... capability=filesystem.read

Страница показывает промпт. После выбора пользователя вызывается permissions.resolve:

// «Разрешить»
await window.axion.permissions.resolve(ticket, true);
// «Отказать»
await window.axion.permissions.resolve(ticket, false);
Одноразовый ticket. Ticket привязан к владельцу (app_id) и может быть погашён только один раз. Повторный вызов resolve с тем же ticket вернёт ошибку.

4.4Доставка событий

Движок отправляет события в страницу через event_emitter:

// Установка callback-а для доставки событий в WebView
engine.set_event_emitter(|event, data| {
    // Например: eval JS в окне приложения
    println!("event: {event}, data: {data}");
});

Подписка на события по Axion Protocol:

// Клиент (оболочка) подписывается на события
engine.subscribe_protocol("app.resumed");
engine.subscribe_protocol("*");  // все события

// Забрать накопленные события
let events = engine.pending_protocol_events();

Управление окном — через set_window_control(); состояние — через set_window_query():

use axion_engine::WindowAction;

engine.set_window_control(|action| {
    match action {
        WindowAction::SetTitle(t)      => { /* обновить заголовок окна */ }
        WindowAction::Hide             => { /* скрыть окно */ }
        WindowAction::Show             => { /* показать окно */ }
        WindowAction::Minimize         => { /* свернуть окно */ }
        WindowAction::Maximize         => { /* развернуть окно */ }
        WindowAction::Restore          => { /* вернуть исходный размер */ }
        WindowAction::ToggleMaximize   => { /* переключить разворот */ }
        WindowAction::SetFullscreen(f) => { /* полноэкранный режим */ }
        WindowAction::SetSize(w, h)    => { /* размер окна, px */ }
        WindowAction::SetPosition(x, y) => { /* позиция на экране, px */ }
        WindowAction::SetResizable(r)  => { /* разрешить/запретить ресайз */ }
        WindowAction::SetDecorations(d) => { /* системный titlebar */ }
        WindowAction::SetAlwaysOnTop(a) => { /* поверх всех окон */ }
        WindowAction::Focus            => { /* фокус окну */ }
        WindowAction::Close            => { /* закрыть окно */ }
    }
});

engine.window_action(WindowAction::SetTitle("Новый заголовок".into()))?;

// window.state возвращает оболочка по запросу (title, visible, minimized,
// maximized, fullscreen, width, height, x, y):
engine.set_window_query(|| serde_json::to_value(window_state).ok());
Платформы и их особенности
Платформенные адаптеры