PluginProbe
Gutenberg / trunk
Gutenberg vtrunk
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
← All changes | build/pages/experiments/page-wp-admin.php +63 -16 23.2.2 → trunk View file →
@@ -86,11 +86,12 @@
86 86 * Automatically called during page rendering.
87 87 */
88 88 function gutenberg_experiments_wp_admin_preload_data() {
89 89 // Define paths to preload - same for all pages
90 - // Please also change packages/core-data/src/entities.js when changing this.
90 + // This must exactly match the _fields list in packages/core-data/src/entities.js,
91 + // same fields in the same order, or the preload is never consumed.
91 92 $preload_paths = array(
92 - '/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
93 + '/?_fields=description,gmt_offset,home,image_max_bit_depth,image_sizes,image_size_threshold,image_strip_meta,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
93 94 array( '/wp/v2/settings', 'OPTIONS' ),
94 95 );
95 96
96 97 // Use rest_preload_api_request to gather the preloaded data
@@ -133,9 +134,11 @@
133 134
134 135 // Load build constants
135 136 $build_constants = require __DIR__ . '/../../constants.php';
136 137
137 - // Fire init action for extensions to register routes and menu items
138 + /**
139 + * Fires when the experiments admin page is initialized so extensions can register routes and menu items.
140 + */
138 141 do_action( 'experiments-wp-admin_init' );
139 142
140 143 // Preload REST API data
141 144 gutenberg_experiments_wp_admin_preload_data();
@@ -142,10 +145,14 @@
142 145
143 146 // Get all registered routes
144 147 $routes = gutenberg_get_experiments_wp_admin_routes();
145 148
146 - // Get boot module asset file for dependencies
149 + // Get boot module asset file for dependencies. Plugins that build their own
150 + // boot module use it; everyone else falls back to the copy bundled with Core.
147 151 $asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
152 + if ( ! file_exists( $asset_file ) ) {
153 + $asset_file = ABSPATH . WPINC . '/js/dist/script-modules/boot/index.min.asset.php';
154 + }
148 155 if ( file_exists( $asset_file ) ) {
149 156 $asset = require $asset_file;
150 157
151 158 // This script serves two purposes:
@@ -152,15 +159,41 @@
152 159 // 1. It ensures all the globals that are made available to the modules are loaded.
153 160 // 2. It initializes the boot module as an inline script.
154 161 wp_register_script( 'experiments-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
155 162
156 - // Add inline script to initialize the app using initSinglePage (no menuItems)
163 + $init_modules = [];
164 +
165 + /*
166 + * Add inline script to initialize the app using initSinglePage (no menuItems).
167 + * The dynamic import is deferred until DOMContentLoaded so that all classic
168 + * script dependencies of @wordpress/boot (wp-private-apis, wp-components,
169 + * wp-theme, etc.) have finished parsing and executing before the boot module
170 + * evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
171 + * against the classic-script-printing pass on fast CDN-fronted hosts in
172 + * Chrome, evaluating before wp.theme.privateApis is defined and throwing
173 + * "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
174 + */
175 + $init_js_function = <<<'JS'
176 + ( mountId, routes, initModules ) => {
177 + const run = async () => {
178 + const mod = await import( "@wordpress/boot" );
179 + mod.initSinglePage( { mountId, routes, initModules } );
180 + };
181 + if ( document.readyState === "loading" ) {
182 + document.addEventListener( "DOMContentLoaded", run );
183 + } else {
184 + run();
185 + }
186 + }
187 + JS;
157 188 wp_add_inline_script(
158 189 'experiments-wp-admin-prerequisites',
159 190 sprintf(
160 - 'import("@wordpress/boot").then(mod => mod.initSinglePage({mountId: "%s", routes: %s}));',
161 - 'experiments-wp-admin-app',
162 - wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
191 + '( %s )( %s, %s, %s );',
192 + $init_js_function,
193 + wp_json_encode( 'experiments-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
194 + wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
195 + wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
163 196 )
164 197 );
165 198
166 199 // Register prerequisites style by filtering script dependencies to find registered styles
@@ -179,8 +212,11 @@
179 212 'id' => '@wordpress/boot',
180 213 ),
181 214 );
182 215
216 + // Add init modules as static dependencies
217 + // No init modules configured
218 +
183 219 // Add all registered routes as dependencies
184 220 foreach ( $routes as $route ) {
185 221 if ( isset( $route['route_module'] ) ) {
186 222 $boot_dependencies[] = array(
@@ -234,30 +270,28 @@
234 270 ?>
235 271 <style>
236 272 /* Critical styles to prevent layout shifts - inlined for immediate application */
237 273
238 - /* Background colors */
239 274 #wpwrap {
240 - background: var(--wpds-color-fg-content-neutral, #1e1e1e);
241 275 overflow-y: auto;
242 276 }
243 - body {
277 + body.js {
244 278 background: #fff;
245 279 }
246 280
247 281 /* Reset wp-admin padding */
248 - #wpcontent {
282 + body.js #wpcontent {
249 283 padding-inline-start: 0;
250 284 }
251 - #wpbody-content {
285 + body.js #wpbody-content {
252 286 padding-bottom: 0;
253 287 }
254 288
255 289 /* Hide legacy admin elements */
256 - #wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
290 + body.js #wpbody-content > div:not(#experiments-wp-admin-app):not(#screen-meta) {
257 291 display: none;
258 292 }
259 - #wpfooter {
293 + body.js #wpfooter {
260 294 display: none;
261 295 }
262 296
263 297 /* Accessibility regions */
@@ -284,8 +318,22 @@
284 318 overflow-y: initial;
285 319 }
286 320 }
287 321 </style>
322 + <div class="wrap hide-if-js">
323 + <h1 class="wp-heading-inline"><?php echo esc_html( get_admin_page_title() ); ?></h1>
324 + <?php
325 + wp_admin_notice(
326 + __( 'This screen requires JavaScript. Enable JavaScript in your browser settings and reload the page.' ),
327 + array( 'type' => 'error' )
328 + );
329 + ?>
330 + </div>
331 + <?php
332 + // Core's pre-CSS Modules Boot layout uses this class for viewport sizing.
333 + // Remove it when the minimum supported WordPress version includes the Boot
334 + // changes from Gutenberg #81756.
335 + ?>
288 336 <div id="experiments-wp-admin-app" class="boot-layout-container"></div>
289 337 <?php
290 338 }
291 339
@@ -290,5 +338,4 @@
290 338 }
291 339
292 340 // Hook the enqueue function to admin_enqueue_scripts
293 341 add_action( 'admin_enqueue_scripts', 'gutenberg_experiments_wp_admin_enqueue_scripts' );
294 -