diff options
| -rw-r--r-- | src/content/actions/find.js | 36 | ||||
| -rw-r--r-- | src/content/actions/index.js | 5 | ||||
| -rw-r--r-- | src/content/reducers/find.js | 25 | ||||
| -rw-r--r-- | src/content/reducers/index.js | 3 | ||||
| -rw-r--r-- | test/content/actions/find.test.js | 19 | ||||
| -rw-r--r-- | test/content/reducers/find.test.js | 36 | 
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'); +  }); +}); | 
