Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1510)

Unified Diff: Source/core/rendering/RenderWidget.cpp

Issue 625073002: Merge RenderWidget into single subclass, RenderPart (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address comments Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderWidget.h ('k') | Source/web/ChromeClientImpl.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderWidget.cpp
diff --git a/Source/core/rendering/RenderWidget.cpp b/Source/core/rendering/RenderWidget.cpp
deleted file mode 100644
index 751cea6cd3efd70bdc80c112387394a2e5c76eb5..0000000000000000000000000000000000000000
--- a/Source/core/rendering/RenderWidget.cpp
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2009, 2010 Apple Inc. All rights reserved.
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-#include "core/rendering/RenderWidget.h"
-
-#include "core/accessibility/AXObjectCache.h"
-#include "core/frame/LocalFrame.h"
-#include "core/html/HTMLFrameOwnerElement.h"
-#include "core/html/HTMLPlugInElement.h"
-#include "core/paint/BoxPainter.h"
-#include "core/rendering/GraphicsContextAnnotator.h"
-#include "core/rendering/HitTestResult.h"
-#include "core/rendering/RenderLayer.h"
-#include "core/rendering/RenderView.h"
-#include "core/rendering/compositing/CompositedLayerMapping.h"
-#include "core/rendering/compositing/RenderLayerCompositor.h"
-#include "wtf/HashMap.h"
-
-namespace blink {
-
-RenderWidget::RenderWidget(Element* element)
- : RenderReplaced(element)
-#if !ENABLE(OILPAN)
- // Reference counting is used to prevent the widget from being
- // destroyed while inside the Widget code, which might not be
- // able to handle that.
- , m_refCount(1)
-#endif
-{
- ASSERT(element);
- frameView()->addWidget(this);
-}
-
-void RenderWidget::willBeDestroyed()
-{
- frameView()->removeWidget(this);
-
- if (AXObjectCache* cache = document().existingAXObjectCache()) {
- cache->childrenChanged(this->parent());
- cache->remove(this);
- }
-
- Element* element = toElement(node());
- if (element && element->isFrameOwnerElement())
- toHTMLFrameOwnerElement(element)->setWidget(nullptr);
-
- RenderReplaced::willBeDestroyed();
-}
-
-void RenderWidget::destroy()
-{
-#if ENABLE(ASSERT) && ENABLE(OILPAN)
- ASSERT(!m_didCallDestroy);
- m_didCallDestroy = true;
-#endif
- willBeDestroyed();
- clearNode();
-#if ENABLE(OILPAN)
- // In Oilpan, postDestroy doesn't delete |this|. So calling it here is safe
- // though |this| will be referred in FrameView.
- postDestroy();
-#else
- deref();
-#endif
-}
-
-RenderWidget::~RenderWidget()
-{
-#if !ENABLE(OILPAN)
- ASSERT(m_refCount <= 0);
-#endif
-}
-
-Widget* RenderWidget::widget() const
-{
- // Plugin widgets are stored in their DOM node. This includes HTMLAppletElement.
- Element* element = toElement(node());
-
- if (element && element->isFrameOwnerElement())
- return toHTMLFrameOwnerElement(element)->ownedWidget();
-
- return 0;
-}
-
-// Widgets are always placed on integer boundaries, so rounding the size is actually
-// the desired behavior. This function is here because it's otherwise seldom what we
-// want to do with a LayoutRect.
-static inline IntRect roundedIntRect(const LayoutRect& rect)
-{
- return IntRect(roundedIntPoint(rect.location()), roundedIntSize(rect.size()));
-}
-
-bool RenderWidget::setWidgetGeometry(const LayoutRect& frame)
-{
- if (!node())
- return false;
-
- Widget* widget = this->widget();
- ASSERT(widget);
-
- IntRect newFrame = roundedIntRect(frame);
-
- if (widget->frameRect() == newFrame)
- return false;
-
- RefPtrWillBeRawPtr<RenderWidget> protector(this);
- RefPtrWillBeRawPtr<Node> protectedNode(node());
- widget->setFrameRect(newFrame);
- return widget->frameRect().size() != newFrame.size();
-}
-
-bool RenderWidget::updateWidgetGeometry()
-{
- Widget* widget = this->widget();
- ASSERT(widget);
-
- LayoutRect contentBox = contentBoxRect();
- LayoutRect absoluteContentBox(localToAbsoluteQuad(FloatQuad(contentBox)).boundingBox());
- if (widget->isFrameView()) {
- contentBox.setLocation(absoluteContentBox.location());
- return setWidgetGeometry(contentBox);
- }
-
- return setWidgetGeometry(absoluteContentBox);
-}
-
-void RenderWidget::layout()
-{
- ASSERT(needsLayout());
-
- clearNeedsLayout();
-}
-
-void RenderWidget::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
-{
- RenderReplaced::styleDidChange(diff, oldStyle);
- Widget* widget = this->widget();
-
- if (widget) {
- if (style()->visibility() != VISIBLE) {
- widget->hide();
- } else {
- widget->show();
- }
- }
-}
-
-void RenderWidget::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- LayoutPoint adjustedPaintOffset = paintOffset + location();
-
- Widget* widget = this->widget();
- RELEASE_ASSERT(widget);
-
- // Tell the widget to paint now. This is the only time the widget is allowed
- // to paint itself. That way it will composite properly with z-indexed layers.
- IntPoint widgetLocation = widget->frameRect().location();
- IntPoint paintLocation(roundToInt(adjustedPaintOffset.x() + borderLeft() + paddingLeft()),
- roundToInt(adjustedPaintOffset.y() + borderTop() + paddingTop()));
- IntRect paintRect = paintInfo.rect;
-
- IntSize widgetPaintOffset = paintLocation - widgetLocation;
- // When painting widgets into compositing layers, tx and ty are relative to the enclosing compositing layer,
- // not the root. In this case, shift the CTM and adjust the paintRect to be root-relative to fix plug-in drawing.
- if (!widgetPaintOffset.isZero()) {
- paintInfo.context->translate(widgetPaintOffset.width(), widgetPaintOffset.height());
- paintRect.move(-widgetPaintOffset);
- }
- widget->paint(paintInfo.context, paintRect);
-
- if (!widgetPaintOffset.isZero())
- paintInfo.context->translate(-widgetPaintOffset.width(), -widgetPaintOffset.height());
-}
-
-void RenderWidget::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this);
-
- if (!shouldPaint(paintInfo, paintOffset))
- return;
-
- LayoutPoint adjustedPaintOffset = paintOffset + location();
-
- if (hasBoxDecorationBackground() && (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection))
- paintBoxDecorationBackground(paintInfo, adjustedPaintOffset);
-
- if (paintInfo.phase == PaintPhaseMask) {
- paintMask(paintInfo, adjustedPaintOffset);
- return;
- }
-
- if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->hasOutline())
- paintOutline(paintInfo, LayoutRect(adjustedPaintOffset, size()));
-
- if (paintInfo.phase != PaintPhaseForeground)
- return;
-
- if (style()->hasBorderRadius()) {
- LayoutRect borderRect = LayoutRect(adjustedPaintOffset, size());
-
- if (borderRect.isEmpty())
- return;
-
- // Push a clip if we have a border radius, since we want to round the foreground content that gets painted.
- paintInfo.context->save();
- RoundedRect roundedInnerRect = style()->getRoundedInnerBorderFor(borderRect,
- paddingTop() + borderTop(), paddingBottom() + borderBottom(), paddingLeft() + borderLeft(), paddingRight() + borderRight(), true, true);
- BoxPainter::clipRoundedInnerRect(paintInfo.context, borderRect, roundedInnerRect);
- }
-
- Widget* widget = this->widget();
- if (widget)
- paintContents(paintInfo, paintOffset);
-
- if (style()->hasBorderRadius())
- paintInfo.context->restore();
-
- // Paint a partially transparent wash over selected widgets.
- if (isSelected() && !document().printing()) {
- LayoutRect rect = localSelectionRect();
- rect.moveBy(adjustedPaintOffset);
- paintInfo.context->fillRect(pixelSnappedIntRect(rect), selectionBackgroundColor());
- }
-
- if (canResize())
- layer()->scrollableArea()->paintResizer(paintInfo.context, roundedIntPoint(adjustedPaintOffset), paintInfo.rect);
-}
-
-#if !ENABLE(OILPAN)
-void RenderWidget::deref()
-{
- if (--m_refCount <= 0)
- postDestroy();
-}
-#endif
-
-void RenderWidget::updateOnWidgetChange()
-{
- Widget* widget = this->widget();
- if (!widget)
- return;
-
- if (!style())
- return;
-
- if (!needsLayout())
- updateWidgetGeometry();
-
- if (style()->visibility() != VISIBLE) {
- widget->hide();
- } else {
- widget->show();
- // FIXME: Why do we issue a full paint invalidation in this case, but not the other?
- setShouldDoFullPaintInvalidation();
- }
-}
-
-void RenderWidget::updateWidgetPosition()
-{
- Widget* widget = this->widget();
- if (!widget || !node()) // Check the node in case destroy() has been called.
- return;
-
- bool boundsChanged = updateWidgetGeometry();
-
- // if the frame bounds got changed, or if view needs layout (possibly indicating
- // content size is wrong) we have to do a layout to set the right widget size
- if (widget && widget->isFrameView()) {
- FrameView* frameView = toFrameView(widget);
- // Check the frame's page to make sure that the frame isn't in the process of being destroyed.
- if ((boundsChanged || frameView->needsLayout()) && frameView->frame().page())
- frameView->layout();
- }
-}
-
-void RenderWidget::widgetPositionsUpdated()
-{
- Widget* widget = this->widget();
- if (!widget)
- return;
- widget->widgetPositionsUpdated();
-}
-
-bool RenderWidget::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action)
-{
- bool hadResult = result.innerNode();
- bool inside = RenderReplaced::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, action);
-
- // Check to see if we are really over the widget itself (and not just in the border/padding area).
- if ((inside || result.isRectBasedTest()) && !hadResult && result.innerNode() == node())
- result.setIsOverWidget(contentBoxRect().contains(result.localPoint()));
- return inside;
-}
-
-CursorDirective RenderWidget::getCursor(const LayoutPoint& point, Cursor& cursor) const
-{
- if (widget() && widget()->isPluginView()) {
- // A plug-in is responsible for setting the cursor when the pointer is over it.
- return DoNotSetCursor;
- }
- return RenderReplaced::getCursor(point, cursor);
-}
-
-} // namespace blink
« no previous file with comments | « Source/core/rendering/RenderWidget.h ('k') | Source/web/ChromeClientImpl.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698