Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
31.03% covered (danger)
31.03%
9 / 29
33.33% covered (danger)
33.33%
2 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Status
31.03% covered (danger)
31.03%
9 / 29
33.33% covered (danger)
33.33%
2 / 6
42.80
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 get
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 set
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 on_update
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 update_mapped_modules
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
30
 track_module_status
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Automattic\Jetpack_Boost\Lib;
4
5use Automattic\Jetpack\WP_JS_Data_Sync\Contracts\Entry_Can_Get;
6use Automattic\Jetpack\WP_JS_Data_Sync\Contracts\Entry_Can_Set;
7use Automattic\Jetpack_Boost\Modules\Modules_Setup;
8use Automattic\Jetpack_Boost\Modules\Optimizations\Cloud_CSS\Cloud_CSS;
9use Automattic\Jetpack_Boost\Modules\Optimizations\Critical_CSS\Critical_CSS;
10
11class Status implements Entry_Can_Get, Entry_Can_Set {
12
13    /**
14     * Slug of the optimization module which is currently being toggled
15     *
16     * @var string $slug
17     */
18    protected $slug;
19
20    /**
21     * A map of modules whose status are synced.
22     *
23     * @var array[] $status_sync_map
24     */
25    protected $status_sync_map;
26
27    /**
28     * @var string $option_name
29     */
30    protected $option_name;
31
32    public function __construct( $slug ) {
33        $this->slug        = $slug;
34        $module_slug       = str_replace( '_', '-', $this->slug );
35        $this->option_name = 'jetpack_boost_status_' . $module_slug;
36
37        $this->status_sync_map = array(
38            Cloud_CSS::get_slug() => array(
39                Critical_CSS::get_slug(),
40            ),
41        );
42    }
43
44    public function get( $_fallback = false ) {
45        return get_option( $this->option_name, false );
46    }
47
48    public function set( $value ) {
49        return update_option( $this->option_name, $value );
50    }
51
52    /**
53     * Called when the module is toggled.
54     *
55     * Called by Modules and triggered by the `jetpack_ds_set` action.
56     */
57    public function on_update( $new_status ) {
58        $this->update_mapped_modules( $new_status );
59        $this->track_module_status( (bool) $new_status );
60    }
61
62    /**
63     * Update modules which are to follow the status of the current module.
64     *
65     * For example: critical-css module status should be synced with cloud-css module.
66     *
67     * @param mixed $new_status
68     * @return void
69     */
70    protected function update_mapped_modules( $new_status ) {
71        if ( ! isset( $this->status_sync_map[ $this->slug ] ) ) {
72            return;
73        }
74
75        $modules_instance = Setup::get_instance_of( Modules_Setup::class );
76
77        // The moduleInstance will be there. But check just in case.
78        if ( $modules_instance !== null ) {
79            // Remove the action temporarily to avoid infinite loop.
80            remove_action( 'jetpack_boost_module_status_updated', array( $modules_instance, 'on_module_status_update' ) );
81        }
82
83        foreach ( $this->status_sync_map[ $this->slug ] as $mapped_module_slug ) {
84            $mapped_status = new Status( $mapped_module_slug );
85            $mapped_status->set( $new_status );
86        }
87
88        // The moduleInstance will be there. But check just in case.
89        if ( $modules_instance !== null ) {
90            add_action( 'jetpack_boost_module_status_updated', array( $modules_instance, 'on_module_status_update' ), 10, 2 );
91        }
92    }
93
94    protected function track_module_status( $status ) {
95        Analytics::record_user_event(
96            'set_module_status',
97            array(
98                'module' => $this->slug,
99                'status' => $status,
100            )
101        );
102    }
103}