From 25dd06e791292bb7aeae3d032e0911c4021e7e28 Mon Sep 17 00:00:00 2001
From: TheCymaera <69355340+TheCymaera@users.noreply.github.com>
Date: Fri, 11 Nov 2022 03:30:48 +0800
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Added=20support=20for=20resize=20ob?=
=?UTF-8?q?server=20bindings?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/compiler/compile/nodes/Binding.ts | 3 +-
src/compiler/compile/nodes/Element.ts | 7 ++-
.../render_dom/wrappers/Element/Binding.ts | 12 +++++
.../render_dom/wrappers/Element/index.ts | 30 +++++++++--
src/compiler/utils/patterns.ts | 5 ++
.../internal/ResizeObserverSingleton.ts | 50 ++++++++++++-------
src/runtime/internal/dom.ts | 47 ++++++++++-------
7 files changed, 111 insertions(+), 43 deletions(-)
diff --git a/src/compiler/compile/nodes/Binding.ts b/src/compiler/compile/nodes/Binding.ts
index f826df4828..f253d847a2 100644
--- a/src/compiler/compile/nodes/Binding.ts
+++ b/src/compiler/compile/nodes/Binding.ts
@@ -3,7 +3,7 @@ import get_object from '../utils/get_object';
import Expression from './shared/Expression';
import Component from '../Component';
import TemplateScope from './shared/TemplateScope';
-import { regex_dimensions } from '../../utils/patterns';
+import { regex_dimensions, regex_box_size } from '../../utils/patterns';
import { Node as ESTreeNode } from 'estree';
import { TemplateNode } from '../../interfaces';
import Element from './Element';
@@ -89,6 +89,7 @@ export default class Binding extends Node {
this.is_readonly =
regex_dimensions.test(this.name) ||
+ regex_box_size.test(this.name) ||
(isElement(parent) &&
((parent.is_media_node() && read_only_media_attributes.has(this.name)) ||
(parent.name === 'input' && type === 'file')) /* TODO others? */);
diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts
index ca9bcb8c4e..903de939bb 100644
--- a/src/compiler/compile/nodes/Element.ts
+++ b/src/compiler/compile/nodes/Element.ts
@@ -11,7 +11,7 @@ import StyleDirective from './StyleDirective';
import Text from './Text';
import { namespaces } from '../../utils/namespaces';
import map_children from './shared/map_children';
-import { regex_dimensions, regex_starts_with_newline, regex_non_whitespace_character } from '../../utils/patterns';
+import { regex_dimensions, regex_starts_with_newline, regex_non_whitespace_character, regex_box_size, regex_border_box_size, regex_content_box_size } from '../../utils/patterns';
import fuzzymatch from '../../utils/fuzzymatch';
import list from '../../utils/list';
import Let from './Let';
@@ -907,7 +907,10 @@ export default class Element extends Node {
} else if (contenteditable && !contenteditable.is_static) {
return component.error(contenteditable, compiler_errors.dynamic_contenteditable_attribute);
}
- } else if (name !== 'this') {
+ } else if (
+ name !== 'this' &&
+ !regex_box_size.test(name)
+ ) {
return component.error(binding, compiler_errors.invalid_binding(binding.name));
}
});
diff --git a/src/compiler/compile/render_dom/wrappers/Element/Binding.ts b/src/compiler/compile/render_dom/wrappers/Element/Binding.ts
index 9e2ec85f0f..46f1cfc043 100644
--- a/src/compiler/compile/render_dom/wrappers/Element/Binding.ts
+++ b/src/compiler/compile/render_dom/wrappers/Element/Binding.ts
@@ -11,6 +11,7 @@ import { Node, Identifier } from 'estree';
import add_to_set from '../../../utils/add_to_set';
import mark_each_block_bindings from '../shared/mark_each_block_bindings';
import handle_select_value_binding from './handle_select_value_binding';
+import { regex_box_size } from '../../../../utils/patterns.js';
export default class BindingWrapper {
node: Binding;
@@ -413,6 +414,17 @@ function get_value_from_dom(
return x`$$value`;
}
+ //
+ if (regex_box_size.test(name)) {
+ const functionName = {
+ "contentRect": "get_content_rect",
+ "contentBoxSize": "get_content_box_size",
+ "borderBoxSize": "get_border_box_size",
+ "devicePixelContentBoxSize": "get_device_pixel_content_box_size",
+ }
+ return x`@${functionName}(this)`;
+ }
+
//