function getContentBoundingVolume(tileBoundingVolume, contentBounds) {
  // content bounding volumes can only be specified via
  // metadata semantics such as CONTENT_BOUNDING_BOX
  let contentBoundingVolume;
  if (defined(contentBounds)) {
    contentBoundingVolume = contentBounds.boundingVolume;
  }

  // The CONTENT_MINIMUM_HEIGHT and CONTENT_MAXIMUM_HEIGHT metadata semantics
  // can be used to tighten the bounding volume
  if (canUpdateHeights(contentBoundingVolume, contentBounds)) {
    updateHeights(contentBoundingVolume, contentBounds);
  } else if (canUpdateHeights(tileBoundingVolume, contentBounds)) {
    contentBoundingVolume = clone(tileBoundingVolume, true);
    updateHeights(contentBoundingVolume, contentBounds);
  }

  return contentBoundingVolume;
}
Gets the content bounding volume, which may be specified via
metadata semantics such as CONTENT_BOUNDING_BOX.
<p>
Priority of bounding volume types:
<ol>
<li>Explicit min/max height
  <ol>
    <li>With explicit region</li>
    <li>With tile bounding volume (S2 or region)</li>
  </ol>
</li>
<li>Explicit box</li>
<li>Explicit region</li>
<li>Explicit sphere</li>
<li>Tile bounding volume (when content.boundingVolume is undefined)</li>
</ol>
</p>

@param {object} tileBoundingVolume An object containing the JSON for the tile's bounding volume
@param {object} [contentBounds] The content bounds
@returns {object|undefined} An object containing the JSON for a bounding volume, or <code>undefined</code> if there is no bounding volume
@private