Index: Source/core/rendering/RenderWidget.cpp |
diff --git a/Source/core/rendering/RenderWidget.cpp b/Source/core/rendering/RenderWidget.cpp |
index 93c4daced00f2ee26e8265924711a9a8a32d8c1c..7ae120983d91c1fa9c1422ca8180ce9ed73e7267 100644 |
--- a/Source/core/rendering/RenderWidget.cpp |
+++ b/Source/core/rendering/RenderWidget.cpp |
@@ -26,6 +26,7 @@ |
#include "core/accessibility/AXObjectCache.h" |
#include "core/frame/Frame.h" |
+#include "core/html/HTMLPlugInElement.h" |
#include "core/platform/graphics/GraphicsContext.h" |
#include "core/rendering/CompositedLayerMapping.h" |
#include "core/rendering/GraphicsContextAnnotator.h" |
@@ -127,6 +128,19 @@ RenderWidget::~RenderWidget() |
clearWidget(); |
} |
+Widget* RenderWidget::widget() const |
+{ |
+ if (m_widget.get()) |
eseidel
2013/11/18 22:09:54
Can we just remove RenderWidget's m_widget pointer
wjmaclean
2013/11/25 17:51:56
I've taken a stab at this .. please take a look an
|
+ return m_widget.get(); |
+ |
+ // Plugin widgets are now stored in their DOM node, so check there next. |
+ Element* element = toElement(node()); |
+ if (element && element->isPluginElement()) |
+ return toHTMLPlugInElement(element)->plugin().get(); |
+ |
+ 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. |
@@ -140,10 +154,13 @@ bool RenderWidget::setWidgetGeometry(const LayoutRect& frame) |
if (!node()) |
return false; |
+ Widget* widget = this->widget(); |
+ ASSERT(widget); |
+ |
IntRect clipRect = roundedIntRect(enclosingLayer()->childrenClipRect()); |
IntRect newFrame = roundedIntRect(frame); |
bool clipChanged = m_clipRect != clipRect; |
- bool frameRectChanged = m_widget->frameRect() != newFrame; |
+ bool frameRectChanged = widget->frameRect() != newFrame; |
if (!frameRectChanged && !clipChanged) |
return false; |
@@ -152,23 +169,25 @@ bool RenderWidget::setWidgetGeometry(const LayoutRect& frame) |
RefPtr<RenderWidget> protector(this); |
RefPtr<Node> protectedNode(node()); |
- m_widget->setFrameRect(newFrame); |
+ widget->setFrameRect(newFrame); |
if (clipChanged && !frameRectChanged) |
- m_widget->clipRectChanged(); |
+ widget->clipRectChanged(); |
if (hasLayer() && layer()->compositingState() == PaintsIntoOwnBacking) |
layer()->compositedLayerMapping()->updateAfterWidgetResize(); |
- bool boundsChanged = m_widget->frameRect().size() != newFrame.size(); |
+ bool boundsChanged = widget->frameRect().size() != newFrame.size(); |
return boundsChanged; |
} |
bool RenderWidget::updateWidgetGeometry() |
{ |
+ Widget* widget = this->widget(); |
+ |
LayoutRect contentBox = contentBoxRect(); |
LayoutRect absoluteContentBox(localToAbsoluteQuad(FloatQuad(contentBox)).boundingBox()); |
- if (m_widget->isFrameView()) { |
+ if (widget->isFrameView()) { |
contentBox.setLocation(absoluteContentBox.location()); |
return setWidgetGeometry(contentBox); |
} |
@@ -176,6 +195,9 @@ bool RenderWidget::updateWidgetGeometry() |
return setWidgetGeometry(absoluteContentBox); |
} |
+// FIXME: Once Frame/FrameElementBase/FrameOwnerElement and HTMLAppletElement |
eseidel
2013/11/18 22:26:45
I see. The problem is there are multiple DOM clas
wjmaclean
2013/11/25 17:51:56
As per comment regarding removing widget pointer.
|
+// can be updated to own their own widgets, this function can be retired in |
+// favour of configureWidget(). |
void RenderWidget::setWidget(PassRefPtr<Widget> widget) |
{ |
if (widget == m_widget) |
@@ -208,6 +230,36 @@ void RenderWidget::setWidget(PassRefPtr<Widget> widget) |
cache->childrenChanged(this); |
} |
+void RenderWidget::configureWidget(ConfigureType type) |
+{ |
+ Widget* widget = this->widget(); |
+ ASSERT(widget); |
+ |
+ if (type == ConfigureOnDetach) { |
+ moveWidgetToParentSoon(widget, 0); |
+ return; |
+ } |
+ |
+ // type == ConfigureOnAttach. |
eseidel
2013/11/18 22:26:45
confused. Which one of these is the old path vs.
wjmaclean
2013/11/25 17:51:56
It's not so much an old vs. new distinction as att
|
+ if (widget) { |
+ if (style()) { |
+ if (!needsLayout()) |
+ updateWidgetGeometry(); |
+ |
+ if (style()->visibility() != VISIBLE) { |
+ widget->hide(); |
+ } else { |
+ widget->show(); |
+ repaint(); |
+ } |
+ if (!widget->parent()) |
+ moveWidgetToParentSoon(widget, m_frameView); |
+ } |
+ if (AXObjectCache* cache = document().existingAXObjectCache()) |
+ cache->childrenChanged(this); |
+ } |
+} |
+ |
void RenderWidget::layout() |
{ |
ASSERT(needsLayout()); |
@@ -219,11 +271,13 @@ void RenderWidget::layout() |
void RenderWidget::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) |
{ |
RenderReplaced::styleDidChange(diff, oldStyle); |
- if (m_widget) { |
+ Widget* widget = this->widget(); |
+ |
+ if (widget) { |
if (style()->visibility() != VISIBLE) |
- m_widget->hide(); |
+ widget->hide(); |
else |
- m_widget->show(); |
+ widget->show(); |
} |
} |
@@ -231,9 +285,12 @@ void RenderWidget::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintO |
{ |
LayoutPoint adjustedPaintOffset = paintOffset + location(); |
+ Widget* widget = this->widget(); |
+ 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 = m_widget->frameRect().location(); |
+ IntPoint widgetLocation = widget->frameRect().location(); |
IntPoint paintLocation(roundToInt(adjustedPaintOffset.x() + borderLeft() + paddingLeft()), |
roundToInt(adjustedPaintOffset.y() + borderTop() + paddingTop())); |
IntRect paintRect = paintInfo.rect; |
@@ -245,17 +302,17 @@ void RenderWidget::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintO |
paintInfo.context->translate(widgetPaintOffset); |
paintRect.move(-widgetPaintOffset); |
} |
- m_widget->paint(paintInfo.context, paintRect); |
+ widget->paint(paintInfo.context, paintRect); |
if (!widgetPaintOffset.isZero()) |
paintInfo.context->translate(-widgetPaintOffset); |
- if (m_widget->isFrameView()) { |
- FrameView* frameView = toFrameView(m_widget.get()); |
+ if (widget->isFrameView()) { |
+ FrameView* frameView = toFrameView(widget); |
bool runOverlapTests = !frameView->useSlowRepaintsIfNotOverlapped() || frameView->hasCompositedContent(); |
if (paintInfo.overlapTestRequests && runOverlapTests) { |
ASSERT(!paintInfo.overlapTestRequests->contains(this)); |
- paintInfo.overlapTestRequests->set(this, m_widget->frameRect()); |
+ paintInfo.overlapTestRequests->set(this, widget->frameRect()); |
} |
} |
} |
@@ -296,7 +353,8 @@ void RenderWidget::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) |
clipRoundedInnerRect(paintInfo.context, borderRect, roundedInnerRect); |
} |
- if (m_widget) |
+ Widget* widget = this->widget(); |
+ if (widget) |
paintContents(paintInfo, paintOffset); |
if (style()->hasBorderRadius()) |
@@ -314,9 +372,10 @@ void RenderWidget::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) |
void RenderWidget::setIsOverlapped(bool isOverlapped) |
{ |
- ASSERT(m_widget); |
- ASSERT(m_widget->isFrameView()); |
- toFrameView(m_widget.get())->setIsOverlapped(isOverlapped); |
+ Widget* widget = this->widget(); |
+ ASSERT(widget); |
+ ASSERT(widget->isFrameView()); |
+ toFrameView(widget)->setIsOverlapped(isOverlapped); |
} |
void RenderWidget::deref() |
@@ -327,15 +386,16 @@ void RenderWidget::deref() |
void RenderWidget::updateWidgetPosition() |
{ |
- if (!m_widget || !node()) // Check the node in case destroy() has been called. |
+ 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 (m_widget && m_widget->isFrameView()) { |
- FrameView* frameView = toFrameView(m_widget.get()); |
+ 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(); |
@@ -344,9 +404,10 @@ void RenderWidget::updateWidgetPosition() |
void RenderWidget::widgetPositionsUpdated() |
{ |
- if (!m_widget) |
+ Widget* widget = this->widget(); |
+ if (!widget) |
return; |
- m_widget->widgetPositionsUpdated(); |
+ widget->widgetPositionsUpdated(); |
} |
IntRect RenderWidget::windowClipRect() const |