[lacros] server side implementation for frame throttling.

This CL adds a window property (ash::kFrameRateThrottleKey).
ash::FrameThrottlingController sets the property to true/false to notify
of throttle/unthrottle of a window. exo::ShellSurfaceBase, as an
aura::WindowObserer, observes the property change with
OnWindowPropertyChanged(). Upon receiving such a property change event,
exo::ShellSurfaceBase instructs the root surface (exo::Surface) to
throttle/unthrottle. In turn, the AuraSurface, as an observer of the
root surface, issues a wayland zaura event to the client (lacros).

To properly throttle a lacros window, there are two pieces:
1. Lacros's viz needs to reduce the BeginFrame rate (defaults to 20fps
currently). This has been done in the client side work CL (through
aura::HostFrameRateThrottler to issue an IPC call to viz). This CL
plumbs to the client through zaura surface interfaces.

2. Ash's viz needs to match the BeginFrame rate on the same frame sink
of the lacros surface being throttled. This will also fix the metrics
error, otherwise Ash's viz would be wrongly expecting the same surface
to submit at full rate and consider the client to has missed
submissions.

Bug: 1218872
Change-Id: I3717bcebae3410506cc7d09138d6c9fb78c2b771
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3388757
Reviewed-by: Scott Violet <[email protected]>
Reviewed-by: Mitsuru Oshima <[email protected]>
Commit-Queue: Jun Liu <[email protected]>
Cr-Commit-Position: refs/heads/main@{#962800}
diff --git a/components/exo/wayland/zaura_shell.h b/components/exo/wayland/zaura_shell.h
index 26ff224..3676965b 100644
--- a/components/exo/wayland/zaura_shell.h
+++ b/components/exo/wayland/zaura_shell.h
@@ -21,7 +21,7 @@
 
 namespace wayland {
 
-constexpr uint32_t kZAuraShellVersion = 28;
+constexpr uint32_t kZAuraShellVersion = 29;
 
 // Adds bindings to the Aura Shell. Normally this implies Ash on ChromeOS
 // builds. On non-ChromeOS builds the protocol provides access to Aura windowing
@@ -73,6 +73,7 @@
   void OnWindowOcclusionChanged(Surface* surface) override;
   void OnFrameLockingChanged(Surface* surface, bool lock) override;
   void OnDeskChanged(Surface* surface, int state) override;
+  void ThrottleFrameRate(bool on) override;
 
   // Overridden from ActivationChangeObserver:
   void OnWindowActivating(ActivationReason reason,