Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions prefs/zen-urlbar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,6 @@

- name: zen.urlbar.suggestions.quick-actions
value: true

- name: zen.urlbar.suggestions.quick-actions.advanced
value: false
116 changes: 116 additions & 0 deletions src/zen/urlbar/ZenUBGlobalActions.sys.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ function isNotEmptyTab(window) {
return !window.gBrowser.selectedTab.hasAttribute('zen-empty-tab');
}

// Returns true if the current tab is pinned, non-empty, and has been changed
function isPinnedTabChanged(tab) {
return tab.hasAttribute('zen-pinned-changed') && !tab.hasAttribute('zen-empty-tab') && tab.pinned;
}

const globalActionsTemplate = [
{
label: 'Toggle Compact Mode',
Expand Down Expand Up @@ -90,6 +95,11 @@ const globalActionsTemplate = [
return isNotEmptyTab(window);
},
},
{
label: 'Reopen Closed Tab',
command: 'History:UndoCloseTab',
icon: 'chrome://browser/skin/zen-icons/open.svg',
},
{
label: 'Reload Tab',
command: 'Browser:Reload',
Expand Down Expand Up @@ -153,6 +163,112 @@ const globalActionsTemplate = [
command: 'Tools:Addons',
icon: 'chrome://browser/skin/zen-icons/extension.svg',
},
{
label: 'Reset Pinned Tab',
icon: 'chrome://browser/skin/zen-icons/reload.svg',
command: 'cmd_zenPinnedTabReset',
isAvailable: (window) => {
return isPinnedTabChanged(window.gBrowser.selectedTab);
},
},
{
label: 'Replace Pinned URL with Current',
icon: 'chrome://browser/skin/zen-icons/pin.svg',
command: (window) => {
window.gZenPinnedTabManager.replacePinnedUrlWithCurrent(window.gBrowser.selectedTab);
},
isAvailable: (window) => {
return isPinnedTabChanged(window.gBrowser.selectedTab);
},
},
{
label: 'Duplicate Tab',
icon: 'chrome://browser/skin/zen-icons/duplicate-tab.svg',
command: (window) => {
window.gBrowser.duplicateTab(window.gBrowser.selectedTab, true);
},
isAvailable: (window) => {
return isNotEmptyTab(window);
},
},
{
label: 'Bookmark Tab',
icon: 'chrome://browser/skin/zen-icons/bookmark-hollow.svg',
command: 'Browser:AddBookmarkAs',
isAvailable: (window) => isNotEmptyTab(window),
},
...(Services.prefs.getBoolPref('zen.urlbar.suggestions.quick-actions.advanced', false)
? [
{
label: 'Search Bookmarks',
icon: 'chrome://browser/skin/zen-icons/bookmark-star-on-tray.svg',
command: 'Browser:SearchBookmarks',
},
{
label: 'Copy Current URL Markdown',
icon: 'chrome://browser/skin/zen-icons/edit-copy.svg',
command: 'cmd_zenCopyCurrentURLMarkdown',
isAvailable: (window) => isNotEmptyTab(window),
},
{
label: 'Create New Workspace',
command: 'cmd_zenOpenWorkspaceCreation',
icon: 'chrome://browser/skin/zen-icons/duplicate-tab.svg',
},
{
label: 'Delete Current Workspace',
command: 'cmd_zenCtxDeleteWorkspace',
icon: 'chrome://browser/skin/zen-icons/trash.svg',
},
{
label: 'Split View Vertical',
command: 'cmd_zenSplitViewVertical',
icon: 'chrome://browser/skin/zen-icons/split.svg',
isAvailable: (window) => {
return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0);
},
},
{
label: 'Split View Horizontal',
command: 'cmd_zenSplitViewHorizontal',
icon: 'chrome://browser/skin/zen-icons/split.svg',
isAvailable: (window) => {
return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0);
},
},
{
label: 'Split View Grid',
command: 'cmd_zenSplitViewGrid',
icon: 'chrome://browser/skin/zen-icons/split.svg',
isAvailable: (window) => {
return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0);
},
},
{
label: 'Unsplit Tabs',
command: 'cmd_zenSplitViewUnsplit',
icon: 'chrome://browser/skin/zen-icons/tab.svg',
isAvailable: (window) => window.gZenViewSplitter.splitViewActive,
},
{
label: 'Unsplit Current Tab',
icon: 'chrome://browser/skin/zen-icons/fullscreen.svg',
command: (window) => {
const container = window.gBrowser.selectedTab.linkedBrowser?.closest(
'.browserSidebarContainer'
);
window.gZenViewSplitter.removeTabFromSplit(container);
},
isAvailable: (window) => {
return (
// This command is hidden if split view has only 2 tabs; just use 'Unsplit Tabs'
window.gZenViewSplitter.splitViewActive &&
window.gZenViewSplitter._data[window.gZenViewSplitter.currentView].tabs.length > 2
);
},
},
]
: []),
];

export const globalActions = globalActionsTemplate.map((action) => ({
Expand Down