merged branch vicb/profiler/pages (PR #3281)

Commits
-------

0d4d7e0 [WebProfilerBundle] Make the toolbar use the common JS
a440279 [WebProfilerBundle] Adds panel pages
762d90d [Profiler] Buid a common infrastructure

Discussion
----------

[Profiler] Provide a common infrastructure

former #3206 part 3

* base JS (provides ajax, toggle, css class helpers),
* panel pages (used only by the Doctrine panel for now).

Successfuly tested with the (future version of the) Doctrine panel.
This commit is contained in:
Fabien Potencier 2012-02-10 13:25:59 +01:00
commit 2a16171645
7 changed files with 92 additions and 17 deletions

View File

@ -36,6 +36,7 @@ class ProfilerController extends ContainerAware
$profiler->disable();
$panel = $this->container->get('request')->query->get('panel', 'request');
$page = $this->container->get('request')->query->get('page', 'home');
if (!$profile = $profiler->loadProfile($token)) {
return $this->container->get('templating')->renderResponse('WebProfilerBundle:Profiler:info.html.twig', array('about' => 'no_token', 'token' => $token));
@ -50,6 +51,7 @@ class ProfilerController extends ContainerAware
'profile' => $profile,
'collector' => $profile->getCollector($panel),
'panel' => $panel,
'page' => $page,
'templates' => $this->getTemplates($profiler),
));
}

View File

@ -450,3 +450,9 @@ td.main, td.menu {
#collector_content .routing tr.almost td {
background-color: #fa0;
}
.loading {
background: transparent url(../images/profiler/spinner.gif) scroll no-repeat 50% 50%;
height: 30px;
display: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
{% block panel '' %}

View File

@ -0,0 +1,72 @@
<script type="text/javascript">/*<![CDATA[*/
Sfjs = (function() {
"use strict";
var noop = function() {},
request = function(url, onSuccess, onError, payload, options) {
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
options = options || {};
xhr.open(options.method || 'GET', url, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function(state) {
if (4 === xhr.readyState && 200 === xhr.status) {
(onSuccess || noop)(xhr);
} else if (4 === xhr.readyState && xhr.status != 200) {
(onError || noop)(xhr);
}
};
xhr.send(payload || '');
},
hasClass = function(el, klass) {
return el.className.match(new RegExp('\\b' + klass + '\\b'));
},
removeClass = function(el, klass) {
el.className = el.className.replace(new RegExp('\\b' + klass + '\\b'), ' ');
},
addClass = function(el, klass) {
if (!hasClass(el, klass)) { el.className += " " + klass; }
};
return {
hasClass: hasClass,
removeClass: removeClass,
addClass: addClass,
request: request,
load: function(selector, url, onSuccess, onError, options) {
var el = document.querySelector(selector);
if (el && el.getAttribute('data-sfurl') !== url) {
request(
url,
function(xhr) {
el.innerHTML = xhr.responseText;
el.setAttribute('data-sfurl', url);
removeClass(el, 'loading');
(onSuccess || noop)(xhr, el);
},
function(xhr) { (onError || noop)(xhr, el); },
options
);
}
return this;
},
toggle: function(selector, elOn, elOff) {
var i,
style,
tmp = elOn.style.display,
els = document.querySelectorAll(selector);
elOn.style.display = elOff.style.display;
elOff.style.display = tmp;
if (els.length) {
style = 'none' === tmp ? 'none' : 'block';
for (i = els.length - 1; i >= 0; --i) {
els[i].style.display = style;
}
}
return this;
}
}
})();
/*]]>*/</script>

View File

@ -27,6 +27,7 @@
{% endif %}
<div id="collector_content">
{% include 'WebProfilerBundle:Profiler:base_js.html.twig' %}
{% block panel '' %}
</div>
</div>

View File

@ -1,23 +1,16 @@
<div id="sfwdt{{ token }}" class="sf-toolbar" style="display: none"></div>
{% include 'WebProfilerBundle:Profiler:base_js.html.twig' %}
<script type="text/javascript">/*<![CDATA[*/
(function () {
var wdt, xhr;
wdt = document.getElementById('sfwdt{{ token }}');
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.open('GET', '{{ path("_wdt", { "token": token }) }}', true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function(state) {
if (4 === xhr.readyState && 200 === xhr.status && -1 !== xhr.responseText.indexOf('sf-toolbarreset')) {
wdt.innerHTML = xhr.responseText;
wdt.style.display = 'block';
} else if (4 === xhr.readyState && xhr.status != 200) {
confirm('An error occurred while loading the web debug toolbar (' + xhr.status + ': ' + xhr.statusText + ').\n\nDo you want to open the profiler?') && (window.location = '{{ path("_profiler", { "token": token }) }}');
Sfjs.load(
'#sfwdt{{ token }}',
'{{ path("_wdt", { "token": token }) }}',
function(xhr, el) {
el.style.display = -1 !== xhr.responseText.indexOf('sf-toolbarreset') ? 'block' : 'none';
},
function(xhr) {
confirm('An error occurred while loading the web debug toolbar (' + xhr.status + ': ' + xhr.statusText + ').\n\nDo you want to open the profiler?') && (window.location = '{{ path("_profiler", { "token": token }) }}')
}
};
xhr.send('');
);
})();
/*]]>*/</script>