webview_embed.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include "base/unique_qptr.h"
  9. #include "base/basic_types.h"
  10. #include "webview/webview_common.h"
  11. #include <rpl/lifetime.h>
  12. #include <rpl/producer.h>
  13. #include <QColor>
  14. class QString;
  15. class QWidget;
  16. class QWindow;
  17. namespace Webview {
  18. extern const char kOptionWebviewDebugEnabled[];
  19. extern const char kOptionWebviewLegacyEdge[];
  20. struct DialogArgs;
  21. struct DialogResult;
  22. class Interface;
  23. class ZoomController;
  24. struct Config;
  25. struct DataRequest;
  26. enum class DataResult;
  27. struct NavigationHistoryState;
  28. struct WindowConfig {
  29. QColor opaqueBg;
  30. StorageId storageId;
  31. QString dataProtocolOverride;
  32. };
  33. class Window final {
  34. public:
  35. explicit Window(
  36. QWidget *parent = nullptr,
  37. WindowConfig config = WindowConfig());
  38. ~Window();
  39. // May be nullptr or destroyed any time (in case webview crashed).
  40. [[nodiscard]] QWidget *widget() const;
  41. void updateTheme(
  42. QColor opaqueBg,
  43. QColor scrollBg,
  44. QColor scrollBgOver,
  45. QColor scrollBarBg,
  46. QColor scrollBarBgOver);
  47. void navigate(const QString &url);
  48. void navigateToData(const QString &id);
  49. void reload();
  50. void setMessageHandler(Fn<void(std::string)> handler);
  51. void setMessageHandler(Fn<void(const QJsonDocument&)> handler);
  52. void setNavigationStartHandler(Fn<bool(QString,bool)> handler);
  53. void setNavigationDoneHandler(Fn<void(bool)> handler);
  54. void setDialogHandler(Fn<DialogResult(DialogArgs)> handler);
  55. void setDataRequestHandler(Fn<DataResult(DataRequest)> handler);
  56. void init(const QByteArray &js);
  57. void eval(const QByteArray &js);
  58. void focus();
  59. void refreshNavigationHistoryState();
  60. [[nodiscard]] auto navigationHistoryState() const
  61. -> rpl::producer<NavigationHistoryState>;
  62. [[nodiscard]] ZoomController *zoomController() const;
  63. [[nodiscard]] rpl::lifetime &lifetime() {
  64. return _lifetime;
  65. }
  66. private:
  67. bool createWebView(QWidget *parent, const WindowConfig &config);
  68. [[nodiscard]] Fn<void(std::string)> messageHandler() const;
  69. [[nodiscard]] Fn<bool(std::string,bool)> navigationStartHandler() const;
  70. [[nodiscard]] Fn<void(bool)> navigationDoneHandler() const;
  71. [[nodiscard]] Fn<DialogResult(DialogArgs)> dialogHandler() const;
  72. [[nodiscard]] Fn<DataResult(DataRequest)> dataRequestHandler() const;
  73. std::unique_ptr<Interface> _webview;
  74. Fn<void(std::string)> _messageHandler;
  75. Fn<bool(std::string,bool)> _navigationStartHandler;
  76. Fn<void(bool)> _navigationDoneHandler;
  77. Fn<DialogResult(DialogArgs)> _dialogHandler;
  78. Fn<DataResult(DataRequest)> _dataRequestHandler;
  79. rpl::lifetime _lifetime;
  80. };
  81. } // namespace Webview