Bug 1367837 - Implement some APZ test util APIs for webrender. r?botond,dvander
This implements some methods exposed on DOMWindowUtils and used by
reftests, for the WebRender codepath. The implementation is very similar
to the implementation in LayerTransactionParent.
MozReview-Commit-ID: LOKAMCJ2und
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -109,16 +109,18 @@
#include "HTMLImageElement.h"
#include "mozilla/css/ImageLoader.h"
#include "mozilla/layers/APZCTreeManager.h" // for layers::ZoomToRectBehavior
#include "mozilla/dom/Promise.h"
#include "mozilla/StyleSheetInlines.h"
#include "mozilla/gfx/GPUProcessManager.h"
#include "mozilla/dom/TimeoutManager.h"
#include "mozilla/PreloadedStyleSheet.h"
+#include "mozilla/layers/WebRenderBridgeChild.h"
+#include "mozilla/layers/WebRenderLayerManager.h"
#ifdef XP_WIN
#undef GetClassName
#endif
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::ipc;
@@ -2517,16 +2519,24 @@ nsDOMWindowUtils::SetAsyncScrollOffset(n
nsIWidget* widget = GetWidget();
if (!widget) {
return NS_ERROR_FAILURE;
}
LayerManager* manager = widget->GetLayerManager();
if (!manager) {
return NS_ERROR_FAILURE;
}
+ if (WebRenderLayerManager* wrlm = manager->AsWebRenderLayerManager()) {
+ WebRenderBridgeChild* wrbc = wrlm->WrBridge();
+ if (!wrbc) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ wrbc->SendSetAsyncScrollOffset(viewId, aX, aY);
+ return NS_OK;
+ }
ShadowLayerForwarder* forwarder = manager->AsShadowForwarder();
if (!forwarder || !forwarder->HasShadowManager()) {
return NS_ERROR_UNEXPECTED;
}
forwarder->GetShadowManager()->SendSetAsyncScrollOffset(viewId, aX, aY);
return NS_OK;
}
@@ -2544,16 +2554,24 @@ nsDOMWindowUtils::SetAsyncZoom(nsIDOMNod
nsIWidget* widget = GetWidget();
if (!widget) {
return NS_ERROR_FAILURE;
}
LayerManager* manager = widget->GetLayerManager();
if (!manager) {
return NS_ERROR_FAILURE;
}
+ if (WebRenderLayerManager* wrlm = manager->AsWebRenderLayerManager()) {
+ WebRenderBridgeChild* wrbc = wrlm->WrBridge();
+ if (!wrbc) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ wrbc->SendSetAsyncZoom(viewId, aValue);
+ return NS_OK;
+ }
ShadowLayerForwarder* forwarder = manager->AsShadowForwarder();
if (!forwarder || !forwarder->HasShadowManager()) {
return NS_ERROR_UNEXPECTED;
}
forwarder->GetShadowManager()->SendSetAsyncZoom(viewId, aValue);
return NS_OK;
}
@@ -2570,16 +2588,24 @@ nsDOMWindowUtils::FlushApzRepaints(bool*
*aOutResult = false;
return NS_OK;
}
LayerManager* manager = widget->GetLayerManager();
if (!manager) {
*aOutResult = false;
return NS_OK;
}
+ if (WebRenderLayerManager* wrlm = manager->AsWebRenderLayerManager()) {
+ WebRenderBridgeChild* wrbc = wrlm->WrBridge();
+ if (!wrbc) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ wrbc->SendFlushApzRepaints();
+ return NS_OK;
+ }
ShadowLayerForwarder* forwarder = manager->AsShadowForwarder();
if (!forwarder || !forwarder->HasShadowManager()) {
*aOutResult = false;
return NS_OK;
}
forwarder->GetShadowManager()->SendFlushApzRepaints();
*aOutResult = true;
return NS_OK;
--- a/gfx/layers/ipc/PWebRenderBridge.ipdl
+++ b/gfx/layers/ipc/PWebRenderBridge.ipdl
@@ -62,15 +62,21 @@ parent:
async AddExternalImageId(ExternalImageId aImageId, CompositableHandle aHandle);
async AddExternalImageIdForCompositable(ExternalImageId aImageId, CompositableHandle aHandle);
async RemoveExternalImageId(ExternalImageId aImageId);
async SetLayerObserverEpoch(uint64_t layerObserverEpoch);
async ClearCachedResources();
// Schedule a composite if one isn't already scheduled.
async ForceComposite();
+ // Testing APIs. These correspond exactly to the equivalent APIs in
+ // PLayerTransaction - see those for documentation.
+ sync SetAsyncScrollOffset(ViewID scrollId, float x, float y);
+ sync SetAsyncZoom(ViewID scrollId, float zoom);
+ async FlushApzRepaints();
+
async Shutdown();
child:
async __delete__();
};
} // layers
} // mozilla
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -1,16 +1,17 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=4 ts=8 et tw=80 : */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/layers/WebRenderBridgeParent.h"
+#include "apz/src/AsyncPanZoomController.h"
#include "CompositableHost.h"
#include "gfxPrefs.h"
#include "GLContext.h"
#include "GLContextProvider.h"
#include "mozilla/Range.h"
#include "mozilla/layers/AnimationHelper.h"
#include "mozilla/layers/APZCTreeManager.h"
#include "mozilla/layers/Compositor.h"
@@ -721,16 +722,60 @@ WebRenderBridgeParent::RecvForceComposit
{
if (mDestroyed) {
return IPC_OK();
}
ScheduleComposition();
return IPC_OK();
}
+already_AddRefed<AsyncPanZoomController>
+WebRenderBridgeParent::GetTargetAPZC(const FrameMetrics::ViewID& aScrollId)
+{
+ RefPtr<AsyncPanZoomController> apzc;
+ if (CompositorBridgeParent* cbp = GetRootCompositorBridgeParent()) {
+ if (RefPtr<APZCTreeManager> apzctm = cbp->GetAPZCTreeManager()) {
+ apzc = apzctm->GetTargetAPZC(wr::AsUint64(mPipelineId), aScrollId);
+ }
+ }
+ return apzc.forget();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvSetAsyncScrollOffset(const FrameMetrics::ViewID& aScrollId,
+ const float& aX,
+ const float& aY)
+{
+ RefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(aScrollId);
+ if (!apzc) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ apzc->SetTestAsyncScrollOffset(CSSPoint(aX, aY));
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvSetAsyncZoom(const FrameMetrics::ViewID& aScrollId,
+ const float& aZoom)
+{
+ RefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(aScrollId);
+ if (!apzc) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ apzc->SetTestAsyncZoom(LayerToParentLayerScale(aZoom));
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
+WebRenderBridgeParent::RecvFlushApzRepaints()
+{
+ mCompositorBridge->FlushApzRepaints(wr::AsUint64(mPipelineId));
+ return IPC_OK();
+}
+
void
WebRenderBridgeParent::ActorDestroy(ActorDestroyReason aWhy)
{
Destroy();
}
void
WebRenderBridgeParent::SampleAnimations(nsTArray<WrOpacityProperty>& aOpacityArray,
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -111,16 +111,23 @@ public:
mozilla::ipc::IPCResult RecvAddExternalImageIdForCompositable(const ExternalImageId& aImageId,
const CompositableHandle& aHandle) override;
mozilla::ipc::IPCResult RecvRemoveExternalImageId(const ExternalImageId& aImageId) override;
mozilla::ipc::IPCResult RecvSetLayerObserverEpoch(const uint64_t& aLayerObserverEpoch) override;
mozilla::ipc::IPCResult RecvClearCachedResources() override;
mozilla::ipc::IPCResult RecvForceComposite() override;
+ mozilla::ipc::IPCResult RecvSetAsyncScrollOffset(const FrameMetrics::ViewID& aScrollId,
+ const float& aX,
+ const float& aY) override;
+ mozilla::ipc::IPCResult RecvSetAsyncZoom(const FrameMetrics::ViewID& aScrollId,
+ const float& aZoom) override;
+ mozilla::ipc::IPCResult RecvFlushApzRepaints() override;
+
void ActorDestroy(ActorDestroyReason aWhy) override;
void SetWebRenderProfilerEnabled(bool aEnabled);
void Pause();
bool Resume();
void Destroy();
@@ -198,16 +205,20 @@ private:
CompositorBridgeParent* GetRootCompositorBridgeParent() const;
// Have APZ push the async scroll state to WR. Returns true if an APZ
// animation is in effect and we need to schedule another composition.
// If scrollbars need their transforms updated, the provided aTransformArray
// is populated with the property update details.
bool PushAPZStateToWR(nsTArray<WrTransformProperty>& aTransformArray);
+ // Helper method to get an APZC reference from a scroll id. Uses the layers
+ // id of this bridge, and may return null if the APZC wasn't found.
+ already_AddRefed<AsyncPanZoomController> GetTargetAPZC(const FrameMetrics::ViewID& aId);
+
private:
struct PendingTransactionId {
PendingTransactionId(wr::Epoch aEpoch, uint64_t aId)
: mEpoch(aEpoch)
, mId(aId)
{}
wr::Epoch mEpoch;
uint64_t mId;
--- a/ipc/ipdl/sync-messages.ini
+++ b/ipc/ipdl/sync-messages.ini
@@ -1041,16 +1041,20 @@ description =
[PWebRenderBridge::UpdateImage]
description =
[PWebRenderBridge::DeleteImage]
description =
[PWebRenderBridge::DPSyncEnd]
description =
[PWebRenderBridge::DPGetSnapshot]
description =
+[PWebRenderBridge::SetAsyncScrollOffset]
+description = test only
+[PWebRenderBridge::SetAsyncZoom]
+description = test only
[PVRManager::GetSensorState]
description =
[PHal::GetCurrentBatteryInformation]
description =
[PHal::GetCurrentNetworkInformation]
description =
[PHal::GetScreenEnabled]
description =