tauri-apps / tauri

Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
https://tauri.app
Apache License 2.0
83.95k stars 2.52k forks source link

[WIP] Electron Feature Parity #544

Closed BenoitRanque closed 2 years ago

BenoitRanque commented 4 years ago

This issue will be used for tracking feature parity with electron. The first step is establishing a list of electron features, and determining which of those we wish to eventually implement in tauri

The feature list will be sourced from the electron website

Auto updates Crash Reporting Debugging and Profiling Windows Intaller Session, Local Storage, Cookies Define keyboard shortcuts. Make HTTP/HTTPS requests. Perform copy and paste operations on the system clipboard. Manipulate the command line arguments for your app that Chromium reads Collect tracing data from Chromium to find performance bottlenecks and slow operations. Create a safe, bi-directional, synchronous bridge across isolated contexts Access information about media sources that can be used to capture audio and video from the desktop using the navigator.mediaDevices.getUserMedia API. Display native system dialogs for opening and saving files, alerting, etc. Control your app in the macOS dock Control file downloads from remote sources. Control application configuration and behavior without changing code. Use the HTML5 File API to work natively with files on the filesystem. Open a window without toolbars, borders, or other graphical "chrome". Detect keyboard events when the application does not have keyboard focus. In-app purchases on Mac App Store. Handle responses to HTTP/HTTPS requests. Locale values returned by app.getLocale(). Create native notifications, application menus and context menus. Add items to native application menus and context menus. Create tray, dock, and application icons using PNG or JPG files. Read and respond to changes in Chromium's native color theme. Issue HTTP/HTTPS requests using Chromium's native networking library Logging network events for a session. Create OS desktop notifications Monitor power state changes. Block the system from entering low-power (sleep) mode. Extensions to process object. Register a custom protocol and intercept existing protocol requests. Register a custom protocol and intercept existing protocol requests. Create a browser window with a sandboxed renderer. With this option enabled, the renderer must communicate via IPC to the main process in order to access node APIs. Retrieve information about screen size, displays, cursor position, etc. Manage browser sessions, cookies, cache, proxy settings, etc. Manage files and URLs using their default applications. Get system preferences. Create TouchBar layouts for native macOS applications Create a button in the touch bar for native macOS applications Create a color picker in the touch bar for native macOS applications Create a group in the touch bar for native macOS applications Create a label in the touch bar for native macOS applications Create a popover in the touch bar for native macOS applications Create a scrubber (a scrollable selector) Create a segmented control (a button group) where one button has a selected state Create a slider in the touch bar for native macOS applications Create a spacer between two items in the touch bar for native macOS applications Add icons and context menus to the system's notification area. Render and control web pages. Customize the rendering of the current web page. Intercept and modify the contents of a request at various stages of its lifetime. Display external web content in an isolated frame and process. Open a new window and load a URL. Print to Printer and related options

nklayman commented 4 years ago

I think we should split these up into a few groups to make it more clear which features we are implementing, which ones we have no plans to implement, and which ones are somewhere in between. A suggestion for the groups to use are: must have for beta/v1, high priority post-v1, low priority post-v1, no plan to implement, and will not implement.

BenoitRanque commented 4 years ago

I like your idea for the ranking, but I don't feel confident making the call on what is needed and what is not. Here is my own ranking, obviously this is subjective and will change.

Primary

Secondary

Tertiary

MacOS Specific

EDIT (by @nklayman): Added checkboxes

khionu commented 4 years ago

I like this sorting. There's a few things I think should be switched around, but this is a great start. Thank you very much!

nothingismagick commented 4 years ago

@nklayman - are you tracking this? would be good to group them into things we can get in before beta / etc. in line with your comment above

nklayman commented 4 years ago

I'm not sure that I'm the right person to do the grouping as I have so little knowledge of the core rust part. This might be a good thing to put on the tech talk schedule.

lucasfernog commented 4 years ago

Global shortcut coming up #644

ljfreelancer88 commented 3 years ago

I really need this feature too https://www.electronjs.org/docs/api/screen in Tauri. I'm trying to create an app like minimal "MS Power Point" for our Churches. The output will sending out to HDMI.

ohmree commented 3 years ago

I like your idea for the ranking, but I don't feel confident making the call on what is needed and what is not. Here is my own ranking, obviously this is subjective and will change.

Primary

* [x]  [Auto updates](https://www.electronjs.org/docs/api/auto-updater)

* [ ]  [Crash Reporting](https://www.electronjs.org/docs/api/crash-reporter)

* [ ]  [Debugging and Profiling](https://www.electronjs.org/docs/api/content-tracing)

* [x]  [Windows Intaller](https://www.electronjs.org/docs/api/auto-updater#windows)

* [ ]  [Session, Local Storage, Cookies](https://www.electronjs.org/docs/api/session)

* [x]  [Make HTTP/HTTPS requests.](https://www.electronjs.org/docs/api/client-request)

* [ ]  [Handle responses to HTTP/HTTPS requests.](https://www.electronjs.org/docs/api/incoming-message)

* [ ]  [Create a safe, bi-directional, synchronous bridge across isolated contexts](https://www.electronjs.org/docs/api/context-bridge)

* [ ]  [Manage browser sessions, cookies, cache, proxy settings, etc.](https://www.electronjs.org/docs/api/session)

* [x]  [Create native application menus and context menus.](https://www.electronjs.org/docs/api/menu)

Secondary

* [x]  [Define keyboard shortcuts.](https://www.electronjs.org/docs/api/accelerator)

* [ ]  [Perform copy and paste operations on the system clipboard.](https://www.electronjs.org/docs/api/clipboard)

* [ ]  [Collect tracing data from Chromium to find performance bottlenecks and slow operations.](https://www.electronjs.org/docs/api/content-tracing)

* [ ]  [Access information about media sources that can be used to capture audio and video from the desktop using the navigator.mediaDevices.getUserMedia API.](https://www.electronjs.org/docs/api/desktop-capturer)

* [x]  [Display native system dialogs for opening and saving files, alerting, etc.](https://www.electronjs.org/docs/api/dialog)

* [ ]  [Control file downloads from remote sources.](https://www.electronjs.org/docs/api/download-item)

* [ ]  [Use the HTML5 File API to work natively with files on the filesystem.](https://www.electronjs.org/docs/api/file-object)

* [ ]  [Add icons and context menus to the system's notification area.](https://www.electronjs.org/docs/api/tray)

* [x]  [Create OS desktop notifications](https://www.electronjs.org/docs/api/notification)

* [ ]  [Get system preferences.](https://www.electronjs.org/docs/api/system-preferences)

* [x]  [Manage files and URLs using their default applications.](https://www.electronjs.org/docs/api/shell)

* [ ]  [Render and control web pages.](https://www.electronjs.org/docs/api/web-contents)

* [x]  [Print to Printer and related options](https://www.electronjs.org/docs/api/web-contents#contentsgetprinters)

Tertiary

* [x]  [Open a window without toolbars, borders, or other graphical "chrome".](https://www.electronjs.org/docs/api/frameless-window)

* [x]  [Create tray, dock, and application icons using PNG or JPG files.](https://www.electronjs.org/docs/api/native-image)

* [ ]  [Control application configuration and behavior without changing code.](https://www.electronjs.org/docs/api/environment-variables)

* [ ]  [Detect keyboard events when the application does not have keyboard focus.](https://www.electronjs.org/docs/api/global-shortcut)

* [ ]  [Locale values returned by app.getLocale().](https://www.electronjs.org/docs/api/locales)

* [ ]  [Logging network events for a session.](https://www.electronjs.org/docs/api/net-log)

* [ ]  [Monitor power state changes.](https://www.electronjs.org/docs/api/power-monitor)

* [ ]  [Block the system from entering low-power (sleep) mode.](https://www.electronjs.org/docs/api/power-save-blocker)

* [ ]  [Register a custom protocol and intercept existing protocol requests.](https://www.electronjs.org/docs/api/protocol)

* [ ]  [Retrieve information about screen size, displays, cursor position, etc.](https://www.electronjs.org/docs/api/screen)

* [ ]  [Customize the rendering of the current web page.](https://www.electronjs.org/docs/api/web-frame)

* [ ]  [Display external web content in an isolated frame and process.](https://www.electronjs.org/docs/api/webview-tag)

* [x]  [Open a new window and load a URL.](https://www.electronjs.org/docs/api/window-open)

MacOS Specific

* [ ]  [In-app purchases on Mac App Store.](https://www.electronjs.org/docs/api/in-app-purchase)

* [ ]  [Control your app in the macOS dock](https://www.electronjs.org/docs/api/dock)

* [ ]  [Create TouchBar layouts for native macOS applications](https://www.electronjs.org/docs/api/touch-bar)

* [ ]  [Create a button in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-button)

* [ ]  [Create a color picker in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-color-picker)

* [ ]  [Create a group in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-group)

* [ ]  [Create a label in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-label)

* [ ]  [Create a popover in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-popover)

* [ ]  [Create a scrubber (a scrollable selector)](https://www.electronjs.org/docs/api/touch-bar-scrubber)

* [ ]  [Create a segmented control (a button group) where one button has a selected state](https://www.electronjs.org/docs/api/touch-bar-segmented-control)

* [ ]  [Create a slider in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-slider)

* [ ]  [Create a spacer between two items in the touch bar for native macOS applications](https://www.electronjs.org/docs/api/touch-bar-spacer)

* [ ]  [Intercept and modify the contents of a request at various stages of its lifetime.](https://www.electronjs.org/docs/api/web-request)

Why is "intercept and modify the contents of a request at various stages of its lifetime" macOS-specific? I'd like to implement an approach similar to the one taken in twurple's auth-electron, where the request to the oauth redirect uri is intercepted and the url query params are accessed and processed, and it seems like the only way to do it would be with an api similar to WebRequest.

dannymcgee commented 2 years ago

Open a window without toolbars, borders, or other graphical "chrome".

I think this Electron feature has not been fully understood wrt the Tauri implementation, unless you've deliberately chosen to implement it differently/with less granularity. In Electron, if you create a window with frame: false, transparent: false, you get a window that still has all of the native window chrome, with only the titlebar removed. Setting frame: false, transparent: true removes the rest of the chrome (border, shadow, etc.). The first option is generally what you would want to do if you just need to implement a custom titlebar, but it doesn't seem to be possible in Tauri currently, as decorations: false removes all of the native window chrome.

MS Teams in Windows 11 uses a custom titlebar with the rest of the native window chrome preserved, so I assume WebView2 exposes this as an option somehow, but I could be wrong:

ms-teams-webview2

(Let me know if this is the wrong place to bring this up — I searched "border" and this seemed to be the most relevant existing issue)

amrbashir commented 2 years ago

@dannymcgee for shadows, take a look at https://github.com/tauri-apps/tao/issues/157#issuecomment-892088091

FabianLars commented 2 years ago

@dannymcgee about ms teams, afaik they still use the same approach for the titlebar as in their electron based client (html based). This of course doesn't really matter in the context of the request, but anyway

amrbashir commented 2 years ago

I think this issue is not needed anymore. We are still missing some features but those are better be tracked in their own issues.