diff --git a/javascript/src_js/wrapAsm.js b/javascript/src_js/wrapAsm.js index 3c03269f..e0c3c888 100644 --- a/javascript/src_js/wrapAsm.js +++ b/javascript/src_js/wrapAsm.js @@ -74,11 +74,25 @@ module.exports = (lib) => { } function wrapMeasureFunction(measureFunction) { - return lib.MeasureCallback.implement({ measure: measureFunction }); + return lib.MeasureCallback.implement({ + measure: (...args) => { + const { width, height } = measureFunction(...args); + return { + width: width ?? NaN, + height: height ?? NaN, + }; + }, + }); } patch(lib.Node.prototype, "setMeasureFunc", function (original, measureFunc) { - original.call(this, wrapMeasureFunction(measureFunc)); + // This patch is just a convenience patch, since it helps write more + // idiomatic source code (such as .setMeasureFunc(null)) + if (measureFunc) { + return original.call(this, wrapMeasureFunction(measureFunc)); + } else { + return this.unsetMeasureFunc(); + } }); function wrapDirtiedFunc(dirtiedFunction) { @@ -115,16 +129,6 @@ module.exports = (lib) => { this.free(); }); - patch(lib.Node.prototype, "setMeasureFunc", function (original, measureFunc) { - // This patch is just a convenience patch, since it helps write more - // idiomatic source code (such as .setMeasureFunc(null)) - if (measureFunc) { - return original.call(this, (...args) => measureFunc(...args)); - } else { - return this.unsetMeasureFunc(); - } - }); - patch( lib.Node.prototype, "calculateLayout", diff --git a/javascript/tests/YGMeasureTest.test.js b/javascript/tests/YGMeasureTest.test.js index d222af6f..b269ffb6 100644 --- a/javascript/tests/YGMeasureTest.test.js +++ b/javascript/tests/YGMeasureTest.test.js @@ -23,3 +23,42 @@ test("dont_measure_single_grow_shrink_child", () => { root.freeRecursive(); }); + +test("dont_fail_with_incomplete_measure_dimensions", () => { + const heightOnlyCallback = getMeasureCounter(Yoga, () => ({ height: 10 })); + const widthOnlyCallback = getMeasureCounter(Yoga, () => ({ width: 10 })); + const emptyCallback = getMeasureCounter(Yoga, () => ({})); + + const root = Yoga.Node.create(); + root.setWidth(100); + root.setHeight(100); + + const node1 = Yoga.Node.create(); + const node2 = Yoga.Node.create(); + const node3 = Yoga.Node.create(); + + root.insertChild(node1, root.getChildCount()); + root.insertChild(node2, root.getChildCount()); + root.insertChild(node3, root.getChildCount()); + + node1.setMeasureFunc(heightOnlyCallback.inc); + node2.setMeasureFunc(widthOnlyCallback.inc); + node3.setMeasureFunc(emptyCallback.inc); + + root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR); + + expect(heightOnlyCallback.get()).toBe(1); + expect(widthOnlyCallback.get()).toBe(1); + expect(emptyCallback.get()).toBe(1); + + expect(node1.getComputedWidth()).toBe(100); + expect(node1.getComputedHeight()).toBe(10); + + expect(node2.getComputedWidth()).toBe(100); + expect(node2.getComputedHeight()).toBe(0); + + expect(node3.getComputedWidth()).toBe(100); + expect(node3.getComputedHeight()).toBe(0); + + root.freeRecursive(); +});