aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-10-08 20:01:57 +0900
committerGitHub <noreply@github.com>2017-10-08 20:01:57 +0900
commit8b9125871b59d915324176ab959bb0aed20a727a (patch)
treea10db125bd25c1447bb08de2ef156c010243f019 /src
parentbbf90e77e99846c970118744066fbc21006761b5 (diff)
parent7ac00fce6f6c431f96c531179c6af3796df7e07a (diff)
Merge pull request #24 from ueokande/yank-url
Yank url
Diffstat (limited to 'src')
-rw-r--r--src/background/actions/index.js0
-rw-r--r--src/background/components/background.js2
-rw-r--r--src/console/actions/console.js14
-rw-r--r--src/console/actions/index.js5
-rw-r--r--src/console/components/console.js31
-rw-r--r--src/console/index.html4
-rw-r--r--src/console/index.js27
-rw-r--r--src/console/reducers/index.js26
-rw-r--r--src/console/site.scss10
-rw-r--r--src/content/actions/operation.js8
-rw-r--r--src/content/console-frames.js7
-rw-r--r--src/content/index.js2
-rw-r--r--src/content/urls.js15
-rw-r--r--src/shared/default-settings.js3
-rw-r--r--src/shared/messages.js3
-rw-r--r--src/shared/operations.js3
16 files changed, 107 insertions, 53 deletions
diff --git a/src/background/actions/index.js b/src/background/actions/index.js
deleted file mode 100644
index e69de29..0000000
--- a/src/background/actions/index.js
+++ /dev/null
diff --git a/src/background/components/background.js b/src/background/components/background.js
index bfe1b3f..0570a5a 100644
--- a/src/background/components/background.js
+++ b/src/background/components/background.js
@@ -48,7 +48,7 @@ export default class BackgroundComponent {
tabActions.openToTab(message.url, sender.tab), sender);
case messages.CONSOLE_BLURRED:
return browser.tabs.sendMessage(sender.tab.id, {
- type: messages.CONSOLE_HIDE,
+ type: messages.CONSOLE_HIDE_COMMAND,
});
case messages.CONSOLE_ENTERED:
return commands.exec(message.text, this.settings).catch((e) => {
diff --git a/src/console/actions/console.js b/src/console/actions/console.js
index 01d9a9b..0d891bb 100644
--- a/src/console/actions/console.js
+++ b/src/console/actions/console.js
@@ -14,9 +14,16 @@ const showError = (text) => {
};
};
-const hide = () => {
+const showInfo = (text) => {
return {
- type: actions.CONSOLE_HIDE
+ type: actions.CONSOLE_SHOW_INFO,
+ text: text
+ };
+};
+
+const hideCommand = () => {
+ return {
+ type: actions.CONSOLE_HIDE_COMMAND,
};
};
@@ -40,5 +47,6 @@ const completionPrev = () => {
};
export {
- showCommand, showError, hide, setCompletions, completionNext, completionPrev
+ showCommand, showError, showInfo, hideCommand,
+ setCompletions, completionNext, completionPrev
};
diff --git a/src/console/actions/index.js b/src/console/actions/index.js
index a5d03bc..c4f88cd 100644
--- a/src/console/actions/index.js
+++ b/src/console/actions/index.js
@@ -1,9 +1,10 @@
export default {
// console commands
CONSOLE_SHOW_COMMAND: 'console.show.command',
- CONSOLE_SET_COMPLETIONS: 'console.set.completions',
CONSOLE_SHOW_ERROR: 'console.show.error',
- CONSOLE_HIDE: 'console.hide',
+ CONSOLE_SHOW_INFO: 'console.show.info',
+ CONSOLE_HIDE_COMMAND: 'console.hide.command',
+ CONSOLE_SET_COMPLETIONS: 'console.set.completions',
CONSOLE_COMPLETION_NEXT: 'console.completion.next',
CONSOLE_COMPLETION_PREV: 'console.completion.prev',
};
diff --git a/src/console/components/console.js b/src/console/components/console.js
index 9023d91..93802f8 100644
--- a/src/console/components/console.js
+++ b/src/console/components/console.js
@@ -16,7 +16,7 @@ export default class ConsoleComponent {
input.addEventListener('keyup', this.onKeyUp.bind(this));
this.hideCommand();
- this.hideError();
+ this.hideMessage();
}
onBlur() {
@@ -72,17 +72,16 @@ export default class ConsoleComponent {
update() {
let state = this.store.getState();
- if (!this.prevState.commandShown && state.commandShown) {
+ if (this.prevState.mode !== 'command' && state.mode === 'command') {
this.showCommand(state.commandText);
- } else if (!state.commandShown) {
+ } else if (state.mode !== 'command') {
this.hideCommand();
}
- if (state.errorShown) {
- this.setErrorText(state.errorText);
- this.showError();
+ if (state.mode === 'error' || state.mode === 'info') {
+ this.showMessage(state.mode, state.messageText);
} else {
- this.hideError();
+ this.hideMessage();
}
if (state.groupSelection >= 0 && state.itemSelection >= 0) {
@@ -128,21 +127,21 @@ export default class ConsoleComponent {
input.value = this.completionOrigin;
}
- setErrorText(text) {
+ showMessage(mode, text) {
let doc = this.wrapper.ownerDocument;
- let error = doc.querySelector('#vimvixen-console-error');
+ let error = doc.querySelector('#vimvixen-console-message');
+ error.classList.remove(
+ 'vimvixen-console-info',
+ 'vimvixen-console-error'
+ );
+ error.classList.add('vimvixen-console-' + mode);
error.textContent = text;
- }
-
- showError() {
- let doc = this.wrapper.ownerDocument;
- let error = doc.querySelector('#vimvixen-console-error');
error.style.display = 'block';
}
- hideError() {
+ hideMessage() {
let doc = this.wrapper.ownerDocument;
- let error = doc.querySelector('#vimvixen-console-error');
+ let error = doc.querySelector('#vimvixen-console-message');
error.style.display = 'none';
}
}
diff --git a/src/console/index.html b/src/console/index.html
index 4222f12..f41a8dc 100644
--- a/src/console/index.html
+++ b/src/console/index.html
@@ -6,8 +6,8 @@
<script src='console.js'></script>
</head>
<body class='vimvixen-console'>
- <p id='vimvixen-console-error'
- class='vimvixen-console-error'></p>
+ <p id='vimvixen-console-message'
+ class='vimvixen-console-message'></p>
<div id='vimvixen-console-command'>
<ul id='vimvixen-console-completion' class='vimvixen-console-completion'></ul>
<div class='vimvixen-console-command'>
diff --git a/src/console/index.js b/src/console/index.js
index 7396a96..895fcc2 100644
--- a/src/console/index.js
+++ b/src/console/index.js
@@ -17,18 +17,25 @@ window.addEventListener('load', () => {
consoleComponent = new ConsoleComponent(document.body, store);
});
+const onMessage = (message) => {
+ switch (message.type) {
+ case messages.CONSOLE_SHOW_COMMAND:
+ return store.dispatch(consoleActions.showCommand(message.command));
+ case messages.CONSOLE_SHOW_ERROR:
+ return store.dispatch(consoleActions.showError(message.text));
+ case messages.CONSOLE_SHOW_INFO:
+ return store.dispatch(consoleActions.showInfo(message.text));
+ case messages.CONSOLE_HIDE_COMMAND:
+ return store.dispatch(consoleActions.hideCommand());
+ }
+};
+
store.subscribe(() => {
completionComponent.update();
consoleComponent.update();
});
-browser.runtime.onMessage.addListener((action) => {
- switch (action.type) {
- case messages.CONSOLE_SHOW_COMMAND:
- return store.dispatch(consoleActions.showCommand(action.command));
- case messages.CONSOLE_SHOW_ERROR:
- return store.dispatch(consoleActions.showError(action.text));
- case messages.CONSOLE_HIDE:
- return store.dispatch(consoleActions.hide(action.command));
- }
-});
+browser.runtime.onMessage.addListener(onMessage);
+window.addEventListener('message', (message) => {
+ onMessage(JSON.parse(message.data));
+}, false);
diff --git a/src/console/reducers/index.js b/src/console/reducers/index.js
index ee9c691..d4affa7 100644
--- a/src/console/reducers/index.js
+++ b/src/console/reducers/index.js
@@ -1,9 +1,8 @@
import actions from 'console/actions';
const defaultState = {
- errorShown: false,
- errorText: '',
- commandShown: false,
+ mode: '',
+ messageText: '',
commandText: '',
completions: [],
groupSelection: -1,
@@ -48,25 +47,24 @@ export default function reducer(state = defaultState, action = {}) {
switch (action.type) {
case actions.CONSOLE_SHOW_COMMAND:
return Object.assign({}, state, {
- commandShown: true,
+ mode: 'command',
commandText: action.text,
errorShown: false,
completions: []
});
case actions.CONSOLE_SHOW_ERROR:
return Object.assign({}, state, {
- errorText: action.text,
- errorShown: true,
- commandShown: false,
+ mode: 'error',
+ messageText: action.text,
});
- case actions.CONSOLE_HIDE:
- if (state.errorShown) {
- // keep error message if shown
- return state;
- }
+ case actions.CONSOLE_SHOW_INFO:
return Object.assign({}, state, {
- errorShown: false,
- commandShown: false
+ mode: 'info',
+ messageText: action.text,
+ });
+ case actions.CONSOLE_HIDE_COMMAND:
+ return Object.assign({}, state, {
+ mode: state.mode === 'command' ? '' : state.mode,
});
case actions.CONSOLE_SET_COMPLETIONS:
return Object.assign({}, state, {
diff --git a/src/console/site.scss b/src/console/site.scss
index 5823dce..e5cb2df 100644
--- a/src/console/site.scss
+++ b/src/console/site.scss
@@ -64,12 +64,20 @@ body {
}
}
+ &-message {
+ @include consoole-font;
+ }
+
&-error {
background-color: red;
font-weight: bold;
color: white;
+ }
- @include consoole-font;
+ &-info {
+ background-color: white;
+ font-weight: normal;
+ color: green;
}
&-command {
diff --git a/src/content/actions/operation.js b/src/content/actions/operation.js
index d188a60..0d5088b 100644
--- a/src/content/actions/operation.js
+++ b/src/content/actions/operation.js
@@ -2,7 +2,9 @@ import operations from 'shared/operations';
import messages from 'shared/messages';
import * as scrolls from 'content/scrolls';
import * as navigates from 'content/navigates';
+import * as urls from 'content/urls';
import * as followActions from 'content/actions/follow';
+import * as consoleFrames from 'content/console-frames';
const exec = (operation) => {
switch (operation.type) {
@@ -32,6 +34,12 @@ const exec = (operation) => {
return navigates.parent(window);
case operations.NAVIGATE_ROOT:
return navigates.root(window);
+ case operations.URLS_YANK:
+ urls.yank(window);
+ return consoleFrames.postMessage(window.document, {
+ type: messages.CONSOLE_SHOW_INFO,
+ text: 'Current url yanked',
+ });
default:
browser.runtime.sendMessage({
type: messages.BACKGROUND_OPERATION,
diff --git a/src/content/console-frames.js b/src/content/console-frames.js
index 3f06466..35b975f 100644
--- a/src/content/console-frames.js
+++ b/src/content/console-frames.js
@@ -15,4 +15,9 @@ const blur = (doc) => {
iframe.blur();
};
-export { initialize, blur };
+const postMessage = (doc, message) => {
+ let iframe = doc.getElementById('vimvixen-console-frame');
+ iframe.contentWindow.postMessage(JSON.stringify(message), '*');
+};
+
+export { initialize, blur, postMessage };
diff --git a/src/content/index.js b/src/content/index.js
index adea871..63bbf77 100644
--- a/src/content/index.js
+++ b/src/content/index.js
@@ -40,7 +40,7 @@ const reloadSettings = () => {
browser.runtime.onMessage.addListener((action) => {
switch (action.type) {
- case messages.CONSOLE_HIDE:
+ case messages.CONSOLE_HIDE_COMMAND:
window.focus();
consoleFrames.blur(window.document);
return Promise.resolve();
diff --git a/src/content/urls.js b/src/content/urls.js
new file mode 100644
index 0000000..8f8a1ac
--- /dev/null
+++ b/src/content/urls.js
@@ -0,0 +1,15 @@
+const yank = (win) => {
+ let input = win.document.createElement('input');
+ win.document.body.append(input);
+
+ input.style.position = 'fixed';
+ input.style.top = '-100px';
+ input.value = win.location.href;
+ input.select();
+
+ win.document.execCommand('copy');
+
+ input.remove();
+};
+
+export { yank };
diff --git a/src/shared/default-settings.js b/src/shared/default-settings.js
index d602117..24ac536 100644
--- a/src/shared/default-settings.js
+++ b/src/shared/default-settings.js
@@ -37,7 +37,8 @@ export default {
"[[": { "type": "navigate.link.prev" },
"]]": { "type": "navigate.link.next" },
"gu": { "type": "navigate.parent" },
- "gU": { "type": "navigate.root" }
+ "gU": { "type": "navigate.root" },
+ "y": { "type": "urls.yank" }
},
"search": {
"default": "google",
diff --git a/src/shared/messages.js b/src/shared/messages.js
index 138f0e0..2467a67 100644
--- a/src/shared/messages.js
+++ b/src/shared/messages.js
@@ -8,7 +8,8 @@ export default {
CONSOLE_QUERY_COMPLETIONS: 'console.query.completions',
CONSOLE_SHOW_COMMAND: 'console.show.command',
CONSOLE_SHOW_ERROR: 'console.show.error',
- CONSOLE_HIDE: 'console.hide',
+ CONSOLE_SHOW_INFO: 'console.show.info',
+ CONSOLE_HIDE_COMMAND: 'console.hide.command',
OPEN_URL: 'open.url',
diff --git a/src/shared/operations.js b/src/shared/operations.js
index 5e4a1e5..ca62716 100644
--- a/src/shared/operations.js
+++ b/src/shared/operations.js
@@ -36,4 +36,7 @@ export default {
ZOOM_IN: 'zoom.in',
ZOOM_OUT: 'zoom.out',
ZOOM_NEUTRAL: 'zoom.neutral',
+
+ // Url yank
+ URLS_YANK: 'urls.yank',
};