From d5ef66a24fd62a930461cd0b0395e00f81628a2f Mon Sep 17 00:00:00 2001 From: Rutvik Savsani Date: Thu, 10 Mar 2022 21:39:50 +0530 Subject: [PATCH 1/4] Add logic to conditionally install service workers.. --- wp-includes/default-filters.php | 56 ++++++++++++++++++++++++++++----- wp-includes/service-workers.php | 14 +++++++++ 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index 7ca1524fa..ce1680578 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -7,15 +7,55 @@ * @package PWA */ -// Ensure service workers are printed on frontend, admin, Customizer, login, sign-up, and activate pages. -foreach ( array( 'wp_print_footer_scripts', 'admin_print_scripts', 'customize_controls_print_scripts', 'login_footer', 'after_signup_form', 'activate_wp_head' ) as $filter ) { - add_filter( $filter, 'wp_print_service_workers', 9 ); -} +$service_worker_actions = wp_get_actions_with_registered_service_worker_scripts(); + +if ( get_option( 'offline_browsing' ) || ! empty( $service_worker_actions ) ) { + + // Ensure service workers are printed on frontend, admin, Customizer, login, sign-up, and activate pages. + $hooks = array( + 'front' => array( + 'wp_print_footer_scripts', + ), + 'admin' => array( + 'admin_print_scripts', + 'customize_controls_print_scripts', + 'login_footer', + 'after_signup_form', + 'activate_wp_head', + ), + ); + + if ( get_option( 'offline_browsing' ) ) { + // Ensure service workers are printed on frontend, admin, Customizer, login, sign-up, and activate pages. + foreach ( array_merge( $hooks['front'], $hooks['admin'] ) as $filter ) { + add_filter( $filter, 'wp_print_service_workers', 9 ); + } + + add_action( 'parse_query', 'wp_service_worker_loaded' ); + add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); + add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); + add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); + } -add_action( 'parse_query', 'wp_service_worker_loaded' ); -add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); -add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); -add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); + if ( in_array( 'wp_front_service_worker', $service_worker_actions ) ) { + // Ensure service workers are printed on frontend. + add_filter( 'wp_print_footer_scripts', 'wp_print_service_workers', 9 ); + + add_action( 'parse_query', 'wp_service_worker_loaded' ); + add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); + } + + if ( in_array( 'wp_admin_service_worker', $service_worker_actions ) ) { + // Ensure service workers are printed on admin, Customizer, login, sign-up, and activate pages. + foreach ( array( 'admin_print_scripts', 'customize_controls_print_scripts', 'login_footer', 'after_signup_form', 'activate_wp_head' ) as $filter ) { + add_filter( $filter, 'wp_print_service_workers', 9 ); + } + + add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); + add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); + add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); + } +} if ( version_compare( strtok( get_bloginfo( 'version' ), '-' ), '5.7', '>=' ) ) { add_action( 'error_head', 'wp_robots', 1 ); // To match wp_robots running at wp_head. diff --git a/wp-includes/service-workers.php b/wp-includes/service-workers.php index cceb717ff..f5f19650e 100644 --- a/wp-includes/service-workers.php +++ b/wp-includes/service-workers.php @@ -258,3 +258,17 @@ function wp_service_worker_skip_waiting() { */ return (bool) apply_filters( 'wp_service_worker_skip_waiting', true ); } + +/** + * Function to check if service worker scripts are registered on + * `wp_front_service_worker` or `wp_admin_service_worker` action hooks. + * + * @return array Array of hooks to which the actions are registered. + */ +function wp_get_actions_with_registered_service_worker_scripts() { + $actions = array(); + has_action( 'wp_front_service_worker' ) ? $actions[] = 'wp_front_service_worker' : null; + has_action( 'wp_admin_service_worker' ) ? $actions[] = 'wp_admin_service_worker' : null; + + return $actions; +} From 183bc97b21465c98faf47cb980023b7293607859 Mon Sep 17 00:00:00 2001 From: Rutvik Savsani Date: Thu, 10 Mar 2022 21:44:57 +0530 Subject: [PATCH 2/4] Add unit tests to test function that returns registered service worker scripts actions. --- tests/test-service-workers.php | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/test-service-workers.php b/tests/test-service-workers.php index 4e9eb8090..f50cdfd9e 100644 --- a/tests/test-service-workers.php +++ b/tests/test-service-workers.php @@ -114,4 +114,50 @@ public function test_wp_get_service_worker_url_with_permalinks() { wp_get_service_worker_url( WP_Service_Workers::SCOPE_ADMIN ) ); } + + /** + * Test wp_get_actions_with_registered_service_worker_scripts() when no scripts are added. + * + * @covers ::wp_get_actions_with_registered_service_worker_scripts() + */ + public function test_wp_get_actions_with_registered_service_worker_scripts_with_no_scripts() { + + remove_all_actions( 'wp_front_service_worker' ); + remove_all_actions( 'wp_admin_service_worker' ); + + $this->assertEquals( + array(), + wp_get_actions_with_registered_service_worker_scripts() + ); + } + + /** + * Test wp_get_actions_with_registered_service_worker_scripts() when scripts are added. + * + * @covers ::wp_get_actions_with_registered_service_worker_scripts() + */ + public function test_wp_get_actions_with_registered_service_worker_scripts_with_registered_scripts() { + // Register for the admin service worker. + add_action( 'wp_front_service_worker', 'register_foo_sw' ); + + $this->assertEquals( + array( 'wp_front_service_worker' ), + wp_get_actions_with_registered_service_worker_scripts() + ); + } + + /** + * Register a service worker. + * + * @param WP_Service_Worker_Scripts $scripts Registry instance. + */ + public function register_foo_sw( $scripts ) { + $scripts->register( + 'foo', + array( + 'src' => array( $this, 'return_foo_sw' ), + 'deps' => array(), + ) + ); + } } From 79e69adbb1e347f333e3f74b2de7004a39fc4a6c Mon Sep 17 00:00:00 2001 From: Rutvik Savsani Date: Mon, 14 Mar 2022 15:12:22 +0530 Subject: [PATCH 3/4] Optimize conditions in default filters. --- wp-includes/default-filters.php | 58 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index ce1680578..810b692d3 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -9,54 +9,52 @@ $service_worker_actions = wp_get_actions_with_registered_service_worker_scripts(); -if ( get_option( 'offline_browsing' ) || ! empty( $service_worker_actions ) ) { +// Array of filter hooks that are used to trigger the service worker. +$hooks = array( + 'front' => array( + 'wp_print_footer_scripts', + ), + 'admin' => array( + 'admin_print_scripts', + 'customize_controls_print_scripts', + 'login_footer', + 'after_signup_form', + 'activate_wp_head', + ), +); +if ( get_option( 'offline_browsing' ) ) { // Ensure service workers are printed on frontend, admin, Customizer, login, sign-up, and activate pages. - $hooks = array( - 'front' => array( - 'wp_print_footer_scripts', - ), - 'admin' => array( - 'admin_print_scripts', - 'customize_controls_print_scripts', - 'login_footer', - 'after_signup_form', - 'activate_wp_head', - ), - ); + foreach ( array_merge( $hooks['front'], $hooks['admin'] ) as $filter ) { + add_filter( $filter, 'wp_print_service_workers', 9 ); + } - if ( get_option( 'offline_browsing' ) ) { - // Ensure service workers are printed on frontend, admin, Customizer, login, sign-up, and activate pages. - foreach ( array_merge( $hooks['front'], $hooks['admin'] ) as $filter ) { + add_action( 'parse_query', 'wp_service_worker_loaded' ); + add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); + add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); +} else if ( ! empty( $service_worker_actions ) ) { + if ( in_array( 'wp_front_service_worker', $service_worker_actions, true ) ) { + // Ensure service workers are printed on admin, Customizer, login, sign-up, and activate pages. + foreach ( $hooks['front'] as $filter ) { add_filter( $filter, 'wp_print_service_workers', 9 ); } add_action( 'parse_query', 'wp_service_worker_loaded' ); - add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); - add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); - add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); } - if ( in_array( 'wp_front_service_worker', $service_worker_actions ) ) { - // Ensure service workers are printed on frontend. - add_filter( 'wp_print_footer_scripts', 'wp_print_service_workers', 9 ); - - add_action( 'parse_query', 'wp_service_worker_loaded' ); - add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); - } - - if ( in_array( 'wp_admin_service_worker', $service_worker_actions ) ) { + if ( in_array( 'wp_admin_service_worker', $service_worker_actions, true ) ) { // Ensure service workers are printed on admin, Customizer, login, sign-up, and activate pages. - foreach ( array( 'admin_print_scripts', 'customize_controls_print_scripts', 'login_footer', 'after_signup_form', 'activate_wp_head' ) as $filter ) { + foreach ( $hooks['admin'] as $filter ) { add_filter( $filter, 'wp_print_service_workers', 9 ); } add_action( 'wp_ajax_wp_service_worker', 'wp_ajax_wp_service_worker' ); add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); - add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); } } +add_action( 'parse_query', 'wp_unauthenticate_error_template_requests' ); + if ( version_compare( strtok( get_bloginfo( 'version' ), '-' ), '5.7', '>=' ) ) { add_action( 'error_head', 'wp_robots', 1 ); // To match wp_robots running at wp_head. add_filter( 'wp_robots', 'wp_filter_robots_for_error_template' ); From 373c0ef91fa335c88c82a257cd90fe4b9aac6da1 Mon Sep 17 00:00:00 2001 From: Rutvik Savsani Date: Mon, 14 Mar 2022 15:16:22 +0530 Subject: [PATCH 4/4] Fix inline comment in default-filters.php. --- wp-includes/default-filters.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index 810b692d3..26c46e130 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -34,7 +34,7 @@ add_action( 'wp_ajax_nopriv_wp_service_worker', 'wp_ajax_wp_service_worker' ); } else if ( ! empty( $service_worker_actions ) ) { if ( in_array( 'wp_front_service_worker', $service_worker_actions, true ) ) { - // Ensure service workers are printed on admin, Customizer, login, sign-up, and activate pages. + // Ensure service workers are printed on frontend. foreach ( $hooks['front'] as $filter ) { add_filter( $filter, 'wp_print_service_workers', 9 ); }