// 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 "config.h"

#include "core/rendering/RenderIFrame.h"

#include "core/editing/FrameSelection.h"
#include "core/html/HTMLIFrameElement.h"
#include "core/loader/FrameLoaderClient.h"
#include "core/rendering/PaintInfo.h"
#include "core/rendering/RenderView.h"
#include "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;

    IntRect bounds = absoluteContentBox();
    mojo::Rect mojoBounds;
    mojoBounds.x = bounds.x();
    mojoBounds.y = bounds.y();
    mojoBounds.width = bounds.width();
    mojoBounds.height = bounds.height();
    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
