diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index ef3bbe3c57..c904f7ca04 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -78,6 +78,7 @@ zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-workspaces = { zen-panel-ui-workspaces-text } zen-site-data-settings = Settings zen-generic-manage = Manage diff --git a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch index 71d0e194c8..ca33cc2a82 100644 --- a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch @@ -1,12 +1,21 @@ diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs -index ec7b7eeee7999aba76286e84808ed09ffc6df463..12bfafdc7e34c5d6345579cd0aaf515a19d82b31 100644 +index ec7b7eeee7999aba76286e84808ed09ffc6df463..65154e4b78e391ceca19c629aa3309d9fc52966e 100644 --- a/browser/components/urlbar/UrlbarPrefs.sys.mjs +++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs -@@ -760,6 +760,7 @@ function makeDefaultResultGroups({ showSearchSuggestionsFirst }) { +@@ -454,6 +457,7 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([ + ["shortcuts.tabs", true], + ["shortcuts.history", true], + ["shortcuts.actions", true], ++ ["shortcuts.workspaces", true], + + // Boolean to determine if the providers defined in `exposureResults` + // should be displayed in search results. This can be set by a +@@ -791,6 +795,8 @@ function makeDefaultResultGroups({ showSearchSuggestionsFirst }) { */ let rootGroup = { children: [ + { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_ACTION }] }, ++ { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_WORKSPACE }] }, // heuristic { maxResultCount: 1, diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch index dd171221ae..b034df37f7 100644 --- a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs -index d9a0566c5ad2a9ae375a23769f856aecc6efd86c..f6e5004806d24e009f96de9482e24c88590939b1 100644 +index d9a0566c5ad2a9ae375a23769f856aecc6efd86c..3e4951f4efdf62acb06b38ad2ae4bd507ca5e71f 100644 --- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs +++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs @@ -912,6 +912,7 @@ export class Query { @@ -10,3 +10,26 @@ index d9a0566c5ad2a9ae375a23769f856aecc6efd86c..f6e5004806d24e009f96de9482e24c88 (!this.context.trimmedSearchString || (!this.context.searchMode.engineName && !result.autofill)) ) { +@@ -1042,6 +1043,7 @@ function updateSourcesIfEmpty(context) { + lazy.UrlbarTokenizer.TYPE.RESTRICT_TITLE, + lazy.UrlbarTokenizer.TYPE.RESTRICT_URL, + lazy.UrlbarTokenizer.TYPE.RESTRICT_ACTION, ++ lazy.UrlbarTokenizer.TYPE.RESTRICT_WORKSPACE, + ].includes(t.type) + ); + +@@ -1099,6 +1101,14 @@ function updateSourcesIfEmpty(context) { + acceptedSources.push(source); + } + break; ++ case lazy.UrlbarUtils.RESULT_SOURCE.WORKSPACES: ++ if ( ++ restrictTokenType === lazy.UrlbarTokenizer.TYPE.RESTRICT_WORKSPACE || ++ !restrictTokenType ++ ) { ++ acceptedSources.push(source); ++ } ++ break; + case lazy.UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL: + case lazy.UrlbarUtils.RESULT_SOURCE.ADDON: + default: diff --git a/src/browser/components/urlbar/UrlbarTokenizer-sys-mjs.patch b/src/browser/components/urlbar/UrlbarTokenizer-sys-mjs.patch new file mode 100644 index 0000000000..c195ba7d90 --- /dev/null +++ b/src/browser/components/urlbar/UrlbarTokenizer-sys-mjs.patch @@ -0,0 +1,28 @@ +diff --git a/browser/components/urlbar/UrlbarTokenizer.sys.mjs b/browser/components/urlbar/UrlbarTokenizer.sys.mjs +index d4af0ee5138a69139b94d898fb07e2345172f025..f750aae3f9f0a849ca009784510575b2b7119e6d 100644 +--- a/browser/components/urlbar/UrlbarTokenizer.sys.mjs ++++ b/browser/components/urlbar/UrlbarTokenizer.sys.mjs +@@ -66,6 +66,7 @@ export var UrlbarTokenizer = { + // `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token. It + // may or may not be an origin. + POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12, ++ RESTRICT_WORKSPACE: 13, + }), + + // The special characters below can be typed into the urlbar to restrict +@@ -83,6 +84,7 @@ export var UrlbarTokenizer = { + TITLE: "#", + URL: "$", + ACTION: ">", ++ WORKSPACE: "`", + }), + + // The keys of characters in RESTRICT that will enter search mode. +@@ -97,6 +99,7 @@ export var UrlbarTokenizer = { + if (lazy.UrlbarPrefs.get("scotchBonnet.enableOverride")) { + keys.push(this.RESTRICT.ACTION); + } ++ keys.push(this.RESTRICT.WORKSPACE); + return new Set(keys); + }, + diff --git a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch index 4a3ac4e4f7..14b0a8fd0c 100644 --- a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch @@ -1,29 +1,50 @@ diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs -index 9e9f786b6fd3441000d9cdb0b582f817b73ad814..8f86652520a433c94e34fc0e35dc8aad4a86faa2 100644 +index 9e9f786b6fd3441000d9cdb0b582f817b73ad814..12e8537b1647f6e3759ea9c5ed93d8a620c5644b 100644 --- a/browser/components/urlbar/UrlbarUtils.sys.mjs +++ b/browser/components/urlbar/UrlbarUtils.sys.mjs -@@ -84,6 +84,7 @@ export var UrlbarUtils = { +@@ -84,6 +84,8 @@ export var UrlbarUtils = { RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword", SUGGESTED_INDEX: "suggestedIndex", TAIL_SUGGESTION: "tailSuggestion", + ZEN_ACTION: "zenAction", ++ ZEN_WORKSPACE: "zenWorkspace", }), // Defines provider types. -@@ -145,6 +146,7 @@ export var UrlbarUtils = { +@@ -145,6 +147,8 @@ export var UrlbarUtils = { OTHER_NETWORK: 6, ADDON: 7, ACTIONS: 8, + ZEN_ACTIONS: 9, ++ WORKSPACES: 10, }), // Per-result exposure telemetry. -@@ -585,6 +587,8 @@ export var UrlbarUtils = { +@@ -293,6 +297,14 @@ export var UrlbarUtils = { + telemetryLabel: "actions", + uiLabel: "urlbar-searchmode-actions", + }, ++ { ++ source: this.RESULT_SOURCE.WORKSPACES, ++ restrict: lazy.UrlbarTokenizer.RESTRICT.WORKSPACE, ++ icon: "chrome://browser/skin/zen-icons/selectable/layers.svg", ++ pref: "shortcuts.workspaces", ++ telemetryLabel: "workspaces", ++ uiLabel: "urlbar-searchmode-workspaces", ++ }, + ]); + }, + +@@ -585,6 +597,12 @@ export var UrlbarUtils = { return this.RESULT_GROUP.HEURISTIC_FALLBACK; case "UrlbarProviderHistoryUrlHeuristic": return this.RESULT_GROUP.HEURISTIC_HISTORY_URL; + case "ZenUrlbarProviderGlobalActions": -+ return this.RESULT_GROUP.ZEN_ACTION; ++ if (result.source == this.RESULT_SOURCE.WORKSPACES) { ++ return this.RESULT_GROUP.ZEN_WORKSPACE; ++ } else { ++ return this.RESULT_GROUP.ZEN_ACTION; ++ } case "UrlbarProviderOmnibox": return this.RESULT_GROUP.HEURISTIC_OMNIBOX; case "UrlbarProviderRestrictKeywordsAutofill": diff --git a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs index 8adf501074..60e13d6dd8 100644 --- a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs +++ b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs @@ -155,6 +155,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { */ async isActive(queryContext) { return ( + queryContext.searchMode?.source == UrlbarUtils.RESULT_SOURCE.WORKSPACES || queryContext.searchMode?.source == UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS || (lazy.enabledPref && @@ -241,10 +242,13 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { * * @param {string} query The user's search query. * @param {boolean} isPrefixed Whether the query is prefixed. + * @param {boolean} isWorkspaceSearch Whether this is a workspace search query */ - async #findMatchingActions(query, isPrefixed) { + async #findMatchingActions(query, isPrefixed, isWorkspaceSearch) { const window = lazy.BrowserWindowTracker.getTopWindow(); - const actions = await this.#getAvailableActions(window); + const actions = isWorkspaceSearch + ? this.#getWorkspaceActions(window) + : await this.#getAvailableActions(window); let results = []; for (let action of actions) { if (isPrefixed && query.length < 1) { @@ -341,13 +345,21 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { async startQuery(queryContext, addCallback) { const query = queryContext.trimmedLowerCaseSearchString; + const isWorkspaceSearch = + queryContext.searchMode?.source == UrlbarUtils.RESULT_SOURCE.WORKSPACES; const isPrefixed = + isWorkspaceSearch || queryContext.searchMode?.source == UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS; + if (!query && !isPrefixed) { return; } - const actionsResults = await this.#findMatchingActions(query, isPrefixed); + const actionsResults = await this.#findMatchingActions( + query, + isPrefixed, + isWorkspaceSearch, + ); if (!actionsResults.length) { return; } @@ -361,9 +373,11 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { zenCommand: action.command, dynamicType: DYNAMIC_TYPE_NAME, zenAction: true, - query: isPrefixed - ? action.label.trimStart() - : queryContext.searchString, + query: isWorkspaceSearch + ? action.extraPayload.prettyName + : isPrefixed + ? action.label.trimStart() + : queryContext.searchString, icon: action.icon, shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand( @@ -378,7 +392,9 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { !isPrefixed; let result = new lazy.UrlbarResult({ type: UrlbarUtils.RESULT_TYPE.DYNAMIC, - source: UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS, + source: isWorkspaceSearch + ? UrlbarUtils.RESULT_SOURCE.WORKSPACES + : UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS, payload, highlights: payloadHighlights, heuristic: shouldBePrioritized, @@ -398,7 +414,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { zenUrlbarResultsLearner .sortCommandsByPriority(finalResults) .forEach(result => { - if (isPrefixed && i === 0 && query.length > 1) { + if (isPrefixed && !isWorkspaceSearch && i === 0 && query.length > 1) { result.heuristic = true; delete result.suggestedIndex; }