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) => { |
||||
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 }; |
||||
|
@ -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