From cd65a324fe7df524da3471be124f779c96a974e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 20 Mar 2023 06:01:25 -0700 Subject: [PATCH] Add skeletons for ReadOnlyNode, ReadOnlyElement and ReactNativeElement Summary: This just creates the class structure for `ReadOnlyNode`, `ReadOnlyElement` and `ReactNativeElement`, with all methods throwing as unimplemented. These classes will be gated behind a feature flag, so merging incomplete work is ok. This doesn't add the future setters that will log warnings / throw errors when used. See: https://github.com/react-native-community/discussions-and-proposals/pull/607 Changelog: [internal] Reviewed By: rickhanlonii, yungsters Differential Revision: D44060539 fbshipit-source-id: e489532fd365d9aa2bb8308847a35eb715d675e7 --- .../Libraries/DOM/Nodes/ReactNativeElement.js | 75 ++++++++ .../Libraries/DOM/Nodes/ReadOnlyElement.js | 89 ++++++++++ .../Libraries/DOM/Nodes/ReadOnlyNode.js | 167 ++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 packages/react-native/Libraries/DOM/Nodes/ReactNativeElement.js create mode 100644 packages/react-native/Libraries/DOM/Nodes/ReadOnlyElement.js create mode 100644 packages/react-native/Libraries/DOM/Nodes/ReadOnlyNode.js diff --git a/packages/react-native/Libraries/DOM/Nodes/ReactNativeElement.js b/packages/react-native/Libraries/DOM/Nodes/ReactNativeElement.js new file mode 100644 index 00000000000..1f9e9b77b0a --- /dev/null +++ b/packages/react-native/Libraries/DOM/Nodes/ReactNativeElement.js @@ -0,0 +1,75 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow strict + */ + +// flowlint unsafe-getters-setters:off + +import type { + HostComponent, + MeasureInWindowOnSuccessCallback, + MeasureLayoutOnSuccessCallback, + MeasureOnSuccessCallback, +} from '../../Renderer/shims/ReactNativeTypes'; +import type {ElementRef} from 'react'; + +import ReadOnlyElement from './ReadOnlyElement'; + +export default class ReactNativeElement extends ReadOnlyElement { + get offsetHeight(): number { + throw new TypeError('Unimplemented'); + } + + get offsetLeft(): number { + throw new TypeError('Unimplemented'); + } + + get offsetParent(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get offsetTop(): number { + throw new TypeError('Unimplemented'); + } + + get offsetWidth(): number { + throw new TypeError('Unimplemented'); + } + + /** + * React Native compatibility methods + */ + + blur(): void { + throw new TypeError('Unimplemented'); + } + + focus(): void { + throw new TypeError('Unimplemented'); + } + + measure(callback: MeasureOnSuccessCallback): void { + throw new TypeError('Unimplemented'); + } + + measureInWindow(callback: MeasureInWindowOnSuccessCallback): void { + throw new TypeError('Unimplemented'); + } + + measureLayout( + relativeToNativeNode: number | ElementRef>, + onSuccess: MeasureLayoutOnSuccessCallback, + onFail?: () => void /* currently unused */, + ): void { + throw new TypeError('Unimplemented'); + } + + setNativeProps(nativeProps: {...}): void { + throw new TypeError('Unimplemented'); + } +} diff --git a/packages/react-native/Libraries/DOM/Nodes/ReadOnlyElement.js b/packages/react-native/Libraries/DOM/Nodes/ReadOnlyElement.js new file mode 100644 index 00000000000..1307ba57c8b --- /dev/null +++ b/packages/react-native/Libraries/DOM/Nodes/ReadOnlyElement.js @@ -0,0 +1,89 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow strict + */ + +// flowlint unsafe-getters-setters:off + +import type HTMLCollection from '../OldStyleCollections/HTMLCollection'; + +import ReadOnlyNode from './ReadOnlyNode'; + +export default class ReadOnlyElement extends ReadOnlyNode { + get childElementCount(): number { + throw new TypeError('Unimplemented'); + } + + get children(): HTMLCollection { + throw new TypeError('Unimplemented'); + } + + get clientHeight(): number { + throw new TypeError('Unimplemented'); + } + + get clientLeft(): number { + throw new TypeError('Unimplemented'); + } + + get clientTop(): number { + throw new TypeError('Unimplemented'); + } + + get clientWidth(): number { + throw new TypeError('Unimplemented'); + } + + get firstElementChild(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get id(): string { + throw new TypeError('Unimplemented'); + } + + get lastElementChild(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get nextElementSibling(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get previousElementSibling(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get scrollHeight(): number { + throw new TypeError('Unimplemented'); + } + + get scrollLeft(): number { + throw new TypeError('Unimplemented'); + } + + get scrollTop(): number { + throw new TypeError('Unimplemented'); + } + + get scrollWidth(): number { + throw new TypeError('Unimplemented'); + } + + get tagName(): string { + throw new TypeError('Unimplemented'); + } + + getBoundingClientRect(): DOMRect { + throw new TypeError('Unimplemented'); + } + + getClientRects(): DOMRectList { + throw new TypeError('Unimplemented'); + } +} diff --git a/packages/react-native/Libraries/DOM/Nodes/ReadOnlyNode.js b/packages/react-native/Libraries/DOM/Nodes/ReadOnlyNode.js new file mode 100644 index 00000000000..d6cc6b878f4 --- /dev/null +++ b/packages/react-native/Libraries/DOM/Nodes/ReadOnlyNode.js @@ -0,0 +1,167 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow strict + */ + +// flowlint unsafe-getters-setters:off + +import type NodeList from '../OldStyleCollections/NodeList'; +import type ReadOnlyElement from './ReadOnlyElement'; + +export default class ReadOnlyNode { + get childNodes(): NodeList { + throw new TypeError('Unimplemented'); + } + + get firstChild(): ReadOnlyNode | null { + throw new TypeError('Unimplemented'); + } + + get isConnected(): boolean { + throw new TypeError('Unimplemented'); + } + + get lastChild(): ReadOnlyNode | null { + throw new TypeError('Unimplemented'); + } + + get nextSibling(): ReadOnlyNode | null { + throw new TypeError('Unimplemented'); + } + + get nodeName(): string { + throw new TypeError('Unimplemented'); + } + + get nodeType(): number { + throw new TypeError('Unimplemented'); + } + + get nodeValue(): string | null { + throw new TypeError('Unimplemented'); + } + + get parentElement(): ReadOnlyElement | null { + throw new TypeError('Unimplemented'); + } + + get parentNode(): ReadOnlyNode | null { + throw new TypeError('Unimplemented'); + } + + get previousSibling(): ReadOnlyNode | null { + throw new TypeError('Unimplemented'); + } + + get textContent(): string | null { + throw new TypeError('Unimplemented'); + } + + compareDocumentPosition(otherNode: ReadOnlyNode): number { + throw new TypeError('Unimplemented'); + } + + contains(otherNode: ReadOnlyNode): boolean { + throw new TypeError('Unimplemented'); + } + + getRootNode(): ReadOnlyNode { + throw new TypeError('Unimplemented'); + } + + hasChildNodes(): boolean { + throw new TypeError('Unimplemented'); + } + + /* + * Node types, as returned by the `nodeType` property. + */ + + /** + * Type of Element, HTMLElement and ReactNativeElement instances. + */ + static ELEMENT_NODE: number = 1; + /** + * Currently Unused in React Native. + */ + static ATTRIBUTE_NODE: number = 2; + /** + * Text nodes. + */ + static TEXT_NODE: number = 3; + /** + * @deprecated Unused in React Native. + */ + static CDATA_SECTION_NODE: number = 4; + /** + * @deprecated + */ + static ENTITY_REFERENCE_NODE: number = 5; + /** + * @deprecated + */ + static ENTITY_NODE: number = 6; + /** + * @deprecated Unused in React Native. + */ + static PROCESSING_INSTRUCTION_NODE: number = 7; + /** + * @deprecated Unused in React Native. + */ + static COMMENT_NODE: number = 8; + /** + * @deprecated Unused in React Native. + */ + static DOCUMENT_NODE: number = 9; + /** + * @deprecated Unused in React Native. + */ + static DOCUMENT_TYPE_NODE: number = 10; + /** + * @deprecated Unused in React Native. + */ + static DOCUMENT_FRAGMENT_NODE: number = 11; + /** + * @deprecated + */ + static NOTATION_NODE: number = 12; + + /* + * Document position flags. Used to check the return value of + * `compareDocumentPosition()`. + */ + + /** + * Both nodes are in different documents. + */ + static DOCUMENT_POSITION_DISCONNECTED: number = 1; + /** + * `otherNode` precedes the node in either a pre-order depth-first traversal of a tree containing both + * (e.g., as an ancestor or previous sibling or a descendant of a previous sibling or previous sibling of an ancestor) + * or (if they are disconnected) in an arbitrary but consistent ordering. + */ + static DOCUMENT_POSITION_PRECEDING: number = 2; + /** + * `otherNode` follows the node in either a pre-order depth-first traversal of a tree containing both + * (e.g., as a descendant or following sibling or a descendant of a following sibling or following sibling of an ancestor) + * or (if they are disconnected) in an arbitrary but consistent ordering. + */ + static DOCUMENT_POSITION_FOLLOWING: number = 4; + /** + * `otherNode` is an ancestor of the node. + */ + static DOCUMENT_POSITION_CONTAINS: number = 8; + /** + * `otherNode` is a descendant of the node. + */ + static DOCUMENT_POSITION_CONTAINED_BY: number = 16; + /** + * @deprecated Unused in React Native. + */ + static DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number = 32; +}