Skip to content
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
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,14 @@
"composer/installers": "^2.0",
"enshrined/svg-sanitize": "^0.22.0",
"lucatume/di52": "^4.0",
"mobiledetect/mobiledetectlib": "^3.74",
"psr/container": "^1.0",
"stellarwp/container-contract": "^1.1",
"stellarwp/db": "^1.1",
"stellarwp/prophecy-image-downloader": "^3.0",
"stellarwp/prophecy-storage": "^3.0",
"stellarwp/schema": "^2.0",
"stellarwp/superglobals": "^1.3",
"stellarwp/superglobals": "^2.0",
"stellarwp/telemetry": "^2.3",
"stellarwp/uplink": "dev-bugfix/multisite-token-logic",
"symfony/translation-contracts": "^2.5"
Expand Down
237 changes: 150 additions & 87 deletions composer.lock

Large diffs are not rendered by default.

33 changes: 33 additions & 0 deletions includes/resources/Optimizer/Device_Resolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php declare( strict_types=1 );

namespace KadenceWP\KadenceBlocks\Optimizer;

use KadenceWP\KadenceBlocks\Detection\MobileDetect;
use KadenceWP\KadenceBlocks\StellarWP\SuperGlobals\SuperGlobals;

/**
* Resolve if we consider this a mobile device or not.
*
* This matches Solid Performance's detection.
*/
final class Device_Resolver {

private MobileDetect $detect;

public function __construct( MobileDetect $detect ) {
$this->detect = $detect;
}

/**
* Allow force overriding mobile detection with a query string variable.
*
* @return bool
*/
public function is_mobile(): bool {
if ( SuperGlobals::get_get_var( 'kadence_is_mobile' ) ) {
return true;
}

return $this->detect->isMobile() && ! $this->detect->isTablet();
}
}
12 changes: 7 additions & 5 deletions includes/resources/Optimizer/Hash/Hash_Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
namespace KadenceWP\KadenceBlocks\Optimizer\Hash;

use InvalidArgumentException;
use KadenceWP\KadenceBlocks\Optimizer\Device_Resolver;
use KadenceWP\KadenceBlocks\Optimizer\Enums\Viewport;
use KadenceWP\KadenceBlocks\Optimizer\Path\Path_Factory;
use KadenceWP\KadenceBlocks\Optimizer\Request\Request;
use KadenceWP\KadenceBlocks\Optimizer\Skip_Rules\Rule_Collection;
use KadenceWP\KadenceBlocks\Optimizer\Store\Contracts\Store;
use KadenceWP\KadenceBlocks\Psr\Log\LoggerInterface;
use KadenceWP\KadenceBlocks\StellarWP\SuperGlobals\SuperGlobals as SG;
use KadenceWP\KadenceBlocks\Traits\Viewport_Trait;
use Throwable;

/**
Expand All @@ -20,8 +20,6 @@
*/
final class Hash_Handler {

use Viewport_Trait;

/**
* Captures the final HTML before output buffering is
* flushed.
Expand All @@ -36,6 +34,7 @@ final class Hash_Handler {
private Hash_Store $hash_store;
private Path_Factory $path_factory;
private LoggerInterface $logger;
private Device_Resolver $device_resolver;

/**
* @param Hash_Builder $hasher
Expand All @@ -45,6 +44,7 @@ final class Hash_Handler {
* @param Hash_Store $hash_store
* @param Path_Factory $path_factory
* @param LoggerInterface $logger
* @param Device_Resolver $device_resolver
*/
public function __construct(
Hash_Builder $hasher,
Expand All @@ -53,7 +53,8 @@ public function __construct(
Background_Processor $background_processor,
Hash_Store $hash_store,
Path_Factory $path_factory,
LoggerInterface $logger
LoggerInterface $logger,
Device_Resolver $device_resolver
) {
$this->hasher = $hasher;
$this->store = $store;
Expand All @@ -62,6 +63,7 @@ public function __construct(
$this->hash_store = $hash_store;
$this->path_factory = $path_factory;
$this->logger = $logger;
$this->device_resolver = $device_resolver;
}

/**
Expand Down Expand Up @@ -127,7 +129,7 @@ public function check_hash(): void {
// Return request early, if possible, so we can process this in the background.
$this->background_processor->try_finish();

$viewport = Viewport::current( $this->is_mobile() );
$viewport = Viewport::current( $this->device_resolver->is_mobile() );

// Process skip rules and bail if required.
foreach ( $this->rules->all() as $rule ) {
Expand Down
41 changes: 22 additions & 19 deletions includes/resources/Optimizer/Image/Image_Processor.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace KadenceWP\KadenceBlocks\Optimizer\Image;

use InvalidArgumentException;
use KadenceWP\KadenceBlocks\Optimizer\Device_Resolver;
use KadenceWP\KadenceBlocks\Optimizer\Enums\Viewport;
use KadenceWP\KadenceBlocks\Optimizer\Image\Contracts\Processor;
use KadenceWP\KadenceBlocks\Optimizer\Image\Traits\Image_Key_Generator_Trait;
Expand All @@ -12,7 +13,6 @@
use KadenceWP\KadenceBlocks\Optimizer\Store\Contracts\Store;
use KadenceWP\KadenceBlocks\Psr\Log\LoggerInterface;
use KadenceWP\KadenceBlocks\StellarWP\SuperGlobals\SuperGlobals as SG;
use KadenceWP\KadenceBlocks\Traits\Viewport_Trait;
use WP_HTML_Tag_Processor;

/**
Expand All @@ -23,46 +23,49 @@
*/
final class Image_Processor {

use Viewport_Trait;
use Image_Key_Generator_Trait;

private Store $store;
private Rule_Collection $rules;
private Path_Factory $path_factory;

/**
* The list of image processors.
* The logger.
*
* @var Processor[]
* @var LoggerInterface
*/
private array $processors;
private LoggerInterface $logger;
private Device_Resolver $device_resolver;

/**
* The logger.
* The list of image processors.
*
* @var LoggerInterface
* @var Processor[]
*/
private LoggerInterface $logger;
private array $processors;

/**
* @param Store $store The optimization store.
* @param Rule_Collection $rules The rule collection.
* @param Path_Factory $path_factory The path factory.
* @param LoggerInterface $logger The logger.
* @param Processor[] $processors The list of image processors.
* @param Store $store The optimization store.
* @param Rule_Collection $rules The rule collection.
* @param Path_Factory $path_factory The path factory.
* @param LoggerInterface $logger The logger.
* @param Device_Resolver $device_resolver The device resolver.
* @param Processor[] $processors The list of image processors.
*/
public function __construct(
Store $store,
Rule_Collection $rules,
Path_Factory $path_factory,
LoggerInterface $logger,
Device_Resolver $device_resolver,
array $processors
) {
$this->store = $store;
$this->rules = $rules;
$this->path_factory = $path_factory;
$this->logger = $logger;
$this->processors = $processors;
$this->store = $store;
$this->rules = $rules;
$this->path_factory = $path_factory;
$this->logger = $logger;
$this->device_resolver = $device_resolver;
$this->processors = $processors;
}

/**
Expand Down Expand Up @@ -108,7 +111,7 @@ public function process_images( string $html, Path $path ): string {
return $html;
}

$device = $analysis->getDevice( Viewport::current( $this->is_mobile() ) );
$device = $analysis->getDevice( Viewport::current( $this->device_resolver->is_mobile() ) );
$critical_images = $device ? $device->criticalImages : [];
$images = $analysis->images;

Expand Down
6 changes: 2 additions & 4 deletions includes/resources/Optimizer/Lazy_Load/Provider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
namespace KadenceWP\KadenceBlocks\Optimizer\Lazy_Load;

use KadenceWP\KadenceBlocks\Optimizer\Analysis_Registry;
use KadenceWP\KadenceBlocks\Optimizer\Device_Resolver;
use KadenceWP\KadenceBlocks\Optimizer\Lazy_Load\Sections\Lazy_Render_Decider;
use KadenceWP\KadenceBlocks\Optimizer\Request\Request;
use KadenceWP\KadenceBlocks\StellarWP\ProphecyMonorepo\Container\Contracts\Provider as Provider_Contract;
use KadenceWP\KadenceBlocks\Traits\Viewport_Trait;

final class Provider extends Provider_Contract {

use Viewport_Trait;

public function register(): void {
$this->register_analysis_registry();
$this->register_element_lazy_loader();
Expand All @@ -25,7 +23,7 @@ private function register_analysis_registry(): void {

$this->container->when( Analysis_Registry::class )
->needs( '$is_mobile' )
->give( fn(): bool => $this->is_mobile() );
->give( fn( $c ): bool => $c->get( Device_Resolver::class )->is_mobile() );
}

private function register_element_lazy_loader(): void {
Expand Down
11 changes: 2 additions & 9 deletions includes/resources/Optimizer/Optimizer_Provider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace KadenceWP\KadenceBlocks\Optimizer;

use KadenceWP\KadenceBlocks\StellarWP\ProphecyMonorepo\Container\Contracts\Provider;
use KadenceWP\KadenceBlocks\StellarWP\SuperGlobals\SuperGlobals;

final class Optimizer_Provider extends Provider {

Expand Down Expand Up @@ -61,15 +60,9 @@ public function register(): void {
private function register_mobile_override(): void {
add_filter(
'wp_is_mobile',
static function ( bool $is_mobile ): bool {
if ( SuperGlobals::get_get_var( 'kadence_is_mobile' ) ) {
return true;
}

return $is_mobile;
},
fn(): bool => $this->container->get( Device_Resolver::class )->is_mobile(),
10,
1
0
);
}
}
20 changes: 0 additions & 20 deletions includes/resources/Traits/Viewport_Trait.php

This file was deleted.

66 changes: 66 additions & 0 deletions tests/wpunit/Resources/Optimizer/DeviceResolverTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php declare( strict_types=1 );

namespace Tests\wpunit\Resources\Optimizer;

use KadenceWP\KadenceBlocks\Detection\MobileDetect;
use KadenceWP\KadenceBlocks\Optimizer\Device_Resolver;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\Support\Classes\OptimizerTestCase;

final class DeviceResolverTest extends OptimizerTestCase {

/** @var MobileDetect&MockObject */
private $detect;

private Device_Resolver $resolver;

protected function setUp(): void {
parent::setUp();

$this->detect = $this->createMock( MobileDetect::class );
$this->resolver = new Device_Resolver( $this->detect );
}

protected function tearDown(): void {
unset( $_GET['kadence_is_mobile'] );

parent::tearDown();
}

public function testItReturnsTrueWhenQueryVarKadenceIsMobileIsSet(): void {
$_GET['kadence_is_mobile'] = '1';

$this->detect->expects( $this->never() )->method( 'isMobile' );
$this->detect->expects( $this->never() )->method( 'isTablet' );

$this->assertTrue( $this->resolver->is_mobile() );
}

public function testItReturnsTrueWhenDetectSaysMobileAndNotTablet(): void {
$this->detect->expects( $this->once() )->method( 'isMobile' )->willReturn( true );
$this->detect->expects( $this->once() )->method( 'isTablet' )->willReturn( false );

$this->assertTrue( $this->resolver->is_mobile() );
}

public function testItReturnsFalseWhenDetectSaysMobileButIsTablet(): void {
$this->detect->expects( $this->once() )->method( 'isMobile' )->willReturn( true );
$this->detect->expects( $this->once() )->method( 'isTablet' )->willReturn( true );

$this->assertFalse( $this->resolver->is_mobile() );
}

public function testItReturnsFalseWhenDetectSaysNotMobile(): void {
$this->detect->expects( $this->once() )->method( 'isMobile' )->willReturn( false );
$this->detect->expects( $this->never() )->method( 'isTablet' );

$this->assertFalse( $this->resolver->is_mobile() );
}

public function testItReturnsFalseWhenNoQueryVarAndDetectSaysNotMobile(): void {
$this->detect->expects( $this->once() )->method( 'isMobile' )->willReturn( false );
$this->detect->expects( $this->never() )->method( 'isTablet' );

$this->assertFalse( $this->resolver->is_mobile() );
}
}
Loading