blob: dcd5e97711296794a39a7aa1ce1740e968340114 [file] [log] [blame]
// 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 "web/RemoteFrameClientImpl.h"
#include "core/events/KeyboardEvent.h"
#include "core/events/MouseEvent.h"
#include "core/events/WheelEvent.h"
#include "core/frame/RemoteFrame.h"
#include "core/frame/RemoteFrameView.h"
#include "core/rendering/RenderPart.h"
#include "platform/exported/WrappedResourceRequest.h"
#include "platform/weborigin/SecurityOrigin.h"
#include "platform/weborigin/SecurityPolicy.h"
#include "public/web/WebRemoteFrameClient.h"
#include "web/WebInputEventConversion.h"
#include "web/WebLocalFrameImpl.h"
#include "web/WebRemoteFrameImpl.h"
namespace blink {
RemoteFrameClientImpl::RemoteFrameClientImpl(WebRemoteFrameImpl* webFrame)
: m_webFrame(webFrame)
{
}
void RemoteFrameClientImpl::detached()
{
// Alert the client that the frame is being detached.
RefPtrWillBeRawPtr<WebRemoteFrameImpl> protector(m_webFrame);
WebRemoteFrameClient* client = m_webFrame->client();
if (!client)
return;
client->frameDetached();
// Clear our reference to RemoteFrame at the very end, in case the client
// refers to it.
m_webFrame->setCoreFrame(nullptr);
}
Frame* RemoteFrameClientImpl::opener() const
{
return toCoreFrame(m_webFrame->opener());
}
void RemoteFrameClientImpl::setOpener(Frame*)
{
// FIXME: Implement.
}
Frame* RemoteFrameClientImpl::parent() const
{
return toCoreFrame(m_webFrame->parent());
}
Frame* RemoteFrameClientImpl::top() const
{
return toCoreFrame(m_webFrame->top());
}
Frame* RemoteFrameClientImpl::previousSibling() const
{
return toCoreFrame(m_webFrame->previousSibling());
}
Frame* RemoteFrameClientImpl::nextSibling() const
{
return toCoreFrame(m_webFrame->nextSibling());
}
Frame* RemoteFrameClientImpl::firstChild() const
{
return toCoreFrame(m_webFrame->firstChild());
}
Frame* RemoteFrameClientImpl::lastChild() const
{
return toCoreFrame(m_webFrame->lastChild());
}
bool RemoteFrameClientImpl::willCheckAndDispatchMessageEvent(
SecurityOrigin* target, MessageEvent* event, LocalFrame* sourceFrame) const
{
if (m_webFrame->client())
m_webFrame->client()->postMessageEvent(WebLocalFrameImpl::fromFrame(sourceFrame), m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
return true;
}
void RemoteFrameClientImpl::navigate(const ResourceRequest& request, bool shouldReplaceCurrentEntry)
{
if (m_webFrame->client())
m_webFrame->client()->navigate(WrappedResourceRequest(request), shouldReplaceCurrentEntry);
}
// FIXME: Remove this code once we have input routing in the browser
// process. See http://crbug.com/339659.
void RemoteFrameClientImpl::forwardInputEvent(Event* event)
{
// This is only called when we have out-of-process iframes, which
// need to forward input events across processes.
// FIXME: Add a check for out-of-process iframes enabled.
OwnPtr<WebInputEvent> webEvent;
if (event->isKeyboardEvent())
webEvent = adoptPtr(new WebKeyboardEventBuilder(*static_cast<KeyboardEvent*>(event)));
else if (event->isMouseEvent())
webEvent = adoptPtr(new WebMouseEventBuilder(m_webFrame->frame()->view(), toCoreFrame(m_webFrame)->ownerRenderer(), *static_cast<MouseEvent*>(event)));
else if (event->isWheelEvent())
webEvent = adoptPtr(new WebMouseWheelEventBuilder(m_webFrame->frame()->view(), toCoreFrame(m_webFrame)->ownerRenderer(), *static_cast<WheelEvent*>(event)));
// Other or internal Blink events should not be forwarded.
if (!webEvent || webEvent->type == WebInputEvent::Undefined)
return;
m_webFrame->client()->forwardInputEvent(webEvent.get());
}
} // namespace blink