Skip to content

Don't call a string view_class that shares a PHP function name - #1709

Merged
jakejackson1 merged 1 commit into
developmentfrom
fix/view-class-string-callable
Sep 2, 2026
Merged

Don't call a string view_class that shares a PHP function name#1709
jakejackson1 merged 1 commit into
developmentfrom
fix/view-class-string-callable

Conversation

@jakejackson1

Copy link
Copy Markdown
Member

Description

Follow-up to #1708. view_class is a documented key on the public gfpdf_one_time_action_routes filter and its value is a CSS class string. #1708 made the key accept a callable, so the deprecation notice's style is resolved when the notice displays rather than when the route table is built, and it resolved that with a bare is_callable().

is_callable() returns true for any string naming a PHP function. A route styling its notice link, key, header, current or compact — all ordinary-looking CSS class names, all PHP functions — had its class name called instead of rendered. call_user_func( 'link' ) raises an uncaught ArgumentCountError, which white-screens every admin page the notice can appear on.

Core is unaffected, because notice-warning and notice-error contain a hyphen and were never callable. This only reaches a site whose add-on or snippet supplies its own view_class through the filter.

A string is now always taken as the class itself; only a non-string callable is resolved, so Closure and the array/object forms still work.

Found while verifying the 6.17 port of this feature (#1707), which carries the same code.

Testing instructions

Add a snippet that supplies a view_class colliding with a PHP function name, then load any admin page where a Gravity PDF one-time-action notice displays:

add_filter( 'gfpdf_one_time_action_routes', function( $routes ) {
    $routes[] = [
        'action'      => 'my_notice',
        'action_text' => 'Do it',
        'condition'   => '__return_true',
        'process'     => '__return_true',
        'view'        => function() { return 'A notice'; },
        'view_class'  => 'link',
        'capability'  => 'gravityforms_view_settings',
    ];
    return $routes;
} );

Before this change the screen is blank with ArgumentCountError: link() expects exactly 2 arguments, 0 given. After it, the notice renders with class="notice updated link".

Confirm the deprecation notice still styles itself correctly too — it passes a Closure, so it should be unaffected.

Checklist:

  • I've tested the code.
  • My code is easy to read, follow, and understand
  • My code follows the accessibility standards.
  • My code has proper inline documentation / docblocks.

Additional Comments

Test_Controller_Actions::test_a_string_view_class_is_never_called covers it. Mutation-verified: reverting the guard makes it error with ArgumentCountError: link() expects exactly 2 arguments, 0 given, and it passes with the guard in place. Test_Controller_Actions is green at 12 tests / 39 assertions; PHPCS and PHP compatibility clean.

`view_class` is a documented key on the public `gfpdf_one_time_action_routes` filter, and its value is a CSS class
string. #1708 made the key accept a callable so the deprecation notice's style resolves when the notice displays
rather than when the route table is built, and resolved it with a bare `is_callable()`.

`is_callable()` says true for any string naming a PHP function, so a route styling its notice `link`, `key`,
`header`, `current` or `compact` — all ordinary-looking CSS class names, all PHP functions — had its class name
called instead of rendered. `call_user_func( 'link' )` raises an uncaught `ArgumentCountError`, so the admin screen
white-screens for every page the notice can appear on.

Core is unaffected: `notice-warning` and `notice-error` carry a hyphen, so they were never callable. This only
reaches a site whose add-on or snippet supplies its own `view_class` through the filter.

A string is now always taken as the class itself, and only a non-string callable is resolved. `Closure`, and the
array and object forms, still work.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
jakejackson1 added a commit that referenced this pull request Sep 2, 2026
Cherry-picked from 9783123 on `development`, adapted for the 6.16.x line.

The v3 backwards compatibility layer is scheduled for removal in Gravity PDF 7.0, but there is currently no way to
know which sites still depend on it. Legacy (v3) templates render blank under Gravity Forms 3.0 with no fatal, no
warning and nothing in the debug log; the `gfpdfe_*` filters fire silently; and the deprecated methods call
`_doing_it_wrong()`, which does not trigger `deprecated_function_run` and so never reaches WordPress' deprecation
logging or Query Monitor.

This adds detection first, so the removal in 7.0 can be judged on real data rather than assumption.

`GFPDF\Statics\Deprecation` is a registry rather than a fixed list: it knows how to detect, group and warn about
whatever its providers declare, and nothing in it names the v3 layer or the release removing it.
`GFPDF\Statics\Deprecation_V3` is the one provider today, declaring four features and the version each goes in, so a
later round of removals registers itself rather than being wired through the engine, the model and the controller.

The v3 provider declares legacy templates (any template `Helper_Templates` classifies in the `Legacy` group), Business
Plus templates (the same set, split on whether the file calls `$mpdf->`), legacy download URLs (a `LIKE` for `gf_pdf=1`
over the three columns Gravity Forms splits a form across, unioned with the forms the endpoint records for itself),
and deprecated filters (the known `gfpdfe_*` hooks and v3-shaped `gfpdf_*` aliases, looked up in `$wp_filter`).

Detections surface on three screens: a Deprecated section at the head of the System Report, a Site Health test and
matching Info tab section, and one admin notice covering every detected feature. The notice reads the last recorded
detection rather than detecting itself, since detection walks the form table and the template directory. The report
and Site Health screens refresh that record as they go, and `Controller_Upgrade_Routines` takes it at install and on
every version change.

Also included: a shim aliasing `GFForms` back to `RGForms` so v3 templates stop rendering blank under GF 3.0; log
warnings on Advanced Templating processing and on any `gfpdfe_*` filter with a listener; and the `_doing_it_wrong()`
to `_deprecated_function()` conversions across the surface that is deprecated on this line.

Two `Helper_Notices` fixes came out of building the notice, both on the pre-existing `view_class` route key any add-on
can already use: a caller-supplied `notice-*` class now replaces the default `updated` state rather than being
appended to it (`div.updated` out-specifies `.notice-warning`), and queued notices are stored as message/class pairs
rather than keyed by their class, which silently dropped a second notice sharing one.

It also carries the follow-ups from #1708 on `development`, so the two lines stay aligned rather than drifting
apart the moment this lands. `Deprecation::get_signals()` is memoised, behind a `Deprecation::flush_cache()` that
fans out to every provider — `Helper_Interface_Deprecated_Features` gains `flush_cache()` so a provider owns
invalidating whatever it holds, and callers no longer have to know which class caches what. The notice's
`view_class` route key now accepts a callable, resolved when the notice displays rather than when the route table
is built, so nothing queries the site to style a notice that never renders. The string form still works, since that
key is public API on `gfpdf_one_time_action_routes` — and only a NON-string callable is resolved, because
`is_callable()` is true for any string naming a PHP function, so a route styling its notice `link` or `key` would
have had its class name called and fatalled the admin (fixed on `development` in #1709). The unused `Deprecation`
import is dropped from `Controller_Actions`.

Differences from 9783123, which was written against `development`:

- `development` carries unreleased work this line does not — a PDF cache, `Statics\Cache`/`Statics\Debug`, fully
  scoped `Psr\Log`, and ~20 deprecated methods already gutted into stubs. Where the upstream commit converted one of
  those stubs to `_deprecated_function()`, the method is still live here and keeps its body with no notice:
  the `pdf.php` canonical-release notices, `Helper_Misc::maybe_add_multicurrency_support()`,
  `Controller_Pdf_Queue::queue_cleanup_task()`, `Queue_Callbacks::cleanup_pdfs()`, `Model_PDF`'s three cleanup
  methods, and `View_PDF::generate_pdf()` and `::get_template_filename()`. Where upstream only added a warning to a
  still-live method, the warning is applied.
- `Controller_PDF::sgoptimizer_html_minification_fix()` is the exception to the rule above, and follows
  `development` instead: the SiteGround buffer fix has not been required since 6.12, when all buffers began being
  auto-closed before a PDF is sent to the browser. Its two `add_filter()` registrations are removed and the method
  deprecates. That matters beyond tidying, because one of those registrations was on
  `gfpdf_legacy_pre_view_or_download_pdf` — a hook this change declares deprecated — so while it stood, the scan
  counted core's own listener and reported every install as using the v3 layer.
  `test_a_clean_install_reports_no_deprecated_filters()` fails if core ever registers on another deprecated hook.
- The Playwright suite does not exist on this line, so the deprecation spec and its helpers are omitted.
- The PHPUnit suite here predates the harness the upstream tests were written against. `Test_Deprecation`,
  `Test_Deprecation_V3` and the `Concerns` traits are ported onto `WP_UnitTestCase`, with a `UsesFactory` trait
  supplying `gf_factory()` from the `GF_UnitTest_Factory` this branch already has, autoloaded from the test bootstrap.
  `Test_Controller_System_Report` moves from positional table indexes to a name-based lookup, since a section dropped
  above now renumbers the ones below it. #1708 flushes the detection memo from the shared
  `tests/phpunit/integration/TestCase::set_up()`; there is no shared base class here, so the four test classes that
  touch detection flush in their own `set_up()` instead. `test-actions.php` gains this line's equivalent of the
  `view_class` coverage that lives in upstream's un-ported `Test_Controller_Actions`, and
  `Test_Controller_System_Report` keeps the pre-port assertion that our report is appended to Gravity Forms' own
  rather than replacing it, which the move to a name-based section lookup had dropped. It carries the upstream tests for the Site Health registration, the
  `debug_information` section and the `gravityforms_view_settings` gate on both, plus the clean-site assertions that
  keep those gates from passing vacuously. The upstream tests asserting what each surface reports once a signal is
  detected are not ported.

Integration suite: 1181 tests, 3682 assertions. Multisite: 1181 tests, 3778 assertions. The 3 errors and 2 failures in
`Helper\Mpdf\Test_Request` reproduce identically on an untouched worktree and are an artifact of a borrowed
`vendor_prefixed` build, not this change. PHPCS and PHP 7.3 compatibility clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

Coverage report for commit: f62fc8f
File: ./tmp/jest-coverage/clover.xml

Cover ┌─────────────────────────┐ Freq.
   0% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  10% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  20% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  30% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  40% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  50% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  60% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  70% │ █░░░░░░░░░░░░░░░░░░░░░░ │  1.6%
  80% │ ███░░░░░░░░░░░░░░░░░░░░ │  8.1%
  90% │ ███████░░░░░░░░░░░░░░░░ │ 21.0%
 100% │ ███████████████████████ │ 69.4%
      └─────────────────────────┘
 *Legend:* █ = Current Distribution 
Summary - Lines: 92.99% | Methods: 88.31% | Branches: 81.37%
FilesLinesMethodsBranches
src/assets/js/react/actions
   coreFonts.js100.00%100.00%100.00%
   fontManager.js100.00%100.00%100.00%
   templates.js100.00%100.00%100.00%
src/assets/js/react/components/Alert
   Alert.js100.00%100.00%100.00%
src/assets/js/react/components/CoreFonts
   CoreFontContainer.js100.00%100.00%91.43%
   CoreFontCounter.js100.00%100.00%100.00%
   CoreFontListResults.js100.00%100.00%85.71%
   CoreFontListSpacer.js100.00%100.00%100.00%
src/assets/js/react/components
   CustomHashRouter.js100.00%100.00%100.00%
   Empty.js100.00%100.00%100.00%
   ShowMessage.js79.31%80.00%64.29%
   Spinner.js100.00%100.00%100.00%
src/assets/js/react/components/FontManager
   AddFont.js100.00%100.00%100.00%
   AddUpdateFontFooter.js85.37%50.00%88.89%
   AdvancedButton.js100.00%100.00%100.00%
   FontList.js100.00%50.00%65.22%
   FontListAlertMessage.js100.00%100.00%100.00%
   FontListHeader.js100.00%100.00%100.00%
   FontListIcon.js100.00%100.00%100.00%
   FontListItems.js85.39%64.00%68.66%
   FontListSkeleton.js100.00%100.00%100.00%
   FontManager.js77.78%57.14%50.00%
   FontManagerBody.js94.20%96.43%90.29%
   FontManagerHeader.js100.00%100.00%100.00%
   FontVariant.js90.00%60.00%70.00%
   FontVariantLabel.js100.00%100.00%100.00%
   InitialAddUpdateState.js100.00%100.00%100.00%
   SearchBox.js90.00%66.67%69.23%
   TemplateTooltip.js100.00%75.00%100.00%
   UpdateFont.js75.00%50.00%75.00%
src/assets/js/react/components/Modal
   CloseDialog.js93.33%66.67%70.59%
src/assets/js/react/components/Template
   TemplateActivateButton.js100.00%100.00%100.00%
   TemplateButton.js85.71%66.67%100.00%
   TemplateContainer.js71.43%66.67%25.00%
   TemplateDeleteButton.js100.00%100.00%70.00%
   TemplateFooterActions.js100.00%100.00%100.00%
   TemplateHeaderNavigation.js82.35%85.71%70.00%
   TemplateHeaderTitle.js100.00%100.00%100.00%
   TemplateList.js100.00%100.00%60.00%
   TemplateListItem.js100.00%100.00%92.86%
   TemplateListItemComponents.js100.00%100.00%100.00%
   TemplateScreenshot.js100.00%100.00%100.00%
   TemplateScreenshots.js100.00%100.00%50.00%
   TemplateSearch.js93.75%88.89%50.00%
   TemplateSingle.js100.00%100.00%100.00%
   TemplateSingleComponents.js100.00%100.00%75.00%
   TemplateUploader.js98.04%100.00%86.67%
src/assets/js/react/reducers
   coreFontReducer.js95.65%100.00%88.00%
   fontManagerReducer.js87.21%75.00%75.00%
   index.js100.00%100.00%100.00%
   templateReducer.js100.00%100.00%100.00%
src/assets/js/react/sagas
   coreFonts.js91.67%100.00%75.00%
   fontManager.js86.96%90.00%83.33%
   index.js100.00%100.00%100.00%
   templates.js83.33%100.00%100.00%
src/assets/js/react/selectors
   getTemplates.js91.11%100.00%83.33%
src/assets/js/react/utilities/FontManager
   adjustFontListHeight.js100.00%100.00%100.00%
   associatedFontManagerSelectBox.js94.44%100.00%66.67%
   fontManagerReducer.js100.00%100.00%100.00%
   getTabLocation.js100.00%100.00%100.00%
   toggleUpdateFont.js100.00%100.00%100.00%
src/assets/js/react/utilities
   withRouterHooks.js100.00%100.00%100.00%

🤖 Jest coverage report

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

Coverage report for commit: f62fc8f
File: tmp/coverage/report-xml/merged.xml

Cover ┌─────────────────────────┐ Freq.
   0% │ █████████░░░░░░░░░░░░░░ │ 11.4%
  10% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.9%
  20% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.5%
  30% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.9%
  40% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.5%
  50% │ ███████░░░░░░░░░░░░░░░░ │  8.5%
  60% │ ██░░░░░░░░░░░░░░░░░░░░░ │  1.4%
  70% │ █████░░░░░░░░░░░░░░░░░░ │  6.2%
  80% │ ██████████████░░░░░░░░░ │ 19.0%
  90% │ ███████████████████████ │ 32.2%
 100% │ ██████████████░░░░░░░░░ │ 18.5%
      └─────────────────────────┘
 *Legend:* █ = Current Distribution 
Summary - Lines: 83.47% | Methods: 89.60%
FilesLinesMethodsBranches
/var/www/html/wp-content/plugins/gravity-pdf
   api.php96.55%100.00%100.00%
   gravity-pdf-updater.php53.97%100.00%100.00%
   pdf.php58.77%72.22%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Controller
   Controller_Actions.php98.96%100.00%100.00%
   Controller_Activation.php95.45%100.00%100.00%
   Controller_Custom_Fonts.php88.52%100.00%100.00%
   Controller_Debug.php100.00%100.00%100.00%
   Controller_Export_Entries.php96.67%100.00%100.00%
   Controller_Form_Settings.php86.05%90.00%100.00%
   Controller_Install.php100.00%100.00%100.00%
   Controller_Mergetags.php100.00%100.00%100.00%
   Controller_PDF.php82.14%100.00%100.00%
   Controller_Pdf_Queue.php83.72%77.78%100.00%
   Controller_Save_Core_Fonts.php66.67%100.00%100.00%
   Controller_Settings.php86.05%100.00%100.00%
   Controller_Shortcodes.php100.00%100.00%100.00%
   Controller_System_Report.php100.00%100.00%100.00%
   Controller_Templates.php100.00%100.00%100.00%
   Controller_Uninstaller.php83.33%77.78%100.00%
   Controller_Upgrade_Routines.php93.94%100.00%100.00%
   Controller_Webhooks.php100.00%100.00%100.00%
   Controller_Zapier.php100.00%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Exceptions
   GravityPdfDatabaseUpdateException.php50.00%100.00%100.00%
   GravityPdfDomainException.php50.00%100.00%100.00%
   GravityPdfException.php50.00%100.00%100.00%
   GravityPdfFontNotFoundException.php50.00%100.00%100.00%
   GravityPdfIdException.php50.00%100.00%100.00%
   GravityPdfModelNotUpdatedException.php50.00%100.00%100.00%
   GravityPdfRuntimeException.php50.00%100.00%100.00%
   GravityPdfShortcodeEntryIdException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfConditionalLogicFailedException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfConfigNotFoundException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfInactiveException.php50.00%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Fields
   Field_Address.php92.16%100.00%100.00%
   Field_Chainedselect.php66.67%75.00%100.00%
   Field_Checkbox.php94.34%100.00%100.00%
   Field_Consent.php89.47%100.00%100.00%
   Field_Coupon.php--100.00%
   Field_Creditcard.php83.33%100.00%100.00%
   Field_Date.php83.33%100.00%100.00%
   Field_Default.php83.33%100.00%100.00%
   Field_Discount.php44.00%75.00%100.00%
   Field_Email.php83.33%100.00%100.00%
   Field_Fg_Ls_Consent.php92.86%100.00%100.00%
   Field_Fg_Ls_Signature.php73.08%66.67%100.00%
   Field_Fileupload.php94.23%100.00%100.00%
   Field_Form.php89.09%100.00%100.00%
   Field_Hidden.php81.82%100.00%100.00%
   Field_Html.php89.47%100.00%100.00%
   Field_Image_Choice.php86.67%100.00%100.00%
   Field_Likert.php97.22%100.00%100.00%
   Field_List.php92.41%100.00%100.00%
   Field_Multi_Choice.php50.00%100.00%100.00%
   Field_Multiselect.php92.59%100.00%100.00%
   Field_Name.php84.62%100.00%100.00%
   Field_Number.php83.33%100.00%100.00%
   Field_Option.php57.69%50.00%100.00%
   Field_Page.php83.33%100.00%100.00%
   Field_Phone.php94.55%100.00%100.00%
   Field_Poll.php93.75%100.00%100.00%
   Field_Post_Category.php85.00%100.00%100.00%
   Field_Post_Content.php82.35%100.00%100.00%
   Field_Post_Custom_Field.php50.00%100.00%100.00%
   Field_Post_Excerpt.php81.82%100.00%100.00%
   Field_Post_Image.php94.00%100.00%100.00%
   Field_Post_Tags.php90.91%100.00%100.00%
   Field_Post_Title.php81.82%100.00%100.00%
   Field_Product.php88.46%100.00%100.00%
   Field_Products.php85.41%100.00%100.00%
   Field_Quantity.php84.62%100.00%100.00%
   Field_Quiz.php89.74%100.00%100.00%
   Field_Radio.php95.35%100.00%100.00%
   Field_Rank.php95.24%100.00%100.00%
   Field_Rating.php95.24%100.00%100.00%
   Field_Repeater.php97.37%100.00%100.00%
   Field_Section.php90.74%100.00%100.00%
   Field_Select.php94.12%100.00%100.00%
   Field_Shipping.php75.00%66.67%100.00%
   Field_Signature.php67.39%100.00%100.00%
   Field_Slim.php82.35%100.00%100.00%
   Field_Slim_Post.php91.30%100.00%100.00%
   Field_Subtotal.php65.38%75.00%100.00%
   Field_Survey.php95.00%100.00%100.00%
   Field_Tax.php32.00%50.00%100.00%
   Field_Text.php81.82%100.00%100.00%
   Field_Textarea.php90.63%100.00%100.00%
   Field_Time.php81.82%100.00%100.00%
   Field_Tos.php92.59%100.00%100.00%
   Field_Total.php68.00%66.67%100.00%
   Field_V3_List.php92.86%100.00%100.00%
   Field_V3_Products.php73.68%100.00%100.00%
   Field_V3_Section.php77.78%100.00%100.00%
   Field_Website.php85.71%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Fonts
   FlushCache.php80.00%100.00%100.00%
   LocalFile.php90.00%100.00%100.00%
   LocalFilesystem.php66.67%100.00%100.00%
   SupportsOtl.php88.89%100.00%100.00%
   TtfFontValidation.php72.73%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper
   Helper_Abstract_Addon.php93.33%100.00%100.00%
   Helper_Abstract_Config_Settings.php75.00%100.00%100.00%
   Helper_Abstract_Controller.php-100.00%100.00%
   Helper_Abstract_Field_Products.php89.47%66.67%100.00%
   Helper_Abstract_Fields.php93.59%93.75%100.00%
   Helper_Abstract_Fields_Input_Type.php84.00%100.00%100.00%
   Helper_Abstract_Form.php--100.00%
   Helper_Abstract_Model.php100.00%100.00%100.00%
   Helper_Abstract_Options.php75.51%78.57%100.00%
   Helper_Abstract_Pdf_Shortcode.php89.52%91.67%100.00%
   Helper_Abstract_View.php92.31%100.00%100.00%
   Helper_Data.php96.57%100.00%100.00%
   Helper_Field_Container.php92.31%100.00%100.00%
   Helper_Field_Container_Gf25.php82.22%100.00%100.00%
   Helper_Field_Container_Void.php16.67%-100.00%
   Helper_Form.php70.97%64.29%100.00%
   Helper_Interface_Actions.php-100.00%100.00%
   Helper_Interface_Config.php50.00%100.00%100.00%
   Helper_Interface_Config_Settings.php50.00%100.00%100.00%
   Helper_Interface_Deprecated_Features.php-100.00%100.00%
   Helper_Interface_Extension_Settings.php-100.00%100.00%
   Helper_Interface_Extension_Uninstaller.php-100.00%100.00%
   Helper_Interface_Field_Pdf_Config.php50.00%100.00%100.00%
   Helper_Interface_Filters.php-100.00%100.00%
   Helper_Interface_Setup_TearDown.php-100.00%100.00%
   Helper_Interface_Url_Signer.php-100.00%100.00%
   Helper_Logger.php-100.00%100.00%
   Helper_Misc.php73.56%93.94%100.00%
   Helper_Mpdf.php50.00%100.00%100.00%
   Helper_Notices.php79.69%73.33%100.00%
   Helper_Options_Fields.php96.87%100.00%100.00%
   Helper_PDF.php89.35%94.29%100.00%
   Helper_PDF_List_Table.php84.50%92.31%100.00%
   Helper_Pdf_Queue.php84.31%100.00%100.00%
   Helper_QueryPath.php80.00%100.00%100.00%
   Helper_Sha256_Url_Signer.php87.50%100.00%100.00%
   Helper_Singleton.php90.00%100.00%100.00%
   Helper_Templates.php96.44%100.00%100.00%
   Helper_Trait_Logger.php--100.00%
   Helper_Url_Signer.php82.86%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Licensing
   EDD_SL_Plugin_Updater.php94.80%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Log
   Logger.php86.89%100.00%100.00%
   Redact_Processor.php96.15%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Mpdf
   Cache.php66.67%100.00%100.00%
Table truncated to fit comment

🤖 PHPUnit coverage report

@jakejackson1
jakejackson1 merged commit 907aa3f into development Sep 2, 2026
25 of 30 checks passed
@jakejackson1
jakejackson1 deleted the fix/view-class-string-callable branch September 2, 2026 03:37
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.

1 participant