Bug 1351783 part 11 - Sync FocusTarget with WebRenderLayerManager. r?kats
MozReview-Commit-ID: LxWt22XY5IE
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -387,16 +387,18 @@ WebRenderBridgeParent::UpdateAPZ()
return;
}
uint64_t rootLayersId = cbp->RootLayerTreeId();
RefPtr<WebRenderBridgeParent> rootWrbp = cbp->GetWebRenderBridgeParent();
if (!rootWrbp) {
return;
}
if (RefPtr<APZCTreeManager> apzc = cbp->GetAPZCTreeManager()) {
+ apzc->UpdateFocusState(rootLayersId, GetLayersId(),
+ rootWrbp->GetScrollData().GetFocusTarget());
apzc->UpdateHitTestingTree(rootLayersId, rootWrbp->GetScrollData(),
mScrollData.IsFirstPaint(), GetLayersId(),
mScrollData.GetPaintSequenceNumber());
}
}
bool
WebRenderBridgeParent::PushAPZStateToWR(nsTArray<WrTransformProperty>& aTransformArray)
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -211,16 +211,19 @@ WebRenderLayerManager::EndTransactionInt
if (mTransactionIncomplete) {
DiscardLocalImages();
WrBridge()->ProcessWebRenderParentCommands();
return false;
}
WebRenderScrollData scrollData;
if (AsyncPanZoomEnabled()) {
+ scrollData.SetFocusTarget(mFocusTarget);
+ mFocusTarget = FocusTarget();
+
if (mIsFirstPaint) {
scrollData.SetIsFirstPaint();
mIsFirstPaint = false;
}
scrollData.SetPaintSequenceNumber(mPaintSequenceNumber);
if (mRoot) {
PopulateScrollData(scrollData, mRoot.get());
}
@@ -243,16 +246,22 @@ WebRenderLayerManager::EndTransactionInt
// this may result in Layers being deleted, which results in
// PLayer::Send__delete__() and DeallocShmem()
mKeepAlive.Clear();
ClearMutatedLayers();
return true;
}
+void
+WebRenderLayerManager::SetFocusTarget(const FocusTarget& aFocusTarget)
+{
+ mFocusTarget = aFocusTarget;
+}
+
bool
WebRenderLayerManager::AsyncPanZoomEnabled() const
{
return mWidget->AsyncPanZoomEnabled();
}
void
WebRenderLayerManager::MakeSnapshotIfRequired(LayoutDeviceIntSize aSize)
--- a/gfx/layers/wr/WebRenderLayerManager.h
+++ b/gfx/layers/wr/WebRenderLayerManager.h
@@ -4,16 +4,17 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_WEBRENDERLAYERMANAGER_H
#define GFX_WEBRENDERLAYERMANAGER_H
#include "Layers.h"
#include "mozilla/MozPromise.h"
#include "mozilla/layers/APZTestData.h"
+#include "mozilla/layers/FocusTarget.h"
#include "mozilla/layers/TransactionIdAllocator.h"
#include "mozilla/webrender/WebRenderTypes.h"
class nsIWidget;
namespace mozilla {
namespace layers {
@@ -93,16 +94,17 @@ public:
virtual void ScheduleComposite() override;
virtual void SetNeedsComposite(bool aNeedsComposite) override
{
mNeedsComposite = aNeedsComposite;
}
virtual bool NeedsComposite() const override { return mNeedsComposite; }
virtual void SetIsFirstPaint() override { mIsFirstPaint = true; }
+ virtual void SetFocusTarget(const FocusTarget& aFocusTarget) override;
bool AsyncPanZoomEnabled() const override;
DrawPaintedLayerCallback GetPaintedLayerCallback() const
{ return mPaintedLayerCallback; }
void* GetPaintedLayerCallbackData() const
{ return mPaintedLayerCallbackData; }
@@ -175,16 +177,17 @@ private:
// if it was a mutated layers.
void AddMutatedLayer(Layer* aLayer);
void ClearMutatedLayers();
LayerRefArray mMutatedLayers;
bool mTransactionIncomplete;
bool mNeedsComposite;
bool mIsFirstPaint;
+ FocusTarget mFocusTarget;
// When we're doing a transaction in order to draw to a non-default
// target, the layers transaction is only performed in order to send
// a PLayers:Update. We save the original non-default target to
// mTarget, and then perform the transaction. After the transaction ends,
// we send a message to our remote side to capture the actual pixels
// being drawn to the default target, and then copy those pixels
// back to mTarget.
--- a/gfx/layers/wr/WebRenderScrollData.cpp
+++ b/gfx/layers/wr/WebRenderScrollData.cpp
@@ -140,16 +140,22 @@ WebRenderScrollData::GetLayerData(size_t
const ScrollMetadata&
WebRenderScrollData::GetScrollMetadata(size_t aIndex) const
{
MOZ_ASSERT(aIndex < mScrollMetadatas.Length());
return mScrollMetadatas[aIndex];
}
void
+WebRenderScrollData::SetFocusTarget(const FocusTarget& aFocusTarget)
+{
+ mFocusTarget = aFocusTarget;
+}
+
+void
WebRenderScrollData::SetIsFirstPaint()
{
mIsFirstPaint = true;
}
bool
WebRenderScrollData::IsFirstPaint() const
{
--- a/gfx/layers/wr/WebRenderScrollData.h
+++ b/gfx/layers/wr/WebRenderScrollData.h
@@ -10,16 +10,17 @@
#include "chrome/common/ipc_message_utils.h"
#include "FrameMetrics.h"
#include "ipc/IPCMessageUtils.h"
#include "LayersTypes.h"
#include "mozilla/GfxMessageUtils.h"
#include "mozilla/layers/LayerAttributes.h"
#include "mozilla/layers/LayersMessageUtils.h"
+#include "mozilla/layers/FocusTarget.h"
#include "mozilla/Maybe.h"
#include "nsTArrayForwardDeclare.h"
namespace mozilla {
namespace layers {
class Layer;
class WebRenderScrollData;
@@ -118,16 +119,19 @@ public:
// Return a pointer to the scroll data at the given index. Use with caution,
// as the pointer may be invalidated if this WebRenderScrollData is mutated.
WebRenderLayerScrollData* GetLayerDataMutable(size_t aIndex);
const WebRenderLayerScrollData* GetLayerData(size_t aIndex) const;
const ScrollMetadata& GetScrollMetadata(size_t aIndex) const;
+ const FocusTarget& GetFocusTarget() const { return mFocusTarget; }
+ void SetFocusTarget(const FocusTarget& aFocusTarget);
+
void SetIsFirstPaint();
bool IsFirstPaint() const;
void SetPaintSequenceNumber(uint32_t aPaintSequenceNumber);
uint32_t GetPaintSequenceNumber() const;
friend struct IPC::ParamTraits<WebRenderScrollData>;
private:
@@ -146,16 +150,19 @@ private:
// A list of per-layer scroll data objects, generated via a depth-first,
// pre-order, last-to-first traversal of the layer tree (i.e. a recursive
// traversal where a node N first pushes itself, followed by its children in
// last-to-first order). Each layer's scroll data object knows how many
// descendants that layer had, which allows reconstructing the traversal on the
// other side.
nsTArray<WebRenderLayerScrollData> mLayerScrollData;
+ // The focus information for this layer tree
+ FocusTarget mFocusTarget;
+
bool mIsFirstPaint;
uint32_t mPaintSequenceNumber;
};
} // namespace layers
} // namespace mozilla
namespace IPC {
@@ -220,25 +227,27 @@ struct ParamTraits<mozilla::layers::WebR
{
typedef mozilla::layers::WebRenderScrollData paramType;
static void
Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.mScrollMetadatas);
WriteParam(aMsg, aParam.mLayerScrollData);
+ WriteParam(aMsg, aParam.mFocusTarget);
WriteParam(aMsg, aParam.mIsFirstPaint);
WriteParam(aMsg, aParam.mPaintSequenceNumber);
}
static bool
Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{
return ReadParam(aMsg, aIter, &aResult->mScrollMetadatas)
&& ReadParam(aMsg, aIter, &aResult->mLayerScrollData)
+ && ReadParam(aMsg, aIter, &aResult->mFocusTarget)
&& ReadParam(aMsg, aIter, &aResult->mIsFirstPaint)
&& ReadParam(aMsg, aIter, &aResult->mPaintSequenceNumber);
}
};
} // namespace IPC
#endif /* GFX_WEBRENDERSCROLLDATA_H */