#if ENABLE(INSPECTOR_EXTENSIONS)
+#include "Logging.h"
#include "WebInspectorUI.h"
#include "WebInspectorUIExtensionControllerMessages.h"
#include "WebInspectorUIExtensionControllerMessagesReplies.h"
#include "WebPage.h"
#include "WebProcess.h"
+#include <JavaScriptCore/JSCInlines.h>
+#include <WebCore/ExceptionDetails.h>
#include <WebCore/InspectorFrontendAPIDispatcher.h>
namespace WebKit {
Page* page = inspectorFrontend.frontendPage();
ASSERT(page);
-// WTFReportBacktrace();
WebProcess::singleton().addMessageReceiver(Messages::WebInspectorUIExtensionController::messageReceiverName(), WebPage::fromCorePage(*page).identifier(), *this);
}
WebInspectorUIExtensionController::~WebInspectorUIExtensionController()
{
-// WTFReportBacktrace();
WebProcess::singleton().removeMessageReceiver(*this);
}
-Optional<InspectorExtensionError> WebInspectorUIExtensionController::parseInspectorExtensionErrorFromResult(JSC::JSValue result)
+Optional<InspectorExtensionError> WebInspectorUIExtensionController::parseInspectorExtensionErrorFromEvaluationResult(InspectorFrontendAPIDispatcher::EvaluationResult result)
{
+ if (!result.has_value()) {
+ switch (result.error()) {
+ case WebCore::InspectorFrontendAPIDispatcher::EvaluationError::ContextDestroyed:
+ return InspectorExtensionError::ContextDestroyed;
+ case WebCore::InspectorFrontendAPIDispatcher::EvaluationError::ExecutionSuspended:
+ return InspectorExtensionError::InternalError;
+ }
+ }
+
ASSERT(m_frontendClient);
auto globalObject = m_frontendClient->frontendAPIDispatcher().frontendGlobalObject();
if (!globalObject)
return InspectorExtensionError::ContextDestroyed;
+ auto valueOrException = result.value();
+ if (!valueOrException.has_value()) {
+ LOG(Inspector, "Encountered exception while evaluating upon the frontend: %s", valueOrException.error().message.utf8().data());
+ return InspectorExtensionError::InternalError;
+ }
+
// If the evaluation result is a string, the frontend returned an error string.
+ // If there was a JS exception, log it and return error code InternalError.
// Anything else (falsy values, objects, arrays, DOM, etc.) is interpreted as success.
- if (result.isString()) {
- auto resultString = result.toWTFString(globalObject);
+ JSC::JSValue scriptValue = valueOrException.value();
+ if (scriptValue.isString()) {
+ auto resultString = scriptValue.toWTFString(globalObject);
if (resultString == "ContextDestroyed"_s)
return InspectorExtensionError::ContextDestroyed;
if (resultString == "InternalError"_s)
// WebInspectorUIExtensionController IPC messages.
-void WebInspectorUIExtensionController::registerExtension(const String& extensionID, const String& displayName, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
+void WebInspectorUIExtensionController::registerExtension(const InspectorExtensionID& extensionID, const String& displayName, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
{
if (!m_frontendClient) {
completionHandler(makeUnexpected(InspectorExtensionError::InvalidRequest));
return;
}
- if (auto parsedError = weakThis->parseInspectorExtensionErrorFromResult(result.value())) {
+ if (auto parsedError = weakThis->parseInspectorExtensionErrorFromEvaluationResult(result)) {
completionHandler(makeUnexpected(parsedError.value()));
return;
}
});
}
-void WebInspectorUIExtensionController::unregisterExtension(const String& extensionID, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
+void WebInspectorUIExtensionController::unregisterExtension(const InspectorExtensionID& extensionID, CompletionHandler<void(Expected<bool, InspectorExtensionError>)>&& completionHandler)
{
if (!m_frontendClient) {
completionHandler(makeUnexpected(InspectorExtensionError::InvalidRequest));
return;
}
- if (auto parsedError = weakThis->parseInspectorExtensionErrorFromResult(result.value())) {
+ if (auto parsedError = weakThis->parseInspectorExtensionErrorFromEvaluationResult(result.value())) {
completionHandler(makeUnexpected(parsedError.value()));
return;
}