// SPDX-License-Identifier: AGPL-3.0-or-later import { WebView } from "./web_view.js"; import { PairingHandler } from "./p2p.js"; import { notifications, initAll } from "./services/index.js"; let NEW_FRAME_DEFAULT_URL = navigator.servo.getStringPreference("beaver.start_url"); const windowId = `browser-${Date.now()}-${Math.random().toString(36).slice(2)}`; navigator.embedder.addEventListener("servoerror", (event) => { console.error(`[Servo] ${event.type} ${event.detail}`); }); navigator.embedder.addEventListener("preferencechanged", (event) => { if (event.detail.name == "beaver.start_url") { NEW_FRAME_DEFAULT_URL = event.detail.value; } }); // P2P pairing handler const pairingHandler = new PairingHandler({ onNotificationAdd: notifications.add, onNotificationRemove: notifications.removeByTag, }); export function createNewView(layoutManager, intent) { const webView = new WebView(NEW_FRAME_DEFAULT_URL, "", {}); layoutManager.addWebView(webView, intent); } export function switchToHomescreen(layoutManager) { if (layoutManager.homescreenWebviewId) { layoutManager.setActiveWebView(layoutManager.homescreenWebviewId); } } export function openView(layoutManager, url, title) { const view = new WebView(url, title, {}); layoutManager.addWebView(view); } export function newWebViewBuilder() { return new WebView(NEW_FRAME_DEFAULT_URL, "", {}); } export function initApp(layoutManager, isMobileMode, mobileComponents) { const services = initAll(layoutManager, { windowId, isMobileMode, createNewView: (intent) => createNewView(layoutManager, intent), switchToHomescreen: () => switchToHomescreen(layoutManager), openView: (url, title) => openView(layoutManager, url, title), mobileComponents, }); window.servo = { adoptNewWebView(url, webviewId, browsingContextId, pipelineId) { const attrs = { "adopt-webview-id": webviewId, "adopt-browsing-context-id": browsingContextId, "adopt-pipeline-id": pipelineId, }; try { layoutManager.addWebView(new WebView(url, "", attrs)); } catch (e) { console.error(e); } }, openKeyboard(inputType, currentValue, position) { services.keyboard.open({ inputType, currentValue, placeholder: "", position, }); }, closeEmbedderControl(controlId) { services.keyboard.close(); }, }; // Open URL from query params if present const params = new URLSearchParams(window.location.search); const openValue = params.get("open"); if (openValue) { layoutManager.addWebView(new WebView(openValue, "", {})); } return { services, pairingHandler }; }