From 09c5247dbadb468a764eef308634503484d398c5 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sat, 28 Jul 2018 23:47:26 +0900 Subject: [PATCH] Search keywords on paste --- src/background/usecases/command.js | 3 ++- src/background/usecases/parsers.js | 26 +------------------- src/content/actions/operation.js | 4 +++- src/content/urls.js | 17 +++++++------- src/shared/urls.js | 25 ++++++++++++++++++++ test/background/usecases/parsers.test.js | 26 -------------------- test/shared/urls.test.js | 30 ++++++++++++++++++++++++ 7 files changed, 70 insertions(+), 61 deletions(-) create mode 100644 src/shared/urls.js create mode 100644 test/shared/urls.test.js diff --git a/src/background/usecases/command.js b/src/background/usecases/command.js index 3dbf768..7fd2e57 100644 --- a/src/background/usecases/command.js +++ b/src/background/usecases/command.js @@ -1,4 +1,5 @@ import * as parsers from './parsers'; +import * as urls from '../../shared/urls'; import TabPresenter from '../presenters/tab'; import WindowPresenter from '../presenters/window'; import SettingRepository from '../repositories/setting'; @@ -103,6 +104,6 @@ export default class CommandIndicator { async urlOrSearch(keywords) { let settings = await this.settingRepository.get(); - return parsers.normalizeUrl(keywords, settings.search); + return urls.normalizeUrl(keywords, settings.search); } } diff --git a/src/background/usecases/parsers.js b/src/background/usecases/parsers.js index cda26c3..43c8177 100644 --- a/src/background/usecases/parsers.js +++ b/src/background/usecases/parsers.js @@ -1,27 +1,3 @@ -const trimStart = (str) => { - // NOTE String.trimStart is available on Firefox 61 - return str.replace(/^\s+/, ''); -}; - -const normalizeUrl = (keywords, searchSettings) => { - try { - return new URL(keywords).href; - } catch (e) { - if (keywords.includes('.') && !keywords.includes(' ')) { - return 'http://' + keywords; - } - let template = searchSettings.engines[searchSettings.default]; - let query = keywords; - - let first = trimStart(keywords).split(' ')[0]; - if (Object.keys(searchSettings.engines).includes(first)) { - template = searchSettings.engines[first]; - query = trimStart(trimStart(keywords).slice(first.length)); - } - return template.replace('{}', encodeURIComponent(query)); - } -}; - const mustNumber = (v) => { let num = Number(v); if (isNaN(num)) { @@ -52,4 +28,4 @@ const parseSetOption = (word, types) => { } }; -export { normalizeUrl, parseSetOption }; +export { parseSetOption }; diff --git a/src/content/actions/operation.js b/src/content/actions/operation.js index c1bd1c8..89d7fec 100644 --- a/src/content/actions/operation.js +++ b/src/content/actions/operation.js @@ -83,7 +83,9 @@ const exec = (operation, repeat, settings, addonEnabled) => { consoleFrames.postInfo(window.document, 'Current url yanked'); break; case operations.URLS_PASTE: - urls.paste(window, operation.newTab ? operation.newTab : false); + urls.paste( + window, operation.newTab ? operation.newTab : false, settings.search + ); break; default: browser.runtime.sendMessage({ diff --git a/src/content/urls.js b/src/content/urls.js index 9b7b284..1c5b7e5 100644 --- a/src/content/urls.js +++ b/src/content/urls.js @@ -1,4 +1,5 @@ import messages from 'shared/messages'; +import * as urls from '../shared/urls'; const yank = (win) => { let input = win.document.createElement('input'); @@ -14,7 +15,7 @@ const yank = (win) => { input.remove(); }; -const paste = (win, newTab) => { +const paste = (win, newTab, searchSettings) => { let textarea = win.document.createElement('textarea'); win.document.body.append(textarea); @@ -24,13 +25,13 @@ const paste = (win, newTab) => { textarea.focus(); if (win.document.execCommand('paste')) { - if (/^(https?|ftp):\/\//.test(textarea.textContent)) { - browser.runtime.sendMessage({ - type: messages.OPEN_URL, - url: textarea.textContent, - newTab: newTab ? newTab : false, - }); - } + let value = textarea.textContent; + let url = urls.normalizeUrl(value, searchSettings); + browser.runtime.sendMessage({ + type: messages.OPEN_URL, + url, + newTab, + }); } textarea.remove(); diff --git a/src/shared/urls.js b/src/shared/urls.js new file mode 100644 index 0000000..87b1a48 --- /dev/null +++ b/src/shared/urls.js @@ -0,0 +1,25 @@ +const trimStart = (str) => { + // NOTE String.trimStart is available on Firefox 61 + return str.replace(/^\s+/, ''); +}; + +const normalizeUrl = (keywords, searchSettings) => { + try { + return new URL(keywords).href; + } catch (e) { + if (keywords.includes('.') && !keywords.includes(' ')) { + return 'http://' + keywords; + } + let template = searchSettings.engines[searchSettings.default]; + let query = keywords; + + let first = trimStart(keywords).split(' ')[0]; + if (Object.keys(searchSettings.engines).includes(first)) { + template = searchSettings.engines[first]; + query = trimStart(trimStart(keywords).slice(first.length)); + } + return template.replace('{}', encodeURIComponent(query)); + } +}; + +export { normalizeUrl }; diff --git a/test/background/usecases/parsers.test.js b/test/background/usecases/parsers.test.js index a58c4a3..17b034b 100644 --- a/test/background/usecases/parsers.test.js +++ b/test/background/usecases/parsers.test.js @@ -44,30 +44,4 @@ describe("shared/commands/parsers", () => { expect(() => parsers.parseSetOption('smoothscroll', { smoothscroll: 'number' })).to.throw(Error, 'Invalid'); }) }); - - describe('#normalizeUrl', () => { - const config = { - default: 'google', - engines: { - google: 'https://google.com/search?q={}', - yahoo: 'https://yahoo.com/search?q={}', - } - }; - - it('convertes search url', () => { - expect(parsers.normalizeUrl('google apple', config)) - .to.equal('https://google.com/search?q=apple'); - expect(parsers.normalizeUrl('yahoo apple', config)) - .to.equal('https://yahoo.com/search?q=apple'); - expect(parsers.normalizeUrl('google apple banana', config)) - .to.equal('https://google.com/search?q=apple%20banana'); - expect(parsers.normalizeUrl('yahoo C++CLI', config)) - .to.equal('https://yahoo.com/search?q=C%2B%2BCLI'); - }); - - it('user default search engine', () => { - expect(parsers.normalizeUrl('apple banana', config)) - .to.equal('https://google.com/search?q=apple%20banana'); - }); - }); }); diff --git a/test/shared/urls.test.js b/test/shared/urls.test.js new file mode 100644 index 0000000..5573766 --- /dev/null +++ b/test/shared/urls.test.js @@ -0,0 +1,30 @@ +import * as parsers from 'shared/urls'; + +describe("shared/commands/parsers", () => { + describe('#normalizeUrl', () => { + const config = { + default: 'google', + engines: { + google: 'https://google.com/search?q={}', + yahoo: 'https://yahoo.com/search?q={}', + } + }; + + it('convertes search url', () => { + expect(parsers.normalizeUrl('google apple', config)) + .to.equal('https://google.com/search?q=apple'); + expect(parsers.normalizeUrl('yahoo apple', config)) + .to.equal('https://yahoo.com/search?q=apple'); + expect(parsers.normalizeUrl('google apple banana', config)) + .to.equal('https://google.com/search?q=apple%20banana'); + expect(parsers.normalizeUrl('yahoo C++CLI', config)) + .to.equal('https://yahoo.com/search?q=C%2B%2BCLI'); + }); + + it('user default search engine', () => { + expect(parsers.normalizeUrl('apple banana', config)) + .to.equal('https://google.com/search?q=apple%20banana'); + }); + }); +}); +