// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "sky/engine/config.h"

#include "sky/engine/core/rendering/RenderIFrame.h"

#include "sky/engine/core/editing/FrameSelection.h"
#include "sky/engine/core/html/HTMLIFrameElement.h"
#include "sky/engine/core/loader/FrameLoaderClient.h"
#include "sky/engine/core/rendering/PaintInfo.h"
#include "sky/engine/core/rendering/RenderView.h"
#include "sky/engine/platform/geometry/LayoutPoint.h"

namespace blink {

RenderIFrame::RenderIFrame(HTMLIFrameElement* iframe)
    : RenderReplaced(iframe)
{
    view()->addIFrame(this);
}

RenderIFrame::~RenderIFrame()
{
    if (view())
        view()->removeIFrame(this);
}

void RenderIFrame::updateWidgetBounds()
{
    mojo::View* contentView = toHTMLIFrameElement(node())->contentView();
    if (!contentView)
        return;

    // FIXME: Once viewport_metrics are initialized properly on child views,
    // The GetRoot() call should be removed.
    const float devicePixelRatio =
        contentView->GetRoot()->viewport_metrics().device_pixel_ratio;

    IntRect bounds = absoluteContentBox();
    mojo::Rect mojoBounds;
    mojoBounds.x = bounds.x() * devicePixelRatio;
    mojoBounds.y = bounds.y() * devicePixelRatio;
    mojoBounds.width = bounds.width() * devicePixelRatio;
    mojoBounds.height = bounds.height() * devicePixelRatio;
    contentView->SetBounds(mojoBounds);
}

void RenderIFrame::paintReplaced(PaintInfo& paintInfo,
                                 const LayoutPoint& paintOffset)
{
    // Draw a gray background. This should be painted over by the actual
    // content.
    // TODO(mpcomplete): figure out what we should actually do here.
    GraphicsContext* context = paintInfo.context;

    IntRect paintRect = pixelSnappedIntRect(LayoutRect(
        paintOffset.x(), paintOffset.y(), contentWidth(), contentHeight()));
    context->setStrokeStyle(SolidStroke);
    context->setStrokeColor(Color::lightGray);
    context->setFillColor(Color::darkGray);
    context->drawRect(paintRect);
}

} // namespace blink
