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
Каждый вызов проходит двухуровневую проверку:
- Capability Broker — проверяет, заявлена ли capability в manifest приложения и покрывает ли она scope/target;
- 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);
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());