mirror of
https://github.com/tridactyl/tridactyl.git
synced 2026-09-10 07:16:33 -04:00
Fix #4401: fall back to click handler
This commit is contained in:
parent
14c7d77cd2
commit
be9016fec2
|
|
@ -117,6 +117,7 @@ export function mouseEvent(
|
||||||
const event = new MouseEvent(type, {
|
const event = new MouseEvent(type, {
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
cancelable: true,
|
cancelable: true,
|
||||||
|
composed: type === "click",
|
||||||
view: window,
|
view: window,
|
||||||
detail: 1, // usually the click count
|
detail: 1, // usually the click count
|
||||||
...modifierKeys,
|
...modifierKeys,
|
||||||
|
|
@ -940,7 +941,7 @@ const tabTargetToModifierKey = {
|
||||||
[TabTarget.NewWindow]: { shiftKey: true },
|
[TabTarget.NewWindow]: { shiftKey: true },
|
||||||
}
|
}
|
||||||
|
|
||||||
/** if `target === _blank` clicking the link is treated as opening a popup and is blocked. Use webext API to avoid that. */
|
/** Run page handlers before using the webext API for popup-blocked `_blank`/`_new` links. */
|
||||||
export function simulateClick(
|
export function simulateClick(
|
||||||
target: HTMLElement,
|
target: HTMLElement,
|
||||||
tabTarget: TabTarget = TabTarget.CurrentTab,
|
tabTarget: TabTarget = TabTarget.CurrentTab,
|
||||||
|
|
@ -953,9 +954,11 @@ export function simulateClick(
|
||||||
let usePopupBlockerWorkaround =
|
let usePopupBlockerWorkaround =
|
||||||
(target as HTMLAnchorElement).target === "_blank" ||
|
(target as HTMLAnchorElement).target === "_blank" ||
|
||||||
(target as HTMLAnchorElement).target === "_new"
|
(target as HTMLAnchorElement).target === "_new"
|
||||||
const href = (target instanceof SVGAElement)
|
const getHref = () =>
|
||||||
? target.href.animVal
|
target instanceof SVGAElement
|
||||||
: (target as HTMLAnchorElement).href;
|
? target.href.animVal
|
||||||
|
: (target as HTMLAnchorElement).href
|
||||||
|
let href = getHref()
|
||||||
if (href?.startsWith("file:")) {
|
if (href?.startsWith("file:")) {
|
||||||
// file URLS cannot be opend with browser.tabs.create
|
// file URLS cannot be opend with browser.tabs.create
|
||||||
// see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create#url
|
// see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create#url
|
||||||
|
|
@ -966,6 +969,22 @@ export function simulateClick(
|
||||||
usePopupBlockerWorkaround = false
|
usePopupBlockerWorkaround = false
|
||||||
}
|
}
|
||||||
if (usePopupBlockerWorkaround) {
|
if (usePopupBlockerWorkaround) {
|
||||||
|
let pagePreventedDefault: boolean
|
||||||
|
const interceptClick = (event: MouseEvent) => {
|
||||||
|
if (!event.composedPath().includes(target)) return
|
||||||
|
pagePreventedDefault = event.defaultPrevented
|
||||||
|
href = getHref()
|
||||||
|
usePopupBlockerWorkaround =
|
||||||
|
!href?.startsWith("file:") &&
|
||||||
|
((target as HTMLAnchorElement).target === "_blank" ||
|
||||||
|
(target as HTMLAnchorElement).target === "_new")
|
||||||
|
if (usePopupBlockerWorkaround) event.preventDefault()
|
||||||
|
}
|
||||||
|
const eventWindow = target.ownerDocument.defaultView
|
||||||
|
eventWindow?.addEventListener("click", interceptClick)
|
||||||
|
mouseEvent(target, "click", tabTargetToModifierKey[tabTarget])
|
||||||
|
eventWindow?.removeEventListener("click", interceptClick)
|
||||||
|
if (pagePreventedDefault !== false || !usePopupBlockerWorkaround) return
|
||||||
// Try to open the new tab in the same container as the current one.
|
// Try to open the new tab in the same container as the current one.
|
||||||
activeTabContainerId().then(containerId => {
|
activeTabContainerId().then(containerId => {
|
||||||
if (containerId)
|
if (containerId)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue