get hints from window

jh-changes
Shin'ya Ueoka 7 years ago
parent 890f84c343
commit bebf8e2327
  1. 22
      src/content/components/follow.js
  2. 2
      src/content/index.js
  3. 2
      test/content/components/follow.test.js

@ -9,20 +9,21 @@ const TARGET_SELECTOR = [
'[contenteditable=true]', '[contenteditable=""]' '[contenteditable=true]', '[contenteditable=""]'
].join(','); ].join(',');
const inWindow = (window, element) => { const inWindow = (win, element) => {
let { let {
top, left, bottom, right top, left, bottom, right
} = element.getBoundingClientRect(); } = element.getBoundingClientRect();
let doc = win.doc;
return ( return (
top >= 0 && left >= 0 && top >= 0 && left >= 0 &&
bottom <= (window.innerHeight || document.documentElement.clientHeight) && bottom <= (win.innerHeight || doc.documentElement.clientHeight) &&
right <= (window.innerWidth || document.documentElement.clientWidth) right <= (win.innerWidth || doc.documentElement.clientWidth)
); );
}; };
export default class FollowComponent { export default class FollowComponent {
constructor(wrapper, store) { constructor(win, store) {
this.wrapper = wrapper; this.win = win;
this.store = store; this.store = store;
this.hintElements = {}; this.hintElements = {};
this.state = {}; this.state = {};
@ -141,8 +142,7 @@ export default class FollowComponent {
} }
create() { create() {
let doc = this.wrapper.ownerDocument; let elements = FollowComponent.getTargetElements(this.win);
let elements = FollowComponent.getTargetElements(doc);
let producer = new HintKeyProducer(DEFAULT_HINT_CHARSET); let producer = new HintKeyProducer(DEFAULT_HINT_CHARSET);
let hintElements = {}; let hintElements = {};
Array.prototype.forEach.call(elements, (ele) => { Array.prototype.forEach.call(elements, (ele) => {
@ -160,15 +160,15 @@ export default class FollowComponent {
}); });
} }
static getTargetElements(doc) { static getTargetElements(win) {
let all = doc.querySelectorAll(TARGET_SELECTOR); let all = win.document.querySelectorAll(TARGET_SELECTOR);
let filtered = Array.prototype.filter.call(all, (element) => { let filtered = Array.prototype.filter.call(all, (element) => {
let style = window.getComputedStyle(element); let style = win.getComputedStyle(element);
return style.display !== 'none' && return style.display !== 'none' &&
style.visibility !== 'hidden' && style.visibility !== 'hidden' &&
element.type !== 'hidden' && element.type !== 'hidden' &&
element.offsetHeight > 0 && element.offsetHeight > 0 &&
inWindow(window, element); inWindow(win, element);
}); });
return filtered; return filtered;
} }

@ -9,7 +9,7 @@ import reducers from 'content/reducers';
import messages from 'shared/messages'; import messages from 'shared/messages';
const store = createStore(reducers); const store = createStore(reducers);
const followComponent = new FollowComponent(window.document.body, store); const followComponent = new FollowComponent(window, store);
const contentInputComponent = const contentInputComponent =
new ContentInputComponent(window.document.body, store); new ContentInputComponent(window.document.body, store);
const keymapperComponent = new KeymapperComponent(store); const keymapperComponent = new KeymapperComponent(store);

@ -8,7 +8,7 @@ describe('FollowComponent', () => {
}); });
it('returns visible links', () => { it('returns visible links', () => {
let targets = FollowComponent.getTargetElements(window.document); let targets = FollowComponent.getTargetElements(window);
expect(targets).to.have.lengthOf(3); expect(targets).to.have.lengthOf(3);
let ids = Array.prototype.map.call(targets, (e) => e.id); let ids = Array.prototype.map.call(targets, (e) => e.id);