From ee229278e63db5466abd1866167db093b4b0187f Mon Sep 17 00:00:00 2001
From: Igor Melnikov <imelnikov@ebay.com>
Date: Wed, 13 Jul 2016 22:55:58 -0500
Subject: [PATCH] MAGETWO-54849: Refactor \Magento\Framework\Url::escape to use
 \Magento\Framework\Escaper::escapeUrl

Refactoring Url class
---
 .../Widget/Instance/Edit/Tab/Settings.php       |  7 ++++++-
 lib/internal/Magento/Framework/Url.php          |  8 ++++++++
 .../Framework/Url/RouteParamsResolver.php       | 17 ++++++++++++++---
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
index 4a01f5e12a7..2e7b376fe7d 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
@@ -170,7 +170,12 @@ class Settings extends \Magento\Backend\Block\Widget\Form\Generic implements
     {
         return $this->getUrl(
             'adminhtml/*/*',
-            ['_current' => true, 'code' => '<%- data.code %>', 'theme_id' => '<%- data.theme_id %>']
+            [
+                '_current' => true,
+                'code' => '<%- data.code %>',
+                'theme_id' => '<%- data.theme_id %>',
+                '_escape_params' => false
+            ]
         );
     }
 
diff --git a/lib/internal/Magento/Framework/Url.php b/lib/internal/Magento/Framework/Url.php
index a4bd3dd2ecc..1e5de34ad27 100644
--- a/lib/internal/Magento/Framework/Url.php
+++ b/lib/internal/Magento/Framework/Url.php
@@ -867,6 +867,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
     private function createUrl($routePath = null, array $routeParams = null)
     {
         $escapeQuery = false;
+        $escapeParams = true;
 
         /**
          * All system params should be unset before we call getRouteUrl
@@ -885,6 +886,12 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
             unset($routeParams['_escape']);
         }
 
+        if (isset($routeParams['_escape_params'])) {
+            $escapeParams = $routeParams['_escape_params'];
+            unset($routeParams['_escape_params']);
+        }
+        $this->getRouteParamsResolver()->setData('escape_params', $escapeParams);
+
         $query = null;
         if (isset($routeParams['_query'])) {
             $this->_queryParamsResolver->setQueryParams([]);
@@ -929,6 +936,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
             $url .= '#' . $this->getEscaper()->escapeUrl($fragment);
         }
         $this->getRouteParamsResolver()->unsetData('secure');
+        $this->getRouteParamsResolver()->unsetData('escape_params');
 
         return $url;
     }
diff --git a/lib/internal/Magento/Framework/Url/RouteParamsResolver.php b/lib/internal/Magento/Framework/Url/RouteParamsResolver.php
index 9d84307d281..3c37ef27a7a 100644
--- a/lib/internal/Magento/Framework/Url/RouteParamsResolver.php
+++ b/lib/internal/Magento/Framework/Url/RouteParamsResolver.php
@@ -93,7 +93,7 @@ class RouteParamsResolver extends \Magento\Framework\DataObject implements Route
                     if (array_key_exists($key, $data) || $this->getRouteParam($key)) {
                         continue;
                     }
-                    $data[$this->getEscaper()->escapeUrl($key)] = $this->getEscaper()->escapeUrl($value);
+                    $data[$key] = $value;
                 }
                 foreach ($this->request->getQuery() as $key => $value) {
                     $this->queryParamsResolver->setQueryParam($key, $value);
@@ -111,9 +111,20 @@ class RouteParamsResolver extends \Magento\Framework\DataObject implements Route
                 $this->setRouteParam($key, $value);
             } else {
                 if (is_object($value)) {
-                    $this->setRouteParam($this->getEscaper()->escapeUrl($key), $value);
+                    if ($this->getData('escape_params')) {
+                        $this->setRouteParam($this->getEscaper()->escapeUrl($key), $value);
+                    } else {
+                        $this->setRouteParam($key, $value);
+                    }
                 } else {
-                    $this->setRouteParam($this->getEscaper()->escapeUrl($key), $this->getEscaper()->escapeUrl($value));
+                    if ($this->getData('escape_params')) {
+                        $this->setRouteParam(
+                            $this->getEscaper()->escapeUrl($key),
+                            $this->getEscaper()->escapeUrl($value)
+                        );
+                    } else {
+                        $this->setRouteParam($key, $value);
+                    }
                 }
             }
         }
-- 
GitLab