first commit

This commit is contained in:
Ryan Ariana
2024-05-06 11:04:37 +07:00
commit aee061ddba
7322 changed files with 2918816 additions and 0 deletions

View 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' );
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}