Make WordPress Core

Ticket #38639: 38639.1.diff

File 38639.1.diff, 19.0 KB (added by bradyvercher, 8 years ago)
  • src/wp-content/themes/twentyfourteen/header.php

     
    3232
    3333<body <?php body_class(); ?>>
    3434<div id="page" class="hfeed site">
    35         <?php if ( function_exists( 'has_header_video' ) && has_header_video() ) : ?>
     35        <?php if ( is_front_page() && function_exists( 'has_header_video' ) && has_header_video() ) : ?>
    3636                <div id="site-header">
    3737                        <?php the_custom_header_markup(); ?>
    3838                </div>
  • src/wp-content/themes/twentyfourteen/inc/customizer.php

     
    1919        $wp_customize->get_setting( 'blogname' )->transport          = 'postMessage';
    2020        $wp_customize->get_setting( 'blogdescription' )->transport   = 'postMessage';
    2121        $wp_customize->get_setting( 'header_textcolor' )->transport  = 'postMessage';
    22         $wp_customize->get_setting( 'header_image' )->transport      = 'postMessage';
    23         $wp_customize->get_setting( 'header_image_data' )->transport = 'postMessage';
    2422
    2523        if ( isset( $wp_customize->selective_refresh ) ) {
    2624                $wp_customize->selective_refresh->add_partial( 'blogname', array(
  • src/wp-content/themes/twentyfourteen/style.css

     
    609609        max-width: 100%;
    610610}
    611611
    612 #wp-custom-header iframe,
    613 #wp-custom-header video {
     612.wp-custom-header iframe,
     613.wp-custom-header img,
     614.wp-custom-header video {
    614615        margin-bottom: -8px;
    615616}
    616617
  • src/wp-content/themes/twentyseventeen/assets/css/ie8.css

     
    8484        width: 100%;
    8585}
    8686
     87.has-header-image .custom-header-image iframe,
    8788.has-header-image .custom-header-image img,
    8889.has-header-image .custom-header-image video {
    8990        left: 0;
  • src/wp-content/themes/twentyseventeen/inc/customizer.php

     
    1616        $wp_customize->get_setting( 'blogname' )->transport          = 'postMessage';
    1717        $wp_customize->get_setting( 'blogdescription' )->transport   = 'postMessage';
    1818        $wp_customize->get_setting( 'header_textcolor' )->transport  = 'postMessage';
    19         $wp_customize->get_setting( 'header_image' )->transport      = 'postMessage';
    20         $wp_customize->get_setting( 'header_image_data' )->transport = 'postMessage';
    2119
    2220        $wp_customize->selective_refresh->add_partial( 'blogname', array(
    2321                'selector' => '.site-title a',
  • src/wp-content/themes/twentyseventeen/style.css

     
    16601660        z-index: 2;
    16611661}
    16621662
     1663.has-header-image .custom-header-image iframe,
    16631664.has-header-image .custom-header-image img,
    1664 .has-header-image .custom-header-image video,
    1665 .has-header-image .custom-header-image iframe {
     1665.has-header-image .custom-header-image video {
    16661666        position: fixed;
    16671667        height: auto;
    16681668        left: 50%;
     
    16781678        transform: translateX(-50%) translateY(-50%);
    16791679}
    16801680
    1681 .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image img {
     1681.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image iframe,
     1682.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image img,
     1683.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image video {
    16821684        bottom: 0;
    16831685        position: absolute;
    16841686        top: auto;
     
    16891691}
    16901692
    16911693body:not(.has-header-image) .custom-header-image {
    1692         padding: 5% 0;
     1694        display: none;
    16931695}
    16941696
    16951697.has-header-image.twentyseventeen-front-page .site-branding,
  • src/wp-content/themes/twentyseventeen/template-parts/header/header-image.php

     
    1010
    1111?>
    1212<div class="custom-header">
    13         <?php
    14         $header_image = get_header_image();
    1513
    16         // Check if Custom Header image has been added.
    17         if ( has_custom_header() ) :
    18         ?>
     14        <div class="custom-header-image">
     15                <?php
     16                the_custom_header_markup( array(
     17                        'show_video' => twentyseventeen_is_frontpage(),
     18                ) );
     19                ?>
     20        </div>
    1921
    20                 <?php // Output the full custom header - video and/or image fallback. ?>
    21                 <div class="custom-header-image">
    22                         <?php the_custom_header_markup(); ?>
    23                 </div>
    24                 <?php get_template_part( 'template-parts/header/site', 'branding' ); ?>
     22        <?php get_template_part( 'template-parts/header/site', 'branding' ); ?>
    2523
    26         <?php else : ?>
    27 
    28                 <?php // Otherwise, show a blank header. ?>
    29                 <div class="custom-header-simple">
    30                         <?php get_template_part( 'template-parts/header/site', 'branding' ); ?>
    31                 </div><!-- .custom-header-simple -->
    32 
    33         <?php endif; ?>
    34 
    3524</div><!-- .custom-header -->
  • src/wp-includes/class-wp-customize-manager.php

     
    34483448                        'theme_supports' => 'custom-header',
    34493449                ) ) );
    34503450
     3451                // Switch image settings to post message when video support is enabled.
     3452                if ( current_theme_supports( 'custom-header', 'video' ) ) {
     3453                        $this->get_setting( 'header_image' )->transport = 'postMessage';
     3454                        $this->get_setting( 'header_image_data' )->transport = 'postMessage';
     3455                }
     3456
    34513457                $this->add_control( new WP_Customize_Media_Control( $this, 'header_video', array(
    34523458                        'theme_supports' => array( 'custom-header', 'video' ),
    34533459                        'label'          => __( 'Header Video' ),
  • src/wp-includes/theme.php

     
    14021402 * @return bool True if a custom header is set. False if not.
    14031403 */
    14041404function has_custom_header() {
    1405         if ( has_header_image() || ( is_front_page() && has_header_video() ) ) {
     1405        if ( has_header_image() || has_header_video() ) {
    14061406                return true;
    14071407        }
    14081408
     
    14121412/**
    14131413 * Retrieve the markup for a custom header.
    14141414 *
     1415 * The container div will always be returned in the Customizer preview.
     1416 *
    14151417 * @since 4.7.0
    14161418 *
    1417  * @return string|false The markup for a custom header on success. False if not.
     1419 * @return string The markup for a custom header on success.
    14181420 */
    14191421function get_custom_header_markup() {
    1420         if ( ! has_custom_header() ) {
    1421                 return false;
     1422        if ( ! has_custom_header() && ! is_customize_preview() ) {
     1423                return '';
    14221424        }
    14231425
    14241426        return sprintf(
     
    14301432/**
    14311433 * Print the markup for a custom header.
    14321434 *
     1435 * A container div will always be printed in the Customizer preview.
     1436 *
    14331437 * @since 4.7.0
     1438 *
     1439 * @param array $args {
     1440 *     Optional. Array of options to control the form output. Default empty array.
     1441 *
     1442 *     @type bool $show_video Whether to show a video if available.
     1443 * }
    14341444 */
    1435 function the_custom_header_markup() {
    1436         if ( ! $custom_header = get_custom_header_markup() ) {
     1445function the_custom_header_markup( $args = array() ) {
     1446        $args = wp_parse_args( $args, array(
     1447                'show_video' => is_front_page(),
     1448        ) );
     1449
     1450        // Bail if video shouldn't be loaded and there isn't an image, unless this
     1451        // is a preview request in the Customizer.
     1452        if ( ! $args['show_video'] && ! has_header_image() && ! is_customize_preview() ) {
    14371453                return;
    14381454        }
     1455
     1456        $custom_header = get_custom_header_markup();
     1457        if ( empty( $custom_header ) ) {
     1458                return;
     1459        }
     1460
    14391461        echo $custom_header;
    14401462
    1441         if ( has_header_video() && is_front_page() ) {
     1463        if ( $args['show_video'] && ( has_header_video() || is_customize_preview() ) ) {
    14421464                wp_enqueue_script( 'wp-custom-header' );
    14431465                wp_localize_script( 'wp-custom-header', '_wpCustomHeaderSettings', get_header_video_settings() );
    14441466        }
     
    22982320                        if ( ! did_action( 'wp_loaded' ) )
    22992321                                break;
    23002322                        $support = get_theme_support( 'custom-header' );
    2301                         if ( $support[0]['wp-head-callback'] )
     2323                        if ( isset( $support[0]['wp-head-callback'] ) ) {
    23022324                                remove_action( 'wp_head', $support[0]['wp-head-callback'] );
    2303                         remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );
    2304                         unset( $GLOBALS['custom_image_header'] );
     2325                        }
     2326                        if ( isset( $GLOBALS['custom_image_header'] ) ) {
     2327                                remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );
     2328                                unset( $GLOBALS['custom_image_header'] );
     2329                        }
    23052330                        break;
    23062331
    23072332                case 'custom-background' :
  • tests/phpunit/data/images/video.mp4

    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
  • tests/phpunit/tests/theme/customHeader.php

    Property changes on: tests/phpunit/data/images/video.mp4
    ___________________________________________________________________
    Added: svn:mime-type
    ## -0,0 +1 ##
    +application/octet-stream
    \ No newline at end of property
     
     1<?php
     2/**
     3 * @group themes
     4 */
     5class Tests_Theme_Custom_Header extends WP_UnitTestCase {
     6        protected static $header_video_id;
     7
     8        public static function wpSetUpBeforeClass( $factory ) {
     9                $file = DIR_TESTDATA . '/images/video.mp4';
     10                self::$header_video_id = $factory->attachment->create_upload_object( $file );
     11        }
     12
     13        function setUp() {
     14                parent::setUp();
     15
     16                require_once( ABSPATH . WPINC . '/class-wp-customize-manager.php' );
     17                $GLOBALS['wp_customize'] = new WP_Customize_Manager();
     18                $this->customize_manager = $GLOBALS['wp_customize'];
     19
     20                wp_dequeue_script( 'wp-custom-header' );
     21        }
     22
     23        function tearDown() {
     24                $this->customize_manager = null;
     25                unset( $GLOBALS['wp_customize'] );
     26
     27                remove_theme_support( 'custom-header' );
     28                remove_theme_mod( 'header_image' );
     29                remove_theme_mod( 'header_image_data' );
     30                remove_theme_mod( 'header_video' );
     31                remove_theme_mod( 'external_header_video' );
     32
     33                remove_filter( 'template_directory_uri', array( $this, '_template_directory_uri' ) );
     34                remove_filter( 'stylesheet_directory_uri', array( $this, '_stylesheet_directory_uri' ) );
     35                parent::tearDown();
     36        }
     37
     38        function test_add_and_remove_theme_support() {
     39                $this->_add_theme_support();
     40                $this->assertTrue( current_theme_supports( 'custom-header' ) );
     41                remove_theme_support( 'custom-header' );
     42                $this->assertFalse( current_theme_supports( 'custom-header' ) );
     43        }
     44
     45        function test_get_header_image_without_registered_default() {
     46                $this->_add_theme_support();
     47                $image = get_header_image();
     48                $this->assertFalse( has_header_image() );
     49                $this->assertEmpty( $image );
     50        }
     51
     52        function test_get_header_image_with_registered_default() {
     53                $default = 'http://localhost/default-header.jpg';
     54                $this->_add_theme_support( array( 'default-image' => $default ) );
     55
     56                $image = get_header_image();
     57                $this->assertTrue( has_header_image() );
     58                $this->assertEquals( $default, $image );
     59        }
     60
     61        function test_get_header_image_from_theme_mod() {
     62                $default = 'http://localhost/default-header.jpg';
     63                $custom = 'http://localhost/custom-header.jpg';
     64                $this->_add_theme_support( array( 'default-image' => $default ) );
     65
     66                set_theme_mod( 'header_image', $custom );
     67                $image = get_header_image();
     68                $this->assertEquals( $custom, $image );
     69                $this->assertTrue( has_header_image() );
     70
     71                set_theme_mod( 'header_image', 'remove-header' );
     72                $image = get_header_image();
     73                $this->assertFalse( has_header_image() );
     74                $this->assertFalse( $image );
     75        }
     76
     77        function test_get_header_image_tag_without_registered_default_image() {
     78                $this->_add_theme_support();
     79                $html = get_header_image_tag();
     80                $this->assertEmpty( $html );
     81        }
     82
     83        function test_get_header_image_tag_with_registered_default_image() {
     84                $default = 'http://localhost/default-header.jpg';
     85                $this->_add_theme_support( array( 'default-image' => $default ) );
     86
     87                $html = get_header_image_tag();
     88                $this->assertStringStartsWith( '<img ', $html );
     89                $this->assertContains( sprintf( 'src="%s"', $default ), $html );
     90        }
     91
     92        /**
     93         * @ticket 38633
     94         */
     95        function test_get_header_image_tag_with_registered_default_image_and_remove_header_theme_mod() {
     96                $default = 'http://localhost/default-header.jpg';
     97                $this->_add_theme_support( array( 'default-image' => $default ) );
     98
     99                set_theme_mod( 'header_image', 'remove-header' );
     100                $html = get_header_image_tag();
     101                $this->assertEmpty( $html );
     102        }
     103
     104        function test_get_header_image_tag_with_registered_default_image_and_custom_theme_mod() {
     105                $default = 'http://localhost/default-header.jpg';
     106                $custom = 'http://localhost/custom-header.jpg';
     107                $this->_add_theme_support( array( 'default-image' => $default ) );
     108
     109                set_theme_mod( 'header_image', $custom );
     110                $html = get_header_image_tag();
     111                $this->assertStringStartsWith( '<img ', $html );
     112                $this->assertContains( sprintf( 'src="%s"', $custom ), $html );
     113        }
     114
     115        function test_get_custom_header_markup_without_registered_default_image() {
     116                $this->_add_theme_support();
     117
     118                $html = get_custom_header_markup();
     119                $this->assertFalse( has_custom_header() );
     120                $this->assertEmpty( $html );
     121
     122                // The container should always be returned in the Customizer preview.
     123                $this->_set_customize_previewing( true );
     124                $html = get_custom_header_markup();
     125                $this->assertEquals( '<div id="wp-custom-header" class="wp-custom-header"></div>', $html );
     126        }
     127
     128        function test_get_custom_header_markup_with_registered_default_image() {
     129                $default = 'http://localhost/default-header.jpg';
     130                $this->_add_theme_support( array( 'default-image' => $default ) );
     131                $html = get_custom_header_markup();
     132                $this->assertTrue( has_custom_header() );
     133                $this->assertStringStartsWith( '<div id="wp-custom-header" class="wp-custom-header">', $html );
     134                $this->assertContains( sprintf( 'src="%s"', $default ), $html );
     135        }
     136
     137        function test_get_header_video_url() {
     138                $this->_add_theme_support( array( 'video' => true ) );
     139
     140                $this->assertFalse( has_header_video() );
     141                set_theme_mod( 'header_video', self::$header_video_id );
     142                $this->assertTrue( has_header_video() );
     143                $this->assertEquals( wp_get_attachment_url( self::$header_video_id ), get_header_video_url() );
     144        }
     145
     146        function test_get_external_header_video_url() {
     147                $external = 'http://example.com/custom-video.mp4';
     148                $this->_add_theme_support( array( 'video' => true ) );
     149
     150                $this->assertFalse( has_header_video() );
     151                set_theme_mod( 'external_header_video', $external );
     152                $this->assertTrue( has_header_video() );
     153                $this->assertEquals( $external, get_header_video_url() );
     154        }
     155
     156        function test_get_header_video_url_prefers_local_video() {
     157                $external = 'http://example.com/custom-video.mp4';
     158                $this->_add_theme_support( array( 'video' => true ) );
     159
     160                set_theme_mod( 'header_video', self::$header_video_id );
     161                set_theme_mod( 'external_header_video', $external );
     162                $this->assertEquals( wp_get_attachment_url( self::$header_video_id ), get_header_video_url() );
     163        }
     164
     165        function test_get_custom_header_markup_with_video_and_without_an_image() {
     166                $custom = 'http://localhost/custom-video.mp4';
     167                $this->_add_theme_support( array( 'video' => true ) );
     168
     169                set_theme_mod( 'external_header_video', $custom );
     170                $html = get_custom_header_markup();
     171                $this->assertTrue( has_header_video() );
     172                $this->assertTrue( has_custom_header() );
     173                $this->assertEquals( '<div id="wp-custom-header" class="wp-custom-header"></div>', $html );
     174        }
     175
     176        function test_header_script_is_not_enqueued_by_the_custom_header_markup_without_video() {
     177                $this->_add_theme_support( array( 'video' => true ) );
     178
     179                ob_start();
     180                the_custom_header_markup( array( 'show_video' => true ) );
     181                ob_end_clean();
     182                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     183
     184                set_theme_mod( 'header_image', 'http://localhost/custom-header.jpg' );
     185
     186                ob_start();
     187                the_custom_header_markup( array( 'show_video' => true ) );
     188                ob_end_clean();
     189                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     190        }
     191
     192        function test_header_script_is_not_enqueued_by_the_custom_header_markup_when_show_video_is_false() {
     193                $this->_add_theme_support( array( 'video' => true ) );
     194                set_theme_mod( 'external_header_video', 'http://localhost/custom-video.mp4' );
     195
     196                ob_start();
     197                the_custom_header_markup( array( 'show_video' => false ) );
     198                ob_end_clean();
     199                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     200        }
     201
     202        function test_header_script_is_enqueued_by_the_custom_header_markup_without_video_when_previewing_in_customizer() {
     203                $this->_add_theme_support( array( 'video' => true ) );
     204                $this->_set_customize_previewing( true );
     205
     206                ob_start();
     207                the_custom_header_markup( array( 'show_video' => true ) );
     208                ob_end_clean();
     209                $this->assertTrue( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     210        }
     211
     212        function test_header_script_is_enqueued_by_the_custom_header_markup_with_video() {
     213                $this->_add_theme_support( array( 'video' => true ) );
     214                set_theme_mod( 'external_header_video', 'http://localhost/custom-video.mp4' );
     215
     216                ob_start();
     217                the_custom_header_markup( array( 'show_video' => true ) );
     218                ob_end_clean();
     219                $this->assertTrue( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     220        }
     221
     222        /**
     223         * Adds arguments directly to the $_wp_theme_features global. Calling
     224         * add_theme_support( 'custom-header' ) will poison subsequent tests since
     225         * it defines constants.
     226         */
     227        function _add_theme_support( $args = array() ) {
     228                global $_wp_theme_features;
     229
     230                $_wp_theme_features['custom-header'][0] = wp_parse_args( $args, array(
     231                        'default-image' => '',
     232                        'random-default' => false,
     233                        'width' => 0,
     234                        'height' => 0,
     235                        'flex-height' => false,
     236                        'flex-width' => false,
     237                        'default-text-color' => '',
     238                        'header-text' => true,
     239                        'uploads' => true,
     240                        'wp-head-callback' => '',
     241                        'admin-head-callback' => '',
     242                        'admin-preview-callback' => '',
     243                        'video' => false,
     244                ) );
     245        }
     246
     247        function _set_customize_previewing( $value ) {
     248                $class = new ReflectionClass( 'WP_Customize_Manager' );
     249                $property = $class->getProperty( 'previewing' );
     250                $property->setAccessible( true );
     251                $property->setValue( $this->customize_manager, $value );
     252        }
     253}