Index: Source/core/html/HTMLFrameOwnerElement.cpp |
diff --git a/Source/core/html/HTMLFrameOwnerElement.cpp b/Source/core/html/HTMLFrameOwnerElement.cpp |
index 20774db3cc50b436864598b568014e034aa8c0d2..b5bc211f1161d5d34b8a22554825ffd0db4f320a 100644 |
--- a/Source/core/html/HTMLFrameOwnerElement.cpp |
+++ b/Source/core/html/HTMLFrameOwnerElement.cpp |
@@ -89,8 +89,13 @@ void HTMLFrameOwnerElement::disconnectContentFrame() |
HTMLFrameOwnerElement::~HTMLFrameOwnerElement() |
{ |
- if (m_contentFrame) |
+ if (m_contentFrame) { |
+ RenderObject* renderObject = renderer(); |
+ if (renderObject && renderObject->isWidget() && m_widget) |
+ toRenderWidget(renderObject)->detachWidget(m_widget.get()); |
+ |
m_contentFrame->disconnectOwnerElement(); |
+ } |
} |
Document* HTMLFrameOwnerElement::contentDocument() const |
@@ -121,6 +126,27 @@ SVGDocument* HTMLFrameOwnerElement::getSVGDocument(ExceptionState& exceptionStat |
return 0; |
} |
+void HTMLFrameOwnerElement::setWidget(PassRefPtr<Widget> widget) |
+{ |
+ if (widget == m_widget) |
+ return; |
+ |
+ RenderWidget* renderWidget = toRenderWidget(renderer()); |
+ |
+ if (renderWidget) |
+ renderWidget->detachWidget(m_widget.get()); |
+ |
+ m_widget = widget; |
+ |
+ if (renderWidget) |
+ renderWidget->attachWidget(m_widget.get()); |
+} |
+ |
+Widget* HTMLFrameOwnerElement::widget() const |
+{ |
+ return m_widget.get(); |
+} |
+ |
bool HTMLFrameOwnerElement::loadOrRedirectSubframe(const KURL& url, const AtomicString& frameName, bool lockBackForwardList) |
{ |
RefPtr<Frame> parentFrame = document().frame(); |
@@ -153,10 +179,9 @@ bool HTMLFrameOwnerElement::loadOrRedirectSubframe(const KURL& url, const Atomic |
// FIXME: Can we remove this entirely? m_isComplete normally gets set to false when a load is committed. |
childFrame->loader().started(); |
- RenderObject* renderObject = renderer(); |
FrameView* view = childFrame->view(); |
- if (renderObject && renderObject->isWidget() && view) |
- toRenderWidget(renderObject)->setWidget(view); |
+ if (view) |
+ setWidget(view); |
// Some loads are performed synchronously (e.g., about:blank and loads |
// cancelled by returning a null ResourceRequest from requestFromDelegate). |