| // 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 CHROMECAST_RENDERER_FEATURE_MANAGER_H_ |
| #define CHROMECAST_RENDERER_FEATURE_MANAGER_H_ |
| |
| #include <iosfwd> |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include "base/containers/flat_set.h" |
| #include "base/values.h" |
| #include "chromecast/common/mojom/feature_manager.mojom.h" |
| #include "chromecast/renderer/native_bindings_helper.h" |
| #include "content/public/renderer/render_frame_observer.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| #include "services/service_manager/public/cpp/binder_registry.h" |
| #include "url/gurl.h" |
| |
| namespace chromecast { |
| |
| // Receives messages from the browser process to enable/disable Cast |
| // application-facing features. Features usually have an associated V8 binding |
| // which exposes a platform capability to the app. |
| class FeatureManager : public content::RenderFrameObserver, |
| public shell::mojom::FeatureManager { |
| public: |
| explicit FeatureManager(content::RenderFrame* render_frame); |
| FeatureManager(const FeatureManager&) = delete; |
| FeatureManager& operator=(const FeatureManager&) = delete; |
| ~FeatureManager() override; |
| |
| const GURL& dev_origin() const { return dev_origin_; } |
| bool configured() const { return configured_; } |
| |
| bool FeatureEnabled(const std::string& feature) const; |
| |
| const chromecast::shell::mojom::FeaturePtr& GetFeature( |
| const std::string& feature) const; |
| |
| friend std::ostream& operator<<(std::ostream& os, |
| const FeatureManager& features); |
| |
| protected: |
| // Allows a derived class to add its own features at the end of |
| // mojom::FeatureManager::ConfigureFeatures(). |
| virtual void ConfigureFeaturesInternal(); |
| |
| // Map for storing enabled features, name -> FeaturePtr. |
| using FeaturesMap = |
| std::map<std::string, chromecast::shell::mojom::FeaturePtr>; |
| FeaturesMap features_map_; |
| |
| base::flat_set<CastBinding*> v8_bindings_; |
| |
| private: |
| // content::RenderFrameObserver implementation: |
| void OnInterfaceRequestForFrame( |
| const std::string& interface_name, |
| mojo::ScopedMessagePipeHandle* interface_pipe) override; |
| void DidClearWindowObject() override; |
| void OnDestruct() override; |
| |
| // shell::mojom::FeatureManager implementation |
| void ConfigureFeatures( |
| std::vector<chromecast::shell::mojom::FeaturePtr> features) override; |
| |
| // Bind the incoming request with this implementation |
| void OnFeatureManagerRequest( |
| mojo::PendingReceiver<shell::mojom::FeatureManager> request); |
| |
| void EnableBindings(); |
| void SetupAdditionalSecureOrigin(); |
| |
| // Flag for when the configuration message is received from the browser. |
| bool configured_; |
| bool can_install_bindings_; |
| |
| // Origin enabled for development |
| GURL dev_origin_; |
| bool secure_origin_set_; |
| |
| service_manager::BinderRegistry registry_; |
| |
| mojo::ReceiverSet<shell::mojom::FeatureManager> bindings_; |
| }; |
| |
| } // namespace chromecast |
| |
| #endif // CHROMECAST_RENDERER_FEATURE_MANAGER_H_ |