// 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_CAST_DEMO_BINDINGS_H_
#define CHROMECAST_RENDERER_CAST_DEMO_BINDINGS_H_
#include <string>
#include "base/memory/weak_ptr.h"
#include "chromecast/common/mojom/cast_demo.mojom.h"
#include "chromecast/renderer/native_bindings_helper.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "v8/include/v8.h"
namespace chromecast {
namespace shell {
// Enabled only when the device is in demonstration mode. This is only enabled
// for the demonstration JS app.
class CastDemoBindings : public CastBinding,
public mojom::CastDemoVolumeChangeObserver {
public:
explicit CastDemoBindings(content::RenderFrame* render_frame);
CastDemoBindings(const CastDemoBindings&) = delete;
CastDemoBindings& operator=(const CastDemoBindings&) = delete;
private:
friend class CastBinding;
~CastDemoBindings() override;
// CastBinding implementation:
void Install(v8::Local<v8::Object> cast_platform,
v8::Isolate* isolate) override;
// Methods to be called from v8: (See mojom for details)
void RecordEvent(const std::string& event_name, v8::Local<v8::Value> data);
void SetRetailerName(const std::string& retailer_name);
void SetStoreId(const std::string& store_id);
v8::Local<v8::Value> GetRetailerName();
v8::Local<v8::Value> GetStoreId();
void SetDefaultVolumeLevel(float level);
v8::Local<v8::Value> GetDefaultVolumeLevel();
void ApplyDefaultVolume();
void SetWifiCredentials(const std::string& ssid, const std::string& psk);
v8::Local<v8::Value> GetAvailableWifiNetworks();
v8::Local<v8::Value> GetConnectionStatus();
void SetVolumeChangeHandler(v8::Local<v8::Function> volume_change_handler);
void PersistLocalStorage();
// Deprecated
void SetVolume(float level);
// Methods to return values to v8:
void OnGetRetailerName(v8::Global<v8::Promise::Resolver> resolver,
v8::Global<v8::Context> original_context,
const std::string& retailer_name);
void OnGetStoreId(v8::Global<v8::Promise::Resolver> resolver,
v8::Global<v8::Context> original_context,
const std::string& store_id);
void OnGetDefaultVolumeLevel(v8::Global<v8::Promise::Resolver> resolver,
v8::Global<v8::Context> original_context,
float level);
void OnGetAvailableWifiNetworks(v8::Global<v8::Promise::Resolver> resolver,
v8::Global<v8::Context> original_context,
base::Value network_list);
void OnGetConnectionStatus(v8::Global<v8::Promise::Resolver> resolver,
v8::Global<v8::Context> original_context,
base::Value status);
// mojom::CastDemoVolumeChangeObserver implementation:
void VolumeChanged(float level) override;
void ReconnectMojo();
void OnMojoConnectionError();
// Returns a reference to |cast_demo_|, and binds it to a mojo pipe if
// necessary.
const mojo::Remote<mojom::CastDemo>& GetCastDemo();
// The pointer to the remote mojom::CastDemo interface. Do not access this
// member directly; instead, use GetCastDemo().
mojo::Remote<mojom::CastDemo> cast_demo_;
mojo::Receiver<mojom::CastDemoVolumeChangeObserver> binding_;
v8::UniquePersistent<v8::Function> volume_change_handler_;
base::WeakPtrFactory<CastDemoBindings> weak_factory_;
};
} // namespace shell
} // namespace chromecast
#endif // CHROMECAST_RENDERER_CAST_DEMO_BINDINGS_H_