Implements render_progress event with PhpUnit tests #3451
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR solves issue #3450, providing a new callback event to watch the
render_progress
and return the percentage for every stage of a frame being rendered.The idea is to, before rendering, count all the frames recursively in the tree and store that value. Then, every time a frame is rendered, increment a counter to compare how many frames have been rendered and how many are left to render, so we can calculate the progress percentage. All the counting and storage are being done inside the scope of the
$dompdf->render()
method execution, inside the$renderProgressData
variable.To avoid changes to the
Dompdf
class callbacks property style (array of['event' => array(fn(), fn()...)]
), we override the callback function ofrender_progress
events only to receive$renderProgressData
as a pointer. When a new frame is rendered, we can access$renderProgressData
by passing a new array with thedata
and the original closure function asf
, without the need to expose a variable globally or as a public property on theDompdf
class. Now we can track the changes using the private scope of the closure function.