| Index: components/viz/service/hit_test/hit_test_aggregator.h
|
| diff --git a/components/viz/service/hit_test/hit_test_aggregator.h b/components/viz/service/hit_test/hit_test_aggregator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..473dd482ce2a7e5de42be07be53b7ea3b4db5431
|
| --- /dev/null
|
| +++ b/components/viz/service/hit_test/hit_test_aggregator.h
|
| @@ -0,0 +1,116 @@
|
| +// Copyright 2017 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.
|
| +
|
| +#ifndef COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +#define COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
| +
|
| +#include "cc/surfaces/surface_id.h"
|
| +#include "cc/surfaces/surface_observer.h"
|
| +#include "components/viz/common/hit_test/display_hit_test_data.h"
|
| +#include "components/viz/service/hit_test/display_hit_test_data_factory.h"
|
| +#include "components/viz/service/viz_service_export.h"
|
| +#include "services/viz/hit_test/public/interfaces/hit_test_data.mojom.h"
|
| +
|
| +namespace viz {
|
| +namespace hit_test {
|
| +
|
| +namespace test {
|
| +class HitTestAggregatorTest;
|
| +}
|
| +
|
| +// HitTestAggregator collects HitTestData objects from surfaces and
|
| +// aggregates them into a DisplayHitTesData structue made available in
|
| +// shared memory to enable efficient hit testing across processes.
|
| +//
|
| +// This is intended to be created in the viz or GPU process. For mus+ash this
|
| +// will be true after the mus process split.
|
| +
|
| +using HitTestDataMap = std::map<cc::SurfaceId, hit_test::mojom::HitTestDataPtr>;
|
| +
|
| +class VIZ_SERVICE_EXPORT HitTestAggregator : public cc::SurfaceObserver {
|
| + public:
|
| + HitTestAggregator(
|
| + std::unique_ptr<DisplayHitTestDataFactory> display_hit_test_data_factory);
|
| + ~HitTestAggregator();
|
| +
|
| + // Called when HitTestData is submitted along with every call
|
| + // to SubmitCompositorFrame. This is collected in pending_ until
|
| + // surfaces are aggregated and put on the display.
|
| + void SubmitHitTestData(hit_test::mojom::HitTestDataPtr hit_test_data);
|
| +
|
| + // Called after surfaces have been aggregated into the DisplayFrame.
|
| + // In this call HitTestData structures received from active surfaces
|
| + // are aggregated into the DisplayHitTestData structure in
|
| + // shared memory used for event targetting.
|
| + void Aggregate(cc::SurfaceId display_surface_id);
|
| +
|
| + // Performs the work of Aggregate by creating a PostTask so that
|
| + // the work is not directly on the call.
|
| + void PostTaskAggregate(cc::SurfaceId display_surface_id);
|
| +
|
| + // Called at BeginFrame. Swaps buffers in shared memory.
|
| + void Swap();
|
| +
|
| + // Returns a pointer to the DisplayHitTestRegion list currently
|
| + // used for hit-testing.
|
| + DisplayHitTestRegion* GetCurrentRegions();
|
| +
|
| + private:
|
| + friend class test::HitTestAggregatorTest;
|
| +
|
| + // Allocates memory for the DisplayHitTestData Structure.
|
| + void AllocateDisplayHitTestData();
|
| + void AllocateDisplayHitTestData(int length);
|
| +
|
| + // Appends the root element to the DisplayHitTestData structure.
|
| + void AppendRoot(cc::SurfaceId surface_id);
|
| +
|
| + // Appends a region to the DisplayHitTestData structure to recursively
|
| + // build the tree.
|
| + int AppendRegion(const hit_test::mojom::HitTestRegionPtr& region, int index);
|
| +
|
| + // cc:SurfaceObserver
|
| + void OnSurfaceCreated(const cc::SurfaceInfo& surface_info) override {}
|
| + void OnSurfaceDestroyed(const cc::SurfaceId& surface_id) override {}
|
| + bool OnSurfaceDamaged(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameAck& ack) override;
|
| + void OnSurfaceDiscarded(const cc::SurfaceId& surface_id) override;
|
| + void OnSurfaceDamageExpected(const cc::SurfaceId& surface_id,
|
| + const cc::BeginFrameArgs& args) override {}
|
| +
|
| + // Called when a surface has been aggregated and added to the
|
| + // display frame. HitTestData objects are held but ignored until
|
| + // this happens. HitTestData for the surface is copied from |pending_|
|
| + // to |active_| in this method.
|
| + void OnSurfaceWillDraw(const cc::SurfaceId& surface_id) override;
|
| +
|
| + // The collection of received HitTestData objects that have not yet
|
| + // been added to the DisplayFrame ( OnSurfaceWillDraw has not been called ).
|
| + HitTestDataMap pending_;
|
| +
|
| + // The collection of HitTestData objects that have need added to the
|
| + // DisplayFrame ( OnSurfaceWillDraw has been called ).
|
| + HitTestDataMap active_;
|
| +
|
| + // Keeps track of the number of regions in the active list
|
| + // so that we know when we exceed the available length.
|
| + int active_region_count_;
|
| +
|
| + // The object used to allocate memory for the DisplayHitTestData structure.
|
| + std::unique_ptr<DisplayHitTestDataFactory> display_hit_test_data_factory_;
|
| +
|
| + DisplayHitTestData* read_display_hit_test_data_;
|
| + DisplayHitTestData* write_display_hit_test_data_;
|
| +
|
| + // WeakPtr to handle the case when this object is deleted after
|
| + // the PostTaskAggregation call is scheduled but before invocation.
|
| + base::WeakPtrFactory<HitTestAggregator> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HitTestAggregator);
|
| +};
|
| +
|
| +} // namespace hit_test
|
| +} // namespace viz
|
| +
|
| +#endif // COMPONENTS_VIZ_SERVICE_HIT_TEST_HIT_TEST_AGGREGATOR_H_
|
|
|