Index: Source/web/WebRemoteFrameImpl.cpp |
diff --git a/Source/web/WebRemoteFrameImpl.cpp b/Source/web/WebRemoteFrameImpl.cpp |
index 12bc07a2ec9b0382bd6056d26758ead1eb82bbf5..e51c6fc3ef2d6b65c4b62a11792a6c66fc28b582 100644 |
--- a/Source/web/WebRemoteFrameImpl.cpp |
+++ b/Source/web/WebRemoteFrameImpl.cpp |
@@ -11,10 +11,96 @@ |
#include "public/web/WebDocument.h" |
#include "public/web/WebPerformance.h" |
#include "public/web/WebRange.h" |
+#include "web/WebLocalFrameImpl.h" |
+#include "web/WebViewImpl.h" |
#include <v8/include/v8.h> |
+using namespace WebCore; |
+ |
namespace blink { |
+namespace { |
+ |
+class RemoteBridgeFrameOwner : public FrameOwner { |
+public: |
+ explicit RemoteBridgeFrameOwner(PassRefPtr<WebLocalFrameImpl>); |
+ |
+ virtual bool isLocal() const OVERRIDE; |
+ virtual void setContentFrame(Frame&) OVERRIDE; |
+ virtual void clearContentFrame() OVERRIDE; |
+ virtual SandboxFlags sandboxFlags() const OVERRIDE; |
+ virtual void dispatchLoad() OVERRIDE; |
+ |
+private: |
+ RefPtr<WebLocalFrameImpl> m_frame; |
+}; |
+ |
+RemoteBridgeFrameOwner::RemoteBridgeFrameOwner(PassRefPtr<WebLocalFrameImpl> frame) |
+ : m_frame(frame) |
+{ |
+} |
+ |
+bool RemoteBridgeFrameOwner::isLocal() const |
+{ |
+ return false; |
+} |
+ |
+void RemoteBridgeFrameOwner::setContentFrame(Frame&) |
+{ |
+} |
+ |
+void RemoteBridgeFrameOwner::clearContentFrame() |
+{ |
+ delete this; |
abarth-chromium
2014/06/13 18:06:46
delete this -> :(
Is there really no object that
|
+} |
+ |
+SandboxFlags RemoteBridgeFrameOwner::sandboxFlags() const |
+{ |
+ // FIXME: Implement. Most likely grab it from m_frame. |
+ return 0; |
+} |
+ |
+void RemoteBridgeFrameOwner::dispatchLoad() |
+{ |
+ // FIXME: Implement. Most likely goes through m_frame->client(). |
+} |
+ |
+class PlaceholderFrameOwner : public FrameOwner { |
+public: |
+ virtual bool isLocal() const OVERRIDE; |
+ virtual void setContentFrame(Frame&) OVERRIDE; |
+ virtual void clearContentFrame() OVERRIDE; |
+ virtual SandboxFlags sandboxFlags() const OVERRIDE; |
+ virtual void dispatchLoad() OVERRIDE; |
+}; |
+ |
+bool PlaceholderFrameOwner::isLocal() const |
+{ |
+ return false; |
+} |
+ |
+void PlaceholderFrameOwner::setContentFrame(Frame&) |
+{ |
+} |
+ |
+void PlaceholderFrameOwner::clearContentFrame() |
+{ |
+ delete this; |
abarth-chromium
2014/06/13 18:06:46
ditto
|
+} |
+ |
+SandboxFlags PlaceholderFrameOwner::sandboxFlags() const |
+{ |
+ ASSERT_NOT_REACHED(); |
+ return 0; |
+} |
+ |
+void PlaceholderFrameOwner::dispatchLoad() |
+{ |
+ ASSERT_NOT_REACHED(); |
+} |
+ |
+} // namespace |
+ |
WebRemoteFrame* WebRemoteFrame::create(WebFrameClient*) |
{ |
return adoptRef(new WebRemoteFrameImpl()).leakRef(); |
@@ -162,6 +248,12 @@ WebView* WebRemoteFrameImpl::view() const |
return 0; |
} |
+void WebRemoteFrameImpl::initializeAsMainFrame(WebView* view) |
+{ |
+ Page* page = toWebViewImpl(view)->page(); |
+ setWebCoreFrame(RemoteFrame::create(&m_frameClient, &page->frameHost(), 0)); |
+} |
+ |
WebFrame* WebRemoteFrameImpl::traversePrevious(bool wrap) const |
{ |
ASSERT_NOT_REACHED(); |
@@ -722,5 +814,35 @@ WebString WebRemoteFrameImpl::layerTreeAsText(bool showDebugInfo) const |
return WebString(); |
} |
+WebLocalFrame* WebRemoteFrameImpl::createLocalChild(const WebString& name, WebFrameClient* client) |
+{ |
+ WebLocalFrameImpl* child = toWebLocalFrameImpl(WebLocalFrame::create(client)); |
+ 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 |
+ // frame creation, and one from swapping it into the remote process). FrameLoader might |
+ // need a special initialization function for this case to avoid that duplicate navigation. |
+ child->initializeAsChildFrame(frame()->host(), new RemoteBridgeFrameOwner(child), name, AtomicString()); |
abarth-chromium
2014/06/13 18:06:46
adoptPtr(new RemoteBridgeFrameOwner(... ?
|
+ // Partially related with the above FIXME--the init() call may trigger JS dispatch. However, |
+ // if the parent is remote, it should never be detached synchronously... |
+ ASSERT(child->frame()); |
+ return child; |
+} |
+ |
+WebRemoteFrame* WebRemoteFrameImpl::createRemoteChild(const WebString& name, WebFrameClient* client) |
+{ |
+ WebRemoteFrameImpl* child = toWebRemoteFrameImpl(WebRemoteFrame::create(client)); |
+ appendChild(child); |
+ RefPtr<RemoteFrame> childFrame = RemoteFrame::create(&child->m_frameClient, frame()->host(), new PlaceholderFrameOwner); |
+ child->setWebCoreFrame(childFrame); |
+ childFrame->tree().setName(name, AtomicString()); |
+ return child; |
+} |
+ |
+void WebRemoteFrameImpl::setWebCoreFrame(PassRefPtr<RemoteFrame> frame) |
+{ |
+ m_frame = frame; |
+} |
+ |
} // namespace blink |