Skip to content

Commit 320c926

Browse files
committed
ACP2E-103: Pagebuilder content gets corrupted, when 4 bytes characters like emojis are used
1 parent 60d2cbb commit 320c926

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="addTextToHtmlCodeWYSIWYGActionGroup">
11+
<arguments>
12+
<argument name="text" type="string"/>
13+
</arguments>
14+
<waitForPageLoad stepKey="waitForPageLoad"/>
15+
<waitForElement time="2" selector="{{EditPanelForm.panelFieldControl('general', 'html')}}" stepKey="waitForElementVisible"/>
16+
<click selector="{{EditPanelForm.panelFieldControl('general', 'html')}}" stepKey="clickField"/>
17+
<!-- Workaround to insert UTF8 MB4 characters -->
18+
<executeJS function="document.evaluate('{{EditPanelForm.panelFieldControl('general', 'html')}}', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value += '{{text}}'; return 1;" stepKey="testVariable"/>
19+
</actionGroup>
20+
</actionGroups>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="removeTextFromHtmlCodeWYSIWYGActionGroup">
11+
<arguments>
12+
<argument name="text" type="string"/>
13+
</arguments>
14+
<waitForPageLoad stepKey="waitForPageLoad"/>
15+
<waitForElement time="2" selector="{{EditPanelForm.panelFieldControl('general', 'html')}}" stepKey="waitForElementVisible"/>
16+
<!-- Workaround to remove UTF8 MB4 characters -->
17+
<executeJS function="node=document.evaluate('{{EditPanelForm.panelFieldControl('general', 'html')}}', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;node.value = node.value.replace(new RegExp('{{text}}'), ''); node.dispatchEvent(new Event('change')); return 1;" stepKey="testVariable"/>
18+
</actionGroup>
19+
</actionGroups>
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="HtmlCMSPageValidationTest">
11+
<annotations>
12+
<features value="PageBuilder"/>
13+
<stories value="HTML Code"/>
14+
<title value="Update General Values"/>
15+
<description value="Validate that updating every attribute in the General form for Html will update the Stage and Storefront correctly."/>
16+
<severity value="BLOCKER"/>
17+
<useCaseId value="MC-14081"/>
18+
<testCaseId value="MC-25841"/>
19+
<group value="pagebuilder"/>
20+
<group value="pagebuilder-html"/>
21+
</annotations>
22+
<before>
23+
<createData entity="_emptyCmsPage" stepKey="createCMSPage"/>
24+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
25+
<actionGroup ref="NavigateToCreatedCMSPageActionGroup" stepKey="navigateToCreatedCMSPage">
26+
<argument name="CMSPage" value="$$createCMSPage$$"/>
27+
</actionGroup>
28+
<actionGroup ref="switchToPageBuilderStage" stepKey="switchToPageBuilderStage"/>
29+
<actionGroup ref="dragContentTypeToStage" stepKey="dragRowToRootContainer">
30+
<argument name="contentType" value="PageBuilderRowContentType"/>
31+
<argument name="containerTargetType" value="PageBuilderRootContainerContentType"/>
32+
</actionGroup>
33+
</before>
34+
<after>
35+
<deleteData createDataKey="createCMSPage" stepKey="deleteCMSPage"/>
36+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
37+
</after>
38+
<actionGroup ref="expandPageBuilderPanelMenuSection" stepKey="expandPageBuilderPanelMenuSection">
39+
<argument name="contentType" value="PageBuilderHtmlContentType"/>
40+
</actionGroup>
41+
<actionGroup ref="dragContentTypeToStage" stepKey="dragHtmlIntoStage">
42+
<argument name="contentType" value="PageBuilderHtmlContentType"/>
43+
</actionGroup>
44+
<actionGroup ref="openPageBuilderEditPanel" stepKey="openEditMenuOnStage">
45+
<argument name="contentType" value="PageBuilderHtmlContentType"/>
46+
</actionGroup>
47+
<actionGroup ref="fillSlideOutPanelTextArea" stepKey="enterHtmlContent">
48+
<argument name="property" value="PageBuilderHtmlPropertyButton"/>
49+
</actionGroup>
50+
<actionGroup ref="addTextToHtmlCodeWYSIWYGActionGroup" stepKey="enterWrongHtmlContent">
51+
<argument name="text" value="\u{1F600}"/>
52+
</actionGroup>
53+
<click selector="{{EditPanelForm.editFormSave}}" stepKey="clickSaveButton"/>
54+
<waitForElementVisible selector="{{HtmlOnStage.baseErrorLabel}}" stepKey="waitForHtmlBaseErrorLabelStage1"/>
55+
<grabTextFrom selector="{{HtmlOnStage.baseErrorLabel}}" stepKey="grabTextFromErrorLabel"/>
56+
<assertStringContainsString stepKey="assertErrorMessage">
57+
<expectedResult type="string">Please remove invalid characters</expectedResult>
58+
<actualResult type="variable">grabTextFromErrorLabel</actualResult>
59+
</assertStringContainsString>
60+
<actionGroup ref="removeTextFromHtmlCodeWYSIWYGActionGroup" stepKey="removeWrongHtmlContent">
61+
<argument name="text" value="\u{1F600}"/>
62+
</actionGroup>
63+
<actionGroup ref="saveEditPanelSettings" stepKey="saveEditPanelSettings"/>
64+
<waitForElementNotVisible selector="{{HtmlOnStage.baseErrorLabel}}" stepKey="waitForHtmlBaseErrorLabelRemovedStage1"/>
65+
<!-- Validate Stage -->
66+
<comment userInput="Validate Stage" stepKey="commentValidateStage"/>
67+
<waitForElementVisible selector="{{HtmlOnStage.base('1')}}" stepKey="waitForHtmlBaseStage1"/>
68+
<waitForElementVisible selector="{{HtmlOnStage.html('1', PageBuilderHtmlPropertyButton.selector)}}" stepKey="waitForHtmlStage1"/>
69+
<executeJS function="return document.querySelectorAll('{{HtmlOnStage.baseCSS}}')[0].innerText;" stepKey="actualTextFromHtmlCode"/>
70+
<assertStringContainsString stepKey="assertButtonOnStage">
71+
<expectedResult type="string">{{PageBuilderHtmlPropertyButton.value}}</expectedResult>
72+
<actualResult type="variable">actualTextFromHtmlCode</actualResult>
73+
</assertStringContainsString>
74+
<actionGroup ref="exitPageBuilderFullScreen" stepKey="exitPageBuilderFullScreen"/>
75+
<actionGroup ref="SaveAndContinueEditCmsPageActionGroup" stepKey="saveAndContinueEditCmsPage"/>
76+
<actionGroup ref="switchToPageBuilderStage" stepKey="switchToPageBuilderStage"/>
77+
<!-- Validate Stage After Save -->
78+
<comment userInput="Validate Stage After Save" stepKey="commentValidateStage2"/>
79+
<waitForElementVisible selector="{{HtmlOnStage.base('1')}}" stepKey="waitForHtmlBaseStage2"/>
80+
<waitForElementVisible selector="{{HtmlOnStage.html('1', PageBuilderHtmlPropertyButton.selector)}}" stepKey="waitForHtmlStage2"/>
81+
<executeJS function="return document.querySelectorAll('{{HtmlOnStage.baseCSS}}')[0].innerText;" stepKey="actualTextFromHtmlCodeAfterSave"/>
82+
<actionGroup ref="openPageBuilderEditPanel" stepKey="openEditMenuOnStage2">
83+
<argument name="contentType" value="PageBuilderHtmlContentType"/>
84+
</actionGroup>
85+
<!-- Validate Edit Panel After Save -->
86+
<comment userInput="Validate Edit Panel After Save" stepKey="commentValidateEditPanel2"/>
87+
<actionGroup ref="NavigateToStorefrontForCreatedPageActionGroup" stepKey="navigateToCMSPageStorefront">
88+
<argument name="page" value="$$createCMSPage.identifier$$"/>
89+
</actionGroup>
90+
<!-- Validate Storefront -->
91+
<comment userInput="Validate Storefront" stepKey="commentValidateStorefront"/>
92+
<waitForElementVisible selector="{{HtmlOnStorefront.base('1')}}" stepKey="waitForHtmlBaseStorefront"/>
93+
<waitForElementVisible selector="{{HtmlOnStorefront.html('1', PageBuilderHtmlPropertyButton.selectorOnFrontend)}}" stepKey="waitForHtmlStorefront"/>
94+
</test>
95+
</tests>

app/code/Magento/PageBuilder/view/adminhtml/ui_component/pagebuilder_html_form.xml

100755100644
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@
8787
</additionalClasses>
8888
<dataScope>html</dataScope>
8989
<dataType>text</dataType>
90+
<validation>
91+
<rule name="validate-no-utf8mb4-characters" xsi:type="boolean">true</rule>
92+
</validation>
9093
<placeholder translate="true">Enter HTML, CSS or JavaScript code</placeholder>
9194
<notice translate="true">HTML code must be valid, all CSS &amp; JavaScript must be wrapped in their HTML elements.</notice>
9295
</settings>

0 commit comments

Comments
 (0)