Cancel pending style request when loading style JSON (#3709)

Co-authored-by: Tim Sylvester <tim@wetdogweather.com>
This commit is contained in:
Bart Louwers
2025-12-01 10:11:24 +01:00
committed by GitHub
parent 84df7b16fb
commit caa564fd45
7 changed files with 124 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
#include <mbgl/test/delayed_file_source.hpp>
namespace mbgl {
DelayedFileSource::AsyncRequestImpl::AsyncRequestImpl(DelayedFileSource& fs, Callback callback_)
: fileSource(fs),
callback(std::move(callback_)) {}
void DelayedFileSource::AsyncRequestImpl::respond() {
if (callback) {
callback(*fileSource.response);
}
}
DelayedFileSource::DelayedFileSource()
: StubFileSource(StubFileSource::ResponseType::Synchronous) {}
std::unique_ptr<AsyncRequest> DelayedFileSource::request(const Resource&, Callback callback) {
auto req = std::make_unique<AsyncRequestImpl>(*this, std::move(callback));
pendingRequest = req.get();
return req;
}
void DelayedFileSource::respondToRequest(const std::string& data) {
response = Response();
response->data = std::make_shared<std::string>(data);
if (pendingRequest) {
pendingRequest->respond();
}
}
} // namespace mbgl

View File

@@ -0,0 +1,43 @@
#pragma once
#include <mbgl/storage/file_source.hpp>
#include <mbgl/util/async_request.hpp>
#include <mbgl/test/stub_file_source.hpp>
#include <memory>
#include <string>
#include <optional>
namespace mbgl {
/*
This is a file source that allows control of when a request is responded to.
*/
class DelayedFileSource : public StubFileSource {
public:
DelayedFileSource();
~DelayedFileSource() override = default;
std::unique_ptr<AsyncRequest> request(const Resource&, Callback) override;
// Custom method to respond to pending request
void respondToRequest(const std::string& data);
private:
class AsyncRequestImpl : public AsyncRequest {
public:
using Callback = std::function<void(const Response&)>;
AsyncRequestImpl(DelayedFileSource& fs, Callback callback_);
void respond();
private:
DelayedFileSource& fileSource;
Callback callback;
};
friend class AsyncRequestImpl;
std::optional<Response> response;
AsyncRequestImpl* pendingRequest = nullptr;
};
} // namespace mbgl