| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ASH_CROSAPI_AUTOMATION_ASH_H_ |
| #define CHROME_BROWSER_ASH_CROSAPI_AUTOMATION_ASH_H_ |
| |
| #include "base/memory/weak_ptr.h" |
| #include "base/scoped_observation.h" |
| #include "base/unguessable_token.h" |
| #include "chromeos/crosapi/mojom/automation.mojom.h" |
| #include "extensions/browser/api/automation_internal/automation_event_router.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| #include "mojo/public/cpp/bindings/remote_set.h" |
| #include "ui/accessibility/ax_action_handler_registry.h" |
| #include "ui/accessibility/ax_tree_id.h" |
| |
| namespace crosapi { |
| |
| // Implements the crosapi interface for automation. Lives in Ash-Chrome on |
| // the UI thread. |
| class AutomationAsh : public mojom::Automation, |
| public ui::AXActionHandlerObserver, |
| public mojom::AutomationFactory, |
| public extensions::AutomationEventRouterObserver { |
| public: |
| AutomationAsh(); |
| AutomationAsh(const AutomationAsh&) = delete; |
| AutomationAsh& operator=(const AutomationAsh&) = delete; |
| ~AutomationAsh() override; |
| |
| void BindReceiverDeprecated( |
| mojo::PendingReceiver<mojom::Automation> receiver); |
| void BindReceiver(mojo::PendingReceiver<mojom::AutomationFactory> receiver); |
| |
| // Called by ash's internal a11y implementation. Data is forwarded to Lacros. |
| void EnableDesktop(); |
| void EnableTree(const ui::AXTreeID& tree_id); |
| void Disable(); |
| |
| // crosapi::mojom::Automation: |
| void RegisterAutomationClientDeprecated( |
| mojo::PendingRemote<mojom::AutomationClient> client, |
| const base::UnguessableToken& token) override {} |
| void ReceiveEventPrototypeDeprecated(const std::string& event_bundle, |
| bool root, |
| const base::UnguessableToken& token, |
| const std::string& window_id) override {} |
| void DispatchAccessibilityEvents( |
| const base::UnguessableToken& tree_id, |
| const std::vector<ui::AXTreeUpdate>& updates, |
| const gfx::Point& mouse_location, |
| const std::vector<ui::AXEvent>& events) override; |
| void DispatchAccessibilityLocationChange( |
| const base::UnguessableToken& tree_id, |
| int32_t node_id, |
| const ui::AXRelativeBounds& bounds) override; |
| void DispatchTreeDestroyedEvent( |
| const base::UnguessableToken& tree_id) override; |
| void DispatchActionResult(const ui::AXActionData& already_handled_action_data, |
| bool result) override; |
| |
| // ui::AXActionHandlerObserver: |
| void PerformAction(const ui::AXActionData& action_data) override; |
| |
| // crosapi::mojom::AutomationFactory: |
| void BindAutomation( |
| mojo::PendingRemote<crosapi::mojom::AutomationClient> automation_client, |
| mojo::PendingReceiver<crosapi::mojom::Automation> automation) override; |
| |
| // AutomationEventRouterObserver: |
| void AllAutomationExtensionsGone() override; |
| void ExtensionListenerAdded() override; |
| |
| private: |
| bool desktop_enabled_ = false; |
| |
| // Any number of crosapi clients can connect to this class. |
| mojo::ReceiverSet<mojom::AutomationFactory> automation_factory_receivers_; |
| |
| // This set maintains a list of all remotes from automation tree sources. |
| mojo::ReceiverSet<mojom::Automation> automation_receivers_; |
| |
| // This set maintains a list of all known automation clients. |
| mojo::RemoteSet<mojom::AutomationClient> automation_client_remotes_; |
| |
| base::ScopedObservation<extensions::AutomationEventRouter, |
| extensions::AutomationEventRouterObserver> |
| automation_event_router_observer_{this}; |
| |
| base::WeakPtrFactory<AutomationAsh> weak_factory_{this}; |
| }; |
| |
| } // namespace crosapi |
| |
| #endif // CHROME_BROWSER_ASH_CROSAPI_AUTOMATION_ASH_H_ |