Skip to content

Commit aa34c2d

Browse files
Add tests for cross-origin isolation functions
Cover wp_get_chrome_major_version(), the output buffer, and wp_set_up_cross_origin_isolation() including DIP detection, browser gating, filter overrides, and third-party editor skip logic.
1 parent 064ee21 commit aa34c2d

3 files changed

Lines changed: 259 additions & 0 deletions

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
/**
4+
* Tests for the `wp_get_chrome_major_version()` function.
5+
*
6+
* @group media
7+
* @covers ::wp_get_chrome_major_version
8+
*/
9+
class Tests_Media_wpGetChromeMajorVersion extends WP_UnitTestCase {
10+
11+
/**
12+
* Original HTTP_USER_AGENT value.
13+
*
14+
* @var string|null
15+
*/
16+
private $original_user_agent;
17+
18+
public function set_up() {
19+
parent::set_up();
20+
$this->original_user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : null;
21+
}
22+
23+
public function tear_down() {
24+
if ( null === $this->original_user_agent ) {
25+
unset( $_SERVER['HTTP_USER_AGENT'] );
26+
} else {
27+
$_SERVER['HTTP_USER_AGENT'] = $this->original_user_agent;
28+
}
29+
parent::tear_down();
30+
}
31+
32+
public function test_returns_null_when_no_user_agent() {
33+
unset( $_SERVER['HTTP_USER_AGENT'] );
34+
$this->assertNull( wp_get_chrome_major_version() );
35+
}
36+
37+
public function test_returns_null_for_empty_user_agent() {
38+
$_SERVER['HTTP_USER_AGENT'] = '';
39+
$this->assertNull( wp_get_chrome_major_version() );
40+
}
41+
42+
public function test_returns_null_for_firefox() {
43+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0';
44+
$this->assertNull( wp_get_chrome_major_version() );
45+
}
46+
47+
public function test_returns_null_for_safari() {
48+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15';
49+
$this->assertNull( wp_get_chrome_major_version() );
50+
}
51+
52+
public function test_returns_version_for_chrome() {
53+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36';
54+
$this->assertSame( 137, wp_get_chrome_major_version() );
55+
}
56+
57+
public function test_returns_version_for_edge() {
58+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0';
59+
$this->assertSame( 137, wp_get_chrome_major_version() );
60+
}
61+
62+
public function test_returns_version_for_opera() {
63+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 OPR/122.0.0.0';
64+
$this->assertSame( 136, wp_get_chrome_major_version() );
65+
}
66+
67+
public function test_returns_version_for_older_chrome() {
68+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36';
69+
$this->assertSame( 100, wp_get_chrome_major_version() );
70+
}
71+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
/**
4+
* Tests for the `wp_set_up_cross_origin_isolation()` function.
5+
*
6+
* @group media
7+
* @covers ::wp_set_up_cross_origin_isolation
8+
*/
9+
class Tests_Media_wpSetUpCrossOriginIsolation extends WP_UnitTestCase {
10+
11+
/**
12+
* Original $_GET values.
13+
*
14+
* @var array
15+
*/
16+
private $original_get;
17+
18+
public function set_up() {
19+
parent::set_up();
20+
$this->original_get = $_GET;
21+
}
22+
23+
public function tear_down() {
24+
$_GET = $this->original_get;
25+
remove_all_filters( 'wp_client_side_media_processing_enabled' );
26+
parent::tear_down();
27+
}
28+
29+
public function test_returns_early_when_client_side_processing_disabled() {
30+
add_filter( 'wp_client_side_media_processing_enabled', '__return_false' );
31+
32+
// Should not error or start an output buffer.
33+
$level_before = ob_get_level();
34+
wp_set_up_cross_origin_isolation();
35+
$level_after = ob_get_level();
36+
37+
$this->assertSame( $level_before, $level_after );
38+
}
39+
40+
public function test_returns_early_when_no_screen() {
41+
// No screen is set, so it should return early.
42+
$level_before = ob_get_level();
43+
wp_set_up_cross_origin_isolation();
44+
$level_after = ob_get_level();
45+
46+
$this->assertSame( $level_before, $level_after );
47+
}
48+
49+
public function test_skips_for_third_party_editor_action() {
50+
$_GET['action'] = 'elementor';
51+
52+
$level_before = ob_get_level();
53+
wp_set_up_cross_origin_isolation();
54+
$level_after = ob_get_level();
55+
56+
$this->assertSame( $level_before, $level_after, 'Should skip when action is not "edit".' );
57+
}
58+
59+
public function test_does_not_skip_for_edit_action() {
60+
$_GET['action'] = 'edit';
61+
62+
// Still won't start the buffer because no screen is set,
63+
// but confirms the action check doesn't block 'edit'.
64+
$level_before = ob_get_level();
65+
wp_set_up_cross_origin_isolation();
66+
$level_after = ob_get_level();
67+
68+
// Returns early at the screen check, not the action check.
69+
$this->assertSame( $level_before, $level_after );
70+
}
71+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
/**
4+
* Tests for the `wp_start_cross_origin_isolation_output_buffer()` function.
5+
*
6+
* @group media
7+
* @covers ::wp_start_cross_origin_isolation_output_buffer
8+
*/
9+
class Tests_Media_wpStartCrossOriginIsolationOutputBuffer extends WP_UnitTestCase {
10+
11+
/**
12+
* Original HTTP_USER_AGENT value.
13+
*
14+
* @var string|null
15+
*/
16+
private $original_user_agent;
17+
18+
public function set_up() {
19+
parent::set_up();
20+
$this->original_user_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : null;
21+
}
22+
23+
public function tear_down() {
24+
if ( null === $this->original_user_agent ) {
25+
unset( $_SERVER['HTTP_USER_AGENT'] );
26+
} else {
27+
$_SERVER['HTTP_USER_AGENT'] = $this->original_user_agent;
28+
}
29+
30+
// Clean up any output buffers started during tests.
31+
while ( ob_get_level() > 1 ) {
32+
ob_end_clean();
33+
}
34+
35+
remove_all_filters( 'wp_use_document_isolation_policy' );
36+
37+
parent::tear_down();
38+
}
39+
40+
public function test_starts_output_buffer_for_chrome_137() {
41+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36';
42+
43+
$level_before = ob_get_level();
44+
wp_start_cross_origin_isolation_output_buffer();
45+
$level_after = ob_get_level();
46+
47+
$this->assertSame( $level_before + 1, $level_after, 'Output buffer should be started for Chrome 137.' );
48+
49+
ob_end_clean();
50+
}
51+
52+
public function test_does_not_start_output_buffer_for_chrome_136() {
53+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36';
54+
55+
$level_before = ob_get_level();
56+
wp_start_cross_origin_isolation_output_buffer();
57+
$level_after = ob_get_level();
58+
59+
$this->assertSame( $level_before, $level_after, 'Output buffer should not be started for Chrome < 137.' );
60+
}
61+
62+
public function test_does_not_start_output_buffer_for_firefox() {
63+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0';
64+
65+
$level_before = ob_get_level();
66+
wp_start_cross_origin_isolation_output_buffer();
67+
$level_after = ob_get_level();
68+
69+
$this->assertSame( $level_before, $level_after, 'Output buffer should not be started for Firefox.' );
70+
}
71+
72+
public function test_does_not_start_output_buffer_for_safari() {
73+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15';
74+
75+
$level_before = ob_get_level();
76+
wp_start_cross_origin_isolation_output_buffer();
77+
$level_after = ob_get_level();
78+
79+
$this->assertSame( $level_before, $level_after, 'Output buffer should not be started for Safari.' );
80+
}
81+
82+
public function test_filter_can_force_enable_dip() {
83+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0';
84+
add_filter( 'wp_use_document_isolation_policy', '__return_true' );
85+
86+
$level_before = ob_get_level();
87+
wp_start_cross_origin_isolation_output_buffer();
88+
$level_after = ob_get_level();
89+
90+
$this->assertSame( $level_before + 1, $level_after, 'Filter should force-enable output buffer.' );
91+
92+
ob_end_clean();
93+
}
94+
95+
public function test_filter_can_force_disable_dip() {
96+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36';
97+
add_filter( 'wp_use_document_isolation_policy', '__return_false' );
98+
99+
$level_before = ob_get_level();
100+
wp_start_cross_origin_isolation_output_buffer();
101+
$level_after = ob_get_level();
102+
103+
$this->assertSame( $level_before, $level_after, 'Filter should disable output buffer.' );
104+
}
105+
106+
public function test_output_buffer_adds_crossorigin_attributes() {
107+
$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36';
108+
109+
wp_start_cross_origin_isolation_output_buffer();
110+
echo '<img src="https://external.example.com/image.jpg" />';
111+
112+
// Flush the output buffer to trigger the callback.
113+
$output = ob_get_flush();
114+
115+
$this->assertStringContainsString( 'crossorigin="anonymous"', $output );
116+
}
117+
}

0 commit comments

Comments
 (0)