@wordpress/e2e-tests 7.16.0 → 7.17.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.
@@ -1,130 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import {
5
- activatePlugin,
6
- createNewPost,
7
- deactivatePlugin,
8
- getEditedPostContent,
9
- insertBlock,
10
- switchEditorModeTo,
11
- pressKeyWithModifier,
12
- canvas,
13
- } from '@wordpress/e2e-test-utils';
14
-
15
- describe( 'InnerBlocks Template Sync', () => {
16
- beforeAll( async () => {
17
- await activatePlugin( 'gutenberg-test-innerblocks-templates' );
18
- } );
19
-
20
- beforeEach( async () => {
21
- await createNewPost();
22
- } );
23
-
24
- afterAll( async () => {
25
- await deactivatePlugin( 'gutenberg-test-innerblocks-templates' );
26
- } );
27
-
28
- const insertBlockAndAddParagraphInside = async ( blockName, blockSlug ) => {
29
- const paragraphToAdd = `
30
- <!-- wp:paragraph -->
31
- <p>added paragraph</p>
32
- <!-- /wp:paragraph -->
33
- `;
34
- await insertBlock( blockName );
35
- await switchEditorModeTo( 'Code' );
36
- await page.$eval(
37
- '.editor-post-text-editor',
38
- ( element, _paragraph, _blockSlug ) => {
39
- const blockDelimiter = `<!-- /wp:${ _blockSlug } -->`;
40
- element.value = element.value.replace(
41
- blockDelimiter,
42
- `${ _paragraph }${ blockDelimiter }`
43
- );
44
- },
45
- paragraphToAdd,
46
- blockSlug
47
- );
48
- // Press "Enter" inside the code editor to fire the `onChange` event for the new value.
49
- await page.click( '.editor-post-text-editor' );
50
- await pressKeyWithModifier( 'primary', 'A' );
51
- await page.keyboard.press( 'ArrowRight' );
52
- await page.keyboard.press( 'Enter' );
53
- await switchEditorModeTo( 'Visual' );
54
- };
55
-
56
- it( 'Ensures blocks without locking are kept intact even if they do not match the template', async () => {
57
- await insertBlockAndAddParagraphInside(
58
- 'Test Inner Blocks no locking',
59
- 'test/test-inner-blocks-no-locking'
60
- );
61
- expect( await getEditedPostContent() ).toMatchSnapshot();
62
- } );
63
-
64
- it( 'Removes blocks that are not expected by the template if a lock all exists', async () => {
65
- await insertBlockAndAddParagraphInside(
66
- 'Test InnerBlocks locking all',
67
- 'test/test-inner-blocks-locking-all'
68
- );
69
- expect( await getEditedPostContent() ).toMatchSnapshot();
70
- } );
71
-
72
- // Test for regressions of https://github.com/WordPress/gutenberg/issues/27897.
73
- it( `Synchronizes blocks if lock 'all' is set and the template prop is changed`, async () => {
74
- // Insert the template and assert that the template has its initial value.
75
- await insertBlock( 'Test Inner Blocks update locked template' );
76
- expect( await getEditedPostContent() ).toMatchSnapshot();
77
-
78
- // Trigger a template update and assert that a second block is now present.
79
- const [ button ] = await canvas().$x(
80
- `//button[contains(text(), 'Update template')]`
81
- );
82
- await button.click();
83
- expect( await getEditedPostContent() ).toMatchSnapshot();
84
- } );
85
-
86
- it( 'Ensure inner block writing flow works as expected without additional paragraphs added', async () => {
87
- const TEST_BLOCK_NAME = 'Test Inner Blocks Paragraph Placeholder';
88
-
89
- await insertBlock( TEST_BLOCK_NAME );
90
- await page.keyboard.type( 'Test Paragraph' );
91
-
92
- expect( await getEditedPostContent() ).toMatchSnapshot();
93
- } );
94
- } );
95
-
96
- describe( 'Container block without paragraph support', () => {
97
- beforeAll( async () => {
98
- await activatePlugin(
99
- 'gutenberg-test-container-block-without-paragraph'
100
- );
101
- } );
102
-
103
- beforeEach( async () => {
104
- await createNewPost();
105
- } );
106
-
107
- afterAll( async () => {
108
- await deactivatePlugin(
109
- 'gutenberg-test-container-block-without-paragraph'
110
- );
111
- } );
112
-
113
- it( 'ensures we can use the alternative block appender properly', async () => {
114
- await insertBlock( 'Container without paragraph' );
115
-
116
- // Open the specific appender used when there's no paragraph support.
117
- await page.click(
118
- '.block-editor-inner-blocks .block-list-appender .block-list-appender__toggle'
119
- );
120
-
121
- // Insert an image block.
122
- const insertButton = (
123
- await page.$x( `//button//span[contains(text(), 'Image')]` )
124
- )[ 0 ];
125
- await insertButton.click();
126
-
127
- // Check the inserted content.
128
- expect( await getEditedPostContent() ).toMatchSnapshot();
129
- } );
130
- } );
@@ -1,251 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import {
5
- activatePlugin,
6
- clickBlockToolbarButton,
7
- clickMenuItem,
8
- createNewPost,
9
- deactivatePlugin,
10
- getEditedPostContent,
11
- insertBlock,
12
- pressKeyTimes,
13
- pressKeyWithModifier,
14
- setPostContent,
15
- canvas,
16
- } from '@wordpress/e2e-test-utils';
17
-
18
- describe( 'cpt locking', () => {
19
- beforeAll( async () => {
20
- await activatePlugin( 'gutenberg-test-plugin-cpt-locking' );
21
- } );
22
-
23
- afterAll( async () => {
24
- await deactivatePlugin( 'gutenberg-test-plugin-cpt-locking' );
25
- } );
26
-
27
- const shouldDisableTheInserter = async () => {
28
- expect(
29
- await page.evaluate( () => {
30
- const inserter = document.querySelector(
31
- '.edit-post-header [aria-label="Add block"], .edit-post-header [aria-label="Toggle block inserter"]'
32
- );
33
- return inserter.getAttribute( 'disabled' );
34
- } )
35
- ).not.toBeNull();
36
- };
37
-
38
- const shouldNotAllowBlocksToBeRemoved = async () => {
39
- await canvas().type(
40
- '.block-editor-rich-text__editable[data-type="core/paragraph"]',
41
- 'p1'
42
- );
43
- await clickBlockToolbarButton( 'Options' );
44
- expect(
45
- await page.$x( '//button/span[contains(text(), "Delete")]' )
46
- ).toHaveLength( 0 );
47
- };
48
-
49
- const shouldAllowBlocksToBeMoved = async () => {
50
- await canvas().click(
51
- 'div > .block-editor-rich-text__editable[data-type="core/paragraph"]'
52
- );
53
- expect( await page.$( 'button[aria-label="Move up"]' ) ).not.toBeNull();
54
- await page.click( 'button[aria-label="Move up"]' );
55
- await canvas().type(
56
- 'div > .block-editor-rich-text__editable[data-type="core/paragraph"]',
57
- 'p1'
58
- );
59
- expect( await getEditedPostContent() ).toMatchSnapshot();
60
- };
61
-
62
- describe( 'template_lock all', () => {
63
- beforeEach( async () => {
64
- await createNewPost( { postType: 'locked-all-post' } );
65
- } );
66
-
67
- it( 'should disable the inserter', shouldDisableTheInserter );
68
-
69
- it(
70
- 'should not allow blocks to be removed',
71
- shouldNotAllowBlocksToBeRemoved
72
- );
73
-
74
- it( 'should not allow blocks to be moved', async () => {
75
- await canvas().click(
76
- '.block-editor-rich-text__editable[data-type="core/paragraph"]'
77
- );
78
- expect( await page.$( 'button[aria-label="Move up"]' ) ).toBeNull();
79
- } );
80
-
81
- it( 'should not error when deleting the cotents of a paragraph', async () => {
82
- await canvas().click(
83
- '.block-editor-block-list__block[data-type="core/paragraph"]'
84
- );
85
- const textToType = 'Paragraph';
86
- await page.keyboard.type( 'Paragraph' );
87
- await pressKeyTimes( 'Backspace', textToType.length + 1 );
88
- expect( await getEditedPostContent() ).toMatchSnapshot();
89
- } );
90
-
91
- it( 'should insert line breaks when using enter and shift-enter', async () => {
92
- await canvas().click(
93
- '.block-editor-block-list__block[data-type="core/paragraph"]'
94
- );
95
- await page.keyboard.type( 'First line' );
96
- await pressKeyTimes( 'Enter', 1 );
97
- await page.keyboard.type( 'Second line' );
98
- await pressKeyWithModifier( 'shift', 'Enter' );
99
- await page.keyboard.type( 'Third line' );
100
- expect( await getEditedPostContent() ).toMatchSnapshot();
101
- } );
102
-
103
- it( 'should show invalid template notice if the blocks do not match the templte', async () => {
104
- const content = await getEditedPostContent();
105
- const [ , contentWithoutImage ] =
106
- content.split( '<!-- /wp:image -->' );
107
- await setPostContent( contentWithoutImage );
108
- const noticeContent = await page.waitForSelector(
109
- '.editor-template-validation-notice .components-notice__content'
110
- );
111
- expect(
112
- await page.evaluate(
113
- ( _noticeContent ) => _noticeContent.firstChild.nodeValue,
114
- noticeContent
115
- )
116
- ).toEqual(
117
- 'The content of your post doesn’t match the template assigned to your post type.'
118
- );
119
- } );
120
-
121
- it( 'should not allow blocks to be inserted in inner blocks', async () => {
122
- await canvas().click(
123
- 'button[aria-label="Two columns; equal split"]'
124
- );
125
- await page.evaluate(
126
- () => new Promise( window.requestIdleCallback )
127
- );
128
- expect(
129
- await canvas().$(
130
- '.wp-block-column .block-editor-button-block-appender'
131
- )
132
- ).toBeNull();
133
-
134
- expect(
135
- await page.evaluate( () => {
136
- const inserter = document.querySelector(
137
- '.edit-post-header [aria-label="Add block"], .edit-post-header [aria-label="Toggle block inserter"]'
138
- );
139
- return inserter.getAttribute( 'disabled' );
140
- } )
141
- ).not.toBeNull();
142
- } );
143
- } );
144
-
145
- describe( 'template_lock insert', () => {
146
- beforeEach( async () => {
147
- await createNewPost( { postType: 'locked-insert-post' } );
148
- } );
149
-
150
- it( 'should disable the inserter', shouldDisableTheInserter );
151
-
152
- it(
153
- 'should not allow blocks to be removed',
154
- shouldNotAllowBlocksToBeRemoved
155
- );
156
-
157
- it( 'should allow blocks to be moved', shouldAllowBlocksToBeMoved );
158
- } );
159
-
160
- describe( 'template_lock false', () => {
161
- beforeEach( async () => {
162
- await createNewPost( { postType: 'not-locked-post' } );
163
- } );
164
-
165
- it( 'should allow blocks to be inserted', async () => {
166
- expect(
167
- // "Add block" selector is required to make sure performance comparison
168
- // doesn't fail on older branches where we still had "Add block" as label.
169
- await page.$(
170
- '.edit-post-header [aria-label="Add block"], .edit-post-header [aria-label="Toggle block inserter"]'
171
- )
172
- ).not.toBeNull();
173
- await insertBlock( 'List' );
174
- await page.keyboard.type( 'List content' );
175
- expect( await getEditedPostContent() ).toMatchSnapshot();
176
- } );
177
-
178
- it( 'should allow blocks to be removed', async () => {
179
- await canvas().type(
180
- '.block-editor-rich-text__editable[data-type="core/paragraph"]',
181
- 'p1'
182
- );
183
- await clickBlockToolbarButton( 'Options' );
184
- await clickMenuItem( 'Delete' );
185
- expect( await getEditedPostContent() ).toMatchSnapshot();
186
- } );
187
-
188
- it( 'should allow blocks to be moved', shouldAllowBlocksToBeMoved );
189
- } );
190
-
191
- describe( 'template_lock all unlocked group', () => {
192
- beforeEach( async () => {
193
- await createNewPost( {
194
- postType: 'l-post-ul-group',
195
- } );
196
- } );
197
-
198
- it( 'should allow blocks to be removed', async () => {
199
- await canvas().type(
200
- 'div > .block-editor-rich-text__editable[data-type="core/paragraph"]',
201
- 'p1'
202
- );
203
- await clickBlockToolbarButton( 'Options' );
204
- await clickMenuItem( 'Delete' );
205
-
206
- expect( await getEditedPostContent() ).toMatchSnapshot();
207
- } );
208
-
209
- it( 'should allow blocks to be moved', shouldAllowBlocksToBeMoved );
210
- } );
211
-
212
- describe( 'template_lock all locked group', () => {
213
- beforeEach( async () => {
214
- await createNewPost( {
215
- postType: 'l-post-l-group',
216
- } );
217
- } );
218
-
219
- it(
220
- 'should not allow blocks to be removed',
221
- shouldNotAllowBlocksToBeRemoved
222
- );
223
-
224
- it( 'should not allow blocks to be moved', async () => {
225
- await canvas().click(
226
- '.block-editor-rich-text__editable[data-type="core/paragraph"]'
227
- );
228
- expect( await page.$( 'button[aria-label="Move up"]' ) ).toBeNull();
229
- } );
230
- } );
231
-
232
- describe( 'template_lock all inherited group', () => {
233
- beforeEach( async () => {
234
- await createNewPost( {
235
- postType: 'l-post-i-group',
236
- } );
237
- } );
238
-
239
- it(
240
- 'should not allow blocks to be removed',
241
- shouldNotAllowBlocksToBeRemoved
242
- );
243
-
244
- it( 'should not allow blocks to be moved', async () => {
245
- await canvas().click(
246
- '.block-editor-rich-text__editable[data-type="core/paragraph"]'
247
- );
248
- expect( await page.$( 'button[aria-label="Move up"]' ) ).toBeNull();
249
- } );
250
- } );
251
- } );
@@ -1,132 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import {
5
- activatePlugin,
6
- createNewPost,
7
- deactivatePlugin,
8
- getAllBlockInserterItemTitles,
9
- insertBlock,
10
- closeGlobalBlockInserter,
11
- canvas,
12
- } from '@wordpress/e2e-test-utils';
13
-
14
- const QUICK_INSERTER_RESULTS_SELECTOR =
15
- '.block-editor-inserter__quick-inserter-results';
16
-
17
- describe( 'Prioritized Inserter Blocks Setting on InnerBlocks', () => {
18
- beforeAll( async () => {
19
- await activatePlugin(
20
- 'gutenberg-test-innerblocks-prioritized-inserter-blocks'
21
- );
22
- } );
23
-
24
- beforeEach( async () => {
25
- await createNewPost();
26
- } );
27
-
28
- afterAll( async () => {
29
- await deactivatePlugin(
30
- 'gutenberg-test-innerblocks-prioritized-inserter-blocks'
31
- );
32
- } );
33
-
34
- describe( 'Quick inserter', () => {
35
- it( 'uses defaulting ordering if prioritzed blocks setting was not set', async () => {
36
- const parentBlockSelector =
37
- '[data-type="test/prioritized-inserter-blocks-unset"]';
38
- await insertBlock( 'Prioritized Inserter Blocks Unset' );
39
- await closeGlobalBlockInserter();
40
-
41
- await page.waitForSelector( parentBlockSelector );
42
-
43
- await page.click(
44
- `${ parentBlockSelector } .block-list-appender .block-editor-inserter__toggle`
45
- );
46
-
47
- await page.waitForSelector( QUICK_INSERTER_RESULTS_SELECTOR );
48
-
49
- await expect( await getAllBlockInserterItemTitles() ).toHaveLength(
50
- 6
51
- );
52
- } );
53
-
54
- it( 'uses the priority ordering if prioritzed blocks setting is set', async () => {
55
- const parentBlockSelector =
56
- '[data-type="test/prioritized-inserter-blocks-set"]';
57
- await insertBlock( 'Prioritized Inserter Blocks Set' );
58
- await closeGlobalBlockInserter();
59
-
60
- await page.waitForSelector( parentBlockSelector );
61
-
62
- await page.click(
63
- `${ parentBlockSelector } .block-list-appender .block-editor-inserter__toggle`
64
- );
65
-
66
- await page.waitForSelector( QUICK_INSERTER_RESULTS_SELECTOR );
67
-
68
- // Should still be only 6 results regardless of the priority ordering.
69
- const inserterItems = await getAllBlockInserterItemTitles();
70
-
71
- // Should still be only 6 results regardless of the priority ordering.
72
- expect( inserterItems ).toHaveLength( 6 );
73
-
74
- expect( inserterItems.slice( 0, 3 ) ).toEqual( [
75
- 'Audio',
76
- 'Spacer',
77
- 'Code',
78
- ] );
79
- } );
80
-
81
- it( 'obeys allowed blocks over prioritzed blocks setting if conflicted', async () => {
82
- const parentBlockSelector =
83
- '[data-type="test/prioritized-inserter-blocks-set-with-conflicting-allowed-blocks"]';
84
- await insertBlock(
85
- 'Prioritized Inserter Blocks Set With Conflicting Allowed Blocks'
86
- );
87
- await closeGlobalBlockInserter();
88
-
89
- await page.waitForSelector( parentBlockSelector );
90
-
91
- await page.click(
92
- `${ parentBlockSelector } .block-list-appender .block-editor-inserter__toggle`
93
- );
94
-
95
- await page.waitForSelector( QUICK_INSERTER_RESULTS_SELECTOR );
96
-
97
- const inserterItems = await getAllBlockInserterItemTitles();
98
-
99
- expect( inserterItems.slice( 0, 3 ) ).toEqual( [
100
- 'Spacer',
101
- 'Code',
102
- 'Paragraph',
103
- ] );
104
- expect( inserterItems ).toEqual(
105
- expect.not.arrayContaining( [ 'Audio' ] )
106
- );
107
- } );
108
- } );
109
- describe( 'Slash inserter', () => {
110
- it( 'uses the priority ordering if prioritzed blocks setting is set', async () => {
111
- await insertBlock( 'Prioritized Inserter Blocks Set' );
112
- await canvas().click( '[data-type="core/image"]' );
113
- await page.keyboard.press( 'Enter' );
114
- await page.keyboard.type( '/' );
115
- // Wait for the results to display.
116
- await page.waitForSelector( '.components-autocomplete__result' );
117
- const inserterItemTitles = await page.evaluate( () => {
118
- return Array.from(
119
- document.querySelectorAll(
120
- '.components-autocomplete__result'
121
- )
122
- ).map( ( { innerText } ) => innerText );
123
- } );
124
- expect( inserterItemTitles ).toHaveLength( 9 ); // Default suggested blocks number.
125
- expect( inserterItemTitles.slice( 0, 3 ) ).toEqual( [
126
- 'Audio',
127
- 'Spacer',
128
- 'Code',
129
- ] );
130
- } );
131
- } );
132
- } );
@@ -1,126 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import {
5
- activatePlugin,
6
- createNewPost,
7
- deactivatePlugin,
8
- getAllBlockInserterItemTitles,
9
- getEditedPostContent,
10
- insertBlock,
11
- closeGlobalBlockInserter,
12
- } from '@wordpress/e2e-test-utils';
13
-
14
- const INSERTER_RESULTS_SELECTOR =
15
- '.block-editor-inserter__quick-inserter-results';
16
- const QUOTE_INSERT_BUTTON_SELECTOR = '//button[.="Quote"]';
17
- const APPENDER_SELECTOR = '.my-custom-awesome-appender';
18
- const DYNAMIC_APPENDER_SELECTOR = 'my-dynamic-blocks-appender';
19
-
20
- describe( 'RenderAppender prop of InnerBlocks', () => {
21
- beforeAll( async () => {
22
- await activatePlugin( 'gutenberg-test-innerblocks-render-appender' );
23
- } );
24
-
25
- beforeEach( async () => {
26
- await createNewPost();
27
- } );
28
-
29
- afterAll( async () => {
30
- await deactivatePlugin( 'gutenberg-test-innerblocks-render-appender' );
31
- } );
32
-
33
- it( 'Users can customize the appender and can still insert blocks using exposed components', async () => {
34
- // Insert the InnerBlocks renderAppender block.
35
- await insertBlock( 'InnerBlocks renderAppender' );
36
- await closeGlobalBlockInserter();
37
- // Wait for the custom block appender to appear.
38
- await page.waitForSelector( APPENDER_SELECTOR );
39
- // Verify if the custom block appender text is the expected one.
40
- expect(
41
- await page.evaluate(
42
- ( el ) => el.innerText,
43
- await page.$( `${ APPENDER_SELECTOR } > span` )
44
- )
45
- ).toEqual( 'My custom awesome appender' );
46
-
47
- // Open the inserter of our custom block appender and expand all the categories.
48
- await page.click(
49
- `${ APPENDER_SELECTOR } .block-editor-button-block-appender`
50
- );
51
- // Verify if the blocks the custom inserter is rendering are the expected ones.
52
- expect( await getAllBlockInserterItemTitles() ).toEqual( [
53
- 'Quote',
54
- 'Video',
55
- ] );
56
-
57
- // Find the quote block insert button option within the inserter popover.
58
- const inserterPopover = await page.$( INSERTER_RESULTS_SELECTOR );
59
- const quoteButton = (
60
- await inserterPopover.$x( QUOTE_INSERT_BUTTON_SELECTOR )
61
- )[ 0 ];
62
-
63
- // Insert a quote block.
64
- await quoteButton.click();
65
- // Verify if the post content is the expected one e.g: the quote was inserted.
66
- expect( await getEditedPostContent() ).toMatchSnapshot();
67
- } );
68
-
69
- it( 'Users can dynamically customize the appender', async () => {
70
- // Insert the InnerBlocks renderAppender dynamic block.
71
- await insertBlock( 'InnerBlocks renderAppender dynamic' );
72
- await closeGlobalBlockInserter();
73
-
74
- // Wait for the custom dynamic block appender to appear.
75
- await page.waitForSelector( '.' + DYNAMIC_APPENDER_SELECTOR );
76
-
77
- // Verify if the custom block appender text is the expected one.
78
- await page.waitForXPath(
79
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "empty-blocks-appender")][contains(text(), "Empty Blocks Appender")]`
80
- );
81
-
82
- // Open the inserter of our custom block appender and expand all the categories.
83
- const blockAppenderButtonSelector = `.${ DYNAMIC_APPENDER_SELECTOR } .block-editor-button-block-appender`;
84
- await page.click( blockAppenderButtonSelector );
85
-
86
- // Verify if the blocks the custom inserter is rendering are the expected ones.
87
- expect( await getAllBlockInserterItemTitles() ).toEqual( [
88
- 'Quote',
89
- 'Video',
90
- ] );
91
-
92
- // Find the quote block insert button option within the inserter popover.
93
- const inserterPopover = await page.$( INSERTER_RESULTS_SELECTOR );
94
- const quoteButton = (
95
- await inserterPopover.$x( QUOTE_INSERT_BUTTON_SELECTOR )
96
- )[ 0 ];
97
-
98
- // Insert a quote block.
99
- await quoteButton.click();
100
-
101
- // Select the quote block.
102
- await page.keyboard.press( 'ArrowDown' );
103
-
104
- // Verify if the custom block appender text changed as expected.
105
- await page.waitForXPath(
106
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "single-blocks-appender")][contains(text(), "Single Blocks Appender")]`
107
- );
108
-
109
- // Verify that the custom appender button is still being rendered.
110
- expect( await page.$( blockAppenderButtonSelector ) ).toBeTruthy();
111
-
112
- // Insert a video block.
113
- await insertBlock( 'Video' );
114
-
115
- // Verify if the custom block appender text changed as expected.
116
- await page.waitForXPath(
117
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "multiple-blocks-appender")][contains(text(), "Multiple Blocks Appender")]`
118
- );
119
-
120
- // Verify that the custom appender button is now not being rendered.
121
- expect( await page.$( blockAppenderButtonSelector ) ).toBeFalsy();
122
-
123
- // Verify that final block markup is the expected one.
124
- expect( await getEditedPostContent() ).toMatchSnapshot();
125
- } );
126
- } );