mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This is just another hack on top of the hack that is LayoutRoot. We will want to untangle Document ownership further as we iterate on LayoutRoot. For now LayoutRoot is both very inefficient (allocates a new Frame for each one!) as well as crashy like this (by not actually owning the document but rather grabbing it off the "rootElement" assigned to it). This at least fixes this common crasher for now. https://github.com/domokit/mojo/issues/206 R=abarth@chromium.org Review URL: https://codereview.chromium.org/1171643002
89 lines
2.3 KiB
C++
89 lines
2.3 KiB
C++
// Copyright 2015 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/painting/LayoutRoot.h"
|
|
|
|
#include "sky/engine/core/dom/Document.h"
|
|
#include "sky/engine/core/dom/Element.h"
|
|
#include "sky/engine/core/frame/FrameView.h"
|
|
#include "sky/engine/core/frame/LocalFrame.h"
|
|
#include "sky/engine/core/frame/Settings.h"
|
|
#include "sky/engine/core/painting/PaintingTasks.h"
|
|
#include "sky/engine/platform/geometry/IntRect.h"
|
|
#include "third_party/skia/include/core/SkCanvas.h"
|
|
|
|
namespace blink {
|
|
|
|
PassRefPtr<LayoutRoot> LayoutRoot::create()
|
|
{
|
|
return adoptRef(new LayoutRoot);
|
|
}
|
|
|
|
LayoutRoot::LayoutRoot()
|
|
: m_minWidth(0)
|
|
, m_maxWidth(0)
|
|
, m_minHeight(0)
|
|
, m_maxHeight(0)
|
|
{
|
|
m_settings = Settings::create();
|
|
m_settings->setDefaultFixedFontSize(13);
|
|
m_settings->setDefaultFontSize(16);
|
|
m_frameHost = FrameHost::createDummy(m_settings.get());
|
|
m_frame = LocalFrame::create(nullptr, m_frameHost.get());
|
|
m_frame->createView(IntSize(), Color::white, false);
|
|
}
|
|
|
|
LayoutRoot::~LayoutRoot()
|
|
{
|
|
if (!m_document->needsAttach())
|
|
m_document->detach();
|
|
}
|
|
|
|
Element* LayoutRoot::rootElement() const
|
|
{
|
|
if (!m_document)
|
|
return nullptr;
|
|
return m_document->firstElementChild();
|
|
}
|
|
|
|
void LayoutRoot::setRootElement(Element* root)
|
|
{
|
|
m_document = &root->document();
|
|
m_frame->setDocument(m_document.get());
|
|
m_document->setFrame(m_frame.get());
|
|
|
|
m_document->attach();
|
|
m_document->setChild(root, ASSERT_NO_EXCEPTION);
|
|
|
|
m_document->setFrame(nullptr);
|
|
m_frame->setDocument(nullptr);
|
|
}
|
|
|
|
void LayoutRoot::layout()
|
|
{
|
|
m_frame->setDocument(m_document.get());
|
|
m_document->setFrame(m_frame.get());
|
|
|
|
LayoutUnit maxWidth = std::max(m_minWidth, m_maxWidth);
|
|
LayoutUnit maxHeight = std::max(m_minHeight, m_maxHeight);
|
|
IntSize maxSize(maxWidth, maxHeight);
|
|
|
|
m_frame->view()->setFrameRect(IntRect(IntPoint(), maxSize));
|
|
m_frame->view()->setLayoutSize(maxSize);
|
|
|
|
m_document->updateLayout();
|
|
|
|
m_document->setFrame(nullptr);
|
|
m_frame->setDocument(nullptr);
|
|
}
|
|
|
|
void LayoutRoot::paint(Canvas* canvas)
|
|
{
|
|
if (m_document)
|
|
rootElement()->paint(canvas);
|
|
}
|
|
|
|
} // namespace blink
|