Repository: alyssaxuu/omni Branch: master Commit: 8bd26168ec17 Files: 24 Total size: 313.5 KB Directory structure: gitextract_czb4mn5n/ ├── .editorconfig ├── .gitattributes ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── firefox/ │ ├── assets/ │ │ └── nice-select.css │ ├── background.js │ ├── content.css │ ├── content.html │ ├── content.js │ ├── focus.js │ ├── jquery.js │ ├── manifest.json │ └── newtab.html └── src/ ├── assets/ │ └── nice-select.css ├── background.js ├── content.css ├── content.html ├── content.js ├── focus.js ├── jquery.js ├── manifest.json └── newtab.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*] indent_style = tab end_of_line = crlf charset = utf-8 trim_trailing_whitespace = false indent_size = 2 [*.md] trim_trailing_whitespace = false ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: alyssaxuu patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .gitignore ================================================ .history ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2022 Alyssa X Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Omni ![Preview](preview.gif)

The most powerful interface for your browser 🔥 With Omni you can use your browser like a pro. Manage tabs, bookmarks, your browser history, perform all sorts of actions and more with a simple command interface. 👉 Get it now [for Chrome](https://chrome.google.com/webstore/detail/omni/mapjgeachilmcbbokkgcbgpbakaaeehi?hl=en&authuser=0) and [for Firefox](https://addons.mozilla.org/en-GB/firefox/addon/omnisearch/) Omni - The all-in-one tool to supercharge your productivity | Product Hunt > You can support this project (and many others) through [GitHub Sponsors](https://github.com/sponsors/alyssaxuu)! ❤️ Made by [Alyssa X](https://twitter.com/alyssaxuu) ## Table of contents - [Features](#features) - [Controlling the interface](#controlling-the-interface) - [Opening Omni](#opening-omni) - [Closing Omni](#closing-omni) - [Switching between dark and light mode](#switching-between-dark-and-light-mode) - [List of commands](#list-of-commands) - [Self-hosting Omni](#self-hosting-omni) - [Installing on Chrome](#installing-on-chrome) - [Installing on Firefox](#installing-on-firefox) - [Libraries used](#libraries-used) ## Features 🗄 Switch, open, close, and search your tabs
📚 Browse and manage your bookmarks
🔍 Search your browsing history
⚡️ 50+ actions to improve your productivity
🔮 Special commands to filter and perform more actions
🧩 Integrations with Notion, Figma, Docs, Asana...
⌨️ Shortcuts for actions such as muting, pinning, bookmarking...
⚙️ Advanced settings to help troubleshoot browsing issues
🌙 Dark mode
...and much more - all for free & no sign in needed! ## Controlling the interface ### Opening Omni To open Omni, simply press `⌘+Shift+K` on Mac or `Ctrl+Shift+K` on Windows. You can change the shortcut by going to chrome://extensions/shortcuts in Chrome, or by following [these steps](https://support.mozilla.org/en-US/kb/manage-extension-shortcuts-firefox) in Firefox Alternatively you can click on the extension icon in the toolbar to toggle it. ### Closing Omni To close Omni you can press `Esc`, click on the background, or press the extension icon. ### Switching between dark and light mode The dark and light theme in Omni is tied to your system's theme. On Mac you can change the theme by clicking on the Apple menu (on the top left), opening the System preferences, going into the General section, and then choosing between dark, light, or auto. On Windows it depends on the OS version. [Here is a guide for Windows 11 and 10.](https://support.microsoft.com/en-us/windows/change-desktop-background-and-colors-176702ca-8e24-393b-15f2-b15b38f69de6#ID0EBF=Windows_11) After switching the theme you might need to restart your browser. ## List of commands You can use a variety of commands with Omni to perform actions or filter your results. - **/tabs**: Search your tabs - **/bookmarks**: Search your bookmarks - **/history**: Search your browser history - **/actions**: Search all available actions - **/remove**: Remove a bookmark or close a tab Feel free to suggest new commands for Omni by [making an issue](https://github.com/alyssaxuu/omni/issues/new). ## Self-hosting Omni You can run Omni locally without having to install it from the Chrome Store or from Firefox Add-ons. ### Installing on Chrome 1. Download the code. In the web version of GitHub, you can do that by clicking the green "Code" button, and then "Download ZIP". 2. Go to chrome://extensions/ in your browser, and [enable developer mode](https://developer.chrome.com/docs/extensions/mv2/faq/#:~:text=You%20can%20start%20by%20turning,a%20packaged%20extension%2C%20and%20more.). 3. Drag the [src folder](https://github.com/alyssaxuu/omni/tree/master/src) (make sure it's a folder and not a ZIP file, so unzip first), or click on the "Load unpacked" button and locate the folder. 4. That's it, you will now be able to use Omni locally. ### Installing on Firefox 1. Download the code. In the web version of GitHub, you can do that by clicking the green "Code" button, and then "Download ZIP". 2. Open the about:debugging page in your browser, click the "This Firefox" option. 3. Click the "Load Temporary Add-on" button, and select any file inside the [firefox folder](https://github.com/alyssaxuu/omni/tree/master/firefox) 4. That's it, you will now be able to use Omni locally. ## Libraries used - [jQuery](https://jquery.com/) - for better event handling and DOM manipulation - [dom-focus-lock](https://github.com/theKashey/dom-focus-lock) - to keep focus on the input field # Feel free to reach out to me through email at hi@alyssax.com or [on Twitter](https://twitter.com/alyssaxuu) if you have any questions or feedback! Hope you find this useful 💜 ================================================ FILE: firefox/assets/nice-select.css ================================================ .nice-select { -webkit-tap-highlight-color: transparent; background-color: #fff; border-radius: 5px; border: solid 1px #e8e8e8; box-sizing: border-box; clear: both; cursor: pointer; display: block; float: left; font-family: inherit; font-size: 14px; font-weight: normal; height: 42px; line-height: 40px; outline: none; padding-left: 18px; padding-right: 30px; position: relative; text-align: left !important; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; white-space: nowrap; width: auto; } .nice-select:hover { border-color: #dbdbdb; } .nice-select:active, .nice-select.open, .nice-select:focus { border-color: #999; } .nice-select:after { border-bottom: 2px solid #999; border-right: 2px solid #999; content: ''; display: block; height: 5px; margin-top: -4px; pointer-events: none; position: absolute; right: 12px; top: 50%; -webkit-transform-origin: 66% 66%; -ms-transform-origin: 66% 66%; transform-origin: 66% 66%; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); -webkit-transition: all 0.15s ease-in-out; transition: all 0.15s ease-in-out; width: 5px; } .nice-select.open:after { -webkit-transform: rotate(-135deg); -ms-transform: rotate(-135deg); transform: rotate(-135deg); } .nice-select.open .list { opacity: 1; pointer-events: auto; -webkit-transform: scale(1) translateY(0); -ms-transform: scale(1) translateY(0); transform: scale(1) translateY(0); } .nice-select.disabled { border-color: #ededed; color: #999; pointer-events: none; } .nice-select.disabled:after { border-color: #cccccc; } .nice-select.wide { width: 100%; } .nice-select.wide .list { left: 0 !important; right: 0 !important; } .nice-select.right { float: right; } .nice-select.right .list { left: auto; right: 0; } .nice-select.small { font-size: 12px; height: 36px; line-height: 34px; } .nice-select.small:after { height: 4px; width: 4px; } .nice-select.small .option { line-height: 34px; min-height: 34px; } .nice-select .list { background-color: #fff; border-radius: 5px; box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11); box-sizing: border-box; margin-top: 4px; opacity: 0; overflow: hidden; padding: 0; pointer-events: none; position: absolute; top: 100%; left: 0; -webkit-transform-origin: 50% 0; -ms-transform-origin: 50% 0; transform-origin: 50% 0; -webkit-transform: scale(0.75) translateY(-21px); -ms-transform: scale(0.75) translateY(-21px); transform: scale(0.75) translateY(-21px); -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; z-index: 9; } .nice-select .list:hover .option:not(:hover) { background-color: transparent !important; } .nice-select .option { cursor: pointer; font-weight: 400; line-height: 40px; list-style: none; min-height: 40px; outline: none; padding-left: 18px; padding-right: 29px; text-align: left; -webkit-transition: all 0.2s; transition: all 0.2s; } .nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus { background-color: #f6f6f6; } .nice-select .option.selected { font-weight: bold; } .nice-select .option.disabled { background-color: transparent; color: #999; cursor: default; } .no-csspointerevents .nice-select .list { display: none; } .no-csspointerevents .nice-select.open .list { display: block; } ================================================ FILE: firefox/background.js ================================================ let actions = []; let newtaburl = ""; // Clear actions and append default ones const clearActions = () => { getCurrentTab().then((response) => { actions = []; const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0; let muteaction = {title:"Mute tab", desc:"Mute the current tab", type:"action", action:"mute", emoji:true, emojiChar:"🔇", keycheck:true, keys:['⌥','⇧', 'M']}; let pinaction = {title:"Pin tab", desc:"Pin the current tab", type:"action", action:"pin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']}; if (response.mutedInfo.muted) { muteaction = {title:"Unmute tab", desc:"Unmute the current tab", type:"action", action:"unmute", emoji:true, emojiChar:"🔈", keycheck:true, keys:['⌥','⇧', 'M']}; } if (response.pinned) { pinaction = {title:"Unpin tab", desc:"Unpin the current tab", type:"action", action:"unpin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']}; } actions = [ {title:"New tab", desc:"Open a new tab", type:"action", action:"new-tab", emoji:true, emojiChar:"✨", keycheck:true, keys:['⌘','T']}, {title:"Bookmark", desc:"Create a bookmark", type:"action", action:"create-bookmark", emoji:true, emojiChar:"📕", keycheck:true, keys:['⌘','D']}, pinaction, {title:"Fullscreen", desc:"Make the page fullscreen", type:"action", action:"fullscreen", emoji:true, emojiChar:"🖥", keycheck:true, keys:['⌘', 'Ctrl', 'F']}, muteaction, {title:"Reload", desc:"Reload the page", type:"action", action:"reload", emoji:true, emojiChar:"♻️", keycheck:true, keys:['⌘','⇧', 'R']}, {title:"Help", desc:"Get help with Omni on GitHub", type:"action", action:"url", url:"https://github.com/alyssaxuu/omni", emoji:true, emojiChar:"🤔", keycheck:false}, {title:"Compose email", desc:"Compose a new email", type:"action", action:"email", emoji:true, emojiChar:"✉️", keycheck:true, keys:['⌥','⇧', 'C']}, {title:"Print page", desc:"Print the current page", type:"action", action:"print", emoji:true, emojiChar:"🖨️", keycheck:true, keys:['⌘', 'P']}, {title:"New Notion page", desc:"Create a new Notion page", type:"action", action:"url", url:"https://notion.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-notion.png"), keycheck:false}, {title:"New Sheets spreadsheet", desc:"Create a new Google Sheets spreadsheet", type:"action", action:"url", url:"https://sheets.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-sheets.png"), keycheck:false}, {title:"New Docs document", desc:"Create a new Google Docs document", type:"action", action:"url", emoji:false, url:"https://docs.new", favIconUrl:browser.runtime.getURL("assets/logo-docs.png"), keycheck:false}, {title:"New Slides presentation", desc:"Create a new Google Slides presentation", type:"action", action:"url", url:"https://slides.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-slides.png"), keycheck:false}, {title:"New form", desc:"Create a new Google Forms form", type:"action", action:"url", url:"https://forms.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-forms.png"), keycheck:false}, {title:"New Medium story", desc:"Create a new Medium story", type:"action", action:"url", url:"https://story.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-medium.png"), keycheck:false}, {title:"New GitHub repository", desc:"Create a new GitHub repository", type:"action", action:"url", url:"https://github.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-github.png"), keycheck:false}, {title:"New GitHub gist", desc:"Create a new GitHub gist", type:"action", action:"url", url:"https://gist.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-github.png"), keycheck:false}, {title:"New CodePen pen", desc:"Create a new CodePen pen", type:"action", action:"url", url:"https://pen.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-codepen.png"), keycheck:false}, {title:"New Excel spreadsheet", desc:"Create a new Excel spreadsheet", type:"action", action:"url", url:"https://excel.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-excel.png"), keycheck:false}, {title:"New PowerPoint presentation", desc:"Create a new PowerPoint presentation", type:"action", url:"https://powerpoint.new", action:"url", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-powerpoint.png"), keycheck:false}, {title:"New Word document", desc:"Create a new Word document", type:"action", action:"url", url:"https://word.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-word.png"), keycheck:false}, {title:"Create a whiteboard", desc:"Create a collaborative whiteboard", type:"action", action:"url", url:"https://whiteboard.new", emoji:true, emojiChar:"🧑‍🏫", keycheck:false}, {title:"Record a video", desc:"Record and edit a video", type:"action", action:"url", url:"https://recording.new", emoji:true, emojiChar:"📹", keycheck:false}, {title:"Create a Figma file", desc:"Create a new Figma file", type:"action", action:"url", url:"https://figma.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-figma.png"), keycheck:false}, {title:"Create a FigJam file", desc:"Create a new FigJam file", type:"action", action:"url", url:"https://figjam.new", emoji:true, emojiChar:"🖌", keycheck:false}, {title:"Hunt a product", desc:"Submit a product to Product Hunt", type:"action", action:"url", url:"https://www.producthunt.com/posts/new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-producthunt.png"), keycheck:false}, {title:"Make a tweet", desc:"Make a tweet on Twitter", type:"action", action:"url", url:"https://twitter.com/intent/tweet", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-twitter.png"), keycheck:false}, {title:"Create a playlist", desc:"Create a Spotify playlist", type:"action", action:"url", url:"https://playlist.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-spotify.png"), keycheck:false}, {title:"Create a Canva design", desc:"Create a new design with Canva", type:"action", action:"url", url:"https://design.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-canva.png"), keycheck:false}, {title:"Create a new podcast episode", desc:"Create a new podcast episode with Anchor", type:"action", action:"url", url:"https://episode.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-anchor.png"), keycheck:false}, {title:"Edit an image", desc:"Edit an image with Adobe Photoshop", type:"action", action:"url", url:"https://photo.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-photoshop.png"), keycheck:false}, {title:"Convert to PDF", desc:"Convert a file to PDF", type:"action", action:"url", url:"https://pdf.new", emoji:true, emojiChar:"📄", keycheck:false}, {title:"Scan a QR code", desc:"Scan a QR code with your camera", type:"action", action:"url", url:"https://scan.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-qr.png"), keycheck:false}, {title:"Add a task to Asana", desc:"Create a new task in Asana", type:"action", action:"url", url:"https://task.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-asana.png"), keycheck:false}, {title:"Add an issue to Linear", desc:"Create a new issue in Linear", type:"action", action:"url", url:"https://linear.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-linear.png"), keycheck:false}, {title:"Add a task to WIP", desc:"Create a new task in WIP", type:"action", action:"url", url:"https://todo.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-wip.png"), keycheck:false}, {title:"Create an event", desc:"Add an event to Google Calendar", type:"action", action:"url", url:"https://cal.new", emoji:false, favIconUrl:browser.runtime.getURL("assets/logo-calendar.png"), keycheck:false}, {title:"Add a note", desc:"Add a note to Google Keep", type:"action", action:"url", emoji:false, url:"https://note.new", favIconUrl:browser.runtime.getURL("assets/logo-keep.png"), keycheck:false}, {title:"New meeting", desc:"Start a Google Meet meeting", type:"action", action:"url", emoji:false, url:"https://meet.new", favIconUrl:browser.runtime.getURL("assets/logo-meet.png"), keycheck:false}, {title:"Browsing history", desc:"Browse through your browsing history", type:"action", action:"history", emoji:true, emojiChar:"🗂", keycheck:true, keys:['⌘','Y']}, {title:"Incognito mode", desc:"Open an incognito window", type:"action", action:"incognito", emoji:true, emojiChar:"🕵️", keycheck:true, keys:['⌘','⇧', 'N']}, {title:"Downloads", desc:"Browse through your downloads", type:"action", action:"downloads", emoji:true, emojiChar:"📦", keycheck:true, keys:['⌘','⇧', 'J']}, {title:"Extensions", desc:"Manage your browser Extensions", type:"action", action:"extensions", emoji:true, emojiChar:"🧩", keycheck:false, keys:['⌘','D']}, {title:"browser settings", desc:"Open the browser settings", type:"action", action:"settings", emoji:true, emojiChar:"⚙️", keycheck:true, keys:['⌘',',']}, {title:"Scroll to bottom", desc:"Scroll to the bottom of the page", type:"action", action:"scroll-bottom", emoji:true, emojiChar:"👇", keycheck:true, keys:['⌘','↓']}, {title:"Scroll to top", desc:"Scroll to the top of the page", type:"action", action:"scroll-top", emoji:true, emojiChar:"👆", keycheck:true, keys:['⌘','↑']}, {title:"Go back", desc:"Go back in history for the current tab", type:"action", action:"go-back", emoji:true, emojiChar:"👈", keycheck:true, keys:['⌘','←']}, {title:"Go forward", desc:"Go forward in history for the current tab", type:"action", action:"go-forward", emoji:true, emojiChar:"👉", keycheck:true, keys:['⌘','→']}, {title:"Duplicate tab", desc:"Make a copy of the current tab", type:"action", action:"duplicate-tab", emoji:true, emojiChar:"📋", keycheck:true, keys:['⌥','⇧', 'D']}, {title:"Close tab", desc:"Close the current tab", type:"action", action:"close-tab", emoji:true, emojiChar:"🗑", keycheck:true, keys:['⌘','W']}, {title:"Close window", desc:"Close the current window", type:"action", action:"close-window", emoji:true, emojiChar:"💥", keycheck:true, keys:['⌘','⇧', 'W']}, {title:"Manage browsing data", desc:"Manage your browsing data", type:"action", action:"manage-data", emoji:true, emojiChar:"🔬", keycheck:true, keys:['⌘','⇧', 'Delete']}, {title:"Clear all browsing data", desc:"Clear all of your browsing data", type:"action", action:"remove-all", emoji:true, emojiChar:"🧹", keycheck:false, keys:['⌘','D']}, {title:"Clear browsing history", desc:"Clear all of your browsing history", type:"action", action:"remove-history", emoji:true, emojiChar:"🗂", keycheck:false, keys:['⌘','D']}, {title:"Clear cookies", desc:"Clear all cookies", type:"action", action:"remove-cookies", emoji:true, emojiChar:"🍪", keycheck:false, keys:['⌘','D']}, {title:"Clear cache", desc:"Clear the cache", type:"action", action:"remove-cache", emoji:true, emojiChar:"🗄", keycheck:false, keys:['⌘','D']}, {title:"Clear local storage", desc:"Clear the local storage", type:"action", action:"remove-local-storage", emoji:true, emojiChar:"📦", keycheck:false, keys:['⌘','D']}, {title:"Clear passwords", desc:"Clear all saved passwords", type:"action", action:"remove-passwords", emoji:true, emojiChar:"🔑", keycheck:false, keys:['⌘','D']}, ]; if (!isMac) { for (action of actions) { switch (action.action) { case "reload": action.keys = ['F5']; break; case "fullscreen": action.keys = ['F11']; break; case "downloads": action.keys = ['Ctrl', 'J']; break; case "settings": action.keycheck = false; break; case "history": action.keys = ['Ctrl', 'H']; break; case "go-back": action.keys = ['Alt','←']; break; case "go-forward": action.keys = ['Alt','→'] break; case "scroll-top": action.keys = ['Home']; break; case "scroll-bottom": action.keys = ['End']; break; } for (const key in action.keys) { if (action.keys[key] === "⌘") { action.keys[key] = "Ctrl"; } else if (action.keys[key] === "⌥") { action.keys[key] = "Alt"; } }; }; } }); } // Open on install browser.runtime.onInstalled.addListener((object) => { // Inject Omni on install const manifest = browser.runtime.getManifest(); const injectIntoTab = (tab) => { const scripts = manifest.content_scripts[0].js; const s = scripts.length; for (let i = 0; i < s; i++) { browser.tabs.executeScript(tab.id, { file: scripts[i] }); } browser.tabs.insertCSS(tab.id, { file: manifest.content_scripts[0].css[0], }); }; // Get all windows browser.windows.getAll( { populate: true, }, (windows) => { let currentWindow; const w = windows.length; for (let i = 0; i < w; i++) { currentWindow = windows[i]; let currentTab; const t = currentWindow.tabs.length; for (let j = 0; j < t; j++) { currentTab = currentWindow.tabs[j]; if (!currentTab.url.includes("browser://") && !currentTab.url.includes("browser-extension://") && !currentTab.url.includes("browser.google.com")) { injectIntoTab(currentTab); } } } } ); if (object.reason === "install") { browser.tabs.create({ url: "https://github.com/alyssaxuu/omni" }); } }); // Check when the extension button is clicked browser.browserAction.onClicked.addListener((tab) => { browser.tabs.sendMessage(tab.id, {request: "open-omni"}); }); // Listen for the open omni shortcut browser.commands.onCommand.addListener((command) => { if (command === "open-omni") { getCurrentTab().then((response) => { if (!response.url.includes("browser://") && !response.url.includes("browser.google.com")) { browser.tabs.sendMessage(response.id, {request: "open-omni"}); } else { browser.tabs.create({ url: "./newtab.html" }).then(() => { newtaburl = response.url; browser.tabs.remove(response.id); }) } }); } }); // Get the current tab const getCurrentTab = async () => { const queryOptions = { active: true, currentWindow: true }; const [tab] = await browser.tabs.query(queryOptions); return tab; } // Restore the new tab page (workaround to show Omni in new tab page) function restoreNewTab() { getCurrentTab().then((response) => { browser.tabs.create({ url: newtaburl }).then(() => { browser.tabs.remove(response.id); }) }) } const resetOmni = () => { clearActions(); getTabs(); getBookmarks(); var search = [ {title:"Search", desc:"Search for a query", type:"action", action:"search", emoji:true, emojiChar:"🔍", keycheck:false}, {title:"Search", desc:"Go to website", type:"action", action:"goto", emoji:true, emojiChar:"🔍", keycheck:false} ]; actions = search.concat(actions); } // Check if tabs have changed and actions need to be fetched again browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => resetOmni()); browser.tabs.onCreated.addListener((tab) => resetOmni()); browser.tabs.onRemoved.addListener((tabId, changeInfo) => resetOmni()); // Get tabs to populate in the actions const getTabs = () => { browser.tabs.query({}, (tabs) => { tabs.forEach((tab) => { tab.desc = "browser tab"; tab.keycheck = false; tab.action = "switch-tab"; tab.type = "tab"; }) actions = tabs.concat(actions); }); } // Get bookmarks to populate in the actions const getBookmarks = () => { const process_bookmark = (bookmarks) => { for (const bookmark of bookmarks) { if (bookmark.url) { actions.push({title:bookmark.title, desc:"Bookmark", id:bookmark.id, url:bookmark.url, type:"bookmark", action:"bookmark", emoji:true, emojiChar:"⭐️", keycheck:false}) } if (bookmark.children) { process_bookmark(bookmark.children); } } } browser.bookmarks.getRecent(100, process_bookmark); } // Lots of different actions const switchTab = (tab) => { browser.tabs.highlight({ tabs: tab.index, windowId: tab.windowId }) browser.windows.update( tab.windowId, { focused: true } ) } const goBack = (tab) => { browser.tabs.goBack({ tabs: tab.index }) } const goForward = (tab) => { browser.tabs.goForward({ tabs: tab.index }) } const duplicateTab = (tab) => { getCurrentTab().then((response) => { browser.tabs.duplicate(response.id); }) } const createBookmark = (tab) => { getCurrentTab().then((response) => { browser.bookmarks.create({ title: response.title, url: response.url }); }) } const muteTab = (mute) =>{ getCurrentTab().then((response) => { browser.tabs.update(response.id, {"muted": mute}) }); } const reloadTab = () => { browser.tabs.reload(); } const pinTab = (pin) => { getCurrentTab().then((response) => { browser.tabs.update(response.id, {"pinned": pin}) }); } const clearAllData = () => { browser.browsingData.remove({ "since": (new Date()).getTime() }, { "appcache": true, "cache": true, "cacheStorage": true, "cookies": true, "downloads": true, "fileSystems": true, "formData": true, "history": true, "indexedDB": true, "localStorage": true, "passwords": true, "serviceWorkers": true, "webSQL": true }); } const clearBrowsingData = () => { browser.browsingData.removeHistory({"since": 0}); } const clearCookies = () =>{ browser.browsingData.removeCookies({"since": 0}); } const clearCache = () => { browser.browsingData.removeCache({"since": 0}); } const clearLocalStorage = () => { browser.browsingData.removeLocalStorage({"since": 0}); } const clearPasswords = () => { browser.browsingData.removePasswords({"since": 0}); } const openbrowserUrl = (url) => { browser.tabs.create({url: 'browser://'+url+'/'}); } const openIncognito = () => { browser.windows.create({"incognito": true}); } const closeWindow = (id) => { browser.windows.remove(id); } const closeTab = (tab) => { browser.tabs.remove(tab.id); } const closeCurrentTab = () => { getCurrentTab().then(closeTab) } const removeBookmark = (bookmark) => { browser.bookmarks.remove(bookmark.id); } // Receive messages from any tab browser.runtime.onMessage.addListener((message, sender, sendResponse) => { switch (message.request) { case "get-actions": resetOmni(); sendResponse({actions: actions}); break; case "switch-tab": switchTab(message.tab); break; case "go-back": goBack(message.tab); break; case "go-forward": goForward(message.tab); break; case "duplicate-tab": duplicateTab(message.tab); break; case "create-bookmark": createBookmark(message.tab); break; case "mute": muteTab(true); break; case "unmute": muteTab(false); break; case "reload": reloadTab(); break; case "pin": pinTab(true); break; case "unpin": pinTab(false); break; case "remove-all": clearAllData(); break; case "remove-history": clearBrowsingData(); break; case "remove-cookies": clearCookies(); break; case "remove-cache": clearCache(); break; case "remove-local-storage": clearLocalStorage(); break; case "remove-passwords": clearPasswords(); case "history": // Fallthrough case "downloads": case "extensions": case "settings": case "extensions/shortcuts": openbrowserUrl(message.request); break; case "manage-data": openbrowserUrl("settings/clearBrowserData"); break; case "incognito": openIncognito(); break; case "close-window": closeWindow(sender.tab.windowId); break; case "close-tab": closeCurrentTab(); break; case "search-history": browser.history.search({text:message.query, maxResults:9e9, startTime:0}).then((data) => { data.forEach((action, index) => { action.type = "history"; action.emoji = true; action.emojiChar = "🏛"; action.action = "history"; action.keyCheck = false; }); sendResponse({history:data}); }) return true; case "search-bookmarks": browser.bookmarks.search({query:message.query}).then((data) => { // The index property of the bookmark appears to be causing issues, iterating separately... data.filter(x => x.index == 0).forEach((action, index) => { if (!action.url) { data.splice(index, 1); } action.type = "bookmark"; action.emoji = true; action.emojiChar = "⭐️"; action.action = "bookmark"; action.keyCheck = false; }) data.forEach((action, index) => { if (!action.url) { data.splice(index, 1); } action.type = "bookmark"; action.emoji = true; action.emojiChar = "⭐️"; action.action = "bookmark"; action.keyCheck = false; }) sendResponse({bookmarks:data}); }) return true; case "remove": if (message.type == "bookmark") { removeBookmark(message.action); } else { closeTab(message.action); } break; case "search": browser.search.search( {query:message.query} ) break; case "restore-new-tab": restoreNewTab(); break; case "close-omni": getCurrentTab().then((response) => { browser.tabs.sendMessage(response.id, {request: "close-omni"}); }); break; } }); // Get actions resetOmni(); ================================================ FILE: firefox/content.css ================================================ .omni-extension { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; font-smoothing: antialiased; font-weight: 400; } /* Scrollbar size */ .omni-extension ::-webkit-scrollbar { width: 10px; height: 10px; } .omni-extension ::-webkit-scrollbar-thumb { background-color: rgba(127, 127, 127, 0.6); background-clip: padding-box; border: 2px solid transparent; border-radius: 5px; } .omni-extension ::-webkit-scrollbar-thumb:vertical:hover, .omni-extension ::-webkit-scrollbar-thumb:horizontal:hover { background-color: rgb(110, 110, 110); } .omni-extension ::-webkit-scrollbar-track { background-color: transparent; } .omni-extension ::-webkit-scrollbar-thumb:vertical:active, .omni-extension ::-webkit-scrollbar-thumb:horizontal:active { background: rgba(95, 91, 91, 1); } .omni-extension ::-webkit-scrollbar-corner { background: none; } @media (prefers-color-scheme: dark) { .omni-extension { --background: #1e2128; --border: #35373e; --text: #f1f1f1; --text-2: #c5c6ca; --text-3: #a5a5ae; --select: #17191e; --accent: #6068d2; --accent-hover: #484fac; --shortcut: #383e4a; --placeholder: #63687b; --background-2: #292d36; } } @media (prefers-color-scheme: light) { .omni-extension { --background: #fafcff; --border: #f2f3fb; --text: #2b2d41; --text-2: #2b2d41; --text-3: #929db2; --select: #eff3f9; --accent: #6068d2; --accent-hover: #484fac; --shortcut: #dadeea; --placeholder: #bac2d1; --background-2: #292d36; } } @font-face { font-family: "Inter"; font-style: normal; font-weight: 400; src: url("moz-extension://__MSG_@@extension_id__/assets/Inter-Regular.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 500; src: url("moz-extension://__MSG_@@extension_id__/assets/Inter-Medium.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 600; src: url("moz-extension://__MSG_@@extension_id__/assets/Inter-SemiBold.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 700; src: url("moz-extension://__MSG_@@extension_id__/assets/Inter-Bold.ttf"); } .omni-extension * { display: block; width: unset; box-shadow: unset; padding: unset; margin: unset; background-color: unset; border-radius: unset; } .omni-extension .omni-item-details * { line-height: normal; } .omni-extension { font-family: Inter !important; z-index: 99999999999; } .omni-extension #omni-wrap { position: fixed; width: 700px; border: 1px solid transparent; border-radius: 5px; margin: auto; top: 0px; right: 0px; bottom: 0px; left: 0px; z-index: 9999999999; height: 540px; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); pointer-events: all; } .omni-extension #omni { position: absolute; width: 100%; background: var(--background); border: 1px solid var(--border); border-radius: 5px; top: 0px; left: 0px; z-index: 9999999998; height: fit-content; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); display: block; } .omni-closing #omni { transform: scale(0.9); opacity: 0; } .omni-closing { pointer-events: none; display: none !important; } .omni-extension #omni-overlay { height: 100%; width: 100%; position: fixed; top: 0px; left: 0px; background-color: #000; z-index: 9999; opacity: 0.6; transition: all 0.1s cubic-bezier(0.05, 0.03, 0.35, 1); } .omni-closing #omni-overlay { opacity: 0 !important; } .omni-extension #omni-head { height: 50px; line-height: 50px; width: 95%; margin-left: auto; margin-right: auto; border-bottom: 1px solid var(--border); } .omni-extension #omni-name { color: var(--text); font-size: 12px; font-weight: 600; float: left; } .omni-extension #omni-close { color: var(--text-3); float: right; font-size: 12px; font-weight: 500; } .omni-extension #omni-close span { margin-left: 3px; } .omni-extension .omni-shortcut { display: inline-block !important; font-size: 13px; border-radius: 5px; background-color: var(--shortcut); color: var(--text); text-align: center; height: 20px; line-height: 20px; min-width: 20px; padding-left: 3px; padding-right: 3px; } .omni-extension input { background: transparent; border: 0px; outline: none; font-size: 20px; font-weight: 400; height: 50px; width: 92%; margin-left: auto; margin-right: auto; display: block; color: var(--text); caret-color: var(--accent); font-family: Inter !important; margin-top: 5px; margin-bottom: 5px; box-sizing: border-box; outline: none; border: 0px; box-shadow: none; } .omni-extension ::placeholder { color: var(--placeholder); opacity: 1; } .omni-extension :-ms-input-placeholder { color: var(--placeholder); } .omni-extension ::-ms-input-placeholder { color: var(--placeholder); } .omni-extension #omni-list { width: 100%; overflow: auto; height: 100%; max-height: 400px; border-top: 1px solid var(--border); position: relative; } .omni-extension .omni-item { height: 60px; width: 100%; } .omni-extension .omni-item:hover { cursor: pointer; } .omni-extension .omni-item-active { background-color: var(--select); position: relative; } .omni-extension .omni-item-active:before { height: 100%; position: absolute; display: block; content: ""; width: 2px; background-color: var(--accent); } .omni-extension .omni-select { float: right; vertical-align: middle; color: var(--text-3); font-size: 12px; font-weight: 500; display: none; margin-top: 20px; margin-right: 5%; } .omni-extension .omni-select span { margin-left: 3px; } .omni-extension .omni-item-active .omni-select { display: block !important; } .omni-extension .omni-icon { width: 20px; height: 20px; margin-left: 5%; display: inline-block; vertical-align: middle; margin-top: -12px; } .omni-extension .omni-emoji-action { display: inline-block; vertical-align: middle; margin-top: -12px; width: 20px; height: 20px; text-align: center; margin-left: 5%; font-size: 18px; } .omni-extension .omni-item-details { display: inline-block !important; margin-left: 10px; vertical-align: middle; margin-top: 10px; } .omni-extension .omni-item-name { color: var(--text-2); font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 460px; } .omni-extension .omni-item-active .omni-item-name { color: var(--text) !important; } .omni-extension .omni-item-desc { color: var(--text-3); margin-top: 5px; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 460px; } .omni-extension #omni-footer { height: 45px; line-height: 45px; border-top: 1px solid var(--border); width: 92%; margin-left: auto; margin-right: auto; } .omni-extension #omni-results { color: var(--text-3); font-size: 12px; font-weight: 500; float: left; } .omni-extension #omni-arrows { color: var(--text-3); font-size: 12px; font-weight: 500; float: right; } .omni-extension #omni-arrows span { margin-left: 3px; margin-right: 3px; } .omni-extension .omni-keys { float: right; vertical-align: middle; font-weight: 500; margin-top: 20px; margin-right: 5%; } .omni-extension .omni-item-active .omni-keys { display: none !important; } .omni-extension .omni-keys span { margin-left: 3px; } #omni-extension-toast { text-align: center; font-family: Inter; font-weight: 500; font-size: 14px; position: fixed; width: -moz-max-content; color: var(--text); bottom: 10px; left: 0px; right: 0px; margin: auto; background: var(--background); border-radius: 5px; height: 40px; line-height: 40px; display: block; padding-left: 10px; padding-right: 10px; visibility: hidden; opacity: 0; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); z-index: 99999999; display: block; } #omni-extension-toast img { display: inline-block; margin-right: 5px; vertical-align: middle; margin-bottom: 2px; } .omni-show-toast { bottom: 20px !important; opacity: 1 !important; visibility: visible !important; } ================================================ FILE: firefox/content.html ================================================
The action has been successful
================================================ FILE: firefox/content.js ================================================ // Workaround to capture Esc key on certain sites var isOpen = false; document.onkeyup = (e) => { if (e.key == "Escape" && isOpen) { browser.runtime.sendMessage({request:"close-omni"}) } } $(document).ready(() => { var actions = []; var isFiltered = false; // Append the omni into the current page $.get(browser.runtime.getURL('/content.html'), (data) => { $(data).appendTo('body'); // Get checkmark image for toast $("#omni-extension-toast img").attr("src", browser.runtime.getURL("assets/check.svg")); // Request actions from the background browser.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); // New tab page workaround if (window.location.href == "browser-extension://mpanekjjajcabgnlbabmopeenljeoggm/newtab.html") { isOpen = true; $("#omni-extension").removeClass("omni-closing"); window.setTimeout(() => { $("#omni-extension input").focus(); }, 100); } }); function renderAction(action, index, keys, img) { var skip = ""; if (action.action == "search" || action.action == "goto") { skip = "style='display:none'"; } if (index != 0) { $("#omni-extension #omni-list").append("
"+img+"
"+action.title+"
"+action.desc+"
"+keys+"
Select
"); } else { $("#omni-extension #omni-list").append("
"+img+"
"+action.title+"
"+action.desc+"
"+keys+"
Select
"); } if (!action.emoji) { var loadimg = new Image(); loadimg.src = action.favIconUrl; // Favicon doesn't load, use a fallback loadimg.onerror = () => { $(".omni-item[data-index='"+index+"'] img").attr("src", browser.runtime.getURL("/assets/globe.svg")); } } } // Add actions to the omni function populateOmni() { $("#omni-extension #omni-list").html(""); actions.forEach((action, index) => { var keys = ""; if (action.keycheck) { keys = "
"; action.keys.forEach(function(key){ keys += ""+key+""; }); keys += "
"; } // Check if the action has an emoji or a favicon if (!action.emoji) { var onload = 'if ("naturalHeight" in this) {if (this.naturalHeight + this.naturalWidth === 0) {this.onerror();return;}} else if (this.width + this.height == 0) {this.onerror();return;}'; var img = "favicon"; renderAction(action, index, keys, img); } else { var img = ""+action.emojiChar+""; renderAction(action, index, keys, img); } }) $(".omni-extension #omni-results").html(actions.length+" results"); } // Add filtered actions to the omni function populateOmniFilter(actions) { isFiltered = true; $("#omni-extension #omni-list").html(""); const renderRow = (index) => { const action = actions[index] var keys = ""; if (action.keycheck) { keys = "
"; action.keys.forEach(function(key){ keys += ""+key+""; }); keys += "
"; } var img = "favicon"; if (action.emoji) { img = ""+action.emojiChar+"" } if (index != 0) { return $("
"+img+"
"+action.title+"
"+action.url+"
"+keys+"
Select
")[0] } else { return $("
"+img+"
"+action.title+"
"+action.url+"
"+keys+"
Select
")[0] } } actions.length && new VirtualizedList.default($("#omni-extension #omni-list")[0], { height: 400, rowHeight: 60, rowCount: actions.length, renderRow, onMount: () => $(".omni-extension #omni-results").html(actions.length+" results"), }); } // Open the omni function openOmni() { browser.runtime.sendMessage({request:"get-actions"}, (response) => { isOpen = true; actions = response.actions; $("#omni-extension input").val(""); populateOmni(); $("html, body").stop(); $("#omni-extension").removeClass("omni-closing"); window.setTimeout(() => { $("#omni-extension input").focus(); focusLock.on($("#omni-extension input").get(0)); $("#omni-extension input").focus(); }, 100); }); } // Close the omni function closeOmni() { if (window.location.href == "browser-extension://mpanekjjajcabgnlbabmopeenljeoggm/newtab.html") { browser.runtime.sendMessage({request:"restore-new-tab"}); } else { isOpen = false; $("#omni-extension").addClass("omni-closing"); } } // Hover over an action in the omni function hoverItem() { $(".omni-item-active").removeClass("omni-item-active"); $(this).addClass("omni-item-active"); } // Show a toast when an action has been performed function showToast(action) { $("#omni-extension-toast span").html('"'+action.title+'" has been successfully performed'); $("#omni-extension-toast").addClass("omni-show-toast"); setTimeout(() => { $(".omni-show-toast").removeClass("omni-show-toast"); }, 3000) } // Autocomplete commands. Since they all start with different letters, it can be the default behavior function checkShortHand(e, value) { var el = $(".omni-extension input"); if (e.keyCode != 8) { if (value == "/t") { el.val("/tabs ") } else if (value == "/b") { el.val("/bookmarks ") } else if (value == "/h") { el.val("/history "); } else if (value == "/r") { el.val("/remove "); } else if (value == "/a") { el.val("/actions "); } } else { if (value == "/tabs" || value == "/bookmarks" || value == "/actions" || value == "/remove" || value == "/history") { el.val(""); } } } // Add protocol function addhttp(url) { if (!/^(?:f|ht)tps?\:\/\//.test(url)) { url = "http://" + url; } return url; } // Check if valid url function validURL(str) { var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-a-z\\d_]*)?$','i'); // fragment locator return !!pattern.test(str); } // Search for an action in the omni function search(e) { if (e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 37) { return; } var value = $(this).val().toLowerCase(); checkShortHand(e, value); value = $(this).val().toLowerCase(); if (value.startsWith("/history")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/history ", ""); var query = ""; if (tempvalue != "/history") { query = value.replace("/history ", ""); } browser.runtime.sendMessage({request:"search-history", query:query}, (response) => { populateOmniFilter(response.history); }); } else if (value.startsWith("/bookmarks")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/bookmarks ", ""); if (tempvalue != "/bookmarks" && tempvalue != "") { var query = value.replace("/bookmarks ", ""); browser.runtime.sendMessage({request:"search-bookmarks", query:query}, (response) => { populateOmniFilter(response.bookmarks); }); } else { populateOmniFilter(actions.filter(x => x.type == "bookmark")); } } else { if (isFiltered) { populateOmni(); isFiltered = false; } $(".omni-extension #omni-list .omni-item").filter(function(){ if (value.startsWith("/tabs")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/tabs ", ""); if (tempvalue == "/tabs") { $(this).toggle($(this).attr("data-type") == "tab"); } else { tempvalue = value.replace("/tabs ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "tab"); } } else if (value.startsWith("/remove")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/remove ", "") if (tempvalue == "/remove") { $(this).toggle($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab"); } else { tempvalue = value.replace("/remove ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && ($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab")); } } else if (value.startsWith("/actions")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/actions ", "") if (tempvalue == "/actions") { $(this).toggle($(this).attr("data-type") == "action"); } else { tempvalue = value.replace("/actions ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "action"); } } else { $(this).toggle($(this).find(".omni-item-name").text().toLowerCase().indexOf(value) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(value) > -1); if (value == "") { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); } else if (!validURL(value)) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").show(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"'] .omni-item-name").html('\"'+value+'\"'); } else { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").show(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"'] .omni-item-name").html(value); } } }); } $(".omni-extension #omni-results").html($("#omni-extension #omni-list .omni-item:visible").length+" results"); $(".omni-item-active").removeClass("omni-item-active"); $(".omni-extension #omni-list .omni-item:visible").first().addClass("omni-item-active"); } // Handle actions from the omni function handleAction(e) { var action = actions[$(".omni-item-active").attr("data-index")]; closeOmni(); if ($(".omni-extension input").val().toLowerCase().startsWith("/remove")) { browser.runtime.sendMessage({request:"remove", type:action.type, action:action}); } else if ($(".omni-extension input").val().toLowerCase().startsWith("/history")) { if (e.ctrlKey || e.metaKey) { window.open($(".omni-item-active").attr("data-url")); } else { window.open($(".omni-item-active").attr("data-url"), "_self"); } } else if ($(".omni-extension input").val().toLowerCase().startsWith("/bookmarks")) { if (e.ctrlKey || e.metaKey) { window.open($(".omni-item-active").attr("data-url")); } else { window.open($(".omni-item-active").attr("data-url"), "_self"); } } else { browser.runtime.sendMessage({request:action.action, tab:action, query:$(".omni-extension input").val()}); switch (action.action) { case "bookmark": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "scroll-bottom": window.scrollTo(0,document.body.scrollHeight); showToast(action); break; case "scroll-top": window.scrollTo(0,0); break; case "navigation": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "fullscreen": var elem = document.documentElement; elem.requestFullscreen(); break; case "new-tab": window.open(""); break; case "email": window.open("mailto:"); break; case "url": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "goto": if (e.ctrlKey || e.metaKey) { window.open(addhttp($(".omni-extension input").val())); } else { window.open(addhttp($(".omni-extension input").val()), "_self"); } break; case "print": window.print(); break; case "remove-all": case "remove-history": case "remove-cookies": case "remove-cache": case "remove-local-storage": case "remove-passwords": showToast(action); break; } } // Fetch actions again browser.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } // Customize the shortcut to open the Omni box function openShortcuts() { browser.runtime.sendMessage({request:"extensions/shortcuts"}); } // Check which keys are down var down = []; $(document).keydown((e) => { down[e.keyCode] = true; if (down[38]) { // Up key if ($(".omni-item-active").prevAll("div").not(":hidden").first().length) { var previous = $(".omni-item-active").prevAll("div").not(":hidden").first(); $(".omni-item-active").removeClass("omni-item-active"); previous.addClass("omni-item-active"); previous[0].scrollIntoView({block:"nearest", inline:"nearest"}); } } else if (down[40]) { // Down key if ($(".omni-item-active").nextAll("div").not(":hidden").first().length) { var next = $(".omni-item-active").nextAll("div").not(":hidden").first(); $(".omni-item-active").removeClass("omni-item-active"); next.addClass("omni-item-active"); next[0].scrollIntoView({block:"nearest", inline:"nearest"}); } } else if (down[27] && isOpen) { // Esc key closeOmni(); } else if (down[13] && isOpen) { // Enter key handleAction(e); } }).keyup((e) => { if (down[18] && down[16] && down[80]) { if (actions.find(x => x.action == "pin") != undefined) { browser.runtime.sendMessage({request:"pin-tab"}); } else { browser.runtime.sendMessage({request:"unpin-tab"}); } browser.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } else if (down[18] && down[16] && down[77]) { if (actions.find(x => x.action == "mute") != undefined) { browser.runtime.sendMessage({request:"mute-tab"}); } else { browser.runtime.sendMessage({request:"unmute-tab"}); } browser.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } else if (down[18] && down[16] && down[67]) { window.open("mailto:"); } down = []; }); // Recieve messages from background browser.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.request == "open-omni") { if (isOpen) { closeOmni(); } else { openOmni(); } } else if (message.request == "close-omni") { closeOmni(); } }); $(document).on("click", "#open-page-omni-extension-thing", openShortcuts); $(document).on("mouseover", ".omni-extension .omni-item:not(.omni-item-active)", hoverItem); $(document).on("keyup", ".omni-extension input", search); $(document).on("click", ".omni-item-active", handleAction); $(document).on("click", ".omni-extension #omni-overlay", closeOmni); }); ================================================ FILE: firefox/focus.js ================================================ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.focusLock = factory()); }(this, function () { 'use strict'; var toArray = function toArray(a) { var ret = Array(a.length); for (var i = 0; i < a.length; ++i) { ret[i] = a[i]; } return ret; }; var arrayFind = function arrayFind(array, search) { return array.filter(function (a) { return a === search; })[0]; }; var asArray = function asArray(a) { return Array.isArray(a) ? a : [a]; }; var tabSort = function tabSort(a, b) { var tabDiff = a.tabIndex - b.tabIndex; var indexDiff = a.index - b.index; if (tabDiff) { if (!a.tabIndex) return 1; if (!b.tabIndex) return -1; } return tabDiff || indexDiff; }; var orderByTabIndex = function orderByTabIndex(nodes, filterNegative, keepGuards) { return toArray(nodes).map(function (node, index) { return { node: node, index: index, tabIndex: keepGuards && node.tabIndex === -1 ? (node.dataset || {}).focusGuard ? 0 : -1 : node.tabIndex }; }).filter(function (data) { return !filterNegative || data.tabIndex >= 0; }).sort(tabSort); }; var tabbables = ['button:enabled:not([readonly])', 'select:enabled:not([readonly])', 'textarea:enabled:not([readonly])', 'input:enabled:not([readonly])', 'a[href]', 'area[href]', 'iframe', 'object', 'embed', '[tabindex]', '[contenteditable]', '[autofocus]']; var FOCUS_GROUP = 'data-focus-lock'; var FOCUS_DISABLED = 'data-focus-lock-disabled'; var FOCUS_ALLOW = 'data-no-focus-lock'; var FOCUS_AUTO = 'data-autofocus-inside'; var queryTabbables = tabbables.join(','); var queryGuardTabbables = queryTabbables + ', [data-focus-guard]'; var getFocusables = function getFocusables(parents, withGuards) { return parents.reduce(function (acc, parent) { return acc.concat( // add all tabbables inside toArray(parent.querySelectorAll(withGuards ? queryGuardTabbables : queryTabbables)), // add if node is tabble itself parent.parentNode ? toArray(parent.parentNode.querySelectorAll(tabbables.join(','))).filter(function (node) { return node === parent; }) : []); }, []); }; var getParentAutofocusables = function getParentAutofocusables(parent) { var parentFocus = parent.querySelectorAll('[' + FOCUS_AUTO + ']'); return toArray(parentFocus).map(function (node) { return getFocusables([node]); }).reduce(function (acc, nodes) { return acc.concat(nodes); }, []); }; var isElementHidden = function isElementHidden(computedStyle) { if (!computedStyle || !computedStyle.getPropertyValue) { return false; } return computedStyle.getPropertyValue('display') === 'none' || computedStyle.getPropertyValue('visibility') === 'hidden'; }; var isVisible = function isVisible(node) { return !node || node === document || !isElementHidden(window.getComputedStyle(node, null)) && isVisible(node.parentNode); }; var notHiddenInput = function notHiddenInput(node) { return !((node.tagName === 'INPUT' || node.tagName === 'BUTTON') && (node.type === 'hidden' || node.disabled)); }; var getParents = function getParents(node) { var parents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; parents.push(node); if (node.parentNode) { getParents(node.parentNode, parents); } return parents; }; var getCommonParent = function getCommonParent(nodea, nodeb) { var parentsA = getParents(nodea); var parentsB = getParents(nodeb); for (var i = 0; i < parentsA.length; i += 1) { var currentParent = parentsA[i]; if (parentsB.indexOf(currentParent) >= 0) { return currentParent; } } return false; }; var filterFocusable = function filterFocusable(nodes) { return toArray(nodes).filter(function (node) { return isVisible(node); }).filter(function (node) { return notHiddenInput(node); }); }; var getTabbableNodes = function getTabbableNodes(topNodes, withGuards) { return orderByTabIndex(filterFocusable(getFocusables(topNodes, withGuards)), true, withGuards); }; var getAllTabbableNodes = function getAllTabbableNodes(topNodes) { return orderByTabIndex(filterFocusable(getFocusables(topNodes)), false); }; var parentAutofocusables = function parentAutofocusables(topNode) { return filterFocusable(getParentAutofocusables(topNode)); }; var isRadio = function isRadio(node) { return node.tagName === 'INPUT' && node.type === 'radio'; }; var findSelectedRadio = function findSelectedRadio(node, nodes) { return nodes.filter(isRadio).filter(function (el) { return el.name === node.name; }).filter(function (el) { return el.checked; })[0] || node; }; var pickFirstFocus = function pickFirstFocus(nodes) { if (nodes[0] && nodes.length > 1) { if (isRadio(nodes[0]) && nodes[0].name) { return findSelectedRadio(nodes[0], nodes); } } return nodes[0]; }; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var filterNested = function filterNested(nodes) { var l = nodes.length; for (var i = 0; i < l; i += 1) { var _loop = function _loop(j) { if (i !== j) { if (nodes[i].contains(nodes[j])) { return { v: filterNested(nodes.filter(function (x) { return x !== nodes[j]; })) }; } } }; for (var j = 0; j < l; j += 1) { var _ret = _loop(j); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } } return nodes; }; var getTopParent = function getTopParent(node) { return node.parentNode ? getTopParent(node.parentNode) : node; }; var getAllAffectedNodes = function getAllAffectedNodes(node) { var nodes = asArray(node); return nodes.filter(Boolean).reduce(function (acc, currentNode) { var group = currentNode.getAttribute(FOCUS_GROUP); acc.push.apply(acc, group ? filterNested(toArray(getTopParent(currentNode).querySelectorAll('[' + FOCUS_GROUP + '="' + group + '"]:not([' + FOCUS_DISABLED + '="disabled"])'))) : [currentNode]); return acc; }, []); }; var findAutoFocused = function findAutoFocused(autoFocusables) { return function (node) { return !!node.autofocus || node.dataset && !!node.dataset.autofocus || autoFocusables.indexOf(node) >= 0; }; }; var newFocus = function newFocus(innerNodes, outerNodes, activeElement, lastNode, autoFocused) { var cnt = innerNodes.length; var firstFocus = innerNodes[0]; var lastFocus = innerNodes[cnt - 1]; // focus is inside if (innerNodes.indexOf(activeElement) >= 0) { return undefined; } var activeIndex = outerNodes.indexOf(activeElement); var lastIndex = outerNodes.indexOf(lastNode || activeIndex); var lastNodeInside = innerNodes.indexOf(lastNode); var indexDiff = activeIndex - lastIndex; var firstNodeIndex = outerNodes.indexOf(firstFocus); var lastNodeIndex = outerNodes.indexOf(lastFocus); // new focus if (activeIndex === -1 || lastNodeInside === -1) { return innerNodes.indexOf(autoFocused.length ? pickFirstFocus(autoFocused) : pickFirstFocus(innerNodes)); } // old focus if (!indexDiff && lastNodeInside >= 0) { return lastNodeInside; } // jump out if (indexDiff && Math.abs(indexDiff) > 1) { return lastNodeInside; } // focus above lock if (activeIndex <= firstNodeIndex) { return cnt - 1; } // focus below lock if (activeIndex > lastNodeIndex) { return 0; } // index is inside tab order, but outside Lock if (indexDiff) { if (Math.abs(indexDiff) > 1) { return lastNodeInside; } return (cnt + lastNodeInside + indexDiff) % cnt; } // do nothing return undefined; }; var getTopCommonParent = function getTopCommonParent(baseActiveElement, leftEntry, rightEntries) { var activeElements = asArray(baseActiveElement); var leftEntries = asArray(leftEntry); var activeElement = activeElements[0]; var topCommon = null; leftEntries.filter(Boolean).forEach(function (entry) { topCommon = getCommonParent(topCommon || entry, entry) || topCommon; rightEntries.filter(Boolean).forEach(function (subEntry) { var common = getCommonParent(activeElement, subEntry); if (common) { if (!topCommon || common.contains(topCommon)) { topCommon = common; } else { topCommon = getCommonParent(common, topCommon); } } }); }); return topCommon; }; var allParentAutofocusables = function allParentAutofocusables(entries) { return entries.reduce(function (acc, node) { return acc.concat(parentAutofocusables(node)); }, []); }; var notAGuard = function notAGuard(node) { return !(node.dataset && node.dataset.focusGuard); }; var reorderNodes = function reorderNodes(srcNodes, dstNodes) { return srcNodes.map(function (dnode) { return dstNodes.find(function (_ref) { var node = _ref.node; return dnode === node; }); }).filter(Boolean); }; var getFocusMerge = function getFocusMerge(topNode, lastNode) { var activeElement = document && document.activeElement; var entries = getAllAffectedNodes(topNode).filter(notAGuard); var commonParent = getTopCommonParent(activeElement || topNode, topNode, entries); var innerElements = getTabbableNodes(entries).filter(function (_ref5) { var node = _ref5.node; return notAGuard(node); }); if (!innerElements[0]) { innerElements = getAllTabbableNodes(entries).filter(function (_ref6) { var node = _ref6.node; return notAGuard(node); }); if (!innerElements[0]) { return undefined; } } var outerNodes = getTabbableNodes([commonParent]).map(function (_ref7) { var node = _ref7.node; return node; }); var orderedInnerElements = reorderNodes(outerNodes, innerElements); var innerNodes = orderedInnerElements.map(function (_ref8) { var node = _ref8.node; return node; }); var newId = newFocus(innerNodes, outerNodes, activeElement, lastNode, innerNodes.filter(findAutoFocused(allParentAutofocusables(entries)))); if (newId === undefined) { return newId; } return orderedInnerElements[newId]; }; var focusInFrame = function focusInFrame(frame) { return frame === document.activeElement; }; var focusInsideIframe = function focusInsideIframe(topNode) { return !!arrayFind(toArray(topNode.querySelectorAll('iframe')), focusInFrame); }; var focusInside = function focusInside(topNode) { var activeElement = document && document.activeElement; if (!activeElement || activeElement.dataset && activeElement.dataset.focusGuard) { return false; } return getAllAffectedNodes(topNode).reduce(function (result, node) { return result || node.contains(activeElement) || focusInsideIframe(node); }, false); }; var focusIsHidden = function focusIsHidden() { return document && toArray(document.querySelectorAll('[' + FOCUS_ALLOW + ']')).some(function (node) { return node.contains(document.activeElement); }); }; var focusOn = function focusOn(target) { target.focus(); if (target.contentWindow) { target.contentWindow.focus(); } }; var guardCount = 0; var lockDisabled = false; var setFocus = (function (topNode, lastNode) { var focusable = getFocusMerge(topNode, lastNode); if (lockDisabled) { return; } if (focusable) { if (guardCount > 2) { // eslint-disable-next-line no-console console.error('FocusLock: focus-fighting detected. Only one focus management system could be active. ' + 'See https://github.com/theKashey/focus-lock/#focus-fighting'); lockDisabled = true; setTimeout(function () { lockDisabled = false; }, 1); return; } guardCount++; focusOn(focusable.node); guardCount--; } }); var lastActiveTrap = 0; var lastActiveFocus = null; var focusOnBody = function focusOnBody() { return document && document.activeElement === document.body; }; var isFreeFocus = function isFreeFocus() { return focusOnBody() || focusIsHidden(); }; var activateTrap = function activateTrap() { var result = false; if (lastActiveTrap) { var observed = lastActiveTrap; if (!isFreeFocus()) { if (observed && !focusInside(observed)) { result = setFocus(observed, lastActiveFocus); } lastActiveFocus = document.activeElement; } } return result; }; var reducePropsToState = function reducePropsToState(propsList) { return propsList.filter(function (node) { return node; }).slice(-1)[0]; }; var handleStateChangeOnClient = function handleStateChangeOnClient(trap) { lastActiveTrap = trap; if (trap) { activateTrap(); } }; var instances = []; var emitChange = function emitChange(event) { if (handleStateChangeOnClient(reducePropsToState(instances))) { event && event.preventDefault(); return true; } return false; }; var attachHandler = function attachHandler() { document.addEventListener('focusin', emitChange); }; var detachHandler = function detachHandler() { document.removeEventListener('focusin', emitChange); }; var focusLock = { on: function on(domNode) { if (instances.length === 0) { attachHandler(); } if (instances.indexOf(domNode) < 0) { instances.push(domNode); emitChange(); } }, off: function off(domNode) { instances = instances.filter(function (node) { return node !== domNode; }); emitChange(); if (instances.length === 0) { detachHandler(); } } }; return focusLock; })); ================================================ FILE: firefox/jquery.js ================================================ /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0" ], "run_at": "document_end", "js": ["focus.js", "jquery.js", "content.js", "virtualized-list.min.js"], "css": ["content.css"] } ], "web_accessible_resources": ["content.html", "newtab.html", "assets/*", "popup.css", "popup.js"], "permissions": [ "tabs", "activeTab", "bookmarks", "browsingData", "history", "search" ] } ================================================ FILE: firefox/newtab.html ================================================ Omni ================================================ FILE: src/assets/nice-select.css ================================================ .nice-select { -webkit-tap-highlight-color: transparent; background-color: #fff; border-radius: 5px; border: solid 1px #e8e8e8; box-sizing: border-box; clear: both; cursor: pointer; display: block; float: left; font-family: inherit; font-size: 14px; font-weight: normal; height: 42px; line-height: 40px; outline: none; padding-left: 18px; padding-right: 30px; position: relative; text-align: left !important; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; white-space: nowrap; width: auto; } .nice-select:hover { border-color: #dbdbdb; } .nice-select:active, .nice-select.open, .nice-select:focus { border-color: #999; } .nice-select:after { border-bottom: 2px solid #999; border-right: 2px solid #999; content: ''; display: block; height: 5px; margin-top: -4px; pointer-events: none; position: absolute; right: 12px; top: 50%; -webkit-transform-origin: 66% 66%; -ms-transform-origin: 66% 66%; transform-origin: 66% 66%; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); -webkit-transition: all 0.15s ease-in-out; transition: all 0.15s ease-in-out; width: 5px; } .nice-select.open:after { -webkit-transform: rotate(-135deg); -ms-transform: rotate(-135deg); transform: rotate(-135deg); } .nice-select.open .list { opacity: 1; pointer-events: auto; -webkit-transform: scale(1) translateY(0); -ms-transform: scale(1) translateY(0); transform: scale(1) translateY(0); } .nice-select.disabled { border-color: #ededed; color: #999; pointer-events: none; } .nice-select.disabled:after { border-color: #cccccc; } .nice-select.wide { width: 100%; } .nice-select.wide .list { left: 0 !important; right: 0 !important; } .nice-select.right { float: right; } .nice-select.right .list { left: auto; right: 0; } .nice-select.small { font-size: 12px; height: 36px; line-height: 34px; } .nice-select.small:after { height: 4px; width: 4px; } .nice-select.small .option { line-height: 34px; min-height: 34px; } .nice-select .list { background-color: #fff; border-radius: 5px; box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11); box-sizing: border-box; margin-top: 4px; opacity: 0; overflow: hidden; padding: 0; pointer-events: none; position: absolute; top: 100%; left: 0; -webkit-transform-origin: 50% 0; -ms-transform-origin: 50% 0; transform-origin: 50% 0; -webkit-transform: scale(0.75) translateY(-21px); -ms-transform: scale(0.75) translateY(-21px); transform: scale(0.75) translateY(-21px); -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out; z-index: 9; } .nice-select .list:hover .option:not(:hover) { background-color: transparent !important; } .nice-select .option { cursor: pointer; font-weight: 400; line-height: 40px; list-style: none; min-height: 40px; outline: none; padding-left: 18px; padding-right: 29px; text-align: left; -webkit-transition: all 0.2s; transition: all 0.2s; } .nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus { background-color: #f6f6f6; } .nice-select .option.selected { font-weight: bold; } .nice-select .option.disabled { background-color: transparent; color: #999; cursor: default; } .no-csspointerevents .nice-select .list { display: none; } .no-csspointerevents .nice-select.open .list { display: block; } ================================================ FILE: src/background.js ================================================ let actions = []; let newtaburl = ""; // Clear actions and append default ones const clearActions = () => { getCurrentTab().then((response) => { actions = []; const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0; let muteaction = {title:"Mute tab", desc:"Mute the current tab", type:"action", action:"mute", emoji:true, emojiChar:"🔇", keycheck:true, keys:['⌥','⇧', 'M']}; let pinaction = {title:"Pin tab", desc:"Pin the current tab", type:"action", action:"pin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']}; if (response.mutedInfo.muted) { muteaction = {title:"Unmute tab", desc:"Unmute the current tab", type:"action", action:"unmute", emoji:true, emojiChar:"🔈", keycheck:true, keys:['⌥','⇧', 'M']}; } if (response.pinned) { pinaction = {title:"Unpin tab", desc:"Unpin the current tab", type:"action", action:"unpin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']}; } actions = [ {title:"New tab", desc:"Open a new tab", type:"action", action:"new-tab", emoji:true, emojiChar:"✨", keycheck:true, keys:['⌘','T']}, {title:"Bookmark", desc:"Create a bookmark", type:"action", action:"create-bookmark", emoji:true, emojiChar:"📕", keycheck:true, keys:['⌘','D']}, pinaction, {title:"Fullscreen", desc:"Make the page fullscreen", type:"action", action:"fullscreen", emoji:true, emojiChar:"🖥", keycheck:true, keys:['⌘', 'Ctrl', 'F']}, muteaction, {title:"Reload", desc:"Reload the page", type:"action", action:"reload", emoji:true, emojiChar:"♻️", keycheck:true, keys:['⌘','⇧', 'R']}, {title:"Help", desc:"Get help with Omni on GitHub", type:"action", action:"url", url:"https://github.com/alyssaxuu/omni", emoji:true, emojiChar:"🤔", keycheck:false}, {title:"Compose email", desc:"Compose a new email", type:"action", action:"email", emoji:true, emojiChar:"✉️", keycheck:true, keys:['⌥','⇧', 'C']}, {title:"Print page", desc:"Print the current page", type:"action", action:"print", emoji:true, emojiChar:"🖨️", keycheck:true, keys:['⌘', 'P']}, {title:"New Notion page", desc:"Create a new Notion page", type:"action", action:"url", url:"https://notion.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-notion.png"), keycheck:false}, {title:"New Sheets spreadsheet", desc:"Create a new Google Sheets spreadsheet", type:"action", action:"url", url:"https://sheets.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-sheets.png"), keycheck:false}, {title:"New Docs document", desc:"Create a new Google Docs document", type:"action", action:"url", emoji:false, url:"https://docs.new", favIconUrl:chrome.runtime.getURL("assets/logo-docs.png"), keycheck:false}, {title:"New Slides presentation", desc:"Create a new Google Slides presentation", type:"action", action:"url", url:"https://slides.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-slides.png"), keycheck:false}, {title:"New form", desc:"Create a new Google Forms form", type:"action", action:"url", url:"https://forms.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-forms.png"), keycheck:false}, {title:"New Medium story", desc:"Create a new Medium story", type:"action", action:"url", url:"https://story.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-medium.png"), keycheck:false}, {title:"New GitHub repository", desc:"Create a new GitHub repository", type:"action", action:"url", url:"https://github.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-github.png"), keycheck:false}, {title:"New GitHub gist", desc:"Create a new GitHub gist", type:"action", action:"url", url:"https://gist.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-github.png"), keycheck:false}, {title:"New CodePen pen", desc:"Create a new CodePen pen", type:"action", action:"url", url:"https://pen.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-codepen.png"), keycheck:false}, {title:"New Excel spreadsheet", desc:"Create a new Excel spreadsheet", type:"action", action:"url", url:"https://excel.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-excel.png"), keycheck:false}, {title:"New PowerPoint presentation", desc:"Create a new PowerPoint presentation", type:"action", url:"https://powerpoint.new", action:"url", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-powerpoint.png"), keycheck:false}, {title:"New Word document", desc:"Create a new Word document", type:"action", action:"url", url:"https://word.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-word.png"), keycheck:false}, {title:"Create a whiteboard", desc:"Create a collaborative whiteboard", type:"action", action:"url", url:"https://whiteboard.new", emoji:true, emojiChar:"🧑‍🏫", keycheck:false}, {title:"Record a video", desc:"Record and edit a video", type:"action", action:"url", url:"https://recording.new", emoji:true, emojiChar:"📹", keycheck:false}, {title:"Create a Figma file", desc:"Create a new Figma file", type:"action", action:"url", url:"https://figma.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-figma.png"), keycheck:false}, {title:"Create a FigJam file", desc:"Create a new FigJam file", type:"action", action:"url", url:"https://figjam.new", emoji:true, emojiChar:"🖌", keycheck:false}, {title:"Hunt a product", desc:"Submit a product to Product Hunt", type:"action", action:"url", url:"https://www.producthunt.com/posts/new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-producthunt.png"), keycheck:false}, {title:"Make a tweet", desc:"Make a tweet on Twitter", type:"action", action:"url", url:"https://twitter.com/intent/tweet", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-twitter.png"), keycheck:false}, {title:"Create a playlist", desc:"Create a Spotify playlist", type:"action", action:"url", url:"https://playlist.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-spotify.png"), keycheck:false}, {title:"Create a Canva design", desc:"Create a new design with Canva", type:"action", action:"url", url:"https://design.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-canva.png"), keycheck:false}, {title:"Create a new podcast episode", desc:"Create a new podcast episode with Anchor", type:"action", action:"url", url:"https://episode.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-anchor.png"), keycheck:false}, {title:"Edit an image", desc:"Edit an image with Adobe Photoshop", type:"action", action:"url", url:"https://photo.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-photoshop.png"), keycheck:false}, {title:"Convert to PDF", desc:"Convert a file to PDF", type:"action", action:"url", url:"https://pdf.new", emoji:true, emojiChar:"📄", keycheck:false}, {title:"Scan a QR code", desc:"Scan a QR code with your camera", type:"action", action:"url", url:"https://scan.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-qr.png"), keycheck:false}, {title:"Add a task to Asana", desc:"Create a new task in Asana", type:"action", action:"url", url:"https://task.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-asana.png"), keycheck:false}, {title:"Add an issue to Linear", desc:"Create a new issue in Linear", type:"action", action:"url", url:"https://linear.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-linear.png"), keycheck:false}, {title:"Add a task to WIP", desc:"Create a new task in WIP", type:"action", action:"url", url:"https://todo.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-wip.png"), keycheck:false}, {title:"Create an event", desc:"Add an event to Google Calendar", type:"action", action:"url", url:"https://cal.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-calendar.png"), keycheck:false}, {title:"Add a note", desc:"Add a note to Google Keep", type:"action", action:"url", emoji:false, url:"https://note.new", favIconUrl:chrome.runtime.getURL("assets/logo-keep.png"), keycheck:false}, {title:"New meeting", desc:"Start a Google Meet meeting", type:"action", action:"url", emoji:false, url:"https://meet.new", favIconUrl:chrome.runtime.getURL("assets/logo-meet.png"), keycheck:false}, {title:"Browsing history", desc:"Browse through your browsing history", type:"action", action:"history", emoji:true, emojiChar:"🗂", keycheck:true, keys:['⌘','Y']}, {title:"Incognito mode", desc:"Open an incognito window", type:"action", action:"incognito", emoji:true, emojiChar:"🕵️", keycheck:true, keys:['⌘','⇧', 'N']}, {title:"Downloads", desc:"Browse through your downloads", type:"action", action:"downloads", emoji:true, emojiChar:"📦", keycheck:true, keys:['⌘','⇧', 'J']}, {title:"Extensions", desc:"Manage your Chrome Extensions", type:"action", action:"extensions", emoji:true, emojiChar:"🧩", keycheck:false, keys:['⌘','D']}, {title:"Chrome settings", desc:"Open the Chrome settings", type:"action", action:"settings", emoji:true, emojiChar:"⚙️", keycheck:true, keys:['⌘',',']}, {title:"Scroll to bottom", desc:"Scroll to the bottom of the page", type:"action", action:"scroll-bottom", emoji:true, emojiChar:"👇", keycheck:true, keys:['⌘','↓']}, {title:"Scroll to top", desc:"Scroll to the top of the page", type:"action", action:"scroll-top", emoji:true, emojiChar:"👆", keycheck:true, keys:['⌘','↑']}, {title:"Go back", desc:"Go back in history for the current tab", type:"action", action:"go-back", emoji:true, emojiChar:"👈", keycheck:true, keys:['⌘','←']}, {title:"Go forward", desc:"Go forward in history for the current tab", type:"action", action:"go-forward", emoji:true, emojiChar:"👉", keycheck:true, keys:['⌘','→']}, {title:"Duplicate tab", desc:"Make a copy of the current tab", type:"action", action:"duplicate-tab", emoji:true, emojiChar:"📋", keycheck:true, keys:['⌥','⇧', 'D']}, {title:"Close tab", desc:"Close the current tab", type:"action", action:"close-tab", emoji:true, emojiChar:"🗑", keycheck:true, keys:['⌘','W']}, {title:"Close window", desc:"Close the current window", type:"action", action:"close-window", emoji:true, emojiChar:"💥", keycheck:true, keys:['⌘','⇧', 'W']}, {title:"Manage browsing data", desc:"Manage your browsing data", type:"action", action:"manage-data", emoji:true, emojiChar:"🔬", keycheck:true, keys:['⌘','⇧', 'Delete']}, {title:"Clear all browsing data", desc:"Clear all of your browsing data", type:"action", action:"remove-all", emoji:true, emojiChar:"🧹", keycheck:false, keys:['⌘','D']}, {title:"Clear browsing history", desc:"Clear all of your browsing history", type:"action", action:"remove-history", emoji:true, emojiChar:"🗂", keycheck:false, keys:['⌘','D']}, {title:"Clear cookies", desc:"Clear all cookies", type:"action", action:"remove-cookies", emoji:true, emojiChar:"🍪", keycheck:false, keys:['⌘','D']}, {title:"Clear cache", desc:"Clear the cache", type:"action", action:"remove-cache", emoji:true, emojiChar:"🗄", keycheck:false, keys:['⌘','D']}, {title:"Clear local storage", desc:"Clear the local storage", type:"action", action:"remove-local-storage", emoji:true, emojiChar:"📦", keycheck:false, keys:['⌘','D']}, {title:"Clear passwords", desc:"Clear all saved passwords", type:"action", action:"remove-passwords", emoji:true, emojiChar:"🔑", keycheck:false, keys:['⌘','D']}, ]; if (!isMac) { for (action of actions) { switch (action.action) { case "reload": action.keys = ['F5']; break; case "fullscreen": action.keys = ['F11']; break; case "downloads": action.keys = ['Ctrl', 'J']; break; case "settings": action.keycheck = false; break; case "history": action.keys = ['Ctrl', 'H']; break; case "go-back": action.keys = ['Alt','←']; break; case "go-forward": action.keys = ['Alt','→'] break; case "scroll-top": action.keys = ['Home']; break; case "scroll-bottom": action.keys = ['End']; break; } for (const key in action.keys) { if (action.keys[key] === "⌘") { action.keys[key] = "Ctrl"; } else if (action.keys[key] === "⌥") { action.keys[key] = "Alt"; } }; }; } }); } // Open on install chrome.runtime.onInstalled.addListener((object) => { // Inject Omni on install const manifest = chrome.runtime.getManifest(); const injectIntoTab = (tab) => { const scripts = manifest.content_scripts[0].js; const s = scripts.length; for (let i = 0; i < s; i++) { chrome.scripting.executeScript({ target: { tabId: tab.id }, files: [scripts[i]], }); } chrome.scripting.insertCSS({ target: { tabId: tab.id }, files: [manifest.content_scripts[0].css[0]], }); }; // Get all windows chrome.windows.getAll( { populate: true, }, (windows) => { let currentWindow; const w = windows.length; for (let i = 0; i < w; i++) { currentWindow = windows[i]; let currentTab; const t = currentWindow.tabs.length; for (let j = 0; j < t; j++) { currentTab = currentWindow.tabs[j]; if (!currentTab.url.includes("chrome://") && !currentTab.url.includes("chrome-extension://") && !currentTab.url.includes("chrome.google.com")) { injectIntoTab(currentTab); } } } } ); if (object.reason === "install") { chrome.tabs.create({ url: "https://alyssax.com/omni/" }); } }); // Check when the extension button is clicked chrome.action.onClicked.addListener((tab) => { chrome.tabs.sendMessage(tab.id, {request: "open-omni"}); }); // Listen for the open omni shortcut chrome.commands.onCommand.addListener((command) => { if (command === "open-omni") { getCurrentTab().then((response) => { if (!response.url.includes("chrome://") && !response.url.includes("chrome.google.com")) { chrome.tabs.sendMessage(response.id, {request: "open-omni"}); } else { chrome.tabs.create({ url: "./newtab.html" }).then(() => { newtaburl = response.url; chrome.tabs.remove(response.id); }) } }); } }); // Get the current tab const getCurrentTab = async () => { const queryOptions = { active: true, currentWindow: true }; const [tab] = await chrome.tabs.query(queryOptions); return tab; } // Restore the new tab page (workaround to show Omni in new tab page) function restoreNewTab() { getCurrentTab().then((response) => { chrome.tabs.create({ url: newtaburl }).then(() => { chrome.tabs.remove(response.id); }) }) } const resetOmni = () => { clearActions(); getTabs(); getBookmarks(); var search = [ {title:"Search", desc:"Search for a query", type:"action", action:"search", emoji:true, emojiChar:"🔍", keycheck:false}, {title:"Search", desc:"Go to website", type:"action", action:"goto", emoji:true, emojiChar:"🔍", keycheck:false} ]; actions = search.concat(actions); } // Check if tabs have changed and actions need to be fetched again chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => resetOmni()); chrome.tabs.onCreated.addListener((tab) => resetOmni()); chrome.tabs.onRemoved.addListener((tabId, changeInfo) => resetOmni()); // Get tabs to populate in the actions const getTabs = () => { chrome.tabs.query({}, (tabs) => { tabs.forEach((tab) => { tab.desc = "Chrome tab"; tab.keycheck = false; tab.action = "switch-tab"; tab.type = "tab"; }) actions = tabs.concat(actions); }); } // Get bookmarks to populate in the actions const getBookmarks = () => { const process_bookmark = (bookmarks) => { for (const bookmark of bookmarks) { if (bookmark.url) { actions.push({title:bookmark.title, desc:"Bookmark", id:bookmark.id, url:bookmark.url, type:"bookmark", action:"bookmark", emoji:true, emojiChar:"⭐️", keycheck:false}) } if (bookmark.children) { process_bookmark(bookmark.children); } } } chrome.bookmarks.getRecent(100, process_bookmark); } // Lots of different actions const switchTab = (tab) => { chrome.tabs.highlight({ tabs: tab.index, windowId: tab.windowId }) chrome.windows.update( tab.windowId, { focused: true } ) } const goBack = (tab) => { chrome.tabs.goBack({ tabs: tab.index }) } const goForward = (tab) => { chrome.tabs.goForward({ tabs: tab.index }) } const duplicateTab = (tab) => { getCurrentTab().then((response) => { chrome.tabs.duplicate(response.id); }) } const createBookmark = (tab) => { getCurrentTab().then((response) => { chrome.bookmarks.create({ title: response.title, url: response.url }); }) } const muteTab = (mute) =>{ getCurrentTab().then((response) => { chrome.tabs.update(response.id, {"muted": mute}) }); } const reloadTab = () => { chrome.tabs.reload(); } const pinTab = (pin) => { getCurrentTab().then((response) => { chrome.tabs.update(response.id, {"pinned": pin}) }); } const clearAllData = () => { chrome.browsingData.remove({ "since": (new Date()).getTime() }, { "appcache": true, "cache": true, "cacheStorage": true, "cookies": true, "downloads": true, "fileSystems": true, "formData": true, "history": true, "indexedDB": true, "localStorage": true, "passwords": true, "serviceWorkers": true, "webSQL": true }); } const clearBrowsingData = () => { chrome.browsingData.removeHistory({"since": 0}); } const clearCookies = () =>{ chrome.browsingData.removeCookies({"since": 0}); } const clearCache = () => { chrome.browsingData.removeCache({"since": 0}); } const clearLocalStorage = () => { chrome.browsingData.removeLocalStorage({"since": 0}); } const clearPasswords = () => { chrome.browsingData.removePasswords({"since": 0}); } const openChromeUrl = (url) => { chrome.tabs.create({url: 'chrome://'+url+'/'}); } const openIncognito = () => { chrome.windows.create({"incognito": true}); } const closeWindow = (id) => { chrome.windows.remove(id); } const closeTab = (tab) => { chrome.tabs.remove(tab.id); } const closeCurrentTab = () => { getCurrentTab().then(closeTab) } const removeBookmark = (bookmark) => { chrome.bookmarks.remove(bookmark.id); } // Receive messages from any tab chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { switch (message.request) { case "get-actions": resetOmni(); sendResponse({actions: actions}); break; case "switch-tab": switchTab(message.tab); break; case "go-back": goBack(message.tab); break; case "go-forward": goForward(message.tab); break; case "duplicate-tab": duplicateTab(message.tab); break; case "create-bookmark": createBookmark(message.tab); break; case "mute": muteTab(true); break; case "unmute": muteTab(false); break; case "reload": reloadTab(); break; case "pin": pinTab(true); break; case "unpin": pinTab(false); break; case "remove-all": clearAllData(); break; case "remove-history": clearBrowsingData(); break; case "remove-cookies": clearCookies(); break; case "remove-cache": clearCache(); break; case "remove-local-storage": clearLocalStorage(); break; case "remove-passwords": clearPasswords(); case "history": // Fallthrough case "downloads": case "extensions": case "settings": case "extensions/shortcuts": openChromeUrl(message.request); break; case "manage-data": openChromeUrl("settings/clearBrowserData"); break; case "incognito": openIncognito(); break; case "close-window": closeWindow(sender.tab.windowId); break; case "close-tab": closeCurrentTab(); break; case "search-history": chrome.history.search({text:message.query, maxResults:0, startTime:0}).then((data) => { data.forEach((action, index) => { action.type = "history"; action.emoji = true; action.emojiChar = "🏛"; action.action = "history"; action.keyCheck = false; }); sendResponse({history:data}); }) return true; case "search-bookmarks": chrome.bookmarks.search({query:message.query}).then((data) => { // The index property of the bookmark appears to be causing issues, iterating separately... data.filter(x => x.index == 0).forEach((action, index) => { if (!action.url) { data.splice(index, 1); } action.type = "bookmark"; action.emoji = true; action.emojiChar = "⭐️"; action.action = "bookmark"; action.keyCheck = false; }) data.forEach((action, index) => { if (!action.url) { data.splice(index, 1); } action.type = "bookmark"; action.emoji = true; action.emojiChar = "⭐️"; action.action = "bookmark"; action.keyCheck = false; }) sendResponse({bookmarks:data}); }) return true; case "remove": if (message.type == "bookmark") { removeBookmark(message.action); } else { closeTab(message.action); } break; case "search": chrome.search.query( {text:message.query} ) break; case "restore-new-tab": restoreNewTab(); break; case "close-omni": getCurrentTab().then((response) => { chrome.tabs.sendMessage(response.id, {request: "close-omni"}); }); break; } }); // Get actions resetOmni(); ================================================ FILE: src/content.css ================================================ /* Scrollbar size */ .omni-extension ::-webkit-scrollbar { width: 10px; height: 10px; } .omni-extension ::-webkit-scrollbar-thumb { background-color: rgba(127, 127, 127, 0.6); background-clip: padding-box; border: 2px solid transparent; border-radius: 5px; } .omni-extension ::-webkit-scrollbar-thumb:vertical:hover, .omni-extension ::-webkit-scrollbar-thumb:horizontal:hover { background-color: rgb(110, 110, 110); } .omni-extension ::-webkit-scrollbar-track { background-color: transparent; } .omni-extension ::-webkit-scrollbar-thumb:vertical:active, .omni-extension ::-webkit-scrollbar-thumb:horizontal:active { background: rgba(95, 91, 91, 1); } .omni-extension ::-webkit-scrollbar-corner { background: none; } @media (prefers-color-scheme: dark) { .omni-extension { --background: #1e2128; --border: #35373e; --text: #f1f1f1; --text-2: #c5c6ca; --text-3: #a5a5ae; --select: #17191e; --accent: #6068d2; --accent-hover: #484fac; --shortcut: #383e4a; --placeholder: #63687b; --background-2: #292d36; } } @media (prefers-color-scheme: light) { .omni-extension { --background: #fafcff; --border: #f2f3fb; --text: #2b2d41; --text-2: #2b2d41; --text-3: #929db2; --select: #eff3f9; --accent: #6068d2; --accent-hover: #484fac; --shortcut: #dadeea; --placeholder: #bac2d1; --background-2: #292d36; } } @font-face { font-family: "Inter"; font-style: normal; font-weight: 400; src: url("chrome-extension://__MSG_@@extension_id__/assets/Inter-Regular.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 500; src: url("chrome-extension://__MSG_@@extension_id__/assets/Inter-Medium.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 600; src: url("chrome-extension://__MSG_@@extension_id__/assets/Inter-SemiBold.ttf"); } @font-face { font-family: "Inter"; font-style: normal; font-weight: 700; src: url("chrome-extension://__MSG_@@extension_id__/assets/Inter-Bold.ttf"); } .omni-extension * { display: block; width: unset; box-shadow: unset; padding: unset; margin: unset; background-color: unset; border-radius: unset; } .omni-extension .omni-item-details * { line-height: normal; } .omni-extension { font-family: Inter !important; z-index: 99999999999; } .omni-extension #omni-wrap { position: fixed; width: 700px; border: 1px solid transparent; border-radius: 5px; margin: auto; top: 0px; right: 0px; bottom: 0px; left: 0px; z-index: 9999999999; height: 540px; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); pointer-events: all; } .omni-extension #omni { position: absolute; width: 100%; background: var(--background); border: 1px solid var(--border); border-radius: 5px; top: 0px; left: 0px; z-index: 9999999998; height: fit-content; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); display: block; } .omni-closing #omni { transform: scale(0.9); opacity: 0; } .omni-closing { pointer-events: none; display: none !important; } .omni-extension #omni-overlay { height: 100%; width: 100%; position: fixed; top: 0px; left: 0px; background-color: #000; z-index: 9999; opacity: 0.6; transition: all 0.1s cubic-bezier(0.05, 0.03, 0.35, 1); } .omni-closing #omni-overlay { opacity: 0 !important; } .omni-extension #omni-head { height: 50px; line-height: 50px; width: 95%; margin-left: auto; margin-right: auto; border-bottom: 1px solid var(--border); } .omni-extension #omni-name { color: var(--text); font-size: 12px; font-weight: 600; float: left; } .omni-extension #omni-close { color: var(--text-3); float: right; font-size: 12px; font-weight: 500; } .omni-extension #omni-close span { margin-left: 3px; } .omni-extension .omni-shortcut { display: inline-block !important; font-size: 13px; border-radius: 5px; background-color: var(--shortcut); color: var(--text); text-align: center; height: 20px; line-height: 20px; min-width: 20px; padding-left: 3px; padding-right: 3px; } .omni-extension input { background: transparent; border: 0px; outline: none; font-size: 20px; font-weight: 400; height: 50px; width: 92%; margin-left: auto; margin-right: auto; display: block; color: var(--text); caret-color: var(--accent); font-family: Inter !important; margin-top: 5px; margin-bottom: 5px; box-sizing: border-box; outline: none; border: 0px; box-shadow: none; } .omni-extension ::placeholder { color: var(--placeholder); opacity: 1; } .omni-extension :-ms-input-placeholder { color: var(--placeholder); } .omni-extension ::-ms-input-placeholder { color: var(--placeholder); } .omni-extension #omni-list { width: 100%; overflow: overlay; height: 100%; max-height: 400px; border-top: 1px solid var(--border); position: relative; } .omni-extension .omni-item { height: 60px; width: 100%; } .omni-extension .omni-item:hover { cursor: pointer; } .omni-extension .omni-item-active { background-color: var(--select); position: relative; } .omni-extension .omni-item-active:before { height: 100%; position: absolute; display: block; content: ""; width: 2px; background-color: var(--accent); } .omni-extension .omni-select { float: right; vertical-align: middle; color: var(--text-3); font-size: 12px; font-weight: 500; display: none; margin-top: 20px; margin-right: 5%; } .omni-extension .omni-select span { margin-left: 3px; } .omni-extension .omni-item-active .omni-select { display: block !important; } .omni-extension .omni-icon { width: 20px; height: 20px; margin-left: 5%; display: inline-block; vertical-align: middle; margin-top: -12px; } .omni-extension .omni-emoji-action { display: inline-block; vertical-align: middle; margin-top: -12px; width: 20px; height: 20px; text-align: center; margin-left: 5%; font-size: 18px; } .omni-extension .omni-item-details { display: inline-block !important; margin-left: 10px; vertical-align: middle; margin-top: 10px; } .omni-extension .omni-item-name { color: var(--text-2); font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 460px; } .omni-extension .omni-item-active .omni-item-name { color: var(--text) !important; } .omni-extension .omni-item-desc { color: var(--text-3); margin-top: 5px; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 460px; } .omni-extension #omni-footer { height: 45px; line-height: 45px; border-top: 1px solid var(--border); width: 92%; margin-left: auto; margin-right: auto; } .omni-extension #omni-results { color: var(--text-3); font-size: 12px; font-weight: 500; float: left; } .omni-extension #omni-arrows { color: var(--text-3); font-size: 12px; font-weight: 500; float: right; } .omni-extension #omni-arrows span { margin-left: 3px; margin-right: 3px; } .omni-extension .omni-keys { float: right; vertical-align: middle; font-weight: 500; margin-top: 20px; margin-right: 5%; } .omni-extension .omni-item-active .omni-keys { display: none !important; } .omni-extension .omni-keys span { margin-left: 3px; } #omni-extension-toast { text-align: center; font-family: Inter; font-weight: 500; font-size: 14px; position: fixed; width: fit-content; color: var(--text); bottom: 10px; left: 0px; right: 0px; margin: auto; background: var(--background); border-radius: 5px; height: 40px; line-height: 40px; display: block; padding-left: 10px; padding-right: 10px; visibility: hidden; opacity: 0; transition: all 0.2s cubic-bezier(0.05, 0.03, 0.35, 1); z-index: 99999999; } #omni-extension-toast img { display: inline-block; margin-right: 5px; vertical-align: middle; margin-bottom: 2px; } .omni-show-toast { bottom: 20px !important; opacity: 1 !important; visibility: visible !important; } ================================================ FILE: src/content.html ================================================
The action has been successful
================================================ FILE: src/content.js ================================================ // Workaround to capture Esc key on certain sites var isOpen = false; document.onkeyup = (e) => { if (e.key == "Escape" && isOpen) { chrome.runtime.sendMessage({request:"close-omni"}) } } $(document).ready(() => { var actions = []; var isFiltered = false; // Append the omni into the current page $.get(chrome.runtime.getURL('/content.html'), (data) => { $(data).appendTo('body'); // Get checkmark image for toast $("#omni-extension-toast img").attr("src", chrome.runtime.getURL("assets/check.svg")); // Request actions from the background chrome.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; }); // New tab page workaround if (window.location.href == "chrome-extension://mpanekjjajcabgnlbabmopeenljeoggm/newtab.html") { isOpen = true; $("#omni-extension").removeClass("omni-closing"); window.setTimeout(() => { $("#omni-extension input").focus(); }, 100); } }); function renderAction(action, index, keys, img) { var skip = ""; if (action.action == "search" || action.action == "goto") { skip = "style='display:none'"; } if (index != 0) { $("#omni-extension #omni-list").append("
"+img+"
"+action.title+"
"+action.desc+"
"+keys+"
Select
"); } else { $("#omni-extension #omni-list").append("
"+img+"
"+action.title+"
"+action.desc+"
"+keys+"
Select
"); } if (!action.emoji) { var loadimg = new Image(); loadimg.src = action.favIconUrl; // Favicon doesn't load, use a fallback loadimg.onerror = () => { $(".omni-item[data-index='"+index+"'] img").attr("src", chrome.runtime.getURL("/assets/globe.svg")); } } } // Add actions to the omni function populateOmni() { $("#omni-extension #omni-list").html(""); actions.forEach((action, index) => { var keys = ""; if (action.keycheck) { keys = "
"; action.keys.forEach(function(key){ keys += ""+key+""; }); keys += "
"; } // Check if the action has an emoji or a favicon if (!action.emoji) { var onload = 'if ("naturalHeight" in this) {if (this.naturalHeight + this.naturalWidth === 0) {this.onerror();return;}} else if (this.width + this.height == 0) {this.onerror();return;}'; var img = "favicon"; renderAction(action, index, keys, img); } else { var img = ""+action.emojiChar+""; renderAction(action, index, keys, img); } }) $(".omni-extension #omni-results").html(actions.length+" results"); } // Add filtered actions to the omni function populateOmniFilter(actions) { isFiltered = true; $("#omni-extension #omni-list").html(""); const renderRow = (index) => { const action = actions[index] var keys = ""; if (action.keycheck) { keys = "
"; action.keys.forEach(function(key){ keys += ""+key+""; }); keys += "
"; } var img = "favicon"; if (action.emoji) { img = ""+action.emojiChar+"" } if (index != 0) { return $("
"+img+"
"+action.title+"
"+action.url+"
"+keys+"
Select
")[0] } else { return $("
"+img+"
"+action.title+"
"+action.url+"
"+keys+"
Select
")[0] } } actions.length && new VirtualizedList.default($("#omni-extension #omni-list")[0], { height: 400, rowHeight: 60, rowCount: actions.length, renderRow, onMount: () => $(".omni-extension #omni-results").html(actions.length+" results"), }); } // Open the omni function openOmni() { chrome.runtime.sendMessage({request:"get-actions"}, (response) => { isOpen = true; actions = response.actions; $("#omni-extension input").val(""); populateOmni(); $("html, body").stop(); $("#omni-extension").removeClass("omni-closing"); window.setTimeout(() => { $("#omni-extension input").focus(); focusLock.on($("#omni-extension input").get(0)); $("#omni-extension input").focus(); }, 100); }); } // Close the omni function closeOmni() { if (window.location.href == "chrome-extension://mpanekjjajcabgnlbabmopeenljeoggm/newtab.html") { chrome.runtime.sendMessage({request:"restore-new-tab"}); } else { isOpen = false; $("#omni-extension").addClass("omni-closing"); } } // Hover over an action in the omni function hoverItem() { $(".omni-item-active").removeClass("omni-item-active"); $(this).addClass("omni-item-active"); } // Show a toast when an action has been performed function showToast(action) { $("#omni-extension-toast span").html('"'+action.title+'" has been successfully performed'); $("#omni-extension-toast").addClass("omni-show-toast"); setTimeout(() => { $(".omni-show-toast").removeClass("omni-show-toast"); }, 3000) } // Autocomplete commands. Since they all start with different letters, it can be the default behavior function checkShortHand(e, value) { var el = $(".omni-extension input"); if (e.keyCode != 8) { if (value == "/t") { el.val("/tabs ") } else if (value == "/b") { el.val("/bookmarks ") } else if (value == "/h") { el.val("/history "); } else if (value == "/r") { el.val("/remove "); } else if (value == "/a") { el.val("/actions "); } } else { if (value == "/tabs" || value == "/bookmarks" || value == "/actions" || value == "/remove" || value == "/history") { el.val(""); } } } // Add protocol function addhttp(url) { if (!/^(?:f|ht)tps?\:\/\//.test(url)) { url = "http://" + url; } return url; } // Check if valid url function validURL(str) { var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-a-z\\d_]*)?$','i'); // fragment locator return !!pattern.test(str); } // Search for an action in the omni function search(e) { if (e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40 || e.keyCode == 13 || e.keyCode == 37) { return; } var value = $(this).val().toLowerCase(); checkShortHand(e, value); value = $(this).val().toLowerCase(); if (value.startsWith("/history")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/history ", ""); var query = ""; if (tempvalue != "/history") { query = value.replace("/history ", ""); } chrome.runtime.sendMessage({request:"search-history", query:query}, (response) => { populateOmniFilter(response.history); }); } else if (value.startsWith("/bookmarks")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/bookmarks ", ""); if (tempvalue != "/bookmarks" && tempvalue != "") { var query = value.replace("/bookmarks ", ""); chrome.runtime.sendMessage({request:"search-bookmarks", query:query}, (response) => { populateOmniFilter(response.bookmarks); }); } else { populateOmniFilter(actions.filter(x => x.type == "bookmark")); } } else { if (isFiltered) { populateOmni(); isFiltered = false; } $(".omni-extension #omni-list .omni-item").filter(function(){ if (value.startsWith("/tabs")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/tabs ", ""); if (tempvalue == "/tabs") { $(this).toggle($(this).attr("data-type") == "tab"); } else { tempvalue = value.replace("/tabs ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "tab"); } } else if (value.startsWith("/remove")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/remove ", "") if (tempvalue == "/remove") { $(this).toggle($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab"); } else { tempvalue = value.replace("/remove ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && ($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab")); } } else if (value.startsWith("/actions")) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); var tempvalue = value.replace("/actions ", "") if (tempvalue == "/actions") { $(this).toggle($(this).attr("data-type") == "action"); } else { tempvalue = value.replace("/actions ", ""); $(this).toggle(($(this).find(".omni-item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "action"); } } else { $(this).toggle($(this).find(".omni-item-name").text().toLowerCase().indexOf(value) > -1 || $(this).find(".omni-item-desc").text().toLowerCase().indexOf(value) > -1); if (value == "") { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); } else if (!validURL(value)) { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").show(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"'] .omni-item-name").html('\"'+value+'\"'); } else { $(".omni-item[data-index='"+actions.findIndex(x => x.action == "search")+"']").hide(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"']").show(); $(".omni-item[data-index='"+actions.findIndex(x => x.action == "goto")+"'] .omni-item-name").html(value); } } }); } $(".omni-extension #omni-results").html($("#omni-extension #omni-list .omni-item:visible").length+" results"); $(".omni-item-active").removeClass("omni-item-active"); $(".omni-extension #omni-list .omni-item:visible").first().addClass("omni-item-active"); } // Handle actions from the omni function handleAction(e) { var action = actions[$(".omni-item-active").attr("data-index")]; closeOmni(); if ($(".omni-extension input").val().toLowerCase().startsWith("/remove")) { chrome.runtime.sendMessage({request:"remove", type:action.type, action:action}); } else if ($(".omni-extension input").val().toLowerCase().startsWith("/history")) { if (e.ctrlKey || e.metaKey) { window.open($(".omni-item-active").attr("data-url")); } else { window.open($(".omni-item-active").attr("data-url"), "_self"); } } else if ($(".omni-extension input").val().toLowerCase().startsWith("/bookmarks")) { if (e.ctrlKey || e.metaKey) { window.open($(".omni-item-active").attr("data-url")); } else { window.open($(".omni-item-active").attr("data-url"), "_self"); } } else { chrome.runtime.sendMessage({request:action.action, tab:action, query:$(".omni-extension input").val()}); switch (action.action) { case "bookmark": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "scroll-bottom": window.scrollTo(0,document.body.scrollHeight); showToast(action); break; case "scroll-top": window.scrollTo(0,0); break; case "navigation": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "fullscreen": var elem = document.documentElement; elem.requestFullscreen(); break; case "new-tab": window.open(""); break; case "email": window.open("mailto:"); break; case "url": if (e.ctrlKey || e.metaKey) { window.open(action.url); } else { window.open(action.url, "_self"); } break; case "goto": if (e.ctrlKey || e.metaKey) { window.open(addhttp($(".omni-extension input").val())); } else { window.open(addhttp($(".omni-extension input").val()), "_self"); } break; case "print": window.print(); break; case "remove-all": case "remove-history": case "remove-cookies": case "remove-cache": case "remove-local-storage": case "remove-passwords": showToast(action); break; } } // Fetch actions again chrome.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } // Customize the shortcut to open the Omni box function openShortcuts() { chrome.runtime.sendMessage({request:"extensions/shortcuts"}); } // Check which keys are down var down = []; $(document).keydown((e) => { down[e.keyCode] = true; if (down[38]) { // Up key if ($(".omni-item-active").prevAll("div").not(":hidden").first().length) { var previous = $(".omni-item-active").prevAll("div").not(":hidden").first(); $(".omni-item-active").removeClass("omni-item-active"); previous.addClass("omni-item-active"); previous[0].scrollIntoView({block:"nearest", inline:"nearest"}); } } else if (down[40]) { // Down key if ($(".omni-item-active").nextAll("div").not(":hidden").first().length) { var next = $(".omni-item-active").nextAll("div").not(":hidden").first(); $(".omni-item-active").removeClass("omni-item-active"); next.addClass("omni-item-active"); next[0].scrollIntoView({block:"nearest", inline:"nearest"}); } } else if (down[27] && isOpen) { // Esc key closeOmni(); } else if (down[13] && isOpen) { // Enter key handleAction(e); } }).keyup((e) => { if (down[18] && down[16] && down[80]) { if (actions.find(x => x.action == "pin") != undefined) { chrome.runtime.sendMessage({request:"pin-tab"}); } else { chrome.runtime.sendMessage({request:"unpin-tab"}); } chrome.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } else if (down[18] && down[16] && down[77]) { if (actions.find(x => x.action == "mute") != undefined) { chrome.runtime.sendMessage({request:"mute-tab"}); } else { chrome.runtime.sendMessage({request:"unmute-tab"}); } chrome.runtime.sendMessage({request:"get-actions"}, (response) => { actions = response.actions; populateOmni(); }); } else if (down[18] && down[16] && down[67]) { window.open("mailto:"); } down = []; }); // Recieve messages from background chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.request == "open-omni") { if (isOpen) { closeOmni(); } else { openOmni(); } } else if (message.request == "close-omni") { closeOmni(); } }); $(document).on("click", "#open-page-omni-extension-thing", openShortcuts); $(document).on("mouseover", ".omni-extension .omni-item:not(.omni-item-active)", hoverItem); $(document).on("keyup", ".omni-extension input", search); $(document).on("click", ".omni-item-active", handleAction); $(document).on("click", ".omni-extension #omni-overlay", closeOmni); }); ================================================ FILE: src/focus.js ================================================ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.focusLock = factory()); }(this, function () { 'use strict'; var toArray = function toArray(a) { var ret = Array(a.length); for (var i = 0; i < a.length; ++i) { ret[i] = a[i]; } return ret; }; var arrayFind = function arrayFind(array, search) { return array.filter(function (a) { return a === search; })[0]; }; var asArray = function asArray(a) { return Array.isArray(a) ? a : [a]; }; var tabSort = function tabSort(a, b) { var tabDiff = a.tabIndex - b.tabIndex; var indexDiff = a.index - b.index; if (tabDiff) { if (!a.tabIndex) return 1; if (!b.tabIndex) return -1; } return tabDiff || indexDiff; }; var orderByTabIndex = function orderByTabIndex(nodes, filterNegative, keepGuards) { return toArray(nodes).map(function (node, index) { return { node: node, index: index, tabIndex: keepGuards && node.tabIndex === -1 ? (node.dataset || {}).focusGuard ? 0 : -1 : node.tabIndex }; }).filter(function (data) { return !filterNegative || data.tabIndex >= 0; }).sort(tabSort); }; var tabbables = ['button:enabled:not([readonly])', 'select:enabled:not([readonly])', 'textarea:enabled:not([readonly])', 'input:enabled:not([readonly])', 'a[href]', 'area[href]', 'iframe', 'object', 'embed', '[tabindex]', '[contenteditable]', '[autofocus]']; var FOCUS_GROUP = 'data-focus-lock'; var FOCUS_DISABLED = 'data-focus-lock-disabled'; var FOCUS_ALLOW = 'data-no-focus-lock'; var FOCUS_AUTO = 'data-autofocus-inside'; var queryTabbables = tabbables.join(','); var queryGuardTabbables = queryTabbables + ', [data-focus-guard]'; var getFocusables = function getFocusables(parents, withGuards) { return parents.reduce(function (acc, parent) { return acc.concat( // add all tabbables inside toArray(parent.querySelectorAll(withGuards ? queryGuardTabbables : queryTabbables)), // add if node is tabble itself parent.parentNode ? toArray(parent.parentNode.querySelectorAll(tabbables.join(','))).filter(function (node) { return node === parent; }) : []); }, []); }; var getParentAutofocusables = function getParentAutofocusables(parent) { var parentFocus = parent.querySelectorAll('[' + FOCUS_AUTO + ']'); return toArray(parentFocus).map(function (node) { return getFocusables([node]); }).reduce(function (acc, nodes) { return acc.concat(nodes); }, []); }; var isElementHidden = function isElementHidden(computedStyle) { if (!computedStyle || !computedStyle.getPropertyValue) { return false; } return computedStyle.getPropertyValue('display') === 'none' || computedStyle.getPropertyValue('visibility') === 'hidden'; }; var isVisible = function isVisible(node) { return !node || node === document || !isElementHidden(window.getComputedStyle(node, null)) && isVisible(node.parentNode); }; var notHiddenInput = function notHiddenInput(node) { return !((node.tagName === 'INPUT' || node.tagName === 'BUTTON') && (node.type === 'hidden' || node.disabled)); }; var getParents = function getParents(node) { var parents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; parents.push(node); if (node.parentNode) { getParents(node.parentNode, parents); } return parents; }; var getCommonParent = function getCommonParent(nodea, nodeb) { var parentsA = getParents(nodea); var parentsB = getParents(nodeb); for (var i = 0; i < parentsA.length; i += 1) { var currentParent = parentsA[i]; if (parentsB.indexOf(currentParent) >= 0) { return currentParent; } } return false; }; var filterFocusable = function filterFocusable(nodes) { return toArray(nodes).filter(function (node) { return isVisible(node); }).filter(function (node) { return notHiddenInput(node); }); }; var getTabbableNodes = function getTabbableNodes(topNodes, withGuards) { return orderByTabIndex(filterFocusable(getFocusables(topNodes, withGuards)), true, withGuards); }; var getAllTabbableNodes = function getAllTabbableNodes(topNodes) { return orderByTabIndex(filterFocusable(getFocusables(topNodes)), false); }; var parentAutofocusables = function parentAutofocusables(topNode) { return filterFocusable(getParentAutofocusables(topNode)); }; var isRadio = function isRadio(node) { return node.tagName === 'INPUT' && node.type === 'radio'; }; var findSelectedRadio = function findSelectedRadio(node, nodes) { return nodes.filter(isRadio).filter(function (el) { return el.name === node.name; }).filter(function (el) { return el.checked; })[0] || node; }; var pickFirstFocus = function pickFirstFocus(nodes) { if (nodes[0] && nodes.length > 1) { if (isRadio(nodes[0]) && nodes[0].name) { return findSelectedRadio(nodes[0], nodes); } } return nodes[0]; }; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var filterNested = function filterNested(nodes) { var l = nodes.length; for (var i = 0; i < l; i += 1) { var _loop = function _loop(j) { if (i !== j) { if (nodes[i].contains(nodes[j])) { return { v: filterNested(nodes.filter(function (x) { return x !== nodes[j]; })) }; } } }; for (var j = 0; j < l; j += 1) { var _ret = _loop(j); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } } return nodes; }; var getTopParent = function getTopParent(node) { return node.parentNode ? getTopParent(node.parentNode) : node; }; var getAllAffectedNodes = function getAllAffectedNodes(node) { var nodes = asArray(node); return nodes.filter(Boolean).reduce(function (acc, currentNode) { var group = currentNode.getAttribute(FOCUS_GROUP); acc.push.apply(acc, group ? filterNested(toArray(getTopParent(currentNode).querySelectorAll('[' + FOCUS_GROUP + '="' + group + '"]:not([' + FOCUS_DISABLED + '="disabled"])'))) : [currentNode]); return acc; }, []); }; var findAutoFocused = function findAutoFocused(autoFocusables) { return function (node) { return !!node.autofocus || node.dataset && !!node.dataset.autofocus || autoFocusables.indexOf(node) >= 0; }; }; var newFocus = function newFocus(innerNodes, outerNodes, activeElement, lastNode, autoFocused) { var cnt = innerNodes.length; var firstFocus = innerNodes[0]; var lastFocus = innerNodes[cnt - 1]; // focus is inside if (innerNodes.indexOf(activeElement) >= 0) { return undefined; } var activeIndex = outerNodes.indexOf(activeElement); var lastIndex = outerNodes.indexOf(lastNode || activeIndex); var lastNodeInside = innerNodes.indexOf(lastNode); var indexDiff = activeIndex - lastIndex; var firstNodeIndex = outerNodes.indexOf(firstFocus); var lastNodeIndex = outerNodes.indexOf(lastFocus); // new focus if (activeIndex === -1 || lastNodeInside === -1) { return innerNodes.indexOf(autoFocused.length ? pickFirstFocus(autoFocused) : pickFirstFocus(innerNodes)); } // old focus if (!indexDiff && lastNodeInside >= 0) { return lastNodeInside; } // jump out if (indexDiff && Math.abs(indexDiff) > 1) { return lastNodeInside; } // focus above lock if (activeIndex <= firstNodeIndex) { return cnt - 1; } // focus below lock if (activeIndex > lastNodeIndex) { return 0; } // index is inside tab order, but outside Lock if (indexDiff) { if (Math.abs(indexDiff) > 1) { return lastNodeInside; } return (cnt + lastNodeInside + indexDiff) % cnt; } // do nothing return undefined; }; var getTopCommonParent = function getTopCommonParent(baseActiveElement, leftEntry, rightEntries) { var activeElements = asArray(baseActiveElement); var leftEntries = asArray(leftEntry); var activeElement = activeElements[0]; var topCommon = null; leftEntries.filter(Boolean).forEach(function (entry) { topCommon = getCommonParent(topCommon || entry, entry) || topCommon; rightEntries.filter(Boolean).forEach(function (subEntry) { var common = getCommonParent(activeElement, subEntry); if (common) { if (!topCommon || common.contains(topCommon)) { topCommon = common; } else { topCommon = getCommonParent(common, topCommon); } } }); }); return topCommon; }; var allParentAutofocusables = function allParentAutofocusables(entries) { return entries.reduce(function (acc, node) { return acc.concat(parentAutofocusables(node)); }, []); }; var notAGuard = function notAGuard(node) { return !(node.dataset && node.dataset.focusGuard); }; var reorderNodes = function reorderNodes(srcNodes, dstNodes) { return srcNodes.map(function (dnode) { return dstNodes.find(function (_ref) { var node = _ref.node; return dnode === node; }); }).filter(Boolean); }; var getFocusMerge = function getFocusMerge(topNode, lastNode) { var activeElement = document && document.activeElement; var entries = getAllAffectedNodes(topNode).filter(notAGuard); var commonParent = getTopCommonParent(activeElement || topNode, topNode, entries); var innerElements = getTabbableNodes(entries).filter(function (_ref5) { var node = _ref5.node; return notAGuard(node); }); if (!innerElements[0]) { innerElements = getAllTabbableNodes(entries).filter(function (_ref6) { var node = _ref6.node; return notAGuard(node); }); if (!innerElements[0]) { return undefined; } } var outerNodes = getTabbableNodes([commonParent]).map(function (_ref7) { var node = _ref7.node; return node; }); var orderedInnerElements = reorderNodes(outerNodes, innerElements); var innerNodes = orderedInnerElements.map(function (_ref8) { var node = _ref8.node; return node; }); var newId = newFocus(innerNodes, outerNodes, activeElement, lastNode, innerNodes.filter(findAutoFocused(allParentAutofocusables(entries)))); if (newId === undefined) { return newId; } return orderedInnerElements[newId]; }; var focusInFrame = function focusInFrame(frame) { return frame === document.activeElement; }; var focusInsideIframe = function focusInsideIframe(topNode) { return !!arrayFind(toArray(topNode.querySelectorAll('iframe')), focusInFrame); }; var focusInside = function focusInside(topNode) { var activeElement = document && document.activeElement; if (!activeElement || activeElement.dataset && activeElement.dataset.focusGuard) { return false; } return getAllAffectedNodes(topNode).reduce(function (result, node) { return result || node.contains(activeElement) || focusInsideIframe(node); }, false); }; var focusIsHidden = function focusIsHidden() { return document && toArray(document.querySelectorAll('[' + FOCUS_ALLOW + ']')).some(function (node) { return node.contains(document.activeElement); }); }; var focusOn = function focusOn(target) { target.focus(); if (target.contentWindow) { target.contentWindow.focus(); } }; var guardCount = 0; var lockDisabled = false; var setFocus = (function (topNode, lastNode) { var focusable = getFocusMerge(topNode, lastNode); if (lockDisabled) { return; } if (focusable) { if (guardCount > 2) { // eslint-disable-next-line no-console console.error('FocusLock: focus-fighting detected. Only one focus management system could be active. ' + 'See https://github.com/theKashey/focus-lock/#focus-fighting'); lockDisabled = true; setTimeout(function () { lockDisabled = false; }, 1); return; } guardCount++; focusOn(focusable.node); guardCount--; } }); var lastActiveTrap = 0; var lastActiveFocus = null; var focusOnBody = function focusOnBody() { return document && document.activeElement === document.body; }; var isFreeFocus = function isFreeFocus() { return focusOnBody() || focusIsHidden(); }; var activateTrap = function activateTrap() { var result = false; if (lastActiveTrap) { var observed = lastActiveTrap; if (!isFreeFocus()) { if (observed && !focusInside(observed)) { result = setFocus(observed, lastActiveFocus); } lastActiveFocus = document.activeElement; } } return result; }; var reducePropsToState = function reducePropsToState(propsList) { return propsList.filter(function (node) { return node; }).slice(-1)[0]; }; var handleStateChangeOnClient = function handleStateChangeOnClient(trap) { lastActiveTrap = trap; if (trap) { activateTrap(); } }; var instances = []; var emitChange = function emitChange(event) { if (handleStateChangeOnClient(reducePropsToState(instances))) { event && event.preventDefault(); return true; } return false; }; var attachHandler = function attachHandler() { document.addEventListener('focusin', emitChange); }; var detachHandler = function detachHandler() { document.removeEventListener('focusin', emitChange); }; var focusLock = { on: function on(domNode) { if (instances.length === 0) { attachHandler(); } if (instances.indexOf(domNode) < 0) { instances.push(domNode); emitChange(); } }, off: function off(domNode) { instances = instances.filter(function (node) { return node !== domNode; }); emitChange(); if (instances.length === 0) { detachHandler(); } } }; return focusLock; })); ================================================ FILE: src/jquery.js ================================================ /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0" ], "run_at": "document_end", "js": ["focus.js", "jquery.js", "content.js", "virtualized-list.min.js"], "css": ["content.css"] } ], "web_accessible_resources": [ { "resources": ["content.html", "newtab.html", "assets/*", "popup.css", "popup.js"], "matches": [""] } ], "permissions": [ "tabs", "activeTab", "bookmarks", "browsingData", "history", "scripting", "search" ], "host_permissions": [ "https://www.googleapis.com/*", "https://gstatic.com/*", "*://*/*" ] } ================================================ FILE: src/newtab.html ================================================ Omni