parent
aeb0e0f96d
commit
ac8b40a2f3
6 changed files with 99 additions and 2 deletions
@ -1,8 +1,47 @@ |
|||||||
|
const PREV_LINK_PATTERNS = [ |
||||||
|
/\bprev\b/i, /\bprevious\b/i, /\bback\b/i, |
||||||
|
/</, /\u2039/, /\u2190/, /\xab/, /\u226a/, /<</ |
||||||
|
]; |
||||||
|
const NEXT_LINK_PATTERNS = [ |
||||||
|
/\bnext\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) => { |
const historyPrev = (win) => { |
||||||
win.history.back(); |
win.history.back(); |
||||||
}; |
}; |
||||||
|
|
||||||
const historyNext = (win) => { |
const historyNext = (win) => { |
||||||
win.history.forward(); |
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 }; |
||||||
|
@ -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 = '<a href="#dummy">xprevx</a> <a href="#prev">go to prev</a>'; |
||||||
|
navigates.linkPrev(window); |
||||||
|
setTimeout(() => { |
||||||
|
expect(document.location.hash).to.equal('#prev'); |
||||||
|
done(); |
||||||
|
}, 0); |
||||||
|
}); |
||||||
|
|
||||||
|
it('clicks a[rel=prev] element preferentially', (done) => { |
||||||
|
document.body.innerHTML = '<a href="#dummy">prev</a> <a rel="prev" href="#prev">rel</a>'; |
||||||
|
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 = '<a href="#dummy">xnextx</a> <a href="#next">go to next</a>'; |
||||||
|
navigates.linkNext(window); |
||||||
|
setTimeout(() => { |
||||||
|
expect(document.location.hash).to.equal('#next'); |
||||||
|
done(); |
||||||
|
}, 0); |
||||||
|
}); |
||||||
|
|
||||||
|
it('clicks a[rel=next] element preferentially', (done) => { |
||||||
|
document.body.innerHTML = '<a href="#dummy">next</a> <a rel="next" href="#next">rel</a>'; |
||||||
|
navigates.linkNext(window); |
||||||
|
setTimeout(() => { |
||||||
|
expect(document.location.hash).to.equal('#next'); |
||||||
|
done(); |
||||||
|
}, 0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
|
Reference in new issue