diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 43ee81c3..23811e9d 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -33,6 +33,7 @@ class Backend { this.isPreparedPromise = new Promise((resolve) => (this.isPreparedResolve = resolve)); this.clipboardPasteTarget = document.querySelector('#clipboard-paste-target'); + this.popupWindow = null; this.apiForwarder = new BackendApiForwarder(); } @@ -565,23 +566,46 @@ class Backend { // Command handlers async _onCommandSearch(params) { - const url = chrome.runtime.getURL('/bg/search.html'); - if (!(params && params.newTab)) { - try { - const tab = await Backend._findTab(1000, (url2) => ( - url2 !== null && - url2.startsWith(url) && - (url2.length === url.length || url2[url.length] === '?' || url2[url.length] === '#') - )); - if (tab !== null) { - await Backend._focusTab(tab); - return; + const {mode, query} = params || {}; + + const optionsContext = {depth: 0}; + const options = await this.getOptions(optionsContext); + const {popupWidth, popupHeight} = options.general; + + const baseUrl = chrome.runtime.getURL('/bg/search.html'); + const queryString = (query && query.length > 0) ? `?query=${encodeURIComponent(query)}` : ''; + const url = baseUrl + queryString; + + switch (mode) { + case 'sameTab': + try { + const tab = await Backend._findTab(1000, (url2) => ( + url2 !== null && + url2.startsWith(url) && + (url2.length === url.length || url2[url.length] === '?' || url2[url.length] === '#') + )); + if (tab !== null) { + await Backend._focusTab(tab); + return; + } + } catch (e) { + // NOP } - } catch (e) { - // NOP - } + chrome.tabs.create({url}); + return; + case 'newTab': + chrome.tabs.create({url}); + return; + case 'popup': + if (this.popupWindow !== null) { + chrome.windows.remove(this.popupWindow.id); + } + chrome.windows.create( + {url, width: popupWidth, height: popupHeight, type: 'popup'}, + (popupWindow) => { this.popupWindow = popupWindow; } + ); + return; } - chrome.tabs.create({url}); } _onCommandHelp() { diff --git a/ext/bg/js/context.js b/ext/bg/js/context.js index 834174bf..a0e5adc9 100644 --- a/ext/bg/js/context.js +++ b/ext/bg/js/context.js @@ -30,12 +30,12 @@ function setupButtonEvents(selector, command, url) { for (const node of nodes) { node.addEventListener('click', (e) => { if (e.button !== 0) { return; } - apiCommandExec(command, {newTab: e.ctrlKey}); + apiCommandExec(command, {mode: e.ctrlKey ? 'newTab' : 'sameTab'}); e.preventDefault(); }, false); node.addEventListener('auxclick', (e) => { if (e.button !== 1) { return; } - apiCommandExec(command, {newTab: true}); + apiCommandExec(command, {mode: 'newTab'}); e.preventDefault(); }, false);