follow as redux

This commit is contained in:
Shin'ya Ueoka 2017-10-02 21:35:52 +09:00
parent 6f857e2c81
commit 0a7ae631cd
8 changed files with 297 additions and 208 deletions

View file

@ -2,63 +2,25 @@ import './console-frame.scss';
import * as consoleFrames from './console-frames';
import * as scrolls from '../content/scrolls';
import * as navigates from '../content/navigates';
import Follow from '../content/follow';
import * as followActions from '../actions/follow';
import * as store from '../store';
import FollowComponent from '../components/follow';
import followReducer from '../reducers/follow';
import operations from '../operations';
import messages from './messages';
const followStore = store.createStore(followReducer);
const followComponent = new FollowComponent(window.document.body, followStore);
followStore.subscribe(() => {
try {
followComponent.update();
} catch (e) {
console.error(e);
}
});
consoleFrames.initialize(window.document);
const startFollows = (newTab) => {
let follow = new Follow(window.document);
follow.onActivated((element) => {
switch (element.tagName.toLowerCase()) {
case 'a':
if (newTab) {
// getAttribute() to avoid to resolve absolute path
let href = element.getAttribute('href');
// eslint-disable-next-line no-script-url
if (!href || href === '#' || href.startsWith('javascript:')) {
return;
}
return browser.runtime.sendMessage({
type: messages.OPEN_URL,
url: element.href,
newTab
});
}
if (element.href.startsWith('http://') ||
element.href.startsWith('https://') ||
element.href.startsWith('ftp://')) {
return browser.runtime.sendMessage({
type: messages.OPEN_URL,
url: element.href,
newTab
});
}
return element.click();
case 'input':
switch (element.type) {
case 'file':
case 'checkbox':
case 'radio':
case 'submit':
case 'reset':
case 'button':
case 'image':
case 'color':
return element.click();
default:
return element.focus();
}
case 'textarea':
return element.focus();
case 'button':
return element.click();
}
});
};
window.addEventListener('keypress', (e) => {
if (e.target instanceof HTMLInputElement ||
e.target instanceof HTMLTextAreaElement ||
@ -90,7 +52,7 @@ const execOperation = (operation) => {
case operations.SCROLL_END:
return scrolls.scrollRight(window);
case operations.FOLLOW_START:
return startFollows(operation.newTab);
return followStore.dispatch(followActions.enable(false));
case operations.NAVIGATE_HISTORY_PREV:
return navigates.historyPrev(window);
case operations.NAVIGATE_HISTORY_NEXT: