Skip to content

Commit d9525af

Browse files
authored
Merge pull request #13 from techtouch-inc/feat/improve_getting_frame_element_strategy
Feat/improve getting frame element strategy
2 parents 9bb13fe + ca0f27d commit d9525af

File tree

6 files changed

+40
-13
lines changed

6 files changed

+40
-13
lines changed

packages/popper/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@techtouch-inc/popper.js",
3-
"version": "1.16.3",
3+
"version": "1.16.6",
44
"description": "A kickass library to manage your poppers",
55
"homepage": "https://popper.js.org",
66
"repository": {

packages/popper/src/utils/getBoundingClientRect.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import getWindowSizes from './getWindowSizes';
44
import getScroll from './getScroll';
55
import getClientRect from './getClientRect';
66
import isIE from './isIE';
7+
import { getEachAncestorFrames } from './getEachAncestorFrames';
78

89
/**
910
* Get bounding client rect of given element
@@ -32,15 +33,7 @@ export default function getBoundingClientRect(element) {
3233
rect = element.getBoundingClientRect();
3334
}
3435

35-
let currentElement = element
36-
37-
while (
38-
currentElement &&
39-
currentElement.ownerDocument &&
40-
currentElement.ownerDocument.defaultView &&
41-
currentElement.ownerDocument.defaultView.frameElement
42-
) {
43-
currentElement = currentElement.ownerDocument.defaultView.frameElement
36+
getEachAncestorFrames(element, (currentElement) => {
4437
const computedStyle = getComputedStyle(currentElement)
4538
const borderOffset = {
4639
left: parseInt(computedStyle.borderLeftWidth || '0'),
@@ -60,7 +53,7 @@ export default function getBoundingClientRect(element) {
6053
bottom: offsettedPos.bottom,
6154
right: offsettedPos.right,
6255
}
63-
}
56+
})
6457
}
6558
catch(e){}
6659

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { getFrameElement } from './getFrameElement'
2+
3+
export const getCurrentElementAndEachAncestorFrames = (
4+
target,
5+
callback
6+
) => {
7+
let current = target
8+
while (current) {
9+
callback(current)
10+
current = getFrameElement(current)
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { getCurrentElementAndEachAncestorFrames } from './getCurrentElementAndEachAncestorFrames'
2+
import { getFrameElement } from './getFrameElement'
3+
4+
export const getEachAncestorFrames = (
5+
target,
6+
callback
7+
) => {
8+
const frameElement = getFrameElement(target)
9+
if (frameElement) {
10+
getCurrentElementAndEachAncestorFrames(frameElement, callback)
11+
}
12+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const getFrameElement = (target) => {
2+
// スクリプトが差し込まれたframeより上の祖先は辿らないようにする
3+
return target.ownerDocument === document
4+
? null
5+
: target.ownerDocument &&
6+
target.ownerDocument.defaultView &&
7+
target.ownerDocument.defaultView.frameElement || null
8+
}

packages/popper/src/utils/setupEventListeners.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import getScrollParent from './getScrollParent';
22
import getWindow from './getWindow';
33
import getParentNode from './getParentNode';
4+
import { getFrameElement } from './getFrameElement';
45

56
function attachToScrollParents(scrollParent, event, callback, scrollParents) {
67
const isRoot = getParentNode(scrollParent).nodeName === 'HTML';
78
const target = isRoot ? scrollParent.ownerDocument.defaultView : scrollParent;
8-
const shouldContinue = !isRoot || target.frameElement;
9+
const frameElement = getFrameElement(target)
10+
const shouldContinue = !isRoot || frameElement;
911
target.addEventListener(event, callback, { passive: true });
1012

1113
if (shouldContinue) {
12-
const nextScrollParent = getScrollParent(isRoot ? target.frameElement : target.parentNode);
14+
const nextScrollParent = getScrollParent(isRoot ? frameElement : target.parentNode);
1315
attachToScrollParents(
1416
nextScrollParent,
1517
event,

0 commit comments

Comments
 (0)