<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[44674] trunk/src: Bootstrap/Load: Change `shutdown handler` naming to final `fatal error handler` and allow disabling the handler entirely via a constant.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/44674">44674</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/44674","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>flixos90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2019-01-21 20:14:56 +0000 (Mon, 21 Jan 2019)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Bootstrap/Load: Change `shutdown handler` naming to final `fatal error handler` and allow disabling the handler entirely via a constant.

The `WP_Shutdown_Handler` name plus related function names were premature when originally committed, as there can be multiple shutdown handlers in PHP, and WordPress makes use of that feature. This changeset modifies the name to a more appropriate `WP_Fatal_Error_Handler`, and related to that changes the following names:

* The drop-in to override the handler is now called `fatal-error-handler.php`.
* The internal function `wp_register_premature_shutdown_handler` is now called `wp_register_fatal_error_handler()`.

In addition to these naming changes, a new constant `WP_DISABLE_FATAL_ERROR_HANDLER` is introduced that can be set in `wp-config.php` to entirely disable the fatal error handler. That constant's value is and should be accessed indirectly via a new `wp_is_fatal_error_handler_enabled()` function and is filterable via a new `wp_fatal_error_handler_enabled` hook. Note that disabling the fatal error handler will skip the new functionality entirely, including the potentially used `fatal-error-handler.php` drop-in.

The new set of constant, filter and function provide for an easier-to-use mechanism to disable the fatal error handler altogether, rather than requiring developers to implement a drop-in for purely that purpose.

Props afragen, flixos90, joyously, knutsp, markjaquith, ocean90, schlessera, spacedmonkey.
Fixes <a href="https://core.trac.wordpress.org/ticket/46047">#46047</a>. See <a href="https://core.trac.wordpress.org/ticket/44458">#44458</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludespluginphp">trunk/src/wp-admin/includes/plugin.php</a></li>
<li><a href="#trunksrcwpincludeserrorprotectionphp">trunk/src/wp-includes/error-protection.php</a></li>
<li><a href="#trunksrcwpsettingsphp">trunk/src/wp-settings.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesclasswpfatalerrorhandlerphp">trunk/src/wp-includes/class-wp-fatal-error-handler.php</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunksrcwpincludesclasswpshutdownhandlerphp">trunk/src/wp-includes/class-wp-shutdown-handler.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludespluginphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/plugin.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/plugin.php    2019-01-21 20:06:24 UTC (rev 44673)
+++ trunk/src/wp-admin/includes/plugin.php      2019-01-21 20:14:56 UTC (rev 44674)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -468,14 +468,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function _get_dropins() {
</span><span class="cx" style="display: block; padding: 0 10px">        $dropins = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                'advanced-cache.php'   => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
-               'db.php'               => array( __( 'Custom database class.' ), true ), // auto on load
-               'db-error.php'         => array( __( 'Custom database error message.' ), true ), // auto on error
-               'install.php'          => array( __( 'Custom installation script.' ), true ), // auto on installation
-               'maintenance.php'      => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
-               'object-cache.php'     => array( __( 'External object cache.' ), true ), // auto on load
-               'php-error.php'        => array( __( 'Custom PHP error message.' ), true ), // auto on error
-               'shutdown-handler.php' => array( __( 'Custom PHP shutdown handler.' ), true ), // auto on error
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         'advanced-cache.php'      => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
+               'db.php'                  => array( __( 'Custom database class.' ), true ), // auto on load
+               'db-error.php'            => array( __( 'Custom database error message.' ), true ), // auto on error
+               'install.php'             => array( __( 'Custom installation script.' ), true ), // auto on installation
+               'maintenance.php'         => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
+               'object-cache.php'        => array( __( 'External object cache.' ), true ), // auto on load
+               'php-error.php'           => array( __( 'Custom PHP error message.' ), true ), // auto on error
+               'fatal-error-handler.php' => array( __( 'Custom PHP fatal error handler.' ), true ), // auto on error
</ins><span class="cx" style="display: block; padding: 0 10px">         );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( is_multisite() ) {
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpfatalerrorhandlerphpfromrev44673trunksrcwpincludesclasswpshutdownhandlerphp"></a>
<div class="copfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Copied: trunk/src/wp-includes/class-wp-fatal-error-handler.php (from rev 44673, trunk/src/wp-includes/class-wp-shutdown-handler.php)</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-fatal-error-handler.php                            (rev 0)
+++ trunk/src/wp-includes/class-wp-fatal-error-handler.php      2019-01-21 20:14:56 UTC (rev 44674)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,200 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/**
+ * Error Protection API: WP_Fatal_Error_Handler class
+ *
+ * @package WordPress
+ * @since 5.1.0
+ */
+
+/**
+ * Core class used as the default shutdown handler for fatal errors.
+ *
+ * A drop-in 'fatal-error-handler.php' can be used to override the instance of this class and use a custom
+ * implementation for the fatal error handler that WordPress registers. The custom class should extend this class and
+ * can override its methods individually as necessary. The file must return the instance of the class that should be
+ * registered.
+ *
+ * @since 5.1.0
+ */
+class WP_Fatal_Error_Handler {
+
+       /**
+        * Runs the shutdown handler.
+        *
+        * This method is registered via `register_shutdown_function()`.
+        *
+        * @since 5.1.0
+        */
+       public function handle() {
+               // Bail if WordPress executed successfully.
+               if ( defined( 'WP_EXECUTION_SUCCEEDED' ) && WP_EXECUTION_SUCCEEDED ) {
+                       return;
+               }
+
+               try {
+                       // Bail if no error found.
+                       $error = $this->detect_error();
+                       if ( ! $error ) {
+                               return;
+                       }
+
+                       // If the error was stored and thus the extension paused,
+                       // redirect the request to catch multiple errors in one go.
+                       if ( $this->store_error( $error ) ) {
+                               $this->redirect_protected();
+                       }
+
+                       // Display the PHP error template.
+                       $this->display_error_template();
+               } catch ( Exception $e ) {
+                       // Catch exceptions and remain silent.
+               }
+       }
+
+       /**
+        * Detects the error causing the crash if it should be handled.
+        *
+        * @since 5.1.0
+        *
+        * @return array|null Error that was triggered, or null if no error received or if the error should not be handled.
+        */
+       protected function detect_error() {
+               $error = error_get_last();
+
+               // No error, just skip the error handling code.
+               if ( null === $error ) {
+                       return null;
+               }
+
+               // Bail if this error should not be handled.
+               if ( ! wp_should_handle_error( $error ) ) {
+                       return null;
+               }
+
+               return $error;
+       }
+
+       /**
+        * Stores the given error so that the extension causing it is paused.
+        *
+        * @since 5.1.0
+        *
+        * @param array $error Error that was triggered.
+        * @return bool True if the error was stored successfully, false otherwise.
+        */
+       protected function store_error( $error ) {
+               // Do not pause extensions if they only crash on a non-protected endpoint.
+               if ( ! is_protected_endpoint() ) {
+                       return false;
+               }
+
+               return wp_record_extension_error( $error );
+       }
+
+       /**
+        * Redirects the current request to allow recovering multiple errors in one go.
+        *
+        * The redirection will only happen when on a protected endpoint.
+        *
+        * It must be ensured that this method is only called when an error actually occurred and will not occur on the
+        * next request again. Otherwise it will create a redirect loop.
+        *
+        * @since 5.1.0
+        */
+       protected function redirect_protected() {
+               // Do not redirect requests on non-protected endpoints.
+               if ( ! is_protected_endpoint() ) {
+                       return;
+               }
+
+               // Pluggable is usually loaded after plugins, so we manually include it here for redirection functionality.
+               if ( ! function_exists( 'wp_redirect' ) ) {
+                       include ABSPATH . WPINC . '/pluggable.php';
+               }
+
+               $scheme = is_ssl() ? 'https://' : 'http://';
+
+               $url = "{$scheme}{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
+               wp_redirect( $url );
+               exit;
+       }
+
+       /**
+        * Displays the PHP error template and sends the HTTP status code, typically 500.
+        *
+        * A drop-in 'php-error.php' can be used as a custom template. This drop-in should control the HTTP status code and
+        * print the HTML markup indicating that a PHP error occurred. Note that this drop-in may potentially be executed
+        * very early in the WordPress bootstrap process, so any core functions used that are not part of
+        * `wp-includes/load.php` should be checked for before being called.
+        *
+        * If no such drop-in is available, this will call {@see WP_Fatal_Error_Handler::display_default_error_template()}.
+        *
+        * @since 5.1.0
+        */
+       protected function display_error_template() {
+               if ( defined( 'WP_CONTENT_DIR' ) ) {
+                       // Load custom PHP error template, if present.
+                       $php_error_pluggable = WP_CONTENT_DIR . '/php-error.php';
+                       if ( is_readable( $php_error_pluggable ) ) {
+                               require_once $php_error_pluggable;
+                               return;
+                       }
+               }
+
+               // Otherwise, display the default error template.
+               $this->display_default_error_template();
+       }
+
+       /**
+        * Displays the default PHP error template.
+        *
+        * This method is called conditionally if no 'php-error.php' drop-in is available.
+        *
+        * It calls {@see wp_die()} with a message indicating that the site is experiencing technical difficulties and a
+        * login link to the admin backend. The {@see 'wp_php_error_message'} and {@see 'wp_php_error_args'} filters can
+        * be used to modify these parameters.
+        *
+        * @since 5.1.0
+        */
+       protected function display_default_error_template() {
+               if ( ! function_exists( '__' ) ) {
+                       wp_load_translations_early();
+               }
+
+               if ( ! function_exists( 'wp_die' ) ) {
+                       require_once ABSPATH . WPINC . '/functions.php';
+               }
+
+               $message = __( 'The site is experiencing technical difficulties.' );
+
+               $args = array(
+                       'response' => 500,
+                       'exit'     => false,
+               );
+               if ( function_exists( 'admin_url' ) ) {
+                       $args['link_url']  = admin_url();
+                       $args['link_text'] = __( 'Log into the admin backend to fix this.' );
+               }
+
+               /**
+                * Filters the message that the default PHP error template displays.
+                *
+                * @since 5.1.0
+                *
+                * @param string $message HTML error message to display.
+                */
+               $message = apply_filters( 'wp_php_error_message', $message );
+
+               /**
+                * Filters the arguments passed to {@see wp_die()} for the default PHP error template.
+                *
+                * @since 5.1.0
+                *
+                * @param array $args Associative array of arguments passed to `wp_die()`. By default these contain a
+                *                    'response' key, and optionally 'link_url' and 'link_text' keys.
+                */
+               $args = apply_filters( 'wp_php_error_args', $args );
+
+               wp_die( $message, '', $args );
+       }
+}
</ins></span></pre></div>
<a id="trunksrcwpincludesclasswpshutdownhandlerphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: trunk/src/wp-includes/class-wp-shutdown-handler.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-shutdown-handler.php       2019-01-21 20:06:24 UTC (rev 44673)
+++ trunk/src/wp-includes/class-wp-shutdown-handler.php 2019-01-21 20:14:56 UTC (rev 44674)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,199 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-/**
- * Error Protection API: WP_Shutdown_Handler class
- *
- * @package WordPress
- * @since 5.1.0
- */
-
-/**
- * Core class used as the default shutdown handler.
- *
- * A drop-in 'shutdown-handler.php' can be used to override the instance of this class and use a custom implementation
- * for the shutdown handler that WordPress registers. The custom class should extend this class and can override its
- * methods individually as necessary. The file must return the instance of the class that should be registered.
- *
- * @since 5.1.0
- */
-class WP_Shutdown_Handler {
-
-       /**
-        * Runs the shutdown handler.
-        *
-        * This method is registered via `register_shutdown_function()`.
-        *
-        * @since 5.1.0
-        */
-       public function handle() {
-               // Bail if WordPress executed successfully.
-               if ( defined( 'WP_EXECUTION_SUCCEEDED' ) && WP_EXECUTION_SUCCEEDED ) {
-                       return;
-               }
-
-               try {
-                       // Bail if no error found.
-                       $error = $this->detect_error();
-                       if ( ! $error ) {
-                               return;
-                       }
-
-                       // If the error was stored and thus the extension paused,
-                       // redirect the request to catch multiple errors in one go.
-                       if ( $this->store_error( $error ) ) {
-                               $this->redirect_protected();
-                       }
-
-                       // Display the PHP error template.
-                       $this->display_error_template();
-               } catch ( Exception $e ) {
-                       // Catch exceptions and remain silent.
-               }
-       }
-
-       /**
-        * Detects the error causing the crash if it should be handled.
-        *
-        * @since 5.1.0
-        *
-        * @return array|null Error that was triggered, or null if no error received or if the error should not be handled.
-        */
-       protected function detect_error() {
-               $error = error_get_last();
-
-               // No error, just skip the error handling code.
-               if ( null === $error ) {
-                       return null;
-               }
-
-               // Bail if this error should not be handled.
-               if ( ! wp_should_handle_error( $error ) ) {
-                       return null;
-               }
-
-               return $error;
-       }
-
-       /**
-        * Stores the given error so that the extension causing it is paused.
-        *
-        * @since 5.1.0
-        *
-        * @param array $error Error that was triggered.
-        * @return bool True if the error was stored successfully, false otherwise.
-        */
-       protected function store_error( $error ) {
-               // Do not pause extensions if they only crash on a non-protected endpoint.
-               if ( ! is_protected_endpoint() ) {
-                       return false;
-               }
-
-               return wp_record_extension_error( $error );
-       }
-
-       /**
-        * Redirects the current request to allow recovering multiple errors in one go.
-        *
-        * The redirection will only happen when on a protected endpoint.
-        *
-        * It must be ensured that this method is only called when an error actually occurred and will not occur on the
-        * next request again. Otherwise it will create a redirect loop.
-        *
-        * @since 5.1.0
-        */
-       protected function redirect_protected() {
-               // Do not redirect requests on non-protected endpoints.
-               if ( ! is_protected_endpoint() ) {
-                       return;
-               }
-
-               // Pluggable is usually loaded after plugins, so we manually include it here for redirection functionality.
-               if ( ! function_exists( 'wp_redirect' ) ) {
-                       include ABSPATH . WPINC . '/pluggable.php';
-               }
-
-               $scheme = is_ssl() ? 'https://' : 'http://';
-
-               $url = "{$scheme}{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
-               wp_redirect( $url );
-               exit;
-       }
-
-       /**
-        * Displays the PHP error template and sends the HTTP status code, typically 500.
-        *
-        * A drop-in 'php-error.php' can be used as a custom template. This drop-in should control the HTTP status code and
-        * print the HTML markup indicating that a PHP error occurred. Note that this drop-in may potentially be executed
-        * very early in the WordPress bootstrap process, so any core functions used that are not part of
-        * `wp-includes/load.php` should be checked for before being called.
-        *
-        * If no such drop-in is available, this will call {@see WP_Shutdown_Handler::display_default_error_template()}.
-        *
-        * @since 5.1.0
-        */
-       protected function display_error_template() {
-               if ( defined( 'WP_CONTENT_DIR' ) ) {
-                       // Load custom PHP error template, if present.
-                       $php_error_pluggable = WP_CONTENT_DIR . '/php-error.php';
-                       if ( is_readable( $php_error_pluggable ) ) {
-                               require_once $php_error_pluggable;
-                               return;
-                       }
-               }
-
-               // Otherwise, display the default error template.
-               $this->display_default_error_template();
-       }
-
-       /**
-        * Displays the default PHP error template.
-        *
-        * This method is called conditionally if no 'php-error.php' drop-in is available.
-        *
-        * It calls {@see wp_die()} with a message indicating that the site is experiencing technical difficulties and a
-        * login link to the admin backend. The {@see 'wp_php_error_message'} and {@see 'wp_php_error_args'} filters can
-        * be used to modify these parameters.
-        *
-        * @since 5.1.0
-        */
-       protected function display_default_error_template() {
-               if ( ! function_exists( '__' ) ) {
-                       wp_load_translations_early();
-               }
-
-               if ( ! function_exists( 'wp_die' ) ) {
-                       require_once ABSPATH . WPINC . '/functions.php';
-               }
-
-               $message = __( 'The site is experiencing technical difficulties.' );
-
-               $args = array(
-                       'response' => 500,
-                       'exit'     => false,
-               );
-               if ( function_exists( 'admin_url' ) ) {
-                       $args['link_url']  = admin_url();
-                       $args['link_text'] = __( 'Log into the admin backend to fix this.' );
-               }
-
-               /**
-                * Filters the message that the default PHP error template displays.
-                *
-                * @since 5.1.0
-                *
-                * @param string $message HTML error message to display.
-                */
-               $message = apply_filters( 'wp_php_error_message', $message );
-
-               /**
-                * Filters the arguments passed to {@see wp_die()} for the default PHP error template.
-                *
-                * @since 5.1.0
-                *
-                * @param array $args Associative array of arguments passed to `wp_die()`. By default these contain a
-                *                    'response' key, and optionally 'link_url' and 'link_text' keys.
-                */
-               $args = apply_filters( 'wp_php_error_args', $args );
-
-               wp_die( $message, '', $args );
-       }
-}
</del></span></pre></div>
<a id="trunksrcwpincludeserrorprotectionphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/error-protection.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/error-protection.php        2019-01-21 20:06:24 UTC (rev 44673)
+++ trunk/src/wp-includes/error-protection.php  2019-01-21 20:14:56 UTC (rev 44674)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -148,19 +148,48 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Registers the WordPress premature shutdown handler.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Registers the shutdown handler for fatal errors.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * The handler will only be registered if {@see wp_is_fatal_error_handler_enabled()} returns true.
+ *
</ins><span class="cx" style="display: block; padding: 0 10px">  * @since 5.1.0
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-function wp_register_premature_shutdown_handler() {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+function wp_register_fatal_error_handler() {
+       if ( ! wp_is_fatal_error_handler_enabled() ) {
+               return;
+       }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $handler = null;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/shutdown-handler.php' ) ) {
-               $handler = include WP_CONTENT_DIR . '/shutdown-handler.php';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) {
+               $handler = include WP_CONTENT_DIR . '/fatal-error-handler.php';
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! is_object( $handler ) || ! is_callable( array( $handler, 'handle' ) ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $handler = new WP_Shutdown_Handler();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $handler = new WP_Fatal_Error_Handler();
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        register_shutdown_function( array( $handler, 'handle' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+/**
+ * Checks whether the fatal error handler is enabled.
+ *
+ * A constant `WP_DISABLE_FATAL_ERROR_HANDLER` can be set in `wp-config.php` to disable it, or alternatively the
+ * {@see 'wp_fatal_error_handler_enabled'} filter can be used to modify the return value.
+ *
+ * @since 5.1.0
+ *
+ * @return bool True if the fatal error handler is enabled, false otherwise.
+ */
+function wp_is_fatal_error_handler_enabled() {
+       $enabled = ! defined( 'WP_DISABLE_FATAL_ERROR_HANDLER' ) || ! WP_DISABLE_FATAL_ERROR_HANDLER;
+
+       /**
+        * Filters whether the fatal error handler is enabled.
+        *
+        * @since 5.1.0
+        *
+        * @param bool $enabled True if the fatal error handler is enabled, false otherwise.
+        */
+       return apply_filters( 'wp_fatal_error_handler_enabled', $enabled );
+}
</ins></span></pre></div>
<a id="trunksrcwpsettingsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-settings.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-settings.php 2019-01-21 20:06:24 UTC (rev 44673)
+++ trunk/src/wp-settings.php   2019-01-21 20:14:56 UTC (rev 44674)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,13 +18,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> // Include files required for initialization.
</span><span class="cx" style="display: block; padding: 0 10px"> require( ABSPATH . WPINC . '/load.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> require( ABSPATH . WPINC . '/class-wp-paused-extensions-storage.php' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-require( ABSPATH . WPINC . '/class-wp-shutdown-handler.php' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+require( ABSPATH . WPINC . '/class-wp-fatal-error-handler.php' );
</ins><span class="cx" style="display: block; padding: 0 10px"> require( ABSPATH . WPINC . '/error-protection.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> require( ABSPATH . WPINC . '/default-constants.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> require_once( ABSPATH . WPINC . '/plugin.php' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-// Make sure we register the premature shutdown handler as soon as possible.
-wp_register_premature_shutdown_handler();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+// Make sure we register the shutdown handler for fatal errors as soon as possible.
+wp_register_fatal_error_handler();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /*
</span><span class="cx" style="display: block; padding: 0 10px">  * These can't be directly globalized in version.php. When updating,
</span></span></pre>
</div>
</div>

</body>
</html>