From e021504356016dc4cdb89356cae542c31486fe6a Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Thu, 9 Nov 2017 21:05:02 +0900 Subject: [PATCH] first find implementation --- src/background/components/background.js | 6 +--- src/console/components/console.js | 40 +++++++++++++++------ src/console/index.js | 2 -- src/content/actions/find.js | 6 ++-- src/content/actions/operation.js | 9 +++++ src/content/components/top-content/find.js | 23 ++++++++++++ src/content/components/top-content/index.js | 4 ++- src/shared/messages.js | 9 +++-- 8 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 src/content/components/top-content/find.js diff --git a/src/background/components/background.js b/src/background/components/background.js index a5f4f5f..2d94310 100644 --- a/src/background/components/background.js +++ b/src/background/components/background.js @@ -34,11 +34,7 @@ export default class BackgroundComponent { } return this.store.dispatch( tabActions.openToTab(message.url, sender.tab), sender); - case messages.CONSOLE_BLURRED: - return browser.tabs.sendMessage(sender.tab.id, { - type: messages.CONSOLE_HIDE_COMMAND, - }); - case messages.CONSOLE_ENTERED: + case messages.CONSOLE_ENTER_COMMAND: return commands.exec(message.text, settings.value).catch((e) => { return browser.tabs.sendMessage(sender.tab.id, { type: messages.CONSOLE_SHOW_ERROR, diff --git a/src/console/components/console.js b/src/console/components/console.js index 605feb2..e83a1c9 100644 --- a/src/console/components/console.js +++ b/src/console/components/console.js @@ -25,23 +25,18 @@ export default class ConsoleComponent { } onBlur() { - return browser.runtime.sendMessage({ - type: messages.CONSOLE_BLURRED, - }); + let state = this.store.getState(); + if (state.mode === 'command') { + this.hideCommand(); + } } onKeyDown(e) { - let doc = this.wrapper.ownerDocument; - let input = doc.querySelector('#vimvixen-console-command-input'); - switch (e.keyCode) { case KeyboardEvent.DOM_VK_ESCAPE: - return input.blur(); + return this.hideCommand(); case KeyboardEvent.DOM_VK_RETURN: - return browser.runtime.sendMessage({ - type: messages.CONSOLE_ENTERED, - text: e.target.value - }).then(this.onBlur); + return this.onEntered(e.target.value); case KeyboardEvent.DOM_VK_TAB: if (e.shiftKey) { this.store.dispatch(consoleActions.completionPrev()); @@ -54,6 +49,22 @@ export default class ConsoleComponent { } } + onEntered(value) { + let state = this.store.getState(); + if (state.mode === 'command') { + browser.runtime.sendMessage({ + type: messages.CONSOLE_ENTER_COMMAND, + text: value, + }).then(this.hideCommand); + } else if (state.mode === 'find') { + this.hideCommand(); + window.top.postMessage(JSON.stringify({ + type: messages.CONSOLE_ENTER_FIND, + text: value, + }), '*'); + } + } + onInput(e) { this.store.dispatch(consoleActions.setConsoleText(e.target.value)); @@ -78,6 +89,13 @@ export default class ConsoleComponent { } } + hideCommand() { + this.store.dispatch(consoleActions.hideCommand()); + window.top.postMessage(JSON.stringify({ + type: messages.CONSOLE_UNFOCUS, + }), '*'); + } + update() { let state = this.store.getState(); diff --git a/src/console/index.js b/src/console/index.js index f886520..86edd9a 100644 --- a/src/console/index.js +++ b/src/console/index.js @@ -24,8 +24,6 @@ const onMessage = (message) => { return store.dispatch(consoleActions.showError(message.text)); case messages.CONSOLE_SHOW_INFO: return store.dispatch(consoleActions.showInfo(message.text)); - case messages.CONSOLE_HIDE_COMMAND: - return store.dispatch(consoleActions.hideCommand()); } }; diff --git a/src/content/actions/find.js b/src/content/actions/find.js index 90c9de9..2d301fb 100644 --- a/src/content/actions/find.js +++ b/src/content/actions/find.js @@ -1,6 +1,6 @@ // // window.find(aString, aCaseSensitive, aBackwards, aWrapAround, -// aWholeWord, aSearchInFrames, aShowDialog); +// aWholeWord, aSearchInFrames); // // NOTE: window.find is not standard API // https://developer.mozilla.org/en-US/docs/Web/API/Window/find @@ -17,7 +17,7 @@ const hide = () => { const next = (keyword) => { // TODO Error on no matched - window.find(keyword, false, false, true, false, true, false); + window.find(keyword, false, false, true, false, true); return { type: actions.FIND_SET_KEYWORD, keyword, @@ -26,7 +26,7 @@ const next = (keyword) => { const prev = (keyword) => { // TODO Error on no matched - window.find(keyword, false, true, true, false, true, false); + window.find(keyword, false, true, true, false, true); return { type: actions.FIND_SET_KEYWORD, keyword, diff --git a/src/content/actions/operation.js b/src/content/actions/operation.js index 897f361..767f14b 100644 --- a/src/content/actions/operation.js +++ b/src/content/actions/operation.js @@ -6,6 +6,7 @@ import * as urls from 'content/urls'; import * as consoleFrames from 'content/console-frames'; import * as addonActions from './addon'; +// eslint-disable-next-line complexity const exec = (operation) => { switch (operation.type) { case operations.ADDON_ENABLE: @@ -14,6 +15,14 @@ const exec = (operation) => { return addonActions.disable(); case operations.ADDON_TOGGLE_ENABLED: return addonActions.toggleEnabled(); + case operations.FIND_NEXT: + return window.top.postMessage(JSON.stringify({ + type: messages.FIND_NEXT, + }), '*'); + case operations.FIND_PREV: + return window.top.postMessage(JSON.stringify({ + type: messages.FIND_PREV, + }), '*'); case operations.SCROLL_VERTICALLY: return scrolls.scrollVertically(window, operation.count); case operations.SCROLL_HORIZONALLY: diff --git a/src/content/components/top-content/find.js b/src/content/components/top-content/find.js new file mode 100644 index 0000000..6696f00 --- /dev/null +++ b/src/content/components/top-content/find.js @@ -0,0 +1,23 @@ +import * as findActions from 'content/actions/find'; +import messages from 'shared/messages'; + +export default class FindComponent { + constructor(win, store) { + this.win = win; + this.store = store; + + messages.onMessage(this.onMessage.bind(this)); + } + + onMessage(message) { + let state = this.store.getState().find; + switch (message.type) { + case messages.CONSOLE_ENTER_FIND: + return this.store.dispatch(findActions.next(message.text)); + case messages.FIND_NEXT: + return this.store.dispatch(findActions.next(state.keyword)); + case messages.FIND_PREV: + return this.store.dispatch(findActions.prev(state.keyword)); + } + } +} diff --git a/src/content/components/top-content/index.js b/src/content/components/top-content/index.js index 5124f83..cf21ec4 100644 --- a/src/content/components/top-content/index.js +++ b/src/content/components/top-content/index.js @@ -1,5 +1,6 @@ import CommonComponent from '../common'; import FollowController from './follow-controller'; +import FindComponent from './find'; import * as consoleFrames from '../../console-frames'; import * as addonActions from '../../actions/addon'; import messages from 'shared/messages'; @@ -14,6 +15,7 @@ export default class TopContent { new CommonComponent(win, store); // eslint-disable-line no-new new FollowController(win, store); // eslint-disable-line no-new + new FindComponent(win, store); // eslint-disable-line no-new // TODO make component consoleFrames.initialize(this.win.document); @@ -47,7 +49,7 @@ export default class TopContent { onMessage(message) { switch (message.type) { - case messages.CONSOLE_HIDE_COMMAND: + case messages.CONSOLE_UNFOCUS: this.win.focus(); consoleFrames.blur(window.document); return Promise.resolve(); diff --git a/src/shared/messages.js b/src/shared/messages.js index f859e93..de00a3f 100644 --- a/src/shared/messages.js +++ b/src/shared/messages.js @@ -24,13 +24,13 @@ const onMessage = (listener) => { export default { BACKGROUND_OPERATION: 'background.operation', - CONSOLE_BLURRED: 'console.blured', - CONSOLE_ENTERED: 'console.entered', + CONSOLE_UNFOCUS: 'console.unfocus', + CONSOLE_ENTER_COMMAND: 'console.enter.command', + CONSOLE_ENTER_FIND: 'console.enter.find', CONSOLE_QUERY_COMPLETIONS: 'console.query.completions', CONSOLE_SHOW_COMMAND: 'console.show.command', CONSOLE_SHOW_ERROR: 'console.show.error', CONSOLE_SHOW_INFO: 'console.show.info', - CONSOLE_HIDE_COMMAND: 'console.hide.command', CONSOLE_SHOW_FIND: 'console.show.find', FOLLOW_START: 'follow.start', @@ -42,6 +42,9 @@ export default { FOLLOW_ACTIVATE: 'follow.activate', FOLLOW_KEY_PRESS: 'follow.key.press', + FIND_NEXT: 'find.next', + FIND_PREV: 'find.prev', + OPEN_URL: 'open.url', SETTINGS_RELOAD: 'settings.reload',