Skip to content

Commit

Permalink
Closes #7246 3.19 - Preconnect to external domains - Beacon insertion…
Browse files Browse the repository at this point in the history
… part (#7301)
  • Loading branch information
Khadreal authored Feb 21, 2025
1 parent 3a030ae commit 59bb433
Show file tree
Hide file tree
Showing 15 changed files with 373 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use WP_Rocket\Engine\Media\AboveTheFold\Activation\ActivationFactory as ATFActivationFactory;
use WP_Rocket\Engine\Optimization\LazyRenderContent\Activation\ActivationFactory as LRCActivationFactory;
use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context as LRCContext;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Context\Context as PreconnectContext;

class ServiceProvider extends AbstractServiceProvider {
/**
Expand All @@ -30,6 +31,7 @@ class ServiceProvider extends AbstractServiceProvider {
'atf_activation_factory',
'lrc_context',
'lrc_activation_factory',
'preconnect_external_domains_context',
];

/**
Expand Down Expand Up @@ -68,6 +70,8 @@ public function register(): void {
]
);

$this->getContainer()->add( 'preconnect_external_domains_context', PreconnectContext::class );

$factories = [];

$atf_activation_factory = $this->getContainer()->get( 'atf_activation_factory' );
Expand Down
28 changes: 28 additions & 0 deletions inc/Engine/Common/PerformanceHints/Cron/CronTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Common\PerformanceHints\Cron;

trait CronTrait {
/**
* Performance Hints Deletion interval filter.
*
* @param string $filter_name The filter name.
*
* @return object
*/
public function deletion_interval( string $filter_name ): object {
/**
* Filters the interval (in months) to determine when a performance data entry is considered 'old'.
* Old performance entries are eligible for deletion. By default, a performance entry is considered old if it hasn't been accessed in the last month.
*
* @param int $delete_interval The interval in months after which a performance data entry is considered old. Default is 1 month.
*/
$delete_interval = wpm_apply_filters_typed( 'integer', $filter_name, 1 );
if ( $delete_interval <= 0 ) {
return $this->queries;
}

return $this->queries->set_cleanup_interval( $delete_interval );
}
}
1 change: 1 addition & 0 deletions inc/Engine/Common/PerformanceHints/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public function register(): void {
$factory_array = [
$this->getContainer()->get( 'atf_factory' ),
$this->getContainer()->get( 'lrc_factory' ),
$this->getContainer()->get( 'preconnect_external_domains_factory' ),
];

foreach ( $factory_array as $factory ) {
Expand Down
120 changes: 120 additions & 0 deletions inc/Engine/Media/PreconnectExternalDomains/Factory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Media\PreconnectExternalDomains;

use WP_Rocket\Engine\Common\Context\ContextInterface;
use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Cron\CronTrait;
use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\QueriesInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Database\Table\TableInterface;
use WP_Rocket\Engine\Common\PerformanceHints\FactoryInterface;
use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface;

class Factory implements FactoryInterface {
use CronTrait;

/**
* Ajax Controller instance.
*
* @var AjaxControllerInterface
*/
protected $ajax_controller;

/**
* Frontend Controller instance.
*
* @var FrontendControllerInterface
*/
protected $frontend_controller;

/**
* Table instance.
*
* @var TableInterface
*/
protected $table;

/**
* Queries instance.
*
* @var QueriesInterface
*/
protected $queries;

/**
* Context instance.
*
* @var ContextInterface
*/
protected $context;

/**
* Instantiate the class.
*
* @param QueriesInterface $queries Preconnect external domains Queries instance.
* @param ContextInterface $context Preconnect external domains Context instance.
* @param AjaxControllerInterface $ajax_controller Preconnect external domains AJAX Controller instance.
* @param TableInterface $table Preconnect external domains Table instance.
* @param FrontendControllerInterface $frontend_controller Preconnect external domains Frontend Controller instance.
*/
public function __construct(
QueriesInterface $queries,
ContextInterface $context,
AjaxControllerInterface $ajax_controller,
TableInterface $table,
FrontendControllerInterface $frontend_controller
) {
$this->context = $context;
$this->queries = $queries;
$this->table = $table;
$this->ajax_controller = $ajax_controller;
$this->frontend_controller = $frontend_controller;
}

/**
* Provides an Ajax controller object.
*
* @return AjaxControllerInterface
*/
public function get_ajax_controller(): AjaxControllerInterface {
return $this->ajax_controller;
}

/**
* Provides a Frontend controller object.
*
* @return FrontendControllerInterface
*/
public function get_frontend_controller(): FrontendControllerInterface {
return $this->frontend_controller;
}

/**
* Provides a Table interface object.
*
* @return TableInterface
*/
public function table(): TableInterface {
return $this->table;
}

/**
* Provides a Queries object.
*
* @return QueriesInterface
*/
public function queries(): QueriesInterface {
// Defines the interval for deletion and returns Queries object.
return $this->deletion_interval( 'rocket_preconnect_external_domains_cleanup_interval' );
}

/**
* Provides Context object.
*
* @return ContextInterface
*/
public function get_context(): ContextInterface {
return $this->context;
}
}
71 changes: 71 additions & 0 deletions inc/Engine/Media/PreconnectExternalDomains/Frontend/Controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php
declare(strict_types=1);

namespace WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend;

use WP_Rocket\Admin\Options_Data;
use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Context\Context;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Queries\PreconnectExternalDomains as PreconnectDomains;

class Controller implements ControllerInterface {
/**
* Options instance
*
* @var Options_Data
*/
private $options; // @phpstan-ignore-line Use of this will come later.

/**
* Queries instance
*
* @var PreconnectDomains
*/
private $query; // @phpstan-ignore-line Use of this will come later.

/**
* Context instance.
*
* @var Context
*/
private $context; // @phpstan-ignore-line Use of this will come later.

/**
* Constructor
*
* @param Options_Data $options Options instance.
* @param PreconnectDomains $query Queries instance.
* @param Context $context Context instance.
*/
public function __construct( Options_Data $options, PreconnectDomains $query, Context $context ) {
$this->options = $options;
$this->query = $query;
$this->context = $context;
}

/**
* Applies preconnect domains optimization.
*
* @param string $html HTML content.
* @param object $row Database row.
* @return string
*/
public function optimize( string $html, $row ): string {
if ( ! $row->has_preconnect_external_domains() ) {
return $html;
}

return $html;
}

/**
* Add custom data like the List of elements to be considered for optimization.
*
* @param array $data Array of data passed in beacon.
*
* @return array
*/
public function add_custom_data( array $data ): array {
return $data;
}
}
24 changes: 23 additions & 1 deletion inc/Engine/Media/PreconnectExternalDomains/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Queries\PreconnectExternalDomains as Query;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\AJAX\Controller as AJAXController;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Database\Table\PreconnectExternalDomains as PreconnectTable;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend\Subscriber as FrontendSubscriber;
use WP_Rocket\Engine\Media\PreconnectExternalDomains\Frontend\{Controller as FrontController, Subscriber as FrontendSubscriber};

class ServiceProvider extends AbstractServiceProvider {
/**
Expand All @@ -26,6 +26,8 @@ class ServiceProvider extends AbstractServiceProvider {
'preconnect_external_domains_ajax_controller',
'preconnect_frontend_subscriber',
'preconnect_external_domains_table',
'preconnect_external_domains_factory',
'preconnect_external_domains_controller',
];

/**
Expand Down Expand Up @@ -65,5 +67,25 @@ public function register(): void {
);

$this->getContainer()->addShared( 'preconnect_frontend_subscriber', FrontendSubscriber::class );

$this->getContainer()->add( 'preconnect_external_domains_controller', FrontController::class )
->addArguments(
[
$this->getContainer()->get( 'options' ),
$this->getContainer()->get( 'preconnect_external_domains_query' ),
$this->getContainer()->get( 'preconnect_external_domains_context' ),
]
);

$this->getContainer()->addShared( 'preconnect_external_domains_factory', Factory::class )
->addArguments(
[
$this->getContainer()->get( 'preconnect_external_domains_query' ),
$this->getContainer()->get( 'preconnect_external_domains_context' ),
$this->getContainer()->get( 'preconnect_external_domains_ajax_controller' ),
$this->getContainer()->get( 'preconnect_external_domains_table' ),
$this->getContainer()->get( 'preconnect_external_domains_controller' ),
]
);
}
}
Loading

0 comments on commit 59bb433

Please sign in to comment.