Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
CTTE: RenderWidgets are never anonymous.
<https://webkit.org/b/121385>

Reviewed by Anders Carlsson.

Codify the following:

- RenderWidget always has an HTMLFrameOwnerElement.
- RenderEmbeddedObject always has an HTMLFrameOwnerElement.
- RenderSnapshottedPlugIn always has an HTMLPlugInImageElement.
- RenderFrame always has an HTMLFrameElement.
- RenderIFrame always has an HTMLIFrameElement.

None of these renderers are ever anonymous, so delete element() and provide
strongly typed reference getters instead.

Canonical link: https://commits.webkit.org/139363@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155806 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
Andreas Kling committed Sep 15, 2013
1 parent b4e1394 commit 7dc9e1a
Show file tree
Hide file tree
Showing 21 changed files with 118 additions and 92 deletions.
18 changes: 18 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,21 @@
2013-09-15 Andreas Kling <akling@apple.com>

CTTE: RenderWidgets are never anonymous.
<https://webkit.org/b/121385>

Reviewed by Anders Carlsson.

Codify the following:

- RenderWidget always has an HTMLFrameOwnerElement.
- RenderEmbeddedObject always has an HTMLFrameOwnerElement.
- RenderSnapshottedPlugIn always has an HTMLPlugInImageElement.
- RenderFrame always has an HTMLFrameElement.
- RenderIFrame always has an HTMLIFrameElement.

None of these renderers are ever anonymous, so delete element() and provide
strongly typed reference getters instead.

2013-09-14 Darin Adler <darin@apple.com>

Use FINAL instead of virtualChildren trick in render tree classes
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/html/HTMLFrameElement.cpp
Expand Up @@ -56,7 +56,7 @@ bool HTMLFrameElement::rendererIsNeeded(const RenderStyle&)

RenderObject* HTMLFrameElement::createRenderer(RenderArena* arena, RenderStyle*)
{
return new (arena) RenderFrame(this);
return new (arena) RenderFrame(*this);
}

bool HTMLFrameElement::noResize() const
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/html/HTMLFrameElement.h
Expand Up @@ -54,6 +54,8 @@ class HTMLFrameElement FINAL : public HTMLFrameElementBase {
bool m_frameBorderSet;
};

ELEMENT_TYPE_CASTS(HTMLFrameElement)

} // namespace WebCore

#endif // HTMLFrameElement_h
2 changes: 1 addition & 1 deletion Source/WebCore/html/HTMLIFrameElement.cpp
Expand Up @@ -97,7 +97,7 @@ bool HTMLIFrameElement::rendererIsNeeded(const RenderStyle& style)

RenderObject* HTMLIFrameElement::createRenderer(RenderArena* arena, RenderStyle*)
{
return new (arena) RenderIFrame(this);
return new (arena) RenderIFrame(*this);
}

bool HTMLIFrameElement::shouldDisplaySeamlessly() const
Expand Down
6 changes: 6 additions & 0 deletions Source/WebCore/html/HTMLPlugInElement.h
Expand Up @@ -117,6 +117,12 @@ class HTMLPlugInElement : public HTMLFrameOwnerElement {
DisplayState m_displayState;
};

inline HTMLPlugInElement& toHTMLPlugInElement(Node& node)
{
ASSERT_WITH_SECURITY_IMPLICATION(node.isPluginElement());
return static_cast<HTMLPlugInElement&>(node);
}

inline HTMLPlugInElement* toHTMLPlugInElement(Node* node)
{
ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isPluginElement());
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/html/HTMLPlugInImageElement.cpp
Expand Up @@ -204,7 +204,7 @@ RenderObject* HTMLPlugInImageElement::createRenderer(RenderArena* arena, RenderS
}

if (displayState() == DisplayingSnapshot) {
RenderSnapshottedPlugIn* renderSnapshottedPlugIn = new (arena) RenderSnapshottedPlugIn(this);
RenderSnapshottedPlugIn* renderSnapshottedPlugIn = new (arena) RenderSnapshottedPlugIn(*this);
renderSnapshottedPlugIn->updateSnapshot(m_snapshotImage);
return renderSnapshottedPlugIn;
}
Expand All @@ -221,7 +221,7 @@ RenderObject* HTMLPlugInImageElement::createRenderer(RenderArena* arena, RenderS
return image;
}

return new (arena) RenderEmbeddedObject(this);
return new (arena) RenderEmbeddedObject(*this);
}

bool HTMLPlugInImageElement::willRecalcStyle(Style::Change)
Expand Down
6 changes: 2 additions & 4 deletions Source/WebCore/page/Frame.cpp
Expand Up @@ -584,10 +584,8 @@ Frame* Frame::frameForWidget(const Widget* widget)
{
ASSERT_ARG(widget, widget);

if (RenderWidget* renderer = RenderWidget::find(widget)) {
if (HTMLFrameOwnerElement* element = renderer->frameOwnerElement())
return element->document().frame();
}
if (RenderWidget* renderer = RenderWidget::find(widget))
return renderer->frameOwnerElement().document().frame();

// Assume all widgets are either a FrameView or owned by a RenderWidget.
// FIXME: That assumption is not right for scroll bars!
Expand Down
8 changes: 2 additions & 6 deletions Source/WebCore/page/FrameView.cpp
Expand Up @@ -1402,8 +1402,7 @@ void FrameView::addEmbeddedObjectToUpdate(RenderEmbeddedObject& embeddedObject)
if (!m_embeddedObjectsToUpdate)
m_embeddedObjectsToUpdate = adoptPtr(new ListHashSet<RenderEmbeddedObject*>);

ASSERT(embeddedObject.frameOwnerElement());
Element& element = *embeddedObject.frameOwnerElement();
HTMLFrameOwnerElement& element = embeddedObject.frameOwnerElement();
if (isHTMLObjectElement(element) || isHTMLEmbedElement(element)) {
// Tell the DOM element that it needs a widget update.
HTMLPlugInImageElement& pluginElement = toHTMLPlugInImageElement(element);
Expand Down Expand Up @@ -2653,10 +2652,7 @@ void FrameView::updateEmbeddedObject(RenderEmbeddedObject& embeddedObject)
if (embeddedObject.isPluginUnavailable())
return;

// FIXME: RenderEmbeddedObject::frameOwnerElement() should return a reference.
ASSERT(embeddedObject.frameOwnerElement());

HTMLFrameOwnerElement& element = *embeddedObject.frameOwnerElement();
HTMLFrameOwnerElement& element = embeddedObject.frameOwnerElement();

if (embeddedObject.isSnapshottedPlugIn()) {
if (isHTMLObjectElement(element) || isHTMLEmbedElement(element)) {
Expand Down
56 changes: 28 additions & 28 deletions Source/WebCore/rendering/RenderEmbeddedObject.cpp
Expand Up @@ -100,7 +100,7 @@ static const Color& unavailablePluginBorderColor()
return standard;
}

RenderEmbeddedObject::RenderEmbeddedObject(HTMLFrameOwnerElement* element)
RenderEmbeddedObject::RenderEmbeddedObject(HTMLFrameOwnerElement& element)
: RenderWidget(element)
, m_hasFallbackContent(false)
, m_isPluginUnavailable(false)
Expand All @@ -120,7 +120,7 @@ RenderEmbeddedObject::~RenderEmbeddedObject()

RenderEmbeddedObject* RenderEmbeddedObject::createForApplet(HTMLAppletElement& applet)
{
RenderEmbeddedObject* renderer = new (applet.document().renderArena()) RenderEmbeddedObject(&applet);
RenderEmbeddedObject* renderer = new (applet.document().renderArena()) RenderEmbeddedObject(applet);
renderer->setInline(true);
return renderer;
}
Expand Down Expand Up @@ -212,21 +212,21 @@ void RenderEmbeddedObject::paintSnapshotImage(PaintInfo& paintInfo, const Layout

void RenderEmbeddedObject::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
if (!frameOwnerElement() || !frameOwnerElement()->isPluginElement())
if (!frameOwnerElement().isPluginElement())
return;

HTMLPlugInElement* plugInElement = toHTMLPlugInElement(frameOwnerElement());
HTMLPlugInElement& plugInElement = toHTMLPlugInElement(frameOwnerElement());

if (plugInElement->displayState() > HTMLPlugInElement::DisplayingSnapshot) {
if (plugInElement.displayState() > HTMLPlugInElement::DisplayingSnapshot) {
RenderWidget::paintContents(paintInfo, paintOffset);
if (!plugInElement->isRestartedPlugin())
if (!plugInElement.isRestartedPlugin())
return;
}

if (!plugInElement->isPlugInImageElement())
if (!plugInElement.isPlugInImageElement())
return;

Image* snapshot = toHTMLPlugInImageElement(plugInElement)->snapshotImage();
Image* snapshot = toHTMLPlugInImageElement(plugInElement).snapshotImage();
if (snapshot)
paintSnapshotImage(paintInfo, paintOffset, snapshot);
}
Expand Down Expand Up @@ -427,27 +427,27 @@ bool RenderEmbeddedObject::isReplacementObscured() const
bool hit = false;
location = LayoutPoint(x + width / 2, y + height / 2);
hit = rootRenderView->hitTest(request, location, result);
if (!hit || result.innerNode() != frameOwnerElement())
if (!hit || result.innerNode() != &frameOwnerElement())
return true;

location = LayoutPoint(x, y);
hit = rootRenderView->hitTest(request, location, result);
if (!hit || result.innerNode() != frameOwnerElement())
if (!hit || result.innerNode() != &frameOwnerElement())
return true;

location = LayoutPoint(x + width, y);
hit = rootRenderView->hitTest(request, location, result);
if (!hit || result.innerNode() != frameOwnerElement())
if (!hit || result.innerNode() != &frameOwnerElement())
return true;

location = LayoutPoint(x + width, y + height);
hit = rootRenderView->hitTest(request, location, result);
if (!hit || result.innerNode() != frameOwnerElement())
if (!hit || result.innerNode() != &frameOwnerElement())
return true;

location = LayoutPoint(x, y + height);
hit = rootRenderView->hitTest(request, location, result);
if (!hit || result.innerNode() != frameOwnerElement())
if (!hit || result.innerNode() != &frameOwnerElement())
return true;

return false;
Expand Down Expand Up @@ -481,11 +481,11 @@ void RenderEmbeddedObject::layout()
LayoutSize newSize = contentBoxRect().size();

if (!wasMissingWidget && newSize.width() >= oldSize.width() && newSize.height() >= oldSize.height()) {
HTMLFrameOwnerElement* element = frameOwnerElement();
if (element && element->isPluginElement() && toHTMLPlugInElement(element)->isPlugInImageElement()) {
HTMLPlugInImageElement* plugInImageElement = toHTMLPlugInImageElement(element);
if (plugInImageElement->displayState() > HTMLPlugInElement::DisplayingSnapshot && plugInImageElement->snapshotDecision() == HTMLPlugInImageElement::MaySnapshotWhenResized) {
plugInImageElement->setNeedsCheckForSizeChange();
HTMLFrameOwnerElement& element = frameOwnerElement();
if (element.isPluginElement() && toHTMLPlugInElement(element).isPlugInImageElement()) {
HTMLPlugInImageElement& plugInImageElement = toHTMLPlugInImageElement(element);
if (plugInImageElement.displayState() > HTMLPlugInElement::DisplayingSnapshot && plugInImageElement.snapshotDecision() == HTMLPlugInImageElement::MaySnapshotWhenResized) {
plugInImageElement.setNeedsCheckForSizeChange();
view().frameView().addEmbeddedObjectToUpdate(*this);
}
}
Expand Down Expand Up @@ -526,14 +526,14 @@ void RenderEmbeddedObject::layout()
void RenderEmbeddedObject::viewCleared()
{
// This is required for <object> elements whose contents are rendered by WebCore (e.g. src="foo.html").
if (frameOwnerElement() && widget() && widget()->isFrameView()) {
if (widget() && widget()->isFrameView()) {
FrameView* view = toFrameView(widget());
int marginWidth = -1;
int marginHeight = -1;
if (frameOwnerElement()->hasTagName(iframeTag)) {
HTMLIFrameElement* frame = toHTMLIFrameElement(frameOwnerElement());
marginWidth = frame->marginWidth();
marginHeight = frame->marginHeight();
if (isHTMLIFrameElement(frameOwnerElement())) {
HTMLIFrameElement& iframe = toHTMLIFrameElement(frameOwnerElement());
marginWidth = iframe.marginWidth();
marginHeight = iframe.marginHeight();
}
if (marginWidth != -1)
view->setMarginWidth(marginWidth);
Expand Down Expand Up @@ -612,25 +612,25 @@ void RenderEmbeddedObject::handleUnavailablePluginIndicatorEvent(Event* event)
return;

MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
HTMLPlugInElement* element = toHTMLPlugInElement(frameOwnerElement());
HTMLPlugInElement& element = toHTMLPlugInElement(frameOwnerElement());
if (event->type() == eventNames().mousedownEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) {
m_mouseDownWasInUnavailablePluginIndicator = isInUnavailablePluginIndicator(mouseEvent);
if (m_mouseDownWasInUnavailablePluginIndicator) {
frame().eventHandler().setCapturingMouseEventsNode(element);
element->setIsCapturingMouseEvents(true);
frame().eventHandler().setCapturingMouseEventsNode(&element);
element.setIsCapturingMouseEvents(true);
setUnavailablePluginIndicatorIsPressed(true);
}
event->setDefaultHandled();
}
if (event->type() == eventNames().mouseupEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) {
if (m_unavailablePluginIndicatorIsPressed) {
frame().eventHandler().setCapturingMouseEventsNode(0);
element->setIsCapturingMouseEvents(false);
element.setIsCapturingMouseEvents(false);
setUnavailablePluginIndicatorIsPressed(false);
}
if (m_mouseDownWasInUnavailablePluginIndicator && isInUnavailablePluginIndicator(mouseEvent)) {
if (Page* page = document().page())
page->chrome().client().unavailablePluginButtonClicked(element, m_pluginUnavailabilityReason);
page->chrome().client().unavailablePluginButtonClicked(&element, m_pluginUnavailabilityReason);
}
m_mouseDownWasInUnavailablePluginIndicator = false;
event->setDefaultHandled();
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderEmbeddedObject.h
Expand Up @@ -35,7 +35,7 @@ class TextRun;
// For example, <embed src="foo.html"> does not invoke a plug-in.
class RenderEmbeddedObject : public RenderWidget {
public:
RenderEmbeddedObject(HTMLFrameOwnerElement*);
explicit RenderEmbeddedObject(HTMLFrameOwnerElement&);
virtual ~RenderEmbeddedObject();

static RenderEmbeddedObject* createForApplet(HTMLAppletElement&);
Expand Down
17 changes: 10 additions & 7 deletions Source/WebCore/rendering/RenderFrame.cpp
Expand Up @@ -30,15 +30,19 @@

namespace WebCore {

RenderFrame::RenderFrame(HTMLFrameElement* frame)
RenderFrame::RenderFrame(HTMLFrameElement& frame)
: RenderFrameBase(frame)
{
}

HTMLFrameElement& RenderFrame::frameElement() const
{
return toHTMLFrameElement(RenderFrameBase::frameOwnerElement());
}

FrameEdgeInfo RenderFrame::edgeInfo() const
{
HTMLFrameElement* frameElement = static_cast<HTMLFrameElement*>(frameOwnerElement());
return FrameEdgeInfo(frameElement->noResize(), frameElement->hasFrameBorder());
return FrameEdgeInfo(frameElement().noResize(), frameElement().hasFrameBorder());
}

void RenderFrame::updateFromElement()
Expand All @@ -49,14 +53,13 @@ void RenderFrame::updateFromElement()

void RenderFrame::viewCleared()
{
HTMLFrameElement* frameElement = static_cast<HTMLFrameElement*>(frameOwnerElement());
if (!frameElement || !widget() || !widget()->isFrameView())
if (!widget() || !widget()->isFrameView())
return;

FrameView* view = toFrameView(widget());

int marginWidth = frameElement->marginWidth();
int marginHeight = frameElement->marginHeight();
int marginWidth = frameElement().marginWidth();
int marginHeight = frameElement().marginHeight();

if (marginWidth != -1)
view->setMarginWidth(marginWidth);
Expand Down
12 changes: 7 additions & 5 deletions Source/WebCore/rendering/RenderFrame.h
Expand Up @@ -32,17 +32,19 @@ class HTMLFrameElement;

class RenderFrame FINAL : public RenderFrameBase {
public:
explicit RenderFrame(HTMLFrameElement*);
explicit RenderFrame(HTMLFrameElement&);

HTMLFrameElement& frameElement() const;
FrameEdgeInfo edgeInfo() const;

private:
virtual const char* renderName() const { return "RenderFrame"; }
virtual bool isFrame() const { return true; }
void frameOwnerElement() const WTF_DELETED_FUNCTION;

virtual void updateFromElement();
virtual const char* renderName() const OVERRIDE { return "RenderFrame"; }
virtual bool isFrame() const OVERRIDE { return true; }

virtual void viewCleared();
virtual void updateFromElement() OVERRIDE;
virtual void viewCleared() OVERRIDE;
};

inline RenderFrame* toRenderFrame(RenderObject* object)
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/rendering/RenderFrameBase.cpp
Expand Up @@ -33,7 +33,7 @@

namespace WebCore {

RenderFrameBase::RenderFrameBase(HTMLFrameElementBase* element)
RenderFrameBase::RenderFrameBase(HTMLFrameElementBase& element)
: RenderWidget(element)
{
}
Expand Down Expand Up @@ -72,7 +72,7 @@ void RenderFrameBase::layoutWithFlattening(bool hasFixedWidth, bool hasFixedHeig
// we obey them and do not expand. With frame flattening
// no subframe much ever become scrollable.

bool isScrollable = frameOwnerElement()->scrollingMode() != ScrollbarAlwaysOff;
bool isScrollable = frameOwnerElement().scrollingMode() != ScrollbarAlwaysOff;

// consider iframe inset border
int hBorder = borderLeft() + borderRight();
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderFrameBase.h
Expand Up @@ -35,7 +35,7 @@ class HTMLFrameElementBase;
// Base class for RenderFrame and RenderIFrame
class RenderFrameBase : public RenderWidget {
protected:
explicit RenderFrameBase(HTMLFrameElementBase*);
explicit RenderFrameBase(HTMLFrameElementBase&);

public:
void layoutWithFlattening(bool fixedWidth, bool fixedHeight);
Expand Down

0 comments on commit 7dc9e1a

Please sign in to comment.