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

Unified Diff: Source/web/WebLocalFrameImpl.cpp

Issue 517043003: Move Frame to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Back out non-Oilpan experiment + tidy up by adding frame() ref accessors 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 side-by-side diff with in-line comments
Download patch
Index: Source/web/WebLocalFrameImpl.cpp
diff --git a/Source/web/WebLocalFrameImpl.cpp b/Source/web/WebLocalFrameImpl.cpp
index c2c2e5b9e04606a0e2265e03f990d8167938a114..7ebb33a7e731cabca0d0df1e763a80dc5b17293f 100644
--- a/Source/web/WebLocalFrameImpl.cpp
+++ b/Source/web/WebLocalFrameImpl.cpp
@@ -49,7 +49,20 @@
// From the perspective of the embedder, WebFrame is simply an object that it
// allocates by calling WebFrame::create() and must be freed by calling close().
// Internally, WebFrame is actually refcounted and it holds a reference to its
-// corresponding LocalFrame in WebCore.
+// corresponding LocalFrame in blink.
+//
+// Oilpan: the middle objects + Page in the above diagram are Oilpan heap allocated,
+// WebView and FrameView are currently not. In terms of ownership and control, the
+// relationships stays the same, but the references from the off-heap WebView to the
+// on-heap Page is handled by a Persistent<>, not a RefPtr<>. Similarly, the mutual
+// strong references between the on-heap LocalFrame and the off-heap FrameView
+// is through a RefPtr (from LocalFrame to FrameView), and a Persistent refers
+// to the LocalFrame in the other direction.
+//
+// From the embedder's point of view, the use of Oilpan brings no changes. close()
+// must still be used to signal that the embedder is through with the WebFrame.
+// Calling it will bring about the release and finalization of the frame object,
+// and everything underneath.
//
// How frames are destroyed
// ------------------------
@@ -66,7 +79,7 @@
// detached. Most embedders will invoke close() on the WebFrame at this point,
// triggering its deletion unless something else is still retaining a reference.
//
-// Thie client is expected to be set whenever the WebLocalFrameImpl is attached to
+// The client is expected to be set whenever the WebLocalFrameImpl is attached to
// the DOM.
#include "config.h"
@@ -498,7 +511,11 @@ void WebLocalFrameImpl::close()
{
m_client = 0;
+#if ENABLE(OILPAN)
+ m_selfKeepAlive.clear();
+#else
deref(); // Balances ref() acquired in WebFrame::create
+#endif
}
WebString WebLocalFrameImpl::uniqueName() const
@@ -1527,7 +1544,12 @@ WebLocalFrame* WebLocalFrame::create(WebFrameClient* client)
WebLocalFrameImpl* WebLocalFrameImpl::create(WebFrameClient* client)
{
- return adoptRef(new WebLocalFrameImpl(client)).leakRef();
+ WebLocalFrameImpl* frame = new WebLocalFrameImpl(client);
+#if ENABLE(OILPAN)
+ return frame;
+#else
+ return adoptRef(frame).leakRef();
+#endif
}
WebLocalFrameImpl::WebLocalFrameImpl(WebFrameClient* client)
@@ -1537,6 +1559,9 @@ WebLocalFrameImpl::WebLocalFrameImpl(WebFrameClient* client)
, m_inputEventsScaleFactorForEmulation(1)
, m_userMediaClientImpl(this)
, m_geolocationClientProxy(GeolocationClientProxy::create(client ? client->geolocationClient() : 0))
+#if ENABLE(OILPAN)
+ , m_selfKeepAlive(this)
+#endif
{
Platform::current()->incrementStatsCounter(webFrameActiveCount);
frameCount++;
@@ -1550,7 +1575,18 @@ WebLocalFrameImpl::~WebLocalFrameImpl()
cancelPendingScopingEffort();
}
-void WebLocalFrameImpl::setCoreFrame(PassRefPtr<LocalFrame> frame)
+void WebLocalFrameImpl::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_frame);
+ visitor->trace(m_printContext);
+ visitor->trace(m_geolocationClientProxy);
+
+ WebFrame::traceChildren(visitor, this);
+#endif
+}
+
+void WebLocalFrameImpl::setCoreFrame(PassRefPtrWillBeRawPtr<LocalFrame> frame)
{
m_frame = frame;
@@ -1573,9 +1609,9 @@ void WebLocalFrameImpl::setCoreFrame(PassRefPtr<LocalFrame> frame)
}
}
-PassRefPtr<LocalFrame> WebLocalFrameImpl::initializeCoreFrame(FrameHost* host, FrameOwner* owner, const AtomicString& name, const AtomicString& fallbackName)
+PassRefPtrWillBeRawPtr<LocalFrame> WebLocalFrameImpl::initializeCoreFrame(FrameHost* host, FrameOwner* owner, const AtomicString& name, const AtomicString& fallbackName)
{
- RefPtr<LocalFrame> frame = LocalFrame::create(&m_frameLoaderClientImpl, host, owner);
+ RefPtrWillBeRawPtr<LocalFrame> frame = LocalFrame::create(&m_frameLoaderClientImpl, host, owner);
setCoreFrame(frame);
frame->tree().setName(name, fallbackName);
// We must call init() after m_frame is assigned because it is referenced
@@ -1585,7 +1621,7 @@ PassRefPtr<LocalFrame> WebLocalFrameImpl::initializeCoreFrame(FrameHost* host, F
return frame;
}
-PassRefPtr<LocalFrame> WebLocalFrameImpl::createChildFrame(const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement)
+PassRefPtrWillBeRawPtr<LocalFrame> WebLocalFrameImpl::createChildFrame(const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement)
{
ASSERT(m_client);
WebLocalFrameImpl* webframeChild = toWebLocalFrameImpl(m_client->createChildFrame(this, request.frameName()));
@@ -1596,7 +1632,7 @@ PassRefPtr<LocalFrame> WebLocalFrameImpl::createChildFrame(const FrameLoadReques
// solution. subResourceAttributeName returns just one attribute name. The
// element might not have the attribute, and there might be other attributes
// which can identify the element.
- RefPtr<LocalFrame> child = webframeChild->initializeCoreFrame(frame()->host(), ownerElement, request.frameName(), ownerElement->getAttribute(ownerElement->subResourceAttributeName()));
+ RefPtrWillBeRawPtr<LocalFrame> child = webframeChild->initializeCoreFrame(frame()->host(), ownerElement, request.frameName(), ownerElement->getAttribute(ownerElement->subResourceAttributeName()));
// Initializing the core frame may cause the new child to be detached, since
// it may dispatch a load event in the parent.
if (!child->tree().parent())

Powered by Google App Engine
This is Rietveld 408576698