Make WordPress Core

Ticket #38639: 38639.diff

File 38639.diff, 17.9 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/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

     
    6868        padding: 45px 0;
    6969}
    7070
     71.has-header-image .custom-header-image iframe,
    7172.has-header-image .custom-header-image img,
    7273.has-header-image .custom-header-image video {
    7374        left: 0;
  • src/wp-content/themes/twentyseventeen/style.css

     
    16701670        z-index: 2;
    16711671}
    16721672
     1673.has-header-image .custom-header-image iframe,
    16731674.has-header-image .custom-header-image img,
    1674 .has-header-image .custom-header-image video,
    1675 .has-header-image .custom-header-image iframe {
     1675.has-header-image .custom-header-image video {
    16761676        position: fixed;
    16771677        height: auto;
    16781678        left: 50%;
     
    16881688        transform: translateX(-50%) translateY(-50%);
    16891689}
    16901690
    1691 .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image img {
     1691.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image iframe,
     1692.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image img,
     1693.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-image video {
    16921694        bottom: 0;
    16931695        position: absolute;
    16941696        top: auto;
     
    16991701}
    17001702
    17011703body:not(.has-header-image) .custom-header-image {
    1702         padding: 5% 0;
     1704        display: none;
    17031705}
    17041706
    17051707/*--------------------------------------------------------------
  • 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/theme.php

     
    14011401 * @return bool True if a custom header is set. False if not.
    14021402 */
    14031403function has_custom_header() {
    1404         if ( has_header_image() || ( is_front_page() && has_header_video() ) ) {
     1404        if ( has_header_image() || has_header_video() ) {
    14051405                return true;
    14061406        }
    14071407
     
    14111411/**
    14121412 * Retrieve the markup for a custom header.
    14131413 *
     1414 * The container div will always be returned in the Customizer preview.
     1415 *
    14141416 * @since 4.7.0
    14151417 *
    1416  * @return string|false The markup for a custom header on success. False if not.
     1418 * @return string The markup for a custom header on success.
    14171419 */
    14181420function get_custom_header_markup() {
    1419         if ( ! has_custom_header() ) {
    1420                 return false;
     1421        if ( ! has_custom_header() && ! is_customize_preview() ) {
     1422                return '';
    14211423        }
    14221424
    14231425        return sprintf(
     
    14291431/**
    14301432 * Print the markup for a custom header.
    14311433 *
     1434 * A container div will always be printed in the Customizer preview.
     1435 *
    14321436 * @since 4.7.0
     1437 *
     1438 * @param array $args {
     1439 *     Optional. Array of options to control the form output. Default empty array.
     1440 *
     1441 *     @type bool $show_video Whether to show a video if available.
     1442 * }
    14331443 */
    1434 function the_custom_header_markup() {
    1435         if ( ! $custom_header = get_custom_header_markup() ) {
     1444function the_custom_header_markup( $args = array() ) {
     1445        $args = wp_parse_args( $args, array(
     1446                'show_video' => is_front_page(),
     1447        ) );
     1448
     1449        // Bail if video shouldn't be loaded and there isn't an image, unless this
     1450        // is a preview request in the Customizer.
     1451        if ( ! $args['show_video'] && ! has_header_image() && ! is_customize_preview() ) {
    14361452                return;
    14371453        }
     1454
     1455        $custom_header = get_custom_header_markup();
     1456        if ( empty( $custom_header ) ) {
     1457                return;
     1458        }
     1459
    14381460        echo $custom_header;
    14391461
    1440         if ( has_header_video() && is_front_page() ) {
     1462        if ( $args['show_video'] && ( has_header_video() || is_customize_preview() ) ) {
    14411463                wp_enqueue_script( 'wp-custom-header' );
    14421464                wp_localize_script( 'wp-custom-header', '_wpCustomHeaderSettings', get_header_video_settings() );
    14431465        }
     
    22972319                        if ( ! did_action( 'wp_loaded' ) )
    22982320                                break;
    22992321                        $support = get_theme_support( 'custom-header' );
    2300                         if ( $support[0]['wp-head-callback'] )
     2322                        if ( isset( $support[0]['wp-head-callback'] ) ) {
    23012323                                remove_action( 'wp_head', $support[0]['wp-head-callback'] );
    2302                         remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );
    2303                         unset( $GLOBALS['custom_image_header'] );
     2324                        }
     2325                        if ( isset( $GLOBALS['custom_image_header'] ) ) {
     2326                                remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );
     2327                                unset( $GLOBALS['custom_image_header'] );
     2328                        }
    23042329                        break;
    23052330
    23062331                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        protected $template_directory_uri;
     9        protected $stylesheet_directory_uri;
     10
     11        public static function wpSetUpBeforeClass( $factory ) {
     12                $file = DIR_TESTDATA . '/images/video.mp4';
     13                self::$header_video_id = $factory->attachment->create_upload_object( $file );
     14        }
     15
     16        function setUp() {
     17                parent::setUp();
     18
     19                require_once( ABSPATH . WPINC . '/class-wp-customize-manager.php' );
     20                $GLOBALS['wp_customize'] = new WP_Customize_Manager();
     21                $this->customize_manager = $GLOBALS['wp_customize'];
     22
     23                wp_dequeue_script( 'wp-custom-header' );
     24
     25                $this->template_directory_uri = 'http://' . WP_TESTS_DOMAIN . '/parent';
     26                $this->stylesheet_directory_uri = 'http://' . WP_TESTS_DOMAIN . '/parent';
     27                add_filter( 'template_directory_uri', array( $this, '_template_directory_uri' ) );
     28                add_filter( 'stylesheet_directory_uri', array( $this, '_stylesheet_directory_uri' ) );
     29        }
     30
     31        function tearDown() {
     32                $this->customize_manager = null;
     33                unset( $GLOBALS['wp_customize'] );
     34
     35                remove_theme_support( 'custom-header' );
     36                remove_theme_mod( 'header_image' );
     37                remove_theme_mod( 'header_image_data' );
     38                remove_theme_mod( 'header_video' );
     39                remove_theme_mod( 'external_header_video' );
     40
     41                remove_filter( 'template_directory_uri', array( $this, '_template_directory_uri' ) );
     42                remove_filter( 'stylesheet_directory_uri', array( $this, '_stylesheet_directory_uri' ) );
     43                parent::tearDown();
     44        }
     45
     46        function test_add_and_remove_theme_support() {
     47                $this->_add_theme_support();
     48                $this->assertTrue( current_theme_supports( 'custom-header' ) );
     49                remove_theme_support( 'custom-header' );
     50                $this->assertFalse( current_theme_supports( 'custom-header' ) );
     51        }
     52
     53        /**
     54         * @ticket 38557
     55         */
     56        function test_get_default_image_in_parent_theme() {
     57                $this->_add_theme_support( array( 'default-image' => '%s/default-header.jpg' ) );
     58                $default = get_theme_support( 'custom-header', 'default-image' );
     59                $this->assertEquals( $this->template_directory_uri . '/default-header.jpg', $default );
     60        }
     61
     62        /**
     63         * @ticket 38557
     64         */
     65        function test_get_default_image_in_child_theme() {
     66                $this->_add_theme_support( array( 'default-image' => '%2$s/default-header.jpg' ) );
     67                $default = get_theme_support( 'custom-header', 'default-image' );
     68                $this->assertEquals( $this->stylesheet_directory_uri . '/default-header.jpg', $default );
     69        }
     70
     71        function test_get_header_image_without_registered_default() {
     72                $this->_add_theme_support();
     73                $image = get_header_image();
     74                $this->assertFalse( has_header_image() );
     75                $this->assertEmpty( $image );
     76        }
     77
     78        function test_get_header_image_with_registered_default() {
     79                $default = 'http://localhost/default-header.jpg';
     80                $this->_add_theme_support( array( 'default-image' => $default ) );
     81
     82                $image = get_header_image();
     83                $this->assertTrue( has_header_image() );
     84                $this->assertEquals( $default, $image );
     85        }
     86
     87        function test_get_header_image_from_theme_mod() {
     88                $default = 'http://localhost/default-header.jpg';
     89                $custom = 'http://localhost/custom-header.jpg';
     90                $this->_add_theme_support( array( 'default-image' => $default ) );
     91
     92                set_theme_mod( 'header_image', $custom );
     93                $image = get_header_image();
     94                $this->assertEquals( $custom, $image );
     95                $this->assertTrue( has_header_image() );
     96
     97                set_theme_mod( 'header_image', 'remove-header' );
     98                $image = get_header_image();
     99                $this->assertFalse( has_header_image() );
     100                $this->assertFalse( $image );
     101        }
     102
     103        function test_get_header_image_tag_without_registered_default_image() {
     104                $this->_add_theme_support();
     105                $html = get_header_image_tag();
     106                $this->assertEmpty( $html );
     107        }
     108
     109        function test_get_header_image_tag_with_registered_default_image() {
     110                $default = 'http://localhost/default-header.jpg';
     111                $this->_add_theme_support( array( 'default-image' => $default ) );
     112
     113                $html = get_header_image_tag();
     114                $this->assertStringStartsWith( '<img ', $html );
     115                $this->assertContains( sprintf( 'src="%s"', $default ), $html );
     116        }
     117
     118        /**
     119         * @ticket 38633
     120         */
     121        function test_get_header_image_tag_with_registered_default_image_and_remove_header_theme_mod() {
     122                $default = 'http://localhost/default-header.jpg';
     123                $this->_add_theme_support( array( 'default-image' => $default ) );
     124
     125                set_theme_mod( 'header_image', 'remove-header' );
     126                $html = get_header_image_tag();
     127                $this->assertEmpty( $html );
     128        }
     129
     130        function test_get_header_image_tag_with_registered_default_image_and_custom_theme_mod() {
     131                $default = 'http://localhost/default-header.jpg';
     132                $custom = 'http://localhost/custom-header.jpg';
     133                $this->_add_theme_support( array( 'default-image' => $default ) );
     134
     135                set_theme_mod( 'header_image', $custom );
     136                $html = get_header_image_tag();
     137                $this->assertStringStartsWith( '<img ', $html );
     138                $this->assertContains( sprintf( 'src="%s"', $custom ), $html );
     139        }
     140
     141        function test_get_custom_header_markup_without_registered_default_image() {
     142                $this->_add_theme_support();
     143
     144                $html = get_custom_header_markup();
     145                $this->assertFalse( has_custom_header() );
     146                $this->assertEmpty( $html );
     147
     148                // The container should always be returned in the Customizer preview.
     149                $this->_set_customize_previewing( true );
     150                $html = get_custom_header_markup();
     151                $this->assertEquals( '<div id="wp-custom-header" class="wp-custom-header"></div>', $html );
     152        }
     153
     154        function test_get_custom_header_markup_with_registered_default_image() {
     155                $default = 'http://localhost/default-header.jpg';
     156                $this->_add_theme_support( array( 'default-image' => $default ) );
     157                $html = get_custom_header_markup();
     158                $this->assertTrue( has_custom_header() );
     159                $this->assertStringStartsWith( '<div id="wp-custom-header" class="wp-custom-header">', $html );
     160                $this->assertContains( sprintf( 'src="%s"', $default ), $html );
     161        }
     162
     163        function test_get_header_video_url() {
     164                $this->_add_theme_support( array( 'video' => true ) );
     165
     166                $this->assertFalse( has_header_video() );
     167                set_theme_mod( 'header_video', self::$header_video_id );
     168                $this->assertTrue( has_header_video() );
     169                $this->assertEquals( wp_get_attachment_url( self::$header_video_id ), get_header_video_url() );
     170        }
     171
     172        function test_get_external_header_video_url() {
     173                $external = 'http://example.com/custom-video.mp4';
     174                $this->_add_theme_support( array( 'video' => true ) );
     175
     176                $this->assertFalse( has_header_video() );
     177                set_theme_mod( 'external_header_video', $external );
     178                $this->assertTrue( has_header_video() );
     179                $this->assertEquals( $external, get_header_video_url() );
     180        }
     181
     182        function test_get_header_video_url_prefers_local_video() {
     183                $external = 'http://example.com/custom-video.mp4';
     184                $this->_add_theme_support( array( 'video' => true ) );
     185
     186                set_theme_mod( 'header_video', self::$header_video_id );
     187                set_theme_mod( 'external_header_video', $external );
     188                $this->assertEquals( wp_get_attachment_url( self::$header_video_id ), get_header_video_url() );
     189        }
     190
     191        function test_get_custom_header_markup_with_video_and_without_an_image() {
     192                $custom = 'http://localhost/custom-video.mp4';
     193                $this->_add_theme_support( array( 'video' => true ) );
     194
     195                set_theme_mod( 'external_header_video', $custom );
     196                $html = get_custom_header_markup();
     197                $this->assertTrue( has_header_video() );
     198                $this->assertTrue( has_custom_header() );
     199                $this->assertEquals( '<div id="wp-custom-header" class="wp-custom-header"></div>', $html );
     200        }
     201
     202        function test_header_script_is_not_enqueued_by_the_custom_header_markup_without_video() {
     203                $this->_add_theme_support( array( 'video' => true ) );
     204
     205                ob_start();
     206                the_custom_header_markup( array( 'show_video' => true ) );
     207                ob_end_clean();
     208                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     209
     210                set_theme_mod( 'header_image', 'http://localhost/custom-header.jpg' );
     211
     212                ob_start();
     213                the_custom_header_markup( array( 'show_video' => true ) );
     214                ob_end_clean();
     215                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     216        }
     217
     218        function test_header_script_is_not_enqueued_by_the_custom_header_markup_when_show_video_is_false() {
     219                $this->_add_theme_support( array( 'video' => true ) );
     220                set_theme_mod( 'external_header_video', 'http://localhost/custom-video.mp4' );
     221
     222                ob_start();
     223                the_custom_header_markup( array( 'show_video' => false ) );
     224                ob_end_clean();
     225                $this->assertFalse( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     226        }
     227
     228        function test_header_script_is_enqueued_by_the_custom_header_markup_without_video_when_previewing_in_customizer() {
     229                $this->_add_theme_support( array( 'video' => true ) );
     230                $this->_set_customize_previewing( true );
     231
     232                ob_start();
     233                the_custom_header_markup( array( 'show_video' => true ) );
     234                ob_end_clean();
     235                $this->assertTrue( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     236        }
     237
     238        function test_header_script_is_enqueued_by_the_custom_header_markup_with_video() {
     239                $this->_add_theme_support( array( 'video' => true ) );
     240                set_theme_mod( 'external_header_video', 'http://localhost/custom-video.mp4' );
     241
     242                ob_start();
     243                the_custom_header_markup( array( 'show_video' => true ) );
     244                ob_end_clean();
     245                $this->assertTrue( wp_script_is( 'wp-custom-header', 'enqueued' ) );
     246        }
     247
     248        /**
     249         * Adds arguments directly to the $_wp_theme_features global. Calling
     250         * add_theme_support( 'custom-header' ) will poison subsequent tests since
     251         * it defines constants.
     252         */
     253        function _add_theme_support( $args = array() ) {
     254                global $_wp_theme_features;
     255
     256                $_wp_theme_features['custom-header'][0] = wp_parse_args( $args, array(
     257                        'default-image' => '',
     258                        'random-default' => false,
     259                        'width' => 0,
     260                        'height' => 0,
     261                        'flex-height' => false,
     262                        'flex-width' => false,
     263                        'default-text-color' => '',
     264                        'header-text' => true,
     265                        'uploads' => true,
     266                        'wp-head-callback' => '',
     267                        'admin-head-callback' => '',
     268                        'admin-preview-callback' => '',
     269                        'video' => false,
     270                ) );
     271        }
     272
     273        function _set_customize_previewing( $value ) {
     274                $class = new ReflectionClass( 'WP_Customize_Manager' );
     275                $property = $class->getProperty( 'previewing' );
     276                $property->setAccessible( true );
     277                $property->setValue( $this->customize_manager, $value );
     278        }
     279
     280        function _template_directory_uri() {
     281                return $this->template_directory_uri;
     282        }
     283
     284        function _stylesheet_directory_uri() {
     285                return $this->stylesheet_directory_uri;
     286        }
     287}