From 12db4943ee54e1b0b48c806cde589254cb6fef51 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sat, 11 Nov 2017 15:53:46 +0900 Subject: [PATCH] show error on find and wrap search --- src/content/actions/find.js | 47 +++++++++++++++++----- src/content/components/top-content/find.js | 39 ++++++++++++++++-- src/content/console-frames.js | 10 ++++- src/content/reducers/find.js | 2 + 4 files changed, 83 insertions(+), 15 deletions(-) diff --git a/src/content/actions/find.js b/src/content/actions/find.js index 2d301fb..ac1b842 100644 --- a/src/content/actions/find.js +++ b/src/content/actions/find.js @@ -6,6 +6,13 @@ // https://developer.mozilla.org/en-US/docs/Web/API/Window/find import actions from 'content/actions'; +import * as consoleFrames from '../console-frames'; + +const postPatternNotFound = (pattern) => { + return consoleFrames.postError( + window.document, + 'Pattern not found: ' + pattern); +}; const show = () => { return { type: actions.FIND_SHOW }; @@ -15,22 +22,42 @@ const hide = () => { return { type: actions.FIND_HIDE }; }; -const next = (keyword) => { - // TODO Error on no matched - window.find(keyword, false, false, true, false, true); - return { - type: actions.FIND_SET_KEYWORD, - keyword, - }; +const find = (string, backwards) => { + let caseSensitive = false; + let wrapScan = true; + + + // NOTE: aWholeWord dows not implemented, and aSearchInFrames does not work + // because of same origin policy + return window.find(string, caseSensitive, backwards, wrapScan); }; -const prev = (keyword) => { - // TODO Error on no matched - window.find(keyword, false, true, true, false, true); +const findNext = (keyword, reset, backwards) => { + if (reset) { + window.getSelection().removeAllRanges(); + } + + let found = find(keyword, backwards); + if (!found) { + window.getSelection().removeAllRanges(); + found = find(keyword, backwards); + } + if (!found) { + postPatternNotFound(keyword); + } return { type: actions.FIND_SET_KEYWORD, keyword, + found, }; }; +const next = (keyword, reset) => { + return findNext(keyword, reset, false); +}; + +const prev = (keyword, reset) => { + return findNext(keyword, reset, true); +}; + export { show, hide, next, prev }; diff --git a/src/content/components/top-content/find.js b/src/content/components/top-content/find.js index 6696f00..bccf040 100644 --- a/src/content/components/top-content/find.js +++ b/src/content/components/top-content/find.js @@ -1,5 +1,6 @@ import * as findActions from 'content/actions/find'; import messages from 'shared/messages'; +import * as consoleFrames from '../../console-frames'; export default class FindComponent { constructor(win, store) { @@ -10,14 +11,44 @@ export default class FindComponent { } onMessage(message) { - let state = this.store.getState().find; switch (message.type) { case messages.CONSOLE_ENTER_FIND: - return this.store.dispatch(findActions.next(message.text)); + return this.start(message.text); case messages.FIND_NEXT: - return this.store.dispatch(findActions.next(state.keyword)); + return this.next(); case messages.FIND_PREV: - return this.store.dispatch(findActions.prev(state.keyword)); + return this.prev(); + } + } + + start(text) { + let state = this.store.getState().find; + + if (text.length === 0) { + return this.store.dispatch(findActions.next(state.keyword, true)); + } + return this.store.dispatch(findActions.next(text, true)); + } + + next() { + let state = this.store.getState().find; + + if (!state.found) { + return consoleFrames.postError( + window.document, + 'Pattern not found: ' + state.keyword); + } + return this.store.dispatch(findActions.next(state.keyword, false)); + } + + prev() { + let state = this.store.getState().find; + + if (!state.found) { + return consoleFrames.postError( + window.document, + 'Pattern not found: ' + state.keyword); } + return this.store.dispatch(findActions.prev(state.keyword, false)); } } diff --git a/src/content/console-frames.js b/src/content/console-frames.js index 35b975f..515ae09 100644 --- a/src/content/console-frames.js +++ b/src/content/console-frames.js @@ -1,4 +1,5 @@ import './console-frame.scss'; +import messages from 'shared/messages'; const initialize = (doc) => { let iframe = doc.createElement('iframe'); @@ -20,4 +21,11 @@ const postMessage = (doc, message) => { iframe.contentWindow.postMessage(JSON.stringify(message), '*'); }; -export { initialize, blur, postMessage }; +const postError = (doc, message) => { + return postMessage(doc, { + type: messages.CONSOLE_SHOW_ERROR, + text: message, + }); +}; + +export { initialize, blur, postMessage, postError }; diff --git a/src/content/reducers/find.js b/src/content/reducers/find.js index 6042f50..f0bfbeb 100644 --- a/src/content/reducers/find.js +++ b/src/content/reducers/find.js @@ -3,6 +3,7 @@ import actions from 'content/actions'; const defaultState = { enabled: false, keyword: '', + found: false, }; export default function reducer(state = defaultState, action = {}) { @@ -18,6 +19,7 @@ export default function reducer(state = defaultState, action = {}) { case actions.FIND_SET_KEYWORD: return Object.assign({}, state, { keyword: action.keyword, + found: action.found, }); default: return state;