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

[DomCrawler] Fix getting text after a child node with Crawler::innerText() #48684

Closed
wants to merge 3,422 commits into from

Conversation

otsch
Copy link
Contributor

@otsch otsch commented Dec 16, 2022

Q A
Branch? 6.3
Bug fix? yes
New feature? no
Deprecations? no
Tickets Fix #48682
License MIT

nicolas-grekas and others added 30 commits December 13, 2022 15:17
…xt node (BrandonlinU)

This PR was squashed before being merged into the 6.2 branch.

Discussion
----------

[DependencyInjection] Fix bug when tag name is a text node

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix symfony#48445
| License       | MIT

Following the discussion in the ticket, I added a test for a tag without name attribute and content inside the tag for the name. I use `$tag->childElementCount !== 0` instead of `$tag->hasChildNode()` to detect if a `<attribute>` tag is present in the tag definition, or is only the name of the tag.

Commits
-------

b9337f1 [DependencyInjection] Fix bug when tag name is a text node
…e error message (Titouan Galopin)

This PR was merged into the 6.2 branch.

Discussion
----------

[Console] Fix missing command not matching namespace error message

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix for symfony#47750
| License       | MIT
| Doc PR        | -

Following symfony#47750, running a command with an exception not related to the console (for instance fatal error) could end up in a situation where the error handling code doesn't stop the execution flow and result in:

```
In Application.php line 307:

  [ErrorException]
  Warning: Undefined variable $command
```

This fixes this behavior by throwing the original exception when no other error handling cases could handle the problem.

Commits
-------

1e7202d Fix missing command not matching namespace error message
This PR was merged into the 6.2 branch.

Discussion
----------

[TwigBundle] Alias BodyRendererInterface

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |

In the [Sending Messages Async](https://symfony.com/doc/current/mailer.html#sending-messages-async) ( symfony/symfony-docs@4fbbc16 ) docs the BodyRenderer is mentioned and used in the example. But there's no alias yet, not sure if this was intentional `@fabpot`? But it would be nice if it works right away without the need to add the alias manually.

Commits
-------

248e792 [TwigBundle] Alias BodyRendererInterface
…in `Security::login()` (chalasr)

This PR was merged into the 6.2 branch.

Discussion
----------

[SecurityBundle] Fix authenticator existence check in `Security::login()`

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix symfony#48595
| License       | MIT
| Doc PR        | -

Commits
-------

97fe54d [SecurityBundle] Fix authenticator existence check in `Security::login()`
…adicPlaceholder parameters (Kocal)

This PR was merged into the 6.2 branch.

Discussion
----------

[Translation] Fix extraction when dealing with VariadicPlaceholder parameters

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Tickets       | Fix symfony#48422 <!-- prefix each issue number with "Fix #", no need to create an issue if none exists, explain below instead -->
| License       | MIT
| Doc PR        | symfony/symfony-docs#... <!-- required for new features -->

I don't have the time for now to check if the command has tests or not, but dealing with raw args with + filtering for `Node\Arg` instance make the `extract` command working again.

The issue is "caused by" https://github.com/symfony/symfony/blob/6.3/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L71, the extract command is not able to deal with VariadicPlaceholder node. Changing to `[$this, 'trans']` works, but this is not the wanted solution.

**Before:**

```
symfony console translation:extract fr --force -vvv

Translation Messages Extractor and Dumper
=========================================

 // Generating "fr" translation files for "default directory"

 // Parsing templates...

In CallLike.php line 36:

  [AssertionError (1)]
  assert(!$this->isFirstClassCallable())

Exception trace:
  at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php:36
 assert() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php:36
 PhpParser\Node\Expr\CallLike->getArgs() at /Users/kocal/workspace/chronos/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php:66
 Symfony\Component\Translation\Extractor\Visitor\AbstractVisitor->hasNodeNamedArguments() at /Users/kocal/workspace/chronos/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php:40
 Symfony\Component\Translation\Extractor\Visitor\TransMethodVisitor->enterNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:123
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:146
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:146
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /Users/kocal/workspace/chronos/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:91
 PhpParser\NodeTraverser->traverse() at /Users/kocal/workspace/chronos/vendor/symfony/translation/Extractor/PhpAstExtractor.php:56
 Symfony\Component\Translation\Extractor\PhpAstExtractor->extract() at /Users/kocal/workspace/chronos/vendor/symfony/translation/Extractor/ChainExtractor.php:48
 Symfony\Component\Translation\Extractor\ChainExtractor->extract() at /Users/kocal/workspace/chronos/vendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php:395
 Symfony\Bundle\FrameworkBundle\Command\TranslationUpdateCommand->extractMessages() at /Users/kocal/workspace/chronos/vendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php:200
 Symfony\Bundle\FrameworkBundle\Command\TranslationUpdateCommand->execute() at /Users/kocal/workspace/chronos/vendor/symfony/console/Command/Command.php:312
 Symfony\Component\Console\Command\Command->run() at /Users/kocal/workspace/chronos/vendor/symfony/console/Application.php:1038
 Symfony\Component\Console\Application->doRunCommand() at /Users/kocal/workspace/chronos/vendor/symfony/framework-bundle/Console/Application.php:88
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /Users/kocal/workspace/chronos/vendor/symfony/console/Application.php:312
 Symfony\Component\Console\Application->doRun() at /Users/kocal/workspace/chronos/vendor/symfony/framework-bundle/Console/Application.php:77
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /Users/kocal/workspace/chronos/vendor/symfony/console/Application.php:168
 Symfony\Component\Console\Application->run() at /Users/kocal/workspace/chronos/vendor/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php:54
 Symfony\Component\Runtime\Runner\Symfony\ConsoleApplicationRunner->run() at /Users/kocal/workspace/chronos/vendor/autoload_runtime.php:29
```

**After:**
```
symfony console translation:extract fr --force -vvv

Translation Messages Extractor and Dumper
=========================================

 // Generating "fr" translation files for "default directory"

 // Parsing templates...

 // Loading translation files...

 // Writing files...

 [OK] Translation files were successfully updated.

```

Commits
-------

2030c26 [Translation] Fix extraction when dealing with VariadicPlaceholder parameters
…(HypeMC)

This PR was merged into the 6.2 branch.

Discussion
----------

[HttpKernel] Fix `CacheAttributeListener` priority

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

Currently the `CacheAttributeListener` & the `IsGrantedAttributeListener` have the same priority:

```
Registered Listeners for "kernel.controller_arguments" Event
============================================================

 ------- --------------------------------------------------------------------------------------------------------- ----------
  Order   Callable                                                                                                  Priority
 ------- --------------------------------------------------------------------------------------------------------- ----------
  symfony#1      Symfony\Component\HttpKernel\EventListener\CacheAttributeListener::onKernelControllerArguments()          10
  symfony#2      Symfony\Component\Security\Http\EventListener\IsGrantedAttributeListener::onKernelControllerArguments()   10
  symfony#3      Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments()                         0
 ------- --------------------------------------------------------------------------------------------------------- ----------
```

Since the `CacheAttributeListener` is alphabetically first, it's first to get triggered. This can cause an unauthenticated user to receive a 304 Not modified instead of a 302 Redirect, resulting in the user seeing some stale content from when they were authenticated instead of getting redirected to the login page.

This PR changes the priority of the `CacheAttributeListener` to be lower than that of the `IsGrantedAttributeListener`.

Commits
-------

90eb89f [HttpKernel] Fix CacheAttributeListener priority
…sedExpression containing GetAttrNode (fancyweb)

This PR was merged into the 6.2 branch.

Discussion
----------

[ExpressionLanguage] Fix BC of cached SerializedParsedExpression containing GetAttrNode

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | symfony#48543
| License       | MIT
| Doc PR        | -

Ref symfony#47058

`GetAttrNode` can be serialized and cached through `SerializedParsedExpression`.

`@fsevestre` Can you try this small patch plz?

Commits
-------

6c33582 [ExpressionLanguage] Fix BC of cached SerializedParsedExpression containing GetAttrNode
* 6.2:
  [ExpressionLanguage] Fix BC of cached SerializedParsedExpression containing GetAttrNode
  [HttpKernel] Fix CacheAttributeListener priority
  [DependencyInjection] Fix bug when tag name is a text node
  [VarExporter] Fix adding a key to an uninitialized array
  Fix missing command not matching namespace error message
  [SecurityBundle] Fix authenticator existence check in `Security::login()`
  [TwigBundle] Alias BodyRendererInterface
  Point `Security::*` constants to `SecurityRequestAttributes::*` ones
  [Translation] Fix extraction when dealing with VariadicPlaceholder parameters
…tion behavior for allowed schemes (Titouan Galopin)

This PR was merged into the 6.1 branch.

Discussion
----------

[HtmlSanitizer] Fix HtmlSanitizer default configuration behavior for allowed schemes

| Q             | A
| ------------- | ---
| Branch?       | 6.1
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix symfony#48556
| License       | MIT
| Doc PR        | -

This issue happened not in the component but in the default configuration behavior (array was passed instead of null).

Commits
-------

93e5160 Fix HtmlSanitizer default configuration behavior for allowed schemes
…maxbeckers)

This PR was merged into the 6.1 branch.

Discussion
----------

[Console] Fix clear line with question in section

| Q             | A
| ------------- | ---
| Branch?       | 6.1
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix symfony#47411
| License       | MIT
| Doc PR        | -

In the issue symfony#47411 is the current behavior described (with videos).

The problem is in a section using a question and a clear. Then one line is not cleared because of the `return` so submit the input.

NOTICE: This bug might be as well in the versions 4.4+, but in the versions < 6.1 it would be more complicated to fix, because the `SymfonyStyle` does not have the property `$output` in this versions.

Commits
-------

fe1ddd3 [Console] Fix clear line with question in section
…ements for excluded services (apfelbox)

This PR was merged into the 6.2 branch.

Discussion
----------

[FrameworkBundle] container:debug CLI output improvements for excluded services

| Q             | A
| ------------- | ---
| Branch?       | 6.3
| Bug fix?      | no
| New feature?  | yes (not sure)
| Deprecations? | no
| Tickets       | —
| License       | MIT
| Doc PR        | —
<!--
Replace this notice by a short README for your feature/bugfix.
This will help reviewers and should be a good start for the documentation.

Additionally (see https://symfony.com/releases):
 - Always add tests and ensure they pass.
 - Bug fixes must be submitted against the lowest maintained branch where they apply
   (lowest branches are regularly merged to upper ones so they get the fixes too).
 - Features and deprecations must be submitted against the latest branch.
 - For new features, provide some code snippets to help understand usage.
 - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry
 - Never break backward compatibility (see https://symfony.com/bc).
-->

Normally I test whether the exclusion rules from the service container of my bundles work correctly by just using the `debug:container` command and looking whether my excluded services occur in the last.
However, due to the latest changes in symfony#46279 all services (excluded or not) are always in this list.

You need to open the definition to see if it was excluded:

![CleanShot 2022-12-12 at 11 01 08](https://user-images.githubusercontent.com/1032411/207017120-50d3c263-ce7a-4c92-bb7e-8a8f86c47983.png)

This PR proposes two things:

1. add a more prominent warning to the service definition details screen that the service is excluded

![CleanShot 2022-12-12 at 11 01 52](https://user-images.githubusercontent.com/1032411/207017261-44495233-f513-4c29-bb6d-469eb0418080.png)
(wording tbd)

2. mark the services as excluded in the list (right now by graying them out):

![CleanShot 2022-12-12 at 11 02 44](https://user-images.githubusercontent.com/1032411/207017481-993010da-3364-49dd-b7e0-4f3c07f14ad5.png)

If this looks like something you want to include, I will add the "graying out" part to the table view as well.
wdyt?

Commits
-------

9d2f10f Hide excluded services from container debug list
…tion when using Validation::createValidatorBuilder() (nicolas-grekas)

This PR was merged into the 6.2 branch.

Discussion
----------

[Validator] Allow opt-out of EmailValidator deprecation when using Validation::createValidatorBuilder()

| Q             | A
| ------------- | ---
| Branch?       | 6.2
| Bug fix?      | yes
| New feature?  | yes
| Deprecations? | yes
| Tickets       | Fix symfony#48541
| License       | MIT
| Doc PR        | -

As described in the linked issue, there is currently no way to opt out from a deprecation triggered by a validator when using the component standalone.

The example at hand presently is "The "loose" mode is deprecated. The default mode will be changed to "html5" in 7.0" as triggered by EmailValidator. There could be others in the future.

This PR provides a way around:
```php
$builder = Validation::createValidatorBuilder()
	->setConstraintValidatorFactory(new ConstraintValidatorFactory([EmailValidator::class => new EmailValidator(Email::VALIDATION_MODE_HTML5)]));
```

That's a bit verbose, but that does the job in a future-proof way.

Commits
-------

bb7ea3c [Validator] Allow opt-out of EmailValidator deprecation when using Validation::createValidatorBuilder()
* 5.4:
  [Mailer] Include all transports' debug messages in RoundRobin transport exception
  [FrameworkBundle] fix: fix help message
  Use relative timestamps
  [Cache] Fix dealing with ext-redis' multi/exec returning a bool
  [Messenger][Amqp] Added missing rpc_timeout option
  [Serializer] Prevent GetSetMethodNormalizer from creating invalid magic method call
  [HttpFoundation] Fix dumping array cookies
  [WebProfilerBundle] Fix dump header not being displayed
  TraceableHttpClient: increase decorator's priority
  Use static methods inside data providers
  [FrameworkBundle] Allow configuring `framework.exceptions` with a config builder
  bug symfony#48313 [Mime] Fix MessagePart serialization
  [ErrorHandler][DebugClassLoader] Fix some new return types support
  Fix getting the name of closures on PHP 8.1.11+
  [Translator] Fix typo "internal" / "interval"
  fix dumping top-level tagged values
* 6.0:
  [Mailer] Include all transports' debug messages in RoundRobin transport exception
  [FrameworkBundle] fix: fix help message
  Use relative timestamps
  [Cache] Fix dealing with ext-redis' multi/exec returning a bool
  [Messenger][Amqp] Added missing rpc_timeout option
  [Serializer] Prevent GetSetMethodNormalizer from creating invalid magic method call
  [HttpFoundation] Fix dumping array cookies
  [WebProfilerBundle] Fix dump header not being displayed
  TraceableHttpClient: increase decorator's priority
  Use static methods inside data providers
  [FrameworkBundle] Allow configuring `framework.exceptions` with a config builder
  bug symfony#48313 [Mime] Fix MessagePart serialization
  [ErrorHandler][DebugClassLoader] Fix some new return types support
  Fix getting the name of closures on PHP 8.1.11+
  [Translator] Fix typo "internal" / "interval"
  fix dumping top-level tagged values
* 6.1:
  [Mailer] Include all transports' debug messages in RoundRobin transport exception
  [FrameworkBundle] fix: fix help message
  Fix HtmlSanitizer default configuration behavior for allowed schemes
  Use relative timestamps
  [Cache] Fix dealing with ext-redis' multi/exec returning a bool
  [Messenger][Amqp] Added missing rpc_timeout option
  [Serializer] Prevent GetSetMethodNormalizer from creating invalid magic method call
  [HttpFoundation] Fix dumping array cookies
  [WebProfilerBundle] Fix dump header not being displayed
  TraceableHttpClient: increase decorator's priority
  Use static methods inside data providers
  [FrameworkBundle] Allow configuring `framework.exceptions` with a config builder
  bug symfony#48313 [Mime] Fix MessagePart serialization
  [HttpKernel][ErrorHandler] Fix reading the SYMFONY_IDE env var
  [ErrorHandler][DebugClassLoader] Fix some new return types support
  Fix getting the name of closures on PHP 8.1.11+
  [Translator] Fix typo "internal" / "interval"
  fix dumping top-level tagged values
  [Console] Fix clear line with question in section
* 6.2: (22 commits)
  [Mailer] Include all transports' debug messages in RoundRobin transport exception
  [FrameworkBundle] fix: fix help message
  Hide excluded services from container debug list
  [Validator] Allow opt-out of EmailValidator deprecation when using Validation::createValidatorBuilder()
  Fix HtmlSanitizer default configuration behavior for allowed schemes
  Use relative timestamps
  [Translation] add tests + fix
  [Cache] Fix dealing with ext-redis' multi/exec returning a bool
  [Messenger][Amqp] Added missing rpc_timeout option
  [Serializer] Prevent GetSetMethodNormalizer from creating invalid magic method call
  [HttpFoundation] Fix dumping array cookies
  [WebProfilerBundle] Fix dump header not being displayed
  TraceableHttpClient: increase decorator's priority
  Use static methods inside data providers
  [FrameworkBundle] Allow configuring `framework.exceptions` with a config builder
  bug symfony#48313 [Mime] Fix MessagePart serialization
  [HttpKernel][ErrorHandler] Fix reading the SYMFONY_IDE env var
  [ErrorHandler][DebugClassLoader] Fix some new return types support
  Fix getting the name of closures on PHP 8.1.11+
  [Translator] Fix typo "internal" / "interval"
  ...
* 5.4:
  [Notifier] composer.json cleanup
  [HttpKernel] AbstractSessionListener should not override the cache lifetime for private responses
  [DependencyInjection] Shared private services becomes public after a public service is accessed
  [DI] Fix undefined class in test
* 6.0:
  [Notifier] composer.json cleanup
  [HttpKernel] AbstractSessionListener should not override the cache lifetime for private responses
  [DependencyInjection] Shared private services becomes public after a public service is accessed
  [DI] Fix undefined class in test
Copy link
Member

@fabpot fabpot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As this is a new behavior, this PR should target 6.3 instead of 5.4.

@otsch
Copy link
Contributor Author

otsch commented Jan 10, 2023

As this is a new behavior, this PR should target 6.3 instead of 5.4.

@fabpot Is this meant independently of your comment about the new $normalizeWhitespace argument?

Fixes the issue described in
symfony#48682
To be consistent with the text() method.
@OskarStark
Copy link
Contributor

Closing in favor of #48940

@OskarStark OskarStark closed this Jan 10, 2023
@otsch
Copy link
Contributor Author

otsch commented Jan 10, 2023

@fabpot @nicolas-grekas I've created a new PR with target branch 6.3 as requested: #48940
(if the target branch can be changed in an existing PR, I haven't found how it can be done)

otsch added a commit to otsch/symfony that referenced this pull request Jan 10, 2023
So it doesn't break backwards compatibility, as requested in
symfony#48684 (comment)
otsch added a commit to otsch/symfony that referenced this pull request Jan 10, 2023
So it doesn't break backwards compatibility, as requested in
symfony#48684 (comment)
otsch added a commit to otsch/symfony that referenced this pull request Jan 10, 2023
So it doesn't break backwards compatibility, as requested in
symfony#48684 (comment)
@otsch
Copy link
Contributor Author

otsch commented Jan 10, 2023

@otsch it's hidden behind the "edit" button: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request

@xabbuh Oh, looks like I'm blind 😂🙈
For me it always looked like only the title changes to an Input when you click Edit. Didn't notice that also the target branch changes to a select. Thx for the hint!

fabpot added a commit that referenced this pull request Jan 11, 2023
…rawler::innerText()` and make it return the first non-empty text (otsch)

This PR was merged into the 6.3 branch.

Discussion
----------

[DomCrawler] Add argument `$normalizeWhitespace` to `Crawler::innerText()` and make it return the first non-empty text

This is a new PR instead of #48684 with target branch 6.3 as requested.

| Q             | A
| ------------- | ---
| Branch?       | 6.3
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #48682
| License       | MIT

Commits
-------

bb0c214 [DomCrawler] Add argument `$normalizeWhitespace` to `Crawler::innerText()` and make it return the first non-empty text
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet