diff options
Diffstat (limited to 'src/content')
-rw-r--r-- | src/content/presenters/FollowPresenter.ts | 1 | ||||
-rw-r--r-- | src/content/presenters/Hint.ts | 5 | ||||
-rw-r--r-- | src/content/presenters/ScrollPresenter.ts | 25 |
3 files changed, 19 insertions, 12 deletions
diff --git a/src/content/presenters/FollowPresenter.ts b/src/content/presenters/FollowPresenter.ts index 8aef819..e9105bc 100644 --- a/src/content/presenters/FollowPresenter.ts +++ b/src/content/presenters/FollowPresenter.ts @@ -11,6 +11,7 @@ const TARGET_SELECTOR = [ '[contenteditable=""]', "[tabindex]", '[role="button"]', + "[onclick]", "summary", ].join(","); diff --git a/src/content/presenters/Hint.ts b/src/content/presenters/Hint.ts index 3f39060..8bf265b 100644 --- a/src/content/presenters/Hint.ts +++ b/src/content/presenters/Hint.ts @@ -119,7 +119,10 @@ export class InputHint extends Hint { default: if (doms.isContentEditable(target)) { return target.focus(); - } else if (target.hasAttribute("tabindex")) { + } else if ( + target.hasAttribute("tabindex") || + target.hasAttribute("onclick") + ) { return target.click(); } } diff --git a/src/content/presenters/ScrollPresenter.ts b/src/content/presenters/ScrollPresenter.ts index f1a6402..a78e4ba 100644 --- a/src/content/presenters/ScrollPresenter.ts +++ b/src/content/presenters/ScrollPresenter.ts @@ -8,19 +8,21 @@ let scrolling = false; let lastTimeoutId: number | null = null; const isScrollableStyle = (element: Element): boolean => { - const { overflowX, overflowY } = window.getComputedStyle(element); + const { overflowX, overflowY, overflow } = window.getComputedStyle(element); return !( overflowX !== "scroll" && overflowX !== "auto" && overflowY !== "scroll" && - overflowY !== "auto" + overflowY !== "auto" && + overflow !== "scroll" && + overflow !== "auto" ); }; -const isOverflowed = (element: Element): boolean => { +const doneScrolling = (element: Element): boolean => { return ( - element.scrollWidth > element.clientWidth || - element.scrollHeight > element.clientHeight + element.scrollTop + element.clientHeight >= element.scrollHeight - 5 && + element.scrollLeft + element.clientWidth >= element.scrollWidth - 5 ); }; @@ -29,7 +31,7 @@ const isOverflowed = (element: Element): boolean => { // method is not cached. That does not cause performance issue because in the // most pages, the window is root element i,e, documentElement. const findScrollable = (element: Element): Element | null => { - if (isScrollableStyle(element) && isOverflowed(element)) { + if (isScrollableStyle(element) && !doneScrolling(element)) { return element; } @@ -44,12 +46,13 @@ const findScrollable = (element: Element): Element | null => { }; const scrollTarget = () => { - if (isOverflowed(window.document.documentElement)) { - return window.document.documentElement; - } - if (isOverflowed(window.document.body)) { - return window.document.body; + if ( + window.document.scrollingElement && + !doneScrolling(window.document.scrollingElement) + ) { + return window.document.scrollingElement; } + const target = findScrollable(window.document.documentElement); if (target) { return target; |