From adcdb5b4f10ed13a186f05efbb1b10a7e7f2a090 Mon Sep 17 00:00:00 2001 From: luoweiyu Date: Mon, 24 Aug 2026 11:38:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(browser):=20=E6=94=AF=E6=8C=81=20Helium=20?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E7=9A=84=E7=BD=91=E7=AB=99=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景:Helium(net.imput.helium,ungoogled-chromium 内核)不在浏览器 bundle id 白名单中,被当作普通应用处理,无法使用按网站切换输入法的 浏览器规则。 动机:helium 的 AX 结构与 Chromium 完全一致,AXWebArea URL 获取与 OmniboxViewViews 地址栏焦点检测可直接复用,只需补充白名单条目。 关键决策: - Browser 枚举新增 Helium,displayName 返回 "Helium" - 地址栏焦点检测归入 Chromium 系分支(OmniboxViewViews) - 同步补齐 UserDefaults key、设置备份/恢复、UI 开关 - 浏览器列表 UI 基于 Browser.allCases 渲染,无需额外改动 影响范围:仅新增浏览器支持,不改动既有浏览器行为。 验证方式:本地编译通过后,在浏览器规则设置中启用 Helium, 验证按域名/正则切换输入法生效。 --- Input Source Pro/Models/PreferencesVM+BrowserAddress.swift | 6 ++++-- Input Source Pro/Models/PreferencesVM+BrowserRule.swift | 2 ++ Input Source Pro/Models/PreferencesVM.swift | 6 ++++++ Input Source Pro/Persistence/SettingsBackup.swift | 3 +++ Input Source Pro/UI/Screens/BrowserRulesSettingsView.swift | 2 ++ Input Source Pro/Utilities/BrowserURL.swift | 3 +++ 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Input Source Pro/Models/PreferencesVM+BrowserAddress.swift b/Input Source Pro/Models/PreferencesVM+BrowserAddress.swift index d59487e..2960fae 100644 --- a/Input Source Pro/Models/PreferencesVM+BrowserAddress.swift +++ b/Input Source Pro/Models/PreferencesVM+BrowserAddress.swift @@ -98,7 +98,7 @@ enum BrowserThatCanWatchBrowserAddressFocus: CaseIterable { return nil } - case Safari, SafariTechnologyPreview, Chrome, Chromium, Brave, BraveBeta, BraveNightly, Edge, Vivaldi, Arc, Opera, Firefox, FirefoxNightly, FirefoxDeveloperEdition, Zen, Dia + case Safari, SafariTechnologyPreview, Chrome, Chromium, Brave, BraveBeta, BraveNightly, Edge, Vivaldi, Arc, Opera, Firefox, FirefoxNightly, FirefoxDeveloperEdition, Zen, Dia, Helium var bundleIdentifier: String { return browser.rawValue @@ -138,6 +138,8 @@ enum BrowserThatCanWatchBrowserAddressFocus: CaseIterable { return .Zen case .Dia: return .Dia + case .Helium: + return .Helium } } @@ -159,7 +161,7 @@ enum BrowserThatCanWatchBrowserAddressFocus: CaseIterable { case .Opera: return focusedElement.domClassList().contains("AddressTextfieldView") - case .Chromium, .Chrome, .Brave, .BraveBeta, .BraveNightly, .Edge, .Dia: + case .Chromium, .Chrome, .Brave, .BraveBeta, .BraveNightly, .Edge, .Dia, .Helium: if focusedElement.domClassList().contains("OmniboxViewViews") { if let description = focusedElement.safeString(attribute: .description), chromiumSearchBarDescMap[description] == true diff --git a/Input Source Pro/Models/PreferencesVM+BrowserRule.swift b/Input Source Pro/Models/PreferencesVM+BrowserRule.swift index 51d3113..a289058 100644 --- a/Input Source Pro/Models/PreferencesVM+BrowserRule.swift +++ b/Input Source Pro/Models/PreferencesVM+BrowserRule.swift @@ -129,6 +129,8 @@ extension PreferencesVM { return preferences.isEnableURLSwitchForZen case .Dia: return preferences.isEnableURLSwitchForDia + case .Helium: + return preferences.isEnableURLSwitchForHelium } } diff --git a/Input Source Pro/Models/PreferencesVM.swift b/Input Source Pro/Models/PreferencesVM.swift index e9dc183..b94c273 100644 --- a/Input Source Pro/Models/PreferencesVM.swift +++ b/Input Source Pro/Models/PreferencesVM.swift @@ -232,6 +232,8 @@ extension PreferencesVM { guard preferences.isEnableURLSwitchForZen else { return nil } case .Dia: guard preferences.isEnableURLSwitchForDia else { return nil } + case .Helium: + guard preferences.isEnableURLSwitchForHelium else { return nil } } if let application = application, @@ -302,6 +304,7 @@ struct Preferences { static let isEnableURLSwitchForFirefoxNightly = "isEnableURLSwitchForFirefoxNightly" static let isEnableURLSwitchForZen = "isEnableURLSwitchForZen" static let isEnableURLSwitchForDia = "isEnableURLSwitchForDia" + static let isEnableURLSwitchForHelium = "isEnableURLSwitchForHelium" static let shortcutTriggerMode = "shortcutTriggerMode" static let singleModifierTrigger = "singleModifierTrigger" @@ -493,6 +496,9 @@ struct Preferences { @UserDefault(Preferences.Key.isEnableURLSwitchForDia) var isEnableURLSwitchForDia = false + @UserDefault(Preferences.Key.isEnableURLSwitchForHelium) + var isEnableURLSwitchForHelium = false + // MARK: - Appearance @available(*, deprecated, message: "Use indicatorInfo instead") diff --git a/Input Source Pro/Persistence/SettingsBackup.swift b/Input Source Pro/Persistence/SettingsBackup.swift index f7f9867..3aaf35c 100644 --- a/Input Source Pro/Persistence/SettingsBackup.swift +++ b/Input Source Pro/Persistence/SettingsBackup.swift @@ -136,6 +136,7 @@ struct SettingsBackupPreferences: Codable { var isEnableURLSwitchForFirefoxNightly: Bool? var isEnableURLSwitchForZen: Bool? var isEnableURLSwitchForDia: Bool? + var isEnableURLSwitchForHelium: Bool? var indicatorInfo: IndicatorInfo? var indicatorSize: IndicatorSize? var isAutoAppearanceMode: Bool? @@ -193,6 +194,7 @@ struct SettingsBackupPreferences: Codable { isEnableURLSwitchForFirefoxNightly = preferences.isEnableURLSwitchForFirefoxNightly isEnableURLSwitchForZen = preferences.isEnableURLSwitchForZen isEnableURLSwitchForDia = preferences.isEnableURLSwitchForDia + isEnableURLSwitchForHelium = preferences.isEnableURLSwitchForHelium indicatorInfo = preferences.indicatorInfo indicatorSize = preferences.indicatorSize isAutoAppearanceMode = preferences.isAutoAppearanceMode @@ -279,6 +281,7 @@ struct SettingsBackupPreferences: Codable { } if let isEnableURLSwitchForZen { preferences.isEnableURLSwitchForZen = isEnableURLSwitchForZen } if let isEnableURLSwitchForDia { preferences.isEnableURLSwitchForDia = isEnableURLSwitchForDia } + if let isEnableURLSwitchForHelium { preferences.isEnableURLSwitchForHelium = isEnableURLSwitchForHelium } if let indicatorInfo { preferences.indicatorInfo = indicatorInfo } if let indicatorSize { preferences.indicatorSize = indicatorSize } if let isAutoAppearanceMode { preferences.isAutoAppearanceMode = isAutoAppearanceMode } diff --git a/Input Source Pro/UI/Screens/BrowserRulesSettingsView.swift b/Input Source Pro/UI/Screens/BrowserRulesSettingsView.swift index 9aec8c7..b3dab9c 100644 --- a/Input Source Pro/UI/Screens/BrowserRulesSettingsView.swift +++ b/Input Source Pro/UI/Screens/BrowserRulesSettingsView.swift @@ -183,6 +183,8 @@ struct BrowserRulesSettingsView: View { $0.isEnableURLSwitchForZen = isEnable case .Dia: $0.isEnableURLSwitchForDia = isEnable + case .Helium: + $0.isEnableURLSwitchForHelium = isEnable } } } diff --git a/Input Source Pro/Utilities/BrowserURL.swift b/Input Source Pro/Utilities/BrowserURL.swift index 71a3198..310b9ee 100644 --- a/Input Source Pro/Utilities/BrowserURL.swift +++ b/Input Source Pro/Utilities/BrowserURL.swift @@ -20,6 +20,7 @@ enum Browser: String, CaseIterable { case FirefoxNightly = "org.mozilla.nightly" case Zen = "app.zen-browser.zen" case Dia = "company.thebrowser.dia" + case Helium = "net.imput.helium" var displayName: String { switch self { @@ -57,6 +58,8 @@ enum Browser: String, CaseIterable { return "Zen" case .Dia: return "Dia" + case .Helium: + return "Helium" } } }