Files
tdesktop/Telegram/lib_webview/webview/webview_interface.h
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
init
2026-02-16 15:50:16 +03:00

161 lines
3.4 KiB
C++

// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#pragma once
#include "webview/webview_common.h"
#include <memory>
#include <string>
#include <optional>
#include <functional>
#include <rpl/never.h>
#include <rpl/producer.h>
#include <QtGui/QColor>
// Inspired by https://github.com/webview/webview.
class QWidget;
namespace Webview {
class DataStream;
struct NavigationHistoryState {
std::string url;
std::string title;
bool canGoBack : 1 = false;
bool canGoForward : 1 = false;
friend inline constexpr bool operator==(
NavigationHistoryState,
NavigationHistoryState) = default;
};
class ZoomController {
public:
ZoomController() = default;
[[nodiscard]] virtual rpl::producer<int> zoomValue() {
return rpl::never<int>();
}
virtual void setZoom(int) {
}
};
class Interface {
public:
virtual ~Interface() = default;
virtual void navigate(std::string url) = 0;
virtual void navigateToData(std::string id) = 0;
virtual void reload() = 0;
virtual void init(std::string js) = 0;
virtual void eval(std::string js) = 0;
virtual void focus() = 0;
virtual void setOpaqueBg(QColor opaqueBg) = 0;
[[nodiscard]] virtual QWidget *widget() = 0;
virtual void refreshNavigationHistoryState() = 0;
[[nodiscard]] virtual auto navigationHistoryState()
-> rpl::producer<NavigationHistoryState> = 0;
[[nodiscard]] virtual ZoomController *zoomController() {
return nullptr;
}
};
enum class DialogType {
Alert,
Confirm,
Prompt,
};
struct DialogArgs {
QWidget *parent = nullptr;
DialogType type = DialogType::Alert;
std::string value;
std::string text;
std::string url;
};
struct DialogResult {
std::string text;
bool accepted = false;
};
struct DataResponse {
std::unique_ptr<DataStream> stream;
std::int64_t streamOffset = 0;
std::int64_t totalSize = 0;
};
struct DataRequest {
std::string id;
std::int64_t offset = 0;
std::int64_t limit = 0; // < 0 means "Range: bytes=offset-" header.
std::function<void(DataResponse)> done;
};
enum class DataResult {
Done,
Pending,
Failed,
};
struct Config {
QWidget *parent = nullptr;
QColor opaqueBg;
std::function<void(std::string)> messageHandler;
std::function<bool(std::string,bool)> navigationStartHandler;
std::function<void(bool)> navigationDoneHandler;
std::function<DialogResult(DialogArgs)> dialogHandler;
std::function<DataResult(DataRequest)> dataRequestHandler;
std::string dataProtocolOverride;
std::string userDataPath;
std::string userDataToken;
bool debug = false;
bool safe = false;
};
struct Available {
enum class Error {
None,
NoWebview2,
NoWebKitGTK,
OldWindows,
};
Error error = Error::None;
bool customSchemeRequests = false;
bool customRangeRequests = false;
bool customReferer = false;
std::string details;
};
void ParseRangeHeaderFor(DataRequest &request, std::string_view header);
[[nodiscard]] Available Availability();
[[nodiscard]] inline bool Supported() {
return Availability().error == Available::Error::None;
}
[[nodiscard]] bool SupportsEmbedAfterCreate();
[[nodiscard]] bool SeparateStorageIdSupported();
// HWND on Windows, nullptr on macOS, GtkWindow on Linux.
[[nodiscard]] std::unique_ptr<Interface> CreateInstance(Config config);
[[nodiscard]] std::string GenerateStorageToken();
void ClearStorageDataByToken(const std::string &token);
} // namespace Webview