# io.Connect Desktop 9.0

Source: https://docs.interop.io/desktop/getting-started/changelog/platform/9-0/index.html

## io.Connect Desktop 9.0

*Release date: 17.10.2023*

| Components | Version |
|------------|---------|
| Electron | [26.2.4](https://releases.electronjs.org/release/v26.2.4) |
| Chromium | 116.0.5845.190 |
| Node.js | 18.16.1 |

The following libraries are bundled with **io.Connect Desktop** 9.0 and will be used for [auto injection](https://docs.interop.io/desktop/getting-started/how-to/interop-enable-your-apps/javascript/index.md#auto_injection):

| Injected Library | Version |
|------------------|---------|
| [`@interopio/desktop`](https://www.npmjs.com/package/@interopio/desktop) | [6.0](https://docs.interop.io/desktop/getting-started/changelog/libraries/interopio-desktop/index.md#60-600) |
| [`@interopio/fdc3`](https://www.npmjs.com/package/@interopio/fdc3) | 2.0 |

> ⚠️ *Note that this is the first release of the unified platform rebranded as **io.Connect Desktop** after the merger of Glue42 and Finsemble. For all previous changelog entries of the former Glue42 and Finsemble platforms, see the [Glue42 Changelog](https://docs.glue42.com/getting-started/changelog/) and [Finsemble Changelog](https://documentation.finsemble.com/docs/reference/changelog/) sections in the respective documentation sites. For details on how to migrate to the new platform, see the [How to... > Migrate to io.Connect Desktop](https://docs.interop.io/desktop/getting-started/how-to/migrate-to-io-connect/index.md) section.*

## New Features

> ### New Design
>
> The rebranded **io.Connect Desktop** comes with new contemporary UI designs and enhanced user experience. Brand new look and feel of the default dark and light themes - new designs for the tabs of [Workspaces](https://docs.interop.io/desktop/capabilities/windows/workspaces/overview/index.md) and io.Connect [window groups](https://docs.interop.io/desktop/capabilities/windows/window-management/overview/index.md#window_groups), enhanced [Channel Selector](https://docs.interop.io/desktop/capabilities/data-sharing/channels/overview/index.md), [notification badges](https://docs.interop.io/desktop/capabilities/notifications/overview/index.md#using_notifications-notification_badges) and more.
>
> - Workspaces:
>
> ![Workspaces](https://docs.interop.io/desktop/images/workspaces/workspaces.mp4)
>
> - io.Connect Window groups:
>
> ![Window Groups](https://docs.interop.io/desktop/images/window-management/window-groups.mp4)
>
> - Channel Selector:
>
> ![Channel Selector](https://docs.interop.io/desktop/images/channels/channel-selector-single.png)
>
> - Notification badges for the **io.Connect Desktop** Windows taskbar icon and the system tray icon:
>
> ![Notification Badge](https://docs.interop.io/desktop/images/notifications/notification-badge.png)

> ### Boot Sequence
>
> The `"runPriority"` top-level key in the [app definition](https://docs.interop.io/desktop/developers/configuration/application/index.md) file enables you to control the order in which your system apps will start, allowing you flexibility in designing the [boot sequence](https://docs.interop.io/desktop/developers/configuration/application/index.md#boot_sequence) of the platform according to your specific needs and requirements.
>
> The `"runPriority"` property has been extended to accept an object with the following properties:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `"priority"` | `number` | Number determining the priority with which the system app will be started at the specified stage of the boot sequence of the platform. The greater the number, the greater the priority of the app. Set to `0` for lowest priority. |
> | `"stage"` | `"core"` \| `"pre-sso"` \| `"post-sso"` | Boot sequence stage at which to start the system app and set its priority. |
> | `"timeout"` | `number` | Interval in milliseconds to wait for the system app to initialize. |
> | `"waitForInitialization"` | `boolean` | If `true`, the platform will wait for the system app to initialize before continuing the boot sequence. Defaults to `false`. |
>
> The following example demonstrates how to set the boot sequence priority of an app that will be started with high priority in the `"pre-sso"` stage and the platform will wait for it to initialize before continuing the boot sequence:
>
> ```json
> {
>     "runPriority": {
>         "stage": "pre-sso",
>         "priority": 100,
>         "waitForInitialization": true
>     }
> }
> ```

> ### Filtering Web Requests
>
> To instruct **io.Connect Desktop** to [filter web requests](https://docs.interop.io/desktop/developers/configuration/system/index.md#window_settings-filtering_web_requests), use the `"urlFilter"` property of the `"windows"` top-level key in the `system.json` [system configuration](https://docs.interop.io/desktop/developers/configuration/system/index.md) file. Provide a regular expression as a value that will be matched against the URLs for all web requests. Matched URLs will be allowed, all other requests will be blocked and a dialog will be shown to the user informing them that the URL is blocked by the organization.
>
> The following example demonstrates how to allow only web requests for URLs that start with `https://`:
>
> ```json
> {
>     "windows": {
>         "urlFilter": "^https://"
>     }
> }
> ```

> ### Java API
>
> #### Preventing Window Close
>
> To [prevent an io.Connect Window from closing](https://docs.interop.io/desktop/capabilities/windows/window-management/java/index.md#events-close), use the `onClosing()` method of the window object. The event handler callback must return asynchronously a `PreventClosingOptions` object whose methods you can use to specify the behavior of a window that is about to be closed.
>
> The following example demonstrates how to prevent the window from closing and show a confirmation dialog to the user:
>
> ```java
> myWindow.onClosing(() → CompletableFuture.supplyAsync(PreventClosingOptions :: dialog));
> ```
>
> The `PreventClosingOptions` object has the following methods:
>
> | Method | Description |
> |--------|-------------|
> | `allow()` | Will allow the window to close. |
> | `dialog()` | Will prevent the window from closing and will show a confirmation dialog to the user. |
> | `prevent()` | Will prevent the window from closing. |
>
> #### Window Z-Order
>
> To [set a window on top of the z-order](https://docs.interop.io/desktop/capabilities/windows/window-management/java/index.md#window_operations-zorder), use the `onTopState()` method when supplying options for registering your window in the io.Connect framework:
>
> ```java
> Window myWindow = io.windows().register(handle, options -> options.onTopState(WindowOnTopState.YES));
> ```
>
> > ⚠️ *Note that using the `WindowOnTopState.YES` option will allow the io.Connect Window to be on top only until the window is visible and not joined to an io.Connect Window group. If the window is hidden programmatically or the user snaps it to another io.Connect Window or window group, it will no longer be on top of the z-order when it becomes visible or when the user tears it off from the group.*
>
> To instruct the window to remain permanently on top of the z-order, regardless of changes to its visibility or whether it joins or leaves an io.Connect Window group, use the `WindowOnTopState.ALWAYS` option:
>
> ```java
> Window myWindow = io.windows().register(handle, options -> options.onTopState(WindowOnTopState.ALWAYS));
> ```

> ### Handling the Browser window.open()
>
> The `"nativeWindowOpen"` property, used for [handling the browser `window.open()` method](https://docs.interop.io/desktop/capabilities/windows/window-management/javascript/index.md#opening_windows-handling_the_browser_windowopen), can now accept an object with the following properties as a value:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `"mode"` | `string` | Must be set to `"window"`. |
> | `"outlivesOpener"` | `boolean` | If `true`, will prevent child windows from being closed when their parent is closed. |
>
> By default, child windows created with the `window.open()` method from an io.Connect Window share the lifetime of their parent window. To prevent this behavior, set the `"outlivesOpener"` property to `true`:
>
> ```json
> {
>     "windows": {
>         "nativeWindowOpen": {
>             "mode": "window",
>             "outlivesOpener": true
>         }
>     }
> }
> ```

> ### Preload Scripts
>
> The `"preloadScripts"` property, used for defining [preload scripts](https://docs.interop.io/desktop/capabilities/more/features/index.md#preload_scripts), can now accept also an object with the following properties as a value:
>
> | Property | Type | Description |
> |----------|------|-------------|
> | `"scripts"` | `string[]` | List of preload scripts that will be loaded and executed before the actual page is executed. |
> | `"useBase64PreloadScripts"` | `boolean` | If `true` (default), will import the preload scripts as Base64 strings. |
>
> The `"useBase64PreloadScripts"` property allows you to control how **io.Connect Desktop** will import preload scripts. To improve this behavior, it's recommended to set the `"useBase64PreloadScripts"` property to `false`:
>
> ```json
> {
>     "windows": {
>         "preloadScripts": {
>             "scripts": [
>                 "https://my-domain.com/my-script.js",
>                 "https://my-domain.com/my-other-script.js"
>             ],
>             "useBase64PreloadScripts": false
>         }
>     }
> }
> ```

> ### Persisting Current Window Titles
>
> You can now [persist the current window title of a web app](https://docs.interop.io/desktop/developers/configuration/system/index.md#window_settings-persisting_data_in_layouts-web_apps) when saving and restoring [Layouts](https://docs.interop.io/desktop/capabilities/windows/layouts/overview/index.md) - App Default, Global Layouts, or Workspaces. To instruct **io.Connect Desktop** to save the current window titles of web apps, use the `"saveCurrentTitleInLayout"` property of the `"windows"` top-level key in the `system.json` [system configuration](https://docs.interop.io/desktop/developers/configuration/system/index.md) file. The following example demonstrates how to configure  **io.Connect Desktop** on system level to save the current window titles of web apps only when they participate in a Workspace or a Global Layout:
>
> ```json
> {
>     "windows": {
>         "saveCurrentTitleInLayout": ["Global", "Workspace"]
>     }
> }
> ```
>
> You can also specify this setting on an app level by using the `"saveCurrentTitleInLayout"` property of the `"details"` top-level key in the [app definition](https://docs.interop.io/desktop/developers/configuration/application/index.md#persisting_data_in_layouts-web_apps) file for web apps, which will override the global system configuration:
>
> ```json
> {
>     "details": {
>         "saveCurrentTitleInLayout": false
>     }
> }
> ```

## Improvements & Bug Fixes

> - Upgraded to Electron 26.2.4 (Chromium 116).
>
> - Improved the time of loading Global Layouts by optimizing jump lists.
>
> - Improved the loading behavior of preload scripts to guard against possible errors.
>
> - [Telemetry data](https://docs.interop.io/desktop/capabilities/more/features/index.md#telemetry_data) is now disabled by default.
