InspectorFrontendAPIDispatcher.h [plain text]
#pragma once
#include <wtf/CompletionHandler.h>
#include <wtf/Expected.h>
#include <wtf/JSONValues.h>
#include <wtf/RefCounted.h>
#include <wtf/WeakPtr.h>
#include <wtf/text/WTFString.h>
namespace JSC {
class JSGlobalObject;
class JSValue;
}
namespace WebCore {
class Page;
struct ExceptionDetails;
class InspectorFrontendAPIDispatcher final : public RefCounted<InspectorFrontendAPIDispatcher> {
public:
enum class EvaluationError { ExecutionSuspended, ContextDestroyed };
using ValueOrException = Expected<JSC::JSValue, ExceptionDetails>;
using EvaluationResult = Expected<ValueOrException, EvaluationError>;
using EvaluationResultHandler = CompletionHandler<void(EvaluationResult)>;
enum class UnsuspendSoon { Yes, No };
WEBCORE_EXPORT ~InspectorFrontendAPIDispatcher();
static Ref<InspectorFrontendAPIDispatcher> create(Page& page)
{
return adoptRef(*new InspectorFrontendAPIDispatcher(page));
}
WEBCORE_EXPORT void reset();
WEBCORE_EXPORT void frontendLoaded();
WEBCORE_EXPORT void suspend(UnsuspendSoon = UnsuspendSoon::No);
WEBCORE_EXPORT void unsuspend();
bool isSuspended() const { return m_suspended; }
EvaluationResult dispatchCommandWithResultSync(const String& command, Vector<Ref<JSON::Value>>&& arguments = { });
WEBCORE_EXPORT void dispatchCommandWithResultAsync(const String& command, Vector<Ref<JSON::Value>>&& arguments = { }, EvaluationResultHandler&& handler = { });
WEBCORE_EXPORT void dispatchMessageAsync(const String& message);
WEBCORE_EXPORT void evaluateExpressionForTesting(const String&);
WEBCORE_EXPORT JSC::JSGlobalObject* frontendGlobalObject();
private:
WEBCORE_EXPORT InspectorFrontendAPIDispatcher(Page&);
void evaluateOrQueueExpression(const String&, EvaluationResultHandler&& handler = { });
void evaluateQueuedExpressions();
void invalidateQueuedExpressions();
ValueOrException evaluateExpression(const String&);
WeakPtr<Page> m_frontendPage;
Vector<std::pair<String, EvaluationResultHandler>> m_queuedEvaluations;
bool m_frontendLoaded { false };
bool m_suspended { false };
};
}