зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1503655 part 2 - Remove unused and outdated code from RenderFrameParent. r=kats
This commit removes a bunch of cruft from RenderFrameParent that isn't used and isn't needed. Some functions that have no reason to be in RenderFrameParent are moved to TabParent in anticipation of the PRenderFrame protocol being dropped. Differential Revision: https://phabricator.services.mozilla.com/D10411 --HG-- extra : rebase_source : 79f830e0ad48e868480108c3bbb01e3faca5e70a extra : histedit_source : 4ddb361e4e4acae10ab16124b5d6548490f770ee
This commit is contained in:
Родитель
535b26ac9c
Коммит
529e74890b
|
@ -534,6 +534,11 @@ parent:
|
|||
*/
|
||||
async RemotePaintIsReady();
|
||||
|
||||
/**
|
||||
* Child informs the parent that a compositor transaction has ocurred.
|
||||
*/
|
||||
async NotifyCompositorTransaction();
|
||||
|
||||
/**
|
||||
* Child informs the parent that the content is ready to handle input
|
||||
* events. This is sent when the TabChild is created.
|
||||
|
|
|
@ -2923,7 +2923,7 @@ TabChild::NotifyPainted()
|
|||
if (!mNotified) {
|
||||
// Recording/replaying processes have a compositor but not a remote frame.
|
||||
if (!recordreplay::IsRecordingOrReplaying()) {
|
||||
mRemoteFrame->SendNotifyCompositorTransaction();
|
||||
SendNotifyCompositorTransaction();
|
||||
}
|
||||
mNotified = true;
|
||||
}
|
||||
|
@ -3302,7 +3302,7 @@ TabChild::RecvRequestNotifyAfterRemotePaint()
|
|||
|
||||
// Tell the CompositorBridgeChild that, when it gets a RemotePaintIsReady
|
||||
// message that it should forward it us so that we can bounce it to our
|
||||
// RenderFrameParent.
|
||||
// TabParent.
|
||||
compositor->RequestNotifyAfterRemotePaint(this);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
|
|
@ -641,7 +641,7 @@ TabParent::InitRenderFrame()
|
|||
MOZ_ASSERT(frameLoader);
|
||||
if (frameLoader) {
|
||||
RenderFrameParent* renderFrame = new RenderFrameParent(frameLoader);
|
||||
MOZ_ASSERT(renderFrame->IsInitted());
|
||||
MOZ_ASSERT(renderFrame->IsInitialized());
|
||||
layers::LayersId layersId = renderFrame->GetLayersId();
|
||||
AddTabParentToTable(layersId, this);
|
||||
if (!SendPRenderFrameConstructor(renderFrame)) {
|
||||
|
@ -1654,9 +1654,19 @@ TabParent::SendHandleTap(TapType aType,
|
|||
if (mIsDestroyed || !mIsReadyToHandleInputEvents) {
|
||||
return false;
|
||||
}
|
||||
if ((aType == TapType::eSingleTap || aType == TapType::eSecondTap) &&
|
||||
GetRenderFrame()) {
|
||||
GetRenderFrame()->TakeFocusForClickFromTap();
|
||||
if ((aType == TapType::eSingleTap || aType == TapType::eSecondTap)) {
|
||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (fm) {
|
||||
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
||||
if (frameLoader) {
|
||||
RefPtr<Element> element = frameLoader->GetOwnerContent();
|
||||
if (element) {
|
||||
fm->SetFocus(element, nsIFocusManager::FLAG_BYMOUSE |
|
||||
nsIFocusManager::FLAG_BYTOUCH |
|
||||
nsIFocusManager::FLAG_NOSCROLL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
LayoutDeviceIntPoint offset = GetChildProcessOffset();
|
||||
return Manager()->AsContentParent()->IsInputPriorityEventEnabled()
|
||||
|
@ -2604,7 +2614,7 @@ TabParent::AllocPRenderFrameParent()
|
|||
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
||||
|
||||
RenderFrameParent* rfp = new RenderFrameParent(frameLoader);
|
||||
if (rfp->IsInitted()) {
|
||||
if (rfp->IsInitialized()) {
|
||||
layers::LayersId layersId = rfp->GetLayersId();
|
||||
AddTabParentToTable(layersId, this);
|
||||
}
|
||||
|
@ -2632,7 +2642,7 @@ TabParent::SetRenderFrame(PRenderFrameParent* aRFParent)
|
|||
}
|
||||
|
||||
RenderFrameParent* renderFrame = static_cast<RenderFrameParent*>(aRFParent);
|
||||
bool success = renderFrame->Init(frameLoader);
|
||||
bool success = renderFrame->Initialize(frameLoader);
|
||||
if (!success) {
|
||||
return false;
|
||||
}
|
||||
|
@ -3184,6 +3194,30 @@ TabParent::RecvRemotePaintIsReady()
|
|||
return IPC_OK();
|
||||
}
|
||||
|
||||
mozilla::ipc::IPCResult
|
||||
TabParent::RecvNotifyCompositorTransaction()
|
||||
{
|
||||
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
||||
|
||||
if (!frameLoader) {
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
nsIFrame* docFrame = frameLoader->GetPrimaryFrameOfOwningContent();
|
||||
|
||||
if (!docFrame) {
|
||||
// Bad, but nothing we can do about it (XXX/cjones: or is there?
|
||||
// maybe bug 589337?). When the new frame is created, we'll
|
||||
// probably still be the current render frame and will get to draw
|
||||
// our content then. Or, we're shutting down and this update goes
|
||||
// to /dev/null.
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
docFrame->InvalidateLayer(DisplayItemType::TYPE_REMOTE);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
mozilla::ipc::IPCResult
|
||||
TabParent::RecvRemoteIsReadyToHandleInputEvents()
|
||||
{
|
||||
|
|
|
@ -626,6 +626,8 @@ protected:
|
|||
|
||||
virtual mozilla::ipc::IPCResult RecvRemotePaintIsReady() override;
|
||||
|
||||
virtual mozilla::ipc::IPCResult RecvNotifyCompositorTransaction() override;
|
||||
|
||||
virtual mozilla::ipc::IPCResult RecvRemoteIsReadyToHandleInputEvents() override;
|
||||
|
||||
virtual mozilla::ipc::IPCResult RecvPaintWhileInterruptingJSNoOp(const LayersObserverEpoch& aEpoch) override;
|
||||
|
|
|
@ -28,7 +28,6 @@ sync protocol PRenderFrame
|
|||
manager PBrowser;
|
||||
|
||||
parent:
|
||||
async NotifyCompositorTransaction();
|
||||
|
||||
async __delete__();
|
||||
};
|
||||
|
|
|
@ -6,34 +6,20 @@
|
|||
|
||||
#include "base/basictypes.h"
|
||||
|
||||
#include "BasicLayers.h"
|
||||
#include "gfxPrefs.h"
|
||||
#include "mozilla/BrowserElementParent.h"
|
||||
#include "mozilla/EventForwards.h" // for Modifiers
|
||||
#include "mozilla/ViewportFrame.h"
|
||||
#include "mozilla/dom/ContentChild.h"
|
||||
#include "mozilla/dom/ContentParent.h"
|
||||
#include "mozilla/dom/Element.h"
|
||||
#include "mozilla/dom/TabChild.h"
|
||||
#include "mozilla/dom/TabParent.h"
|
||||
#include "mozilla/layers/CompositorBridgeParent.h"
|
||||
#include "mozilla/layers/CompositorTypes.h"
|
||||
#include "mozilla/layers/LayerTransactionParent.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsFocusManager.h"
|
||||
#include "nsFrameLoader.h"
|
||||
#include "nsIObserver.h"
|
||||
#include "nsStyleStructInlines.h"
|
||||
#include "nsSubDocumentFrame.h"
|
||||
#include "nsView.h"
|
||||
#include "RenderFrameParent.h"
|
||||
#include "mozilla/gfx/GPUProcessManager.h"
|
||||
#include "mozilla/layers/LayerManagerComposite.h"
|
||||
#include "mozilla/layers/CompositorBridgeChild.h"
|
||||
#include "mozilla/layers/WebRenderLayerManager.h"
|
||||
#include "mozilla/layers/WebRenderScrollData.h"
|
||||
#include "mozilla/webrender/WebRenderAPI.h"
|
||||
#include "ClientLayerManager.h"
|
||||
#include "FrameLayerBuilder.h"
|
||||
|
||||
using namespace mozilla::dom;
|
||||
using namespace mozilla::gfx;
|
||||
|
@ -42,39 +28,6 @@ using namespace mozilla::layers;
|
|||
namespace mozilla {
|
||||
namespace layout {
|
||||
|
||||
typedef ScrollableLayerGuid::ViewID ViewID;
|
||||
|
||||
/**
|
||||
* Gets the layer-pixel offset of aContainerFrame's content rect top-left
|
||||
* from the nearest display item reference frame (which we assume will be inducing
|
||||
* a ContainerLayer).
|
||||
*/
|
||||
static LayoutDeviceIntPoint
|
||||
GetContentRectLayerOffset(nsIFrame* aContainerFrame, nsDisplayListBuilder* aBuilder)
|
||||
{
|
||||
nscoord auPerDevPixel = aContainerFrame->PresContext()->AppUnitsPerDevPixel();
|
||||
|
||||
// Offset to the content rect in case we have borders or padding
|
||||
// Note that aContainerFrame could be a reference frame itself, so
|
||||
// we need to be careful here to ensure that we call ToReferenceFrame
|
||||
// on aContainerFrame and not its parent.
|
||||
nsPoint frameOffset = aBuilder->ToReferenceFrame(aContainerFrame) +
|
||||
aContainerFrame->GetContentRectRelativeToSelf().TopLeft();
|
||||
|
||||
return LayoutDeviceIntPoint::FromAppUnitsToNearest(frameOffset, auPerDevPixel);
|
||||
}
|
||||
|
||||
// Return true iff |aManager| is a "temporary layer manager". They're
|
||||
// used for small software rendering tasks, like drawWindow. That's
|
||||
// currently implemented by a BasicLayerManager without a backing
|
||||
// widget, and hence in non-retained mode.
|
||||
inline static bool
|
||||
IsTempLayerManager(LayerManager* aManager)
|
||||
{
|
||||
return (mozilla::layers::LayersBackend::LAYERS_BASIC == aManager->GetBackendType() &&
|
||||
!static_cast<BasicLayerManager*>(aManager)->IsRetained());
|
||||
}
|
||||
|
||||
static already_AddRefed<LayerManager>
|
||||
GetLayerManager(nsFrameLoader* aFrameLoader)
|
||||
{
|
||||
|
@ -94,30 +47,27 @@ GetLayerManager(nsFrameLoader* aFrameLoader)
|
|||
|
||||
RenderFrameParent::RenderFrameParent(nsFrameLoader* aFrameLoader)
|
||||
: mLayersId{0}
|
||||
, mLayersConnected(false)
|
||||
, mFrameLoader(aFrameLoader)
|
||||
, mFrameLoaderDestroyed(false)
|
||||
, mAsyncPanZoomEnabled(false)
|
||||
, mInitted(false)
|
||||
, mLayerManager(nullptr)
|
||||
, mInitialized(false)
|
||||
, mLayersConnected(false)
|
||||
{
|
||||
mInitted = Init(aFrameLoader);
|
||||
mInitialized = Initialize(mFrameLoader);
|
||||
}
|
||||
|
||||
RenderFrameParent::~RenderFrameParent()
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
RenderFrameParent::Init(nsFrameLoader* aFrameLoader)
|
||||
RenderFrameParent::Initialize(nsFrameLoader* aFrameLoader)
|
||||
{
|
||||
if (mInitted || !aFrameLoader) {
|
||||
if (mInitialized || !aFrameLoader) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mFrameLoader = aFrameLoader;
|
||||
|
||||
RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
|
||||
|
||||
mAsyncPanZoomEnabled = lm && lm->AsyncPanZoomEnabled();
|
||||
PCompositorBridgeChild* compositor = lm
|
||||
? lm->GetCompositorBridgeChild()
|
||||
: nullptr;
|
||||
|
@ -134,73 +84,30 @@ RenderFrameParent::Init(nsFrameLoader* aFrameLoader)
|
|||
&mLayersId,
|
||||
&mCompositorOptions);
|
||||
|
||||
mInitted = true;
|
||||
mInitialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
RenderFrameParent::IsInitted()
|
||||
{
|
||||
return mInitted;
|
||||
}
|
||||
|
||||
void
|
||||
RenderFrameParent::Destroy()
|
||||
{
|
||||
mFrameLoaderDestroyed = true;
|
||||
mLayerManager = nullptr;
|
||||
}
|
||||
|
||||
already_AddRefed<Layer>
|
||||
RenderFrameParent::BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
nsIFrame* aFrame,
|
||||
LayerManager* aManager,
|
||||
nsDisplayItem* aItem,
|
||||
const ContainerLayerParameters& aContainerParameters)
|
||||
void
|
||||
RenderFrameParent::EnsureLayersConnected(CompositorOptions* aCompositorOptions)
|
||||
{
|
||||
MOZ_ASSERT(aFrame,
|
||||
"makes no sense to have a shadow tree without a frame");
|
||||
|
||||
if (IsTempLayerManager(aManager)) {
|
||||
// This can happen if aManager is a "temporary" manager, or if the
|
||||
// widget's layer manager changed out from under us. We need to
|
||||
// FIXME handle the former case somehow, probably with an API to
|
||||
// draw a manager's subtree. The latter is bad bad bad, but the the
|
||||
// MOZ_ASSERT() above will flag it. Returning nullptr here will just
|
||||
// cause the shadow subtree not to be rendered.
|
||||
if (!aContainerParameters.mForEventsAndPluginsOnly) {
|
||||
NS_WARNING("Remote iframe not rendered");
|
||||
}
|
||||
return nullptr;
|
||||
RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
|
||||
if (!lm) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mLayersId.IsValid()) {
|
||||
return nullptr;
|
||||
if (!lm->GetCompositorBridgeChild()) {
|
||||
return;
|
||||
}
|
||||
|
||||
RefPtr<Layer> layer =
|
||||
(aManager->GetLayerBuilder()->GetLeafLayerFor(aBuilder, aItem));
|
||||
if (!layer) {
|
||||
layer = aManager->CreateRefLayer();
|
||||
}
|
||||
if (!layer) {
|
||||
// Probably a temporary layer manager that doesn't know how to
|
||||
// use ref layers.
|
||||
return nullptr;
|
||||
}
|
||||
static_cast<RefLayer*>(layer.get())->SetReferentId(mLayersId);
|
||||
LayoutDeviceIntPoint offset = GetContentRectLayerOffset(aFrame, aBuilder);
|
||||
// We can only have an offset if we're a child of an inactive
|
||||
// container, but our display item is LAYER_ACTIVE_FORCE which
|
||||
// forces all layers above to be active.
|
||||
MOZ_ASSERT(aContainerParameters.mOffset == nsIntPoint());
|
||||
gfx::Matrix4x4 m = gfx::Matrix4x4::Translation(offset.x, offset.y, 0.0);
|
||||
// Remote content can't be repainted by us, so we multiply down
|
||||
// the resolution that our container expects onto our container.
|
||||
m.PreScale(aContainerParameters.mXScale, aContainerParameters.mYScale, 1.0);
|
||||
layer->SetBaseTransform(m);
|
||||
|
||||
return layer.forget();
|
||||
mLayersConnected = lm->GetCompositorBridgeChild()->SendNotifyChildRecreated(mLayersId, &mCompositorOptions);
|
||||
*aCompositorOptions = mCompositorOptions;
|
||||
}
|
||||
|
||||
LayerManager*
|
||||
|
@ -241,31 +148,8 @@ RenderFrameParent::ActorDestroy(ActorDestroyReason why)
|
|||
mLayerManager = nullptr;
|
||||
}
|
||||
|
||||
mozilla::ipc::IPCResult
|
||||
RenderFrameParent::RecvNotifyCompositorTransaction()
|
||||
{
|
||||
TriggerRepaint();
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
void
|
||||
RenderFrameParent::TriggerRepaint()
|
||||
{
|
||||
nsIFrame* docFrame = mFrameLoader->GetPrimaryFrameOfOwningContent();
|
||||
if (!docFrame) {
|
||||
// Bad, but nothing we can do about it (XXX/cjones: or is there?
|
||||
// maybe bug 589337?). When the new frame is created, we'll
|
||||
// probably still be the current render frame and will get to draw
|
||||
// our content then. Or, we're shutting down and this update goes
|
||||
// to /dev/null.
|
||||
return;
|
||||
}
|
||||
|
||||
docFrame->InvalidateLayer(DisplayItemType::TYPE_REMOTE);
|
||||
}
|
||||
|
||||
void
|
||||
RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier)
|
||||
RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier) const
|
||||
{
|
||||
RefPtr<LayerManager> lm = mFrameLoader ? GetLayerManager(mFrameLoader) : nullptr;
|
||||
// Perhaps the document containing this frame currently has no presentation?
|
||||
|
@ -276,41 +160,40 @@ RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextur
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
RenderFrameParent::TakeFocusForClickFromTap()
|
||||
{
|
||||
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
||||
if (!fm) {
|
||||
return;
|
||||
}
|
||||
RefPtr<Element> element = mFrameLoader->GetOwnerContent();
|
||||
if (!element) {
|
||||
return;
|
||||
}
|
||||
fm->SetFocus(element, nsIFocusManager::FLAG_BYMOUSE |
|
||||
nsIFocusManager::FLAG_BYTOUCH |
|
||||
nsIFocusManager::FLAG_NOSCROLL);
|
||||
}
|
||||
|
||||
void
|
||||
RenderFrameParent::EnsureLayersConnected(CompositorOptions* aCompositorOptions)
|
||||
{
|
||||
RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
|
||||
if (!lm) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!lm->GetCompositorBridgeChild()) {
|
||||
return;
|
||||
}
|
||||
|
||||
mLayersConnected = lm->GetCompositorBridgeChild()->SendNotifyChildRecreated(mLayersId, &mCompositorOptions);
|
||||
*aCompositorOptions = mCompositorOptions;
|
||||
}
|
||||
|
||||
} // namespace layout
|
||||
} // namespace mozilla
|
||||
|
||||
/**
|
||||
* Gets the layer-pixel offset of aContainerFrame's content rect top-left
|
||||
* from the nearest display item reference frame (which we assume will be inducing
|
||||
* a ContainerLayer).
|
||||
*/
|
||||
static mozilla::LayoutDeviceIntPoint
|
||||
GetContentRectLayerOffset(nsIFrame* aContainerFrame, nsDisplayListBuilder* aBuilder)
|
||||
{
|
||||
nscoord auPerDevPixel = aContainerFrame->PresContext()->AppUnitsPerDevPixel();
|
||||
|
||||
// Offset to the content rect in case we have borders or padding
|
||||
// Note that aContainerFrame could be a reference frame itself, so
|
||||
// we need to be careful here to ensure that we call ToReferenceFrame
|
||||
// on aContainerFrame and not its parent.
|
||||
nsPoint frameOffset = aBuilder->ToReferenceFrame(aContainerFrame) +
|
||||
aContainerFrame->GetContentRectRelativeToSelf().TopLeft();
|
||||
|
||||
return mozilla::LayoutDeviceIntPoint::FromAppUnitsToNearest(frameOffset, auPerDevPixel);
|
||||
}
|
||||
|
||||
// Return true iff |aManager| is a "temporary layer manager". They're
|
||||
// used for small software rendering tasks, like drawWindow. That's
|
||||
// currently implemented by a BasicLayerManager without a backing
|
||||
// widget, and hence in non-retained mode.
|
||||
inline static bool
|
||||
IsTempLayerManager(mozilla::layers::LayerManager* aManager)
|
||||
{
|
||||
return (mozilla::layers::LayersBackend::LAYERS_BASIC == aManager->GetBackendType() &&
|
||||
!static_cast<BasicLayerManager*>(aManager)->IsRetained());
|
||||
}
|
||||
|
||||
nsDisplayRemote::nsDisplayRemote(nsDisplayListBuilder* aBuilder,
|
||||
nsSubDocumentFrame* aFrame)
|
||||
: nsDisplayItem(aBuilder, aFrame)
|
||||
|
@ -327,7 +210,7 @@ nsDisplayRemote::nsDisplayRemote(nsDisplayListBuilder* aBuilder,
|
|||
mEventRegionsOverride |= EventRegionsOverride::ForceDispatchToContent;
|
||||
}
|
||||
|
||||
nsFrameLoader* frameLoader = GetRenderFrameParent()->FrameLoader();
|
||||
nsFrameLoader* frameLoader = GetRenderFrameParent()->GetFrameLoader();
|
||||
if (frameLoader) {
|
||||
TabParent* browser = TabParent::GetFrom(frameLoader);
|
||||
if (browser) {
|
||||
|
@ -341,7 +224,7 @@ nsDisplayRemote::GetLayerState(nsDisplayListBuilder* aBuilder,
|
|||
LayerManager* aManager,
|
||||
const ContainerLayerParameters& aParameters)
|
||||
{
|
||||
if (mozilla::layout::IsTempLayerManager(aManager)) {
|
||||
if (IsTempLayerManager(aManager)) {
|
||||
return mozilla::LAYER_NONE;
|
||||
}
|
||||
return mozilla::LAYER_ACTIVE_FORCE;
|
||||
|
@ -360,14 +243,56 @@ nsDisplayRemote::BuildLayer(nsDisplayListBuilder* aBuilder,
|
|||
const ContainerLayerParameters& aContainerParameters)
|
||||
{
|
||||
MOZ_ASSERT(GetRenderFrameParent());
|
||||
MOZ_ASSERT(mFrame, "Makes no sense to have a shadow tree without a frame");
|
||||
|
||||
if (IsTempLayerManager(aManager)) {
|
||||
// This can happen if aManager is a "temporary" manager, or if the
|
||||
// widget's layer manager changed out from under us. We need to
|
||||
// FIXME handle the former case somehow, probably with an API to
|
||||
// draw a manager's subtree. The latter is bad bad bad, but the the
|
||||
// MOZ_ASSERT() above will flag it. Returning nullptr here will just
|
||||
// cause the shadow subtree not to be rendered.
|
||||
if (!aContainerParameters.mForEventsAndPluginsOnly) {
|
||||
NS_WARNING("Remote iframe not rendered");
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LayersId remoteId = GetRenderFrameParent()->GetLayersId();
|
||||
|
||||
if (!remoteId.IsValid()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RefPtr<Layer> layer =
|
||||
GetRenderFrameParent()->BuildLayer(aBuilder, mFrame, aManager,
|
||||
this, aContainerParameters);
|
||||
aManager->GetLayerBuilder()->GetLeafLayerFor(aBuilder, this);
|
||||
|
||||
if (layer && layer->AsRefLayer()) {
|
||||
if (!layer) {
|
||||
layer = aManager->CreateRefLayer();
|
||||
}
|
||||
|
||||
if (!layer) {
|
||||
// Probably a temporary layer manager that doesn't know how to
|
||||
// use ref layers.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static_cast<RefLayer*>(layer.get())->SetReferentId(remoteId);
|
||||
LayoutDeviceIntPoint offset = GetContentRectLayerOffset(Frame(), aBuilder);
|
||||
// We can only have an offset if we're a child of an inactive
|
||||
// container, but our display item is LAYER_ACTIVE_FORCE which
|
||||
// forces all layers above to be active.
|
||||
MOZ_ASSERT(aContainerParameters.mOffset == nsIntPoint());
|
||||
Matrix4x4 m = Matrix4x4::Translation(offset.x, offset.y, 0.0);
|
||||
// Remote content can't be repainted by us, so we multiply down
|
||||
// the resolution that our container expects onto our container.
|
||||
m.PreScale(aContainerParameters.mXScale, aContainerParameters.mYScale, 1.0);
|
||||
layer->SetBaseTransform(m);
|
||||
|
||||
if (layer->AsRefLayer()) {
|
||||
layer->AsRefLayer()->SetEventRegionsOverride(mEventRegionsOverride);
|
||||
}
|
||||
|
||||
return layer.forget();
|
||||
}
|
||||
|
||||
|
@ -393,9 +318,9 @@ nsDisplayRemote::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuild
|
|||
mozilla::layers::WebRenderLayerManager* aManager,
|
||||
nsDisplayListBuilder* aDisplayListBuilder)
|
||||
{
|
||||
mOffset = mozilla::layout::GetContentRectLayerOffset(mFrame, aDisplayListBuilder);
|
||||
mOffset = GetContentRectLayerOffset(mFrame, aDisplayListBuilder);
|
||||
|
||||
mozilla::LayoutDeviceRect rect = mozilla::LayoutDeviceRect::FromAppUnits(
|
||||
LayoutDeviceRect rect = LayoutDeviceRect::FromAppUnits(
|
||||
mFrame->GetContentRectRelativeToSelf(), mFrame->PresContext()->AppUnitsPerDevPixel());
|
||||
rect += mOffset;
|
||||
|
||||
|
|
|
@ -8,10 +8,8 @@
|
|||
#define mozilla_layout_RenderFrameParent_h
|
||||
|
||||
#include "mozilla/Attributes.h"
|
||||
#include <map>
|
||||
|
||||
#include "mozilla/dom/ipc/IdType.h"
|
||||
#include "mozilla/layers/APZUtils.h"
|
||||
#include "mozilla/layers/CompositorOptions.h"
|
||||
#include "mozilla/layers/LayersTypes.h"
|
||||
#include "mozilla/layout/PRenderFrameParent.h"
|
||||
|
@ -22,94 +20,48 @@ class nsSubDocumentFrame;
|
|||
|
||||
namespace mozilla {
|
||||
|
||||
class InputEvent;
|
||||
|
||||
namespace layers {
|
||||
class AsyncDragMetrics;
|
||||
class TargetConfig;
|
||||
struct TextureFactoryIdentifier;
|
||||
struct ScrollableLayerGuid;
|
||||
} // namespace layers
|
||||
|
||||
namespace layout {
|
||||
|
||||
class RenderFrameParent final : public PRenderFrameParent
|
||||
{
|
||||
typedef mozilla::layers::AsyncDragMetrics AsyncDragMetrics;
|
||||
typedef mozilla::layers::FrameMetrics FrameMetrics;
|
||||
typedef mozilla::layers::CompositorOptions CompositorOptions;
|
||||
typedef mozilla::layers::ContainerLayer ContainerLayer;
|
||||
typedef mozilla::layers::Layer Layer;
|
||||
typedef mozilla::layers::LayerManager LayerManager;
|
||||
typedef mozilla::layers::LayersId LayersId;
|
||||
typedef mozilla::layers::TargetConfig TargetConfig;
|
||||
typedef mozilla::ContainerLayerParameters ContainerLayerParameters;
|
||||
typedef mozilla::layers::TextureFactoryIdentifier TextureFactoryIdentifier;
|
||||
typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid;
|
||||
typedef mozilla::layers::TouchBehaviorFlags TouchBehaviorFlags;
|
||||
typedef mozilla::layers::ZoomConstraints ZoomConstraints;
|
||||
typedef ScrollableLayerGuid::ViewID ViewID;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
/**
|
||||
* Select the desired scrolling behavior. If ASYNC_PAN_ZOOM is
|
||||
* chosen, then RenderFrameParent will watch input events and use
|
||||
* them to asynchronously pan and zoom.
|
||||
*/
|
||||
explicit RenderFrameParent(nsFrameLoader* aFrameLoader);
|
||||
virtual ~RenderFrameParent();
|
||||
|
||||
bool Init(nsFrameLoader* aFrameLoader);
|
||||
bool IsInitted();
|
||||
bool Initialize(nsFrameLoader* aFrameLoader);
|
||||
void Destroy();
|
||||
|
||||
|
||||
already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||
nsIFrame* aFrame,
|
||||
LayerManager* aManager,
|
||||
nsDisplayItem* aItem,
|
||||
const ContainerLayerParameters& aContainerParameters);
|
||||
|
||||
void EnsureLayersConnected(CompositorOptions* aCompositorOptions);
|
||||
LayerManager* AttachLayerManager();
|
||||
void OwnerContentChanged(nsIContent* aContent);
|
||||
|
||||
bool HitTest(const nsRect& aRect);
|
||||
nsFrameLoader* GetFrameLoader() const { return mFrameLoader; }
|
||||
LayersId GetLayersId() const { return mLayersId; }
|
||||
CompositorOptions GetCompositorOptions() const { return mCompositorOptions; }
|
||||
|
||||
void GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier);
|
||||
void GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier) const;
|
||||
|
||||
inline LayersId GetLayersId() const { return mLayersId; }
|
||||
inline bool IsLayersConnected() const { return mLayersConnected; }
|
||||
inline CompositorOptions GetCompositorOptions() const { return mCompositorOptions; }
|
||||
|
||||
void TakeFocusForClickFromTap();
|
||||
|
||||
void EnsureLayersConnected(CompositorOptions* aCompositorOptions);
|
||||
|
||||
LayerManager* AttachLayerManager();
|
||||
|
||||
nsFrameLoader* FrameLoader() const
|
||||
{
|
||||
return mFrameLoader;
|
||||
}
|
||||
bool IsInitialized() const { return mInitialized; }
|
||||
bool IsLayersConnected() const { return mLayersConnected; }
|
||||
|
||||
protected:
|
||||
void ActorDestroy(ActorDestroyReason why) override;
|
||||
|
||||
virtual mozilla::ipc::IPCResult RecvNotifyCompositorTransaction() override;
|
||||
|
||||
private:
|
||||
void TriggerRepaint();
|
||||
void DispatchEventForPanZoomController(const InputEvent& aEvent);
|
||||
|
||||
// When our child frame is pushing transactions directly to the
|
||||
// compositor, this is the ID of its layer tree in the compositor's
|
||||
// context.
|
||||
LayersId mLayersId;
|
||||
// A flag that indicates whether or not the compositor knows about the
|
||||
// layers id. In some cases this RenderFrameParent is not connected to the
|
||||
// compositor and so this flag is false.
|
||||
bool mLayersConnected;
|
||||
// The compositor options for this layers id. This is only meaningful if
|
||||
// the compositor actually knows about this layers id (i.e. when mLayersConnected
|
||||
// is true).
|
||||
|
@ -118,24 +70,11 @@ private:
|
|||
RefPtr<nsFrameLoader> mFrameLoader;
|
||||
RefPtr<LayerManager> mLayerManager;
|
||||
|
||||
// True after Destroy() has been called, which is triggered
|
||||
// originally by nsFrameLoader::Destroy(). After this point, we can
|
||||
// no longer safely ask the frame loader to find its nearest layer
|
||||
// manager, because it may have been disconnected from the DOM.
|
||||
// It's still OK to *tell* the frame loader that we've painted after
|
||||
// it's destroyed; it'll just ignore us, and we won't be able to
|
||||
// find an nsIFrame to invalidate. See ShadowLayersUpdated().
|
||||
//
|
||||
// Prefer the extra bit of state to null'ing out mFrameLoader in
|
||||
// Destroy() so that less code needs to be special-cased for after
|
||||
// Destroy().
|
||||
//
|
||||
// It's possible for mFrameLoader==null and
|
||||
// mFrameLoaderDestroyed==false.
|
||||
bool mFrameLoaderDestroyed;
|
||||
|
||||
bool mAsyncPanZoomEnabled;
|
||||
bool mInitted;
|
||||
bool mInitialized;
|
||||
// A flag that indicates whether or not the compositor knows about the
|
||||
// layers id. In some cases this RenderFrameParent is not connected to the
|
||||
// compositor and so this flag is false.
|
||||
bool mLayersConnected;
|
||||
};
|
||||
|
||||
} // namespace layout
|
||||
|
@ -148,7 +87,15 @@ private:
|
|||
*/
|
||||
class nsDisplayRemote final : public nsDisplayItem
|
||||
{
|
||||
typedef mozilla::dom::TabId TabId;
|
||||
typedef mozilla::gfx::Matrix4x4 Matrix4x4;
|
||||
typedef mozilla::layers::EventRegionsOverride EventRegionsOverride;
|
||||
typedef mozilla::layers::Layer Layer;
|
||||
typedef mozilla::layers::LayersId LayersId;
|
||||
typedef mozilla::layers::RefLayer RefLayer;
|
||||
typedef mozilla::layout::RenderFrameParent RenderFrameParent;
|
||||
typedef mozilla::LayoutDeviceRect LayoutDeviceRect;
|
||||
typedef mozilla::LayoutDeviceIntPoint LayoutDeviceIntPoint;
|
||||
|
||||
public:
|
||||
nsDisplayRemote(nsDisplayListBuilder* aBuilder,
|
||||
|
@ -177,13 +124,12 @@ public:
|
|||
NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)
|
||||
|
||||
private:
|
||||
mozilla::layers::LayersId GetRemoteLayersId() const;
|
||||
LayersId GetRemoteLayersId() const;
|
||||
RenderFrameParent* GetRenderFrameParent() const;
|
||||
|
||||
mozilla::dom::TabId mTabId;
|
||||
mozilla::LayoutDeviceIntPoint mOffset;
|
||||
mozilla::layers::EventRegionsOverride mEventRegionsOverride;
|
||||
TabId mTabId;
|
||||
LayoutDeviceIntPoint mOffset;
|
||||
EventRegionsOverride mEventRegionsOverride;
|
||||
};
|
||||
|
||||
|
||||
#endif // mozilla_layout_RenderFrameParent_h
|
||||
|
|
Загрузка…
Ссылка в новой задаче