From aeb0e0f96de7b2f9b5a143c8a900e2349bb0702a Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 17 Sep 2017 09:26:51 +0900 Subject: [PATCH 1/5] rename history navigation --- src/background/keys.js | 4 ++-- src/content/histories.js | 8 -------- src/content/index.js | 10 +++++----- src/content/navigates.js | 8 ++++++++ src/operations/index.js | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 src/content/histories.js create mode 100644 src/content/navigates.js diff --git a/src/background/keys.js b/src/background/keys.js index 9121e0f..577f023 100644 --- a/src/background/keys.js +++ b/src/background/keys.js @@ -28,8 +28,8 @@ const defaultKeymap = { 'zz': { type: operations.ZOOM_NEUTRAL }, 'f': { type: operations.FOLLOW_START, newTab: false }, 'F': { type: operations.FOLLOW_START, newTab: true }, - 'H': { type: operations.HISTORY_PREV }, - 'L': { type: operations.HISTORY_NEXT }, + 'H': { type: operations.NAVIGATE_HISTORY_PREV }, + 'L': { type: operations.NAVIGATE_HISTORY_NEXT }, }; const asKeymapChars = (keys) => { diff --git a/src/content/histories.js b/src/content/histories.js deleted file mode 100644 index 9c5665d..0000000 --- a/src/content/histories.js +++ /dev/null @@ -1,8 +0,0 @@ -const prev = (win) => { - win.history.back(); -}; -const next = (win) => { - win.history.forward(); -}; - -export { prev, next }; diff --git a/src/content/index.js b/src/content/index.js index 91f5420..be01089 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -1,7 +1,7 @@ import '../console/console-frame.scss'; import * as consoleFrames from '../console/frames'; import * as scrolls from '../content/scrolls'; -import * as histories from '../content/histories'; +import * as navigates from '../content/navigates'; import Follow from '../content/follow'; import operations from '../operations'; import messages from '../messages'; @@ -35,10 +35,10 @@ const execOperation = (operation) => { return scrolls.scrollRight(window); case operations.FOLLOW_START: return new Follow(window.document, operation.newTab); - case operations.HISTORY_PREV: - return histories.prev(window); - case operations.HISTORY_NEXT: - return histories.next(window); + case operations.NAVIGATE_HISTORY_PREV: + return navigates.historyPrev(window); + case operations.NAVIGATE_HISTORY_NEXT: + return navigates.historyNext(window); } }; diff --git a/src/content/navigates.js b/src/content/navigates.js new file mode 100644 index 0000000..28f34c5 --- /dev/null +++ b/src/content/navigates.js @@ -0,0 +1,8 @@ +const historyPrev = (win) => { + win.history.back(); +}; +const historyNext = (win) => { + win.history.forward(); +}; + +export { historyPrev, historyNext }; diff --git a/src/operations/index.js b/src/operations/index.js index c2db007..6d8cc7e 100644 --- a/src/operations/index.js +++ b/src/operations/index.js @@ -11,8 +11,8 @@ export default { SCROLL_LEFT: 'scroll.left', SCROLL_RIGHT: 'scroll.right', FOLLOW_START: 'follow.start', - HISTORY_PREV: 'history.prev', - HISTORY_NEXT: 'history.next', + NAVIGATE_HISTORY_PREV: 'navigate.history.prev', + NAVIGATE_HISTORY_NEXT: 'navigate.history.next', // Background TABS_CLOSE: 'tabs.close', From ac8b40a2f3a50bb30f121dcc1a454074498e7bf7 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 17 Sep 2017 10:52:09 +0900 Subject: [PATCH 2/5] pagenate by prev/next links --- README.md | 2 +- src/background/keys.js | 2 ++ src/content/index.js | 4 +++ src/content/navigates.js | 41 +++++++++++++++++++++++++++- src/operations/index.js | 2 ++ test/content/navigates.test.js | 50 ++++++++++++++++++++++++++++++++++ 6 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 test/content/navigates.test.js diff --git a/README.md b/README.md index 84cf2a2..c163901 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Firefox by WebExtensions API. - [ ] find a keyword in the page - [ ] navigations - [ ] yank/paste page - - [ ] pagenation + - [x] pagenation - [ ] open parent page - [ ] hints - [x] open a link diff --git a/src/background/keys.js b/src/background/keys.js index 577f023..2549c8d 100644 --- a/src/background/keys.js +++ b/src/background/keys.js @@ -30,6 +30,8 @@ const defaultKeymap = { 'F': { type: operations.FOLLOW_START, newTab: true }, 'H': { type: operations.NAVIGATE_HISTORY_PREV }, 'L': { type: operations.NAVIGATE_HISTORY_NEXT }, + '[[': { type: operations.NAVIGATE_LINK_PREV }, + ']]': { type: operations.NAVIGATE_LINK_NEXT }, }; const asKeymapChars = (keys) => { diff --git a/src/content/index.js b/src/content/index.js index be01089..0e4f7e1 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -39,6 +39,10 @@ const execOperation = (operation) => { return navigates.historyPrev(window); case operations.NAVIGATE_HISTORY_NEXT: return navigates.historyNext(window); + case operations.NAVIGATE_LINK_PREV: + return navigates.linkPrev(window); + case operations.NAVIGATE_LINK_NEXT: + return navigates.linkNext(window); } }; diff --git a/src/content/navigates.js b/src/content/navigates.js index 28f34c5..b68052d 100644 --- a/src/content/navigates.js +++ b/src/content/navigates.js @@ -1,8 +1,47 @@ +const PREV_LINK_PATTERNS = [ + /\bprev\b/i, /\bprevious\b/i, /\bback\b/i, + //, /\u203a/, /\u2192/, /\xbb/, /\u226b/, />>/ +]; + +const findLinkByPatterns = (win, patterns) => { + let links = win.document.getElementsByTagName('a'); + return Array.prototype.find.call(links, (link) => { + return patterns.some(ptn => ptn.test(link.textContent)); + }); +}; + const historyPrev = (win) => { win.history.back(); }; + const historyNext = (win) => { win.history.forward(); }; -export { historyPrev, historyNext }; +const linkPrev = (win) => { + let link = win.document.querySelector('a[rel=prev]'); + if (link) { + return link.click(); + } + link = findLinkByPatterns(win, PREV_LINK_PATTERNS); + if (link) { + link.click(); + } +}; + +const linkNext = (win) => { + let link = win.document.querySelector('a[rel=next]'); + if (link) { + return link.click(); + } + link = findLinkByPatterns(win, NEXT_LINK_PATTERNS); + if (link) { + link.click(); + } +}; + +export { historyPrev, historyNext, linkPrev, linkNext }; diff --git a/src/operations/index.js b/src/operations/index.js index 6d8cc7e..bb19df8 100644 --- a/src/operations/index.js +++ b/src/operations/index.js @@ -13,6 +13,8 @@ export default { FOLLOW_START: 'follow.start', NAVIGATE_HISTORY_PREV: 'navigate.history.prev', NAVIGATE_HISTORY_NEXT: 'navigate.history.next', + NAVIGATE_LINK_PREV: 'navigate.link.prev', + NAVIGATE_LINK_NEXT: 'navigate.link.next', // Background TABS_CLOSE: 'tabs.close', diff --git a/test/content/navigates.test.js b/test/content/navigates.test.js new file mode 100644 index 0000000..21c2a23 --- /dev/null +++ b/test/content/navigates.test.js @@ -0,0 +1,50 @@ +import { expect } from "chai"; +import * as navigates from '../../src/content/navigates'; + +describe('navigates module', () => { + beforeEach(() => { + }); + + describe('#linkPrev', () => { + it('clicks prev link by text content', (done) => { + document.body.innerHTML = 'xprevx go to prev'; + navigates.linkPrev(window); + setTimeout(() => { + expect(document.location.hash).to.equal('#prev'); + done(); + }, 0); + }); + + it('clicks a[rel=prev] element preferentially', (done) => { + document.body.innerHTML = 'prev '; + navigates.linkPrev(window); + setTimeout(() => { + expect(document.location.hash).to.equal('#prev'); + done(); + }, 0); + }); + }); + + + describe('#linkNext', () => { + it('clicks next link by text content', (done) => { + document.body.innerHTML = 'xnextx go to next'; + navigates.linkNext(window); + setTimeout(() => { + expect(document.location.hash).to.equal('#next'); + done(); + }, 0); + }); + + it('clicks a[rel=next] element preferentially', (done) => { + document.body.innerHTML = 'next '; + navigates.linkNext(window); + setTimeout(() => { + expect(document.location.hash).to.equal('#next'); + done(); + }, 0); + }); + }); +}); + + From 0be9776cb3d9033bcd3ae569bec71b300f2d4073 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 17 Sep 2017 11:25:42 +0900 Subject: [PATCH 3/5] fix ctrl modifier --- src/content/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/index.js b/src/content/index.js index 0e4f7e1..9fd46be 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -15,7 +15,7 @@ window.addEventListener('keypress', (e) => { browser.runtime.sendMessage({ type: messages.KEYDOWN, code: e.which, - ctrl: e.ctrl + ctrl: e.ctrlKey }); }); From e9863299abf9498c67660e8a97c70ddb090baffe Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 17 Sep 2017 12:52:24 +0900 Subject: [PATCH 4/5] implement go-parent command --- README.md | 2 +- src/background/keys.js | 1 + src/content/index.js | 2 ++ src/content/navigates.js | 21 ++++++++++++++++++++- src/operations/index.js | 1 + test/content/navigates.test.js | 12 +++++++++--- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c163901..d77291d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Firefox by WebExtensions API. - [ ] navigations - [ ] yank/paste page - [x] pagenation - - [ ] open parent page + - [x] open parent page - [ ] hints - [x] open a link - [ ] open a link in new tab diff --git a/src/background/keys.js b/src/background/keys.js index 2549c8d..992b42d 100644 --- a/src/background/keys.js +++ b/src/background/keys.js @@ -32,6 +32,7 @@ const defaultKeymap = { 'L': { type: operations.NAVIGATE_HISTORY_NEXT }, '[[': { type: operations.NAVIGATE_LINK_PREV }, ']]': { type: operations.NAVIGATE_LINK_NEXT }, + 'gu': { type: operations.NAVIGATE_PARENT }, }; const asKeymapChars = (keys) => { diff --git a/src/content/index.js b/src/content/index.js index 9fd46be..4751cde 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -43,6 +43,8 @@ const execOperation = (operation) => { return navigates.linkPrev(window); case operations.NAVIGATE_LINK_NEXT: return navigates.linkNext(window); + case operations.NAVIGATE_PARENT: + return navigates.parent(window); } }; diff --git a/src/content/navigates.js b/src/content/navigates.js index b68052d..692b7be 100644 --- a/src/content/navigates.js +++ b/src/content/navigates.js @@ -44,4 +44,23 @@ const linkNext = (win) => { } }; -export { historyPrev, historyNext, linkPrev, linkNext }; +const parent = (win) => { + let loc = win.location; + if (loc.hash !== '') { + loc.hash = ''; + return; + } else if (loc.search !== '') { + loc.search = ''; + return; + } + + const basenamePattern = /\/[^/]+$/; + const lastDirPattern = /\/[^/]+\/$/; + if (basenamePattern.test(loc.pathname)) { + loc.pathname = loc.pathname.replace(basenamePattern, '/'); + } else if (lastDirPattern.test(loc.pathname)) { + loc.pathname = loc.pathname.replace(lastDirPattern, '/'); + } +}; + +export { historyPrev, historyNext, linkPrev, linkNext, parent }; diff --git a/src/operations/index.js b/src/operations/index.js index bb19df8..493e866 100644 --- a/src/operations/index.js +++ b/src/operations/index.js @@ -15,6 +15,7 @@ export default { NAVIGATE_HISTORY_NEXT: 'navigate.history.next', NAVIGATE_LINK_PREV: 'navigate.link.prev', NAVIGATE_LINK_NEXT: 'navigate.link.next', + NAVIGATE_PARENT: 'navigate.parent', // Background TABS_CLOSE: 'tabs.close', diff --git a/test/content/navigates.test.js b/test/content/navigates.test.js index 21c2a23..cf20435 100644 --- a/test/content/navigates.test.js +++ b/test/content/navigates.test.js @@ -2,9 +2,6 @@ import { expect } from "chai"; import * as navigates from '../../src/content/navigates'; describe('navigates module', () => { - beforeEach(() => { - }); - describe('#linkPrev', () => { it('clicks prev link by text content', (done) => { document.body.innerHTML = 'xprevx go to prev'; @@ -45,6 +42,15 @@ describe('navigates module', () => { }, 0); }); }); + + describe('#parent', () => { + // NOTE: not able to test location + it('removes hash', () => { + window.location.hash = "#section-1"; + navigates.parent(window); + expect(document.location.hash).to.be.empty; + }); + }); }); From ac8f7e65dc90327e05fb30fd5b20d56c3799f3d8 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 17 Sep 2017 12:55:43 +0900 Subject: [PATCH 5/5] implement go-root command --- README.md | 1 + src/background/keys.js | 1 + src/content/index.js | 2 ++ src/content/navigates.js | 6 +++++- src/operations/index.js | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d77291d..bc17cf6 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Firefox by WebExtensions API. - [ ] yank/paste page - [x] pagenation - [x] open parent page + - [x] open root page - [ ] hints - [x] open a link - [ ] open a link in new tab diff --git a/src/background/keys.js b/src/background/keys.js index 992b42d..34483a0 100644 --- a/src/background/keys.js +++ b/src/background/keys.js @@ -33,6 +33,7 @@ const defaultKeymap = { '[[': { type: operations.NAVIGATE_LINK_PREV }, ']]': { type: operations.NAVIGATE_LINK_NEXT }, 'gu': { type: operations.NAVIGATE_PARENT }, + 'gU': { type: operations.NAVIGATE_ROOT }, }; const asKeymapChars = (keys) => { diff --git a/src/content/index.js b/src/content/index.js index 4751cde..a9ccd63 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -45,6 +45,8 @@ const execOperation = (operation) => { return navigates.linkNext(window); case operations.NAVIGATE_PARENT: return navigates.parent(window); + case operations.NAVIGATE_ROOT: + return navigates.root(window); } }; diff --git a/src/content/navigates.js b/src/content/navigates.js index 692b7be..64e5fc0 100644 --- a/src/content/navigates.js +++ b/src/content/navigates.js @@ -63,4 +63,8 @@ const parent = (win) => { } }; -export { historyPrev, historyNext, linkPrev, linkNext, parent }; +const root = (win) => { + win.location = win.location.origin; +}; + +export { historyPrev, historyNext, linkPrev, linkNext, parent, root }; diff --git a/src/operations/index.js b/src/operations/index.js index 493e866..a40123a 100644 --- a/src/operations/index.js +++ b/src/operations/index.js @@ -16,6 +16,7 @@ export default { NAVIGATE_LINK_PREV: 'navigate.link.prev', NAVIGATE_LINK_NEXT: 'navigate.link.next', NAVIGATE_PARENT: 'navigate.parent', + NAVIGATE_ROOT: 'navigate.root', // Background TABS_CLOSE: 'tabs.close',