Merge pull request #441 from ueokande/search-on-paste

Search on paste
jh-changes
Shin'ya Ueoka 6 years ago committed by GitHub
commit af90ef5956
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      src/background/infrastructures/content-message-listener.js
  2. 3
      src/background/repositories/find.js
  3. 3
      src/background/usecases/command.js
  4. 3
      src/background/usecases/link.js
  5. 6
      src/background/usecases/operation.js
  6. 26
      src/background/usecases/parsers.js
  7. 4
      src/content/actions/operation.js
  8. 11
      src/content/urls.js
  9. 25
      src/shared/urls.js
  10. 26
      test/background/usecases/parsers.test.js
  11. 30
      test/shared/urls.test.js

@ -19,7 +19,11 @@ export default class ContentMessageListener {
run() { run() {
browser.runtime.onMessage.addListener((message, sender) => { browser.runtime.onMessage.addListener((message, sender) => {
try { try {
return this.onMessage(message, sender).catch((e) => { let ret = this.onMessage(message, sender);
if (!(ret instanceof Promise)) {
return {};
}
return ret.catch((e) => {
return browser.tabs.sendMessage(sender.tab.id, { return browser.tabs.sendMessage(sender.tab.id, {
type: messages.CONSOLE_SHOW_ERROR, type: messages.CONSOLE_SHOW_ERROR,
text: e.message, text: e.message,

@ -12,7 +12,8 @@ export default class FindRepository {
} }
setKeyword(keyword) { setKeyword(keyword) {
return this.cache.set(FIND_KEYWORD_KEY, keyword); this.cache.set(FIND_KEYWORD_KEY, keyword);
return Promise.resolve();
} }
} }

@ -1,4 +1,5 @@
import * as parsers from './parsers'; import * as parsers from './parsers';
import * as urls from '../../shared/urls';
import TabPresenter from '../presenters/tab'; import TabPresenter from '../presenters/tab';
import WindowPresenter from '../presenters/window'; import WindowPresenter from '../presenters/window';
import SettingRepository from '../repositories/setting'; import SettingRepository from '../repositories/setting';
@ -103,6 +104,6 @@ export default class CommandIndicator {
async urlOrSearch(keywords) { async urlOrSearch(keywords) {
let settings = await this.settingRepository.get(); let settings = await this.settingRepository.get();
return parsers.normalizeUrl(keywords, settings.search); return urls.normalizeUrl(keywords, settings.search);
} }
} }

@ -8,8 +8,7 @@ export default class LinkInteractor {
} }
openToTab(url, tabId) { openToTab(url, tabId) {
this.tabPresenter.open(url, tabId); return this.tabPresenter.open(url, tabId);
} }
async openNewTab(url, openerId, background) { async openNewTab(url, openerId, background) {

@ -126,7 +126,7 @@ export default class OperationInteractor {
async showCommand() { async showCommand() {
let tab = await this.tabPresenter.getCurrent(); let tab = await this.tabPresenter.getCurrent();
this.consolePresenter.showCommand(tab.id, ''); return this.consolePresenter.showCommand(tab.id, '');
} }
async showOpenCommand(alter) { async showOpenCommand(alter) {
@ -173,12 +173,12 @@ export default class OperationInteractor {
async findStart() { async findStart() {
let tab = await this.tabPresenter.getCurrent(); let tab = await this.tabPresenter.getCurrent();
this.consolePresenter.showFind(tab.id); return this.consolePresenter.showFind(tab.id);
} }
async hideConsole() { async hideConsole() {
let tab = await this.tabPresenter.getCurrent(); let tab = await this.tabPresenter.getCurrent();
this.consolePresenter.hide(tab.id); return this.consolePresenter.hide(tab.id);
} }
onTabSelected(tabId) { onTabSelected(tabId) {

@ -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) => { const mustNumber = (v) => {
let num = Number(v); let num = Number(v);
if (isNaN(num)) { if (isNaN(num)) {
@ -52,4 +28,4 @@ const parseSetOption = (word, types) => {
} }
}; };
export { normalizeUrl, parseSetOption }; export { parseSetOption };

@ -83,7 +83,9 @@ const exec = (operation, repeat, settings, addonEnabled) => {
consoleFrames.postInfo(window.document, 'Current url yanked'); consoleFrames.postInfo(window.document, 'Current url yanked');
break; break;
case operations.URLS_PASTE: case operations.URLS_PASTE:
urls.paste(window, operation.newTab ? operation.newTab : false); urls.paste(
window, operation.newTab ? operation.newTab : false, settings.search
);
break; break;
default: default:
browser.runtime.sendMessage({ browser.runtime.sendMessage({

@ -1,4 +1,5 @@
import messages from 'shared/messages'; import messages from 'shared/messages';
import * as urls from '../shared/urls';
const yank = (win) => { const yank = (win) => {
let input = win.document.createElement('input'); let input = win.document.createElement('input');
@ -14,7 +15,7 @@ const yank = (win) => {
input.remove(); input.remove();
}; };
const paste = (win, newTab) => { const paste = (win, newTab, searchSettings) => {
let textarea = win.document.createElement('textarea'); let textarea = win.document.createElement('textarea');
win.document.body.append(textarea); win.document.body.append(textarea);
@ -24,14 +25,14 @@ const paste = (win, newTab) => {
textarea.focus(); textarea.focus();
if (win.document.execCommand('paste')) { if (win.document.execCommand('paste')) {
if (/^(https?|ftp):\/\//.test(textarea.textContent)) { let value = textarea.textContent;
let url = urls.normalizeUrl(value, searchSettings);
browser.runtime.sendMessage({ browser.runtime.sendMessage({
type: messages.OPEN_URL, type: messages.OPEN_URL,
url: textarea.textContent, url,
newTab: newTab ? newTab : false, newTab,
}); });
} }
}
textarea.remove(); textarea.remove();
}; };

@ -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 };

@ -44,30 +44,4 @@ describe("shared/commands/parsers", () => {
expect(() => parsers.parseSetOption('smoothscroll', { smoothscroll: 'number' })).to.throw(Error, 'Invalid'); 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');
});
});
}); });

@ -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');
});
});
});