@wordpress/dom 4.52.0 → 4.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/build/dom/clean-node-list.cjs +5 -1
  3. package/build/dom/clean-node-list.cjs.map +3 -3
  4. package/build/dom/compute-caret-rect.cjs.map +2 -2
  5. package/build/dom/document-has-selection.cjs.map +2 -2
  6. package/build/dom/document-has-text-selection.cjs.map +2 -2
  7. package/build/dom/document-has-uncollapsed-selection.cjs.map +2 -2
  8. package/build/dom/get-computed-style.cjs.map +2 -2
  9. package/build/dom/get-offset-parent.cjs.map +2 -2
  10. package/build/dom/get-rectangle-from-range.cjs +15 -0
  11. package/build/dom/get-rectangle-from-range.cjs.map +2 -2
  12. package/build/dom/get-scroll-container.cjs.map +2 -2
  13. package/build/dom/hidden-caret-range-from-point.cjs.map +2 -2
  14. package/build/dom/input-field-has-uncollapsed-selection.cjs.map +2 -2
  15. package/build/dom/insert-after.cjs.map +2 -2
  16. package/build/dom/is-edge.cjs.map +2 -2
  17. package/build/dom/is-entirely-selected.cjs.map +2 -2
  18. package/build/dom/is-form-element.cjs.map +2 -2
  19. package/build/dom/is-horizontal-edge.cjs.map +2 -2
  20. package/build/dom/is-number-input.cjs.map +2 -2
  21. package/build/dom/is-rtl.cjs.map +2 -2
  22. package/build/dom/is-selection-forward.cjs.map +2 -2
  23. package/build/dom/is-text-field.cjs.map +2 -2
  24. package/build/dom/is-vertical-edge.cjs.map +2 -2
  25. package/build/dom/place-caret-at-edge.cjs.map +2 -2
  26. package/build/dom/place-caret-at-horizontal-edge.cjs.map +2 -2
  27. package/build/dom/place-caret-at-vertical-edge.cjs.map +2 -2
  28. package/build/dom/remove-invalid-html.cjs.map +2 -2
  29. package/build/dom/remove.cjs.map +2 -2
  30. package/build/dom/replace-tag.cjs.map +2 -2
  31. package/build/dom/replace.cjs.map +2 -2
  32. package/build/dom/safe-html.cjs.map +2 -2
  33. package/build/dom/strip-html.cjs.map +2 -2
  34. package/build/dom/unwrap.cjs.map +2 -2
  35. package/build/dom/wrap.cjs.map +2 -2
  36. package/build/index.cjs.map +2 -2
  37. package/build/tabbable.cjs.map +2 -2
  38. package/build-module/dom/clean-node-list.mjs +5 -1
  39. package/build-module/dom/clean-node-list.mjs.map +2 -2
  40. package/build-module/dom/compute-caret-rect.mjs.map +2 -2
  41. package/build-module/dom/document-has-selection.mjs.map +2 -2
  42. package/build-module/dom/document-has-text-selection.mjs.map +2 -2
  43. package/build-module/dom/document-has-uncollapsed-selection.mjs.map +2 -2
  44. package/build-module/dom/get-computed-style.mjs.map +2 -2
  45. package/build-module/dom/get-offset-parent.mjs.map +2 -2
  46. package/build-module/dom/get-rectangle-from-range.mjs +15 -0
  47. package/build-module/dom/get-rectangle-from-range.mjs.map +2 -2
  48. package/build-module/dom/get-scroll-container.mjs.map +2 -2
  49. package/build-module/dom/hidden-caret-range-from-point.mjs.map +2 -2
  50. package/build-module/dom/input-field-has-uncollapsed-selection.mjs.map +2 -2
  51. package/build-module/dom/insert-after.mjs.map +2 -2
  52. package/build-module/dom/is-edge.mjs.map +2 -2
  53. package/build-module/dom/is-entirely-selected.mjs.map +2 -2
  54. package/build-module/dom/is-form-element.mjs.map +2 -2
  55. package/build-module/dom/is-horizontal-edge.mjs.map +2 -2
  56. package/build-module/dom/is-number-input.mjs.map +2 -2
  57. package/build-module/dom/is-rtl.mjs.map +2 -2
  58. package/build-module/dom/is-selection-forward.mjs.map +2 -2
  59. package/build-module/dom/is-text-field.mjs.map +2 -2
  60. package/build-module/dom/is-vertical-edge.mjs.map +2 -2
  61. package/build-module/dom/place-caret-at-edge.mjs.map +2 -2
  62. package/build-module/dom/place-caret-at-horizontal-edge.mjs.map +2 -2
  63. package/build-module/dom/place-caret-at-vertical-edge.mjs.map +2 -2
  64. package/build-module/dom/remove-invalid-html.mjs.map +2 -2
  65. package/build-module/dom/remove.mjs.map +2 -2
  66. package/build-module/dom/replace-tag.mjs.map +2 -2
  67. package/build-module/dom/replace.mjs.map +2 -2
  68. package/build-module/dom/safe-html.mjs.map +2 -2
  69. package/build-module/dom/strip-html.mjs.map +2 -2
  70. package/build-module/dom/unwrap.mjs.map +2 -2
  71. package/build-module/dom/wrap.mjs.map +2 -2
  72. package/build-module/index.mjs.map +2 -2
  73. package/build-module/tabbable.mjs.map +2 -2
  74. package/build-types/dom/clean-node-list.d.ts.map +1 -1
  75. package/build-types/dom/compute-caret-rect.d.ts.map +1 -1
  76. package/build-types/dom/document-has-selection.d.ts.map +1 -1
  77. package/build-types/dom/document-has-text-selection.d.ts.map +1 -1
  78. package/build-types/dom/document-has-uncollapsed-selection.d.ts.map +1 -1
  79. package/build-types/dom/get-computed-style.d.ts.map +1 -1
  80. package/build-types/dom/get-offset-parent.d.ts.map +1 -1
  81. package/build-types/dom/get-rectangle-from-range.d.ts.map +1 -1
  82. package/build-types/dom/get-scroll-container.d.ts.map +1 -1
  83. package/build-types/dom/hidden-caret-range-from-point.d.ts.map +1 -1
  84. package/build-types/dom/input-field-has-uncollapsed-selection.d.ts.map +1 -1
  85. package/build-types/dom/insert-after.d.ts.map +1 -1
  86. package/build-types/dom/is-edge.d.ts.map +1 -1
  87. package/build-types/dom/is-entirely-selected.d.ts.map +1 -1
  88. package/build-types/dom/is-form-element.d.ts.map +1 -1
  89. package/build-types/dom/is-horizontal-edge.d.ts.map +1 -1
  90. package/build-types/dom/is-number-input.d.ts.map +1 -1
  91. package/build-types/dom/is-rtl.d.ts.map +1 -1
  92. package/build-types/dom/is-selection-forward.d.ts.map +1 -1
  93. package/build-types/dom/is-text-field.d.ts.map +1 -1
  94. package/build-types/dom/is-vertical-edge.d.ts.map +1 -1
  95. package/build-types/dom/place-caret-at-edge.d.ts.map +1 -1
  96. package/build-types/dom/place-caret-at-horizontal-edge.d.ts.map +1 -1
  97. package/build-types/dom/place-caret-at-vertical-edge.d.ts.map +1 -1
  98. package/build-types/dom/remove-invalid-html.d.ts.map +1 -1
  99. package/build-types/dom/remove.d.ts.map +1 -1
  100. package/build-types/dom/replace-tag.d.ts.map +1 -1
  101. package/build-types/dom/replace.d.ts.map +1 -1
  102. package/build-types/dom/safe-html.d.ts.map +1 -1
  103. package/build-types/dom/strip-html.d.ts.map +1 -1
  104. package/build-types/dom/unwrap.d.ts.map +1 -1
  105. package/build-types/dom/wrap.d.ts.map +1 -1
  106. package/build-types/index.d.ts +0 -3
  107. package/build-types/index.d.ts.map +1 -1
  108. package/build-types/tabbable.d.ts.map +1 -1
  109. package/package.json +3 -3
  110. package/src/dom/clean-node-list.js +11 -5
  111. package/src/dom/compute-caret-rect.js +0 -3
  112. package/src/dom/document-has-selection.js +0 -3
  113. package/src/dom/document-has-text-selection.js +0 -3
  114. package/src/dom/document-has-uncollapsed-selection.js +0 -3
  115. package/src/dom/get-computed-style.js +0 -3
  116. package/src/dom/get-offset-parent.js +0 -3
  117. package/src/dom/get-rectangle-from-range.js +30 -3
  118. package/src/dom/get-scroll-container.js +0 -3
  119. package/src/dom/hidden-caret-range-from-point.js +0 -3
  120. package/src/dom/input-field-has-uncollapsed-selection.js +0 -3
  121. package/src/dom/insert-after.js +0 -3
  122. package/src/dom/is-edge.js +0 -3
  123. package/src/dom/is-entirely-selected.js +0 -3
  124. package/src/dom/is-form-element.js +0 -3
  125. package/src/dom/is-horizontal-edge.js +0 -3
  126. package/src/dom/is-number-input.js +0 -7
  127. package/src/dom/is-rtl.js +0 -3
  128. package/src/dom/is-selection-forward.js +0 -3
  129. package/src/dom/is-text-field.js +0 -3
  130. package/src/dom/is-vertical-edge.js +0 -3
  131. package/src/dom/place-caret-at-edge.js +0 -3
  132. package/src/dom/place-caret-at-horizontal-edge.js +0 -3
  133. package/src/dom/place-caret-at-vertical-edge.js +0 -3
  134. package/src/dom/remove-invalid-html.js +0 -3
  135. package/src/dom/remove.js +0 -3
  136. package/src/dom/replace-tag.js +0 -3
  137. package/src/dom/replace.js +0 -3
  138. package/src/dom/safe-html.js +0 -3
  139. package/src/dom/strip-html.js +0 -3
  140. package/src/dom/test/safe-html.js +0 -3
  141. package/src/dom/test/strip-html.js +0 -3
  142. package/src/dom/unwrap.js +0 -3
  143. package/src/dom/wrap.js +0 -3
  144. package/src/index.js +0 -3
  145. package/src/tabbable.js +1 -4
  146. package/src/test/dom.js +18 -4
  147. package/src/test/focusable.js +0 -3
  148. package/src/test/tabbable.js +0 -3
  149. package/src/test/utils.js +0 -3
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
@@ -91,6 +88,36 @@ export default function getRectangleFromRange( range ) {
91
88
  return null;
92
89
  }
93
90
 
91
+ // A collapsed range at a soft line wrap is equally ambiguous: the same
92
+ // position ends one line and starts the next. Some browsers (Gecko)
93
+ // return a single rectangle for it, on the upper line, regardless of
94
+ // where the caret is. Detect the boundary by measuring the characters
95
+ // around the position: when they sit on different lines, there is no
96
+ // way to know which line the caret is on, so don't return anything.
97
+ if (
98
+ rects.length === 1 &&
99
+ startContainer.nodeType === startContainer.TEXT_NODE &&
100
+ range.startOffset > 0 &&
101
+ range.startOffset < /** @type {Text} */ ( startContainer ).length
102
+ ) {
103
+ assertIsDefined( ownerDocument, 'ownerDocument' );
104
+ const measure = (
105
+ /** @type {number} */ start,
106
+ /** @type {number} */ end
107
+ ) => {
108
+ const charRange = ownerDocument.createRange();
109
+ charRange.setStart( startContainer, start );
110
+ charRange.setEnd( startContainer, end );
111
+ return charRange.getBoundingClientRect();
112
+ };
113
+ const before = measure( range.startOffset - 1, range.startOffset );
114
+ const after = measure( range.startOffset, range.startOffset + 1 );
115
+
116
+ if ( before.bottom <= after.top ) {
117
+ return null;
118
+ }
119
+ }
120
+
94
121
  let rect = rects[ 0 ];
95
122
 
96
123
  // If the collapsed range starts (and therefore ends) at an element node,
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import getComputedStyle from './get-computed-style';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import caretRangeFromPoint from './caret-range-from-point';
5
2
  import getComputedStyle from './get-computed-style';
6
3
 
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isTextField from './is-text-field';
5
2
  import isHTMLInputElement from './is-html-input-element';
6
3
 
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isRTL from './is-rtl';
5
2
  import getRangeHeight from './get-range-height';
6
3
  import getRectangleFromRange from './get-rectangle-from-range';
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
  import isInputOrTextArea from './is-input-or-text-area';
6
3
 
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isInputOrTextArea from './is-input-or-text-area';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isEdge from './is-edge';
5
2
 
6
3
  /**
@@ -1,11 +1,4 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
1
  import deprecated from '@wordpress/deprecated';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
2
  import isHTMLInputElement from './is-html-input-element';
10
3
 
11
4
  /**
package/src/dom/is-rtl.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import getComputedStyle from './get-computed-style';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isHTMLInputElement from './is-html-input-element';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import isEdge from './is-edge';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import hiddenCaretRangeFromPoint from './hidden-caret-range-from-point';
5
2
  import { assertIsDefined } from '../utils/assert-is-defined';
6
3
  import isInputOrTextArea from './is-input-or-text-area';
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import placeCaretAtEdge from './place-caret-at-edge';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import placeCaretAtEdge from './place-caret-at-edge';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import cleanNodeList from './clean-node-list';
5
2
 
6
3
  /**
package/src/dom/remove.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
  import insertAfter from './insert-after';
6
3
  import remove from './remove';
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import remove from './remove';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import safeHTML from './safe-html';
5
2
 
6
3
  /**
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import safeHTML from '../safe-html';
5
2
 
6
3
  describe( 'safeHTML', () => {
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import stripHTML from '../strip-html';
5
2
 
6
3
  describe( 'stripHTML', () => {
package/src/dom/unwrap.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
package/src/dom/wrap.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  /**
package/src/index.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import * as focusable from './focusable';
5
2
  import * as tabbable from './tabbable';
6
3
 
package/src/tabbable.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { find as findFocusable } from './focusable';
5
2
 
6
3
  /**
@@ -127,7 +124,7 @@ function compareObjectTabbables( a, b ) {
127
124
  }
128
125
 
129
126
  /**
130
- * Givin focusable elements, filters out tabbable element.
127
+ * Given focusable elements, filters out tabbable element.
131
128
  *
132
129
  * @param {HTMLElement[]} focusables Focusable elements to filter.
133
130
  *
package/src/test/dom.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import {
5
2
  isHorizontalEdge,
6
3
  placeCaretAtHorizontalEdge,
@@ -8,7 +5,6 @@ import {
8
5
  removeInvalidHTML,
9
6
  isEmpty,
10
7
  } from '../dom';
11
-
12
8
  import { getPhrasingContentSchema } from '../phrasing-content';
13
9
 
14
10
  describe( 'DOM', () => {
@@ -286,6 +282,24 @@ describe( 'removeInvalidHTML', () => {
286
282
  const output = '<p>test</p>';
287
283
  expect( removeInvalidHTML( input, schema ) ).toEqual( output );
288
284
  } );
285
+
286
+ it( 'should preserve whitespace from inline elements containing only whitespace', () => {
287
+ const input = 'The following space:<em> </em>should not be removed.';
288
+ const output = 'The following space: should not be removed.';
289
+ expect( removeInvalidHTML( input, schema ) ).toBe( output );
290
+ } );
291
+
292
+ it( 'should still remove truly empty inline elements', () => {
293
+ const input = 'no space:<em></em>here';
294
+ const output = 'no space:here';
295
+ expect( removeInvalidHTML( input, schema ) ).toBe( output );
296
+ } );
297
+
298
+ it( 'should still remove empty block-level elements that should have children', () => {
299
+ const input = '<figure> </figure>';
300
+ const output = '';
301
+ expect( removeInvalidHTML( input, schema ) ).toBe( output );
302
+ } );
289
303
  } );
290
304
 
291
305
  describe( 'isEmpty', () => {
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import createElement from './utils/create-element';
5
2
  import { find } from '../focusable';
6
3
 
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import createElement from './utils/create-element';
5
2
  import { find } from '../tabbable';
6
3
 
package/src/test/utils.js CHANGED
@@ -1,6 +1,3 @@
1
- /**
2
- * Internal dependencies
3
- */
4
1
  import { assertIsDefined } from '../utils/assert-is-defined';
5
2
 
6
3
  describe( 'assertIsDefined', () => {