diff --git a/inc/compatibility/elementor.php b/inc/compatibility/elementor.php index d2dca99088..1b4f945956 100644 --- a/inc/compatibility/elementor.php +++ b/inc/compatibility/elementor.php @@ -134,12 +134,16 @@ public function enqueue() { /** * Filter rest responses to add Neve Palette Colors to pages using Elementor. * - * @param \WP_REST_Response $response request response. - * @param array $handler request handler. - * @param \WP_REST_Request $request rest request. - * @return \WP_REST_Response + * @param \WP_REST_Response|\WP_Error $response request response. + * @param array $handler request handler. + * @param \WP_REST_Request $request rest request. + * @return \WP_REST_Response|\WP_Error */ public function alter_global_colors_front_end( $response, $handler, \WP_REST_Request $request ) { + if ( is_wp_error( $response ) ) { + return $response; + } + $route = $request->get_route(); $rest_to_slugs = [ 'nvprimaryaccent' => 'nv-primary-accent', @@ -178,12 +182,16 @@ public function alter_global_colors_front_end( $response, $handler, \WP_REST_Req /** * Filter rest responses to add Neve Palette Colors to Elementor. * - * @param \WP_REST_Response $response request response. - * @param array $handler request handler. - * @param \WP_REST_Request $request rest request. - * @return \WP_REST_Response + * @param \WP_REST_Response|\WP_Error $response request response. + * @param array $handler request handler. + * @param \WP_REST_Request $request rest request. + * @return \WP_REST_Response|\WP_Error */ public function alter_global_colors_in_picker( $response, $handler, \WP_REST_Request $request ) { + if ( is_wp_error( $response ) ) { + return $response; + } + $route = $request->get_route(); if ( $route !== '/elementor/v1/globals' ) { diff --git a/tests/test-elementor-compatibility.php b/tests/test-elementor-compatibility.php new file mode 100644 index 0000000000..845d0246ba --- /dev/null +++ b/tests/test-elementor-compatibility.php @@ -0,0 +1,92 @@ +setAccessible( true ); + $custom_colors->setValue( $elementor, [] ); + + return $elementor; + } + + /** + * Errored responses should be passed through untouched. + */ + public function test_global_colors_in_picker_passes_through_wp_error() { + $elementor = $this->get_elementor_compat(); + $request = new WP_REST_Request( 'GET', self::GLOBALS_ROUTE ); + $error = new WP_Error( 'rest_forbidden', 'Sorry, you are not allowed to do that.', [ 'status' => 403 ] ); + + $this->assertSame( $error, $elementor->alter_global_colors_in_picker( $error, [], $request ) ); + } + + /** + * Errored responses on a color route should be passed through untouched. + */ + public function test_global_colors_front_end_passes_through_wp_error() { + $elementor = $this->get_elementor_compat(); + $request = new WP_REST_Request( 'GET', self::COLOR_ROUTE ); + $error = new WP_Error( 'rest_forbidden', 'Sorry, you are not allowed to do that.', [ 'status' => 403 ] ); + + $this->assertSame( $error, $elementor->alter_global_colors_front_end( $error, [], $request ) ); + } + + /** + * Valid responses should still get the Neve palette colors merged in. + */ + public function test_global_colors_in_picker_adds_palette_colors() { + $elementor = $this->get_elementor_compat(); + $request = new WP_REST_Request( 'GET', self::GLOBALS_ROUTE ); + $response = new WP_REST_Response( [ 'colors' => [] ] ); + + $filtered = $elementor->alter_global_colors_in_picker( $response, [], $request ); + $data = $filtered->get_data(); + + $this->assertArrayHasKey( 'nvprimaryaccent', $data['colors'] ); + $this->assertArrayHasKey( 'value', $data['colors']['nvprimaryaccent'] ); + } + + /** + * Valid responses on a single color route should be replaced with the Neve color. + */ + public function test_global_colors_front_end_overrides_color() { + $elementor = $this->get_elementor_compat(); + $request = new WP_REST_Request( 'GET', self::COLOR_ROUTE ); + $response = new WP_REST_Response( [] ); + + $filtered = $elementor->alter_global_colors_front_end( $response, [], $request ); + $data = $filtered->get_data(); + + $this->assertSame( 'nvprimaryaccent', $data['id'] ); + $this->assertArrayHasKey( 'value', $data ); + } +}