1579 lines
81 KiB
PHP
1579 lines
81 KiB
PHP
<?php
|
|
|
|
use Twig\Environment;
|
|
use Twig\Error\LoaderError;
|
|
use Twig\Error\RuntimeError;
|
|
use Twig\Extension\SandboxExtension;
|
|
use Twig\Markup;
|
|
use Twig\Sandbox\SecurityError;
|
|
use Twig\Sandbox\SecurityNotAllowedTagError;
|
|
use Twig\Sandbox\SecurityNotAllowedFilterError;
|
|
use Twig\Sandbox\SecurityNotAllowedFunctionError;
|
|
use Twig\Source;
|
|
use Twig\Template;
|
|
|
|
/* @WebProfiler/Collector/time.html.twig */
|
|
class __TwigTemplate_5811797ebb5d9805957777eebadd8bea216869be8570eb626fe0682a63d0f7af extends \Twig\Template
|
|
{
|
|
private $source;
|
|
private $macros = [];
|
|
|
|
public function __construct(Environment $env)
|
|
{
|
|
parent::__construct($env);
|
|
|
|
$this->source = $this->getSourceContext();
|
|
|
|
$this->blocks = [
|
|
'toolbar' => [$this, 'block_toolbar'],
|
|
'menu' => [$this, 'block_menu'],
|
|
'panel' => [$this, 'block_panel'],
|
|
'panelContent' => [$this, 'block_panelContent'],
|
|
];
|
|
}
|
|
|
|
protected function doGetParent(array $context)
|
|
{
|
|
// line 1
|
|
return "@WebProfiler/Profiler/layout.html.twig";
|
|
}
|
|
|
|
protected function doDisplay(array $context, array $blocks = [])
|
|
{
|
|
$macros = $this->macros;
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "@WebProfiler/Collector/time.html.twig"));
|
|
|
|
// line 3
|
|
$macros["helper"] = $this->macros["helper"] = $this;
|
|
// line 5
|
|
if ( !(isset($context["colors"]) || array_key_exists("colors", $context))) {
|
|
// line 6
|
|
$context["colors"] = ["default" => "#999", "section" => "#444", "event_listener" => "#00B8F5", "event_listener_loading" => "#00B8F5", "template" => "#66CC00", "doctrine" => "#FF6633", "propel" => "#FF6633"];
|
|
}
|
|
// line 1
|
|
$this->parent = $this->loadTemplate("@WebProfiler/Profiler/layout.html.twig", "@WebProfiler/Collector/time.html.twig", 1);
|
|
$this->parent->display($context, array_merge($this->blocks, $blocks));
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
}
|
|
|
|
// line 17
|
|
public function block_toolbar($context, array $blocks = [])
|
|
{
|
|
$macros = $this->macros;
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "toolbar"));
|
|
|
|
// line 18
|
|
echo " ";
|
|
$context["total_time"] = ((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 18, $this->source); })()), "events", [], "any", false, false, false, 18))) ? (sprintf("%.0f", twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 18, $this->source); })()), "duration", [], "any", false, false, false, 18))) : ("n/a"));
|
|
// line 19
|
|
echo " ";
|
|
$context["initialization_time"] = ((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 19, $this->source); })()), "events", [], "any", false, false, false, 19))) ? (sprintf("%.0f", twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 19, $this->source); })()), "inittime", [], "any", false, false, false, 19))) : ("n/a"));
|
|
// line 20
|
|
echo " ";
|
|
$context["status_color"] = (((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 20, $this->source); })()), "events", [], "any", false, false, false, 20)) && (twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 20, $this->source); })()), "duration", [], "any", false, false, false, 20) > 1000))) ? ("yellow") : (""));
|
|
// line 21
|
|
echo "
|
|
";
|
|
// line 22
|
|
ob_start();
|
|
// line 23
|
|
echo " ";
|
|
echo twig_include($this->env, $context, "@WebProfiler/Icon/time.svg");
|
|
echo "
|
|
<span class=\"sf-toolbar-value\">";
|
|
// line 24
|
|
echo twig_escape_filter($this->env, (isset($context["total_time"]) || array_key_exists("total_time", $context) ? $context["total_time"] : (function () { throw new RuntimeError('Variable "total_time" does not exist.', 24, $this->source); })()), "html", null, true);
|
|
echo "</span>
|
|
<span class=\"sf-toolbar-label\">ms</span>
|
|
";
|
|
$context["icon"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
|
|
// line 27
|
|
echo "
|
|
";
|
|
// line 28
|
|
ob_start();
|
|
// line 29
|
|
echo " <div class=\"sf-toolbar-info-piece\">
|
|
<b>Total time</b>
|
|
<span>";
|
|
// line 31
|
|
echo twig_escape_filter($this->env, (isset($context["total_time"]) || array_key_exists("total_time", $context) ? $context["total_time"] : (function () { throw new RuntimeError('Variable "total_time" does not exist.', 31, $this->source); })()), "html", null, true);
|
|
echo " ms</span>
|
|
</div>
|
|
<div class=\"sf-toolbar-info-piece\">
|
|
<b>Initialization time</b>
|
|
<span>";
|
|
// line 35
|
|
echo twig_escape_filter($this->env, (isset($context["initialization_time"]) || array_key_exists("initialization_time", $context) ? $context["initialization_time"] : (function () { throw new RuntimeError('Variable "initialization_time" does not exist.', 35, $this->source); })()), "html", null, true);
|
|
echo " ms</span>
|
|
</div>
|
|
";
|
|
$context["text"] = ('' === $tmp = ob_get_clean()) ? '' : new Markup($tmp, $this->env->getCharset());
|
|
// line 38
|
|
echo "
|
|
";
|
|
// line 39
|
|
echo twig_include($this->env, $context, "@WebProfiler/Profiler/toolbar_item.html.twig", ["link" => (isset($context["profiler_url"]) || array_key_exists("profiler_url", $context) ? $context["profiler_url"] : (function () { throw new RuntimeError('Variable "profiler_url" does not exist.', 39, $this->source); })()), "status" => (isset($context["status_color"]) || array_key_exists("status_color", $context) ? $context["status_color"] : (function () { throw new RuntimeError('Variable "status_color" does not exist.', 39, $this->source); })())]);
|
|
echo "
|
|
";
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
}
|
|
|
|
// line 42
|
|
public function block_menu($context, array $blocks = [])
|
|
{
|
|
$macros = $this->macros;
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "menu"));
|
|
|
|
// line 43
|
|
echo " <span class=\"label\">
|
|
<span class=\"icon\">";
|
|
// line 44
|
|
echo twig_include($this->env, $context, "@WebProfiler/Icon/time.svg");
|
|
echo "</span>
|
|
<strong>Performance</strong>
|
|
</span>
|
|
";
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
}
|
|
|
|
// line 49
|
|
public function block_panel($context, array $blocks = [])
|
|
{
|
|
$macros = $this->macros;
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panel"));
|
|
|
|
// line 50
|
|
echo " <h2>Performance metrics</h2>
|
|
|
|
<div class=\"metrics\">
|
|
<div class=\"metric\">
|
|
<span class=\"value\">";
|
|
// line 54
|
|
echo twig_escape_filter($this->env, sprintf("%.0f", twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 54, $this->source); })()), "duration", [], "any", false, false, false, 54)), "html", null, true);
|
|
echo " <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Total execution time</span>
|
|
</div>
|
|
|
|
<div class=\"metric\">
|
|
<span class=\"value\">";
|
|
// line 59
|
|
echo twig_escape_filter($this->env, sprintf("%.0f", twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 59, $this->source); })()), "inittime", [], "any", false, false, false, 59)), "html", null, true);
|
|
echo " <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Symfony initialization</span>
|
|
</div>
|
|
|
|
";
|
|
// line 63
|
|
if (twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 63, $this->source); })()), "collectors", [], "any", false, false, false, 63), "memory", [], "any", false, false, false, 63)) {
|
|
// line 64
|
|
echo " <div class=\"metric\">
|
|
<span class=\"value\">";
|
|
// line 65
|
|
echo twig_escape_filter($this->env, sprintf("%.2f", ((twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 65, $this->source); })()), "collectors", [], "any", false, false, false, 65), "memory", [], "any", false, false, false, 65), "memory", [], "any", false, false, false, 65) / 1024) / 1024)), "html", null, true);
|
|
echo " <span class=\"unit\">MB</span></span>
|
|
<span class=\"label\">Peak memory usage</span>
|
|
</div>
|
|
";
|
|
}
|
|
// line 69
|
|
echo "
|
|
";
|
|
// line 70
|
|
if ((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 70, $this->source); })()), "children", [], "any", false, false, false, 70)) > 0)) {
|
|
// line 71
|
|
echo " <div class=\"metric-divider\"></div>
|
|
|
|
<div class=\"metric\">
|
|
<span class=\"value\">";
|
|
// line 74
|
|
echo twig_escape_filter($this->env, twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 74, $this->source); })()), "children", [], "any", false, false, false, 74)), "html", null, true);
|
|
echo "</span>
|
|
<span class=\"label\">Sub-Request";
|
|
// line 75
|
|
echo (((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 75, $this->source); })()), "children", [], "any", false, false, false, 75)) > 1)) ? ("s") : (""));
|
|
echo "</span>
|
|
</div>
|
|
|
|
";
|
|
// line 78
|
|
$context["subrequests_time"] = 0;
|
|
// line 79
|
|
echo " ";
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable(twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 79, $this->source); })()), "children", [], "any", false, false, false, 79));
|
|
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
|
|
// line 80
|
|
echo " ";
|
|
$context["subrequests_time"] = ((isset($context["subrequests_time"]) || array_key_exists("subrequests_time", $context) ? $context["subrequests_time"] : (function () { throw new RuntimeError('Variable "subrequests_time" does not exist.', 80, $this->source); })()) + twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, $context["child"], "getcollector", [0 => "time"], "method", false, false, false, 80), "events", [], "any", false, false, false, 80), "__section__", [], "any", false, false, false, 80), "duration", [], "any", false, false, false, 80));
|
|
// line 81
|
|
echo " ";
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
// line 82
|
|
echo "
|
|
<div class=\"metric\">
|
|
<span class=\"value\">";
|
|
// line 84
|
|
echo twig_escape_filter($this->env, (isset($context["subrequests_time"]) || array_key_exists("subrequests_time", $context) ? $context["subrequests_time"] : (function () { throw new RuntimeError('Variable "subrequests_time" does not exist.', 84, $this->source); })()), "html", null, true);
|
|
echo " <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Sub-Request";
|
|
// line 85
|
|
echo (((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 85, $this->source); })()), "children", [], "any", false, false, false, 85)) > 1)) ? ("s") : (""));
|
|
echo " time</span>
|
|
</div>
|
|
";
|
|
}
|
|
// line 88
|
|
echo " </div>
|
|
|
|
<h2>Execution timeline</h2>
|
|
|
|
";
|
|
// line 92
|
|
if (twig_test_empty(twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 92, $this->source); })()), "events", [], "any", false, false, false, 92))) {
|
|
// line 93
|
|
echo " <div class=\"empty\">
|
|
<p>No timing events have been recorded. Are you sure that debugging is enabled in the kernel?</p>
|
|
</div>
|
|
";
|
|
} else {
|
|
// line 97
|
|
echo " ";
|
|
$this->displayBlock("panelContent", $context, $blocks);
|
|
echo "
|
|
";
|
|
}
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
}
|
|
|
|
// line 101
|
|
public function block_panelContent($context, array $blocks = [])
|
|
{
|
|
$macros = $this->macros;
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "panelContent"));
|
|
|
|
// line 102
|
|
echo " <form id=\"timeline-control\" action=\"\" method=\"get\">
|
|
<input type=\"hidden\" name=\"panel\" value=\"time\">
|
|
<label for=\"threshold\">Threshold</label>
|
|
<input type=\"number\" size=\"3\" name=\"threshold\" id=\"threshold\" value=\"3\" min=\"0\"> ms
|
|
<span class=\"help\">(timeline only displays events with a duration longer than this threshold)</span>
|
|
</form>
|
|
|
|
";
|
|
// line 109
|
|
if (twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 109, $this->source); })()), "parent", [], "any", false, false, false, 109)) {
|
|
// line 110
|
|
echo " <h3>
|
|
Sub-Request ";
|
|
// line 111
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 111, $this->source); })()), "getcollector", [0 => "request"], "method", false, false, false, 111), "requestattributes", [], "any", false, false, false, 111), "get", [0 => "_controller"], "method", false, false, false, 111), "html", null, true);
|
|
echo "
|
|
<small>
|
|
";
|
|
// line 113
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 113, $this->source); })()), "events", [], "any", false, false, false, 113), "__section__", [], "any", false, false, false, 113), "duration", [], "any", false, false, false, 113), "html", null, true);
|
|
echo " ms
|
|
<a class=\"newline\" href=\"";
|
|
// line 114
|
|
echo twig_escape_filter($this->env, $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("_profiler", ["token" => twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 114, $this->source); })()), "parent", [], "any", false, false, false, 114), "token", [], "any", false, false, false, 114), "panel" => "time"]), "html", null, true);
|
|
echo "\">Return to parent request</a>
|
|
</small>
|
|
</h3>
|
|
";
|
|
} elseif ((twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, // line 117
|
|
(isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 117, $this->source); })()), "children", [], "any", false, false, false, 117)) > 0)) {
|
|
// line 118
|
|
echo " <h3>
|
|
Main Request <small>";
|
|
// line 119
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 119, $this->source); })()), "events", [], "any", false, false, false, 119), "__section__", [], "any", false, false, false, 119), "duration", [], "any", false, false, false, 119), "html", null, true);
|
|
echo " ms</small>
|
|
</h3>
|
|
";
|
|
}
|
|
// line 122
|
|
echo "
|
|
";
|
|
// line 123
|
|
echo twig_call_macro($macros["helper"], "macro_display_timeline", [("timeline_" . (isset($context["token"]) || array_key_exists("token", $context) ? $context["token"] : (function () { throw new RuntimeError('Variable "token" does not exist.', 123, $this->source); })())), twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 123, $this->source); })()), "events", [], "any", false, false, false, 123), (isset($context["colors"]) || array_key_exists("colors", $context) ? $context["colors"] : (function () { throw new RuntimeError('Variable "colors" does not exist.', 123, $this->source); })())], 123, $context, $this->getSourceContext());
|
|
echo "
|
|
|
|
";
|
|
// line 125
|
|
if (twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 125, $this->source); })()), "children", [], "any", false, false, false, 125))) {
|
|
// line 126
|
|
echo " <p class=\"help\">Note: sections with a striped background correspond to sub-requests.</p>
|
|
|
|
<h3>Sub-requests <small>(";
|
|
// line 128
|
|
echo twig_escape_filter($this->env, twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 128, $this->source); })()), "children", [], "any", false, false, false, 128)), "html", null, true);
|
|
echo ")</small></h3>
|
|
|
|
";
|
|
// line 130
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable(twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 130, $this->source); })()), "children", [], "any", false, false, false, 130));
|
|
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
|
|
// line 131
|
|
echo " ";
|
|
$context["events"] = twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, $context["child"], "getcollector", [0 => "time"], "method", false, false, false, 131), "events", [], "any", false, false, false, 131);
|
|
// line 132
|
|
echo " <h4>
|
|
<a href=\"";
|
|
// line 133
|
|
echo twig_escape_filter($this->env, $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("_profiler", ["token" => twig_get_attribute($this->env, $this->source, $context["child"], "token", [], "any", false, false, false, 133), "panel" => "time"]), "html", null, true);
|
|
echo "\">";
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, $context["child"], "getcollector", [0 => "request"], "method", false, false, false, 133), "requestattributes", [], "any", false, false, false, 133), "get", [0 => "_controller"], "method", false, false, false, 133), "html", null, true);
|
|
echo "</a>
|
|
<small>";
|
|
// line 134
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["events"]) || array_key_exists("events", $context) ? $context["events"] : (function () { throw new RuntimeError('Variable "events" does not exist.', 134, $this->source); })()), "__section__", [], "any", false, false, false, 134), "duration", [], "any", false, false, false, 134), "html", null, true);
|
|
echo " ms</small>
|
|
</h4>
|
|
|
|
";
|
|
// line 137
|
|
echo twig_call_macro($macros["helper"], "macro_display_timeline", [("timeline_" . twig_get_attribute($this->env, $this->source, $context["child"], "token", [], "any", false, false, false, 137)), (isset($context["events"]) || array_key_exists("events", $context) ? $context["events"] : (function () { throw new RuntimeError('Variable "events" does not exist.', 137, $this->source); })()), (isset($context["colors"]) || array_key_exists("colors", $context) ? $context["colors"] : (function () { throw new RuntimeError('Variable "colors" does not exist.', 137, $this->source); })())], 137, $context, $this->getSourceContext());
|
|
echo "
|
|
";
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
// line 139
|
|
echo " ";
|
|
}
|
|
// line 140
|
|
echo "
|
|
<script>";
|
|
// line 141
|
|
echo "//<![CDATA[
|
|
/**
|
|
* In-memory key-value cache manager
|
|
*/
|
|
var cache = new function() {
|
|
\"use strict\";
|
|
var dict = {};
|
|
|
|
this.get = function(key) {
|
|
return dict.hasOwnProperty(key)
|
|
? dict[key]
|
|
: null;
|
|
};
|
|
|
|
this.set = function(key, value) {
|
|
dict[key] = value;
|
|
|
|
return value;
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Query an element with a CSS selector.
|
|
*
|
|
* @param {string} selector - a CSS-selector-compatible query string
|
|
*
|
|
* @return DOMElement|null
|
|
*/
|
|
function query(selector)
|
|
{
|
|
\"use strict\";
|
|
var key = 'SELECTOR: ' + selector;
|
|
|
|
return cache.get(key) || cache.set(key, document.querySelector(selector));
|
|
}
|
|
|
|
/**
|
|
* Canvas Manager
|
|
*/
|
|
function CanvasManager(requests, maxRequestTime) {
|
|
\"use strict\";
|
|
|
|
var _drawingColors = ";
|
|
// line 183
|
|
echo json_encode((isset($context["colors"]) || array_key_exists("colors", $context) ? $context["colors"] : (function () { throw new RuntimeError('Variable "colors" does not exist.', 183, $this->source); })()));
|
|
echo ",
|
|
_storagePrefix = 'timeline/',
|
|
_threshold = 1,
|
|
_requests = requests,
|
|
_maxRequestTime = maxRequestTime;
|
|
|
|
/**
|
|
* Check whether this event is a child event.
|
|
*
|
|
* @return true if it is
|
|
*/
|
|
function isChildEvent(event)
|
|
{
|
|
return '__section__.child' === event.name;
|
|
}
|
|
|
|
/**
|
|
* Check whether this event is categorized in 'section'.
|
|
*
|
|
* @return true if it is
|
|
*/
|
|
function isSectionEvent(event)
|
|
{
|
|
return 'section' === event.category;
|
|
}
|
|
|
|
/**
|
|
* Get the width of the container.
|
|
*/
|
|
function getContainerWidth()
|
|
{
|
|
return query('#collector-content h2').clientWidth;
|
|
}
|
|
|
|
/**
|
|
* Draw one canvas.
|
|
*
|
|
* @param request the request object
|
|
* @param max <subjected for removal>
|
|
* @param threshold the threshold (lower bound) of the length of the timeline (in milliseconds)
|
|
* @param width the width of the canvas
|
|
*/
|
|
this.drawOne = function(request, max, threshold, width)
|
|
{
|
|
\"use strict\";
|
|
var text,
|
|
ms,
|
|
xc,
|
|
drawableEvents,
|
|
mainEvents,
|
|
elementId = 'timeline_' + request.id,
|
|
canvasHeight = 0,
|
|
gapPerEvent = 38,
|
|
colors = _drawingColors,
|
|
space = 10.5,
|
|
ratio = (width - space * 2) / max,
|
|
h = space,
|
|
x = request.left * ratio + space, // position
|
|
canvas = cache.get(elementId) || cache.set(elementId, document.getElementById(elementId)),
|
|
ctx = canvas.getContext(\"2d\"),
|
|
scaleRatio,
|
|
devicePixelRatio;
|
|
|
|
// Filter events whose total time is below the threshold.
|
|
drawableEvents = request.events.filter(function(event) {
|
|
return event.duration >= threshold;
|
|
});
|
|
|
|
canvasHeight += gapPerEvent * drawableEvents.length;
|
|
|
|
// For retina displays so text and boxes will be crisp
|
|
devicePixelRatio = window.devicePixelRatio == \"undefined\" ? 1 : window.devicePixelRatio;
|
|
scaleRatio = devicePixelRatio / 1;
|
|
|
|
canvas.width = width * scaleRatio;
|
|
canvas.height = canvasHeight * scaleRatio;
|
|
|
|
canvas.style.width = width + 'px';
|
|
canvas.style.height = canvasHeight + 'px';
|
|
|
|
ctx.scale(scaleRatio, scaleRatio);
|
|
|
|
ctx.textBaseline = \"middle\";
|
|
ctx.lineWidth = 0;
|
|
|
|
// For each event, draw a line.
|
|
ctx.strokeStyle = \"#CCC\";
|
|
|
|
drawableEvents.forEach(function(event) {
|
|
event.periods.forEach(function(period) {
|
|
var timelineHeadPosition = x + period.start * ratio;
|
|
|
|
if (isChildEvent(event)) {
|
|
/* create a striped background dynamically */
|
|
var img = new Image();
|
|
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAAIVBMVEX////w8PDd7h7d7h7d7h7d7h7w8PDw8PDw8PDw8PDw8PAOi84XAAAAKUlEQVQImWNI71zAwMBQMYuBgY0BxExnADErGEDMTgYQE8hnAKtCZwIAlcMNSR9a1OEAAAAASUVORK5CYII=';
|
|
var pattern = ctx.createPattern(img, 'repeat');
|
|
|
|
ctx.fillStyle = pattern;
|
|
ctx.fillRect(timelineHeadPosition, 0, (period.end - period.start) * ratio, canvasHeight);
|
|
} else if (isSectionEvent(event)) {
|
|
var timelineTailPosition = x + period.end * ratio;
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, 0);
|
|
ctx.lineTo(timelineHeadPosition, canvasHeight);
|
|
ctx.moveTo(timelineTailPosition, 0);
|
|
ctx.lineTo(timelineTailPosition, canvasHeight);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Filter for main events.
|
|
mainEvents = drawableEvents.filter(function(event) {
|
|
return !isChildEvent(event)
|
|
});
|
|
|
|
// For each main event, draw the visual presentation of timelines.
|
|
mainEvents.forEach(function(event) {
|
|
|
|
h += 8;
|
|
|
|
// For each sub event, ...
|
|
event.periods.forEach(function(period) {
|
|
// Set the drawing style.
|
|
ctx.fillStyle = colors['default'];
|
|
ctx.strokeStyle = colors['default'];
|
|
|
|
if (colors[event.name]) {
|
|
ctx.fillStyle = colors[event.name];
|
|
ctx.strokeStyle = colors[event.name];
|
|
} else if (colors[event.category]) {
|
|
ctx.fillStyle = colors[event.category];
|
|
ctx.strokeStyle = colors[event.category];
|
|
}
|
|
|
|
// Draw the timeline
|
|
var timelineHeadPosition = x + period.start * ratio;
|
|
|
|
if (!isSectionEvent(event)) {
|
|
ctx.fillRect(timelineHeadPosition, h + 3, 2, 8);
|
|
ctx.fillRect(timelineHeadPosition, h, (period.end - period.start) * ratio || 2, 6);
|
|
} else {
|
|
var timelineTailPosition = x + period.end * ratio;
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, h);
|
|
ctx.lineTo(timelineHeadPosition, h + 11);
|
|
ctx.lineTo(timelineHeadPosition + 8, h);
|
|
ctx.lineTo(timelineHeadPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineTailPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h + 11);
|
|
ctx.lineTo(timelineTailPosition - 8, h);
|
|
ctx.lineTo(timelineTailPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h + 2);
|
|
ctx.lineTo(timelineHeadPosition, h + 2);
|
|
ctx.lineTo(timelineHeadPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
}
|
|
});
|
|
|
|
h += 30;
|
|
|
|
ctx.beginPath();
|
|
ctx.strokeStyle = \"#E0E0E0\";
|
|
ctx.moveTo(0, h - 10);
|
|
ctx.lineTo(width, h - 10);
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
});
|
|
|
|
h = space;
|
|
|
|
// For each event, draw the label.
|
|
mainEvents.forEach(function(event) {
|
|
|
|
ctx.fillStyle = \"#444\";
|
|
ctx.font = \"12px sans-serif\";
|
|
text = event.name;
|
|
ms = \" \" + (event.duration < 1 ? event.duration : parseInt(event.duration, 10)) + \" ms / \" + event.memory + \" MB\";
|
|
if (x + event.starttime * ratio + ctx.measureText(text + ms).width > width) {
|
|
ctx.textAlign = \"end\";
|
|
ctx.font = \"10px sans-serif\";
|
|
ctx.fillStyle = \"#777\";
|
|
xc = x + event.endtime * ratio - 1;
|
|
ctx.fillText(ms, xc, h);
|
|
|
|
xc -= ctx.measureText(ms).width;
|
|
ctx.font = \"12px sans-serif\";
|
|
ctx.fillStyle = \"#222\";
|
|
ctx.fillText(text, xc, h);
|
|
} else {
|
|
ctx.textAlign = \"start\";
|
|
ctx.font = \"13px sans-serif\";
|
|
ctx.fillStyle = \"#222\";
|
|
xc = x + event.starttime * ratio + 1;
|
|
ctx.fillText(text, xc, h);
|
|
|
|
xc += ctx.measureText(text).width;
|
|
ctx.font = \"11px sans-serif\";
|
|
ctx.fillStyle = \"#777\";
|
|
ctx.fillText(ms, xc, h);
|
|
}
|
|
|
|
h += gapPerEvent;
|
|
});
|
|
};
|
|
|
|
this.drawAll = function(width, threshold)
|
|
{
|
|
\"use strict\";
|
|
|
|
width = width || getContainerWidth();
|
|
threshold = threshold || this.getThreshold();
|
|
|
|
var self = this;
|
|
|
|
_requests.forEach(function(request) {
|
|
self.drawOne(request, _maxRequestTime, threshold, width);
|
|
});
|
|
};
|
|
|
|
this.getThreshold = function() {
|
|
var threshold = Sfjs.getPreference(_storagePrefix + 'threshold');
|
|
|
|
if (null === threshold) {
|
|
return _threshold;
|
|
}
|
|
|
|
_threshold = parseInt(threshold);
|
|
|
|
return _threshold;
|
|
};
|
|
|
|
this.setThreshold = function(threshold)
|
|
{
|
|
_threshold = threshold;
|
|
|
|
Sfjs.setPreference(_storagePrefix + 'threshold', threshold);
|
|
|
|
return this;
|
|
};
|
|
}
|
|
|
|
function canvasAutoUpdateOnResizeAndSubmit(e) {
|
|
e.preventDefault();
|
|
canvasManager.drawAll();
|
|
}
|
|
|
|
function canvasAutoUpdateOnThresholdChange(e) {
|
|
canvasManager
|
|
.setThreshold(query('input[name=\"threshold\"]').value)
|
|
.drawAll();
|
|
}
|
|
|
|
var requests_data = {
|
|
\"max\": ";
|
|
// line 456
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 456, $this->source); })()), "events", [], "any", false, false, false, 456), "__section__", [], "any", false, false, false, 456), "endtime", [], "any", false, false, false, 456)), "js", null, true);
|
|
echo ",
|
|
\"requests\": [
|
|
";
|
|
// line 458
|
|
echo twig_call_macro($macros["helper"], "macro_dump_request_data", [(isset($context["token"]) || array_key_exists("token", $context) ? $context["token"] : (function () { throw new RuntimeError('Variable "token" does not exist.', 458, $this->source); })()), (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 458, $this->source); })()), twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 458, $this->source); })()), "events", [], "any", false, false, false, 458), twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 458, $this->source); })()), "events", [], "any", false, false, false, 458), "__section__", [], "any", false, false, false, 458), "origin", [], "any", false, false, false, 458)], 458, $context, $this->getSourceContext());
|
|
echo "
|
|
|
|
";
|
|
// line 460
|
|
if (twig_length_filter($this->env, twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 460, $this->source); })()), "children", [], "any", false, false, false, 460))) {
|
|
// line 461
|
|
echo " ,
|
|
";
|
|
// line 462
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable(twig_get_attribute($this->env, $this->source, (isset($context["profile"]) || array_key_exists("profile", $context) ? $context["profile"] : (function () { throw new RuntimeError('Variable "profile" does not exist.', 462, $this->source); })()), "children", [], "any", false, false, false, 462));
|
|
$context['loop'] = [
|
|
'parent' => $context['_parent'],
|
|
'index0' => 0,
|
|
'index' => 1,
|
|
'first' => true,
|
|
];
|
|
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
|
|
$length = count($context['_seq']);
|
|
$context['loop']['revindex0'] = $length - 1;
|
|
$context['loop']['revindex'] = $length;
|
|
$context['loop']['length'] = $length;
|
|
$context['loop']['last'] = 1 === $length;
|
|
}
|
|
foreach ($context['_seq'] as $context["_key"] => $context["child"]) {
|
|
// line 463
|
|
echo twig_call_macro($macros["helper"], "macro_dump_request_data", [twig_get_attribute($this->env, $this->source, $context["child"], "token", [], "any", false, false, false, 463), $context["child"], twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, $context["child"], "getcollector", [0 => "time"], "method", false, false, false, 463), "events", [], "any", false, false, false, 463), twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["collector"]) || array_key_exists("collector", $context) ? $context["collector"] : (function () { throw new RuntimeError('Variable "collector" does not exist.', 463, $this->source); })()), "events", [], "any", false, false, false, 463), "__section__", [], "any", false, false, false, 463), "origin", [], "any", false, false, false, 463)], 463, $context, $this->getSourceContext());
|
|
echo ((twig_get_attribute($this->env, $this->source, $context["loop"], "last", [], "any", false, false, false, 463)) ? ("") : (","));
|
|
echo "
|
|
";
|
|
++$context['loop']['index0'];
|
|
++$context['loop']['index'];
|
|
$context['loop']['first'] = false;
|
|
if (isset($context['loop']['length'])) {
|
|
--$context['loop']['revindex0'];
|
|
--$context['loop']['revindex'];
|
|
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
|
|
}
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['child'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
}
|
|
// line 466
|
|
echo " ]
|
|
};
|
|
|
|
var canvasManager = new CanvasManager(requests_data.requests, requests_data.max);
|
|
|
|
query('input[name=\"threshold\"]').value = canvasManager.getThreshold();
|
|
canvasManager.drawAll();
|
|
|
|
// Update the colors of legends.
|
|
var timelineLegends = document.querySelectorAll('.sf-profiler-timeline > .legends > span[data-color]');
|
|
|
|
for (var i = 0; i < timelineLegends.length; ++i) {
|
|
var timelineLegend = timelineLegends[i];
|
|
|
|
timelineLegend.style.borderLeftColor = timelineLegend.getAttribute('data-color');
|
|
}
|
|
|
|
// Bind event handlers
|
|
var elementTimelineControl = query('#timeline-control'),
|
|
elementThresholdControl = query('input[name=\"threshold\"]');
|
|
|
|
window.onresize = canvasAutoUpdateOnResizeAndSubmit;
|
|
elementTimelineControl.onsubmit = canvasAutoUpdateOnResizeAndSubmit;
|
|
|
|
elementThresholdControl.onclick = canvasAutoUpdateOnThresholdChange;
|
|
elementThresholdControl.onchange = canvasAutoUpdateOnThresholdChange;
|
|
elementThresholdControl.onkeyup = canvasAutoUpdateOnThresholdChange;
|
|
|
|
window.setTimeout(function() {
|
|
canvasAutoUpdateOnThresholdChange(null);
|
|
}, 50);
|
|
|
|
//]]>";
|
|
// line 498
|
|
echo "</script>
|
|
";
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
}
|
|
|
|
// line 501
|
|
public function macro_dump_request_data($__token__ = null, $__profile__ = null, $__events__ = null, $__origin__ = null, ...$__varargs__)
|
|
{
|
|
$macros = $this->macros;
|
|
$context = $this->env->mergeGlobals([
|
|
"token" => $__token__,
|
|
"profile" => $__profile__,
|
|
"events" => $__events__,
|
|
"origin" => $__origin__,
|
|
"varargs" => $__varargs__,
|
|
]);
|
|
|
|
$blocks = [];
|
|
|
|
ob_start();
|
|
try {
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_request_data"));
|
|
|
|
// line 503
|
|
$macros["__internal_467e0580fdd6352f9864c229381612addb8f8c26753cf3a1c57abf02e20a415b"] = $this;
|
|
// line 504
|
|
echo " {
|
|
\"id\": \"";
|
|
// line 505
|
|
echo twig_escape_filter($this->env, (isset($context["token"]) || array_key_exists("token", $context) ? $context["token"] : (function () { throw new RuntimeError('Variable "token" does not exist.', 505, $this->source); })()), "js", null, true);
|
|
echo "\",
|
|
\"left\": ";
|
|
// line 506
|
|
echo twig_escape_filter($this->env, sprintf("%F", (twig_get_attribute($this->env, $this->source, twig_get_attribute($this->env, $this->source, (isset($context["events"]) || array_key_exists("events", $context) ? $context["events"] : (function () { throw new RuntimeError('Variable "events" does not exist.', 506, $this->source); })()), "__section__", [], "any", false, false, false, 506), "origin", [], "any", false, false, false, 506) - (isset($context["origin"]) || array_key_exists("origin", $context) ? $context["origin"] : (function () { throw new RuntimeError('Variable "origin" does not exist.', 506, $this->source); })()))), "js", null, true);
|
|
echo ",
|
|
\"events\": [
|
|
";
|
|
// line 508
|
|
echo twig_call_macro($macros["__internal_467e0580fdd6352f9864c229381612addb8f8c26753cf3a1c57abf02e20a415b"], "macro_dump_events", [(isset($context["events"]) || array_key_exists("events", $context) ? $context["events"] : (function () { throw new RuntimeError('Variable "events" does not exist.', 508, $this->source); })())], 508, $context, $this->getSourceContext());
|
|
echo "
|
|
]
|
|
}
|
|
";
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
|
|
return ('' === $tmp = ob_get_contents()) ? '' : new Markup($tmp, $this->env->getCharset());
|
|
} finally {
|
|
ob_end_clean();
|
|
}
|
|
}
|
|
|
|
// line 514
|
|
public function macro_dump_events($__events__ = null, ...$__varargs__)
|
|
{
|
|
$macros = $this->macros;
|
|
$context = $this->env->mergeGlobals([
|
|
"events" => $__events__,
|
|
"varargs" => $__varargs__,
|
|
]);
|
|
|
|
$blocks = [];
|
|
|
|
ob_start();
|
|
try {
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "dump_events"));
|
|
|
|
// line 516
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable((isset($context["events"]) || array_key_exists("events", $context) ? $context["events"] : (function () { throw new RuntimeError('Variable "events" does not exist.', 516, $this->source); })()));
|
|
$context['loop'] = [
|
|
'parent' => $context['_parent'],
|
|
'index0' => 0,
|
|
'index' => 1,
|
|
'first' => true,
|
|
];
|
|
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
|
|
$length = count($context['_seq']);
|
|
$context['loop']['revindex0'] = $length - 1;
|
|
$context['loop']['revindex'] = $length;
|
|
$context['loop']['length'] = $length;
|
|
$context['loop']['last'] = 1 === $length;
|
|
}
|
|
foreach ($context['_seq'] as $context["name"] => $context["event"]) {
|
|
// line 517
|
|
if (("__section__" != $context["name"])) {
|
|
// line 518
|
|
echo " {
|
|
\"name\": \"";
|
|
// line 519
|
|
echo twig_escape_filter($this->env, $context["name"], "js", null, true);
|
|
echo "\",
|
|
\"category\": \"";
|
|
// line 520
|
|
echo twig_escape_filter($this->env, twig_get_attribute($this->env, $this->source, $context["event"], "category", [], "any", false, false, false, 520), "js", null, true);
|
|
echo "\",
|
|
\"origin\": ";
|
|
// line 521
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["event"], "origin", [], "any", false, false, false, 521)), "js", null, true);
|
|
echo ",
|
|
\"starttime\": ";
|
|
// line 522
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["event"], "starttime", [], "any", false, false, false, 522)), "js", null, true);
|
|
echo ",
|
|
\"endtime\": ";
|
|
// line 523
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["event"], "endtime", [], "any", false, false, false, 523)), "js", null, true);
|
|
echo ",
|
|
\"duration\": ";
|
|
// line 524
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["event"], "duration", [], "any", false, false, false, 524)), "js", null, true);
|
|
echo ",
|
|
\"memory\": ";
|
|
// line 525
|
|
echo twig_escape_filter($this->env, sprintf("%.1F", ((twig_get_attribute($this->env, $this->source, $context["event"], "memory", [], "any", false, false, false, 525) / 1024) / 1024)), "js", null, true);
|
|
echo ",
|
|
\"periods\": [";
|
|
// line 527
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable(twig_get_attribute($this->env, $this->source, $context["event"], "periods", [], "any", false, false, false, 527));
|
|
$context['loop'] = [
|
|
'parent' => $context['_parent'],
|
|
'index0' => 0,
|
|
'index' => 1,
|
|
'first' => true,
|
|
];
|
|
if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
|
|
$length = count($context['_seq']);
|
|
$context['loop']['revindex0'] = $length - 1;
|
|
$context['loop']['revindex'] = $length;
|
|
$context['loop']['length'] = $length;
|
|
$context['loop']['last'] = 1 === $length;
|
|
}
|
|
foreach ($context['_seq'] as $context["_key"] => $context["period"]) {
|
|
// line 528
|
|
echo "{\"start\": ";
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["period"], "starttime", [], "any", false, false, false, 528)), "js", null, true);
|
|
echo ", \"end\": ";
|
|
echo twig_escape_filter($this->env, sprintf("%F", twig_get_attribute($this->env, $this->source, $context["period"], "endtime", [], "any", false, false, false, 528)), "js", null, true);
|
|
echo "}";
|
|
echo ((twig_get_attribute($this->env, $this->source, $context["loop"], "last", [], "any", false, false, false, 528)) ? ("") : (", "));
|
|
++$context['loop']['index0'];
|
|
++$context['loop']['index'];
|
|
$context['loop']['first'] = false;
|
|
if (isset($context['loop']['length'])) {
|
|
--$context['loop']['revindex0'];
|
|
--$context['loop']['revindex'];
|
|
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
|
|
}
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['_key'], $context['period'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
// line 530
|
|
echo "]
|
|
}";
|
|
// line 531
|
|
echo ((twig_get_attribute($this->env, $this->source, $context["loop"], "last", [], "any", false, false, false, 531)) ? ("") : (","));
|
|
echo "
|
|
";
|
|
}
|
|
++$context['loop']['index0'];
|
|
++$context['loop']['index'];
|
|
$context['loop']['first'] = false;
|
|
if (isset($context['loop']['length'])) {
|
|
--$context['loop']['revindex0'];
|
|
--$context['loop']['revindex'];
|
|
$context['loop']['last'] = 0 === $context['loop']['revindex0'];
|
|
}
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['name'], $context['event'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
|
|
return ('' === $tmp = ob_get_contents()) ? '' : new Markup($tmp, $this->env->getCharset());
|
|
} finally {
|
|
ob_end_clean();
|
|
}
|
|
}
|
|
|
|
// line 537
|
|
public function macro_display_timeline($__id__ = null, $__events__ = null, $__colors__ = null, ...$__varargs__)
|
|
{
|
|
$macros = $this->macros;
|
|
$context = $this->env->mergeGlobals([
|
|
"id" => $__id__,
|
|
"events" => $__events__,
|
|
"colors" => $__colors__,
|
|
"varargs" => $__varargs__,
|
|
]);
|
|
|
|
$blocks = [];
|
|
|
|
ob_start();
|
|
try {
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "macro", "display_timeline"));
|
|
|
|
// line 538
|
|
echo " <div class=\"sf-profiler-timeline\">
|
|
<div class=\"legends\">
|
|
";
|
|
// line 540
|
|
$context['_parent'] = $context;
|
|
$context['_seq'] = twig_ensure_traversable((isset($context["colors"]) || array_key_exists("colors", $context) ? $context["colors"] : (function () { throw new RuntimeError('Variable "colors" does not exist.', 540, $this->source); })()));
|
|
foreach ($context['_seq'] as $context["category"] => $context["color"]) {
|
|
// line 541
|
|
echo " <span data-color=\"";
|
|
echo twig_escape_filter($this->env, $context["color"], "html", null, true);
|
|
echo "\">";
|
|
echo twig_escape_filter($this->env, $context["category"], "html", null, true);
|
|
echo "</span>
|
|
";
|
|
}
|
|
$_parent = $context['_parent'];
|
|
unset($context['_seq'], $context['_iterated'], $context['category'], $context['color'], $context['_parent'], $context['loop']);
|
|
$context = array_intersect_key($context, $_parent) + $_parent;
|
|
// line 543
|
|
echo " </div>
|
|
<canvas width=\"680\" height=\"\" id=\"";
|
|
// line 544
|
|
echo twig_escape_filter($this->env, (isset($context["id"]) || array_key_exists("id", $context) ? $context["id"] : (function () { throw new RuntimeError('Variable "id" does not exist.', 544, $this->source); })()), "html", null, true);
|
|
echo "\" class=\"timeline\"></canvas>
|
|
</div>
|
|
";
|
|
|
|
$__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);
|
|
|
|
|
|
return ('' === $tmp = ob_get_contents()) ? '' : new Markup($tmp, $this->env->getCharset());
|
|
} finally {
|
|
ob_end_clean();
|
|
}
|
|
}
|
|
|
|
public function getTemplateName()
|
|
{
|
|
return "@WebProfiler/Collector/time.html.twig";
|
|
}
|
|
|
|
public function isTraitable()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public function getDebugInfo()
|
|
{
|
|
return array ( 1000 => 544, 997 => 543, 986 => 541, 982 => 540, 978 => 538, 960 => 537, 933 => 531, 930 => 530, 911 => 528, 894 => 527, 890 => 525, 886 => 524, 882 => 523, 878 => 522, 874 => 521, 870 => 520, 866 => 519, 863 => 518, 861 => 517, 844 => 516, 828 => 514, 812 => 508, 807 => 506, 803 => 505, 800 => 504, 798 => 503, 779 => 501, 771 => 498, 737 => 466, 719 => 463, 702 => 462, 699 => 461, 697 => 460, 692 => 458, 687 => 456, 411 => 183, 367 => 141, 364 => 140, 361 => 139, 353 => 137, 347 => 134, 341 => 133, 338 => 132, 335 => 131, 331 => 130, 326 => 128, 322 => 126, 320 => 125, 315 => 123, 312 => 122, 306 => 119, 303 => 118, 301 => 117, 295 => 114, 291 => 113, 286 => 111, 283 => 110, 281 => 109, 272 => 102, 265 => 101, 254 => 97, 248 => 93, 246 => 92, 240 => 88, 234 => 85, 230 => 84, 226 => 82, 220 => 81, 217 => 80, 212 => 79, 210 => 78, 204 => 75, 200 => 74, 195 => 71, 193 => 70, 190 => 69, 183 => 65, 180 => 64, 178 => 63, 171 => 59, 163 => 54, 157 => 50, 150 => 49, 139 => 44, 136 => 43, 129 => 42, 120 => 39, 117 => 38, 111 => 35, 104 => 31, 100 => 29, 98 => 28, 95 => 27, 89 => 24, 84 => 23, 82 => 22, 79 => 21, 76 => 20, 73 => 19, 70 => 18, 63 => 17, 55 => 1, 52 => 6, 50 => 5, 48 => 3, 38 => 1,);
|
|
}
|
|
|
|
public function getSourceContext()
|
|
{
|
|
return new Source("{% extends '@WebProfiler/Profiler/layout.html.twig' %}
|
|
|
|
{% import _self as helper %}
|
|
|
|
{% if colors is not defined %}
|
|
{% set colors = {
|
|
'default': '#999',
|
|
'section': '#444',
|
|
'event_listener': '#00B8F5',
|
|
'event_listener_loading': '#00B8F5',
|
|
'template': '#66CC00',
|
|
'doctrine': '#FF6633',
|
|
'propel': '#FF6633',
|
|
} %}
|
|
{% endif %}
|
|
|
|
{% block toolbar %}
|
|
{% set total_time = collector.events|length ? '%.0f'|format(collector.duration) : 'n/a' %}
|
|
{% set initialization_time = collector.events|length ? '%.0f'|format(collector.inittime) : 'n/a' %}
|
|
{% set status_color = collector.events|length and collector.duration > 1000 ? 'yellow' : '' %}
|
|
|
|
{% set icon %}
|
|
{{ include('@WebProfiler/Icon/time.svg') }}
|
|
<span class=\"sf-toolbar-value\">{{ total_time }}</span>
|
|
<span class=\"sf-toolbar-label\">ms</span>
|
|
{% endset %}
|
|
|
|
{% set text %}
|
|
<div class=\"sf-toolbar-info-piece\">
|
|
<b>Total time</b>
|
|
<span>{{ total_time }} ms</span>
|
|
</div>
|
|
<div class=\"sf-toolbar-info-piece\">
|
|
<b>Initialization time</b>
|
|
<span>{{ initialization_time }} ms</span>
|
|
</div>
|
|
{% endset %}
|
|
|
|
{{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { link: profiler_url, status: status_color }) }}
|
|
{% endblock %}
|
|
|
|
{% block menu %}
|
|
<span class=\"label\">
|
|
<span class=\"icon\">{{ include('@WebProfiler/Icon/time.svg') }}</span>
|
|
<strong>Performance</strong>
|
|
</span>
|
|
{% endblock %}
|
|
|
|
{% block panel %}
|
|
<h2>Performance metrics</h2>
|
|
|
|
<div class=\"metrics\">
|
|
<div class=\"metric\">
|
|
<span class=\"value\">{{ '%.0f'|format(collector.duration) }} <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Total execution time</span>
|
|
</div>
|
|
|
|
<div class=\"metric\">
|
|
<span class=\"value\">{{ '%.0f'|format(collector.inittime) }} <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Symfony initialization</span>
|
|
</div>
|
|
|
|
{% if profile.collectors.memory %}
|
|
<div class=\"metric\">
|
|
<span class=\"value\">{{ '%.2f'|format(profile.collectors.memory.memory / 1024 / 1024) }} <span class=\"unit\">MB</span></span>
|
|
<span class=\"label\">Peak memory usage</span>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if profile.children|length > 0 %}
|
|
<div class=\"metric-divider\"></div>
|
|
|
|
<div class=\"metric\">
|
|
<span class=\"value\">{{ profile.children|length }}</span>
|
|
<span class=\"label\">Sub-Request{{ profile.children|length > 1 ? 's' }}</span>
|
|
</div>
|
|
|
|
{% set subrequests_time = 0 %}
|
|
{% for child in profile.children %}
|
|
{% set subrequests_time = subrequests_time + child.getcollector('time').events.__section__.duration %}
|
|
{% endfor %}
|
|
|
|
<div class=\"metric\">
|
|
<span class=\"value\">{{ subrequests_time }} <span class=\"unit\">ms</span></span>
|
|
<span class=\"label\">Sub-Request{{ profile.children|length > 1 ? 's' }} time</span>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<h2>Execution timeline</h2>
|
|
|
|
{% if collector.events is empty %}
|
|
<div class=\"empty\">
|
|
<p>No timing events have been recorded. Are you sure that debugging is enabled in the kernel?</p>
|
|
</div>
|
|
{% else %}
|
|
{{ block('panelContent') }}
|
|
{% endif %}
|
|
{% endblock %}
|
|
|
|
{% block panelContent %}
|
|
<form id=\"timeline-control\" action=\"\" method=\"get\">
|
|
<input type=\"hidden\" name=\"panel\" value=\"time\">
|
|
<label for=\"threshold\">Threshold</label>
|
|
<input type=\"number\" size=\"3\" name=\"threshold\" id=\"threshold\" value=\"3\" min=\"0\"> ms
|
|
<span class=\"help\">(timeline only displays events with a duration longer than this threshold)</span>
|
|
</form>
|
|
|
|
{% if profile.parent %}
|
|
<h3>
|
|
Sub-Request {{ profile.getcollector('request').requestattributes.get('_controller') }}
|
|
<small>
|
|
{{ collector.events.__section__.duration }} ms
|
|
<a class=\"newline\" href=\"{{ path('_profiler', { token: profile.parent.token, panel: 'time' }) }}\">Return to parent request</a>
|
|
</small>
|
|
</h3>
|
|
{% elseif profile.children|length > 0 %}
|
|
<h3>
|
|
Main Request <small>{{ collector.events.__section__.duration }} ms</small>
|
|
</h3>
|
|
{% endif %}
|
|
|
|
{{ helper.display_timeline('timeline_' ~ token, collector.events, colors) }}
|
|
|
|
{% if profile.children|length %}
|
|
<p class=\"help\">Note: sections with a striped background correspond to sub-requests.</p>
|
|
|
|
<h3>Sub-requests <small>({{ profile.children|length }})</small></h3>
|
|
|
|
{% for child in profile.children %}
|
|
{% set events = child.getcollector('time').events %}
|
|
<h4>
|
|
<a href=\"{{ path('_profiler', { token: child.token, panel: 'time' }) }}\">{{ child.getcollector('request').requestattributes.get('_controller') }}</a>
|
|
<small>{{ events.__section__.duration }} ms</small>
|
|
</h4>
|
|
|
|
{{ helper.display_timeline('timeline_' ~ child.token, events, colors) }}
|
|
{% endfor %}
|
|
{% endif %}
|
|
|
|
<script>{% autoescape 'js' %}//<![CDATA[
|
|
/**
|
|
* In-memory key-value cache manager
|
|
*/
|
|
var cache = new function() {
|
|
\"use strict\";
|
|
var dict = {};
|
|
|
|
this.get = function(key) {
|
|
return dict.hasOwnProperty(key)
|
|
? dict[key]
|
|
: null;
|
|
};
|
|
|
|
this.set = function(key, value) {
|
|
dict[key] = value;
|
|
|
|
return value;
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Query an element with a CSS selector.
|
|
*
|
|
* @param {string} selector - a CSS-selector-compatible query string
|
|
*
|
|
* @return DOMElement|null
|
|
*/
|
|
function query(selector)
|
|
{
|
|
\"use strict\";
|
|
var key = 'SELECTOR: ' + selector;
|
|
|
|
return cache.get(key) || cache.set(key, document.querySelector(selector));
|
|
}
|
|
|
|
/**
|
|
* Canvas Manager
|
|
*/
|
|
function CanvasManager(requests, maxRequestTime) {
|
|
\"use strict\";
|
|
|
|
var _drawingColors = {{ colors|json_encode|raw }},
|
|
_storagePrefix = 'timeline/',
|
|
_threshold = 1,
|
|
_requests = requests,
|
|
_maxRequestTime = maxRequestTime;
|
|
|
|
/**
|
|
* Check whether this event is a child event.
|
|
*
|
|
* @return true if it is
|
|
*/
|
|
function isChildEvent(event)
|
|
{
|
|
return '__section__.child' === event.name;
|
|
}
|
|
|
|
/**
|
|
* Check whether this event is categorized in 'section'.
|
|
*
|
|
* @return true if it is
|
|
*/
|
|
function isSectionEvent(event)
|
|
{
|
|
return 'section' === event.category;
|
|
}
|
|
|
|
/**
|
|
* Get the width of the container.
|
|
*/
|
|
function getContainerWidth()
|
|
{
|
|
return query('#collector-content h2').clientWidth;
|
|
}
|
|
|
|
/**
|
|
* Draw one canvas.
|
|
*
|
|
* @param request the request object
|
|
* @param max <subjected for removal>
|
|
* @param threshold the threshold (lower bound) of the length of the timeline (in milliseconds)
|
|
* @param width the width of the canvas
|
|
*/
|
|
this.drawOne = function(request, max, threshold, width)
|
|
{
|
|
\"use strict\";
|
|
var text,
|
|
ms,
|
|
xc,
|
|
drawableEvents,
|
|
mainEvents,
|
|
elementId = 'timeline_' + request.id,
|
|
canvasHeight = 0,
|
|
gapPerEvent = 38,
|
|
colors = _drawingColors,
|
|
space = 10.5,
|
|
ratio = (width - space * 2) / max,
|
|
h = space,
|
|
x = request.left * ratio + space, // position
|
|
canvas = cache.get(elementId) || cache.set(elementId, document.getElementById(elementId)),
|
|
ctx = canvas.getContext(\"2d\"),
|
|
scaleRatio,
|
|
devicePixelRatio;
|
|
|
|
// Filter events whose total time is below the threshold.
|
|
drawableEvents = request.events.filter(function(event) {
|
|
return event.duration >= threshold;
|
|
});
|
|
|
|
canvasHeight += gapPerEvent * drawableEvents.length;
|
|
|
|
// For retina displays so text and boxes will be crisp
|
|
devicePixelRatio = window.devicePixelRatio == \"undefined\" ? 1 : window.devicePixelRatio;
|
|
scaleRatio = devicePixelRatio / 1;
|
|
|
|
canvas.width = width * scaleRatio;
|
|
canvas.height = canvasHeight * scaleRatio;
|
|
|
|
canvas.style.width = width + 'px';
|
|
canvas.style.height = canvasHeight + 'px';
|
|
|
|
ctx.scale(scaleRatio, scaleRatio);
|
|
|
|
ctx.textBaseline = \"middle\";
|
|
ctx.lineWidth = 0;
|
|
|
|
// For each event, draw a line.
|
|
ctx.strokeStyle = \"#CCC\";
|
|
|
|
drawableEvents.forEach(function(event) {
|
|
event.periods.forEach(function(period) {
|
|
var timelineHeadPosition = x + period.start * ratio;
|
|
|
|
if (isChildEvent(event)) {
|
|
/* create a striped background dynamically */
|
|
var img = new Image();
|
|
img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKBAMAAAB/HNKOAAAAIVBMVEX////w8PDd7h7d7h7d7h7d7h7w8PDw8PDw8PDw8PDw8PAOi84XAAAAKUlEQVQImWNI71zAwMBQMYuBgY0BxExnADErGEDMTgYQE8hnAKtCZwIAlcMNSR9a1OEAAAAASUVORK5CYII=';
|
|
var pattern = ctx.createPattern(img, 'repeat');
|
|
|
|
ctx.fillStyle = pattern;
|
|
ctx.fillRect(timelineHeadPosition, 0, (period.end - period.start) * ratio, canvasHeight);
|
|
} else if (isSectionEvent(event)) {
|
|
var timelineTailPosition = x + period.end * ratio;
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, 0);
|
|
ctx.lineTo(timelineHeadPosition, canvasHeight);
|
|
ctx.moveTo(timelineTailPosition, 0);
|
|
ctx.lineTo(timelineTailPosition, canvasHeight);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Filter for main events.
|
|
mainEvents = drawableEvents.filter(function(event) {
|
|
return !isChildEvent(event)
|
|
});
|
|
|
|
// For each main event, draw the visual presentation of timelines.
|
|
mainEvents.forEach(function(event) {
|
|
|
|
h += 8;
|
|
|
|
// For each sub event, ...
|
|
event.periods.forEach(function(period) {
|
|
// Set the drawing style.
|
|
ctx.fillStyle = colors['default'];
|
|
ctx.strokeStyle = colors['default'];
|
|
|
|
if (colors[event.name]) {
|
|
ctx.fillStyle = colors[event.name];
|
|
ctx.strokeStyle = colors[event.name];
|
|
} else if (colors[event.category]) {
|
|
ctx.fillStyle = colors[event.category];
|
|
ctx.strokeStyle = colors[event.category];
|
|
}
|
|
|
|
// Draw the timeline
|
|
var timelineHeadPosition = x + period.start * ratio;
|
|
|
|
if (!isSectionEvent(event)) {
|
|
ctx.fillRect(timelineHeadPosition, h + 3, 2, 8);
|
|
ctx.fillRect(timelineHeadPosition, h, (period.end - period.start) * ratio || 2, 6);
|
|
} else {
|
|
var timelineTailPosition = x + period.end * ratio;
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, h);
|
|
ctx.lineTo(timelineHeadPosition, h + 11);
|
|
ctx.lineTo(timelineHeadPosition + 8, h);
|
|
ctx.lineTo(timelineHeadPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineTailPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h + 11);
|
|
ctx.lineTo(timelineTailPosition - 8, h);
|
|
ctx.lineTo(timelineTailPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
|
|
ctx.beginPath();
|
|
ctx.moveTo(timelineHeadPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h);
|
|
ctx.lineTo(timelineTailPosition, h + 2);
|
|
ctx.lineTo(timelineHeadPosition, h + 2);
|
|
ctx.lineTo(timelineHeadPosition, h);
|
|
ctx.fill();
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
}
|
|
});
|
|
|
|
h += 30;
|
|
|
|
ctx.beginPath();
|
|
ctx.strokeStyle = \"#E0E0E0\";
|
|
ctx.moveTo(0, h - 10);
|
|
ctx.lineTo(width, h - 10);
|
|
ctx.closePath();
|
|
ctx.stroke();
|
|
});
|
|
|
|
h = space;
|
|
|
|
// For each event, draw the label.
|
|
mainEvents.forEach(function(event) {
|
|
|
|
ctx.fillStyle = \"#444\";
|
|
ctx.font = \"12px sans-serif\";
|
|
text = event.name;
|
|
ms = \" \" + (event.duration < 1 ? event.duration : parseInt(event.duration, 10)) + \" ms / \" + event.memory + \" MB\";
|
|
if (x + event.starttime * ratio + ctx.measureText(text + ms).width > width) {
|
|
ctx.textAlign = \"end\";
|
|
ctx.font = \"10px sans-serif\";
|
|
ctx.fillStyle = \"#777\";
|
|
xc = x + event.endtime * ratio - 1;
|
|
ctx.fillText(ms, xc, h);
|
|
|
|
xc -= ctx.measureText(ms).width;
|
|
ctx.font = \"12px sans-serif\";
|
|
ctx.fillStyle = \"#222\";
|
|
ctx.fillText(text, xc, h);
|
|
} else {
|
|
ctx.textAlign = \"start\";
|
|
ctx.font = \"13px sans-serif\";
|
|
ctx.fillStyle = \"#222\";
|
|
xc = x + event.starttime * ratio + 1;
|
|
ctx.fillText(text, xc, h);
|
|
|
|
xc += ctx.measureText(text).width;
|
|
ctx.font = \"11px sans-serif\";
|
|
ctx.fillStyle = \"#777\";
|
|
ctx.fillText(ms, xc, h);
|
|
}
|
|
|
|
h += gapPerEvent;
|
|
});
|
|
};
|
|
|
|
this.drawAll = function(width, threshold)
|
|
{
|
|
\"use strict\";
|
|
|
|
width = width || getContainerWidth();
|
|
threshold = threshold || this.getThreshold();
|
|
|
|
var self = this;
|
|
|
|
_requests.forEach(function(request) {
|
|
self.drawOne(request, _maxRequestTime, threshold, width);
|
|
});
|
|
};
|
|
|
|
this.getThreshold = function() {
|
|
var threshold = Sfjs.getPreference(_storagePrefix + 'threshold');
|
|
|
|
if (null === threshold) {
|
|
return _threshold;
|
|
}
|
|
|
|
_threshold = parseInt(threshold);
|
|
|
|
return _threshold;
|
|
};
|
|
|
|
this.setThreshold = function(threshold)
|
|
{
|
|
_threshold = threshold;
|
|
|
|
Sfjs.setPreference(_storagePrefix + 'threshold', threshold);
|
|
|
|
return this;
|
|
};
|
|
}
|
|
|
|
function canvasAutoUpdateOnResizeAndSubmit(e) {
|
|
e.preventDefault();
|
|
canvasManager.drawAll();
|
|
}
|
|
|
|
function canvasAutoUpdateOnThresholdChange(e) {
|
|
canvasManager
|
|
.setThreshold(query('input[name=\"threshold\"]').value)
|
|
.drawAll();
|
|
}
|
|
|
|
var requests_data = {
|
|
\"max\": {{ \"%F\"|format(collector.events.__section__.endtime) }},
|
|
\"requests\": [
|
|
{{ helper.dump_request_data(token, profile, collector.events, collector.events.__section__.origin) }}
|
|
|
|
{% if profile.children|length %}
|
|
,
|
|
{% for child in profile.children %}
|
|
{{ helper.dump_request_data(child.token, child, child.getcollector('time').events, collector.events.__section__.origin) }}{{ loop.last ? '' : ',' }}
|
|
{% endfor %}
|
|
{% endif %}
|
|
]
|
|
};
|
|
|
|
var canvasManager = new CanvasManager(requests_data.requests, requests_data.max);
|
|
|
|
query('input[name=\"threshold\"]').value = canvasManager.getThreshold();
|
|
canvasManager.drawAll();
|
|
|
|
// Update the colors of legends.
|
|
var timelineLegends = document.querySelectorAll('.sf-profiler-timeline > .legends > span[data-color]');
|
|
|
|
for (var i = 0; i < timelineLegends.length; ++i) {
|
|
var timelineLegend = timelineLegends[i];
|
|
|
|
timelineLegend.style.borderLeftColor = timelineLegend.getAttribute('data-color');
|
|
}
|
|
|
|
// Bind event handlers
|
|
var elementTimelineControl = query('#timeline-control'),
|
|
elementThresholdControl = query('input[name=\"threshold\"]');
|
|
|
|
window.onresize = canvasAutoUpdateOnResizeAndSubmit;
|
|
elementTimelineControl.onsubmit = canvasAutoUpdateOnResizeAndSubmit;
|
|
|
|
elementThresholdControl.onclick = canvasAutoUpdateOnThresholdChange;
|
|
elementThresholdControl.onchange = canvasAutoUpdateOnThresholdChange;
|
|
elementThresholdControl.onkeyup = canvasAutoUpdateOnThresholdChange;
|
|
|
|
window.setTimeout(function() {
|
|
canvasAutoUpdateOnThresholdChange(null);
|
|
}, 50);
|
|
|
|
//]]>{% endautoescape %}</script>
|
|
{% endblock %}
|
|
|
|
{% macro dump_request_data(token, profile, events, origin) %}
|
|
{% autoescape 'js' %}
|
|
{% from _self import dump_events %}
|
|
{
|
|
\"id\": \"{{ token }}\",
|
|
\"left\": {{ \"%F\"|format(events.__section__.origin - origin) }},
|
|
\"events\": [
|
|
{{ dump_events(events) }}
|
|
]
|
|
}
|
|
{% endautoescape %}
|
|
{% endmacro %}
|
|
|
|
{% macro dump_events(events) %}
|
|
{% autoescape 'js' %}
|
|
{% for name, event in events %}
|
|
{% if '__section__' != name %}
|
|
{
|
|
\"name\": \"{{ name }}\",
|
|
\"category\": \"{{ event.category }}\",
|
|
\"origin\": {{ \"%F\"|format(event.origin) }},
|
|
\"starttime\": {{ \"%F\"|format(event.starttime) }},
|
|
\"endtime\": {{ \"%F\"|format(event.endtime) }},
|
|
\"duration\": {{ \"%F\"|format(event.duration) }},
|
|
\"memory\": {{ \"%.1F\"|format(event.memory / 1024 / 1024) }},
|
|
\"periods\": [
|
|
{%- for period in event.periods -%}
|
|
{\"start\": {{ \"%F\"|format(period.starttime) }}, \"end\": {{ \"%F\"|format(period.endtime) }}}{{ loop.last ? '' : ', ' }}
|
|
{%- endfor -%}
|
|
]
|
|
}{{ loop.last ? '' : ',' }}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% endautoescape %}
|
|
{% endmacro %}
|
|
|
|
{% macro display_timeline(id, events, colors) %}
|
|
<div class=\"sf-profiler-timeline\">
|
|
<div class=\"legends\">
|
|
{% for category, color in colors %}
|
|
<span data-color=\"{{ color }}\">{{ category }}</span>
|
|
{% endfor %}
|
|
</div>
|
|
<canvas width=\"680\" height=\"\" id=\"{{ id }}\" class=\"timeline\"></canvas>
|
|
</div>
|
|
{% endmacro %}
|
|
", "@WebProfiler/Collector/time.html.twig", "/Users/kadmin/Websites/sterntours-3/vendor/symfony/symfony/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/time.html.twig");
|
|
}
|
|
}
|