1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/frame/RemoteFrame.h"
#include "core/dom/RemoteSecurityContext.h"
#include "core/frame/RemoteDOMWindow.h"
#include "core/frame/RemoteFrameClient.h"
#include "core/frame/RemoteFrameView.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "platform/weborigin/SecurityPolicy.h"
namespace blink {
inline RemoteFrame::RemoteFrame(RemoteFrameClient* client, FrameHost* host, FrameOwner* owner)
: Frame(client, host, owner)
, m_securityContext(RemoteSecurityContext::create())
, m_domWindow(RemoteDOMWindow::create(*this))
, m_isLoading(false)
{
}
PassRefPtrWillBeRawPtr<RemoteFrame> RemoteFrame::create(RemoteFrameClient* client, FrameHost* host, FrameOwner* owner)
{
return adoptRefWillBeNoop(new RemoteFrame(client, host, owner));
}
RemoteFrame::~RemoteFrame()
{
setView(nullptr);
}
void RemoteFrame::trace(Visitor* visitor)
{
visitor->trace(m_view);
visitor->trace(m_domWindow);
Frame::trace(visitor);
}
DOMWindow* RemoteFrame::domWindow() const
{
return m_domWindow.get();
}
void RemoteFrame::navigate(Document& originDocument, const KURL& url, bool lockBackForwardList)
{
// The process where this frame actually lives won't have sufficient information to determine
// correct referrer, since it won't have access to the originDocument. Set it now.
ResourceRequest request(url);
request.setHTTPReferrer(SecurityPolicy::generateReferrer(originDocument.referrerPolicy(), url, originDocument.outgoingReferrer()));
remoteFrameClient()->navigate(request, lockBackForwardList);
}
void RemoteFrame::reload(ReloadPolicy reloadPolicy, ClientRedirectPolicy clientRedirectPolicy)
{
remoteFrameClient()->reload(reloadPolicy, clientRedirectPolicy);
}
void RemoteFrame::detach()
{
detachChildren();
if (!client())
return;
Frame::detach();
}
RemoteSecurityContext* RemoteFrame::securityContext() const
{
return m_securityContext.get();
}
bool RemoteFrame::checkLoadComplete()
{
if (m_isLoading)
return false;
bool allChildrenAreDoneLoading = true;
for (RefPtrWillBeRawPtr<Frame> child = tree().firstChild(); child; child = child->tree().nextSibling()) {
allChildrenAreDoneLoading &= child->checkLoadComplete();
}
return allChildrenAreDoneLoading;
}
void RemoteFrame::forwardInputEvent(Event* event)
{
remoteFrameClient()->forwardInputEvent(event);
}
void RemoteFrame::setView(PassRefPtrWillBeRawPtr<RemoteFrameView> view)
{
// Oilpan: as RemoteFrameView performs no finalization actions,
// no explicit dispose() of it needed here. (cf. FrameView::dispose().)
m_view = view;
}
void RemoteFrame::createView()
{
RefPtrWillBeRawPtr<RemoteFrameView> view = RemoteFrameView::create(this);
setView(view);
if (ownerRenderer()) {
HTMLFrameOwnerElement* owner = deprecatedLocalOwner();
ASSERT(owner);
owner->setWidget(view);
}
}
RemoteFrameClient* RemoteFrame::remoteFrameClient() const
{
return static_cast<RemoteFrameClient*>(client());
}
} // namespace blink
|