@wordpress/e2e-tests 4.2.0 → 4.5.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.
- package/config/flaky-tests-reporter.js +3 -3
- package/package.json +6 -6
- package/specs/editor/blocks/__snapshots__/buttons.test.js.snap +4 -4
- package/specs/editor/blocks/__snapshots__/heading.test.js.snap +0 -6
- package/specs/editor/blocks/cover.test.js +10 -14
- package/specs/editor/blocks/heading.test.js +7 -7
- package/specs/editor/blocks/navigation.test.js +69 -16
- package/specs/editor/blocks/table.test.js +16 -4
- package/specs/editor/fixtures/menu-items-response-fixture.json +48 -144
- package/specs/editor/plugins/cpt-locking.test.js +2 -3
- package/specs/editor/plugins/iframed-inline-styles.test.js +1 -0
- package/specs/editor/plugins/inner-blocks-allowed-blocks.test.js +3 -1
- package/specs/editor/various/__snapshots__/inserting-blocks.test.js.snap +1 -1
- package/specs/editor/various/block-switcher.test.js +3 -0
- package/specs/editor/various/datepicker.test.js +21 -7
- package/specs/editor/various/embedding.test.js +2 -4
- package/specs/editor/various/inserting-blocks.test.js +1 -1
- package/specs/editor/various/keyboard-navigable-blocks.test.js +0 -3
- package/specs/editor/various/links.test.js +2 -3
- package/specs/editor/various/navigable-toolbar.test.js +2 -3
- package/specs/editor/various/post-visibility.test.js +1 -1
- package/specs/editor/various/publishing.test.js +4 -2
- package/specs/editor/various/scheduling.test.js +2 -2
- package/specs/editor/various/switch-to-draft.test.js +1 -1
- package/specs/editor/various/taxonomies.test.js +8 -7
- package/specs/editor/various/writing-flow.test.js +19 -16
- package/specs/experiments/navigation-editor.test.js +4 -6
- package/specs/performance/post-editor.test.js +10 -14
- package/specs/performance/site-editor.test.js +2 -5
- package/specs/widgets/editing-widgets.test.js +12 -8
- package/specs/editor/blocks/__snapshots__/code.test.js.snap +0 -14
- package/specs/editor/blocks/__snapshots__/html.test.js.snap +0 -8
- package/specs/editor/blocks/__snapshots__/image.test.js.snap +0 -25
- package/specs/editor/blocks/__snapshots__/preformatted.test.js.snap +0 -24
- package/specs/editor/blocks/__snapshots__/separator.test.js.snap +0 -7
- package/specs/editor/blocks/code.test.js +0 -48
- package/specs/editor/blocks/html.test.js +0 -31
- package/specs/editor/blocks/image.test.js +0 -373
- package/specs/editor/blocks/preformatted.test.js +0 -62
- package/specs/editor/blocks/separator.test.js +0 -22
- package/specs/editor/various/block-locking.test.js +0 -120
- package/specs/editor/various/popovers.test.js +0 -27
- package/specs/site-editor/template-part.test.js +0 -346
- package/specs/site-editor/template-revert.test.js +0 -209
@@ -36,7 +36,9 @@ describe( 'Allowed Blocks Setting on InnerBlocks', () => {
|
|
36
36
|
await page.click( childParagraphSelector );
|
37
37
|
await openGlobalBlockInserter();
|
38
38
|
await expect(
|
39
|
-
(
|
39
|
+
(
|
40
|
+
await getAllBlockInserterItemTitles()
|
41
|
+
).length
|
40
42
|
).toBeGreaterThan( 20 );
|
41
43
|
} );
|
42
44
|
|
@@ -108,7 +108,7 @@ exports[`Inserting blocks inserts a block in proper place after having clicked \
|
|
108
108
|
exports[`Inserting blocks inserts blocks at root level when using the root appender while selection is in an inner block 1`] = `
|
109
109
|
"<!-- wp:buttons -->
|
110
110
|
<div class=\\"wp-block-buttons\\"><!-- wp:button -->
|
111
|
-
<div class=\\"wp-block-button\\"><a class=\\"wp-block-button__link\\">1.1</a></div>
|
111
|
+
<div class=\\"wp-block-button\\"><a class=\\"wp-block-button__link wp-element-button\\">1.1</a></div>
|
112
112
|
<!-- /wp:button --></div>
|
113
113
|
<!-- /wp:buttons -->
|
114
114
|
|
@@ -32,6 +32,7 @@ describe( 'Block Switcher', () => {
|
|
32
32
|
'Heading',
|
33
33
|
'Pullquote',
|
34
34
|
'Columns',
|
35
|
+
'Table of Contents',
|
35
36
|
] )
|
36
37
|
);
|
37
38
|
} );
|
@@ -57,6 +58,7 @@ describe( 'Block Switcher', () => {
|
|
57
58
|
'Paragraph',
|
58
59
|
'Pullquote',
|
59
60
|
'Heading',
|
61
|
+
'Table of Contents',
|
60
62
|
] )
|
61
63
|
);
|
62
64
|
} );
|
@@ -71,6 +73,7 @@ describe( 'Block Switcher', () => {
|
|
71
73
|
'core/group',
|
72
74
|
'core/heading',
|
73
75
|
'core/columns',
|
76
|
+
'core/table-of-contents',
|
74
77
|
].map( ( block ) => wp.blocks.unregisterBlockType( block ) );
|
75
78
|
} );
|
76
79
|
|
@@ -15,12 +15,24 @@ async function getSelectedOptionLabel( selector ) {
|
|
15
15
|
}
|
16
16
|
|
17
17
|
async function getDatePickerValues() {
|
18
|
-
const year = await getInputValue(
|
19
|
-
|
20
|
-
|
21
|
-
const
|
22
|
-
|
23
|
-
|
18
|
+
const year = await getInputValue(
|
19
|
+
'.components-datetime__time-field-year input'
|
20
|
+
);
|
21
|
+
const month = await getInputValue(
|
22
|
+
'.components-datetime__time-field-month select'
|
23
|
+
);
|
24
|
+
const monthLabel = await getSelectedOptionLabel(
|
25
|
+
'.components-datetime__time-field-month select'
|
26
|
+
);
|
27
|
+
const day = await getInputValue(
|
28
|
+
'.components-datetime__time-field-day input'
|
29
|
+
);
|
30
|
+
const hours = await getInputValue(
|
31
|
+
'.components-datetime__time-field-hours-input input'
|
32
|
+
);
|
33
|
+
const minutes = await getInputValue(
|
34
|
+
'.components-datetime__time-field-minutes-input input'
|
35
|
+
);
|
24
36
|
const amOrPm = await page.$eval(
|
25
37
|
'.components-datetime__time-field-am-pm .is-primary',
|
26
38
|
( element ) => element.innerText.toLowerCase()
|
@@ -126,7 +138,9 @@ describe.each( [ [ 'UTC-10' ], [ 'UTC' ], [ 'UTC+10' ] ] )(
|
|
126
138
|
await page.click( '.edit-post-post-schedule__toggle' );
|
127
139
|
|
128
140
|
// Clear the date.
|
129
|
-
await page.click(
|
141
|
+
await page.click(
|
142
|
+
'.block-editor-publish-date-time-picker button[aria-label="Now"]'
|
143
|
+
);
|
130
144
|
|
131
145
|
const publishingDate = await getPublishingDate();
|
132
146
|
|
@@ -16,8 +16,7 @@ import {
|
|
16
16
|
|
17
17
|
const MOCK_EMBED_WORDPRESS_SUCCESS_RESPONSE = {
|
18
18
|
url: 'https://wordpress.org/gutenberg/handbook/block-api/attributes/',
|
19
|
-
html:
|
20
|
-
'<div class="wp-embedded-content" data-secret="shhhh it is a secret"></div>',
|
19
|
+
html: '<div class="wp-embedded-content" data-secret="shhhh it is a secret"></div>',
|
21
20
|
type: 'rich',
|
22
21
|
provider_name: 'WordPress',
|
23
22
|
provider_url: 'https://wordpress.org',
|
@@ -78,8 +77,7 @@ const MOCK_BAD_EMBED_PROVIDER_RESPONSE = {
|
|
78
77
|
|
79
78
|
const MOCK_CANT_EMBED_RESPONSE = {
|
80
79
|
provider_name: 'Embed Handler',
|
81
|
-
html:
|
82
|
-
'<a href="https://twitter.com/wooyaygutenberg123454312">https://twitter.com/wooyaygutenberg123454312</a>',
|
80
|
+
html: '<a href="https://twitter.com/wooyaygutenberg123454312">https://twitter.com/wooyaygutenberg123454312</a>',
|
83
81
|
};
|
84
82
|
|
85
83
|
const MOCK_BAD_WORDPRESS_RESPONSE = {
|
@@ -299,7 +299,7 @@ describe( 'Inserting blocks', () => {
|
|
299
299
|
await page.waitForSelector( INSERTER_SEARCH_SELECTOR );
|
300
300
|
await page.focus( INSERTER_SEARCH_SELECTOR );
|
301
301
|
await pressKeyWithModifier( 'primary', 'a' );
|
302
|
-
const searchTerm = '
|
302
|
+
const searchTerm = 'Verse';
|
303
303
|
await page.keyboard.type( searchTerm );
|
304
304
|
const browseAll = await page.waitForXPath(
|
305
305
|
'//button[text()="Browse all"]'
|
@@ -26,9 +26,6 @@ const navigateToContentEditorTop = async () => {
|
|
26
26
|
};
|
27
27
|
|
28
28
|
const tabThroughParagraphBlock = async ( paragraphText ) => {
|
29
|
-
await page.keyboard.press( 'Tab' );
|
30
|
-
await expect( await getActiveLabel() ).toBe( 'Add block' );
|
31
|
-
|
32
29
|
await tabThroughBlockToolbar();
|
33
30
|
|
34
31
|
await page.keyboard.press( 'Tab' );
|
@@ -271,9 +271,8 @@ describe( 'Links', () => {
|
|
271
271
|
const toggleFixedToolbar = async ( isFixed ) => {
|
272
272
|
await page.evaluate( ( _isFixed ) => {
|
273
273
|
const { select, dispatch } = wp.data;
|
274
|
-
const isCurrentlyFixed =
|
275
|
-
'fixedToolbar'
|
276
|
-
);
|
274
|
+
const isCurrentlyFixed =
|
275
|
+
select( 'core/edit-post' ).isFeatureActive( 'fixedToolbar' );
|
277
276
|
if ( isCurrentlyFixed !== _isFixed ) {
|
278
277
|
dispatch( 'core/edit-post' ).toggleFeature( 'fixedToolbar' );
|
279
278
|
}
|
@@ -20,9 +20,8 @@ describe.each( [
|
|
20
20
|
|
21
21
|
await page.evaluate( ( _isUnifiedToolbar ) => {
|
22
22
|
const { select, dispatch } = wp.data;
|
23
|
-
const isCurrentlyUnified =
|
24
|
-
'core/edit-post'
|
25
|
-
).isFeatureActive( 'fixedToolbar' );
|
23
|
+
const isCurrentlyUnified =
|
24
|
+
select( 'core/edit-post' ).isFeatureActive( 'fixedToolbar' );
|
26
25
|
if ( isCurrentlyUnified !== _isUnifiedToolbar ) {
|
27
26
|
dispatch( 'core/edit-post' ).toggleFeature( 'fixedToolbar' );
|
28
27
|
}
|
@@ -92,7 +92,7 @@ describe( 'Post visibility', () => {
|
|
92
92
|
// Set a publish date for the next month.
|
93
93
|
await page.click( '.edit-post-post-schedule__toggle' );
|
94
94
|
await page.click(
|
95
|
-
'
|
95
|
+
'*[aria-label="Move forward to switch to the next month."]'
|
96
96
|
);
|
97
97
|
await (
|
98
98
|
await page.$x(
|
@@ -103,7 +103,8 @@ describe( 'Publishing', () => {
|
|
103
103
|
|
104
104
|
beforeEach( async () => {
|
105
105
|
await createNewPost( postType );
|
106
|
-
werePrePublishChecksEnabled =
|
106
|
+
werePrePublishChecksEnabled =
|
107
|
+
await arePrePublishChecksEnabled();
|
107
108
|
if ( werePrePublishChecksEnabled ) {
|
108
109
|
await disablePrePublishChecks();
|
109
110
|
}
|
@@ -143,7 +144,8 @@ describe( 'Publishing', () => {
|
|
143
144
|
|
144
145
|
beforeEach( async () => {
|
145
146
|
await createNewPost( postType );
|
146
|
-
werePrePublishChecksEnabled =
|
147
|
+
werePrePublishChecksEnabled =
|
148
|
+
await arePrePublishChecksEnabled();
|
147
149
|
if ( werePrePublishChecksEnabled ) {
|
148
150
|
await disablePrePublishChecks();
|
149
151
|
}
|
@@ -58,11 +58,11 @@ describe( 'Scheduling', () => {
|
|
58
58
|
|
59
59
|
await page.click( '.edit-post-post-schedule__toggle' );
|
60
60
|
await page.click(
|
61
|
-
'
|
61
|
+
'*[aria-label="Move backward to switch to the previous month."]'
|
62
62
|
);
|
63
63
|
expect( await isDateTimeComponentFocused() ).toBe( true );
|
64
64
|
await page.click(
|
65
|
-
'
|
65
|
+
'*[aria-label="Move forward to switch to the next month."]'
|
66
66
|
);
|
67
67
|
expect( await isDateTimeComponentFocused() ).toBe( true );
|
68
68
|
} );
|
@@ -63,7 +63,7 @@ async function scheduleTestPost( postType, viewport ) {
|
|
63
63
|
// Set a publish date for the next month.
|
64
64
|
await page.click( '.edit-post-post-schedule__toggle' );
|
65
65
|
await page.click(
|
66
|
-
'
|
66
|
+
'*[aria-label="Move forward to switch to the next month."]'
|
67
67
|
);
|
68
68
|
|
69
69
|
await (
|
@@ -1,8 +1,3 @@
|
|
1
|
-
/**
|
2
|
-
* External dependencies
|
3
|
-
*/
|
4
|
-
import { random } from 'lodash';
|
5
|
-
|
6
1
|
/**
|
7
2
|
* WordPress dependencies
|
8
3
|
*/
|
@@ -19,6 +14,12 @@ import {
|
|
19
14
|
const TAG_TOKEN_SELECTOR =
|
20
15
|
'.components-form-token-field__token-text span:not(.components-visually-hidden)';
|
21
16
|
|
17
|
+
function generateRandomNumber() {
|
18
|
+
// Using `Math.random()` directly is fine in this testing context.
|
19
|
+
// eslint-disable-next-line no-restricted-syntax
|
20
|
+
return Math.round( 1 + Math.random() * ( Number.MAX_SAFE_INTEGER - 1 ) );
|
21
|
+
}
|
22
|
+
|
22
23
|
describe( 'Taxonomies', () => {
|
23
24
|
const canCreatTermInTaxonomy = ( taxonomy ) => {
|
24
25
|
return page.evaluate( ( _taxonomy ) => {
|
@@ -152,7 +153,7 @@ describe( 'Taxonomies', () => {
|
|
152
153
|
// Click the tag input field.
|
153
154
|
await tagInput.click();
|
154
155
|
|
155
|
-
const tagName = "tag'-" +
|
156
|
+
const tagName = "tag'-" + generateRandomNumber();
|
156
157
|
|
157
158
|
// Type the category name in the field.
|
158
159
|
await tagInput.type( tagName );
|
@@ -211,7 +212,7 @@ describe( 'Taxonomies', () => {
|
|
211
212
|
// Click the tag input field.
|
212
213
|
await tagInput.click();
|
213
214
|
|
214
|
-
const tagName = 'tag-' +
|
215
|
+
const tagName = 'tag-' + generateRandomNumber();
|
215
216
|
|
216
217
|
// Type the category name in the field.
|
217
218
|
await tagInput.type( tagName );
|
@@ -679,27 +679,11 @@ describe( 'Writing Flow', () => {
|
|
679
679
|
await page.keyboard.press( 'Tab' );
|
680
680
|
// Create the table.
|
681
681
|
await page.keyboard.press( 'Space' );
|
682
|
-
// Return focus after focus loss. This should be fixed.
|
683
|
-
await page.keyboard.press( 'Tab' );
|
684
682
|
// Navigate to the second cell.
|
685
683
|
await page.keyboard.press( 'ArrowRight' );
|
686
684
|
await page.keyboard.type( '2' );
|
687
685
|
// Confirm correct setup.
|
688
686
|
expect( await getEditedPostContent() ).toMatchSnapshot();
|
689
|
-
// The content should only have one tab stop.
|
690
|
-
await page.keyboard.press( 'Tab' );
|
691
|
-
expect(
|
692
|
-
await page.evaluate( () =>
|
693
|
-
document.activeElement.getAttribute( 'aria-label' )
|
694
|
-
)
|
695
|
-
).toBe( 'Post' );
|
696
|
-
await pressKeyWithModifier( 'shift', 'Tab' );
|
697
|
-
await pressKeyWithModifier( 'shift', 'Tab' );
|
698
|
-
expect(
|
699
|
-
await page.evaluate( () =>
|
700
|
-
document.activeElement.getAttribute( 'aria-label' )
|
701
|
-
)
|
702
|
-
).toBe( 'Table' );
|
703
687
|
} );
|
704
688
|
|
705
689
|
it( 'should unselect all blocks when hitting double escape', async () => {
|
@@ -750,4 +734,23 @@ describe( 'Writing Flow', () => {
|
|
750
734
|
);
|
751
735
|
expect( selectedParagraph ).toBeDefined();
|
752
736
|
} );
|
737
|
+
it( 'should prevent browser default formatting on multi selection', async () => {
|
738
|
+
await page.keyboard.press( 'Enter' );
|
739
|
+
await page.keyboard.type( 'first' );
|
740
|
+
await page.keyboard.press( 'Enter' );
|
741
|
+
await page.keyboard.type( 'second' );
|
742
|
+
|
743
|
+
// Multi select both paragraphs.
|
744
|
+
await pressKeyTimes( 'ArrowLeft', 2 );
|
745
|
+
await page.keyboard.down( 'Shift' );
|
746
|
+
await pressKeyTimes( 'ArrowLeft', 2 );
|
747
|
+
await page.keyboard.press( 'ArrowUp' );
|
748
|
+
await page.keyboard.up( 'Shift' );
|
749
|
+
await pressKeyWithModifier( 'primary', 'b' );
|
750
|
+
const paragraphs = await page.$$eval(
|
751
|
+
'[data-type="core/paragraph"]',
|
752
|
+
( nodes ) => Array.from( nodes ).map( ( node ) => node.innerHTML )
|
753
|
+
);
|
754
|
+
expect( paragraphs ).toEqual( [ 'first', 'second' ] );
|
755
|
+
} );
|
753
756
|
} );
|
@@ -681,17 +681,15 @@ describe.skip( 'Navigation editor', () => {
|
|
681
681
|
|
682
682
|
// Get the title/label of the last Nav item inside the Nav block.
|
683
683
|
const lastItemAttributes = await page.evaluate( () => {
|
684
|
-
const { getBlockOrder, getBlocks } =
|
685
|
-
'core/block-editor'
|
686
|
-
);
|
684
|
+
const { getBlockOrder, getBlocks } =
|
685
|
+
wp.data.select( 'core/block-editor' );
|
687
686
|
|
688
687
|
const lockedNavigationBlock = getBlockOrder()[ 0 ];
|
689
688
|
|
690
689
|
const navItemBlocks = getBlocks( lockedNavigationBlock );
|
691
690
|
|
692
|
-
const { attributes } =
|
693
|
-
navItemBlocks.length - 1
|
694
|
-
];
|
691
|
+
const { attributes } =
|
692
|
+
navItemBlocks[ navItemBlocks.length - 1 ];
|
695
693
|
|
696
694
|
return attributes;
|
697
695
|
} );
|
@@ -3,7 +3,6 @@
|
|
3
3
|
*/
|
4
4
|
import { basename, join } from 'path';
|
5
5
|
import { writeFileSync } from 'fs';
|
6
|
-
import { sum } from 'lodash';
|
7
6
|
|
8
7
|
/**
|
9
8
|
* WordPress dependencies
|
@@ -136,11 +135,8 @@ describe( 'Post Editor Performance', () => {
|
|
136
135
|
}
|
137
136
|
await page.tracing.stop();
|
138
137
|
traceResults = JSON.parse( readFile( traceFile ) );
|
139
|
-
const [
|
140
|
-
|
141
|
-
keyPressEvents,
|
142
|
-
keyUpEvents,
|
143
|
-
] = getTypingEventDurations( traceResults );
|
138
|
+
const [ keyDownEvents, keyPressEvents, keyUpEvents ] =
|
139
|
+
getTypingEventDurations( traceResults );
|
144
140
|
if (
|
145
141
|
keyDownEvents.length === keyPressEvents.length &&
|
146
142
|
keyPressEvents.length === keyUpEvents.length
|
@@ -226,6 +222,10 @@ describe( 'Post Editor Performance', () => {
|
|
226
222
|
} );
|
227
223
|
|
228
224
|
it( 'Searching the inserter', async () => {
|
225
|
+
function sum( arr ) {
|
226
|
+
return arr.reduce( ( a, b ) => a + b, 0 );
|
227
|
+
}
|
228
|
+
|
229
229
|
// Measure time to search the inserter and get results.
|
230
230
|
await openGlobalBlockInserter();
|
231
231
|
for ( let j = 0; j < 10; j++ ) {
|
@@ -240,11 +240,8 @@ describe( 'Post Editor Performance', () => {
|
|
240
240
|
await page.keyboard.type( 'p' );
|
241
241
|
await page.tracing.stop();
|
242
242
|
traceResults = JSON.parse( readFile( traceFile ) );
|
243
|
-
const [
|
244
|
-
|
245
|
-
keyPressEvents,
|
246
|
-
keyUpEvents,
|
247
|
-
] = getTypingEventDurations( traceResults );
|
243
|
+
const [ keyDownEvents, keyPressEvents, keyUpEvents ] =
|
244
|
+
getTypingEventDurations( traceResults );
|
248
245
|
if (
|
249
246
|
keyDownEvents.length === keyPressEvents.length &&
|
250
247
|
keyPressEvents.length === keyUpEvents.length
|
@@ -284,9 +281,8 @@ describe( 'Post Editor Performance', () => {
|
|
284
281
|
await page.tracing.stop();
|
285
282
|
|
286
283
|
traceResults = JSON.parse( readFile( traceFile ) );
|
287
|
-
const [ mouseOverEvents, mouseOutEvents ] =
|
288
|
-
traceResults
|
289
|
-
);
|
284
|
+
const [ mouseOverEvents, mouseOutEvents ] =
|
285
|
+
getHoverEventDurations( traceResults );
|
290
286
|
for ( let k = 0; k < mouseOverEvents.length; k++ ) {
|
291
287
|
results.inserterHover.push(
|
292
288
|
mouseOverEvents[ k ] + mouseOutEvents[ k ]
|
@@ -130,11 +130,8 @@ describe( 'Site Editor Performance', () => {
|
|
130
130
|
}
|
131
131
|
await page.tracing.stop();
|
132
132
|
const traceResults = JSON.parse( readFile( traceFile ) );
|
133
|
-
const [
|
134
|
-
|
135
|
-
keyPressEvents,
|
136
|
-
keyUpEvents,
|
137
|
-
] = getTypingEventDurations( traceResults );
|
133
|
+
const [ keyDownEvents, keyPressEvents, keyUpEvents ] =
|
134
|
+
getTypingEventDurations( traceResults );
|
138
135
|
|
139
136
|
for ( let j = 0; j < keyDownEvents.length; j++ ) {
|
140
137
|
results.type.push(
|
@@ -113,7 +113,8 @@ describe( 'Widgets screen', () => {
|
|
113
113
|
const insertionPointIndicator = await page.$(
|
114
114
|
'.block-editor-block-list__insertion-point-indicator'
|
115
115
|
);
|
116
|
-
const insertionPointIndicatorBoundingBox =
|
116
|
+
const insertionPointIndicatorBoundingBox =
|
117
|
+
await insertionPointIndicator.boundingBox();
|
117
118
|
|
118
119
|
expect(
|
119
120
|
insertionPointIndicatorBoundingBox.y > lastBlockBoundingBox.y
|
@@ -298,7 +299,8 @@ describe( 'Widgets screen', () => {
|
|
298
299
|
firstParagraphBlock
|
299
300
|
);
|
300
301
|
|
301
|
-
const secondParagraphBlockBoundingBox =
|
302
|
+
const secondParagraphBlockBoundingBox =
|
303
|
+
await secondParagraphBlock.boundingBox();
|
302
304
|
|
303
305
|
// Click outside the block to move the focus back to the widget area.
|
304
306
|
await page.mouse.click(
|
@@ -560,16 +562,18 @@ describe( 'Widgets screen', () => {
|
|
560
562
|
{},
|
561
563
|
firstParagraphBlock
|
562
564
|
);
|
563
|
-
const duplicatedParagraphBlock =
|
564
|
-
|
565
|
-
|
565
|
+
const duplicatedParagraphBlock =
|
566
|
+
await firstParagraphBlock.evaluateHandle(
|
567
|
+
( paragraph ) => paragraph.nextSibling
|
568
|
+
);
|
566
569
|
|
567
570
|
const firstParagraphBlockClientId = await firstParagraphBlock.evaluate(
|
568
571
|
( node ) => node.dataset.block
|
569
572
|
);
|
570
|
-
const duplicatedParagraphBlockClientId =
|
571
|
-
|
572
|
-
|
573
|
+
const duplicatedParagraphBlockClientId =
|
574
|
+
await duplicatedParagraphBlock.evaluate(
|
575
|
+
( node ) => node.dataset.block
|
576
|
+
);
|
573
577
|
|
574
578
|
expect( firstParagraphBlockClientId ).not.toBe(
|
575
579
|
duplicatedParagraphBlockClientId
|
@@ -1,14 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`Code can be created by three backticks and enter 1`] = `
|
4
|
-
"<!-- wp:code -->
|
5
|
-
<pre class=\\"wp-block-code\\"><code><?php</code></pre>
|
6
|
-
<!-- /wp:code -->"
|
7
|
-
`;
|
8
|
-
|
9
|
-
exports[`Code should paste plain text 1`] = `
|
10
|
-
"<!-- wp:code -->
|
11
|
-
<pre class=\\"wp-block-code\\"><code><img />
|
12
|
-
<br></code></pre>
|
13
|
-
<!-- /wp:code -->"
|
14
|
-
`;
|
@@ -1,25 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`Image allows changing aspect ratio using the crop tools 1`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAoACgMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAJB//EACAQAAADCQEAAAAAAAAAAAAAAAAEBQEDBgk1OHR3srX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AlMlS6eKdfnvRTgrytVTuQ86aChkqXTxTr896KcFeVqqdyHnTQH//2Q=="`;
|
4
|
-
|
5
|
-
exports[`Image allows changing aspect ratio using the crop tools 2`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAYACgMBIgACEQEDEQH/xAAWAAEBAQAAAAAAAAAAAAAAAAAABwn/xAAgEAABAgUFAAAAAAAAAAAAAAAABAUBAwYJNTh0d7K1/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJTZU1T1Tx+u9FuNXnbKrdxM7RAA/9k="`;
|
6
|
-
|
7
|
-
exports[`Image allows rotating using the crop tools 1`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAoACgMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAJB//EACAQAAADCQEAAAAAAAAAAAAAAAAEBQEDBgk1OHR3srX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AlMlS6eKdfnvRTgrytVTuQ86aChkqXTxTr896KcFeVqqdyHnTQH//2Q=="`;
|
8
|
-
|
9
|
-
exports[`Image allows rotating using the crop tools 2`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAoACgMBIgACEQEDEQH/xAAWAAEBAQAAAAAAAAAAAAAAAAAABwn/xAAhEAAAAgsBAAAAAAAAAAAAAAAABQIEBwgVGVVWk5XR1P/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCUyVHp7+ZVtTHwhJUenv5lW1MfCNXosa1NbzJdCLGtTW8yXQH/2Q=="`;
|
10
|
-
|
11
|
-
exports[`Image allows zooming using the crop tools 1`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAoACgMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAJB//EACAQAAADCQEAAAAAAAAAAAAAAAAEBQEDBgk1OHR3srX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AlMlS6eKdfnvRTgrytVTuQ86aChkqXTxTr896KcFeVqqdyHnTQH//2Q=="`;
|
12
|
-
|
13
|
-
exports[`Image allows zooming using the crop tools 2`] = `"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAAUABQMBIgACEQEDEQH/xAAVAAEBAAAAAAAAAAAAAAAAAAAACP/EABoQAQABBQAAAAAAAAAAAAAAAAAEBwk4hbX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Aqm1xgnTLddiaAD//2Q=="`;
|
14
|
-
|
15
|
-
exports[`Image should drag and drop files into media placeholder 1`] = `
|
16
|
-
"<!-- wp:image -->
|
17
|
-
<figure class=\\"wp-block-image\\"><img alt=\\"\\"/></figure>
|
18
|
-
<!-- /wp:image -->"
|
19
|
-
`;
|
20
|
-
|
21
|
-
exports[`Image should undo without broken temporary state 1`] = `
|
22
|
-
"<!-- wp:image -->
|
23
|
-
<figure class=\\"wp-block-image\\"><img alt=\\"\\"/></figure>
|
24
|
-
<!-- /wp:image -->"
|
25
|
-
`;
|
@@ -1,24 +0,0 @@
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
-
|
3
|
-
exports[`Preformatted should preserve character newlines 1`] = `
|
4
|
-
"<!-- wp:html -->
|
5
|
-
<pre>1
|
6
|
-
2</pre>
|
7
|
-
<!-- /wp:html -->"
|
8
|
-
`;
|
9
|
-
|
10
|
-
exports[`Preformatted should preserve character newlines 2`] = `
|
11
|
-
"<!-- wp:preformatted -->
|
12
|
-
<pre class=\\"wp-block-preformatted\\">0
|
13
|
-
1
|
14
|
-
2</pre>
|
15
|
-
<!-- /wp:preformatted -->"
|
16
|
-
`;
|
17
|
-
|
18
|
-
exports[`Preformatted should preserve white space when merging 1`] = `
|
19
|
-
"<!-- wp:preformatted -->
|
20
|
-
<pre class=\\"wp-block-preformatted\\">1
|
21
|
-
2
|
22
|
-
3</pre>
|
23
|
-
<!-- /wp:preformatted -->"
|
24
|
-
`;
|
@@ -1,48 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* WordPress dependencies
|
3
|
-
*/
|
4
|
-
import {
|
5
|
-
insertBlock,
|
6
|
-
clickBlockAppender,
|
7
|
-
getEditedPostContent,
|
8
|
-
createNewPost,
|
9
|
-
setClipboardData,
|
10
|
-
pressKeyWithModifier,
|
11
|
-
} from '@wordpress/e2e-test-utils';
|
12
|
-
|
13
|
-
describe( 'Code', () => {
|
14
|
-
beforeEach( async () => {
|
15
|
-
await createNewPost();
|
16
|
-
} );
|
17
|
-
|
18
|
-
it( 'can be created by three backticks and enter', async () => {
|
19
|
-
await clickBlockAppender();
|
20
|
-
await page.keyboard.type( '```' );
|
21
|
-
await page.keyboard.press( 'Enter' );
|
22
|
-
await page.keyboard.type( '<?php' );
|
23
|
-
|
24
|
-
expect( await getEditedPostContent() ).toMatchSnapshot();
|
25
|
-
} );
|
26
|
-
|
27
|
-
it( 'should delete block when backspace in an empty code', async () => {
|
28
|
-
await insertBlock( 'Code' );
|
29
|
-
await page.keyboard.type( 'a' );
|
30
|
-
|
31
|
-
await page.keyboard.press( 'Backspace' );
|
32
|
-
await page.keyboard.press( 'Backspace' );
|
33
|
-
|
34
|
-
// Expect code block to be deleted.
|
35
|
-
expect( await getEditedPostContent() ).toBe( '' );
|
36
|
-
} );
|
37
|
-
|
38
|
-
it( 'should paste plain text', async () => {
|
39
|
-
await insertBlock( 'Code' );
|
40
|
-
|
41
|
-
// Test to see if HTML and white space is kept.
|
42
|
-
await setClipboardData( { plainText: '<img />\n\t<br>' } );
|
43
|
-
|
44
|
-
await pressKeyWithModifier( 'primary', 'v' );
|
45
|
-
|
46
|
-
expect( await getEditedPostContent() ).toMatchSnapshot();
|
47
|
-
} );
|
48
|
-
} );
|
@@ -1,31 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* WordPress dependencies
|
3
|
-
*/
|
4
|
-
import {
|
5
|
-
clickBlockAppender,
|
6
|
-
getEditedPostContent,
|
7
|
-
createNewPost,
|
8
|
-
} from '@wordpress/e2e-test-utils';
|
9
|
-
|
10
|
-
describe( 'HTML block', () => {
|
11
|
-
beforeEach( async () => {
|
12
|
-
await createNewPost();
|
13
|
-
} );
|
14
|
-
|
15
|
-
it( 'can be created by typing "/html"', async () => {
|
16
|
-
// Create a Custom HTML block with the slash shortcut.
|
17
|
-
await clickBlockAppender();
|
18
|
-
await page.keyboard.type( '/html' );
|
19
|
-
await page.waitForXPath(
|
20
|
-
`//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Custom HTML')]`
|
21
|
-
);
|
22
|
-
await page.keyboard.press( 'Enter' );
|
23
|
-
await page.keyboard.type( '<p>Pythagorean theorem: ' );
|
24
|
-
await page.keyboard.press( 'Enter' );
|
25
|
-
await page.keyboard.type(
|
26
|
-
'<var>a</var><sup>2</sup> + <var>b</var><sup>2</sup> = <var>c</var><sup>2</sup> </p>'
|
27
|
-
);
|
28
|
-
|
29
|
-
expect( await getEditedPostContent() ).toMatchSnapshot();
|
30
|
-
} );
|
31
|
-
} );
|