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

Unified Diff: Source/web/WebRemoteFrameImpl.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/WebRemoteFrameImpl.cpp
diff --git a/Source/web/WebRemoteFrameImpl.cpp b/Source/web/WebRemoteFrameImpl.cpp
index 6bb811146337a1dbdf913f1fe46aaeea58f9e8de..ddd1552ed65134b927d39c4eb5d2d695ba96b064 100644
--- a/Source/web/WebRemoteFrameImpl.cpp
+++ b/Source/web/WebRemoteFrameImpl.cpp
@@ -9,6 +9,7 @@
#include "core/frame/RemoteFrame.h"
#include "core/frame/Settings.h"
#include "core/page/Page.h"
+#include "platform/heap/Handle.h"
#include "public/platform/WebFloatRect.h"
#include "public/platform/WebRect.h"
#include "public/web/WebDocument.h"
@@ -27,23 +28,37 @@ namespace {
// 1. Allows the local frame's loader to retrieve sandbox flags associated with
// its owner element in another process.
// 2. Trigger a load event on its owner element once it finishes a load.
-class RemoteBridgeFrameOwner : public FrameOwner {
+class RemoteBridgeFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<RemoteBridgeFrameOwner>, public FrameOwner {
+ WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(RemoteBridgeFrameOwner);
public:
- explicit RemoteBridgeFrameOwner(PassRefPtr<WebLocalFrameImpl>);
+ static PassOwnPtrWillBeRawPtr<RemoteBridgeFrameOwner> create(PassRefPtrWillBeRawPtr<WebLocalFrameImpl> frame)
+ {
+ return adoptPtrWillBeNoop(new RemoteBridgeFrameOwner(frame));
+ }
virtual bool isLocal() const OVERRIDE;
virtual SandboxFlags sandboxFlags() const OVERRIDE;
virtual void dispatchLoad() OVERRIDE;
+ virtual void trace(Visitor*);
+
private:
- RefPtr<WebLocalFrameImpl> m_frame;
+ explicit RemoteBridgeFrameOwner(PassRefPtrWillBeRawPtr<WebLocalFrameImpl>);
+
+ RefPtrWillBeMember<WebLocalFrameImpl> m_frame;
};
-RemoteBridgeFrameOwner::RemoteBridgeFrameOwner(PassRefPtr<WebLocalFrameImpl> frame)
+RemoteBridgeFrameOwner::RemoteBridgeFrameOwner(PassRefPtrWillBeRawPtr<WebLocalFrameImpl> frame)
: m_frame(frame)
{
}
+void RemoteBridgeFrameOwner::trace(Visitor* visitor)
+{
+ visitor->trace(m_frame);
+ FrameOwner::trace(visitor);
+}
+
bool RemoteBridgeFrameOwner::isLocal() const
{
return false;
@@ -67,7 +82,8 @@ void RemoteBridgeFrameOwner::dispatchLoad()
// the RemoteFrame itself load a document). In most circumstances, the check for
// frame->owner() can be replaced with a check for frame->tree().parent(). Once
// that's done, this class can be removed.
-class PlaceholderFrameOwner : public FrameOwner {
+class PlaceholderFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<PlaceholderFrameOwner>, public FrameOwner {
+ WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(PlaceholderFrameOwner);
public:
virtual bool isLocal() const OVERRIDE;
virtual SandboxFlags sandboxFlags() const OVERRIDE;
@@ -94,12 +110,20 @@ void PlaceholderFrameOwner::dispatchLoad()
WebRemoteFrame* WebRemoteFrame::create(WebRemoteFrameClient* client)
{
- return adoptRef(new WebRemoteFrameImpl(client)).leakRef();
+ WebRemoteFrameImpl* frame = new WebRemoteFrameImpl(client);
+#if ENABLE(OILPAN)
+ return frame;
+#else
+ return adoptRef(frame).leakRef();
+#endif
}
WebRemoteFrameImpl::WebRemoteFrameImpl(WebRemoteFrameClient* client)
: m_frameClient(this)
, m_client(client)
+#if ENABLE(OILPAN)
+ , m_selfKeepAlive(this)
+#endif
{
}
@@ -107,6 +131,16 @@ WebRemoteFrameImpl::~WebRemoteFrameImpl()
{
}
+void WebRemoteFrameImpl::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_frame);
+ visitor->trace(m_ownersForChildren);
+
+ WebFrame::traceChildren(visitor, this);
+#endif
+}
+
bool WebRemoteFrameImpl::isWebLocalFrame() const
{
return false;
@@ -130,7 +164,11 @@ WebRemoteFrame* WebRemoteFrameImpl::toWebRemoteFrame()
void WebRemoteFrameImpl::close()
{
+#if ENABLE(OILPAN)
+ m_selfKeepAlive.clear();
+#else
deref();
+#endif
}
WebString WebRemoteFrameImpl::uniqueName() const
@@ -244,6 +282,13 @@ WebView* WebRemoteFrameImpl::view() const
return WebViewImpl::fromPage(frame()->page());
}
+WebViewImpl* WebRemoteFrameImpl::viewImpl() const
+{
+ if (!frame())
+ return 0;
+ return WebViewImpl::fromPage(frame()->page());
+}
+
void WebRemoteFrameImpl::removeChild(WebFrame* frame)
{
WebFrame::removeChild(frame);
@@ -792,8 +837,8 @@ WebString WebRemoteFrameImpl::layerTreeAsText(bool showDebugInfo) const
WebLocalFrame* WebRemoteFrameImpl::createLocalChild(const WebString& name, WebFrameClient* client)
{
WebLocalFrameImpl* child = toWebLocalFrameImpl(WebLocalFrame::create(client));
- HashMap<WebFrame*, OwnPtr<FrameOwner> >::AddResult result =
- m_ownersForChildren.add(child, adoptPtr(new RemoteBridgeFrameOwner(child)));
+ WillBeHeapHashMap<WebFrame*, OwnPtrWillBeMember<FrameOwner> >::AddResult result =
+ m_ownersForChildren.add(child, RemoteBridgeFrameOwner::create(child));
appendChild(child);
// FIXME: currently this calls LocalFrame::init() on the created LocalFrame, which may
// result in the browser observing two navigations to about:blank (one from the initial
@@ -815,14 +860,14 @@ void WebRemoteFrameImpl::initializeCoreFrame(FrameHost* host, FrameOwner* owner,
WebRemoteFrame* WebRemoteFrameImpl::createRemoteChild(const WebString& name, WebRemoteFrameClient* client)
{
WebRemoteFrameImpl* child = toWebRemoteFrameImpl(WebRemoteFrame::create(client));
- HashMap<WebFrame*, OwnPtr<FrameOwner> >::AddResult result =
- m_ownersForChildren.add(child, adoptPtr(new PlaceholderFrameOwner));
+ WillBeHeapHashMap<WebFrame*, OwnPtrWillBeMember<FrameOwner> >::AddResult result =
+ m_ownersForChildren.add(child, adoptPtrWillBeNoop(new PlaceholderFrameOwner));
appendChild(child);
child->initializeCoreFrame(frame()->host(), result.storedValue->value.get(), name);
return child;
}
-void WebRemoteFrameImpl::setCoreFrame(PassRefPtr<RemoteFrame> frame)
+void WebRemoteFrameImpl::setCoreFrame(PassRefPtrWillBeRawPtr<RemoteFrame> frame)
{
m_frame = frame;
}

Powered by Google App Engine
This is Rietveld 408576698