aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2018-07-28 23:47:26 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2018-07-28 23:47:26 +0900
commit09c5247dbadb468a764eef308634503484d398c5 (patch)
tree0c66e88229b11c9b154772a6a93dbb6def0d6dcf
parentf914d76ce8fecb74bbddb673595c32000d0fa78f (diff)
Search keywords on paste
-rw-r--r--src/background/usecases/command.js3
-rw-r--r--src/background/usecases/parsers.js26
-rw-r--r--src/content/actions/operation.js4
-rw-r--r--src/content/urls.js17
-rw-r--r--src/shared/urls.js25
-rw-r--r--test/background/usecases/parsers.test.js26
-rw-r--r--test/shared/urls.test.js30
7 files changed, 70 insertions, 61 deletions
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');
+ });
+ });
+});
+