From ddc45f059a9ff1c0fc1772b81d441cfce95650de Mon Sep 17 00:00:00 2001 From: Federico Zivolo Date: Sun, 23 Jul 2017 16:43:40 +0200 Subject: [PATCH] [fix] Fixed #276 --- packages/popper/package.json | 2 +- packages/popper/src/utils/getOffsetParent.js | 10 ++++ .../popper/src/utils/isOffsetContainer.js | 4 +- packages/popper/tests/functional/core.js | 48 +++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/packages/popper/package.json b/packages/popper/package.json index 56a432e5c2..015e9f1042 100644 --- a/packages/popper/package.json +++ b/packages/popper/package.json @@ -35,7 +35,7 @@ "build": "node bundle.js", "lint": "eslint .", "test": "popper-karma", - "test:dev": "NODE_ENV=development npm run test", + "test:dev": "BROWSERS=Chrome NODE_ENV=development npm run test", "coverage": "NODE_ENV=coverage npm run test" }, "devDependencies": { diff --git a/packages/popper/src/utils/getOffsetParent.js b/packages/popper/src/utils/getOffsetParent.js index 9003818b29..eeefc5675a 100644 --- a/packages/popper/src/utils/getOffsetParent.js +++ b/packages/popper/src/utils/getOffsetParent.js @@ -1,3 +1,4 @@ +import getStyleComputedProperty from './getStyleComputedProperty'; /** * Returns the offset parent of the given element * @method @@ -14,5 +15,14 @@ export default function getOffsetParent(element) { return window.document.documentElement; } + // .offsetParent will return the closest TD or TABLE in case + // no offsetParent is present, I hate this job... + if ( + ['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && + getStyleComputedProperty(offsetParent, 'position') === 'static' + ) { + return getOffsetParent(offsetParent); + } + return offsetParent; } diff --git a/packages/popper/src/utils/isOffsetContainer.js b/packages/popper/src/utils/isOffsetContainer.js index a570900ba9..ff0532c96d 100644 --- a/packages/popper/src/utils/isOffsetContainer.js +++ b/packages/popper/src/utils/isOffsetContainer.js @@ -1,9 +1,11 @@ +import getOffsetParent from './getOffsetParent'; + export default function isOffsetContainer(element) { const { nodeName } = element; if (nodeName === 'BODY') { return false; } return ( - nodeName === 'HTML' || element.firstElementChild.offsetParent === element + nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element ); } diff --git a/packages/popper/tests/functional/core.js b/packages/popper/tests/functional/core.js index 446ee48c6b..e67dec7dc5 100644 --- a/packages/popper/tests/functional/core.js +++ b/packages/popper/tests/functional/core.js @@ -1549,4 +1549,52 @@ describe('[core]', () => { }); } ); + + // test for #276 + it('works inside tables', done => { + jasmineWrapper.innerHTML = ` + + + + + + + +
+
+ ref +
+
+ pop +
+
+ `; + + const reference = document.getElementById('reference'); + const popper = document.getElementById('popper'); + + new Popper(reference, popper, { + placement: 'bottom', + onCreate(data) { + expect(getRect(reference).bottom).toBeApprox(getRect(popper).top); + expect(getRect(reference).left).toBeApprox(getRect(popper).left); + data.instance.destroy(); + done(); + }, + }); + }); });