| // Copyright 2021 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 CHROMECAST_CAST_CORE_RUNTIME_BROWSER_RUNTIME_APPLICATION_BASE_H_ |
| #define CHROMECAST_CAST_CORE_RUNTIME_BROWSER_RUNTIME_APPLICATION_BASE_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/callback.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chromecast/browser/cast_web_view.h" |
| #include "chromecast/cast_core/runtime/browser/grpc/grpc_server.h" |
| #include "chromecast/cast_core/runtime/browser/runtime_application.h" |
| #include "chromecast/cast_core/runtime/browser/runtime_application_service_grpc_impl.h" |
| #include "chromecast/cast_core/runtime/browser/runtime_message_port_application_service_grpc_impl.h" |
| #include "components/url_rewrite/browser/url_request_rewrite_rules_manager.h" |
| #include "third_party/cast_core/public/src/proto/v2/core_application_service.grpc.pb.h" |
| |
| namespace chromecast { |
| |
| class CastWebService; |
| |
| // This class is for sharing code between Web and streaming RuntimeApplication |
| // implementations, including Load and Launch behavior. |
| class RuntimeApplicationBase |
| : public RuntimeApplication, |
| public GrpcServer, |
| public RuntimeApplicationServiceDelegate, |
| public RuntimeMessagePortApplicationServiceDelegate { |
| public: |
| ~RuntimeApplicationBase() override; |
| |
| protected: |
| using CoreApplicationServiceGrpc = cast::v2::CoreApplicationService::Stub; |
| |
| // |web_service| is expected to exist for the lifetime of this instance. |
| RuntimeApplicationBase(cast::common::ApplicationConfig app_config, |
| mojom::RendererType renderer_type_used, |
| CastWebService* web_service, |
| scoped_refptr<base::SequencedTaskRunner> task_runner); |
| |
| // Stops the running application. Must be called before destruction of any |
| // instance of the implementing object. |
| virtual void StopApplication(); |
| |
| // Sets that the application has been started - the meaning of which is |
| // application-specific. |
| void SetApplicationStarted(); |
| |
| // Returns current TaskRunner. |
| scoped_refptr<base::SequencedTaskRunner> task_runner() { |
| return task_runner_; |
| } |
| |
| // Returns a pointer to CastWebService. |
| CastWebService* cast_web_service() const { return web_service_; } |
| |
| // Returns a pointer to a CastWebView. |
| CastWebView* cast_web_view() { return cast_web_view_.get(); } |
| |
| // RuntimeApplication implementation: |
| url_rewrite::UrlRequestRewriteRulesManager* GetUrlRewriteRulesManager() |
| override; |
| |
| // RuntimeApplicationServiceDelegate implementation: |
| void SetUrlRewriteRules(const cast::v2::SetUrlRewriteRulesRequest& request, |
| cast::v2::SetUrlRewriteRulesResponse* response, |
| GrpcMethod* callback) override; |
| |
| // Processes an incoming |message|, returning the status of this processing in |
| // |response| after being received over gRPC. |
| virtual void HandleMessage(const cast::web::Message& message, |
| cast::web::MessagePortStatus* response) = 0; |
| |
| // Called following the creation of a CastWebView, with which |
| // |cast_web_contents is associated. Must set the application URL as a |
| // result. |
| virtual void InitializeApplication(CoreApplicationServiceGrpc* grpc_stub, |
| CastWebContents* cast_web_contents) = 0; |
| |
| std::unique_ptr<CoreApplicationServiceGrpc> core_app_stub_; |
| |
| private: |
| // RuntimeApplication implementation: |
| bool Load(const cast::runtime::LoadApplicationRequest& request) final; |
| bool Launch(const cast::runtime::LaunchApplicationRequest& request) final; |
| |
| // Called when a new CastWebView is created. |
| void CreateCastWebView(); |
| |
| // Called following Launch() on |task_runner_|. |
| void FinishLaunch(std::string core_application_service_endpoint); |
| |
| // RuntimeMessagePortApplicationServiceDelegate implementation: |
| void PostMessage(const cast::web::Message& request, |
| cast::web::MessagePortStatus* response, |
| GrpcMethod* callback) override; |
| |
| // gRPC RPC Wrappers. |
| cast::v2::RuntimeApplicationService::AsyncService grpc_app_service_; |
| cast::v2::RuntimeMessagePortApplicationService::AsyncService |
| grpc_message_port_service_; |
| |
| // The |web_service_| used to create |cast_web_view_|. |
| CastWebService* const web_service_; |
| // The WebView associated with the window in which the Cast application is |
| // displayed. |
| CastWebView::Scoped cast_web_view_; |
| |
| std::unique_ptr<url_rewrite::UrlRequestRewriteRulesManager> |
| url_rewrite_rules_manager_; |
| |
| scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| |
| // Set to true when StopApplication() is called. This variable is required |
| // rather than always executing StopApplication() in the dtor due to how |
| // virtual function calls are handled during destruction. |
| bool is_application_stopped_ = false; |
| |
| // Renderer type used by this application. |
| mojom::RendererType renderer_type_; |
| |
| base::WeakPtrFactory<RuntimeApplicationBase> weak_factory_{this}; |
| }; |
| |
| } // namespace chromecast |
| |
| #endif // CHROMECAST_CAST_CORE_RUNTIME_BROWSER_RUNTIME_APPLICATION_BASE_H_ |