@nativedesktop/react 0.4.40 → 0.4.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -595,7 +595,7 @@ var widgetEvents = {
595
595
  tabview: [{ name: "selectionChanged", handler: "onSelectionChanged", payload: "index" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
596
596
  grid: [{ name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
597
597
  listview: [{ name: "rowActivated", handler: "onRowActivated", payload: "index" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
598
- webview: [{ name: "navigate", handler: "onNavigate", payload: "text" }, { name: "titleChanged", handler: "onTitleChanged", payload: "text" }, { name: "loadingChanged", handler: "onLoadingChanged", payload: "checked" }, { name: "backAvailable", handler: "onBackAvailable", payload: "checked" }, { name: "forwardAvailable", handler: "onForwardAvailable", payload: "checked" }, { name: "loadProgress", handler: "onLoadProgress", payload: "value" }, { name: "loadFailed", handler: "onLoadFailed", payload: "data" }, { name: "newWindow", handler: "onNewWindow", payload: "text" }, { name: "browserCommand", handler: "onBrowserCommand", payload: "text" }, { name: "downloadRequested", handler: "onDownloadRequested", payload: "data" }, { name: "downloadUpdated", handler: "onDownloadUpdated", payload: "data" }, { name: "javaScriptResult", handler: "onJavaScriptResult", payload: "data" }, { name: "scriptMessage", handler: "onScriptMessage", payload: "data" }, { name: "schemeRequest", handler: "onSchemeRequest", payload: "data" }, { name: "cookiesResult", handler: "onCookiesResult", payload: "data" }, { name: "cookiesChanged", handler: "onCookiesChanged", payload: "data" }, { name: "faviconChanged", handler: "onFaviconChanged", payload: "data" }, { name: "findResult", handler: "onFindResult", payload: "data" }, { name: "securityChanged", handler: "onSecurityChanged", payload: "data" }, { name: "linkHover", handler: "onLinkHover", payload: "text" }, { name: "contextMenu", handler: "onContextMenu", payload: "data" }, { name: "contextMenuItemClicked", handler: "onContextMenuItemClicked", payload: "data" }, { name: "sessionSaved", handler: "onSessionSaved", payload: "data" }, { name: "audioStateChanged", handler: "onAudioStateChanged", payload: "data" }, { name: "extensionsList", handler: "onExtensionsList", payload: "data" }, { name: "extensionActions", handler: "onExtensionActions", payload: "data" }, { name: "extensionsChanged", handler: "onExtensionsChanged", payload: "data" }, { name: "chromeDialog", handler: "onChromeDialog", payload: "data" }, { name: "permissionRequest", handler: "onPermissionRequest", payload: "data" }, { name: "permissionRequestDismissed", handler: "onPermissionRequestDismissed", payload: "data" }, { name: "zoomChanged", handler: "onZoomChanged", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
598
+ webview: [{ name: "navigate", handler: "onNavigate", payload: "text" }, { name: "titleChanged", handler: "onTitleChanged", payload: "text" }, { name: "loadingChanged", handler: "onLoadingChanged", payload: "checked" }, { name: "focusChanged", handler: "onFocusChanged", payload: "checked" }, { name: "backAvailable", handler: "onBackAvailable", payload: "checked" }, { name: "forwardAvailable", handler: "onForwardAvailable", payload: "checked" }, { name: "loadProgress", handler: "onLoadProgress", payload: "value" }, { name: "loadFailed", handler: "onLoadFailed", payload: "data" }, { name: "newWindow", handler: "onNewWindow", payload: "text" }, { name: "browserCommand", handler: "onBrowserCommand", payload: "text" }, { name: "downloadRequested", handler: "onDownloadRequested", payload: "data" }, { name: "downloadUpdated", handler: "onDownloadUpdated", payload: "data" }, { name: "javaScriptResult", handler: "onJavaScriptResult", payload: "data" }, { name: "scriptMessage", handler: "onScriptMessage", payload: "data" }, { name: "schemeRequest", handler: "onSchemeRequest", payload: "data" }, { name: "cookiesResult", handler: "onCookiesResult", payload: "data" }, { name: "cookiesChanged", handler: "onCookiesChanged", payload: "data" }, { name: "faviconChanged", handler: "onFaviconChanged", payload: "data" }, { name: "findResult", handler: "onFindResult", payload: "data" }, { name: "securityChanged", handler: "onSecurityChanged", payload: "data" }, { name: "linkHover", handler: "onLinkHover", payload: "text" }, { name: "contextMenu", handler: "onContextMenu", payload: "data" }, { name: "contextMenuItemClicked", handler: "onContextMenuItemClicked", payload: "data" }, { name: "sessionSaved", handler: "onSessionSaved", payload: "data" }, { name: "audioStateChanged", handler: "onAudioStateChanged", payload: "data" }, { name: "extensionsList", handler: "onExtensionsList", payload: "data" }, { name: "extensionActions", handler: "onExtensionActions", payload: "data" }, { name: "extensionsChanged", handler: "onExtensionsChanged", payload: "data" }, { name: "chromeDialog", handler: "onChromeDialog", payload: "data" }, { name: "permissionRequest", handler: "onPermissionRequest", payload: "data" }, { name: "permissionRequestDismissed", handler: "onPermissionRequestDismissed", payload: "data" }, { name: "zoomChanged", handler: "onZoomChanged", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
599
599
  nativeview: [{ name: "nativeEvent", handler: "onNativeEvent", payload: "data" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
600
600
  splitview: [{ name: "revealChanged", handler: "onRevealChanged", payload: "checked" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
601
601
  headerbar: [{ name: "back", handler: "onBack", payload: "none" }, { name: "forward", handler: "onForward", payload: "none" }, { name: "dragStarted", handler: "onDragStarted", payload: "text" }, { name: "dragEnded", handler: "onDragEnded", payload: "none" }, { name: "dragOver", handler: "onDragOver", payload: "dragPoint" }, { name: "dropped", handler: "onDropped", payload: "dragPoint" }],
@@ -672,7 +672,7 @@ var handlerPropNames = {
672
672
  tabview: ["onSelectionChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
673
673
  grid: ["onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
674
674
  listview: ["onRowActivated", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
675
- webview: ["onNavigate", "onTitleChanged", "onLoadingChanged", "onBackAvailable", "onForwardAvailable", "onLoadProgress", "onLoadFailed", "onNewWindow", "onBrowserCommand", "onDownloadRequested", "onDownloadUpdated", "onJavaScriptResult", "onScriptMessage", "onSchemeRequest", "onCookiesResult", "onCookiesChanged", "onFaviconChanged", "onFindResult", "onSecurityChanged", "onLinkHover", "onContextMenu", "onContextMenuItemClicked", "onSessionSaved", "onAudioStateChanged", "onExtensionsList", "onExtensionActions", "onExtensionsChanged", "onChromeDialog", "onPermissionRequest", "onPermissionRequestDismissed", "onZoomChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
675
+ webview: ["onNavigate", "onTitleChanged", "onLoadingChanged", "onFocusChanged", "onBackAvailable", "onForwardAvailable", "onLoadProgress", "onLoadFailed", "onNewWindow", "onBrowserCommand", "onDownloadRequested", "onDownloadUpdated", "onJavaScriptResult", "onScriptMessage", "onSchemeRequest", "onCookiesResult", "onCookiesChanged", "onFaviconChanged", "onFindResult", "onSecurityChanged", "onLinkHover", "onContextMenu", "onContextMenuItemClicked", "onSessionSaved", "onAudioStateChanged", "onExtensionsList", "onExtensionActions", "onExtensionsChanged", "onChromeDialog", "onPermissionRequest", "onPermissionRequestDismissed", "onZoomChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
676
676
  nativeview: ["onNativeEvent", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
677
677
  splitview: ["onRevealChanged", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
678
678
  headerbar: ["onBack", "onForward", "onDragStarted", "onDragEnded", "onDragOver", "onDropped"],
@@ -909,6 +909,10 @@ class Batch {
909
909
  return this.ops.length;
910
910
  }
911
911
  }
912
+ var removalListeners = new Set;
913
+ function onNodeRemoved(listener) {
914
+ removalListeners.add(listener);
915
+ }
912
916
 
913
917
  class NodeRegistry {
914
918
  byId = new Map;
@@ -919,7 +923,10 @@ class NodeRegistry {
919
923
  return this.byId.get(id);
920
924
  }
921
925
  unregister(id) {
922
- this.byId.delete(id);
926
+ if (!this.byId.delete(id))
927
+ return;
928
+ for (const listener of removalListeners)
929
+ listener(id);
923
930
  }
924
931
  }
925
932
 
@@ -1400,7 +1407,9 @@ var hostConfig = {
1400
1407
  hideTextInstance() {},
1401
1408
  unhideTextInstance() {},
1402
1409
  getPublicInstance: (i) => i,
1403
- detachDeletedInstance() {},
1410
+ detachDeletedInstance(inst) {
1411
+ registry.unregister(inst.id);
1412
+ },
1404
1413
  maySuspendCommit: () => false,
1405
1414
  preloadInstance: () => true,
1406
1415
  startSuspendingCommit() {},
@@ -1445,6 +1454,13 @@ function dispatchSystemEvent(channel, data) {
1445
1454
  globalThis.__nd_app_active = true;
1446
1455
  else if (channel === "app.deactivate")
1447
1456
  globalThis.__nd_app_active = false;
1457
+ else if (channel === "webview.engine") {
1458
+ const d = data;
1459
+ globalThis.__nd_webview_engine = {
1460
+ engine: d?.engine === "chromium" ? "chromium" : "system",
1461
+ style: d?.style === "chrome" || d?.style === "alloy" ? d.style : null
1462
+ };
1463
+ }
1448
1464
  for (const handler of registry2().get(channel) ?? [])
1449
1465
  handler(data);
1450
1466
  if (channel === "notification.click") {
@@ -1553,6 +1569,12 @@ var system = {
1553
1569
  }
1554
1570
  };
1555
1571
  var webviewEngine = {
1572
+ active() {
1573
+ return globalThis.__nd_webview_engine?.engine ?? "system";
1574
+ },
1575
+ cefStyle() {
1576
+ return globalThis.__nd_webview_engine?.style ?? null;
1577
+ },
1556
1578
  async registerScheme(scheme, options = {}) {
1557
1579
  await call("webviewEngine.registerScheme", {
1558
1580
  scheme,
@@ -1951,13 +1973,56 @@ var seq2 = 0;
1951
1973
  function nextId(prefix) {
1952
1974
  return `${prefix}${++seq2}`;
1953
1975
  }
1954
- function executeJavaScript(node, code, world) {
1955
- const id = nextId("js");
1976
+ var inFlight = new Map;
1977
+ onNodeRemoved((nodeId) => {
1978
+ const calls = inFlight.get(nodeId);
1979
+ if (!calls)
1980
+ return;
1981
+ inFlight.delete(nodeId);
1982
+ for (const [id, reject2] of calls)
1983
+ reject2(new Error(`the <webview> was removed before request ${id} was answered`));
1984
+ });
1985
+ function request(node, pending, prefix, command, args) {
1986
+ const id = nextId(prefix);
1956
1987
  return new Promise((resolve2, reject2) => {
1957
- pendingEvals.set(id, { resolve: resolve2, reject: reject2 });
1958
- sendCommand(node, "executeJavaScript", world ? { id, code, world } : { id, code });
1988
+ if (!registry.get(node.id)) {
1989
+ reject2(new Error(`${command}: the <webview> is no longer mounted`));
1990
+ return;
1991
+ }
1992
+ let calls = inFlight.get(node.id);
1993
+ if (!calls)
1994
+ inFlight.set(node.id, calls = new Map);
1995
+ const forget = () => {
1996
+ pending.delete(id);
1997
+ calls.delete(id);
1998
+ if (calls.size === 0 && inFlight.get(node.id) === calls)
1999
+ inFlight.delete(node.id);
2000
+ };
2001
+ pending.set(id, {
2002
+ resolve: (value) => {
2003
+ forget();
2004
+ resolve2(value);
2005
+ },
2006
+ reject: (reason) => {
2007
+ forget();
2008
+ reject2(reason);
2009
+ }
2010
+ });
2011
+ calls.set(id, (reason) => {
2012
+ forget();
2013
+ reject2(reason);
2014
+ });
2015
+ try {
2016
+ sendCommand(node, command, { id, ...args });
2017
+ } catch (error) {
2018
+ forget();
2019
+ reject2(error);
2020
+ }
1959
2021
  });
1960
2022
  }
2023
+ function executeJavaScript(node, code, world) {
2024
+ return request(node, pendingEvals, "js", "executeJavaScript", world ? { code, world } : { code });
2025
+ }
1961
2026
  function onJavaScriptResult(e) {
1962
2027
  const result = e.data;
1963
2028
  const call2 = pendingEvals.get(result.id);
@@ -1970,11 +2035,7 @@ function onJavaScriptResult(e) {
1970
2035
  call2.reject(new Error(result.error ?? "executeJavaScript failed"));
1971
2036
  }
1972
2037
  function getCookies(node, url) {
1973
- const id = nextId("ck");
1974
- return new Promise((resolve2, reject2) => {
1975
- pendingCookies.set(id, { resolve: resolve2, reject: reject2 });
1976
- sendCommand(node, "getCookies", url ? { id, url } : { id });
1977
- });
2038
+ return request(node, pendingCookies, "ck", "getCookies", url ? { url } : {});
1978
2039
  }
1979
2040
  function onCookiesResult(e) {
1980
2041
  const result = e.data;
@@ -1988,11 +2049,7 @@ function onCookiesResult(e) {
1988
2049
  call2.reject(new Error(result.error ?? "getCookies failed"));
1989
2050
  }
1990
2051
  function saveSession(node) {
1991
- const id = nextId("ss");
1992
- return new Promise((resolve2, reject2) => {
1993
- pendingSessions.set(id, { resolve: resolve2, reject: reject2 });
1994
- sendCommand(node, "saveSession", { id });
1995
- });
2052
+ return request(node, pendingSessions, "ss", "saveSession", {});
1996
2053
  }
1997
2054
  function onSessionSaved(e) {
1998
2055
  const result = e.data;
@@ -2003,11 +2060,7 @@ function onSessionSaved(e) {
2003
2060
  call2.resolve(result.state ?? "");
2004
2061
  }
2005
2062
  function listExtensions(node) {
2006
- const id = nextId("ext");
2007
- return new Promise((resolve2, reject2) => {
2008
- pendingExtensions.set(id, { resolve: resolve2, reject: reject2 });
2009
- sendCommand(node, "listExtensions", { id });
2010
- });
2063
+ return request(node, pendingExtensions, "ext", "listExtensions", {});
2011
2064
  }
2012
2065
  function onExtensionsList(e) {
2013
2066
  const result = e.data;
@@ -2030,20 +2083,12 @@ function setExtensionEnabled(node, extensionId, enabled) {
2030
2083
  return extensionMutation(node, "setExtensionEnabled", { extensionId, enabled });
2031
2084
  }
2032
2085
  function extensionMutation(node, command, args) {
2033
- const id = nextId("ext");
2034
- return new Promise((resolve2, reject2) => {
2035
- pendingExtensions.set(id, { resolve: resolve2, reject: reject2 });
2036
- sendCommand(node, command, { id, ...args });
2037
- });
2086
+ return request(node, pendingExtensions, "ext", command, args);
2038
2087
  }
2039
2088
  var extensionsWatchers = [];
2040
2089
  function watchExtensions(node, listener) {
2041
- const id = nextId("ext");
2042
- return new Promise((resolve2, reject2) => {
2043
- pendingWatches.set(id, { resolve: resolve2, reject: reject2 });
2044
- extensionsWatchers.push(listener);
2045
- sendCommand(node, "watchExtensions", { id });
2046
- });
2090
+ extensionsWatchers.push(listener);
2091
+ return request(node, pendingWatches, "ext", "watchExtensions", {});
2047
2092
  }
2048
2093
  function onExtensionsChanged(e) {
2049
2094
  const result = e.data;
@@ -2062,18 +2107,10 @@ function onExtensionsChanged(e) {
2062
2107
  listener({ reason: result.reason ?? "" });
2063
2108
  }
2064
2109
  function readExtensionAction(node) {
2065
- const id = nextId("ext");
2066
- return new Promise((resolve2, reject2) => {
2067
- pendingActionState.set(id, { resolve: resolve2, reject: reject2 });
2068
- sendCommand(node, "readExtensionAction", { id });
2069
- });
2110
+ return request(node, pendingActionState, "ext", "readExtensionAction", {});
2070
2111
  }
2071
2112
  function listExtensionActions(node) {
2072
- const id = nextId("ext");
2073
- return new Promise((resolve2, reject2) => {
2074
- pendingActions.set(id, { resolve: resolve2, reject: reject2 });
2075
- sendCommand(node, "listExtensionActions", { id });
2076
- });
2113
+ return request(node, pendingActions, "ext", "listExtensionActions", {});
2077
2114
  }
2078
2115
  function onExtensionActions(e) {
2079
2116
  const result = e.data;
@@ -952,6 +952,9 @@ export declare namespace JSX {
952
952
  onLoadingChanged?: (e: {
953
953
  checked: boolean;
954
954
  }) => void;
955
+ onFocusChanged?: (e: {
956
+ checked: boolean;
957
+ }) => void;
955
958
  onBackAvailable?: (e: {
956
959
  checked: boolean;
957
960
  }) => void;
@@ -55,7 +55,7 @@ export declare const hostConfig: {
55
55
  hideTextInstance(): void;
56
56
  unhideTextInstance(): void;
57
57
  getPublicInstance: (i: Instance) => Instance;
58
- detachDeletedInstance(): void;
58
+ detachDeletedInstance(inst: Instance): void;
59
59
  maySuspendCommit: () => boolean;
60
60
  preloadInstance: () => boolean;
61
61
  startSuspendingCommit(): void;
@@ -12,6 +12,7 @@ export interface NodeRecord {
12
12
  props: Record<string, unknown>;
13
13
  handlers: Record<string, Handler>;
14
14
  }
15
+ export declare function onNodeRemoved(listener: (id: number) => void): void;
15
16
  export declare class NodeRegistry {
16
17
  private byId;
17
18
  register(rec: NodeRecord): void;
@@ -3,6 +3,10 @@ declare global {
3
3
  var __nd_system_events: Map<string, Set<SystemEventHandler>> | undefined;
4
4
  var __nd_notification_data: Map<string, unknown> | undefined;
5
5
  var __nd_app_active: boolean | undefined;
6
+ var __nd_webview_engine: {
7
+ engine: WebviewEngineName;
8
+ style: CefStyle;
9
+ } | undefined;
6
10
  }
7
11
  /** Wired up by renderer.ts from `ndp.onSystemEvent()` — not part of the public API. */
8
12
  export declare function dispatchSystemEvent(channel: string, data: unknown): void;
@@ -141,8 +145,29 @@ export interface RegisterSchemeOptions {
141
145
  */
142
146
  secure?: boolean;
143
147
  }
148
+ /** Which web engine the host actually started. */
149
+ export type WebviewEngineName = "chromium" | "system";
150
+ /** CEF's browser style, or null when the host is not running CEF at all. */
151
+ export type CefStyle = "chrome" | "alloy" | null;
144
152
  /** Engine-level `<webview>` configuration. `core:webview` is default-granted. */
145
153
  export declare const webviewEngine: {
154
+ /**
155
+ * Which engine this host actually started, synchronously. Asking for
156
+ * `chromium` is not the same as getting it: a host with no usable CEF
157
+ * distribution falls back to the system engine, and before this the only
158
+ * way to tell was to read `navigator.userAgent` out of a live view.
159
+ *
160
+ * Backed by the host's `webview.engine` stream, replayed right after the
161
+ * handshake like `app.isActive()`, so it is correct from the first render.
162
+ * "system" against a host that predates the stream.
163
+ */
164
+ active(): WebviewEngineName;
165
+ /**
166
+ * CEF's browser style: "chrome" (Chromium's own browser runtime, which is
167
+ * what runs the extension system) or "alloy". Null whenever `active()` is
168
+ * not "chromium".
169
+ */
170
+ cefStyle(): CefStyle;
146
171
  /**
147
172
  * Registers a custom URI scheme (`crx`, `app`, …) with the web engine.
148
173
  * Requests for it arrive as the `schemeRequest` event on the `<webview>`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nativedesktop/react",
3
- "version": "0.4.40",
3
+ "version": "0.4.41",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/FormalSnake/NativeDesktop#readme",