Skip to content

Commit

Permalink
fix: text content progression
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryan Huellen committed Sep 17, 2024
1 parent 424f28d commit 7de598e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 36 deletions.
7 changes: 2 additions & 5 deletions src/common/progress.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import type { Page } from '@playwright/test';
import type { ModifiedField } from '../types/ModifiableField';

import { replaceLast } from './utils/replaceLast';

export const progress = async (page: Page, selector: string) =>
page.evaluate((selector) => {
const element = document.querySelector(selector);
Expand Down Expand Up @@ -31,7 +29,7 @@ export const progress = async (page: Page, selector: string) =>
return;
}

const newTextContent = replaceLast(textContent, annotation, '');
const newTextContent = window.replaceLast(textContent, annotation, '');

element.textContent = newTextContent;

Expand All @@ -47,8 +45,7 @@ export const progress = async (page: Page, selector: string) =>
return;
}

const lastAnnotationIndex = attributeValue.lastIndexOf(annotation);
const newValue = attributeValue.slice(0, lastAnnotationIndex);
const newValue = window.replaceLast(attributeValue, annotation, '');

element.setAttribute(attribute, newValue);

Expand Down
44 changes: 13 additions & 31 deletions src/common/setup.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,24 @@
import type { Page } from 'playwright';
import { isElementVisible } from './utils/isElementVisible';
import { replaceLast } from './utils/replaceLast';

declare global {
interface Window {
isElementVisible: (element: Element) => boolean;
replaceLast: (text: string, search: string, replacement: string) => string;
}
}
export const setup = async (page: Page) => {
await page.addInitScript(() => {
window.isElementVisible = (element: Element) => {
if (!element.checkVisibility()) {
return false;
}

const { x, y, height, width } = element.getBoundingClientRect();
const { innerWidth, innerHeight, scrollX, scrollY } = window;

const elementTop = y + scrollY;
const elementBottom = elementTop + height;
const elementLeft = x + scrollX;
const elementRight = elementLeft + width;

const viewportTop = scrollY;
const viewportBottom = innerHeight + scrollY;
const viewportLeft = scrollX;
const viewportRight = innerWidth + scrollX;

const topVisible =
elementTop >= viewportTop && elementTop <= viewportBottom;
const bottomVisible =
elementBottom >= viewportTop && elementBottom <= viewportBottom;
const leftVisible =
elementLeft >= viewportLeft && elementLeft <= viewportRight;
const rightVisible =
elementRight >= viewportLeft && elementRight <= viewportRight;

return topVisible || bottomVisible || leftVisible || rightVisible;
};
});
await page.addInitScript(
({ isElementVisible, replaceLast }) => {
window.isElementVisible = isElementVisible;
window.replaceLast = replaceLast;
},
{
isElementVisible,
replaceLast,
},
);

await page.reload();
};
28 changes: 28 additions & 0 deletions src/common/utils/isElementVisible.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
export const isElementVisible = (element: Element) => {
if (!element.checkVisibility()) {
return false;
}

const { x, y, height, width } = element.getBoundingClientRect();
const { innerWidth, innerHeight, scrollX, scrollY } = window;

const elementTop = y + scrollY;
const elementBottom = elementTop + height;
const elementLeft = x + scrollX;
const elementRight = elementLeft + width;

const viewportTop = scrollY;
const viewportBottom = innerHeight + scrollY;
const viewportLeft = scrollX;
const viewportRight = innerWidth + scrollX;

const topVisible = elementTop >= viewportTop && elementTop <= viewportBottom;
const bottomVisible =
elementBottom >= viewportTop && elementBottom <= viewportBottom;
const leftVisible =
elementLeft >= viewportLeft && elementLeft <= viewportRight;
const rightVisible =
elementRight >= viewportLeft && elementRight <= viewportRight;

return topVisible || bottomVisible || leftVisible || rightVisible;
};

0 comments on commit 7de598e

Please sign in to comment.