@wordpress/block-editor 15.13.2-next.v.202602241322.0 → 15.13.2

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 (175) hide show
  1. package/build/components/block-bindings/attribute-control.cjs +5 -2
  2. package/build/components/block-bindings/attribute-control.cjs.map +2 -2
  3. package/build/components/block-inspector/edit-contents.cjs +5 -4
  4. package/build/components/block-inspector/edit-contents.cjs.map +2 -2
  5. package/build/components/block-list/block-html.cjs +6 -2
  6. package/build/components/block-list/block-html.cjs.map +2 -2
  7. package/build/components/block-list/block.cjs +9 -1
  8. package/build/components/block-list/block.cjs.map +2 -2
  9. package/build/components/block-list/use-block-props/index.cjs +10 -1
  10. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  11. package/build/components/block-settings-menu-controls/index.cjs +1 -0
  12. package/build/components/block-settings-menu-controls/index.cjs.map +2 -2
  13. package/build/components/block-styles/index.cjs +7 -1
  14. package/build/components/block-styles/index.cjs.map +3 -3
  15. package/build/components/block-switcher/block-transformations-menu.cjs +2 -0
  16. package/build/components/block-switcher/block-transformations-menu.cjs.map +2 -2
  17. package/build/components/block-switcher/block-variation-transformations.cjs +2 -0
  18. package/build/components/block-switcher/block-variation-transformations.cjs.map +2 -2
  19. package/build/components/block-toolbar/block-toolbar-icon.cjs +1 -1
  20. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  21. package/build/components/block-toolbar/index.cjs +8 -4
  22. package/build/components/block-toolbar/index.cjs.map +2 -2
  23. package/build/components/block-tools/index.cjs +4 -3
  24. package/build/components/block-tools/index.cjs.map +2 -2
  25. package/build/components/block-variation-transforms/index.cjs +11 -5
  26. package/build/components/block-variation-transforms/index.cjs.map +2 -2
  27. package/build/components/block-visibility/modal.cjs +2 -2
  28. package/build/components/block-visibility/modal.cjs.map +1 -1
  29. package/build/components/block-visibility/use-block-visibility.cjs +4 -3
  30. package/build/components/block-visibility/use-block-visibility.cjs.map +2 -2
  31. package/build/components/block-visibility/viewport-visibility-info.cjs +6 -1
  32. package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
  33. package/build/components/dimensions-tool/scale-tool.cjs +2 -2
  34. package/build/components/dimensions-tool/scale-tool.cjs.map +2 -2
  35. package/build/components/iframe/index.cjs +1 -3
  36. package/build/components/iframe/index.cjs.map +2 -2
  37. package/build/components/iframe/use-scale-canvas.cjs +0 -1
  38. package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
  39. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +8 -4
  40. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  41. package/build/components/link-picker/link-preview.cjs +2 -1
  42. package/build/components/link-picker/link-preview.cjs.map +3 -3
  43. package/build/components/provider/index.cjs +23 -7
  44. package/build/components/provider/index.cjs.map +2 -2
  45. package/build/components/provider/use-media-upload-settings.cjs +1 -0
  46. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  47. package/build/components/writing-flow/use-arrow-nav.cjs +1 -1
  48. package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
  49. package/build/hooks/auto-inspector-controls.cjs +26 -2
  50. package/build/hooks/auto-inspector-controls.cjs.map +3 -3
  51. package/build/hooks/cross-origin-isolation.cjs +9 -75
  52. package/build/hooks/cross-origin-isolation.cjs.map +2 -2
  53. package/build/hooks/custom-css.cjs +26 -0
  54. package/build/hooks/custom-css.cjs.map +3 -3
  55. package/build/private-apis.cjs +1 -0
  56. package/build/private-apis.cjs.map +2 -2
  57. package/build/store/actions.cjs +0 -8
  58. package/build/store/actions.cjs.map +2 -2
  59. package/build/store/private-keys.cjs +3 -0
  60. package/build/store/private-keys.cjs.map +2 -2
  61. package/build/store/private-selectors.cjs +4 -3
  62. package/build/store/private-selectors.cjs.map +2 -2
  63. package/build/store/reducer.cjs +78 -74
  64. package/build/store/reducer.cjs.map +2 -2
  65. package/build/store/selectors.cjs +16 -14
  66. package/build/store/selectors.cjs.map +2 -2
  67. package/build-module/components/block-bindings/attribute-control.mjs +5 -2
  68. package/build-module/components/block-bindings/attribute-control.mjs.map +2 -2
  69. package/build-module/components/block-inspector/edit-contents.mjs +5 -4
  70. package/build-module/components/block-inspector/edit-contents.mjs.map +2 -2
  71. package/build-module/components/block-list/block-html.mjs +7 -3
  72. package/build-module/components/block-list/block-html.mjs.map +2 -2
  73. package/build-module/components/block-list/block.mjs +10 -2
  74. package/build-module/components/block-list/block.mjs.map +2 -2
  75. package/build-module/components/block-list/use-block-props/index.mjs +11 -2
  76. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  77. package/build-module/components/block-settings-menu-controls/index.mjs +1 -0
  78. package/build-module/components/block-settings-menu-controls/index.mjs.map +2 -2
  79. package/build-module/components/block-styles/index.mjs +7 -1
  80. package/build-module/components/block-styles/index.mjs.map +2 -2
  81. package/build-module/components/block-switcher/block-transformations-menu.mjs +2 -0
  82. package/build-module/components/block-switcher/block-transformations-menu.mjs.map +2 -2
  83. package/build-module/components/block-switcher/block-variation-transformations.mjs +2 -0
  84. package/build-module/components/block-switcher/block-variation-transformations.mjs.map +2 -2
  85. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +1 -1
  86. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  87. package/build-module/components/block-toolbar/index.mjs +8 -4
  88. package/build-module/components/block-toolbar/index.mjs.map +2 -2
  89. package/build-module/components/block-tools/index.mjs +4 -3
  90. package/build-module/components/block-tools/index.mjs.map +2 -2
  91. package/build-module/components/block-variation-transforms/index.mjs +11 -5
  92. package/build-module/components/block-variation-transforms/index.mjs.map +2 -2
  93. package/build-module/components/block-visibility/modal.mjs +2 -2
  94. package/build-module/components/block-visibility/modal.mjs.map +1 -1
  95. package/build-module/components/block-visibility/use-block-visibility.mjs +4 -3
  96. package/build-module/components/block-visibility/use-block-visibility.mjs.map +2 -2
  97. package/build-module/components/block-visibility/viewport-visibility-info.mjs +6 -1
  98. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  99. package/build-module/components/dimensions-tool/scale-tool.mjs +2 -2
  100. package/build-module/components/dimensions-tool/scale-tool.mjs.map +2 -2
  101. package/build-module/components/iframe/index.mjs +2 -9
  102. package/build-module/components/iframe/index.mjs.map +2 -2
  103. package/build-module/components/iframe/use-scale-canvas.mjs +0 -1
  104. package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
  105. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +8 -4
  106. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  107. package/build-module/components/link-picker/link-preview.mjs +2 -1
  108. package/build-module/components/link-picker/link-preview.mjs.map +2 -2
  109. package/build-module/components/provider/index.mjs +23 -7
  110. package/build-module/components/provider/index.mjs.map +2 -2
  111. package/build-module/components/provider/use-media-upload-settings.mjs +1 -0
  112. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  113. package/build-module/components/writing-flow/use-arrow-nav.mjs +1 -1
  114. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
  115. package/build-module/hooks/auto-inspector-controls.mjs +28 -4
  116. package/build-module/hooks/auto-inspector-controls.mjs.map +2 -2
  117. package/build-module/hooks/cross-origin-isolation.mjs +9 -75
  118. package/build-module/hooks/cross-origin-isolation.mjs.map +2 -2
  119. package/build-module/hooks/custom-css.mjs +28 -2
  120. package/build-module/hooks/custom-css.mjs.map +2 -2
  121. package/build-module/private-apis.mjs +3 -1
  122. package/build-module/private-apis.mjs.map +2 -2
  123. package/build-module/store/actions.mjs +0 -8
  124. package/build-module/store/actions.mjs.map +2 -2
  125. package/build-module/store/private-keys.mjs +2 -0
  126. package/build-module/store/private-keys.mjs.map +2 -2
  127. package/build-module/store/private-selectors.mjs +4 -3
  128. package/build-module/store/private-selectors.mjs.map +2 -2
  129. package/build-module/store/reducer.mjs +78 -73
  130. package/build-module/store/reducer.mjs.map +2 -2
  131. package/build-module/store/selectors.mjs +16 -14
  132. package/build-module/store/selectors.mjs.map +2 -2
  133. package/build-style/content-rtl.css +25 -0
  134. package/build-style/content.css +25 -0
  135. package/build-style/style-rtl.css +3 -0
  136. package/build-style/style.css +3 -0
  137. package/package.json +39 -39
  138. package/src/components/block-bindings/attribute-control.js +8 -3
  139. package/src/components/block-inspector/edit-contents.js +5 -3
  140. package/src/components/block-list/block-html.js +13 -3
  141. package/src/components/block-list/block.js +10 -1
  142. package/src/components/block-list/content.scss +35 -0
  143. package/src/components/block-list/use-block-props/index.js +11 -1
  144. package/src/components/block-settings-menu-controls/index.js +1 -0
  145. package/src/components/block-styles/index.js +7 -1
  146. package/src/components/block-switcher/block-transformations-menu.js +2 -0
  147. package/src/components/block-switcher/block-variation-transformations.js +2 -0
  148. package/src/components/block-toolbar/block-toolbar-icon.js +6 -1
  149. package/src/components/block-toolbar/index.js +7 -2
  150. package/src/components/block-tools/index.js +11 -4
  151. package/src/components/block-tools/style.scss +5 -0
  152. package/src/components/block-variation-transforms/index.js +41 -36
  153. package/src/components/block-visibility/use-block-visibility.js +4 -2
  154. package/src/components/block-visibility/viewport-visibility-info.js +8 -1
  155. package/src/components/dimensions-tool/scale-tool.js +2 -2
  156. package/src/components/iframe/index.js +2 -12
  157. package/src/components/iframe/use-scale-canvas.js +0 -1
  158. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +9 -5
  159. package/src/components/link-picker/link-preview.js +2 -1
  160. package/src/components/provider/index.js +49 -6
  161. package/src/components/provider/use-media-upload-settings.js +1 -0
  162. package/src/components/writing-flow/use-arrow-nav.js +9 -2
  163. package/src/hooks/auto-inspector-controls.js +31 -4
  164. package/src/hooks/cross-origin-isolation.js +10 -109
  165. package/src/hooks/custom-css.js +36 -2
  166. package/src/hooks/test/cross-origin-isolation.js +15 -42
  167. package/src/private-apis.js +2 -0
  168. package/src/store/actions.js +0 -8
  169. package/src/store/private-keys.js +1 -0
  170. package/src/store/private-selectors.js +6 -3
  171. package/src/store/reducer.js +119 -97
  172. package/src/store/selectors.js +59 -22
  173. package/src/store/test/private-selectors.js +67 -34
  174. package/src/store/test/reducer.js +545 -57
  175. package/src/store/test/selectors.js +611 -53
@@ -5,6 +5,8 @@ import {
5
5
  registerBlockType,
6
6
  unregisterBlockType,
7
7
  setFreeformContentHandlerName,
8
+ setDefaultBlockName,
9
+ getDefaultBlockName,
8
10
  } from '@wordpress/blocks';
9
11
  import { RawHTML } from '@wordpress/element';
10
12
  import { symbol } from '@wordpress/icons';
@@ -16,6 +18,7 @@ import { select, dispatch } from '@wordpress/data';
16
18
  import * as selectors from '../selectors';
17
19
  import { store } from '../';
18
20
  import { lock } from '../../lock-unlock';
21
+ import { sectionRootClientIdKey } from '../private-keys';
19
22
 
20
23
  const {
21
24
  getBlockName,
@@ -72,6 +75,8 @@ const {
72
75
  wasBlockJustInserted,
73
76
  getBlocksByName,
74
77
  getBlockEditingMode,
78
+ canRemoveBlock,
79
+ canMoveBlock,
75
80
  } = selectors;
76
81
 
77
82
  describe( 'selectors', () => {
@@ -187,6 +192,20 @@ describe( 'selectors', () => {
187
192
  ancestor: [ 'core/test-block-ancestor' ],
188
193
  } );
189
194
 
195
+ registerBlockType( 'core/test-content-block', {
196
+ apiVersion: 3,
197
+ save: ( props ) => props.attributes.text,
198
+ category: 'text',
199
+ title: 'Test Content Block',
200
+ icon: 'test',
201
+ attributes: {
202
+ text: {
203
+ type: 'string',
204
+ role: 'content',
205
+ },
206
+ },
207
+ } );
208
+
190
209
  setFreeformContentHandlerName( 'core/freeform' );
191
210
 
192
211
  cachedSelectors.forEach( ( { clear } ) => clear() );
@@ -203,6 +222,7 @@ describe( 'selectors', () => {
203
222
  unregisterBlockType( 'core/test-block-parent' );
204
223
  unregisterBlockType( 'core/test-block-requires-ancestor' );
205
224
  unregisterBlockType( 'core/test-block-requires-ancestor-parent' );
225
+ unregisterBlockType( 'core/test-content-block' );
206
226
 
207
227
  setFreeformContentHandlerName( undefined );
208
228
  } );
@@ -2678,10 +2698,10 @@ describe( 'selectors', () => {
2678
2698
  attributes: new Map(),
2679
2699
  order: new Map(),
2680
2700
  parents: new Map(),
2701
+ blockEditingModes: new Map(),
2681
2702
  },
2682
2703
  blockListSettings: {},
2683
2704
  settings: {},
2684
- blockEditingModes: new Map(),
2685
2705
  };
2686
2706
  expect( canInsertBlockType( state, 'core/invalid' ) ).toBe( false );
2687
2707
  } );
@@ -2693,12 +2713,12 @@ describe( 'selectors', () => {
2693
2713
  attributes: new Map(),
2694
2714
  order: new Map(),
2695
2715
  parents: new Map(),
2716
+ blockEditingModes: new Map(),
2696
2717
  },
2697
2718
  blockListSettings: {},
2698
2719
  settings: {
2699
2720
  allowedBlockTypes: [],
2700
2721
  },
2701
- blockEditingModes: new Map(),
2702
2722
  };
2703
2723
  expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe(
2704
2724
  false
@@ -2712,12 +2732,12 @@ describe( 'selectors', () => {
2712
2732
  attributes: new Map(),
2713
2733
  parents: new Map(),
2714
2734
  order: new Map(),
2735
+ blockEditingModes: new Map(),
2715
2736
  },
2716
2737
  blockListSettings: {},
2717
2738
  settings: {
2718
2739
  allowedBlockTypes: [ 'core/test-block-a' ],
2719
2740
  },
2720
- blockEditingModes: new Map(),
2721
2741
  };
2722
2742
  expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe(
2723
2743
  true
@@ -2731,12 +2751,12 @@ describe( 'selectors', () => {
2731
2751
  attributes: new Map(),
2732
2752
  order: new Map(),
2733
2753
  parents: new Map(),
2754
+ blockEditingModes: new Map(),
2734
2755
  },
2735
2756
  blockListSettings: {},
2736
2757
  settings: {
2737
2758
  templateLock: 'all',
2738
2759
  },
2739
- blockEditingModes: new Map(),
2740
2760
  };
2741
2761
  expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe(
2742
2762
  false
@@ -2750,14 +2770,14 @@ describe( 'selectors', () => {
2750
2770
  attributes: new Map(),
2751
2771
  parents: new Map(),
2752
2772
  order: new Map(),
2773
+ blockEditingModes: new Map(
2774
+ Object.entries( {
2775
+ '': 'disabled',
2776
+ } )
2777
+ ),
2753
2778
  },
2754
2779
  blockListSettings: {},
2755
2780
  settings: {},
2756
- blockEditingModes: new Map(
2757
- Object.entries( {
2758
- '': 'disabled',
2759
- } )
2760
- ),
2761
2781
  };
2762
2782
  expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe(
2763
2783
  false
@@ -2771,10 +2791,10 @@ describe( 'selectors', () => {
2771
2791
  attributes: new Map(),
2772
2792
  parents: new Map(),
2773
2793
  order: new Map(),
2794
+ blockEditingModes: new Map(),
2774
2795
  },
2775
2796
  blockListSettings: {},
2776
2797
  settings: {},
2777
- blockEditingModes: new Map(),
2778
2798
  };
2779
2799
  expect( canInsertBlockType( state, 'core/test-block-c' ) ).toBe(
2780
2800
  false
@@ -2796,10 +2816,10 @@ describe( 'selectors', () => {
2796
2816
  ),
2797
2817
  parents: new Map(),
2798
2818
  order: new Map(),
2819
+ blockEditingModes: new Map(),
2799
2820
  },
2800
2821
  blockListSettings: {},
2801
2822
  settings: {},
2802
- blockEditingModes: new Map(),
2803
2823
  };
2804
2824
  expect(
2805
2825
  canInsertBlockType( state, 'core/test-block-c', 'block1' )
@@ -2821,12 +2841,12 @@ describe( 'selectors', () => {
2821
2841
  ),
2822
2842
  parents: new Map(),
2823
2843
  order: new Map(),
2844
+ blockEditingModes: new Map(),
2824
2845
  },
2825
2846
  blockListSettings: {
2826
2847
  block1: {},
2827
2848
  },
2828
2849
  settings: {},
2829
- blockEditingModes: new Map(),
2830
2850
  };
2831
2851
  expect(
2832
2852
  canInsertBlockType( state, 'core/test-block-c', 'block1' )
@@ -2848,12 +2868,12 @@ describe( 'selectors', () => {
2848
2868
  ),
2849
2869
  parents: new Map(),
2850
2870
  order: new Map(),
2871
+ blockEditingModes: new Map(),
2851
2872
  },
2852
2873
  blockListSettings: {
2853
2874
  block1: {},
2854
2875
  },
2855
2876
  settings: {},
2856
- blockEditingModes: new Map(),
2857
2877
  };
2858
2878
  expect(
2859
2879
  canInsertBlockType( state, 'core/test-block-c', 'block1' )
@@ -2875,6 +2895,7 @@ describe( 'selectors', () => {
2875
2895
  ),
2876
2896
  parents: new Map(),
2877
2897
  order: new Map(),
2898
+ blockEditingModes: new Map(),
2878
2899
  },
2879
2900
  blockListSettings: {
2880
2901
  block1: {
@@ -2882,7 +2903,6 @@ describe( 'selectors', () => {
2882
2903
  },
2883
2904
  },
2884
2905
  settings: {},
2885
- blockEditingModes: new Map(),
2886
2906
  };
2887
2907
  expect(
2888
2908
  canInsertBlockType( state, 'core/test-block-b', 'block1' )
@@ -2904,6 +2924,7 @@ describe( 'selectors', () => {
2904
2924
  ),
2905
2925
  parents: new Map(),
2906
2926
  order: new Map(),
2927
+ blockEditingModes: new Map(),
2907
2928
  },
2908
2929
  blockListSettings: {
2909
2930
  block1: {
@@ -2911,7 +2932,6 @@ describe( 'selectors', () => {
2911
2932
  },
2912
2933
  },
2913
2934
  settings: {},
2914
- blockEditingModes: new Map(),
2915
2935
  };
2916
2936
  expect(
2917
2937
  canInsertBlockType( state, 'core/test-block-b', 'block1' )
@@ -2933,14 +2953,14 @@ describe( 'selectors', () => {
2933
2953
  ),
2934
2954
  parents: new Map(),
2935
2955
  order: new Map(),
2956
+ blockEditingModes: new Map(
2957
+ Object.entries( {
2958
+ block1: 'disabled',
2959
+ } )
2960
+ ),
2936
2961
  },
2937
2962
  blockListSettings: {},
2938
2963
  settings: {},
2939
- blockEditingModes: new Map(
2940
- Object.entries( {
2941
- block1: 'disabled',
2942
- } )
2943
- ),
2944
2964
  };
2945
2965
  expect(
2946
2966
  canInsertBlockType( state, 'core/test-block-b', 'block1' )
@@ -2962,6 +2982,7 @@ describe( 'selectors', () => {
2962
2982
  ),
2963
2983
  parents: new Map(),
2964
2984
  order: new Map(),
2985
+ blockEditingModes: new Map(),
2965
2986
  },
2966
2987
  blockListSettings: {
2967
2988
  block1: {
@@ -2969,7 +2990,6 @@ describe( 'selectors', () => {
2969
2990
  },
2970
2991
  },
2971
2992
  settings: {},
2972
- blockEditingModes: new Map(),
2973
2993
  };
2974
2994
  expect(
2975
2995
  canInsertBlockType( state, 'core/test-block-c', 'block1' )
@@ -2991,10 +3011,10 @@ describe( 'selectors', () => {
2991
3011
  ),
2992
3012
  parents: new Map(),
2993
3013
  order: new Map(),
3014
+ blockEditingModes: new Map(),
2994
3015
  },
2995
3016
  blockListSettings: {},
2996
3017
  settings: {},
2997
- blockEditingModes: new Map(),
2998
3018
  };
2999
3019
  expect(
3000
3020
  canInsertBlockType( state, 'core/post-content-child', 'block1' )
@@ -3008,10 +3028,10 @@ describe( 'selectors', () => {
3008
3028
  attributes: new Map(),
3009
3029
  parents: new Map(),
3010
3030
  order: new Map(),
3031
+ blockEditingModes: new Map(),
3011
3032
  },
3012
3033
  blockListSettings: {},
3013
3034
  settings: {},
3014
- blockEditingModes: new Map(),
3015
3035
  };
3016
3036
  expect(
3017
3037
  canInsertBlockType( state, 'core/post-content-child' )
@@ -3042,13 +3062,13 @@ describe( 'selectors', () => {
3042
3062
  [ '', [ 'block1' ] ],
3043
3063
  [ 'block1', [ 'block2' ] ],
3044
3064
  ] ),
3065
+ blockEditingModes: new Map(),
3045
3066
  },
3046
3067
  blockListSettings: {
3047
3068
  block1: {},
3048
3069
  block2: {},
3049
3070
  },
3050
3071
  settings: {},
3051
- blockEditingModes: new Map(),
3052
3072
  };
3053
3073
  expect(
3054
3074
  canInsertBlockType(
@@ -3078,18 +3098,175 @@ describe( 'selectors', () => {
3078
3098
  } )
3079
3099
  ),
3080
3100
  order: new Map( [ [ '', [ 'block1' ] ] ] ),
3101
+ blockEditingModes: new Map(),
3081
3102
  },
3082
3103
  blockListSettings: {
3083
3104
  block1: {},
3084
3105
  },
3085
3106
  settings: {},
3086
- blockEditingModes: new Map(),
3087
3107
  };
3088
3108
  expect(
3089
3109
  canInsertBlockType( state, 'core/test-block-a', 'block1' )
3090
3110
  ).toBe( false );
3091
3111
  } );
3092
3112
 
3113
+ it( 'allows inserting blocks into a non-section contentOnly container', () => {
3114
+ // When the parent has contentOnly editing mode but is NOT
3115
+ // within a section hierarchy, the contentOnly insertion
3116
+ // restriction does not apply.
3117
+ const state = {
3118
+ blocks: {
3119
+ byClientId: new Map(
3120
+ Object.entries( {
3121
+ parent: { name: 'core/test-block-a' },
3122
+ child: { name: 'core/test-block-b' },
3123
+ } )
3124
+ ),
3125
+ attributes: new Map(
3126
+ Object.entries( {
3127
+ parent: {},
3128
+ child: {},
3129
+ } )
3130
+ ),
3131
+ parents: new Map(
3132
+ Object.entries( {
3133
+ parent: '',
3134
+ child: 'parent',
3135
+ } )
3136
+ ),
3137
+ order: new Map( [
3138
+ [ '', [ 'parent' ] ],
3139
+ [ 'parent', [ 'child' ] ],
3140
+ ] ),
3141
+ blockEditingModes: new Map(),
3142
+ },
3143
+ blockListSettings: {
3144
+ parent: {},
3145
+ },
3146
+ settings: {},
3147
+ derivedBlockEditingModes: new Map( [
3148
+ [ 'parent', 'contentOnly' ],
3149
+ ] ),
3150
+ };
3151
+ expect(
3152
+ canInsertBlockType( state, 'core/test-block-b', 'parent' )
3153
+ ).toBe( true );
3154
+ } );
3155
+
3156
+ it( 'prevents inserting content blocks into a non-insertable contentOnly container within a section', () => {
3157
+ // When a contentOnly container is inside a section and is not
3158
+ // the section root or a content-to-content match, the
3159
+ // contentOnly insertion restriction blocks it.
3160
+ const state = {
3161
+ blocks: {
3162
+ byClientId: new Map(
3163
+ Object.entries( {
3164
+ section: { name: 'core/test-block-b' },
3165
+ container: {
3166
+ name: 'core/test-block-a',
3167
+ },
3168
+ } )
3169
+ ),
3170
+ attributes: new Map(
3171
+ Object.entries( {
3172
+ section: {
3173
+ // patternName makes this block a section.
3174
+ metadata: { patternName: 'test-pattern' },
3175
+ },
3176
+ container: {},
3177
+ } )
3178
+ ),
3179
+ parents: new Map(
3180
+ Object.entries( {
3181
+ section: '',
3182
+ container: 'section',
3183
+ } )
3184
+ ),
3185
+ order: new Map( [
3186
+ [ '', [ 'section' ] ],
3187
+ [ 'section', [ 'container' ] ],
3188
+ [ 'container', [] ],
3189
+ ] ),
3190
+ blockEditingModes: new Map(),
3191
+ },
3192
+ blockListSettings: {
3193
+ section: {},
3194
+ container: {},
3195
+ },
3196
+ settings: {
3197
+ [ sectionRootClientIdKey ]: '',
3198
+ },
3199
+ derivedBlockEditingModes: new Map( [
3200
+ [ 'container', 'contentOnly' ],
3201
+ ] ),
3202
+ };
3203
+ // A content block into a non-content container that is not the
3204
+ // section root is blocked by the contentOnly gating.
3205
+ expect(
3206
+ canInsertBlockType(
3207
+ state,
3208
+ 'core/test-content-block',
3209
+ 'container'
3210
+ )
3211
+ ).toBe( false );
3212
+ } );
3213
+
3214
+ it( 'allows inserting content blocks into a content container within a section', () => {
3215
+ // When the container is a content block and the block being
3216
+ // inserted is also a content block, insertion is allowed
3217
+ // even within a section (content-to-content match).
3218
+ const state = {
3219
+ blocks: {
3220
+ byClientId: new Map(
3221
+ Object.entries( {
3222
+ section: { name: 'core/test-block-b' },
3223
+ container: {
3224
+ name: 'core/test-content-block',
3225
+ },
3226
+ } )
3227
+ ),
3228
+ attributes: new Map(
3229
+ Object.entries( {
3230
+ section: {
3231
+ // patternName makes this block a section.
3232
+ metadata: { patternName: 'test-pattern' },
3233
+ },
3234
+ container: {},
3235
+ } )
3236
+ ),
3237
+ parents: new Map(
3238
+ Object.entries( {
3239
+ section: '',
3240
+ container: 'section',
3241
+ } )
3242
+ ),
3243
+ order: new Map( [
3244
+ [ '', [ 'section' ] ],
3245
+ [ 'section', [ 'container' ] ],
3246
+ [ 'container', [] ],
3247
+ ] ),
3248
+ blockEditingModes: new Map(),
3249
+ },
3250
+ blockListSettings: {
3251
+ section: {},
3252
+ container: {},
3253
+ },
3254
+ settings: {
3255
+ [ sectionRootClientIdKey ]: '',
3256
+ },
3257
+ derivedBlockEditingModes: new Map( [
3258
+ [ 'container', 'contentOnly' ],
3259
+ ] ),
3260
+ };
3261
+ expect(
3262
+ canInsertBlockType(
3263
+ state,
3264
+ 'core/test-content-block',
3265
+ 'container'
3266
+ )
3267
+ ).toBe( true );
3268
+ } );
3269
+
3093
3270
  it( 'should allow blocks to be inserted if both parent and ancestor restrictions are met', () => {
3094
3271
  const state = {
3095
3272
  blocks: {
@@ -3118,6 +3295,7 @@ describe( 'selectors', () => {
3118
3295
  [ 'block1', [ 'block2' ] ],
3119
3296
  [ 'block2', [ 'block3' ] ],
3120
3297
  ] ),
3298
+ blockEditingModes: new Map(),
3121
3299
  },
3122
3300
  blockListSettings: {
3123
3301
  block1: {},
@@ -3125,7 +3303,6 @@ describe( 'selectors', () => {
3125
3303
  block3: {},
3126
3304
  },
3127
3305
  settings: {},
3128
- blockEditingModes: new Map(),
3129
3306
  };
3130
3307
  expect(
3131
3308
  canInsertBlockType(
@@ -3163,6 +3340,7 @@ describe( 'selectors', () => {
3163
3340
  [ 'block1', [ 'block2' ] ],
3164
3341
  [ 'block2', [ 'block3' ] ],
3165
3342
  ] ),
3343
+ blockEditingModes: new Map(),
3166
3344
  },
3167
3345
  blockListSettings: {
3168
3346
  block1: {},
@@ -3170,7 +3348,6 @@ describe( 'selectors', () => {
3170
3348
  block3: {},
3171
3349
  },
3172
3350
  settings: {},
3173
- blockEditingModes: new Map(),
3174
3351
  };
3175
3352
  expect(
3176
3353
  canInsertBlockType(
@@ -3208,6 +3385,7 @@ describe( 'selectors', () => {
3208
3385
  [ 'block1', [ 'block2' ] ],
3209
3386
  [ 'block2', [ 'block3' ] ],
3210
3387
  ] ),
3388
+ blockEditingModes: new Map(),
3211
3389
  },
3212
3390
  blockListSettings: {
3213
3391
  block1: {},
@@ -3215,7 +3393,6 @@ describe( 'selectors', () => {
3215
3393
  block3: {},
3216
3394
  },
3217
3395
  settings: {},
3218
- blockEditingModes: new Map(),
3219
3396
  };
3220
3397
  expect(
3221
3398
  canInsertBlockType(
@@ -3249,6 +3426,7 @@ describe( 'selectors', () => {
3249
3426
  [ 'block2', 'block1' ],
3250
3427
  [ 'block1', '' ],
3251
3428
  ] ),
3429
+ blockEditingModes: new Map(),
3252
3430
  },
3253
3431
  blockListSettings: {
3254
3432
  block1: {},
@@ -3257,7 +3435,6 @@ describe( 'selectors', () => {
3257
3435
  },
3258
3436
  },
3259
3437
  settings: {},
3260
- blockEditingModes: new Map(),
3261
3438
  };
3262
3439
  expect(
3263
3440
  canInsertBlockType(
@@ -3292,13 +3469,13 @@ describe( 'selectors', () => {
3292
3469
  [ '', [ 'block1' ] ],
3293
3470
  [ 'block1', [ 'block2' ] ],
3294
3471
  ] ),
3472
+ blockEditingModes: new Map(),
3295
3473
  },
3296
3474
  blockListSettings: {
3297
3475
  block1: {},
3298
3476
  block2: {},
3299
3477
  },
3300
3478
  settings: {},
3301
- blockEditingModes: new Map(),
3302
3479
  };
3303
3480
  expect(
3304
3481
  canInsertBlockType(
@@ -3330,6 +3507,7 @@ describe( 'selectors', () => {
3330
3507
  ),
3331
3508
  parents: new Map(),
3332
3509
  order: new Map(),
3510
+ blockEditingModes: new Map(),
3333
3511
  },
3334
3512
  blockListSettings: {
3335
3513
  1: {
@@ -3340,7 +3518,6 @@ describe( 'selectors', () => {
3340
3518
  },
3341
3519
  },
3342
3520
  settings: {},
3343
- blockEditingModes: new Map(),
3344
3521
  };
3345
3522
  expect( canInsertBlocks( state, [ '2' ], '1' ) ).toBe( true );
3346
3523
  } );
@@ -3364,6 +3541,7 @@ describe( 'selectors', () => {
3364
3541
  ),
3365
3542
  parents: new Map(),
3366
3543
  order: new Map(),
3544
+ blockEditingModes: new Map(),
3367
3545
  },
3368
3546
  blockListSettings: {
3369
3547
  1: {
@@ -3371,7 +3549,6 @@ describe( 'selectors', () => {
3371
3549
  },
3372
3550
  },
3373
3551
  settings: {},
3374
- blockEditingModes: new Map(),
3375
3552
  };
3376
3553
  expect( canInsertBlocks( state, [ '2', '3' ], '1' ) ).toBe( false );
3377
3554
  } );
@@ -3499,6 +3676,7 @@ describe( 'selectors', () => {
3499
3676
  'core/freeform',
3500
3677
  'core/test-block-ancestor',
3501
3678
  'core/test-block-parent',
3679
+ 'core/test-content-block',
3502
3680
  'core/block/1',
3503
3681
  'core/block/2',
3504
3682
  ] );
@@ -3518,6 +3696,7 @@ describe( 'selectors', () => {
3518
3696
  'core/freeform',
3519
3697
  'core/test-block-ancestor',
3520
3698
  'core/test-block-parent',
3699
+ 'core/test-content-block',
3521
3700
  'core/block/1',
3522
3701
  'core/block/2',
3523
3702
  ] );
@@ -3641,11 +3820,11 @@ describe( 'selectors', () => {
3641
3820
  order: new Map(),
3642
3821
  parents: new Map(),
3643
3822
  cache: {},
3823
+ blockEditingModes: new Map(),
3644
3824
  },
3645
3825
  settings: {},
3646
3826
  preferences: {},
3647
3827
  blockListSettings: {},
3648
- blockEditingModes: new Map(),
3649
3828
  };
3650
3829
  const blocks = [ { name: 'core/with-tranforms-a' } ];
3651
3830
  const items = getBlockTransformItems( state, blocks );
@@ -3682,11 +3861,11 @@ describe( 'selectors', () => {
3682
3861
  order: new Map(),
3683
3862
  parents: new Map(),
3684
3863
  cache: {},
3864
+ blockEditingModes: new Map(),
3685
3865
  },
3686
3866
  settings: {},
3687
3867
  preferences: {},
3688
3868
  blockListSettings: {},
3689
- blockEditingModes: new Map(),
3690
3869
  };
3691
3870
  const block = { name: 'core/with-tranforms-a' };
3692
3871
  const items = getBlockTransformItems( state, block );
@@ -3716,6 +3895,7 @@ describe( 'selectors', () => {
3716
3895
  ),
3717
3896
  cache: {},
3718
3897
  controlledInnerBlocks: {},
3898
+ blockEditingModes: new Map(),
3719
3899
  },
3720
3900
  settings: {},
3721
3901
  preferences: {},
@@ -3725,7 +3905,6 @@ describe( 'selectors', () => {
3725
3905
  },
3726
3906
  block2: {},
3727
3907
  },
3728
- blockEditingModes: new Map(),
3729
3908
  };
3730
3909
  const blocks = [
3731
3910
  { clientId: 'block2', name: 'core/with-tranforms-a' },
@@ -3767,13 +3946,13 @@ describe( 'selectors', () => {
3767
3946
  ),
3768
3947
  controlledInnerBlocks: {},
3769
3948
  parents: new Map(),
3949
+ blockEditingModes: new Map(),
3770
3950
  },
3771
3951
  preferences: {
3772
3952
  insertUsage: {},
3773
3953
  },
3774
3954
  blockListSettings: {},
3775
3955
  settings: {},
3776
- blockEditingModes: new Map(),
3777
3956
  };
3778
3957
  const blocks = [ { name: 'core/with-tranforms-a' } ];
3779
3958
  const items = getBlockTransformItems( state, blocks );
@@ -3799,6 +3978,7 @@ describe( 'selectors', () => {
3799
3978
  order: new Map(),
3800
3979
  parents: new Map(),
3801
3980
  cache: {},
3981
+ blockEditingModes: new Map(),
3802
3982
  },
3803
3983
  preferences: {
3804
3984
  insertUsage: {
@@ -3807,7 +3987,6 @@ describe( 'selectors', () => {
3807
3987
  },
3808
3988
  blockListSettings: {},
3809
3989
  settings: {},
3810
- blockEditingModes: new Map(),
3811
3990
  };
3812
3991
  const blocks = [ { name: 'core/with-tranforms-c' } ];
3813
3992
  const items = getBlockTransformItems( state, blocks );
@@ -4267,6 +4446,367 @@ describe( 'selectors', () => {
4267
4446
  ).toBe( false );
4268
4447
  } );
4269
4448
  } );
4449
+
4450
+ describe( 'canRemoveBlock', () => {
4451
+ it( 'allows removal from a non-section contentOnly container', () => {
4452
+ // When the parent has contentOnly editing mode but is NOT
4453
+ // within a section, the contentOnly removal restriction
4454
+ // does not apply.
4455
+ const state = {
4456
+ blocks: {
4457
+ byClientId: new Map(
4458
+ Object.entries( {
4459
+ parent: { name: 'core/test-block-a' },
4460
+ child: { name: 'core/test-block-b' },
4461
+ } )
4462
+ ),
4463
+ attributes: new Map(
4464
+ Object.entries( {
4465
+ parent: {},
4466
+ child: {},
4467
+ } )
4468
+ ),
4469
+ parents: new Map(
4470
+ Object.entries( {
4471
+ parent: '',
4472
+ child: 'parent',
4473
+ } )
4474
+ ),
4475
+ order: new Map( [
4476
+ [ '', [ 'parent' ] ],
4477
+ [ 'parent', [ 'child' ] ],
4478
+ ] ),
4479
+ blockEditingModes: new Map(),
4480
+ },
4481
+ blockListSettings: {
4482
+ parent: {},
4483
+ },
4484
+ settings: {},
4485
+ derivedBlockEditingModes: new Map( [
4486
+ [ 'parent', 'contentOnly' ],
4487
+ ] ),
4488
+ };
4489
+ expect( canRemoveBlock( state, 'child' ) ).toBe( true );
4490
+ } );
4491
+
4492
+ it( 'prevents removal from a contentOnly container within a section', () => {
4493
+ // When the parent is within a section and has contentOnly
4494
+ // editing mode, blocks in a non-insertable container
4495
+ // cannot be removed.
4496
+ const state = {
4497
+ blocks: {
4498
+ byClientId: new Map(
4499
+ Object.entries( {
4500
+ section: { name: 'core/test-block-b' },
4501
+ container: {
4502
+ name: 'core/test-block-a',
4503
+ },
4504
+ child: { name: 'core/test-content-block' },
4505
+ } )
4506
+ ),
4507
+ attributes: new Map(
4508
+ Object.entries( {
4509
+ section: {
4510
+ // patternName makes this block a section.
4511
+ metadata: { patternName: 'test-pattern' },
4512
+ },
4513
+ container: {},
4514
+ child: {},
4515
+ } )
4516
+ ),
4517
+ parents: new Map(
4518
+ Object.entries( {
4519
+ section: '',
4520
+ container: 'section',
4521
+ child: 'container',
4522
+ } )
4523
+ ),
4524
+ order: new Map( [
4525
+ [ '', [ 'section' ] ],
4526
+ [ 'section', [ 'container' ] ],
4527
+ [ 'container', [ 'child' ] ],
4528
+ ] ),
4529
+ blockEditingModes: new Map(),
4530
+ },
4531
+ blockListSettings: {
4532
+ section: {},
4533
+ container: {},
4534
+ },
4535
+ settings: {
4536
+ [ sectionRootClientIdKey ]: '',
4537
+ },
4538
+ derivedBlockEditingModes: new Map( [
4539
+ [ 'container', 'contentOnly' ],
4540
+ ] ),
4541
+ };
4542
+ expect( canRemoveBlock( state, 'child' ) ).toBe( false );
4543
+ } );
4544
+
4545
+ it( 'allows removal of a content block from a content container within a section', () => {
4546
+ // When both the container and the child are content blocks,
4547
+ // the contentOnly gating allows removal
4548
+ // (content-to-content match).
4549
+ const state = {
4550
+ blocks: {
4551
+ byClientId: new Map(
4552
+ Object.entries( {
4553
+ section: { name: 'core/test-block-b' },
4554
+ container: {
4555
+ name: 'core/test-content-block',
4556
+ },
4557
+ child: { name: 'core/test-content-block' },
4558
+ } )
4559
+ ),
4560
+ attributes: new Map(
4561
+ Object.entries( {
4562
+ section: {
4563
+ // patternName makes this block a section.
4564
+ metadata: { patternName: 'test-pattern' },
4565
+ },
4566
+ container: {},
4567
+ child: {},
4568
+ } )
4569
+ ),
4570
+ parents: new Map(
4571
+ Object.entries( {
4572
+ section: '',
4573
+ container: 'section',
4574
+ child: 'container',
4575
+ } )
4576
+ ),
4577
+ order: new Map( [
4578
+ [ '', [ 'section' ] ],
4579
+ [ 'section', [ 'container' ] ],
4580
+ [ 'container', [ 'child' ] ],
4581
+ ] ),
4582
+ blockEditingModes: new Map(),
4583
+ },
4584
+ blockListSettings: {
4585
+ section: {},
4586
+ container: {},
4587
+ },
4588
+ settings: {
4589
+ [ sectionRootClientIdKey ]: '',
4590
+ },
4591
+ derivedBlockEditingModes: new Map( [
4592
+ [ 'container', 'contentOnly' ],
4593
+ ] ),
4594
+ };
4595
+ expect( canRemoveBlock( state, 'child' ) ).toBe( true );
4596
+ } );
4597
+
4598
+ it( 'allows removing one of multiple default blocks in a contentOnly section container', () => {
4599
+ // When in contentOnly mode within a section, default blocks
4600
+ // can be removed as long as at least one other default block
4601
+ // remains.
4602
+ const previousDefaultBlockName = getDefaultBlockName();
4603
+ setDefaultBlockName( 'core/test-content-block' );
4604
+ const state = {
4605
+ blocks: {
4606
+ byClientId: new Map(
4607
+ Object.entries( {
4608
+ section: { name: 'core/test-block-b' },
4609
+ container: {
4610
+ name: 'core/test-block-a',
4611
+ },
4612
+ child1: {
4613
+ name: 'core/test-content-block',
4614
+ },
4615
+ child2: {
4616
+ name: 'core/test-content-block',
4617
+ },
4618
+ } )
4619
+ ),
4620
+ attributes: new Map(
4621
+ Object.entries( {
4622
+ section: {
4623
+ // patternName makes this block a section.
4624
+ metadata: { patternName: 'test-pattern' },
4625
+ },
4626
+ container: {},
4627
+ child1: {},
4628
+ child2: {},
4629
+ } )
4630
+ ),
4631
+ parents: new Map(
4632
+ Object.entries( {
4633
+ section: '',
4634
+ container: 'section',
4635
+ child1: 'container',
4636
+ child2: 'container',
4637
+ } )
4638
+ ),
4639
+ order: new Map( [
4640
+ [ '', [ 'section' ] ],
4641
+ [ 'section', [ 'container' ] ],
4642
+ [ 'container', [ 'child1', 'child2' ] ],
4643
+ ] ),
4644
+ blockEditingModes: new Map(),
4645
+ },
4646
+ blockListSettings: {
4647
+ section: {},
4648
+ container: {},
4649
+ },
4650
+ settings: {
4651
+ [ sectionRootClientIdKey ]: '',
4652
+ },
4653
+ derivedBlockEditingModes: new Map( [
4654
+ [ 'container', 'contentOnly' ],
4655
+ ] ),
4656
+ };
4657
+ expect( canRemoveBlock( state, 'child1' ) ).toBe( true );
4658
+ setDefaultBlockName( previousDefaultBlockName );
4659
+ } );
4660
+ } );
4661
+
4662
+ describe( 'canMoveBlock', () => {
4663
+ it( 'allows moving within a non-section contentOnly container', () => {
4664
+ // When the parent has contentOnly editing mode but is NOT
4665
+ // within a section, the contentOnly move restriction does
4666
+ // not apply.
4667
+ const state = {
4668
+ blocks: {
4669
+ byClientId: new Map(
4670
+ Object.entries( {
4671
+ parent: { name: 'core/test-block-a' },
4672
+ child: { name: 'core/test-block-b' },
4673
+ } )
4674
+ ),
4675
+ attributes: new Map(
4676
+ Object.entries( {
4677
+ parent: {},
4678
+ child: {},
4679
+ } )
4680
+ ),
4681
+ parents: new Map(
4682
+ Object.entries( {
4683
+ parent: '',
4684
+ child: 'parent',
4685
+ } )
4686
+ ),
4687
+ order: new Map( [
4688
+ [ '', [ 'parent' ] ],
4689
+ [ 'parent', [ 'child' ] ],
4690
+ ] ),
4691
+ blockEditingModes: new Map(),
4692
+ },
4693
+ blockListSettings: {
4694
+ parent: {},
4695
+ },
4696
+ settings: {},
4697
+ derivedBlockEditingModes: new Map( [
4698
+ [ 'parent', 'contentOnly' ],
4699
+ ] ),
4700
+ };
4701
+ expect( canMoveBlock( state, 'child' ) ).toBe( true );
4702
+ } );
4703
+
4704
+ it( 'prevents moving within a contentOnly container inside a section', () => {
4705
+ // When the parent is within a section and has contentOnly
4706
+ // editing mode, blocks in a non-insertable container
4707
+ // cannot be moved.
4708
+ const state = {
4709
+ blocks: {
4710
+ byClientId: new Map(
4711
+ Object.entries( {
4712
+ section: { name: 'core/test-block-b' },
4713
+ container: {
4714
+ name: 'core/test-block-a',
4715
+ },
4716
+ child: { name: 'core/test-content-block' },
4717
+ } )
4718
+ ),
4719
+ attributes: new Map(
4720
+ Object.entries( {
4721
+ section: {
4722
+ // patternName makes this block a section.
4723
+ metadata: { patternName: 'test-pattern' },
4724
+ },
4725
+ container: {},
4726
+ child: {},
4727
+ } )
4728
+ ),
4729
+ parents: new Map(
4730
+ Object.entries( {
4731
+ section: '',
4732
+ container: 'section',
4733
+ child: 'container',
4734
+ } )
4735
+ ),
4736
+ order: new Map( [
4737
+ [ '', [ 'section' ] ],
4738
+ [ 'section', [ 'container' ] ],
4739
+ [ 'container', [ 'child' ] ],
4740
+ ] ),
4741
+ blockEditingModes: new Map(),
4742
+ },
4743
+ blockListSettings: {
4744
+ section: {},
4745
+ container: {},
4746
+ },
4747
+ settings: {
4748
+ [ sectionRootClientIdKey ]: '',
4749
+ },
4750
+ derivedBlockEditingModes: new Map( [
4751
+ [ 'container', 'contentOnly' ],
4752
+ ] ),
4753
+ };
4754
+ expect( canMoveBlock( state, 'child' ) ).toBe( false );
4755
+ } );
4756
+
4757
+ it( 'allows moving a content block within a content container inside a section', () => {
4758
+ // When both the container and the child are content blocks,
4759
+ // the contentOnly gating allows moving
4760
+ // (content-to-content match).
4761
+ const state = {
4762
+ blocks: {
4763
+ byClientId: new Map(
4764
+ Object.entries( {
4765
+ section: { name: 'core/test-block-b' },
4766
+ container: {
4767
+ name: 'core/test-content-block',
4768
+ },
4769
+ child: { name: 'core/test-content-block' },
4770
+ } )
4771
+ ),
4772
+ attributes: new Map(
4773
+ Object.entries( {
4774
+ section: {
4775
+ // patternName makes this block a section.
4776
+ metadata: { patternName: 'test-pattern' },
4777
+ },
4778
+ container: {},
4779
+ child: {},
4780
+ } )
4781
+ ),
4782
+ parents: new Map(
4783
+ Object.entries( {
4784
+ section: '',
4785
+ container: 'section',
4786
+ child: 'container',
4787
+ } )
4788
+ ),
4789
+ order: new Map( [
4790
+ [ '', [ 'section' ] ],
4791
+ [ 'section', [ 'container' ] ],
4792
+ [ 'container', [ 'child' ] ],
4793
+ ] ),
4794
+ blockEditingModes: new Map(),
4795
+ },
4796
+ blockListSettings: {
4797
+ section: {},
4798
+ container: {},
4799
+ },
4800
+ settings: {
4801
+ [ sectionRootClientIdKey ]: '',
4802
+ },
4803
+ derivedBlockEditingModes: new Map( [
4804
+ [ 'container', 'contentOnly' ],
4805
+ ] ),
4806
+ };
4807
+ expect( canMoveBlock( state, 'child' ) ).toBe( true );
4808
+ } );
4809
+ } );
4270
4810
  } );
4271
4811
 
4272
4812
  describe( 'getInserterItems with core blocks prioritization', () => {
@@ -4432,7 +4972,9 @@ describe( '__unstableGetClientIdsTree', () => {
4432
4972
 
4433
4973
  describe( 'getBlockEditingMode', () => {
4434
4974
  const baseState = {
4435
- blockEditingModes: new Map( [] ),
4975
+ blocks: {
4976
+ blockEditingModes: new Map( [] ),
4977
+ },
4436
4978
  derivedBlockEditingModes: new Map( [] ),
4437
4979
  };
4438
4980
 
@@ -4461,9 +5003,11 @@ describe( 'getBlockEditingMode', () => {
4461
5003
  it( 'should return disabled if explicitly set', () => {
4462
5004
  const state = {
4463
5005
  ...baseState,
4464
- blockEditingModes: new Map( [
4465
- [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
4466
- ] ),
5006
+ blocks: {
5007
+ blockEditingModes: new Map( [
5008
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
5009
+ ] ),
5010
+ },
4467
5011
  };
4468
5012
  expect(
4469
5013
  getBlockEditingMode( state, 'b3247f75-fd94-4fef-97f9-5bfd162cc416' )
@@ -4473,9 +5017,11 @@ describe( 'getBlockEditingMode', () => {
4473
5017
  it( 'should return contentOnly if explicitly set', () => {
4474
5018
  const state = {
4475
5019
  ...baseState,
4476
- blockEditingModes: new Map( [
4477
- [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'contentOnly' ],
4478
- ] ),
5020
+ blocks: {
5021
+ blockEditingModes: new Map( [
5022
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'contentOnly' ],
5023
+ ] ),
5024
+ },
4479
5025
  };
4480
5026
  expect(
4481
5027
  getBlockEditingMode( state, 'b3247f75-fd94-4fef-97f9-5bfd162cc416' )
@@ -4486,9 +5032,14 @@ describe( 'getBlockEditingMode', () => {
4486
5032
  it( 'should return default if explicitly set', () => {
4487
5033
  const state = {
4488
5034
  ...baseState,
4489
- blockEditingModes: new Map( [
4490
- [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'contentOnly' ],
4491
- ] ),
5035
+ blocks: {
5036
+ blockEditingModes: new Map( [
5037
+ [
5038
+ 'b3247f75-fd94-4fef-97f9-5bfd162cc416',
5039
+ 'contentOnly',
5040
+ ],
5041
+ ] ),
5042
+ },
4492
5043
  derivedBlockEditingModes: new Map( [
4493
5044
  [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
4494
5045
  ] ),
@@ -4504,9 +5055,14 @@ describe( 'getBlockEditingMode', () => {
4504
5055
  it( 'should return disabled if explicitly set', () => {
4505
5056
  const state = {
4506
5057
  ...baseState,
4507
- blockEditingModes: new Map( [
4508
- [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'contentOnly' ],
4509
- ] ),
5058
+ blocks: {
5059
+ blockEditingModes: new Map( [
5060
+ [
5061
+ 'b3247f75-fd94-4fef-97f9-5bfd162cc416',
5062
+ 'contentOnly',
5063
+ ],
5064
+ ] ),
5065
+ },
4510
5066
  derivedBlockEditingModes: new Map( [
4511
5067
  [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
4512
5068
  ] ),
@@ -4522,9 +5078,11 @@ describe( 'getBlockEditingMode', () => {
4522
5078
  it( 'should return contentOnly if explicitly set', () => {
4523
5079
  const state = {
4524
5080
  ...baseState,
4525
- blockEditingModes: new Map( [
4526
- [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
4527
- ] ),
5081
+ blocks: {
5082
+ blockEditingModes: new Map( [
5083
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'default' ],
5084
+ ] ),
5085
+ },
4528
5086
  derivedBlockEditingModes: new Map( [
4529
5087
  [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'contentOnly' ],
4530
5088
  ] ),