#ifndef COMPONENTS_CAST_RECEIVER_BROWSER_RUNTIME_APPLICATION_BASE_H_
#define COMPONENTS_CAST_RECEIVER_BROWSER_RUNTIME_APPLICATION_BASE_H_
#include <ostream>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/values.h"
#include "components/cast_receiver/browser/application_client.h"
#include "components/cast_receiver/browser/public/application_config.h"
#include "components/cast_receiver/browser/public/content_window_controls.h"
#include "components/cast_receiver/browser/public/embedder_application.h"
#include "components/cast_receiver/browser/public/runtime_application.h"
#include "components/url_rewrite/mojom/url_request_rewrite.mojom.h"
#include "net/base/net_errors.h"
namespace content {
class WebContents;
}
namespace cast_receiver {
class RuntimeApplicationBase
: public RuntimeApplication,
public ContentWindowControls::VisibilityChangeObserver {
public:
~RuntimeApplicationBase() override;
RuntimeApplicationBase(RuntimeApplicationBase& other) = delete;
RuntimeApplicationBase& operator=(RuntimeApplicationBase& other) = delete;
void SetEmbedderApplication(EmbedderApplication& embedder_application);
void Load(StatusCallback callback) override;
void Stop(StatusCallback callback) override;
void SetUrlRewriteRules(
url_rewrite::mojom::UrlRequestRewriteRulesPtr mojom_rules) override;
void SetMediaBlocking(bool load_blocked, bool start_blocked) override;
void SetVisibility(bool is_visible) override;
void SetTouchInputEnabled(bool enabled) override;
const std::string& GetDisplayName() const override;
const std::string& GetAppId() const override;
const std::string& GetCastSessionId() const override;
bool IsApplicationRunning() const override;
protected:
RuntimeApplicationBase(std::string cast_session_id,
ApplicationConfig app_config,
ApplicationClient& application_client);
virtual void StopApplication(
EmbedderApplication::ApplicationStopReason stop_reason,
net::Error net_error_code);
scoped_refptr<base::SequencedTaskRunner> task_runner() {
return task_runner_;
}
EmbedderApplication& embedder_application() {
DCHECK(embedder_application_);
return *embedder_application_;
}
const ApplicationConfig& config() const { return app_config_; }
ApplicationClient& application_client() { return *application_client_; }
void NavigateToPage(const GURL& url);
void OnPageNavigationComplete();
void SetContentPermissions(content::WebContents& web_contents);
ApplicationClient::ApplicationControls& GetApplicationControls();
private:
void SetWebVisibilityAndPaint(bool is_visible);
void OnWindowShown() override;
void OnWindowHidden() override;
const std::string cast_session_id_;
const ApplicationConfig app_config_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
raw_ref<ApplicationClient> application_client_;
raw_ptr<EmbedderApplication> embedder_application_{nullptr};
url_rewrite::mojom::UrlRequestRewriteRulesPtr cached_mojom_rules_{nullptr};
bool is_application_running_ = false;
bool is_media_load_blocked_ = true;
bool is_media_start_blocked_ = true;
bool is_visible_ = false;
bool is_touch_input_enabled_ = false;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<RuntimeApplicationBase> weak_factory_{this};
};
}
#endif