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

Side by Side Diff: Source/core/html/HTMLFrameOwnerElement.cpp

Issue 517043003: Move Frame to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add LocalFrame::detachView() + more Oilpan frame finalization comments Created 6 years, 3 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 parent->addChild(child); 91 parent->addChild(child);
92 else if (toScrollView(child->parent())) 92 else if (toScrollView(child->parent()))
93 toScrollView(child->parent())->removeChild(child); 93 toScrollView(child->parent())->removeChild(child);
94 return; 94 return;
95 } 95 }
96 widgetNewParentMap().set(child, parent); 96 widgetNewParentMap().set(child, parent);
97 } 97 }
98 98
99 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tagName, Docum ent& document) 99 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tagName, Docum ent& document)
100 : HTMLElement(tagName, document) 100 : HTMLElement(tagName, document)
101 , m_contentFrame(0) 101 , m_contentFrame(nullptr)
102 , m_widget(nullptr) 102 , m_widget(nullptr)
103 , m_sandboxFlags(SandboxNone) 103 , m_sandboxFlags(SandboxNone)
104 { 104 {
105 } 105 }
106 106
107 RenderPart* HTMLFrameOwnerElement::renderPart() const 107 RenderPart* HTMLFrameOwnerElement::renderPart() const
108 { 108 {
109 // HTMLObjectElement and HTMLEmbedElement may return arbitrary renderers 109 // HTMLObjectElement and HTMLEmbedElement may return arbitrary renderers
110 // when using fallback content. 110 // when using fallback content.
111 if (!renderer() || !renderer()->isRenderPart()) 111 if (!renderer() || !renderer()->isRenderPart())
(...skipping 11 matching lines...) Expand all
123 123
124 for (ContainerNode* node = this; node; node = node->parentOrShadowHostNode() ) 124 for (ContainerNode* node = this; node; node = node->parentOrShadowHostNode() )
125 node->incrementConnectedSubframeCount(); 125 node->incrementConnectedSubframeCount();
126 } 126 }
127 127
128 void HTMLFrameOwnerElement::clearContentFrame() 128 void HTMLFrameOwnerElement::clearContentFrame()
129 { 129 {
130 if (!m_contentFrame) 130 if (!m_contentFrame)
131 return; 131 return;
132 132
133 m_contentFrame = 0; 133 m_contentFrame = nullptr;
134 134
135 for (ContainerNode* node = this; node; node = node->parentOrShadowHostNode() ) 135 for (ContainerNode* node = this; node; node = node->parentOrShadowHostNode() )
136 node->decrementConnectedSubframeCount(); 136 node->decrementConnectedSubframeCount();
137 } 137 }
138 138
139 void HTMLFrameOwnerElement::disconnectContentFrame() 139 void HTMLFrameOwnerElement::disconnectContentFrame()
140 { 140 {
141 // FIXME: Currently we don't do this in removedFrom because this causes an 141 // FIXME: Currently we don't do this in removedFrom because this causes an
142 // unload event in the subframe which could execute script that could then 142 // unload event in the subframe which could execute script that could then
143 // reach up into this document and then attempt to look back down. We should 143 // reach up into this document and then attempt to look back down. We should
144 // see if this behavior is really needed as Gecko does not allow this. 144 // see if this behavior is really needed as Gecko does not allow this.
145 if (Frame* frame = contentFrame()) { 145 if (RefPtrWillBeRawPtr<Frame> frame = contentFrame()) {
146 RefPtr<Frame> protect(frame);
147 frame->detach(); 146 frame->detach();
147 #if ENABLE(OILPAN)
148 // FIXME: Oilpan: the plugin container is released and finalized here
149 // in order to work around the current inability to make the plugin
150 // container a FrameDestructionObserver (it needs to effectively be on
151 // the heap, and Widget isn't). Hence, release it here while its
152 // frame reference is still valid.
153 //
154 // As yet unknown if we can "get away" with releasing it slightly earlie r..
Mads Ager (chromium) 2014/09/16 12:17:45 How do we resolve this one? No tests failing I ass
sof 2014/09/17 09:42:58 Yes, destruction shouldn't be far off regardless.
155 if (m_widget && m_widget->isPluginContainer())
156 m_widget = nullptr;
157 #endif
148 frame->disconnectOwnerElement(); 158 frame->disconnectOwnerElement();
149 } 159 }
150 } 160 }
151 161
152 HTMLFrameOwnerElement::~HTMLFrameOwnerElement() 162 HTMLFrameOwnerElement::~HTMLFrameOwnerElement()
153 { 163 {
164 #if ENABLE(OILPAN)
165 // An owner must by now have been informed of detachment
166 // when the frame was closed.
167 ASSERT(!m_contentFrame);
168 #else
154 if (m_contentFrame) 169 if (m_contentFrame)
155 m_contentFrame->disconnectOwnerElement(); 170 m_contentFrame->disconnectOwnerElement();
171 #endif
156 } 172 }
157 173
158 Document* HTMLFrameOwnerElement::contentDocument() const 174 Document* HTMLFrameOwnerElement::contentDocument() const
159 { 175 {
160 return (m_contentFrame && m_contentFrame->isLocalFrame()) ? toLocalFrame(m_c ontentFrame)->document() : 0; 176 return (m_contentFrame && m_contentFrame->isLocalFrame()) ? toLocalFrame(m_c ontentFrame)->document() : 0;
161 } 177 }
162 178
163 LocalDOMWindow* HTMLFrameOwnerElement::contentWindow() const 179 LocalDOMWindow* HTMLFrameOwnerElement::contentWindow() const
164 { 180 {
165 return m_contentFrame ? m_contentFrame->domWindow() : 0; 181 return m_contentFrame ? m_contentFrame->domWindow() : 0;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 cache->childrenChanged(renderWidget); 233 cache->childrenChanged(renderWidget);
218 } 234 }
219 235
220 Widget* HTMLFrameOwnerElement::ownedWidget() const 236 Widget* HTMLFrameOwnerElement::ownedWidget() const
221 { 237 {
222 return m_widget.get(); 238 return m_widget.get();
223 } 239 }
224 240
225 bool HTMLFrameOwnerElement::loadOrRedirectSubframe(const KURL& url, const Atomic String& frameName, bool lockBackForwardList) 241 bool HTMLFrameOwnerElement::loadOrRedirectSubframe(const KURL& url, const Atomic String& frameName, bool lockBackForwardList)
226 { 242 {
227 RefPtr<LocalFrame> parentFrame = document().frame(); 243 RefPtrWillBeRawPtr<LocalFrame> parentFrame = document().frame();
228 // FIXME(kenrb): The necessary semantics for RemoteFrames have not been work ed out yet, but this will likely need some logic to handle them. 244 // FIXME(kenrb): The necessary semantics for RemoteFrames have not been work ed out yet, but this will likely need some logic to handle them.
229 if (contentFrame() && contentFrame()->isLocalFrame()) { 245 if (contentFrame() && contentFrame()->isLocalFrame()) {
230 toLocalFrame(contentFrame())->navigationScheduler().scheduleLocationChan ge(&document(), url.string(), Referrer(document().outgoingReferrer(), document() .referrerPolicy()), lockBackForwardList); 246 toLocalFrame(contentFrame())->navigationScheduler().scheduleLocationChan ge(&document(), url.string(), Referrer(document().outgoingReferrer(), document() .referrerPolicy()), lockBackForwardList);
231 return true; 247 return true;
232 } 248 }
233 249
234 if (!document().securityOrigin()->canDisplay(url)) { 250 if (!document().securityOrigin()->canDisplay(url)) {
235 FrameLoader::reportLocalLoadFailed(parentFrame.get(), url.string()); 251 FrameLoader::reportLocalLoadFailed(parentFrame.get(), url.string());
236 return false; 252 return false;
237 } 253 }
238 254
239 if (!SubframeLoadingDisabler::canLoadFrame(*this)) 255 if (!SubframeLoadingDisabler::canLoadFrame(*this))
240 return false; 256 return false;
241 257
242 String referrer = SecurityPolicy::generateReferrerHeader(document().referrer Policy(), url, document().outgoingReferrer()); 258 String referrer = SecurityPolicy::generateReferrerHeader(document().referrer Policy(), url, document().outgoingReferrer());
243 return parentFrame->loader().client()->createFrame(url, frameName, Referrer( referrer, document().referrerPolicy()), this); 259 return parentFrame->loader().client()->createFrame(url, frameName, Referrer( referrer, document().referrerPolicy()), this);
244 } 260 }
245 261
262 void HTMLFrameOwnerElement::trace(Visitor* visitor)
263 {
264 visitor->trace(m_contentFrame);
265 HTMLElement::trace(visitor);
266 FrameOwner::trace(visitor);
267 }
268
246 269
247 } // namespace blink 270 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698