Files
Password-Manager/delphi-backend/UMainForm.fmx
T
Zaki f047fba9a3 feat: tray quick-search + privacy hardening + race fixes
Quick search from tray
- New "Quick search…" entry in the tray context menu (between Open
  and Lock vault).
- Compact modal with live-filtered top-8 entries, arrow keys / Enter
  to copy the password (Shift+Enter copies the username instead),
  Esc to dismiss. Each row shows the favicon when cached.
- Locked vault → focus the master password input instead of opening
  the modal (same pattern as the locked-autofill-hotkey path).
- Window-state restore: Delphi remembers whether the window was
  hidden before the menu was opened and tells JS via the
  Bridge.openQuickSearch(wasHidden) arg. After the copy (or cancel)
  we hide back to the tray so the previously-foreground app comes
  back and Ctrl+V drops the password in.

Tray notifications toggle
- New Settings → Security "Show tray notifications" toggle. Gates
  Shell_NotifyIcon NIF_INFO balloons (currently only the "still
  running in the tray" first-time popup). Default ON, synced via
  settings_json so it follows the user across devices.
- PM.Bridge.ShowNotifications exposed as a public property; JS
  pushes the value on every settings sync.

Privacy: WebView2 phone-home killed
- WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS set in the unit
  initialization section (before the TMS WebBrowser instantiates
  its CoreWebView2Environment). Disables: background networking,
  sync, component updates, breakpad/crashpad, domain reliability,
  client-side phishing detection, experiments, UMA upload,
  MediaRouter, OptimizationHints, SafeBrowsing enhanced, autofill
  server, privacy sandbox APIs. Verified via Resource Monitor: only
  127.0.0.1 connections remain (plus DDG when favicons are on).

Fixes
- Blank-window-on-launch race: the 1.5 s navigation timer assumes
  WebView2 finishes init in time, but on slow machines Edge
  Chromium needs 2-3 s and the Navigate() call is silently
  dropped. WebBrowserInitialized now also navigates if a URL is
  still pending — first to run wins.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 19:35:37 +01:00

135 lines
3.9 KiB
Plaintext

object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'Password Manager'
ClientHeight = 720
ClientWidth = 1100
WindowState = wsMaximized
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
OnCloseQuery = FormCloseQuery
OnDestroy = FormDestroy
DesignerMasterStyle = 0
object PanelTop: TPanel
Align = Top
Size.Width = 1100.000000000000000000
Size.Height = 56.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object lblPort: TLabel
Position.X = 16.000000000000000000
Position.Y = 18.000000000000000000
Size.Width = 40.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Trimming = None
Text = 'Port:'
TabOrder = 0
end
object edtPort: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
TabOrder = 1
Text = '8765'
Position.X = 56.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
end
object btnStart: TButton
Position.X = 152.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
Text = 'Start'
TextSettings.Trimming = None
OnClick = btnStartClick
end
object btnStop: TButton
Position.X = 240.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
Text = 'Stop'
TextSettings.Trimming = None
OnClick = btnStopClick
end
object btnReload: TButton
Position.X = 328.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TabOrder = 4
Text = 'Reload'
TextSettings.Trimming = None
OnClick = btnReloadClick
end
object btnToggleLog: TButton
Position.X = 416.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 90.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TabOrder = 5
Text = 'Hide log'
TextSettings.Trimming = None
OnClick = btnToggleLogClick
end
object lblStatus: TLabel
Position.X = 520.000000000000000000
Position.Y = 18.000000000000000000
Size.Width = 560.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Trimming = None
Text = 'Stopped'
TabOrder = 6
end
end
object PanelLog: TPanel
Align = Bottom
Position.Y = 564.000000000000000000
Size.Width = 1100.000000000000000000
Size.Height = 156.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object Memo: TMemo
Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
DataDetectorTypes = []
ReadOnly = True
TextSettings.Font.Family = 'Consolas'
Align = Client
Size.Width = 1100.000000000000000000
Size.Height = 156.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Viewport.Width = 1096.000000000000000000
Viewport.Height = 152.000000000000000000
end
end
object Splitter: TSplitter
Align = Bottom
Cursor = crVSplit
MinSize = 20.000000000000000000
Position.Y = 558.000000000000000000
Size.Width = 1100.000000000000000000
Size.Height = 6.000000000000000000
Size.PlatformDefault = False
end
object WebBrowser: TTMSFNCWebBrowser
Align = Client
Size.Width = 1100.000000000000000000
Size.Height = 502.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
DesigntimeEnabled = False
end
end