| Index: Source/web/WebRemoteFrameImpl.cpp
|
| diff --git a/Source/web/WebRemoteFrameImpl.cpp b/Source/web/WebRemoteFrameImpl.cpp
|
| index faa3ceb9595cc9bca82ef3ed2f1a89178767db69..2d2f69518c2eff0627d5f64538453d72bcb9e60f 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,7 +110,12 @@ void PlaceholderFrameOwner::dispatchLoad()
|
|
|
| WebRemoteFrame* WebRemoteFrame::create(WebFrameClient*)
|
| {
|
| - return adoptRef(new WebRemoteFrameImpl()).leakRef();
|
| + WebRemoteFrameImpl* frame = new WebRemoteFrameImpl();
|
| +#if ENABLE(OILPAN)
|
| + return frame;
|
| +#else
|
| + return adoptRef(frame).leakRef();
|
| +#endif
|
| }
|
|
|
| WebRemoteFrameImpl::WebRemoteFrameImpl()
|
| @@ -106,6 +127,16 @@ WebRemoteFrameImpl::~WebRemoteFrameImpl()
|
| {
|
| }
|
|
|
| +void WebRemoteFrameImpl::trace(Visitor* visitor)
|
| +{
|
| +#if ENABLE(OILPAN)
|
| + visitor->trace(m_frame);
|
| + visitor->trace(m_ownersForChildren);
|
| +
|
| + WebFrame::trace(visitor, this);
|
| +#endif
|
| +}
|
| +
|
| bool WebRemoteFrameImpl::isWebLocalFrame() const
|
| {
|
| return false;
|
| @@ -129,7 +160,12 @@ WebRemoteFrame* WebRemoteFrameImpl::toWebRemoteFrame()
|
|
|
| void WebRemoteFrameImpl::close()
|
| {
|
| +#if ENABLE(OILPAN)
|
| + if (m_frame)
|
| + m_frame->setHasBeenClosed();
|
| +#else
|
| deref();
|
| +#endif
|
| }
|
|
|
| WebString WebRemoteFrameImpl::uniqueName() const
|
| @@ -791,8 +827,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
|
| @@ -814,14 +850,14 @@ void WebRemoteFrameImpl::initializeCoreFrame(FrameHost* host, FrameOwner* owner,
|
| WebRemoteFrame* WebRemoteFrameImpl::createRemoteChild(const WebString& name, WebFrameClient* 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;
|
| }
|
| @@ -834,4 +870,3 @@ WebRemoteFrameImpl* WebRemoteFrameImpl::fromFrame(RemoteFrame& frame)
|
| }
|
|
|
| } // namespace blink
|
| -
|
|
|