aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/content/actions/find.js36
-rw-r--r--src/content/actions/index.js5
-rw-r--r--src/content/reducers/find.js25
-rw-r--r--src/content/reducers/index.js3
-rw-r--r--test/content/actions/find.test.js19
-rw-r--r--test/content/reducers/find.test.js36
6 files changed, 124 insertions, 0 deletions
diff --git a/src/content/actions/find.js b/src/content/actions/find.js
new file mode 100644
index 0000000..90c9de9
--- /dev/null
+++ b/src/content/actions/find.js
@@ -0,0 +1,36 @@
+//
+// window.find(aString, aCaseSensitive, aBackwards, aWrapAround,
+// aWholeWord, aSearchInFrames, aShowDialog);
+//
+// NOTE: window.find is not standard API
+// https://developer.mozilla.org/en-US/docs/Web/API/Window/find
+
+import actions from 'content/actions';
+
+const show = () => {
+ return { type: actions.FIND_SHOW };
+};
+
+const hide = () => {
+ return { type: actions.FIND_HIDE };
+};
+
+const next = (keyword) => {
+ // TODO Error on no matched
+ window.find(keyword, false, false, true, false, true, false);
+ return {
+ type: actions.FIND_SET_KEYWORD,
+ keyword,
+ };
+};
+
+const prev = (keyword) => {
+ // TODO Error on no matched
+ window.find(keyword, false, true, true, false, true, false);
+ return {
+ type: actions.FIND_SET_KEYWORD,
+ keyword,
+ };
+};
+
+export { show, hide, next, prev };
diff --git a/src/content/actions/index.js b/src/content/actions/index.js
index 8cc2303..a727e13 100644
--- a/src/content/actions/index.js
+++ b/src/content/actions/index.js
@@ -21,4 +21,9 @@ export default {
FOLLOW_CONTROLLER_DISABLE: 'follow.controller.disable',
FOLLOW_CONTROLLER_KEY_PRESS: 'follow.controller.key.press',
FOLLOW_CONTROLLER_BACKSPACE: 'follow.controller.backspace',
+
+ // Find
+ FIND_SHOW: 'find.show',
+ FIND_HIDE: 'find.hide',
+ FIND_SET_KEYWORD: 'find.set.keyword',
};
diff --git a/src/content/reducers/find.js b/src/content/reducers/find.js
new file mode 100644
index 0000000..6042f50
--- /dev/null
+++ b/src/content/reducers/find.js
@@ -0,0 +1,25 @@
+import actions from 'content/actions';
+
+const defaultState = {
+ enabled: false,
+ keyword: '',
+};
+
+export default function reducer(state = defaultState, action = {}) {
+ switch (action.type) {
+ case actions.FIND_SHOW:
+ return Object.assign({}, state, {
+ enabled: true,
+ });
+ case actions.FIND_HIDE:
+ return Object.assign({}, state, {
+ enabled: false,
+ });
+ case actions.FIND_SET_KEYWORD:
+ return Object.assign({}, state, {
+ keyword: action.keyword,
+ });
+ default:
+ return state;
+ }
+}
diff --git a/src/content/reducers/index.js b/src/content/reducers/index.js
index 17c0429..2487d85 100644
--- a/src/content/reducers/index.js
+++ b/src/content/reducers/index.js
@@ -1,4 +1,5 @@
import addonReducer from './addon';
+import findReducer from './find';
import settingReducer from './setting';
import inputReducer from './input';
import followControllerReducer from './follow-controller';
@@ -6,6 +7,7 @@ import followControllerReducer from './follow-controller';
// Make setting reducer instead of re-use
const defaultState = {
addon: addonReducer(undefined, {}),
+ find: findReducer(undefined, {}),
setting: settingReducer(undefined, {}),
input: inputReducer(undefined, {}),
followController: followControllerReducer(undefined, {}),
@@ -14,6 +16,7 @@ const defaultState = {
export default function reducer(state = defaultState, action = {}) {
return Object.assign({}, state, {
addon: addonReducer(state.addon, action),
+ find: findReducer(state.find, action),
setting: settingReducer(state.setting, action),
input: inputReducer(state.input, action),
followController: followControllerReducer(state.followController, action),
diff --git a/test/content/actions/find.test.js b/test/content/actions/find.test.js
new file mode 100644
index 0000000..676e105
--- /dev/null
+++ b/test/content/actions/find.test.js
@@ -0,0 +1,19 @@
+import { expect } from "chai";
+import actions from 'content/actions';
+import * as findActions from 'content/actions/find';
+
+describe("find actions", () => {
+ describe("show", () => {
+ it('create FIND_SHOW action', () => {
+ let action = findActions.show();
+ expect(action.type).to.equal(actions.FIND_SHOW);
+ });
+ });
+
+ describe("hide", () => {
+ it('create FIND_HIDE action', () => {
+ let action = findActions.hide();
+ expect(action.type).to.equal(actions.FIND_HIDE);
+ });
+ });
+});
diff --git a/test/content/reducers/find.test.js b/test/content/reducers/find.test.js
new file mode 100644
index 0000000..3aacbd9
--- /dev/null
+++ b/test/content/reducers/find.test.js
@@ -0,0 +1,36 @@
+import { expect } from "chai";
+import actions from 'content/actions';
+import findReducer from 'content/reducers/find';
+
+describe("find reducer", () => {
+ it('return the initial state', () => {
+ let state = findReducer(undefined, {});
+ expect(state).to.have.property('enabled', false);
+ expect(state).to.have.property('keyword', '');
+ });
+
+ it('return next state for FIND_SHOW', () => {
+ let action = { type: actions.FIND_SHOW };
+ let prev = { enabled: false };
+ let state = findReducer(prev, action);
+
+ expect(state.enabled).is.equal(true);
+ });
+
+ it('return next state for FIND_HIDE', () => {
+ let action = { type: actions.FIND_HIDE };
+ let prev = { enabled: true };
+ let state = findReducer(prev, action);
+
+ expect(state.enabled).is.equal(false);
+ });
+
+ it('return next state for FIND_SET_KEYWORD', () => {
+ let action = { type: actions.FIND_SET_KEYWORD, keyword: 'my-search' };
+ let state = { enabled: true, keyword: '' };
+
+ state = findReducer(state, action);
+
+ expect(state.keyword).is.equal('my-search');
+ });
+});