wp/wp-content/themes/twentysixteen/js/html5.js
changeset 7 cf61fcea0001
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 /**
       
     2 * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
       
     3 */
       
     4 ;(function(window, document) {
       
     5 /*jshint evil:true */
       
     6   /** version */
       
     7   var version = '3.7.3';
       
     8 
       
     9   /** Preset options */
       
    10   var options = window.html5 || {};
       
    11 
       
    12   /** Used to skip problem elements */
       
    13   var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
       
    14 
       
    15   /** Not all elements can be cloned in IE **/
       
    16   var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
       
    17 
       
    18   /** Detect whether the browser supports default html5 styles */
       
    19   var supportsHtml5Styles;
       
    20 
       
    21   /** Name of the expando, to work with multiple documents or to re-shiv one document */
       
    22   var expando = '_html5shiv';
       
    23 
       
    24   /** The id for the the documents expando */
       
    25   var expanID = 0;
       
    26 
       
    27   /** Cached data for each document */
       
    28   var expandoData = {};
       
    29 
       
    30   /** Detect whether the browser supports unknown elements */
       
    31   var supportsUnknownElements;
       
    32 
       
    33   (function() {
       
    34     try {
       
    35         var a = document.createElement('a');
       
    36         a.innerHTML = '<xyz></xyz>';
       
    37         //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
       
    38         supportsHtml5Styles = ('hidden' in a);
       
    39 
       
    40         supportsUnknownElements = a.childNodes.length == 1 || (function() {
       
    41           // assign a false positive if unable to shiv
       
    42           (document.createElement)('a');
       
    43           var frag = document.createDocumentFragment();
       
    44           return (
       
    45             typeof frag.cloneNode == 'undefined' ||
       
    46             typeof frag.createDocumentFragment == 'undefined' ||
       
    47             typeof frag.createElement == 'undefined'
       
    48           );
       
    49         }());
       
    50     } catch(e) {
       
    51       // assign a false positive if detection fails => unable to shiv
       
    52       supportsHtml5Styles = true;
       
    53       supportsUnknownElements = true;
       
    54     }
       
    55 
       
    56   }());
       
    57 
       
    58   /*--------------------------------------------------------------------------*/
       
    59 
       
    60   /**
       
    61    * Creates a style sheet with the given CSS text and adds it to the document.
       
    62    * @private
       
    63    * @param {Document} ownerDocument The document.
       
    64    * @param {String} cssText The CSS text.
       
    65    * @returns {StyleSheet} The style element.
       
    66    */
       
    67   function addStyleSheet(ownerDocument, cssText) {
       
    68     var p = ownerDocument.createElement('p'),
       
    69         parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
       
    70 
       
    71     p.innerHTML = 'x<style>' + cssText + '</style>';
       
    72     return parent.insertBefore(p.lastChild, parent.firstChild);
       
    73   }
       
    74 
       
    75   /**
       
    76    * Returns the value of `html5.elements` as an array.
       
    77    * @private
       
    78    * @returns {Array} An array of shived element node names.
       
    79    */
       
    80   function getElements() {
       
    81     var elements = html5.elements;
       
    82     return typeof elements == 'string' ? elements.split(' ') : elements;
       
    83   }
       
    84 
       
    85   /**
       
    86    * Extends the built-in list of html5 elements
       
    87    * @memberOf html5
       
    88    * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
       
    89    * @param {Document} ownerDocument The context document.
       
    90    */
       
    91   function addElements(newElements, ownerDocument) {
       
    92     var elements = html5.elements;
       
    93     if(typeof elements != 'string'){
       
    94       elements = elements.join(' ');
       
    95     }
       
    96     if(typeof newElements != 'string'){
       
    97       newElements = newElements.join(' ');
       
    98     }
       
    99     html5.elements = elements +' '+ newElements;
       
   100     shivDocument(ownerDocument);
       
   101   }
       
   102 
       
   103    /**
       
   104    * Returns the data associated to the given document
       
   105    * @private
       
   106    * @param {Document} ownerDocument The document.
       
   107    * @returns {Object} An object of data.
       
   108    */
       
   109   function getExpandoData(ownerDocument) {
       
   110     var data = expandoData[ownerDocument[expando]];
       
   111     if (!data) {
       
   112         data = {};
       
   113         expanID++;
       
   114         ownerDocument[expando] = expanID;
       
   115         expandoData[expanID] = data;
       
   116     }
       
   117     return data;
       
   118   }
       
   119 
       
   120   /**
       
   121    * returns a shived element for the given nodeName and document
       
   122    * @memberOf html5
       
   123    * @param {String} nodeName name of the element
       
   124    * @param {Document|DocumentFragment} ownerDocument The context document.
       
   125    * @returns {Object} The shived element.
       
   126    */
       
   127   function createElement(nodeName, ownerDocument, data){
       
   128     if (!ownerDocument) {
       
   129         ownerDocument = document;
       
   130     }
       
   131     if(supportsUnknownElements){
       
   132         return ownerDocument.createElement(nodeName);
       
   133     }
       
   134     if (!data) {
       
   135         data = getExpandoData(ownerDocument);
       
   136     }
       
   137     var node;
       
   138 
       
   139     if (data.cache[nodeName]) {
       
   140         node = data.cache[nodeName].cloneNode();
       
   141     } else if (saveClones.test(nodeName)) {
       
   142         node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
       
   143     } else {
       
   144         node = data.createElem(nodeName);
       
   145     }
       
   146 
       
   147     // Avoid adding some elements to fragments in IE < 9 because
       
   148     // * Attributes like `name` or `type` cannot be set/changed once an element
       
   149     //   is inserted into a document/fragment
       
   150     // * Link elements with `src` attributes that are inaccessible, as with
       
   151     //   a 403 response, will cause the tab/window to crash
       
   152     // * Script elements appended to fragments will execute when their `src`
       
   153     //   or `text` property is set
       
   154     return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
       
   155   }
       
   156 
       
   157   /**
       
   158    * returns a shived DocumentFragment for the given document
       
   159    * @memberOf html5
       
   160    * @param {Document} ownerDocument The context document.
       
   161    * @returns {Object} The shived DocumentFragment.
       
   162    */
       
   163   function createDocumentFragment(ownerDocument, data){
       
   164     if (!ownerDocument) {
       
   165         ownerDocument = document;
       
   166     }
       
   167     if(supportsUnknownElements){
       
   168         return ownerDocument.createDocumentFragment();
       
   169     }
       
   170     data = data || getExpandoData(ownerDocument);
       
   171     var clone = data.frag.cloneNode(),
       
   172         i = 0,
       
   173         elems = getElements(),
       
   174         l = elems.length;
       
   175     for(;i<l;i++){
       
   176         clone.createElement(elems[i]);
       
   177     }
       
   178     return clone;
       
   179   }
       
   180 
       
   181   /**
       
   182    * Shivs the `createElement` and `createDocumentFragment` methods of the document.
       
   183    * @private
       
   184    * @param {Document|DocumentFragment} ownerDocument The document.
       
   185    * @param {Object} data of the document.
       
   186    */
       
   187   function shivMethods(ownerDocument, data) {
       
   188     if (!data.cache) {
       
   189         data.cache = {};
       
   190         data.createElem = ownerDocument.createElement;
       
   191         data.createFrag = ownerDocument.createDocumentFragment;
       
   192         data.frag = data.createFrag();
       
   193     }
       
   194 
       
   195 
       
   196     ownerDocument.createElement = function(nodeName) {
       
   197       //abort shiv
       
   198       if (!html5.shivMethods) {
       
   199           return data.createElem(nodeName);
       
   200       }
       
   201       return createElement(nodeName, ownerDocument, data);
       
   202     };
       
   203 
       
   204     ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
       
   205       'var n=f.cloneNode(),c=n.createElement;' +
       
   206       'h.shivMethods&&(' +
       
   207         // unroll the `createElement` calls
       
   208         getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
       
   209           data.createElem(nodeName);
       
   210           data.frag.createElement(nodeName);
       
   211           return 'c("' + nodeName + '")';
       
   212         }) +
       
   213       ');return n}'
       
   214     )(html5, data.frag);
       
   215   }
       
   216 
       
   217   /*--------------------------------------------------------------------------*/
       
   218 
       
   219   /**
       
   220    * Shivs the given document.
       
   221    * @memberOf html5
       
   222    * @param {Document} ownerDocument The document to shiv.
       
   223    * @returns {Document} The shived document.
       
   224    */
       
   225   function shivDocument(ownerDocument) {
       
   226     if (!ownerDocument) {
       
   227         ownerDocument = document;
       
   228     }
       
   229     var data = getExpandoData(ownerDocument);
       
   230 
       
   231     if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
       
   232       data.hasCSS = !!addStyleSheet(ownerDocument,
       
   233         // corrects block display not defined in IE6/7/8/9
       
   234         'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
       
   235         // adds styling not present in IE6/7/8/9
       
   236         'mark{background:#FF0;color:#000}' +
       
   237         // hides non-rendered elements
       
   238         'template{display:none}'
       
   239       );
       
   240     }
       
   241     if (!supportsUnknownElements) {
       
   242       shivMethods(ownerDocument, data);
       
   243     }
       
   244     return ownerDocument;
       
   245   }
       
   246 
       
   247   /*--------------------------------------------------------------------------*/
       
   248 
       
   249   /**
       
   250    * The `html5` object is exposed so that more elements can be shived and
       
   251    * existing shiving can be detected on iframes.
       
   252    * @type Object
       
   253    * @example
       
   254    *
       
   255    * // options can be changed before the script is included
       
   256    * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
       
   257    */
       
   258   var html5 = {
       
   259 
       
   260     /**
       
   261      * An array or space separated string of node names of the elements to shiv.
       
   262      * @memberOf html5
       
   263      * @type Array|String
       
   264      */
       
   265     'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',
       
   266 
       
   267     /**
       
   268      * current version of html5shiv
       
   269      */
       
   270     'version': version,
       
   271 
       
   272     /**
       
   273      * A flag to indicate that the HTML5 style sheet should be inserted.
       
   274      * @memberOf html5
       
   275      * @type Boolean
       
   276      */
       
   277     'shivCSS': (options.shivCSS !== false),
       
   278 
       
   279     /**
       
   280      * Is equal to true if a browser supports creating unknown/HTML5 elements
       
   281      * @memberOf html5
       
   282      * @type boolean
       
   283      */
       
   284     'supportsUnknownElements': supportsUnknownElements,
       
   285 
       
   286     /**
       
   287      * A flag to indicate that the document's `createElement` and `createDocumentFragment`
       
   288      * methods should be overwritten.
       
   289      * @memberOf html5
       
   290      * @type Boolean
       
   291      */
       
   292     'shivMethods': (options.shivMethods !== false),
       
   293 
       
   294     /**
       
   295      * A string to describe the type of `html5` object ("default" or "default print").
       
   296      * @memberOf html5
       
   297      * @type String
       
   298      */
       
   299     'type': 'default',
       
   300 
       
   301     // shivs the document according to the specified `html5` object options
       
   302     'shivDocument': shivDocument,
       
   303 
       
   304     //creates a shived element
       
   305     createElement: createElement,
       
   306 
       
   307     //creates a shived documentFragment
       
   308     createDocumentFragment: createDocumentFragment,
       
   309 
       
   310     //extends list of elements
       
   311     addElements: addElements
       
   312   };
       
   313 
       
   314   /*--------------------------------------------------------------------------*/
       
   315 
       
   316   // expose html5
       
   317   window.html5 = html5;
       
   318 
       
   319   // shiv the document
       
   320   shivDocument(document);
       
   321 
       
   322   if(typeof module == 'object' && module.exports){
       
   323     module.exports = html5;
       
   324   }
       
   325 
       
   326 }(typeof window !== "undefined" ? window : this, document));