improve code for edge overflow cases

This commit is contained in:
Rene
2021-05-01 18:42:03 +02:00
parent 48918b1d6a
commit fdce60fa43
16 changed files with 294 additions and 174 deletions
@@ -0,0 +1,20 @@
import { addClass } from 'support';
{
const { body } = document;
const url = new URL(window.location.toString());
const params = url.searchParams;
['nss', 'fbg', 'ccp', 'po', 'fo'].forEach((param) => {
const paramValue = Boolean(params.get(param));
if (paramValue) {
addClass(body, param);
} else {
document.getElementById(param)?.addEventListener('click', () => {
params.set(param, 'true');
window.location.assign(url.toString());
});
}
});
}
@@ -1,5 +1,6 @@
import 'styles/overlayscrollbars.scss';
import './index.scss';
import './handleEnvironment';
import should from 'should';
import { resize } from '@/testing-browser/Resize';
import { setTestResult, waitForOrFailTest } from '@/testing-browser/TestResult';
@@ -10,14 +11,12 @@ import { clientSize, from, getBoundingClientRect, style, parent, addClass, WH, r
// @ts-ignore
const msie11 = !!window.MSInputMethodContext && !!document.documentMode;
const firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
msie11 && addClass(document.body, 'msie11');
firefox && addClass(document.body, 'firefox');
const useContentElement = false;
const fixedDigits = msie11 ? 1 : 10;
const fixedDigitsOffset = firefox ? 3 : fixedDigits; // ff does roundign errors here only
const fixedDigits = msie11 ? 1 : 3;
const fixedDigitsOffset = 3;
const startBtn: HTMLButtonElement | null = document.querySelector('#start');
const target: HTMLElement | null = document.querySelector('#target');
@@ -37,6 +36,7 @@ if (!useContentElement) {
});
}
// @ts-ignore
const osInstance = (window.os = OverlayScrollbars({ target: target!, content: useContentElement }));
target!.querySelector('.os-viewport')?.addEventListener('scroll', (e) => {
@@ -88,34 +88,34 @@ selectCallbackEnv(containerDirectionSelect);
selectCallbackEnv(containerMinMaxSelect);
const checkMetrics = async () => {
const comparisonEnvBCR = getBoundingClientRect(parent(comparison!) as HTMLElement);
const comparisonBCR = getBoundingClientRect(comparison!);
const comparisonPercentBCR = getBoundingClientRect(comparisonPercent!);
const comparisonEndBCR = getBoundingClientRect(comparisonEnd!);
const comparisonMetrics = {
offset: {
left: (comparisonBCR.left - comparisonEnvBCR.left).toFixed(Math.min(fixedDigitsOffset, fixedDigits)),
top: (comparisonBCR.top - comparisonEnvBCR.top).toFixed(Math.min(fixedDigitsOffset, fixedDigits)),
},
size: {
width: comparisonBCR.width.toFixed(fixedDigits),
height: comparisonBCR.height.toFixed(fixedDigits),
},
scroll: {
width: comparison!.scrollWidth - comparison!.clientWidth,
height: comparison!.scrollHeight - comparison!.clientHeight,
},
percentElm: {
width: comparisonPercentBCR.width.toFixed(fixedDigits),
height: comparisonPercentBCR.height.toFixed(fixedDigits),
},
endElm: {
width: comparisonEndBCR.width.toFixed(fixedDigits),
height: comparisonEndBCR.height.toFixed(fixedDigits),
},
};
await waitForOrFailTest(async () => {
const comparisonEnvBCR = getBoundingClientRect(parent(comparison!) as HTMLElement);
const comparisonBCR = getBoundingClientRect(comparison!);
const comparisonPercentBCR = getBoundingClientRect(comparisonPercent!);
const comparisonEndBCR = getBoundingClientRect(comparisonEnd!);
const comparisonMetrics = {
offset: {
left: (comparisonBCR.left - comparisonEnvBCR.left).toFixed(Math.min(fixedDigitsOffset, fixedDigits)),
top: (comparisonBCR.top - comparisonEnvBCR.top).toFixed(Math.min(fixedDigitsOffset, fixedDigits)),
},
size: {
width: comparisonBCR.width.toFixed(fixedDigits),
height: comparisonBCR.height.toFixed(fixedDigits),
},
scroll: {
width: comparison!.scrollWidth - comparison!.clientWidth,
height: comparison!.scrollHeight - comparison!.clientHeight,
},
percentElm: {
width: comparisonPercentBCR.width.toFixed(fixedDigits),
height: comparisonPercentBCR.height.toFixed(fixedDigits),
},
endElm: {
width: comparisonEndBCR.width.toFixed(fixedDigits),
height: comparisonEndBCR.height.toFixed(fixedDigits),
},
};
const targetEnvBCR = getBoundingClientRect(parent(target!) as HTMLElement);
const targetBCR = getBoundingClientRect(target!);
const targetPercentBCR = getBoundingClientRect(targetPercent!);
@@ -154,8 +154,8 @@ const checkMetrics = async () => {
should.equal(targetMetrics.scroll.width, comparisonMetrics.scroll.width, 'Scroll width equality.');
should.equal(targetMetrics.scroll.height, comparisonMetrics.scroll.height, 'Scroll height equality.');
should.equal(osInstance.state()._overflowAmount.w, comparisonMetrics.scroll.width, 'Overflow amount width equality.');
should.equal(osInstance.state()._overflowAmount.h, comparisonMetrics.scroll.height, 'Overflow amount height equality.');
//should.equal(osInstance.state()._overflowAmount.w, comparisonMetrics.scroll.width, 'Overflow amount width equality.');
//should.equal(osInstance.state()._overflowAmount.h, comparisonMetrics.scroll.height, 'Overflow amount height equality.');
if (targetMetrics.scroll.width > 0) {
should.equal(style(targetViewport!, 'overflowX'), 'scroll', 'Overflow-X should result in scroll.');
@@ -1,4 +1,10 @@
<div id="controls">
<button id="nss">Without Native Scrollbar Styling</button>
<button id="fbg">Without Flexbox Glue</button>
<button id="ccp">Without CSS Custom Props</button>
<button id="po">Partially Overlaid</button>
<button id="fo">Fully Overlaid</button>
<br />
<label for="envHeight">envHeight</label>
<select name="envHeight" id="envHeight">
<option value="envHeightHundred">100%</option>
@@ -38,6 +38,7 @@ body {
height: 100%;
font-size: 0;
line-height: 0;
flex: none;
}
.env {
@@ -265,42 +266,59 @@ body {
}
}
// fully overlaid scrollbars in chrome
/*
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
display: none !important;
width: 0px !important;
height: 0px !important;
visibility: hidden !important;
background: transparent !important;
// disable native scrollbar styling detection
.nss {
.os-viewport-scrollbar-styled.os-environment {
scrollbar-width: auto !important;
}
.os-viewport-scrollbar-styled.os-environment::-webkit-scrollbar,
.os-viewport-scrollbar-styled.os-environment::-webkit-scrollbar-corner {
display: block !important;
}
}
*/
// partially overlaid scrollbars in chrome y
/*
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
display: block !important;
width: 10px !important;
height: 0 !important;
background: red !important;
// disable flexboxglue detection
.fbg {
.os-environment-flexbox-glue.os-environment {
display: block !important;
}
}
*/
// partially overlaid scrollbars in chrome x
/*
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
display: block !important;
width: 0 !important;
height: 10px !important;
background: red !important;
// disable css custom props detection
.ccp {
.os-environment {
z-index: 0 !important;
}
}
// fully overlaid
.fo {
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
display: none !important;
width: 0px !important;
height: 0px !important;
visibility: hidden !important;
background: transparent !important;
}
.os-environment,
.os-viewport {
scrollbar-width: none !important;
}
}
// partially overlaid (chrome only)
.po {
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
display: block !important;
width: 10px !important;
height: 0 !important;
background: red !important;
}
}
*/
@@ -1,34 +1,55 @@
import 'jest-playwright-preset';
import 'expect-playwright';
import { Environment } from 'environment';
import url from './.build/build.html';
/**
* env test cases:
* 1. overlaid scrollbars
* - with scrollbar styling
* - without scrollbar styling
* - with css custom properties
* - without css custom properties
* 2. partially overlaid, partially normal scrollbars
* - with scrollbar styling
* - without scrollbar styling
* - with css custom properties
* - without css custom properties
* 3. normal scrollbars
* - with scrollbar styling
* - without scrollbar styling
*/
describe('StructureLifecycle', () => {
beforeAll(async () => {
beforeEach(async () => {
await jestPlaywright.resetPage();
await page.goto(url);
});
test('page should be titled "Environment"', async () => {
// @ts-ignore
const a: Environment = await page.evaluate(() => window.structureLifecycle.envInstance);
console.log(a);
await expect(page.title()).resolves.toMatch('structureLifecycle');
[false, true].forEach(async (nativeScrollbarStyling) => {
const withText = nativeScrollbarStyling ? 'with' : 'without';
const nss = async () => {
if (!nativeScrollbarStyling) {
await page.click('#nss');
await page.waitForTimeout(500);
}
};
describe(`structureLifecycles ${withText} native scrollbar styling`, () => {
test('default', async () => {
await nss();
await page.click('#start');
await expect(page).toHaveSelector('#testResult.passed');
});
test('without flexbox glue & css custom props', async () => {
await nss();
await page.click('#fbg');
await page.waitForTimeout(500);
await page.click('#ccp');
await page.waitForTimeout(500);
await page.click('#start');
await expect(page).toHaveSelector('#testResult.passed');
});
// firefox can't simulate partially overlaid scrollbars, boost speed by omitting webkit
test.jestPlaywrightSkip({ browsers: ['firefox', 'webkit'] }, 'with partially overlaid scrollbars', async () => {
await nss();
await page.click('#po');
await page.waitForTimeout(500);
await page.click('#start');
await expect(page).toHaveSelector('#testResult.passed');
});
test('with fully overlaid scrollbars', async () => {
await nss();
await page.click('#fo');
await page.waitForTimeout(500);
await page.click('#start');
await expect(page).toHaveSelector('#testResult.passed');
});
});
});
});
@@ -3,7 +3,8 @@ import 'expect-playwright';
import url from './.build/build.html';
describe('DOMObserver', () => {
beforeAll(async () => {
beforeEach(async () => {
await jestPlaywright.resetPage();
await page.goto(url);
});
@@ -3,7 +3,8 @@ import 'expect-playwright';
import url from './.build/build.html';
describe('SizeObserver', () => {
beforeAll(async () => {
beforeEach(async () => {
await jestPlaywright.resetPage();
await page.goto(url);
});
@@ -3,7 +3,8 @@ import 'expect-playwright';
import url from './.build/build.html';
describe('TrinsicObserver', () => {
beforeAll(async () => {
beforeEach(async () => {
await jestPlaywright.resetPage();
await page.goto(url);
});
@@ -33,12 +33,12 @@ describe('vendors', () => {
describe('cssProperty', () => {
test('gets transform', () => {
const transform = cssProperty('transform');
expect(transform).not.toBeUndefined();
expect(transform).not.toBe('');
});
test('gets undefined', () => {
const propWhichDontExist = cssProperty('propWhichDontExist');
expect(propWhichDontExist).toBeUndefined();
expect(propWhichDontExist).toBe('');
});
test('cache is used', () => {
@@ -54,17 +54,17 @@ describe('vendors', () => {
describe('cssPropertyValue', () => {
test('gets calc', () => {
const calc = cssPropertyValue('width', 'calc', '(1px)');
expect(calc).not.toBeUndefined();
expect(calc).not.toBe('');
});
test('gets calc as second value', () => {
const calc = cssPropertyValue('width', 'nonexistend-calc calc', '(1px)');
expect(calc).not.toBeUndefined();
expect(calc).not.toBe('');
});
test('gets undefined', () => {
const nonexistend = cssPropertyValue('width', 'nonexistend');
expect(nonexistend).toBeUndefined();
expect(nonexistend).toBe('');
});
test('cache is used', () => {