Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/components/Tooltip/use-tooltip-events.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,12 @@ const useTooltipEvents = ({
const dataTooltipId = anchorSelector ? parseDataTooltipIdSelector(anchorSelector) : null

resolveAnchorElementRef.current = (target: EventTarget | null) => {
const targetElement = target as HTMLElement | null

if (!targetElement?.isConnected) {
if (!(target instanceof Element) || !target.isConnected) {
return null
}

const targetElement = target

if (dataTooltipId) {
const matchedAnchor = resolveDataTooltipAnchor(targetElement, dataTooltipId)

Expand Down
18 changes: 18 additions & 0 deletions src/test/tooltip-interaction-behavior.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -304,4 +304,22 @@ describe('tooltip interaction behavior', () => {

addEventListenerSpy.mockRestore()
})

test('ignores synthetic mouseover events targeting document', () => {
render(
<>
<span data-tooltip-id="document-target-test">Hover Me</span>
<TooltipController id="document-target-test" content="Document Target Test" />
</>,
)

expect(() => {
act(() => {
document.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }))
})
advanceTimers(60)
}).not.toThrow()

expect(document.getElementById('document-target-test')).not.toBeInTheDocument()
})
})
6 changes: 3 additions & 3 deletions src/utils/resolve-data-tooltip-anchor.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
function resolveDataTooltipAnchor(targetElement: HTMLElement, tooltipId: string) {
let currentElement: HTMLElement | null = targetElement
function resolveDataTooltipAnchor(targetElement: Element, tooltipId: string) {
let currentElement: Element | null = targetElement

while (currentElement) {
if (currentElement.dataset.tooltipId === tooltipId) {
if (currentElement instanceof HTMLElement && currentElement.dataset.tooltipId === tooltipId) {
return currentElement
}
currentElement = currentElement.parentElement
Expand Down