Extract web platform service boundary

This commit is contained in:
2026-06-12 19:01:45 +02:00
parent 4c0450c87f
commit 8cd384012f
4 changed files with 273 additions and 11 deletions

View File

@@ -60,6 +60,48 @@ void invoke_picked_path_if_selected(
callback(path);
}
#ifdef __WEB__
class RetainedWebPlatformServices final : public pp::platform::WebPlatformServices {
public:
void publish_exported_image(std::string_view path) override
{
(void)path;
}
void flush_persistent_storage() override
{
webgl_sync();
}
[[nodiscard]] int default_canvas_resolution() override
{
return pp::platform::platform_default_canvas_resolution(pp::platform::PlatformFamily::webgl);
}
void save_prepared_file(
std::string_view path,
std::string_view suggested_name,
pp::platform::PreparedFileCallback callback) override
{
const std::string value(path);
const std::string name(suggested_name);
webgl_pick_file_save(value, name, [callback = std::move(callback), value](bool success) {
callback(value, success);
});
}
};
#endif
[[nodiscard]] pp::platform::WebPlatformServices& active_legacy_web_platform_services()
{
#ifdef __WEB__
static RetainedWebPlatformServices services;
return pp::platform::resolve_web_platform_services(services);
#else
return pp::platform::active_web_platform_services();
#endif
}
// DEBT-0017: fallback for platforms that do not inject PlatformServices yet.
class LegacyPlatformServices final : public pp::platform::PlatformServices {
public:
@@ -300,7 +342,13 @@ public:
void publish_exported_image(std::string_view path) override
{
if (!pp::platform::platform_publishes_exported_images(pp::platform::current_platform_family()))
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl)
{
active_legacy_web_platform_services().publish_exported_image(path);
return;
}
if (!pp::platform::platform_publishes_exported_images(family))
{
(void)path;
return;
@@ -314,11 +362,14 @@ public:
void flush_persistent_storage() override
{
if (!pp::platform::platform_flushes_persistent_storage(pp::platform::current_platform_family()))
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl)
{
active_legacy_web_platform_services().flush_persistent_storage();
return;
}
if (!pp::platform::platform_flushes_persistent_storage(family))
return;
#ifdef __WEB__
webgl_sync();
#endif
}
[[nodiscard]] std::vector<std::string> document_browse_roots(
@@ -501,8 +552,10 @@ public:
[[nodiscard]] int default_canvas_resolution() override
{
return pp::platform::platform_default_canvas_resolution(
pp::platform::current_platform_family());
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl)
return active_legacy_web_platform_services().default_canvas_resolution();
return pp::platform::platform_default_canvas_resolution(family);
}
[[nodiscard]] bool draws_canvas_tip_for_pointer(
@@ -591,6 +644,16 @@ public:
std::string_view suggested_name,
pp::platform::PreparedFileCallback callback) override
{
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl)
{
active_legacy_web_platform_services().save_prepared_file(
path,
suggested_name,
std::move(callback));
return;
}
const std::string value(path);
const std::string name(suggested_name);
#ifdef __IOS__
@@ -599,10 +662,6 @@ public:
[App::I->ios_view pick_file_save:value];
});
callback(value, true);
#elif __WEB__
webgl_pick_file_save(value, name, [callback = std::move(callback), value](bool success) {
callback(value, success);
});
#else
(void)name;
callback(value, false);