mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-23 12:40:37 +03:00
improve trinsic observer code and tests
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
WH,
|
WH,
|
||||||
CacheValues,
|
CacheValues,
|
||||||
createDOM,
|
createDiv,
|
||||||
offsetSize,
|
offsetSize,
|
||||||
runEach,
|
runEach,
|
||||||
prependChildren,
|
prependChildren,
|
||||||
@@ -26,7 +26,7 @@ export const createTrinsicObserver = (
|
|||||||
target: HTMLElement,
|
target: HTMLElement,
|
||||||
onTrinsicChangedCallback: (heightIntrinsic: CacheValues<boolean>) => any
|
onTrinsicChangedCallback: (heightIntrinsic: CacheValues<boolean>) => any
|
||||||
): TrinsicObserver => {
|
): TrinsicObserver => {
|
||||||
const trinsicObserver = createDOM(`<div class="${classNameTrinsicObserver}"></div>`)[0] as HTMLElement;
|
const trinsicObserver = createDiv(classNameTrinsicObserver);
|
||||||
const offListeners: (() => void)[] = [];
|
const offListeners: (() => void)[] = [];
|
||||||
const { _update: updateHeightIntrinsicCache, _current: getCurrentHeightIntrinsicCache } = createCache<
|
const { _update: updateHeightIntrinsicCache, _current: getCurrentHeightIntrinsicCache } = createCache<
|
||||||
boolean,
|
boolean,
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
const url = new URL(window.location.toString());
|
||||||
|
const params = url.searchParams;
|
||||||
|
const useResizeObserverPolyfill = Boolean(params.get('roPolyfill'));
|
||||||
|
|
||||||
|
if (useResizeObserverPolyfill) {
|
||||||
|
// @ts-ignore
|
||||||
|
window.ResizeObserver = undefined;
|
||||||
|
} else {
|
||||||
|
document.getElementById('roPolyfill')?.addEventListener('click', () => {
|
||||||
|
params.set('roPolyfill', 'true');
|
||||||
|
window.location.assign(url.toString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
const url = new URL(window.location.toString());
|
|
||||||
const params = url.searchParams;
|
|
||||||
const useResizeObserverPolyfill = Boolean(params.get('resizeobserverpolyfill'));
|
|
||||||
|
|
||||||
if (useResizeObserverPolyfill) {
|
|
||||||
// @ts-ignore
|
|
||||||
window.ResizeObserver = undefined;
|
|
||||||
} else {
|
|
||||||
document.getElementById('resizeobserver-polyfill')?.addEventListener('click', () => {
|
|
||||||
params.set('resizeobserverpolyfill', 'true');
|
|
||||||
window.location.assign(url.toString());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'styles/overlayscrollbars.scss';
|
import 'styles/overlayscrollbars.scss';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
import './handleResizeObserver';
|
import './handleEnvironment';
|
||||||
import should from 'should';
|
import should from 'should';
|
||||||
import { generateClassChangeSelectCallback, iterateSelect } from '@/testing-browser/Select';
|
import { generateClassChangeSelectCallback, iterateSelect } from '@/testing-browser/Select';
|
||||||
import { setTestResult, waitForOrFailTest } from '@/testing-browser/TestResult';
|
import { setTestResult, waitForOrFailTest } from '@/testing-browser/TestResult';
|
||||||
@@ -33,6 +33,7 @@ const displaySelect: HTMLSelectElement | null = document.querySelector('#display
|
|||||||
const directionSelect: HTMLSelectElement | null = document.querySelector('#direction');
|
const directionSelect: HTMLSelectElement | null = document.querySelector('#direction');
|
||||||
const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
||||||
const resizesSlot: HTMLButtonElement | null = document.querySelector('#resizes');
|
const resizesSlot: HTMLButtonElement | null = document.querySelector('#resizes');
|
||||||
|
const preInitChildren = targetElm?.children.length;
|
||||||
|
|
||||||
const sizeObserver = createSizeObserver(
|
const sizeObserver = createSizeObserver(
|
||||||
targetElm as HTMLElement,
|
targetElm as HTMLElement,
|
||||||
@@ -175,7 +176,7 @@ const start = async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
sizeObserver._destroy();
|
sizeObserver._destroy();
|
||||||
should.ok(targetElm?.children.length === 0);
|
should.equal(targetElm?.children.length, preInitChildren);
|
||||||
setTestResult(true);
|
setTestResult(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<div id="controls">
|
<div id="controls">
|
||||||
<button id="resizeobserver-polyfill">ResizeObserver polyfill</button><br />
|
<button id="roPolyfill">ResizeObserver polyfill</button><br />
|
||||||
<label for="height">height</label>
|
<label for="height">height</label>
|
||||||
<select name="height" id="height">
|
<select name="height" id="height">
|
||||||
<option value="heightAuto">auto</option>
|
<option value="heightAuto">auto</option>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ describe('SizeObserver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('with ResizeOserver polyfill', async () => {
|
test('with ResizeOserver polyfill', async () => {
|
||||||
await page.click('#resizeobserver-polyfill');
|
await page.click('#roPolyfill');
|
||||||
await page.waitForTimeout(500);
|
await page.waitForTimeout(500);
|
||||||
await page.click('#start');
|
await page.click('#start');
|
||||||
await expect(page).toHaveSelector('#testResult.passed');
|
await expect(page).toHaveSelector('#testResult.passed');
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
const url = new URL(window.location.toString());
|
||||||
|
const params = url.searchParams;
|
||||||
|
const useIntersectionObserverPolyfill = Boolean(params.get('ioPolyfill'));
|
||||||
|
const useResizeObserverPolyfill = Boolean(params.get('roPolyfill'));
|
||||||
|
|
||||||
|
if (useIntersectionObserverPolyfill) {
|
||||||
|
// @ts-ignore
|
||||||
|
window.IntersectionObserver = undefined;
|
||||||
|
} else {
|
||||||
|
document.getElementById('ioPolyfill')?.addEventListener('click', () => {
|
||||||
|
params.set('ioPolyfill', 'true');
|
||||||
|
window.location.assign(url.toString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useResizeObserverPolyfill) {
|
||||||
|
// @ts-ignore
|
||||||
|
window.ResizeObserver = undefined;
|
||||||
|
} else {
|
||||||
|
document.getElementById('roPolyfill')?.addEventListener('click', () => {
|
||||||
|
params.set('roPolyfill', 'true');
|
||||||
|
window.location.assign(url.toString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
-12
@@ -1,5 +1,6 @@
|
|||||||
import 'styles/overlayscrollbars.scss';
|
import 'styles/overlayscrollbars.scss';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
|
import './handleEnvironment';
|
||||||
import should from 'should';
|
import should from 'should';
|
||||||
import { generateClassChangeSelectCallback, iterateSelect, selectOption } from '@/testing-browser/Select';
|
import { generateClassChangeSelectCallback, iterateSelect, selectOption } from '@/testing-browser/Select';
|
||||||
import { timeout } from '@/testing-browser/timeout';
|
import { timeout } from '@/testing-browser/timeout';
|
||||||
@@ -18,6 +19,19 @@ const targetHeightSelect: HTMLSelectElement | null = document.querySelector('#ta
|
|||||||
const displaySelect: HTMLSelectElement | null = document.querySelector('#display');
|
const displaySelect: HTMLSelectElement | null = document.querySelector('#display');
|
||||||
const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
||||||
const changesSlot: HTMLButtonElement | null = document.querySelector('#changes');
|
const changesSlot: HTMLButtonElement | null = document.querySelector('#changes');
|
||||||
|
const preInitChildren = targetElm?.children.length;
|
||||||
|
|
||||||
|
const trinsicObserver = createTrinsicObserver(targetElm as HTMLElement, (heightIntrinsicCache) => {
|
||||||
|
if (heightIntrinsicCache._changed) {
|
||||||
|
heightIterations += 1;
|
||||||
|
heightIntrinsic = heightIntrinsicCache._value;
|
||||||
|
}
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (changesSlot) {
|
||||||
|
changesSlot.textContent = heightIterations.toString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const envElmSelectCallback = generateClassChangeSelectCallback(envElm as HTMLElement);
|
const envElmSelectCallback = generateClassChangeSelectCallback(envElm as HTMLElement);
|
||||||
const targetElmSelectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
const targetElmSelectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
||||||
@@ -53,6 +67,7 @@ const iterate = async (select: HTMLSelectElement | null, afterEach?: () => any)
|
|||||||
if (trinsicHeightChanged) {
|
if (trinsicHeightChanged) {
|
||||||
should.equal(heightIterations, currHeightIterations + 1);
|
should.equal(heightIterations, currHeightIterations + 1);
|
||||||
}
|
}
|
||||||
|
should.equal(trinsicObserver._getCurrentCacheValues()._heightIntrinsic._value, newHeightIntrinsic);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
afterEach,
|
afterEach,
|
||||||
@@ -113,21 +128,11 @@ const start = async () => {
|
|||||||
});
|
});
|
||||||
await changeWhileHidden();
|
await changeWhileHidden();
|
||||||
|
|
||||||
|
trinsicObserver._destroy();
|
||||||
|
should.equal(targetElm?.children.length, preInitChildren);
|
||||||
setTestResult(true);
|
setTestResult(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
startBtn?.addEventListener('click', start);
|
startBtn?.addEventListener('click', start);
|
||||||
|
|
||||||
createTrinsicObserver(targetElm as HTMLElement, (heightIntrinsicCache) => {
|
|
||||||
if (heightIntrinsicCache._changed) {
|
|
||||||
heightIterations += 1;
|
|
||||||
heightIntrinsic = heightIntrinsicCache._value;
|
|
||||||
}
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
if (changesSlot) {
|
|
||||||
changesSlot.textContent = heightIterations.toString();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
export { start };
|
export { start };
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<div id="controls">
|
<div id="controls">
|
||||||
|
<button id="ioPolyfill">ResizeObserver polyfill</button>
|
||||||
|
<button id="roPolyfill">IntersectionObserver polyfill</button><br />
|
||||||
<label for="display">display</label>
|
<label for="display">display</label>
|
||||||
<select name="display" id="display">
|
<select name="display" id="display">
|
||||||
<option value="displayBlock">block</option>
|
<option value="displayBlock">block</option>
|
||||||
|
|||||||
@@ -7,7 +7,23 @@ describe('TrinsicObserver', () => {
|
|||||||
await page.goto(url);
|
await page.goto(url);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('test', async () => {
|
test('with IntersectionObserver', async () => {
|
||||||
|
await page.click('#start');
|
||||||
|
await expect(page).toHaveSelector('#testResult.passed');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('with ResizeObserver', async () => {
|
||||||
|
await page.click('#ioPolyfill');
|
||||||
|
await page.waitForTimeout(500);
|
||||||
|
await page.click('#start');
|
||||||
|
await expect(page).toHaveSelector('#testResult.passed');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('with ResizeObserver polyfill', async () => {
|
||||||
|
await page.click('#ioPolyfill');
|
||||||
|
await page.waitForTimeout(500);
|
||||||
|
await page.click('#roPolyfill');
|
||||||
|
await page.waitForTimeout(500);
|
||||||
await page.click('#start');
|
await page.click('#start');
|
||||||
await expect(page).toHaveSelector('#testResult.passed');
|
await expect(page).toHaveSelector('#testResult.passed');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user