diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig
index 5ff45d44cbdca..97c75ee7d30bc 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig
+++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig
@@ -38,6 +38,15 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
};
}
+ if (navigator.clipboard) {
+ document.querySelectorAll('[data-clipboard-text]').forEach(function(element) {
+ removeClass(element, 'hidden');
+ element.addEventListener('click', function() {
+ navigator.clipboard.writeText(element.getAttribute('data-clipboard-text'));
+ })
+ });
+ }
+
var request = function(url, onSuccess, onError, payload, options, tries) {
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
options = options || {};
@@ -705,6 +714,14 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') {
});
}
+ /* Prevents from disallowing clicks on "copy to clipboard" elements inside toggles */
+ var copyToClipboardElements = toggles[i].querySelectorAll('span[data-clipboard-text]')
+ for (var k = 0; k < copyToClipboardElements.length; k++) {
+ addEventListener(copyToClipboardElements[k], 'click', function(e) {
+ e.stopPropagation();
+ });
+ }
+
toggles[i].setAttribute('data-processed', 'true');
}
},
diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css
index 5822ea2043eb4..a6e23cb6f073e 100644
--- a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css
+++ b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css
@@ -227,6 +227,8 @@ header .container { display: flex; justify-content: space-between; }
.trace-line a { color: var(--base-6); }
.trace-line .icon { opacity: .4; position: absolute; left: 10px; top: 11px; }
.trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; }
+.trace-line .icon.icon-copy { left: auto; top: auto; padding-left: 5px; display: none }
+.trace-line:hover .icon.icon-copy:not(.hidden) { display: inline-block }
.trace-line-header { padding-left: 36px; padding-right: 10px; }
.trace-file-path, .trace-file-path a { color: var(--base-6); font-size: 13px; }
diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg b/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg
new file mode 100644
index 0000000000000..844a4f99e3b02
--- /dev/null
+++ b/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js
index 0720a3a358aac..d22995b429c62 100644
--- a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js
+++ b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js
@@ -30,6 +30,15 @@ if (typeof Sfjs === 'undefined') {
};
}
+ if (navigator.clipboard) {
+ document.querySelectorAll('[data-clipboard-text]').forEach(function(element) {
+ removeClass(element, 'hidden');
+ element.addEventListener('click', function() {
+ navigator.clipboard.writeText(element.getAttribute('data-clipboard-text'));
+ })
+ });
+ }
+
return {
addEventListener: addEventListener,
@@ -166,6 +175,14 @@ if (typeof Sfjs === 'undefined') {
});
}
+ /* Prevents from disallowing clicks on "copy to clipboard" elements inside toggles */
+ var copyToClipboardElements = toggles[i].querySelectorAll('span[data-clipboard-text]')
+ for (var k = 0; k < copyToClipboardElements.length; k++) {
+ addEventListener(copyToClipboardElements[k], 'click', function(e) {
+ e.stopPropagation();
+ });
+ }
+
toggles[i].setAttribute('data-processed', 'true');
}
},
diff --git a/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php b/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php
index 6b4261f3f4e15..8dfdb4ec8e849 100644
--- a/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php
+++ b/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php
@@ -25,6 +25,9 @@
= $trace['function']; ?>
(line = $lineNumber; ?>)
+
+ include('assets/images/icon-copy.svg'); ?>
+