/*
 * Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``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 ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR 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.
 */

#include "core/layout/LayoutFullScreen.h"

#include "core/dom/Fullscreen.h"
#include "core/frame/FrameHost.h"
#include "core/frame/VisualViewport.h"
#include "core/layout/LayoutBlockFlow.h"
#include "core/page/Page.h"

#include "public/platform/WebScreenInfo.h"

using namespace blink;

class LayoutFullScreenPlaceholder final : public LayoutBlockFlow {
public:
    LayoutFullScreenPlaceholder(LayoutFullScreen* owner)
        : LayoutBlockFlow(nullptr)
        , m_owner(owner)
    {
        setDocumentForAnonymous(&owner->document());
    }

    // Must call setStyleWithWritingModeOfParent() instead.
    void setStyle(PassRefPtr<ComputedStyle>) = delete;

private:
    bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectLayoutFullScreenPlaceholder || LayoutBlockFlow::isOfType(type); }
    bool anonymousHasStylePropagationOverride() override { return true; }

    void willBeDestroyed() override;
    LayoutFullScreen* m_owner;
};

void LayoutFullScreenPlaceholder::willBeDestroyed()
{
    m_owner->resetPlaceholder();
    LayoutBlockFlow::willBeDestroyed();
}

LayoutFullScreen::LayoutFullScreen()
    : LayoutFlexibleBox(nullptr)
    , m_placeholder(nullptr)
{
    setIsAtomicInlineLevel(false);
}

LayoutFullScreen* LayoutFullScreen::createAnonymous(Document* document)
{
    LayoutFullScreen* layoutObject = new LayoutFullScreen();
    layoutObject->setDocumentForAnonymous(document);
    return layoutObject;
}

void LayoutFullScreen::willBeDestroyed()
{
    if (m_placeholder) {
        remove();
        if (!m_placeholder->beingDestroyed())
            m_placeholder->destroy();
        DCHECK(!m_placeholder);
    }

    // LayoutObjects are unretained, so notify the document (which holds a pointer to a LayoutFullScreen)
    // if its LayoutFullScreen is destroyed.
    Fullscreen& fullscreen = Fullscreen::from(document());
    if (fullscreen.fullScreenLayoutObject() == this)
        fullscreen.fullScreenLayoutObjectDestroyed();

    LayoutFlexibleBox::willBeDestroyed();
}

void LayoutFullScreen::updateStyle(LayoutObject* parent)
{
    RefPtr<ComputedStyle> fullscreenStyle = ComputedStyle::create();

    // Create a stacking context:
    fullscreenStyle->setZIndex(INT_MAX);
    fullscreenStyle->setIsStackingContext(true);

    fullscreenStyle->setFontDescription(FontDescription());
    fullscreenStyle->font().update(nullptr);

    fullscreenStyle->setDisplay(EDisplay::Flex);
    fullscreenStyle->setJustifyContentPosition(ContentPositionCenter);
    // TODO (lajava): Since the FullScrenn layout object is anonymous, its Default Alignment (align-items) value can't be used to resolve its children Self Alignment 'auto' values.
    fullscreenStyle->setAlignItemsPosition(ItemPositionCenter);
    fullscreenStyle->setFlexDirection(FlowColumn);

    fullscreenStyle->setPosition(FixedPosition);
    fullscreenStyle->setLeft(Length(0, blink::Fixed));
    fullscreenStyle->setTop(Length(0, blink::Fixed));
    IntSize viewportSize = document().page()->frameHost().visualViewport().size();
    fullscreenStyle->setWidth(Length(viewportSize.width(), blink::Fixed));
    fullscreenStyle->setHeight(Length(viewportSize.height(), blink::Fixed));

    fullscreenStyle->setBackgroundColor(StyleColor(Color::black));

    setStyleWithWritingModeOf(fullscreenStyle, parent);
}

void LayoutFullScreen::updateStyle()
{
    updateStyle(parent());
}

LayoutObject* LayoutFullScreen::wrapLayoutObject(LayoutObject* object, LayoutObject* parent, Document* document)
{
    // FIXME: We should not modify the structure of the layout tree during
    // layout. crbug.com/370459
    DeprecatedDisableModifyLayoutTreeStructureAsserts disabler;

    LayoutFullScreen* fullscreenLayoutObject = LayoutFullScreen::createAnonymous(document);
    fullscreenLayoutObject->updateStyle(parent);
    if (parent && !parent->isChildAllowed(fullscreenLayoutObject, fullscreenLayoutObject->styleRef())) {
        fullscreenLayoutObject->destroy();
        return nullptr;
    }
    if (object) {
        // |object->parent()| can be null if the object is not yet attached
        // to |parent|.
        if (LayoutObject* parent = object->parent()) {
            LayoutBlock* containingBlock = object->containingBlock();
            DCHECK(containingBlock);
            // Since we are moving the |object| to a new parent |fullscreenLayoutObject|,
            // the line box tree underneath our |containingBlock| is not longer valid.
            if (containingBlock->isLayoutBlockFlow())
                toLayoutBlockFlow(containingBlock)->deleteLineBoxTree();

            parent->addChildWithWritingModeOfParent(fullscreenLayoutObject, object);
            object->remove();

            // Always just do a full layout to ensure that line boxes get deleted properly.
            // Because objects moved from |parent| to |fullscreenLayoutObject|, we want to
            // make new line boxes instead of leaving the old ones around.
            parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::Fullscreen);
            containingBlock->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::Fullscreen);
        }
        fullscreenLayoutObject->addChild(object);
        fullscreenLayoutObject->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::Fullscreen);
    }

    DCHECK(document);
    Fullscreen::from(*document).setFullScreenLayoutObject(fullscreenLayoutObject);
    return fullscreenLayoutObject;
}

void LayoutFullScreen::unwrapLayoutObject()
{
    // FIXME: We should not modify the structure of the layout tree during
    // layout. crbug.com/370459
    DeprecatedDisableModifyLayoutTreeStructureAsserts disabler;

    if (parent()) {
        for (LayoutObject* child = firstChild(); child; child = firstChild()) {
            // We have to clear the override size, because as a flexbox, we
            // may have set one on the child, and we don't want to leave that
            // lying around on the child.
            if (child->isBox())
                toLayoutBox(child)->clearOverrideSize();
            child->remove();
            parent()->addChild(child, this);
            parent()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::Fullscreen);
        }
    }
    if (placeholder())
        placeholder()->remove();
    remove();
    destroy();
}

void LayoutFullScreen::createPlaceholder(PassRefPtr<ComputedStyle> style, const LayoutRect& frameRect)
{
    if (style->width().isAuto())
        style->setWidth(Length(frameRect.width(), Fixed));
    if (style->height().isAuto())
        style->setHeight(Length(frameRect.height(), Fixed));

    if (!m_placeholder) {
        m_placeholder = new LayoutFullScreenPlaceholder(this);
        m_placeholder->setStyleWithWritingModeOfParent(std::move(style));
        if (parent()) {
            parent()->addChildWithWritingModeOfParent(m_placeholder, this);
            parent()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::Fullscreen);
        }
    } else {
        m_placeholder->setStyle(std::move(style));
        m_placeholder->setStyleWithWritingModeOfParent(std::move(style));
    }
}
