/*
 * Copyright (C) 2013 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This is the UA StyleSheet for <object> and <embed> elements.
 *
 * Such elements, when snapshotted (paused), will contain a ShadowRoot
 * with the following structure:
 *
 * <object>
 *     #ShadowRoot
 *         <div pseudo="-webkit-snapshotted-plugin-content">
 *             <div class="snapshot-overlay" aria-label="[Title]: [Subtitle]" role="button">
 *                 <div class="snapshot-label">
 *                     <div class="snapshot-title">[Title]</div>
 *                     <div class="snapshot-subtitle">[Subtitle]</div>
 *                 </div>
 *             </div>
 *         </div>
 */

embed::-webkit-snapshotted-plugin-content,
object::-webkit-snapshotted-plugin-content
{
    position: relative;
    display: inline-block;
    width: 100%;
    height: 100%;
}

embed::-webkit-snapshotted-plugin-content > .snapshot-overlay,
object::-webkit-snapshotted-plugin-content > .snapshot-overlay
{
    position: absolute;
    top: 5px;
    right: 5px;
    bottom: 5px;
    left: 5px;
    background-color: rgba(255, 255, 255, 0.75);
    cursor: pointer;
    display: flex;
    justify-content: center;
    align-items: center;
}

embed::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label,
object::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label
{
    color: black;
    user-select: none;
}

embed::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > div,
object::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > div
{
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

embed::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > .snapshot-title,
object::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > .snapshot-title
{
    font-weight: bold;
}

embed::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > .snapshot-subtitle,
object::-webkit-snapshotted-plugin-content > .snapshot-overlay > .snapshot-label > .snapshot-subtitle
{
    font-style: italic;
    color: #444;
}
