Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bar: ignore pannels #388

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ php:
- 7.1
- 7.2
- 7.3
- 7.4snapshot

env:
- PHP_BIN=php
Expand Down Expand Up @@ -69,6 +70,7 @@ jobs:
allow_failures:
- stage: Static Analysis (informative)
- stage: Code Coverage
- php: 7.4snapshot


sudo: false
Expand Down
9 changes: 6 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@
"ext-json": "*"
},
"require-dev": {
"nette/utils": "^2.4 || ^3.0",
"nette/di": "^2.4 || ~3.0.0",
"nette/utils": "^3.0",
"nette/di": "^3.0",
"nette/tester": "^2.2",
"psr/log": "^1.0"
},
"conflict": {
"nette/di": "<3.0"
},
"suggest": {
"https://nette.org/donate": "Please support Tracy via a donation"
},
Expand All @@ -35,7 +38,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-master": "2.6-dev"
"dev-master": "2.7-dev"
}
}
}
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Alternatively, you can download the whole package or [tracy.phar](https://github

| Tracy | PHP | compatible with browsers
|-----------|---------------|----------
| Tracy 2.7 | PHP 7.1 – 7.3 | Chrome 49+, Firefox 45+, MS Edge 14+, Safari 10+ and iOS Safari 10.2+
| Tracy 2.6 | PHP 7.1 – 7.3 | Chrome 49+, Firefox 45+, MS Edge 14+, Safari 10+ and iOS Safari 10.2+
| Tracy 2.5 | PHP 5.4.4 – 7.3 | Chrome 49+, Firefox 45+, MS Edge 12+, Safari 10+ and iOS Safari 10.2+
| Tracy 2.4 | PHP 5.4.4 – 7.2 | Chrome 29+, Firefox 28+, IE 11+ (except AJAX), MS Edge 12+, Safari 9+ and iOS Safari 9.2+
Expand Down
4 changes: 2 additions & 2 deletions src/Bridges/Nette/Bridge.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ public static function renderLatteError(?\Throwable $e): ?array
$lines = file($file);
if (preg_match('#// source: (\S+\.latte)#', $lines[1], $m) && @is_file($m[1])) { // @ - may trigger error
$templateFile = $m[1];
$templateLine = preg_match('#/\* line (\d+) \*/#', $lines[$e->getLine() - 1], $m) ? (int) $m[1] : null;
$templateLine = $e->getLine() && preg_match('#/\* line (\d+) \*/#', $lines[$e->getLine() - 1], $m) ? (int) $m[1] : null;
return [
'tab' => 'Template',
'panel' => '<p><b>File:</b> ' . Helpers::editorLink($templateFile, $templateLine) . '</p>'
. ($templateLine === null
? ''
: '<pre class="code"><div>' . BlueScreen::highlightFile($templateFile, $templateLine) . '</div></pre>'),
: BlueScreen::highlightFile($templateFile, $templateLine)),
];
}
}
Expand Down
57 changes: 30 additions & 27 deletions src/Bridges/Nette/TracyExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace Tracy\Bridges\Nette;

use Nette;
use Nette\Schema\Expect;
use Tracy;


Expand All @@ -18,26 +19,6 @@
*/
class TracyExtension extends Nette\DI\CompilerExtension
{
public $defaults = [
'email' => null,
'fromEmail' => null,
'logSeverity' => null,
'editor' => null,
'browser' => null,
'errorTemplate' => null,
'strictMode' => null,
'showBar' => null,
'maxLen' => null,
'maxLength' => null,
'maxDepth' => null,
'showLocation' => null,
'scream' => null,
'bar' => [], // of class name
'blueScreen' => [], // of callback
'editorMapping' => [],
'netteMailer' => true,
];

/** @var bool */
private $debugMode;

Expand All @@ -52,9 +33,31 @@ public function __construct(bool $debugMode = false, bool $cliMode = false)
}


public function getConfigSchema(): Nette\Schema\Schema
{
return Expect::structure([
'email' => Expect::email()->dynamic(),
'fromEmail' => Expect::email()->dynamic(),
'logSeverity' => Expect::scalar(),
'editor' => Expect::string()->dynamic(),
'browser' => Expect::string()->dynamic(),
'errorTemplate' => Expect::string()->dynamic(),
'strictMode' => Expect::bool()->dynamic(),
'showBar' => Expect::bool()->dynamic(),
'maxLength' => Expect::int()->dynamic(),
'maxDepth' => Expect::int()->dynamic(),
'showLocation' => Expect::bool()->dynamic(),
'scream' => Expect::bool()->dynamic(),
'bar' => Expect::listOf('class|Nette\DI\Definitions\Statement'),
'blueScreen' => Expect::listOf('callable'),
'editorMapping' => Expect::arrayOf('string')->dynamic(),
'netteMailer' => Expect::bool(true),
]);
}


public function loadConfiguration()
{
$this->validateConfig($this->defaults);
$builder = $this->getContainerBuilder();

$builder->addDefinition($this->prefix('logger'))
Expand All @@ -74,7 +77,7 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
$initialize = $class->getMethod('initialize');
$builder = $this->getContainerBuilder();

$options = $this->config;
$options = (array) $this->config;
unset($options['bar'], $options['blueScreen'], $options['netteMailer']);
if (isset($options['logSeverity'])) {
$res = 0;
Expand All @@ -94,17 +97,17 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
}

$logger = $builder->getDefinition($this->prefix('logger'));
if ($logger->getFactory()->getEntity() !== [Tracy\Debugger::class, 'getLogger']) {
if (!$logger instanceof Nette\DI\ServiceDefinition || $logger->getFactory()->getEntity() !== [Tracy\Debugger::class, 'getLogger']) {
$initialize->addBody($builder->formatPhp('Tracy\Debugger::setLogger(?);', [$logger]));
}
if ($this->config['netteMailer'] && $builder->getByType(Nette\Mail\IMailer::class)) {
if ($this->config->netteMailer && $builder->getByType(Nette\Mail\IMailer::class)) {
$initialize->addBody($builder->formatPhp('Tracy\Debugger::getLogger()->mailer = ?;', [
[new Nette\DI\Statement(Tracy\Bridges\Nette\MailSender::class, ['fromEmail' => $this->config['fromEmail']]), 'send'],
[new Nette\DI\Statement(Tracy\Bridges\Nette\MailSender::class, ['fromEmail' => $this->config->fromEmail]), 'send'],
]));
}

if ($this->debugMode) {
foreach ((array) $this->config['bar'] as $item) {
foreach ($this->config->bar as $item) {
if (is_string($item) && substr($item, 0, 1) === '@') {
$item = new Nette\DI\Statement(['@' . $builder::THIS_CONTAINER, 'getService'], [substr($item, 1)]);
} elseif (is_string($item)) {
Expand All @@ -122,7 +125,7 @@ public function afterCompile(Nette\PhpGenerator\ClassType $class)
}
}

foreach ((array) $this->config['blueScreen'] as $item) {
foreach ($this->config->blueScreen as $item) {
$initialize->addBody($builder->formatPhp(
'$this->getService(?)->addPanel(?);',
Nette\DI\Helpers::filterArguments([$this->prefix('blueScreen'), $item])
Expand Down
14 changes: 14 additions & 0 deletions src/Tracy/Bar/Bar.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class Bar
/** @var string|NULL generated by renderLoader() */
private $contentId;

/** @var array|string[] */
private $ignorePanels = [];

/**
* Add custom panel.
Expand Down Expand Up @@ -52,6 +54,16 @@ public function getPanel(string $id): ?IBarPanel


/**
* @param string $panelId
* @return static
*/
public function ignorePanel(string $panelId) {
$this->ignorePanels[] = $panelId;
return $this;
}


/**
* Renders loading <script>
*/
public function renderLoader(): void
Expand Down Expand Up @@ -142,6 +154,8 @@ private function renderPanels(string $suffix = ''): array
$panels = [];

foreach ($this->panels as $id => $panel) {
if (in_array($id, $this->ignorePanels)) continue;

$idHtml = preg_replace('#[^a-z0-9]+#i', '-', $id) . $suffix;
try {
$tab = (string) $panel->getTab();
Expand Down
10 changes: 5 additions & 5 deletions src/Tracy/Bar/assets/bar.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@

elem.querySelectorAll('.tracy-icons a').forEach((link) => {
link.addEventListener('click', (e) => {
if (link.rel === 'close') {
if (link.dataset.tracyAction === 'close') {
this.toPeek();
} else if (link.rel === 'window') {
} else if (link.dataset.tracyAction === 'window') {
this.toWindow();
}
e.preventDefault();
Expand Down Expand Up @@ -258,7 +258,7 @@
initTabs(elem) {
elem.querySelectorAll('a').forEach((link) => {
link.addEventListener('click', (e) => {
if (link.rel === 'close') {
if (link.dataset.tracyAction === 'close') {
this.close();

} else if (link.rel) {
Expand All @@ -284,7 +284,7 @@
});

link.addEventListener('mouseenter', (e) => {
if (e.buttons || !link.rel || link.rel === 'close' || elem.classList.contains('tracy-dragged')) {
if (e.buttons || !link.rel || elem.classList.contains('tracy-dragged')) {
return;
}

Expand All @@ -311,7 +311,7 @@
link.addEventListener('mouseleave', () => {
clearTimeout(this.displayTimeout);

if (link.rel && link.rel !== 'close' && !elem.classList.contains('tracy-dragged')) {
if (link.rel && !elem.classList.contains('tracy-dragged')) {
Debug.panels[link.rel].blur();
}
});
Expand Down
2 changes: 1 addition & 1 deletion src/Tracy/Bar/assets/bar.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ namespace Tracy;
<?php } endforeach ?>

<?php if ($type === 'main'): ?>
<li><a href="#" rel="close" title="close debug bar">&times;</a></li>
<li><a href="#" data-tracy-action="close" title="close debug bar">&times;</a></li>
<?php endif ?>
</ul>
4 changes: 2 additions & 2 deletions src/Tracy/Bar/assets/panels.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ use Tracy\Helpers;

$icons = '
<div class="tracy-icons">
<a href="#" rel="window" title="open in window">&curren;</a>
<a href="#" rel="close" title="close window">&times;</a>
<a href="#" data-tracy-action="window" title="open in window">&curren;</a>
<a href="#" data-tracy-action="close" title="close window">&times;</a>
</div>
';

Expand Down
11 changes: 9 additions & 2 deletions src/Tracy/Bar/panels/info.panel.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ $countClasses = function (array $list): int {
}));
};

$ipFormatter = static function (?string $ip): ?string {
if ($ip === '127.0.0.1' || $ip === '::1') {
$ip .= ' (localhost)';
}
return $ip;
};

$opcache = function_exists('opcache_get_status') ? @opcache_get_status() : null; // @ can be restricted
$cachedFiles = isset($opcache['scripts']) ? array_intersect(array_keys($opcache['scripts']), get_included_files()) : [];

Expand All @@ -36,8 +43,8 @@ $info = [
'OPcache' => $opcache ? round(count($cachedFiles) * 100 / count(get_included_files())) . '% cached' : null,
'Classes + interfaces + traits' => $countClasses(get_declared_classes()) . ' + '
. $countClasses(get_declared_interfaces()) . ' + ' . $countClasses(get_declared_traits()),
'Your IP' => $_SERVER['REMOTE_ADDR'] ?? null,
'Server IP' => $_SERVER['SERVER_ADDR'] ?? null,
'Your IP' => $ipFormatter($_SERVER['REMOTE_ADDR'] ?? null),
'Server IP' => $ipFormatter($_SERVER['SERVER_ADDR'] ?? null),
'HTTP method / response code' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] . ' / ' . http_response_code() : null,
'PHP' => PHP_VERSION,
'Xdebug' => extension_loaded('xdebug') ? phpversion('xdebug') : null,
Expand Down
26 changes: 15 additions & 11 deletions src/Tracy/BlueScreen/BlueScreen.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
class BlueScreen
{
private const MAX_MESSAGE_LENGTH = 2000;

/** @var string[] */
public $info = [];

Expand Down Expand Up @@ -112,11 +114,10 @@ private function renderTemplate(\Throwable $exception, string $template, $toScre
$messageHtml = preg_replace(
'#\'\S(?:[^\']|\\\\\')*\S\'|"\S(?:[^"]|\\\\")*\S"#',
'<i>$0</i>',
htmlspecialchars((string) $exception->getMessage(), ENT_SUBSTITUTE, 'UTF-8')
htmlspecialchars(Dumper::encodeString((string) $exception->getMessage(), self::MAX_MESSAGE_LENGTH), ENT_SUBSTITUTE, 'UTF-8')
);
$info = array_filter($this->info);
$source = Helpers::getSource();
$sourceIsUrl = preg_match('#^https?://#', $source);
$title = $exception instanceof \ErrorException
? Helpers::errorTypeToString($exception->getSeverity())
: Helpers::getClass($exception);
Expand Down Expand Up @@ -241,11 +242,11 @@ private function renderActions(\Throwable $ex): array
/**
* Returns syntax highlighted source code.
*/
public static function highlightFile(string $file, int $line, int $lines = 15, array $vars = []): ?string
public static function highlightFile(string $file, int $line, int $lines = 15, array $vars = [], array $keysToHide = []): ?string
{
$source = @file_get_contents($file); // @ file may not exist
if ($source) {
$source = static::highlightPhp($source, $line, $lines, $vars);
$source = static::highlightPhp($source, $line, $lines, $vars, $keysToHide);
if ($editor = Helpers::editorUri($file, $line)) {
$source = substr_replace($source, ' data-tracy-href="' . Helpers::escapeHtml($editor) . '"', 4, 0);
}
Expand All @@ -257,7 +258,7 @@ public static function highlightFile(string $file, int $line, int $lines = 15, a
/**
* Returns syntax highlighted source code.
*/
public static function highlightPhp(string $source, int $line, int $lines = 15, array $vars = []): string
public static function highlightPhp(string $source, int $line, int $lines = 15, array $vars = [], array $keysToHide = []): string
{
if (function_exists('ini_set')) {
ini_set('highlight.comment', '#998; font-style: italic');
Expand All @@ -274,12 +275,15 @@ public static function highlightPhp(string $source, int $line, int $lines = 15,
$out .= static::highlightLine($source, $line, $lines);

if ($vars) {
$out = preg_replace_callback('#">\$(\w+)(&nbsp;)?</span>#', function (array $m) use ($vars): string {
return array_key_exists($m[1], $vars)
? '" title="'
. str_replace('"', '&quot;', trim(strip_tags(Dumper::toHtml($vars[$m[1]], [Dumper::DEPTH => 1]))))
. $m[0]
: $m[0];
$out = preg_replace_callback('#">\$(\w+)(&nbsp;)?</span>#', function (array $m) use ($vars, $keysToHide): string {
if (array_key_exists($m[1], $vars)) {
$dump = Dumper::toHtml($vars[$m[1]], [
Dumper::DEPTH => 1,
Dumper::KEYS_TO_HIDE => $keysToHide,
]);
return '" title="' . str_replace('"', '&quot;', trim(strip_tags($dump))) . $m[0];
}
return $m[0];
}, $out);
}

Expand Down
20 changes: 17 additions & 3 deletions src/Tracy/BlueScreen/assets/bluescreen.css
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,20 @@
padding: 3px;
}

.tracy-bs-main {
display: flex;
flex-direction: column;
min-height: 100vh;
}

.tracy-bs-main.tracy-collapsed {
display: none;
}

#tracy-bs div.panel:last-of-type {
flex: 1;
}

#tracy-bs-error {
background: #CD1818;
color: white;
Expand Down Expand Up @@ -153,7 +167,7 @@
list-style: none;
}

#tracy-bs-logo a {
#tracy-bs .footer-logo a {
position: absolute;
bottom: 0;
right: 0;
Expand All @@ -165,8 +179,8 @@
margin: 0;
}

#tracy-bs-logo a:hover,
#tracy-bs-logo a:focus {
#tracy-bs .footer-logo a:hover,
#tracy-bs .footer-logo a:focus {
opacity: 1;
transition: opacity 0.1s;
}
Expand Down
Loading