mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The first one is that we weren't setting up a FontCachePurgePreventer during drawText. It's not clear that this is the correct fix, since Blink doesn't have this FontCachePurgePreventer here either, but it's also possible that they would hit this same ASSERT and just not care (since ASSERTs are disabled on clusterfuzz). The second fix is making ExceptionState actually track whether it has thrown an exception or not. The c++ code was depending on this working in order to return early from dom functions and not crash! R=abarth@google.com
91 lines
2.5 KiB
C++
91 lines
2.5 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/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/Canvas.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();
|
|
// Using 14px default to match Material Design English Body1:
|
|
// http://www.google.com/design/spec/style/typography.html#typography-typeface
|
|
m_settings->setDefaultFixedFontSize(14);
|
|
m_settings->setDefaultFontSize(14);
|
|
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() && canvas && canvas->skCanvas())
|
|
rootElement()->paint(canvas);
|
|
}
|
|
|
|
} // namespace blink
|