first commit
This commit is contained in:
34
wp-content/plugins/elementor/core/frontend/performance.php
Normal file
34
wp-content/plugins/elementor/core/frontend/performance.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
namespace Elementor\Core\Frontend;
|
||||
|
||||
use Elementor\Plugin;
|
||||
|
||||
class Performance {
|
||||
|
||||
private static $use_style_controls = false;
|
||||
|
||||
private static $is_frontend = null;
|
||||
|
||||
public static function set_use_style_controls( bool $bool ): void {
|
||||
static::$use_style_controls = $bool;
|
||||
}
|
||||
|
||||
public static function is_use_style_controls(): bool {
|
||||
return static::$use_style_controls;
|
||||
}
|
||||
|
||||
public static function should_optimize_controls() {
|
||||
if ( null === static::$is_frontend ) {
|
||||
static::$is_frontend = (
|
||||
! is_admin()
|
||||
&& ! Plugin::$instance->preview->is_preview_mode()
|
||||
);
|
||||
}
|
||||
|
||||
return static::$is_frontend;
|
||||
}
|
||||
|
||||
public static function is_optimized_control_loading_feature_enabled(): bool {
|
||||
return Plugin::$instance->experiments->is_feature_active( 'e_optimized_control_loading' );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
namespace Elementor\Core\Frontend;
|
||||
|
||||
use Elementor\Core\Frontend\RenderModes\Render_Mode_Base;
|
||||
use Elementor\Core\Frontend\RenderModes\Render_Mode_Normal;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Render_Mode_Manager {
|
||||
const QUERY_STRING_PARAM_NAME = 'render_mode';
|
||||
const QUERY_STRING_POST_ID = 'post_id';
|
||||
const QUERY_STRING_NONCE_PARAM_NAME = 'render_mode_nonce';
|
||||
const NONCE_ACTION_PATTERN = 'render_mode_{post_id}';
|
||||
|
||||
/**
|
||||
* @var Render_Mode_Base
|
||||
*/
|
||||
private $current;
|
||||
|
||||
/**
|
||||
* @var Render_Mode_Base[]
|
||||
*/
|
||||
private $render_modes = [];
|
||||
|
||||
/**
|
||||
* @param $post_id
|
||||
* @param $render_mode_name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function get_base_url( $post_id, $render_mode_name ) {
|
||||
return add_query_arg( [
|
||||
self::QUERY_STRING_POST_ID => $post_id,
|
||||
self::QUERY_STRING_PARAM_NAME => $render_mode_name,
|
||||
self::QUERY_STRING_NONCE_PARAM_NAME => wp_create_nonce( self::get_nonce_action( $post_id ) ),
|
||||
'ver' => time(),
|
||||
], get_permalink( $post_id ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $post_id
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function get_nonce_action( $post_id ) {
|
||||
return str_replace( '{post_id}', $post_id, self::NONCE_ACTION_PATTERN );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new render mode into the render mode manager.
|
||||
*
|
||||
* @param $class_name
|
||||
*
|
||||
* @return $this
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function register_render_mode( $class_name ) {
|
||||
if ( ! is_subclass_of( $class_name, Render_Mode_Base::class ) ) {
|
||||
throw new \Exception( "'{$class_name}' must extend 'Render_Mode_Base'." );
|
||||
}
|
||||
|
||||
$this->render_modes[ $class_name::get_name() ] = $class_name;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current render mode.
|
||||
*
|
||||
* @return Render_Mode_Base
|
||||
*/
|
||||
public function get_current() {
|
||||
return $this->current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Render_Mode_Base $render_mode
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
private function set_current( Render_Mode_Base $render_mode ) {
|
||||
$this->current = $render_mode;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set render mode.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
private function choose_render_mode() {
|
||||
$post_id = null;
|
||||
$key = null;
|
||||
$nonce = null;
|
||||
|
||||
if ( isset( $_GET[ self::QUERY_STRING_POST_ID ] ) ) {
|
||||
$post_id = $_GET[ self::QUERY_STRING_POST_ID ]; // phpcs:ignore -- Nonce will be checked next line.
|
||||
}
|
||||
|
||||
if ( isset( $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ] ) ) {
|
||||
$nonce = $_GET[ self::QUERY_STRING_NONCE_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
|
||||
}
|
||||
|
||||
if ( isset( $_GET[ self::QUERY_STRING_PARAM_NAME ] ) ) {
|
||||
$key = $_GET[ self::QUERY_STRING_PARAM_NAME ]; // phpcs:ignore -- Nonce will be checked next line.
|
||||
}
|
||||
|
||||
if (
|
||||
$post_id &&
|
||||
$nonce &&
|
||||
wp_verify_nonce( $nonce, self::get_nonce_action( $post_id ) ) &&
|
||||
$key &&
|
||||
array_key_exists( $key, $this->render_modes )
|
||||
) {
|
||||
$this->set_current( new $this->render_modes[ $key ]( $post_id ) );
|
||||
} else {
|
||||
$this->set_current( new Render_Mode_Normal( $post_id ) );
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add actions base on the current render.
|
||||
*
|
||||
* @throws \Requests_Exception_HTTP_403
|
||||
* @throws Status403
|
||||
*/
|
||||
private function add_current_actions() {
|
||||
if ( ! $this->current->get_permissions_callback() ) {
|
||||
// WP >= 6.2-alpha
|
||||
if ( class_exists( '\WpOrg\Requests\Exception\Http\Status403' ) ) {
|
||||
throw new \WpOrg\Requests\Exception\Http\Status403();
|
||||
} else {
|
||||
throw new \Requests_Exception_HTTP_403();
|
||||
}
|
||||
}
|
||||
|
||||
// Run when 'template-redirect' actually because the the class is instantiate when 'template-redirect' run.
|
||||
$this->current->prepare_render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Render_Mode_Manager constructor.
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->register_render_mode( Render_Mode_Normal::class );
|
||||
|
||||
do_action( 'elementor/frontend/render_mode/register', $this );
|
||||
|
||||
$this->choose_render_mode();
|
||||
$this->add_current_actions();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
namespace Elementor\Core\Frontend\RenderModes;
|
||||
|
||||
use Elementor\Plugin;
|
||||
use Elementor\Core\Base\Document;
|
||||
use Elementor\Core\Frontend\Render_Mode_Manager;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
abstract class Render_Mode_Base {
|
||||
const ENQUEUE_SCRIPTS_PRIORITY = 10;
|
||||
const ENQUEUE_STYLES_PRIORITY = 10;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $post_id;
|
||||
|
||||
/**
|
||||
* @var Document
|
||||
*/
|
||||
protected $document;
|
||||
|
||||
/**
|
||||
* Render_Mode_Base constructor.
|
||||
*
|
||||
* @param $post_id
|
||||
*/
|
||||
public function __construct( $post_id ) {
|
||||
$this->post_id = intval( $post_id );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the key name of the class.
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function get_name() {
|
||||
throw new \Exception( 'You must implements `get_name` static method in ' . static::class );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $post_id
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function get_url( $post_id ) {
|
||||
return Render_Mode_Manager::get_base_url( $post_id, static::get_name() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs before the render, by default load scripts and styles.
|
||||
*/
|
||||
public function prepare_render() {
|
||||
add_action( 'wp_enqueue_scripts', function () {
|
||||
$this->enqueue_scripts();
|
||||
}, static::ENQUEUE_SCRIPTS_PRIORITY );
|
||||
|
||||
add_action( 'wp_enqueue_scripts', function () {
|
||||
$this->enqueue_styles();
|
||||
}, static::ENQUEUE_STYLES_PRIORITY );
|
||||
}
|
||||
|
||||
/**
|
||||
* By default do not do anything.
|
||||
*/
|
||||
protected function enqueue_scripts() {
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* By default do not do anything.
|
||||
*/
|
||||
protected function enqueue_styles() {
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the current user has permissions for the current render mode.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function get_permissions_callback() {
|
||||
return $this->get_document()->is_editable_by_current_user();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current render mode is static render, By default returns false.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function is_static() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Document
|
||||
*/
|
||||
public function get_document() {
|
||||
if ( ! $this->document ) {
|
||||
$this->document = Plugin::$instance->documents->get( $this->post_id );
|
||||
}
|
||||
|
||||
return $this->document;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
namespace Elementor\Core\Frontend\RenderModes;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Render_Mode_Normal extends Render_Mode_Base {
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public static function get_name() {
|
||||
return 'normal';
|
||||
}
|
||||
|
||||
/**
|
||||
* Anyone can access the normal render mode.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function get_permissions_callback() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user