aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErwan Ameil <wan@idlewan.com>2017-11-16 13:03:38 +0000
committerErwan Ameil <wan@idlewan.com>2017-11-16 13:03:38 +0000
commit177940981ed9c4f096ad7db20f0b7ee044fd7b17 (patch)
treeee187b6b621a356f894971c2ee18169cac28a40f /src
parenta50c7dd0a20cbef8860c3592ae70d3813d94b78d (diff)
Open adjacent tabs and background tabs
Diffstat (limited to 'src')
-rw-r--r--src/background/actions/tab.js6
-rw-r--r--src/background/components/background.js3
-rw-r--r--src/content/actions/follow-controller.js3
-rw-r--r--src/content/actions/operation.js3
-rw-r--r--src/content/components/common/follow.js8
-rw-r--r--src/content/components/top-content/follow-controller.js3
-rw-r--r--src/content/reducers/follow-controller.js2
-rw-r--r--src/shared/commands.js20
-rw-r--r--src/shared/default-settings.js7
-rw-r--r--src/shared/validators/setting.js2
10 files changed, 38 insertions, 19 deletions
diff --git a/src/background/actions/tab.js b/src/background/actions/tab.js
index e512b6f..d996b9f 100644
--- a/src/background/actions/tab.js
+++ b/src/background/actions/tab.js
@@ -1,9 +1,5 @@
-const openNewTab = (url) => {
- return browser.tabs.create({ url: url });
-};
-
const openToTab = (url, tab) => {
return browser.tabs.update(tab.id, { url: url });
};
-export { openToTab, openNewTab };
+export { openToTab };
diff --git a/src/background/components/background.js b/src/background/components/background.js
index 2d94310..6026684 100644
--- a/src/background/components/background.js
+++ b/src/background/components/background.js
@@ -30,7 +30,8 @@ export default class BackgroundComponent {
case messages.OPEN_URL:
if (message.newTab) {
return this.store.dispatch(
- tabActions.openNewTab(message.url), sender);
+ commands.tabopenCommand(message.url, message.background,
+ settings.value.openAdjacentTabs), sender);
}
return this.store.dispatch(
tabActions.openToTab(message.url, sender.tab), sender);
diff --git a/src/content/actions/follow-controller.js b/src/content/actions/follow-controller.js
index 3fd4dce..006b248 100644
--- a/src/content/actions/follow-controller.js
+++ b/src/content/actions/follow-controller.js
@@ -1,9 +1,10 @@
import actions from 'content/actions';
-const enable = (newTab) => {
+const enable = (newTab, background) => {
return {
type: actions.FOLLOW_CONTROLLER_ENABLE,
newTab,
+ background,
};
};
diff --git a/src/content/actions/operation.js b/src/content/actions/operation.js
index 767f14b..5c8fe83 100644
--- a/src/content/actions/operation.js
+++ b/src/content/actions/operation.js
@@ -40,7 +40,8 @@ const exec = (operation) => {
case operations.FOLLOW_START:
return window.top.postMessage(JSON.stringify({
type: messages.FOLLOW_START,
- newTab: operation.newTab
+ newTab: operation.newTab,
+ background: operation.background,
}), '*');
case operations.NAVIGATE_HISTORY_PREV:
return navigates.historyPrev(window);
diff --git a/src/content/components/common/follow.js b/src/content/components/common/follow.js
index 7a35105..43f2ea1 100644
--- a/src/content/components/common/follow.js
+++ b/src/content/components/common/follow.js
@@ -34,6 +34,7 @@ export default class Follow {
this.win = win;
this.store = store;
this.newTab = false;
+ this.background = false;
this.hints = {};
this.targets = [];
@@ -68,6 +69,7 @@ export default class Follow {
type: messages.OPEN_URL,
url: element.href,
newTab: true,
+ background: this.background,
});
}
@@ -79,12 +81,13 @@ export default class Follow {
}), '*');
}
- createHints(keysArray, newTab) {
+ createHints(keysArray, newTab, background) {
if (keysArray.length !== this.targets.length) {
throw new Error('illegal hint count');
}
this.newTab = newTab;
+ this.background = background;
this.hints = {};
for (let i = 0; i < keysArray.length; ++i) {
let keys = keysArray[i];
@@ -150,7 +153,8 @@ export default class Follow {
case messages.FOLLOW_REQUEST_COUNT_TARGETS:
return this.countHints(sender, message.viewSize, message.framePosition);
case messages.FOLLOW_CREATE_HINTS:
- return this.createHints(message.keysArray, message.newTab);
+ return this.createHints(
+ message.keysArray, message.newTab, message.background);
case messages.FOLLOW_SHOW_HINTS:
return this.showHints(message.keys);
case messages.FOLLOW_ACTIVATE:
diff --git a/src/content/components/top-content/follow-controller.js b/src/content/components/top-content/follow-controller.js
index d373177..f759c8c 100644
--- a/src/content/components/top-content/follow-controller.js
+++ b/src/content/components/top-content/follow-controller.js
@@ -29,7 +29,7 @@ export default class FollowController {
switch (message.type) {
case messages.FOLLOW_START:
return this.store.dispatch(
- followControllerActions.enable(message.newTab));
+ followControllerActions.enable(message.newTab, message.background));
case messages.FOLLOW_RESPONSE_COUNT_TARGETS:
return this.create(message.count, sender);
case messages.FOLLOW_KEY_PRESS:
@@ -126,6 +126,7 @@ export default class FollowController {
type: messages.FOLLOW_CREATE_HINTS,
keysArray: produced,
newTab: this.state.newTab,
+ background: this.state.background,
}), '*');
}
diff --git a/src/content/reducers/follow-controller.js b/src/content/reducers/follow-controller.js
index 2afb232..78fd848 100644
--- a/src/content/reducers/follow-controller.js
+++ b/src/content/reducers/follow-controller.js
@@ -3,6 +3,7 @@ import actions from 'content/actions';
const defaultState = {
enabled: false,
newTab: false,
+ background: false,
keys: '',
};
@@ -12,6 +13,7 @@ export default function reducer(state = defaultState, action = {}) {
return Object.assign({}, state, {
enabled: true,
newTab: action.newTab,
+ background: action.background,
keys: '',
});
case actions.FOLLOW_CONTROLLER_DISABLE:
diff --git a/src/shared/commands.js b/src/shared/commands.js
index 8edeb5c..bcad313 100644
--- a/src/shared/commands.js
+++ b/src/shared/commands.js
@@ -33,8 +33,19 @@ const openCommand = (url) => {
});
};
-const tabopenCommand = (url) => {
- return browser.tabs.create({ url: url });
+const tabopenCommand = (url, background = false, adjacent = false) => {
+ if (adjacent) {
+ return browser.tabs.query({
+ active: true, currentWindow: true
+ }).then((gotTabs) => {
+ return browser.tabs.create({
+ url: url,
+ active: !background,
+ index: gotTabs[0].index + 1
+ });
+ });
+ }
+ return browser.tabs.create({ url: url, active: !background });
};
const winopenCommand = (url) => {
@@ -102,7 +113,8 @@ const doCommand = (line, settings) => {
return openCommand(normalizeUrl(words, settings.search));
case 't':
case 'tabopen':
- return tabopenCommand(normalizeUrl(words, settings.search));
+ return tabopenCommand(
+ normalizeUrl(words, settings.search), false, settings.openAdjacentTabs);
case 'w':
case 'winopen':
return winopenCommand(normalizeUrl(words, settings.search));
@@ -166,4 +178,4 @@ const complete = (line, settings) => {
return getCompletions(line, settings);
};
-export { exec, complete };
+export { exec, complete, tabopenCommand };
diff --git a/src/shared/default-settings.js b/src/shared/default-settings.js
index 608890b..d691859 100644
--- a/src/shared/default-settings.js
+++ b/src/shared/default-settings.js
@@ -37,8 +37,8 @@ export default {
"zi": { "type": "zoom.in" },
"zo": { "type": "zoom.out" },
"zz": { "type": "zoom.neutral" },
- "f": { "type": "follow.start", "newTab": false },
- "F": { "type": "follow.start", "newTab": true },
+ "f": { "type": "follow.start", "newTab": false, "background": false },
+ "F": { "type": "follow.start", "newTab": true, "background": false },
"H": { "type": "navigate.history.prev" },
"L": { "type": "navigate.history.next" },
"[[": { "type": "navigate.link.prev" },
@@ -61,6 +61,7 @@ export default {
"twitter": "https://twitter.com/search?q={}",
"wikipedia": "https://en.wikipedia.org/w/index.php?search={}"
}
- }
+ },
+ "openAdjacentTabs": false
}`
};
diff --git a/src/shared/validators/setting.js b/src/shared/validators/setting.js
index 949ab29..5fe75b2 100644
--- a/src/shared/validators/setting.js
+++ b/src/shared/validators/setting.js
@@ -1,6 +1,6 @@
import operations from 'shared/operations';
-const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist'];
+const VALID_TOP_KEYS = ['keymaps', 'search', 'blacklist', 'openAdjacentTabs'];
const VALID_OPERATION_VALUES = Object.keys(operations).map((key) => {
return operations[key];
});