File Editors: Introduce sandboxed live editing of PHP files with rollbacks for both themes and plugins.
* Edits to active plugins which cause PHP fatal errors will no longer auto-deactivate the plugin. Supersedes #39766. * Introduce sandboxed PHP file edits for active themes, preventing accidental whitescreening of a user's site when introducing a fatal error. * After writing a change to a PHP file for an active theme or plugin, perform loopback requests on the file editor admin screens and the homepage to check for fatal errors. If a fatal error is encountered, roll back the edited file and display the error to the user to fix and try again. * Introduce a secure way to scrape PHP fatal errors from a site via `wp_start_scraping_edited_file_errors()` and `wp_finalize_scraping_edited_file_errors()`. * Moves file modifications from `theme-editor.php` and `plugin-editor.php` to common `wp_edit_theme_plugin_file()` function. * Refactor themes and plugin editors to submit file changes via Ajax instead of doing full page refreshes when JS is available. * Use `get` method for theme/plugin dropdowns. * Improve styling of plugin editors, including width of plugin/theme dropdowns. * Improve notices API for theme/plugin editor JS component. * Strip common base directory from plugin file list. See #24048. * Factor out functions to list editable file types in `wp_get_theme_file_editable_extensions()` and `wp_get_plugin_file_editable_extensions()`. * Scroll to line in editor that has linting error when attempting to save. See #41886. * Add checkbox to dismiss lint errors to proceed with saving. See #41887. * Only style the Update File button as disabled instead of actually disabling it for accessibility reasons. * Ensure that value from CodeMirror is used instead of `textarea` when CodeMirror is present. * Add "Are you sure?" check when leaving editor when there are unsaved changes. Supersedes [41560]. See #39766, #24048, #41886. Props westonruter, Clorith, melchoyce, johnbillion, jjj, jdgrimes, azaozz. Fixes #21622, #41887. Built from https://develop.svn.wordpress.org/trunk@41721 git-svn-id: http://core.svn.wordpress.org/trunk@41555 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
@@ -14,9 +14,10 @@ window.wp = window.wp || {};
|
||||
* @since 4.2.0
|
||||
* @since 4.3.0 Introduced the 'ariaLive' argument.
|
||||
*
|
||||
* @param {String} message The message to be announced by Assistive Technologies.
|
||||
* @param {String} ariaLive Optional. The politeness level for aria-live. Possible values:
|
||||
* polite or assertive. Default polite.
|
||||
* @param {String} message The message to be announced by Assistive Technologies.
|
||||
* @param {String} [ariaLive] The politeness level for aria-live. Possible values:
|
||||
* polite or assertive. Default polite.
|
||||
* @returns {void}
|
||||
*/
|
||||
function speak( message, ariaLive ) {
|
||||
// Clear previous messages to allow repeated strings being read out.
|
||||
|
||||
@@ -1112,3 +1112,46 @@ function wp_is_file_mod_allowed( $context ) {
|
||||
*/
|
||||
return apply_filters( 'file_mod_allowed', ! defined( 'DISALLOW_FILE_MODS' ) || ! DISALLOW_FILE_MODS, $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Start scraping edited file errors.
|
||||
*
|
||||
* @since 4.9.0
|
||||
*/
|
||||
function wp_start_scraping_edited_file_errors() {
|
||||
if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) {
|
||||
return;
|
||||
}
|
||||
$key = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 );
|
||||
$nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] );
|
||||
|
||||
if ( get_transient( 'scrape_key_' . $key ) !== $nonce ) {
|
||||
echo "###### begin_scraped_error:$key ######";
|
||||
echo wp_json_encode( array(
|
||||
'code' => 'scrape_nonce_failure',
|
||||
'message' => __( 'Scrape nonce check failed. Please try again.' ),
|
||||
) );
|
||||
die();
|
||||
}
|
||||
register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key );
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize scraping for edited file errors.
|
||||
*
|
||||
* @since 4.9.0
|
||||
*
|
||||
* @param string $scrape_key Scrape key.
|
||||
*/
|
||||
function wp_finalize_scraping_edited_file_errors( $scrape_key ) {
|
||||
$error = error_get_last();
|
||||
if ( empty( $error ) ) {
|
||||
return;
|
||||
}
|
||||
if ( ! in_array( $error['type'], array( E_CORE_ERROR, E_COMPILE_ERROR, E_ERROR, E_PARSE, E_USER_ERROR, E_RECOVERABLE_ERROR ), true ) ) {
|
||||
return;
|
||||
}
|
||||
$error = str_replace( ABSPATH, '', $error );
|
||||
echo "###### begin_scraped_error:$scrape_key ######";
|
||||
echo wp_json_encode( $error );
|
||||
}
|
||||
|
||||
@@ -471,11 +471,14 @@ function wp_default_scripts( &$scripts ) {
|
||||
$scripts->add( 'htmlhint', '/wp-includes/js/codemirror/htmlhint.js', array(), '0.9.14-xwp' );
|
||||
$scripts->add( 'htmlhint-kses', '/wp-includes/js/codemirror/htmlhint-kses.js', array( 'htmlhint' ) );
|
||||
$scripts->add( 'code-editor', "/wp-admin/js/code-editor$suffix.js", array( 'jquery', 'wp-codemirror' ) );
|
||||
$scripts->add( 'wp-theme-plugin-editor', "/wp-admin/js/theme-plugin-editor$suffix.js", array( 'code-editor', 'jquery', 'jquery-ui-core', 'wp-a11y', 'underscore' ) );
|
||||
did_action( 'init' ) && $scripts->add_inline_script( 'wp-theme-plugin-editor', sprintf( 'wp.themePluginEditor.l10n = %s;', wp_json_encode( wp_array_slice_assoc(
|
||||
/* translators: %d: error count */
|
||||
_n_noop( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.' ),
|
||||
array( 'singular', 'plural' )
|
||||
$scripts->add( 'wp-theme-plugin-editor', "/wp-admin/js/theme-plugin-editor$suffix.js", array( 'wp-util', 'jquery', 'jquery-ui-core', 'wp-a11y', 'underscore' ) );
|
||||
did_action( 'init' ) && $scripts->add_inline_script( 'wp-theme-plugin-editor', sprintf( 'wp.themePluginEditor.l10n = %s;', wp_json_encode( array(
|
||||
'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ),
|
||||
'lintError' => wp_array_slice_assoc(
|
||||
/* translators: %d: error count */
|
||||
_n_noop( 'There is %d error which must be fixed before you can update this file.', 'There are %d errors which must be fixed before you can update this file.' ),
|
||||
array( 'singular', 'plural' )
|
||||
),
|
||||
) ) ) );
|
||||
|
||||
$scripts->add( 'wp-playlist', "/wp-includes/js/mediaelement/wp-playlist$suffix.js", array( 'wp-util', 'backbone', 'mediaelement' ), false, 1 );
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* @global string $wp_version
|
||||
*/
|
||||
$wp_version = '4.9-alpha-41720';
|
||||
$wp_version = '4.9-alpha-41721';
|
||||
|
||||
/**
|
||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||
|
||||
Reference in New Issue
Block a user