diff --git a/README.md b/README.md
index c292f1100f336..979e60a167748 100644
--- a/README.md
+++ b/README.md
@@ -6,11 +6,11 @@
Welcome to Magento 2 installation! We're glad you chose to install Magento 2, a cutting-edge, feature-rich eCommerce solution that gets results.
## Magento system requirements
-[Magento system requirements](http://devdocs.magento.com/guides/v2.3/install-gde/system-requirements2.html).
+[Magento system requirements](https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements2.html).
## Install Magento
-* [Installation guide](http://devdocs.magento.com/guides/v2.3/install-gde/bk-install-guide.html).
+* [Installation guide](https://devdocs.magento.com/guides/v2.3/install-gde/bk-install-guide.html).
Contributing to the Magento 2 code base
Contributions can take the form of new components or features, changes to existing features, tests, documentation (such as developer guides, user guides, examples, or specifications), bug fixes, optimizations, or just good suggestions.
@@ -21,10 +21,10 @@ To learn about issues, click [here][2]. To open an issue, click [here][3].
To suggest documentation improvements, click [here][4].
-[1]:
-[2]:
+[1]:
+[2]:
[3]:
-[4]:
+[4]:
Community Maintainers
The members of this team have been recognized for their outstanding commitment to maintaining and improving Magento. Magento has granted them permission to accept, merge, and reject pull requests, as well as review issues, and thanks these Community Maintainers for their valuable contributions.
@@ -53,9 +53,9 @@ Stay up-to-date on the latest security news and patches for Magento by signing u
Each Magento source file included in this distribution is licensed under OSL 3.0 or the Magento Enterprise Edition (MEE) license.
-http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
-Please see LICENSE.txt for the full text of the OSL 3.0 license or contact license@magentocommerce.com for a copy.
+[Open Software License (OSL 3.0)](https://opensource.org/licenses/osl-3.0.php).
+Please see [LICENSE.txt](https://github.com/magento/magento2/blob/2.3-develop/LICENSE.txt) for the full text of the OSL 3.0 license or contact license@magentocommerce.com for a copy.
Subject to Licensee's payment of fees and compliance with the terms and conditions of the MEE License, the MEE License supersedes the OSL 3.0 license for each source file.
-Please see LICENSE_EE.txt for the full text of the MEE License or visit http://magento.com/legal/terms/enterprise.
+Please see LICENSE_EE.txt for the full text of the MEE License or visit https://magento.com/legal/terms/enterprise.
diff --git a/app/code/Magento/AdminNotification/Block/Window.php b/app/code/Magento/AdminNotification/Block/Window.php
index 9563626ee2577..e9b4bfa44893d 100644
--- a/app/code/Magento/AdminNotification/Block/Window.php
+++ b/app/code/Magento/AdminNotification/Block/Window.php
@@ -8,6 +8,8 @@
namespace Magento\AdminNotification\Block;
/**
+ * Admin notification window block
+ *
* @api
* @since 100.0.2
*/
@@ -40,7 +42,7 @@ class Window extends \Magento\Backend\Block\Template
protected $_criticalCollection;
/**
- * @var \Magento\Adminnotification\Model\Inbox
+ * @var \Magento\AdminNotification\Model\Inbox
*/
protected $_latestItem;
@@ -92,7 +94,7 @@ protected function _toHtml()
/**
* Retrieve latest critical item
*
- * @return bool|\Magento\Adminnotification\Model\Inbox
+ * @return bool|\Magento\AdminNotification\Model\Inbox
*/
protected function _getLatestItem()
{
diff --git a/app/code/Magento/AdminNotification/etc/db_schema.xml b/app/code/Magento/AdminNotification/etc/db_schema.xml
index 35e6045b607d1..29d928ced2084 100644
--- a/app/code/Magento/AdminNotification/etc/db_schema.xml
+++ b/app/code/Magento/AdminNotification/etc/db_schema.xml
@@ -21,16 +21,16 @@
default="0" comment="Flag if notification read"/>
-
+
-
+
-
+
-
+
@@ -40,7 +40,7 @@
default="0" comment="Problem type"/>
-
+
diff --git a/app/code/Magento/AdvancedSearch/etc/db_schema.xml b/app/code/Magento/AdvancedSearch/etc/db_schema.xml
index 9fae40411098c..2dd8c68e2d5fd 100644
--- a/app/code/Magento/AdvancedSearch/etc/db_schema.xml
+++ b/app/code/Magento/AdvancedSearch/etc/db_schema.xml
@@ -14,13 +14,13 @@
default="0" comment="Query Id"/>
-
+
-
-
diff --git a/app/code/Magento/AsynchronousOperations/etc/db_schema.xml b/app/code/Magento/AsynchronousOperations/etc/db_schema.xml
index 342326e6666f1..5cd55408838fe 100644
--- a/app/code/Magento/AsynchronousOperations/etc/db_schema.xml
+++ b/app/code/Magento/AsynchronousOperations/etc/db_schema.xml
@@ -21,13 +21,13 @@
comment="Total number of operations scheduled within this bulk"/>
-
+
-
+
-
+
@@ -47,12 +47,12 @@
comment="Code of the error that appeared during operation execution (used to aggregate related failed operations)"/>
-
+
-
-
+
@@ -62,13 +62,13 @@
-
+
-
-
+
diff --git a/app/code/Magento/AsynchronousOperations/etc/db_schema_whitelist.json b/app/code/Magento/AsynchronousOperations/etc/db_schema_whitelist.json
index 423b7553ced2a..9b6c0709e1916 100644
--- a/app/code/Magento/AsynchronousOperations/etc/db_schema_whitelist.json
+++ b/app/code/Magento/AsynchronousOperations/etc/db_schema_whitelist.json
@@ -15,7 +15,8 @@
},
"constraint": {
"PRIMARY": true,
- "MAGENTO_BULK_UUID": true
+ "MAGENTO_BULK_UUID": true,
+ "MAGENTO_BULK_USER_ID_ADMIN_USER_USER_ID": true
}
},
"magento_operation": {
diff --git a/app/code/Magento/Authorization/etc/db_schema.xml b/app/code/Magento/Authorization/etc/db_schema.xml
index 45c02128bfc99..a38828eb6efca 100644
--- a/app/code/Magento/Authorization/etc/db_schema.xml
+++ b/app/code/Magento/Authorization/etc/db_schema.xml
@@ -21,14 +21,14 @@
comment="User ID"/>
-
+
-
+
-
+
@@ -40,17 +40,17 @@
-
+
-
-
+
-
+
diff --git a/app/code/Magento/Backend/view/adminhtml/web/js/validate-store.js b/app/code/Magento/Backend/view/adminhtml/web/js/validate-store.js
index 0a692a9b868cc..c2a0d4dab1fb3 100644
--- a/app/code/Magento/Backend/view/adminhtml/web/js/validate-store.js
+++ b/app/code/Magento/Backend/view/adminhtml/web/js/validate-store.js
@@ -67,6 +67,7 @@ define([
* 'Confirm' action handler.
*/
confirm: function () {
+ $('body').trigger('processStart');
dataPost().postData(requestData);
}
}
diff --git a/app/code/Magento/Braintree/Controller/Paypal/Review.php b/app/code/Magento/Braintree/Controller/Paypal/Review.php
index ca252aabe54a9..14ec829d98024 100644
--- a/app/code/Magento/Braintree/Controller/Paypal/Review.php
+++ b/app/code/Magento/Braintree/Controller/Paypal/Review.php
@@ -12,11 +12,12 @@
use Magento\Braintree\Gateway\Config\PayPal\Config;
use Magento\Braintree\Model\Paypal\Helper\QuoteUpdater;
use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\App\Action\HttpPostActionInterface;
/**
* Class Review
*/
-class Review extends AbstractAction
+class Review extends AbstractAction implements HttpPostActionInterface
{
/**
* @var QuoteUpdater
@@ -60,7 +61,7 @@ public function execute()
try {
$this->validateQuote($quote);
- if ($this->validateRequestData($requestData)) {
+ if ($requestData && $this->validateRequestData($requestData)) {
$this->quoteUpdater->execute(
$requestData['nonce'],
$requestData['details'],
@@ -91,6 +92,8 @@ public function execute()
}
/**
+ * Validate request data
+ *
* @param array $requestData
* @return boolean
*/
diff --git a/app/code/Magento/Bundle/etc/db_schema.xml b/app/code/Magento/Bundle/etc/db_schema.xml
index f1c1e7ae782dc..33738cd252d61 100644
--- a/app/code/Magento/Bundle/etc/db_schema.xml
+++ b/app/code/Magento/Bundle/etc/db_schema.xml
@@ -18,13 +18,13 @@
-
+
-
-
+
@@ -39,13 +39,13 @@
-
+
-
-
+
@@ -73,19 +73,19 @@
comment="Selection Qty"/>
-
+
-
-
-
+
-
+
@@ -101,19 +101,19 @@
nullable="false" default="0" comment="Selection Price Value"/>
-
+
-
-
-
+
@@ -129,24 +129,24 @@
comment="Min Price"/>
-
+
-
-
-
-
+
-
+
@@ -162,7 +162,7 @@
default="0" comment="Option Id"/>
-
+
@@ -197,7 +197,7 @@
comment="Tier Price"/>
-
+
@@ -231,7 +231,7 @@
comment="Tier Price"/>
-
+
@@ -257,7 +257,7 @@
comment="Price"/>
-
+
@@ -285,7 +285,7 @@
comment="Price"/>
-
+
@@ -313,7 +313,7 @@
comment="Tier Price"/>
-
+
@@ -340,7 +340,7 @@
comment="Tier Price"/>
-
+
diff --git a/app/code/Magento/Captcha/etc/db_schema.xml b/app/code/Magento/Captcha/etc/db_schema.xml
index fa9a14abb8963..b8987363569ca 100644
--- a/app/code/Magento/Captcha/etc/db_schema.xml
+++ b/app/code/Magento/Captcha/etc/db_schema.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/app/code/Magento/Catalog/Model/FilterProductCustomAttribute.php b/app/code/Magento/Catalog/Model/FilterProductCustomAttribute.php
index b83bb97301b9c..497ed2fd49953 100644
--- a/app/code/Magento/Catalog/Model/FilterProductCustomAttribute.php
+++ b/app/code/Magento/Catalog/Model/FilterProductCustomAttribute.php
@@ -27,11 +27,12 @@ public function __construct(array $blackList = [])
/**
* Delete custom attribute
- * @param array $attributes
+ *
+ * @param array $attributes set objects attributes @example ['attribute_code'=>'attribute_object']
* @return array
*/
public function execute(array $attributes): array
{
- return array_diff($attributes, $this->blackList);
+ return array_diff_key($attributes, array_flip($this->blackList));
}
}
diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index cf6b509822ad3..44c5c891f4d6a 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -512,13 +512,17 @@ protected function _getResource()
protected function getCustomAttributesCodes()
{
if ($this->customAttributesCodes === null) {
- $this->customAttributesCodes = array_keys($this->eavConfig->getEntityAttributes(
- self::ENTITY,
- $this
- ));
-
- $this->customAttributesCodes = $this->filterCustomAttribute->execute($this->customAttributesCodes);
- $this->customAttributesCodes = array_diff($this->customAttributesCodes, ProductInterface::ATTRIBUTES);
+ $this->customAttributesCodes = array_diff(
+ array_keys(
+ $this->filterCustomAttribute->execute(
+ $this->eavConfig->getEntityAttributes(
+ self::ENTITY,
+ $this
+ )
+ )
+ ),
+ ProductInterface::ATTRIBUTES
+ );
}
return $this->customAttributesCodes;
@@ -596,7 +600,6 @@ public function getPrice()
* @see \Magento\Catalog\Model\Product\Visibility
*
* @return int
- * @codeCoverageIgnoreStart
*/
public function getVisibility()
{
@@ -1053,7 +1056,7 @@ public function reindex()
*
* Register indexing event before delete product
*
- * @return $this
+ * @return \Magento\Catalog\Model\Product
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function beforeDelete()
@@ -1567,6 +1570,7 @@ public function hasGalleryAttribute()
* @param bool $move if true, it will move source file
* @param bool $exclude mark image as disabled in product page view
* @return \Magento\Catalog\Model\Product
+ * @throws \Magento\Framework\Exception\LocalizedException
*/
public function addImageToMediaGallery($file, $mediaAttribute = null, $move = false, $exclude = true)
{
@@ -1818,7 +1822,7 @@ public function formatUrlKey($str)
/**
* Save current attribute with code $code and assign new value
*
- * @param string $code Attribute code
+ * @param string $code Attribute code
* @param mixed $value New attribute value
* @param int $store Store ID
* @return void
@@ -2230,9 +2234,9 @@ public function getPreconfiguredValues()
}
/**
- * Prepare product custom options
+ * Prepare product custom options.
*
- * To be sure that all product custom options does not has ID and has product instance.
+ * To be sure that all product custom options does not has ID and has product instance
*
* @return \Magento\Catalog\Model\Product
*/
@@ -2568,7 +2572,7 @@ public function setTypeId($typeId)
/**
* @inheritdoc
*
- * @return \Magento\Catalog\Api\Data\ProductExtensionInterface
+ * @return \Magento\Framework\Api\ExtensionAttributesInterface
*/
public function getExtensionAttributes()
{
@@ -2609,7 +2613,7 @@ protected function convertToMediaGalleryInterface(array $mediaGallery)
}
/**
- * Returns media gallery entries
+ * Get media gallery entries
*
* @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface[]|null
* @throws \Magento\Framework\Exception\LocalizedException
@@ -2671,7 +2675,7 @@ public function setId($value)
}
/**
- * Returns link repository instance
+ * Get link repository
*
* @return ProductLinkRepositoryInterface
*/
@@ -2685,7 +2689,7 @@ private function getLinkRepository()
}
/**
- * Returns media gallery processor instance
+ * Get media gallery processor
*
* @return Product\Gallery\Processor
*/
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ExistingValidate.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ExistingValidate.php
new file mode 100644
index 0000000000000..c9afdf023b307
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ExistingValidate.php
@@ -0,0 +1,52 @@
+_messages = [];
+ $this->_errors = [];
+
+ if (!is_string($value)) {
+ $this->_messages[] = __('Full file path is expected.')->render();
+ return false;
+ }
+
+ $result = true;
+ $fileInfo = null;
+ if ($originalName) {
+ $fileInfo = ['name' => $originalName];
+ }
+ foreach ($this->_validators as $element) {
+ $validator = $element['instance'];
+ if ($validator->isValid($value, $fileInfo)) {
+ continue;
+ }
+ $result = false;
+ $messages = $validator->getMessages();
+ $this->_messages = array_merge($this->_messages, $messages);
+ $this->_errors = array_merge($this->_errors, array_keys($messages));
+ if ($element['breakChainOnFailure']) {
+ break;
+ }
+ }
+ return $result;
+ }
+}
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidateFactory.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidateFactory.php
index 32c901afe8e74..a7add0ad87b89 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidateFactory.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidateFactory.php
@@ -6,13 +6,18 @@
namespace Magento\Catalog\Model\Product\Option\Type\File;
+/**
+ * Class ValidateFactory. Creates Validator with type "ExistingValidate"
+ */
class ValidateFactory
{
/**
+ * Main factory method
+ *
* @return \Zend_Validate
*/
public function create()
{
- return new \Zend_Validate();
+ return new ExistingValidate();
}
}
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
index d6a5cb1cbc29d..fef4999a1174a 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php
@@ -10,8 +10,12 @@
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Catalog\Model\Product\Exception as ProductException;
use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Math\Random;
+use Magento\Framework\App\ObjectManager;
/**
+ * Validator class. Represents logic for validation file given from product option
+ *
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class ValidatorFile extends Validator
@@ -63,11 +67,19 @@ class ValidatorFile extends Validator
protected $isImageValidator;
/**
+ * @var Random
+ */
+ private $random;
+
+ /**
+ * Constructor method
+ *
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\Framework\File\Size $fileSize
* @param \Magento\Framework\HTTP\Adapter\FileTransferFactory $httpFactory
* @param \Magento\Framework\Validator\File\IsImage $isImageValidator
+ * @param Random|null $random
* @throws \Magento\Framework\Exception\FileSystemException
*/
public function __construct(
@@ -75,16 +87,21 @@ public function __construct(
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\File\Size $fileSize,
\Magento\Framework\HTTP\Adapter\FileTransferFactory $httpFactory,
- \Magento\Framework\Validator\File\IsImage $isImageValidator
+ \Magento\Framework\Validator\File\IsImage $isImageValidator,
+ Random $random = null
) {
$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$this->filesystem = $filesystem;
$this->httpFactory = $httpFactory;
$this->isImageValidator = $isImageValidator;
+ $this->random = $random
+ ?? ObjectManager::getInstance()->get(Random::class);
parent::__construct($scopeConfig, $filesystem, $fileSize);
}
/**
+ * Setter method for the product
+ *
* @param Product $product
* @return $this
*/
@@ -95,6 +112,8 @@ public function setProduct(Product $product)
}
/**
+ * Validation method
+ *
* @param \Magento\Framework\DataObject $processingParams
* @param \Magento\Catalog\Model\Product\Option $option
* @return array
@@ -154,8 +173,6 @@ public function validate($processingParams, $option)
$userValue = [];
if ($upload->isUploaded($file) && $upload->isValid($file)) {
- $extension = pathinfo(strtolower($fileInfo['name']), PATHINFO_EXTENSION);
-
$fileName = \Magento\MediaStorage\Model\File\Uploader::getCorrectFileName($fileInfo['name']);
$dispersion = \Magento\MediaStorage\Model\File\Uploader::getDispersionPath($fileName);
@@ -163,7 +180,8 @@ public function validate($processingParams, $option)
$tmpDirectory = $this->filesystem->getDirectoryRead(DirectoryList::SYS_TMP);
$fileHash = md5($tmpDirectory->readFile($tmpDirectory->getRelativePath($fileInfo['tmp_name'])));
- $filePath .= '/' . $fileHash . '.' . $extension;
+ $fileRandomName = $this->random->getRandomString(32);
+ $filePath .= '/' .$fileRandomName;
$fileFullPath = $this->mediaDirectory->getAbsolutePath($this->quotePath . $filePath);
$upload->addFilter(new \Zend_Filter_File_Rename(['target' => $fileFullPath, 'overwrite' => true]));
@@ -243,6 +261,8 @@ protected function initFilesystem()
}
/**
+ * Validate contents length method
+ *
* @return bool
* @todo need correctly name
*/
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php
index 37e4c7b310a81..100ad37273cff 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorInfo.php
@@ -6,6 +6,9 @@
namespace Magento\Catalog\Model\Product\Option\Type\File;
+/**
+ * Validator for existing files.
+ */
class ValidatorInfo extends Validator
{
/**
@@ -34,6 +37,8 @@ class ValidatorInfo extends Validator
protected $fileRelativePath;
/**
+ * Construct method
+ *
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\Framework\File\Size $fileSize
@@ -53,6 +58,8 @@ public function __construct(
}
/**
+ * Setter method for property "useQuotePath"
+ *
* @param mixed $useQuotePath
* @return $this
*/
@@ -63,6 +70,8 @@ public function setUseQuotePath($useQuotePath)
}
/**
+ * Validate method for the option value depends on an option
+ *
* @param array $optionValue
* @param \Magento\Catalog\Model\Product\Option $option
* @return bool
@@ -90,7 +99,7 @@ public function validate($optionValue, $option)
}
$result = false;
- if ($validatorChain->isValid($this->fileFullPath)) {
+ if ($validatorChain->isValid($this->fileFullPath, $optionValue['title'])) {
$result = $this->rootDirectory->isReadable($this->fileRelativePath)
&& isset($optionValue['secret_key'])
&& $this->buildSecretKey($this->fileRelativePath) == $optionValue['secret_key'];
@@ -109,6 +118,8 @@ public function validate($optionValue, $option)
}
/**
+ * Method for creation secret key for the given file
+ *
* @param string $fileRelativePath
* @return string
*/
@@ -118,6 +129,8 @@ protected function buildSecretKey($fileRelativePath)
}
/**
+ * Calculates path for the file
+ *
* @param array $optionValue
* @return void
*/
diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductAttributeActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductAttributeActionGroup.xml
index 73025023c23c8..903526a862225 100644
--- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductAttributeActionGroup.xml
+++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductAttributeActionGroup.xml
@@ -42,4 +42,11 @@
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml
new file mode 100644
index 0000000000000..a2391dda54809
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Data/ImageData.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ adobe-base.jpg
+ adobe-base
+ jpg
+
+
+
+ adobe-small.jpg
+ adobe-small
+ jpg
+
+
+
+ adobe-thumb.jpg
+ adobe-thumb
+ jpg
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCategoryBasicFieldSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCategoryBasicFieldSection.xml
index 8b69a44993f17..9a0dd8f5b387d 100644
--- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCategoryBasicFieldSection.xml
+++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCategoryBasicFieldSection.xml
@@ -32,6 +32,13 @@
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml
index 17778c76da9b9..78d06afa7f003 100644
--- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml
+++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml
@@ -23,6 +23,9 @@
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductAttributeOptionsSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductAttributeOptionsSection.xml
new file mode 100644
index 0000000000000..0f438540603d0
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductAttributeOptionsSection.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductImagePlaceholderConfigSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductImagePlaceholderConfigSection.xml
new file mode 100644
index 0000000000000..7558b13d624bb
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductImagePlaceholderConfigSection.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontMiniCartSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontMiniCartSection.xml
new file mode 100644
index 0000000000000..ff2e5f2f36015
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontMiniCartSection.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml
index d8f6bc3e4a749..d38a8e4190c82 100644
--- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml
+++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml
@@ -50,9 +50,9 @@
-
+
-
+
@@ -63,7 +63,7 @@
-
+
@@ -75,10 +75,12 @@
+
+
-
+
@@ -87,7 +89,7 @@
-
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminConfigureProductImagePlaceholderTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminConfigureProductImagePlaceholderTest.xml
new file mode 100644
index 0000000000000..4d97dee56f059
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminConfigureProductImagePlaceholderTest.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $getSmallPlaceholderImageSrc
+ {{placeholderSmallImage.name}}
+
+
+
+
+
+ $getSmallNonPlaceholderImageSrc
+ {{placeholderSmallImage.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $getThumbnailPlaceholderImageSrc
+ {{placeholderThumbnailImage.name}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $getThumbnailImageSrc
+ {{placeholderThumbnailImage.name}}
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateCategoryTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateCategoryTest.xml
index bfb9557910642..8806612c0f5de 100644
--- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateCategoryTest.xml
+++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateCategoryTest.xml
@@ -69,4 +69,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateDropdownProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateDropdownProductAttributeTest.xml
new file mode 100644
index 0000000000000..525f81de6c48c
--- /dev/null
+++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateDropdownProductAttributeTest.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/code/Magento/Catalog/etc/db_schema.xml b/app/code/Magento/Catalog/etc/db_schema.xml
index 860e5fee9f157..a366065c89e76 100644
--- a/app/code/Magento/Catalog/etc/db_schema.xml
+++ b/app/code/Magento/Catalog/etc/db_schema.xml
@@ -22,13 +22,13 @@
comment="Creation Time"/>
-
+
-
+
-
+
@@ -43,27 +43,27 @@
-
+
-
-
-
-
+
-
+
-
+
@@ -79,27 +79,27 @@
default="0" comment="Entity ID"/>
-
+
-
-
-
-
+
-
+
-
+
@@ -115,27 +115,27 @@
default="0" comment="Entity ID"/>
-
+
-
-
-
-
+
-
+
-
+
@@ -150,27 +150,27 @@
-
+
-
-
-
-
+
-
+
-
+
@@ -185,27 +185,27 @@
-
+
-
-
-
-
+
-
+
-
+
@@ -222,30 +222,30 @@
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -267,13 +267,13 @@
comment="Tree Level"/>
-
+
-
+
-
+
@@ -288,30 +288,30 @@
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -327,30 +327,30 @@
default="0" comment="Entity ID"/>
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -366,30 +366,30 @@
default="0" comment="Entity ID"/>
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -404,30 +404,30 @@
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -442,30 +442,30 @@
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -479,22 +479,22 @@
default="0" comment="Product ID"/>
-
+
-
-
-
+
-
+
@@ -512,18 +512,18 @@
default="0" comment="Store ID"/>
-
+
-
+
-
+
@@ -542,29 +542,29 @@
default="0" comment="Product ID"/>
-
+
-
-
-
-
+
-
+
-
+
-
+
@@ -574,17 +574,17 @@
comment="Product ID"/>
-
+
-
-
-
+
@@ -593,7 +593,7 @@
-
+
@@ -607,27 +607,27 @@
default="0" comment="Linked Product ID"/>
-
+
-
-
-
-
+
-
+
-
+
@@ -640,13 +640,13 @@
-
+
-
-
+
@@ -660,21 +660,21 @@
comment="Link ID"/>
-
+
-
-
-
+
-
+
@@ -688,21 +688,21 @@
comment="Link ID"/>
-
+
-
-
-
+
-
+
@@ -715,21 +715,21 @@
-
+
-
-
-
+
-
+
@@ -751,29 +751,29 @@
comment="Website ID"/>
-
+
-
-
-
-
+
-
+
-
+
@@ -788,13 +788,13 @@
comment="Media entry type"/>
-
+
-
-
+
@@ -813,26 +813,26 @@
default="0" comment="Is Disabled"/>
-
+
-
-
-
-
+
-
+
-
+
@@ -854,13 +854,13 @@
comment="Image Size Y"/>
-
+
-
-
+
@@ -875,20 +875,20 @@
-
+
-
-
-
+
-
+
@@ -901,20 +901,20 @@
-
+
-
-
-
+
-
+
@@ -927,13 +927,13 @@
-
+
-
-
+
@@ -948,21 +948,21 @@
-
+
-
-
-
+
-
+
@@ -975,21 +975,21 @@
-
+
-
-
-
+
-
+
@@ -1037,16 +1037,16 @@
identity="false" default="0" comment="Is Visible in Grid"/>
-
+
-
-
+
-
+
@@ -1055,17 +1055,17 @@
comment="Parent ID"/>
-
+
-
-
-
+
@@ -1081,20 +1081,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1110,20 +1110,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1147,18 +1147,18 @@
comment="Max Price"/>
-
+
-
+
-
+
-
+
@@ -1174,24 +1174,24 @@
comment="Website ID"/>
-
+
-
-
-
-
+
-
+
@@ -1203,12 +1203,12 @@
comment="Default store id for website"/>
-
+
-
-
+
@@ -1226,7 +1226,7 @@
comment="Price"/>
-
+
@@ -1247,7 +1247,7 @@
comment="Price"/>
-
+
@@ -1268,7 +1268,7 @@
comment="Max Price"/>
-
+
@@ -1288,7 +1288,7 @@
comment="Max Price"/>
-
+
@@ -1316,7 +1316,7 @@
comment="Tier Price"/>
-
+
@@ -1344,7 +1344,7 @@
comment="Tier Price"/>
-
+
@@ -1364,7 +1364,7 @@
comment="Max Price"/>
-
+
@@ -1384,7 +1384,7 @@
comment="Max Price"/>
-
+
@@ -1406,7 +1406,7 @@
comment="Max Price"/>
-
+
@@ -1429,7 +1429,7 @@
comment="Max Price"/>
-
+
@@ -1448,20 +1448,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1477,20 +1477,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1506,20 +1506,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1535,20 +1535,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1572,18 +1572,18 @@
comment="Max Price"/>
-
+
-
+
-
+
-
+
@@ -1607,18 +1607,18 @@
comment="Max Price"/>
-
+
-
+
-
+
-
+
@@ -1636,12 +1636,12 @@
default="0" comment="Store ID"/>
-
+
-
+
@@ -1653,14 +1653,14 @@
comment="Value media Entry ID"/>
-
-
-
+
@@ -1677,20 +1677,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1706,20 +1706,20 @@
comment="Value"/>
-
+
-
+
-
+
-
+
@@ -1743,18 +1743,18 @@
comment="Max Price"/>
-
+
-
+
-
+
-
+
@@ -1774,18 +1774,18 @@
default="0" comment="Store ID"/>
-
+