UNPKG

@formidable-webview/webshell

Version:

🔥 Craft Robust React Native WebView-based components with ease.

41 lines (36 loc) • 5.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HandleHTMLDimensionsFeature = void 0; var _FeatureBuilder = _interopRequireDefault(require("../FeatureBuilder")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /* babel-plugin-inline-import './HandleHTMLDimensionsFeature.webjs' */ var script = "function HandleHTMLDimensionsFeature(context) {\n var options = context.options || {};\n var forceImplementation = options.forceImplementation || false;\n var listenToWindowResizeEvent =\n options.listenToWindowResizeEvent === false ? false : true;\n var pollingInterval =\n typeof options.pollingInterval === 'number' ? options.pollingInterval : 200;\n var deltaMin = options.deltaMin || 0;\n var oldDimensions = {\n layoutViewport: { width: 0, height: 0 },\n content: { width: 0, height: 0 }\n };\n var MutationObserver =\n window['MutationObserver'] || window['WebKitMutationObserver'];\n function extractNumericValue(pixelString) {\n return pixelString ? parseFloat(pixelString.match(/[\\d.]+/)) : 0;\n }\n function dimensionsAreEqual(d1, d2) {\n return (\n Math.abs(d1.layoutViewport.width - d2.layoutViewport.width) < deltaMin &&\n Math.abs(d1.layoutViewport.height - d2.layoutViewport.height) <\n deltaMin &&\n Math.abs(d1.content.width - d2.content.width) < deltaMin &&\n Math.abs(d1.content.height - d2.content.height) < deltaMin &&\n d1.implementation === d2.implementation\n );\n }\n function createPostDimensions(implementation) {\n return context.makeCallbackSafe(function postSize() {\n var bodyStyle = getComputedStyle(document.body);\n var bodySize = document.body.getBoundingClientRect();\n var marginRight = extractNumericValue(bodyStyle.marginRight);\n var marginBottom = extractNumericValue(bodyStyle.marginBottom);\n var layoutViewport = {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight\n };\n var dimensions = {\n implementation: implementation,\n layoutViewport: layoutViewport,\n content: {\n width: bodySize.right + marginRight,\n height: bodySize.bottom + marginBottom\n }\n };\n if (!dimensionsAreEqual(oldDimensions, dimensions)) {\n context.postMessageToShell(dimensions);\n oldDimensions = dimensions;\n }\n });\n }\n if (\n window.ResizeObserver &&\n (forceImplementation === false || forceImplementation === 'resize')\n ) {\n // resize mode\n var resizePostDimensions = createPostDimensions('resize');\n var resizeObserver = new window.ResizeObserver(resizePostDimensions);\n resizeObserver.observe(document.body);\n resizePostDimensions();\n } else if (\n MutationObserver &&\n (forceImplementation === false || forceImplementation === 'mutation')\n ) {\n // mutation mode\n var observerPostDimensions = createPostDimensions('mutation');\n if (listenToWindowResizeEvent) {\n window.addEventListener('resize', observerPostDimensions);\n }\n var observer = new MutationObserver(observerPostDimensions);\n observer.observe(document, {\n subtree: true,\n attributes: true\n });\n observerPostDimensions();\n } else {\n // polling mode\n var pollingPostDimensions = createPostDimensions('polling');\n if (listenToWindowResizeEvent) {\n window.addEventListener('resize', pollingPostDimensions);\n }\n setInterval(pollingPostDimensions, pollingInterval);\n pollingPostDimensions();\n forceImplementation !== 'polling' &&\n context.warn(\n \"This browser doesn't support either MutationObserver or ResizeObserver.\" +\n 'The dimensions will still be read every ' +\n pollingInterval +\n 'ms and committed when a change is observed.'\n );\n }\n}\n"; var defaultOptions = { deltaMin: 0, forceImplementation: false, pollingInterval: 200, listenToWindowResizeEvent: true }; /** * This feature provides `onDOMHTMLDimensions` prop with {@link HTMLDimensions} payloads. * It enables receiving various dimensions relative to the layout when a change * is observed to either the layout or the content size. The feature can be customized with * {@link HandleHTMLDimensionsOptions}. * See {@link https://formidable-webview.github.io/webshell//docs/getting-started#minimal-example | this guide for an example}. * * @remarks * If you need to guarantee that 1 CSS pixel = 1 Device pixel, you should use this * feature with a meta tag viewport setting width to device width. * See {@link ForceResponsiveViewportFeature} * * @public */ var HandleHTMLDimensionsFeature = new _FeatureBuilder["default"]({ script: script, defaultOptions: defaultOptions, identifier: 'org.formidable-webview/webshell.handle-html-dimensions' }).withShellHandler('onDOMHTMLDimensions').build(); exports.HandleHTMLDimensionsFeature = HandleHTMLDimensionsFeature; //# sourceMappingURL=HandleHTMLDimensionsFeature.js.map