show error on find and wrap search

jh-changes
Shin'ya Ueoka 7 years ago
parent 6db2458929
commit 12db4943ee
  1. 45
      src/content/actions/find.js
  2. 39
      src/content/components/top-content/find.js
  3. 10
      src/content/console-frames.js
  4. 2
      src/content/reducers/find.js

@ -6,6 +6,13 @@
// https://developer.mozilla.org/en-US/docs/Web/API/Window/find // https://developer.mozilla.org/en-US/docs/Web/API/Window/find
import actions from 'content/actions'; 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 = () => { const show = () => {
return { type: actions.FIND_SHOW }; return { type: actions.FIND_SHOW };
@ -15,22 +22,42 @@ const hide = () => {
return { type: actions.FIND_HIDE }; return { type: actions.FIND_HIDE };
}; };
const next = (keyword) => { const find = (string, backwards) => {
// TODO Error on no matched let caseSensitive = false;
window.find(keyword, false, false, true, false, true); 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 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 { return {
type: actions.FIND_SET_KEYWORD, type: actions.FIND_SET_KEYWORD,
keyword, keyword,
found,
}; };
}; };
const prev = (keyword) => { const next = (keyword, reset) => {
// TODO Error on no matched return findNext(keyword, reset, false);
window.find(keyword, false, true, true, false, true);
return {
type: actions.FIND_SET_KEYWORD,
keyword,
}; };
const prev = (keyword, reset) => {
return findNext(keyword, reset, true);
}; };
export { show, hide, next, prev }; export { show, hide, next, prev };

@ -1,5 +1,6 @@
import * as findActions from 'content/actions/find'; import * as findActions from 'content/actions/find';
import messages from 'shared/messages'; import messages from 'shared/messages';
import * as consoleFrames from '../../console-frames';
export default class FindComponent { export default class FindComponent {
constructor(win, store) { constructor(win, store) {
@ -10,14 +11,44 @@ export default class FindComponent {
} }
onMessage(message) { onMessage(message) {
let state = this.store.getState().find;
switch (message.type) { switch (message.type) {
case messages.CONSOLE_ENTER_FIND: case messages.CONSOLE_ENTER_FIND:
return this.store.dispatch(findActions.next(message.text)); return this.start(message.text);
case messages.FIND_NEXT: case messages.FIND_NEXT:
return this.store.dispatch(findActions.next(state.keyword)); return this.next();
case messages.FIND_PREV: 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));
} }
} }

@ -1,4 +1,5 @@
import './console-frame.scss'; import './console-frame.scss';
import messages from 'shared/messages';
const initialize = (doc) => { const initialize = (doc) => {
let iframe = doc.createElement('iframe'); let iframe = doc.createElement('iframe');
@ -20,4 +21,11 @@ const postMessage = (doc, message) => {
iframe.contentWindow.postMessage(JSON.stringify(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 };

@ -3,6 +3,7 @@ import actions from 'content/actions';
const defaultState = { const defaultState = {
enabled: false, enabled: false,
keyword: '', keyword: '',
found: false,
}; };
export default function reducer(state = defaultState, action = {}) { export default function reducer(state = defaultState, action = {}) {
@ -18,6 +19,7 @@ export default function reducer(state = defaultState, action = {}) {
case actions.FIND_SET_KEYWORD: case actions.FIND_SET_KEYWORD:
return Object.assign({}, state, { return Object.assign({}, state, {
keyword: action.keyword, keyword: action.keyword,
found: action.found,
}); });
default: default:
return state; return state;