HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //proc/self/cwd/wp-content/plugins/embed-optimizer/detect.js
/**
 * Embed Optimizer module for Optimization Detective
 *
 * When a URL Metric is being collected by Optimization Detective, this module adds a ResizeObserver to keep track of
 * the changed heights for embed blocks. This data is extended/amended onto the element data of the pending URL Metric
 * when it is submitted for storage.
 */

export const name = 'Embed Optimizer';

/**
 * @typedef {import("../optimization-detective/types.ts").URLMetric} URLMetric
 * @typedef {import("../optimization-detective/types.ts").Extension} Extension
 * @typedef {import("../optimization-detective/types.ts").InitializeCallback} InitializeCallback
 * @typedef {import("../optimization-detective/types.ts").InitializeArgs} InitializeArgs
 * @typedef {import("../optimization-detective/types.ts").GetElementDataFunction} GetElementDataFunction
 * @typedef {import("../optimization-detective/types.ts").ExtendElementDataFunction} ExtendElementDataFunction
 * @typedef {import("../optimization-detective/types.ts").ExtendedElementData} ExtendedElementData
 * @typedef {import("../optimization-detective/types.ts").LogFunction} LogFunction
 */

/**
 * Initializes extension.
 *
 * @type {InitializeCallback}
 * @param {InitializeArgs} args Args.
 */
export async function initialize( {
	log,
	error,
	getElementData,
	extendElementData,
} ) {
	/** @type NodeListOf<HTMLDivElement> */
	const embedWrappers = document.querySelectorAll(
		'.wp-block-embed > .wp-block-embed__wrapper[data-od-xpath]'
	);

	for ( /** @type {HTMLElement} */ const embedWrapper of embedWrappers ) {
		monitorEmbedWrapperForResizes(
			embedWrapper,
			extendElementData,
			getElementData,
			log,
			error
		);
	}
}

/**
 * Monitors embed wrapper for resizes.
 *
 * @param {HTMLDivElement}            embedWrapper      - Embed wrapper DIV.
 * @param {ExtendElementDataFunction} extendElementData - Function to extend element data with.
 * @param {GetElementDataFunction}    getElementData    - Function to get element data.
 * @param {LogFunction}               log               - The function to call with log messages.
 * @param {LogFunction}               error             - The function to call with error messages.
 */
function monitorEmbedWrapperForResizes(
	embedWrapper,
	extendElementData,
	getElementData,
	log,
	error
) {
	if ( ! ( 'odXpath' in embedWrapper.dataset ) ) {
		throw new Error( 'Embed wrapper missing data-od-xpath attribute.' );
	}
	const xpath = embedWrapper.dataset.odXpath;
	const observer = new ResizeObserver( ( entries ) => {
		const [ entry ] = entries;

		try {
			extendElementData( xpath, {
				resizedBoundingClientRect: entry.contentRect,
			} );
			const elementData = getElementData( xpath );
			log(
				`Resized element ${ xpath }:`,
				elementData.boundingClientRect,
				'=>',
				entry.contentRect
			);
		} catch ( err ) {
			error(
				`Failed to extend element data for ${ xpath } with resizedBoundingClientRect:`,
				entry.contentRect,
				err
			);
		}
	} );
	observer.observe( embedWrapper, { box: 'content-box' } );
}